From 786f42fb1eda1d1a22f193ea4c6a4580aefbfa68 Mon Sep 17 00:00:00 2001 From: cyntem Date: Fri, 7 Jul 2023 22:36:30 +0300 Subject: [PATCH 1/8] Update litex-hwmon.c XADC VCCINT, VCCAUX, BCCBRAM has incorrect reg offset. --- drivers/hwmon/litex-hwmon.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/litex-hwmon.c b/drivers/hwmon/litex-hwmon.c index c73ac6223c89bf..5e88304d6b9f9c 100644 --- a/drivers/hwmon/litex-hwmon.c +++ b/drivers/hwmon/litex-hwmon.c @@ -24,11 +24,11 @@ #define TEMP_REG_OFFSET 0x0 #define TEMP_REG_SIZE 2 -#define VCCINT_REG_OFFSET 0x8 +#define VCCINT_REG_OFFSET 0x4 #define VCCINT_REG_SIZE 2 -#define VCCAUX_REG_OFFSET 0x10 +#define VCCAUX_REG_OFFSET 0x8 #define VCCAUX_REG_SIZE 2 -#define VCCBRAM_REG_OFFSET 0x18 +#define VCCBRAM_REG_OFFSET 0xC #define VCCBRAM_REG_SIZE 2 #define CHANNEL_TEMP 0 From 6209c51e14210bde2f368bdf7ee9c82f70784b4d Mon Sep 17 00:00:00 2001 From: cyntem Date: Fri, 15 Sep 2023 22:55:13 +0300 Subject: [PATCH 2/8] Update litesata.c add error messages for debug --- drivers/block/litesata.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index c6c5c79f99f3a1..05af0385fcc4b0 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -354,21 +354,33 @@ static int litesata_probe(struct platform_device *pdev) /* Initialize disk, get model and size */ err = litesata_init_ident(lbd, &size); if (err) + { + dev_info(dev, "Error litesata_init_ident"); return err; + } /* Configure interrupts */ err = litesata_irq_init(pdev, lbd); if (err) + { + dev_info(dev, "Error litesata_irq_init"); return err; + } gendisk = blk_alloc_disk(NUMA_NO_NODE); if (!gendisk) + { + dev_info(dev, "Error blk_alloc_disk"); return -ENOMEM; + } err = devm_add_action_or_reset(dev, litesata_devm_put_disk, gendisk); if (err) + { + dev_info(dev, "Error devm_add_action_or_reset"); return dev_err_probe(dev, err, "Can't register put_disk action\n"); + } gendisk->private_data = lbd; gendisk->fops = &litesata_fops; @@ -380,7 +392,10 @@ static int litesata_probe(struct platform_device *pdev) err = add_disk(gendisk); if (err) + { + dev_info(dev, "Error add_disk"); return err; + } dev_info(dev, "probe success; sector size = %d\n", SECTOR_SIZE); return 0; From 5b9596321b6fbcc4edc82af348c16d193609e9ac Mon Sep 17 00:00:00 2001 From: cyntem Date: Fri, 15 Sep 2023 23:32:45 +0300 Subject: [PATCH 3/8] Update litesata.c add comments for debug --- drivers/block/litesata.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index 05af0385fcc4b0..5f3dd127070602 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -227,7 +227,10 @@ static int litesata_irq_init(struct platform_device *pdev, ret = platform_get_irq_optional(pdev, 0); if (ret < 0 && ret != -ENXIO) + { + dev_info(dev, "%d<0 or ret != -ENXIO\n", ret); return ret; + } if (ret > 0) lbd->irq = ret; else { From 72e682cdb1ae45f0b048c1775e87d5ac4c57800d Mon Sep 17 00:00:00 2001 From: cyntem Date: Sat, 16 Sep 2023 00:28:21 +0300 Subject: [PATCH 4/8] Update litesata.c debug info --- drivers/block/litesata.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index 5f3dd127070602..e9550d140b6fc9 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -370,12 +370,16 @@ static int litesata_probe(struct platform_device *pdev) return err; } + + dev_info(dev, "sata irq init \n"); + gendisk = blk_alloc_disk(NUMA_NO_NODE); if (!gendisk) { dev_info(dev, "Error blk_alloc_disk"); return -ENOMEM; } + dev_info(dev, "blk_alloc_disk \n"); err = devm_add_action_or_reset(dev, litesata_devm_put_disk, gendisk); if (err) @@ -385,15 +389,21 @@ static int litesata_probe(struct platform_device *pdev) "Can't register put_disk action\n"); } + dev_info(dev, "devm_add_action_or_reset \n"); gendisk->private_data = lbd; gendisk->fops = &litesata_fops; strcpy(gendisk->disk_name, "litesata"); + set_capacity(gendisk, size); + dev_info(dev, "set_capacity \n"); blk_queue_flag_set(QUEUE_FLAG_NONROT, gendisk->queue); blk_queue_physical_block_size(gendisk->queue, SECTOR_SIZE); + dev_info(dev, "blk_queue_physical_block_size \n"); blk_queue_logical_block_size(gendisk->queue, SECTOR_SIZE); + dev_info(dev, "blk_queue_logical_block_size \n"); err = add_disk(gendisk); + dev_info(dev, "add_disk \n"); if (err) { dev_info(dev, "Error add_disk"); From 3a3efe0459bbe6d1b6a2a8e13178b14e1e6ba8a8 Mon Sep 17 00:00:00 2001 From: cyntem Date: Sat, 16 Sep 2023 10:07:15 +0300 Subject: [PATCH 5/8] Update litesata.c update capacity --- drivers/block/litesata.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index e9550d140b6fc9..cfd2fca9e67818 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -394,6 +394,16 @@ static int litesata_probe(struct platform_device *pdev) gendisk->fops = &litesata_fops; strcpy(gendisk->disk_name, "litesata"); + set_capacity(gendisk, 0); + + err = add_disk(gendisk); + dev_info(dev, "add_disk \n"); + if (err) + { + dev_info(dev, "Error add_disk"); + return err; + } + set_capacity(gendisk, size); dev_info(dev, "set_capacity \n"); blk_queue_flag_set(QUEUE_FLAG_NONROT, gendisk->queue); @@ -402,13 +412,6 @@ static int litesata_probe(struct platform_device *pdev) blk_queue_logical_block_size(gendisk->queue, SECTOR_SIZE); dev_info(dev, "blk_queue_logical_block_size \n"); - err = add_disk(gendisk); - dev_info(dev, "add_disk \n"); - if (err) - { - dev_info(dev, "Error add_disk"); - return err; - } dev_info(dev, "probe success; sector size = %d\n", SECTOR_SIZE); return 0; From 3b1d970b23baba7348147f45276ef1cce6060f74 Mon Sep 17 00:00:00 2001 From: cyntem Date: Sun, 17 Sep 2023 13:42:39 +0300 Subject: [PATCH 6/8] Update litesata.c dev warn add for debug --- drivers/block/litesata.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index cfd2fca9e67818..2e54a2a0e2f730 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -157,7 +157,10 @@ static int litesata_do_bvec(struct litesata_dev *lbd, struct bio_vec *bv, op_is_write(op) ? "writing" : "reading", count); err = litesata_do_dma(lbd, regs, dma, sector, count); if (err) + { + dev_warn(dev, "litesata_do_dma error"); return err; + } dma_unmap_page(dev, dma, bv->bv_len, dir); return 0; From 42cf212f62d77fef2b60a3fe7d21f851d295c503 Mon Sep 17 00:00:00 2001 From: cyntem Date: Mon, 27 Nov 2023 22:25:12 +0300 Subject: [PATCH 7/8] Update litesata.c Gabriel Somlo update file --- drivers/block/litesata.c | 87 ++++++++++------------------------------ 1 file changed, 21 insertions(+), 66 deletions(-) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index 2e54a2a0e2f730..b820379ca5073e 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -38,6 +38,7 @@ Example DTS node (adjust with your own addresses from csr.csv): #include #include #include +#include #include #define LITESATA_ID_STRT 0x00 // 1bit, w @@ -56,10 +57,11 @@ Example DTS node (adjust with your own addresses from csr.csv): #define LSPHY_STS_CTL BIT(3) #define LITESATA_DMA_SECT 0x00 // 48bit, w -#define LITESATA_DMA_ADDR 0x08 // 64bit, w -#define LITESATA_DMA_STRT 0x10 // 1bit, w -#define LITESATA_DMA_DONE 0x14 // 1bit, ro -#define LITESATA_DMA_ERR 0x18 // 1bit, ro +#define LITESATA_DMA_NSEC 0x08 // 16bit, w +#define LITESATA_DMA_ADDR 0x0c // 64bit, w +#define LITESATA_DMA_STRT 0x14 // 1bit, w +#define LITESATA_DMA_DONE 0x18 // 1bit, ro +#define LITESATA_DMA_ERR 0x1c // 1bit, ro #define LITESATA_IRQ_STS 0x00 // 2bit, ro #define LITESATA_IRQ_PEND 0x04 // 2bit, rw @@ -71,6 +73,8 @@ Example DTS node (adjust with your own addresses from csr.csv): struct litesata_dev { struct device *dev; + struct mutex lock; + void __iomem *lsident; void __iomem *lsphy; void __iomem *lsreader; @@ -81,8 +85,9 @@ struct litesata_dev { int irq; }; -static int litesata_do_dma_sector(struct litesata_dev *lbd, void __iomem *regs, - sector_t sector, dma_addr_t dma) +/* caller must hold lbd->lock to prevent interleaving transfers */ +static int litesata_do_dma(struct litesata_dev *lbd, void __iomem *regs, + dma_addr_t dma, sector_t sector, unsigned int count) { int irq = lbd->irq; @@ -91,13 +96,15 @@ static int litesata_do_dma_sector(struct litesata_dev *lbd, void __iomem *regs, /* NOTE: do *not* start by writing 0 to LITESATA_DMA_STRT!!! */ litex_write64(regs + LITESATA_DMA_SECT, sector); + litex_write16(regs + LITESATA_DMA_NSEC, count); litex_write64(regs + LITESATA_DMA_ADDR, dma); litex_write8(regs + LITESATA_DMA_STRT, 1); if (irq) wait_for_completion(&lbd->dma_done); - /* wait for DMA xfer completion */ + // FIXME: should we implement a timeout here? + // (or some other way to improve polling mode)? while ((litex_read8(regs + LITESATA_DMA_DONE) & 0x01) == 0); /* check if DMA xfer successful */ @@ -108,23 +115,6 @@ static int litesata_do_dma_sector(struct litesata_dev *lbd, void __iomem *regs, return -EIO; } -static int litesata_do_dma(struct litesata_dev *lbd, void __iomem *regs, - dma_addr_t dma, sector_t sector, unsigned int count) -{ - int err; - - while (count--) { - err = litesata_do_dma_sector(lbd, regs, sector, dma); - if (err) - return err; - - sector++; - dma += SECTOR_SIZE; - } - - return 0; -} - /* Process a single bvec of a bio. */ static int litesata_do_bvec(struct litesata_dev *lbd, struct bio_vec *bv, unsigned int op, sector_t sector) @@ -150,17 +140,11 @@ static int litesata_do_bvec(struct litesata_dev *lbd, struct bio_vec *bv, return err; count = bv->bv_len >> SECTOR_SHIFT; - // FIXME: I want to know if we ever transfer a number of - // contiguous blocks other than 1 or 8 !!! - if (count != 1 && count != 8) - dev_warn(dev, "### === --- %s %d sectors --- === ###\n", - op_is_write(op) ? "writing" : "reading", count); + mutex_lock(&lbd->lock); err = litesata_do_dma(lbd, regs, dma, sector, count); + mutex_unlock(&lbd->lock); if (err) - { - dev_warn(dev, "litesata_do_dma error"); return err; - } dma_unmap_page(dev, dma, bv->bv_len, dir); return 0; @@ -230,10 +214,7 @@ static int litesata_irq_init(struct platform_device *pdev, ret = platform_get_irq_optional(pdev, 0); if (ret < 0 && ret != -ENXIO) - { - dev_info(dev, "%d<0 or ret != -ENXIO\n", ret); return ret; - } if (ret > 0) lbd->irq = ret; else { @@ -341,6 +322,8 @@ static int litesata_probe(struct platform_device *pdev) lbd->dev = dev; + mutex_init(&lbd->lock); + lbd->lsident = devm_platform_ioremap_resource_byname(pdev, "ident"); if (IS_ERR(lbd->lsident)) return PTR_ERR(lbd->lsident); @@ -360,61 +343,33 @@ static int litesata_probe(struct platform_device *pdev) /* Initialize disk, get model and size */ err = litesata_init_ident(lbd, &size); if (err) - { - dev_info(dev, "Error litesata_init_ident"); return err; - } /* Configure interrupts */ err = litesata_irq_init(pdev, lbd); if (err) - { - dev_info(dev, "Error litesata_irq_init"); return err; - } - - dev_info(dev, "sata irq init \n"); - gendisk = blk_alloc_disk(NUMA_NO_NODE); if (!gendisk) - { - dev_info(dev, "Error blk_alloc_disk"); return -ENOMEM; - } - dev_info(dev, "blk_alloc_disk \n"); err = devm_add_action_or_reset(dev, litesata_devm_put_disk, gendisk); if (err) - { - dev_info(dev, "Error devm_add_action_or_reset"); return dev_err_probe(dev, err, "Can't register put_disk action\n"); - } - dev_info(dev, "devm_add_action_or_reset \n"); gendisk->private_data = lbd; gendisk->fops = &litesata_fops; strcpy(gendisk->disk_name, "litesata"); - - set_capacity(gendisk, 0); - - err = add_disk(gendisk); - dev_info(dev, "add_disk \n"); - if (err) - { - dev_info(dev, "Error add_disk"); - return err; - } - set_capacity(gendisk, size); - dev_info(dev, "set_capacity \n"); blk_queue_flag_set(QUEUE_FLAG_NONROT, gendisk->queue); blk_queue_physical_block_size(gendisk->queue, SECTOR_SIZE); - dev_info(dev, "blk_queue_physical_block_size \n"); blk_queue_logical_block_size(gendisk->queue, SECTOR_SIZE); - dev_info(dev, "blk_queue_logical_block_size \n"); + err = add_disk(gendisk); + if (err) + return err; dev_info(dev, "probe success; sector size = %d\n", SECTOR_SIZE); return 0; From 0580faf1236bdc4215a1de7e55b332c997d970ce Mon Sep 17 00:00:00 2001 From: cyntem Date: Tue, 28 Nov 2023 19:43:55 +0300 Subject: [PATCH 8/8] Update litesata.c Increase delay on init --- drivers/block/litesata.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/block/litesata.c b/drivers/block/litesata.c index b820379ca5073e..267e83c1cd9192 100644 --- a/drivers/block/litesata.c +++ b/drivers/block/litesata.c @@ -260,16 +260,16 @@ static int litesata_init_ident(struct litesata_dev *lbd, sector_t *size) /* reset phy */ litex_write8(lbd->lsphy + LITESATA_PHY_ENA, 0); - msleep(1); + msleep(5); litex_write8(lbd->lsphy + LITESATA_PHY_ENA, 1); - msleep(100); + msleep(400); /* check phy status */ if ((litex_read8(lbd->lsphy + LITESATA_PHY_STS) & LSPHY_STS_RDY) == 0) return -ENODEV; /* initiate `identify` sequence */ litex_write8(lbd->lsident + LITESATA_ID_STRT, 1); - msleep(100); + msleep(400); /* check `identify` status */ if ((litex_read8(lbd->lsident + LITESATA_ID_DONE) & 0x01) == 0) return -ENODEV;