Thread (11 messages) 11 messages, 4 authors, 2020-12-03

RE: [PATCH v2 3/3] edac: Supporting AST2400 and AST2600 edac driver

From: Troy Lee <hidden>
Date: 2020-12-02 08:43:26
Also in: linux-aspeed, linux-devicetree, linux-edac, lkml

Hi Joel,

Thanks for the suggestion, I'll fix the review and create an new patch against 
latest Linux branch. Those exported function will be referenced in other driver yet 
to be upstream, so should I move those exported functions out of this patch?

Thanks,
Troy Lee
-----Original Message-----
From: Joel Stanley <joel@jms.id.au>
Sent: Wednesday, December 2, 2020 3:02 PM
To: Troy Lee <redacted>
Cc: Stefan Schaeckeler <sschaeck@cisco.com>; Rob Herring
[off-list ref]; Andrew Jeffery [off-list ref]; Borislav Petkov
[off-list ref]; Mauro Carvalho Chehab [off-list ref]; Tony Luck
[off-list ref]; James Morse [off-list ref]; Robert
Richter [off-list ref]; open list:OPEN FIRMWARE AND FLATTENED
DEVICE TREE BINDINGS [off-list ref]; moderated
list:ARM/ASPEED MACHINE SUPPORT [off-list ref];
moderated list:ARM/ASPEED MACHINE SUPPORT
[off-list ref]; open list [off-list ref];
open list:EDAC-CORE [off-list ref]; leetroy@gmail.com; Ryan
Chen [off-list ref]
Subject: Re: [PATCH v2 3/3] edac: Supporting AST2400 and AST2600 edac
driver

On Wed, 2 Dec 2020 at 06:37, Troy Lee [off-list ref] wrote:
quoted
Adding AST2400 and AST2600 edac driver support.

Signed-off-by: Troy Lee <redacted>
---
Change since v1:
1. Removing SoC specific code
2. Changing numerical representation of memory sizing
---
 drivers/edac/Kconfig       |   6 +--
 drivers/edac/aspeed_edac.c | 103
+++++++++++++++++++++++++++++--------
 2 files changed, 85 insertions(+), 24 deletions(-)
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index
fc30f2ef9782..8ea70746d0bf 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -508,10 +508,10 @@ config EDAC_QCOM
          health, you should probably say 'Y' here.

 config EDAC_ASPEED
-       tristate "Aspeed AST 2500 SoC"
-       depends on MACH_ASPEED_G5
+       tristate "Aspeed AST BMC SoC"
+       depends on (MACH_ASPEED_G4 || MACH_ASPEED_G5 ||
+ MACH_ASPEED_G6)
Change this to ARCH_ASPEED.
Fixed.
quoted
        help
-         Support for error detection and correction on the Aspeed AST
2500 SoC.
quoted
+         Support for error detection and correction on the Aspeed AST
BMC SoC.
quoted
          First, ECC must be configured in the bootloader. Then, this
driver
quoted
          will expose error counters via the EDAC kernel framework.
diff --git a/drivers/edac/aspeed_edac.c b/drivers/edac/aspeed_edac.c
index fbec28dc661d..b8c8d6a05f91 100644
--- a/drivers/edac/aspeed_edac.c
+++ b/drivers/edac/aspeed_edac.c
@@ -14,12 +14,11 @@
 #include <linux/regmap.h>
 #include "edac_module.h"

-
These whitespace cleanups are ok, but can probably go in a different patch so
they aren't mixed up with the functional changes.
Okay, that make sense.
quoted
 #define DRV_NAME "aspeed-edac"

-
 #define ASPEED_MCR_PROT        0x00 /* protection key register */
 #define ASPEED_MCR_CONF        0x04 /* configuration register */
+#define ASPEED_MCR_REQ         0x08 /* Graphics Memory Protection
register */
quoted
 #define ASPEED_MCR_INTR_CTRL   0x50 /* interrupt control/status
register */
quoted
 #define ASPEED_MCR_ADDR_UNREC  0x58 /* address of first
un-recoverable error */
quoted
 #define ASPEED_MCR_ADDR_REC    0x5c /* address of last recoverable
error */
quoted
@@ -29,15 +28,17 @@
 #define ASPEED_MCR_PROT_PASSWD             0xfc600309
 #define ASPEED_MCR_CONF_DRAM_TYPE               BIT(4)
 #define ASPEED_MCR_CONF_ECC                     BIT(7)
+#define ASPEED_MCR_CONF_DRAM_CTRL_TYPE
+(BIT(28)|BIT(29)|BIT(30)|BIT(31))
We can use GENMASK here:

 GENMASK(31, 28)
quoted
 #define ASPEED_MCR_INTR_CTRL_CLEAR             BIT(31)
 #define ASPEED_MCR_INTR_CTRL_CNT_REC   GENMASK(23, 16)
 #define ASPEED_MCR_INTR_CTRL_CNT_UNREC GENMASK(15, 12)
#define
quoted
ASPEED_MCR_INTR_CTRL_ENABLE  (BIT(0) | BIT(1))

+#define ASPEED_MCR_CONF_DRAM_CTRL_TYPE_AST2500  0x01 #define
+ASPEED_MCR_CONF_DRAM_CTRL_TYPE_AST2600  0x03

 static struct regmap *aspeed_regmap;

-
 static int regmap_reg_write(void *context, unsigned int reg, unsigned
int val)  {
        void __iomem *regs = (void __iomem *)context; @@ -53,7 +54,6
@@ static int regmap_reg_write(void *context, unsigned int reg, unsigned
int val)
quoted
        return 0;
 }

-
 static int regmap_reg_read(void *context, unsigned int reg, unsigned
int *val)  {
        void __iomem *regs = (void __iomem *)context; @@ -63,6 +63,79
@@ static int regmap_reg_read(void *context, unsigned int reg, unsigned int
*val)
quoted
        return 0;
 }

+extern void aspeed_sdmc_disable_mem_protection(u8 req) {
+       u32 req_val = 0;
+
+       regmap_read(aspeed_regmap, ASPEED_MCR_REQ, &req_val);
+
+       req_val &= ~BIT(req);
+
+       regmap_write(aspeed_regmap, ASPEED_MCR_REQ, req_val);
This is open coding regmap_update_bits:

  regmap_update_bits(aspeed_regmap, ASPEED_MCR_REQ, BIT(req),
BIT(req));
quoted
+}
+EXPORT_SYMBOL(aspeed_sdmc_disable_mem_protection);
I don't think any of these functions need to be exported. The same comment
applies to the functions below this one; you can make them all static and drop
the extern and the EXPORT_SYMBOL.
quoted
+
+static const u32 ast2400_dram_table[] = {
+       64 << 20,
+       128 << 20,
+       256 << 20,
+       512 << 20,
+};
+
+static const u32 ast2500_dram_table[] = {
+       128 << 20,
+       256 << 20,
+       512 << 20,
+       1024 << 20,
+};
+
+static const u32 ast2600_dram_table[] = {
+       256 << 20,
+       512 << 20,
+       1024 << 20,
+       2048 << 20,
+};
+
+extern u32 aspeed_get_dram_size(void) {
+       u32 reg04;
+       u32 size;
+       u8 type;
+
+       regmap_read(aspeed_regmap, ASPEED_MCR_CONF, &reg04);
+
+       type = (reg04 & ASPEED_MCR_CONF_DRAM_CTRL_TYPE) >> 28;
+
+       if (type == ASPEED_MCR_CONF_DRAM_CTRL_TYPE_AST2600)
+               size = ast2600_dram_table[reg04 & 0x3];
+       else if (type == ASPEED_MCR_CONF_DRAM_CTRL_TYPE_AST2500)
+               size = ast2500_dram_table[reg04 & 0x3];
+       else
+               size = ast2400_dram_table[reg04 & 0x3];
+
+       return size;
+}
+EXPORT_SYMBOL(aspeed_get_dram_size);
+
+static const u32 aspeed_vga_table[] = {
+       8 << 20,
+       16 << 20,
+       32 << 20,
+       64 << 20,
+};
+
+extern u32 aspeed_get_vga_size(void)
+{
+       u32 reg04;
+       u32 size;
+
+       regmap_read(aspeed_regmap, ASPEED_MCR_CONF, &reg04);
+
+       size = aspeed_vga_table[((reg04 & 0xC) >> 2)];
+       return size;
If you do this:

 return aspeed_vga_table[((reg04 & 0xC) >> 2)]

You can drop 'size'.
quoted
+}
+EXPORT_SYMBOL(aspeed_get_vga_size);
+
 static bool regmap_is_volatile(struct device *dev, unsigned int reg)
{
        switch (reg) {
@@ -227,7 +300,6 @@ static int config_irq(void *ctx, struct platform_device
*pdev)
quoted
        return 0;
 }

-
 static int init_csrows(struct mem_ctl_info *mci)  {
        struct csrow_info *csrow = mci->csrows[0]; @@ -239,7 +311,7
@@
quoted
static int init_csrows(struct mem_ctl_info *mci)
        int rc;

        /* retrieve info about physical memory from device tree */
-       np = of_find_node_by_path("/memory");
+       np = of_find_node_by_name(NULL, "memory");
        if (!np) {
                dev_err(mci->pdev, "dt: missing /memory node\n");
                return -ENODEV;
@@ -275,14 +347,12 @@ static int init_csrows(struct mem_ctl_info *mci)
        return 0;
 }

-
 static int aspeed_probe(struct platform_device *pdev)  {
        struct device *dev = &pdev->dev;
        struct edac_mc_layer layers[2];
        struct mem_ctl_info *mci;
        void __iomem *regs;
-       u32 reg04;
        int rc;

        regs = devm_platform_ioremap_resource(pdev, 0); @@ -294,13
+364,6 @@ static int aspeed_probe(struct platform_device *pdev)
        if (IS_ERR(aspeed_regmap))
                return PTR_ERR(aspeed_regmap);

-       /* bail out if ECC mode is not configured */
-       regmap_read(aspeed_regmap, ASPEED_MCR_CONF, &reg04);
-       if (!(reg04 & ASPEED_MCR_CONF_ECC)) {
-               dev_err(&pdev->dev, "ECC mode is not configured in
u-boot\n");
quoted
-               return -EPERM;
-       }
-
        edac_op_state = EDAC_OPSTATE_INT;

        /* allocate & init EDAC MC data structure */ @@ -373,12
+436,13 @@ static int aspeed_remove(struct platform_device *pdev)
        return 0;
 }

-
 static const struct of_device_id aspeed_of_match[] = {
+       { .compatible = "aspeed,ast2400-sdram-edac" },
        { .compatible = "aspeed,ast2500-sdram-edac" },
+       { .compatible = "aspeed,ast2600-sdram-edac" },
        {},
 };
-
+MODULE_DEVICE_TABLE(of, aspeed_of_match);

 static struct platform_driver aspeed_driver = {
        .driver         = {
@@ -395,18 +459,15 @@ static int __init aspeed_init(void)
        return platform_driver_register(&aspeed_driver);
 }

-
 static void __exit aspeed_exit(void)
 {
        platform_driver_unregister(&aspeed_driver);
 }

-
 module_init(aspeed_init);
 module_exit(aspeed_exit);
Unrelated, you can clean up the above 6 lines with module_platform_driver().

Actually, looking at the kernel tree this was already done in v5.9.
Please send your next version based on the latest kernel, eg v5.10-rc1.

Cheers,

Joel
Good suggestion.
quoted
-
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Stefan Schaeckeler [off-list ref]");
-MODULE_DESCRIPTION("Aspeed AST2500 EDAC driver");
+MODULE_DESCRIPTION("Aspeed EDAC driver");
 MODULE_VERSION("1.0");
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help