From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 33F7DC64E8A for ; Mon, 30 Nov 2020 08:37:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E4D9B20C56 for ; Mon, 30 Nov 2020 08:37:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728160AbgK3IhH (ORCPT ); Mon, 30 Nov 2020 03:37:07 -0500 Received: from twspam01.aspeedtech.com ([211.20.114.71]:45469 "EHLO twspam01.aspeedtech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728090AbgK3IhG (ORCPT ); Mon, 30 Nov 2020 03:37:06 -0500 Received: from mail.aspeedtech.com ([192.168.0.24]) by twspam01.aspeedtech.com with ESMTP id 0AU8Vqmw067868; Mon, 30 Nov 2020 16:31:52 +0800 (GMT-8) (envelope-from troy_lee@aspeedtech.com) Received: from TroyLee-PC.localdomain (192.168.100.253) by TWMBX02.aspeed.com (192.168.0.24) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 30 Nov 2020 16:34:13 +0800 From: Troy Lee To: Stefan Schaeckeler , Rob Herring , Joel Stanley , Andrew Jeffery , "Borislav Petkov" , Mauro Carvalho Chehab , Tony Luck , James Morse , Robert Richter , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , "moderated list:ARM/ASPEED MACHINE SUPPORT" , "moderated list:ARM/ASPEED MACHINE SUPPORT" , open list , "open list:EDAC-CORE" CC: , , Subject: [PATCH 3/3] edac: Supporting AST2400 and AST2600 edac driver Date: Mon, 30 Nov 2020 16:33:45 +0800 Message-ID: <20201130083345.4814-3-troy_lee@aspeedtech.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201130083345.4814-1-troy_lee@aspeedtech.com> References: <20201130083345.4814-1-troy_lee@aspeedtech.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.168.100.253] X-ClientProxiedBy: TWMBX02.aspeed.com (192.168.0.24) To TWMBX02.aspeed.com (192.168.0.24) X-DNSRBL: X-MAIL: twspam01.aspeedtech.com 0AU8Vqmw067868 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adding AST2400 and AST2600 edac driver support. Signed-off-by: Troy Lee --- drivers/edac/Kconfig | 6 +- drivers/edac/aspeed_edac.c | 114 +++++++++++++++++++++++++++++-------- 2 files changed, 94 insertions(+), 26 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) help - Support for error detection and correction on the Aspeed AST 2500 SoC. + Support for error detection and correction on the Aspeed AST BMC SoC. First, ECC must be configured in the bootloader. Then, this driver 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..03a3c12f6bf6 100644 --- a/drivers/edac/aspeed_edac.c +++ b/drivers/edac/aspeed_edac.c @@ -14,12 +14,11 @@ #include #include "edac_module.h" - #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 */ #define ASPEED_MCR_INTR_CTRL 0x50 /* interrupt control/status register */ #define ASPEED_MCR_ADDR_UNREC 0x58 /* address of first un-recoverable error */ #define ASPEED_MCR_ADDR_REC 0x5c /* address of last recoverable error */ @@ -34,10 +33,8 @@ #define ASPEED_MCR_INTR_CTRL_CNT_UNREC GENMASK(15, 12) #define ASPEED_MCR_INTR_CTRL_ENABLE (BIT(0) | BIT(1)) - 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 +50,6 @@ static int regmap_reg_write(void *context, unsigned int reg, unsigned int val) return 0; } - static int regmap_reg_read(void *context, unsigned int reg, unsigned int *val) { void __iomem *regs = (void __iomem *)context; @@ -63,6 +59,76 @@ static int regmap_reg_read(void *context, unsigned int reg, unsigned int *val) 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); +} +EXPORT_SYMBOL(aspeed_sdmc_disable_mem_protection); + +static const u32 ast2400_dram_table[] = { + 0x04000000, //64MB + 0x08000000, //128MB + 0x10000000, //256MB + 0x20000000, //512MB +}; + +static const u32 ast2500_dram_table[] = { + 0x08000000, //128MB + 0x10000000, //256MB + 0x20000000, //512MB + 0x40000000, //1024MB +}; + +static const u32 ast2600_dram_table[] = { + 0x10000000, //256MB + 0x20000000, //512MB + 0x40000000, //1024MB + 0x80000000, //2048MB +}; + +extern u32 aspeed_get_dram_size(void) +{ + u32 reg04; + u32 size; + + regmap_read(aspeed_regmap, ASPEED_MCR_CONF, ®04); + +#if defined(CONFIG_MACH_ASPEED_G6) + size = ast2600_dram_table[reg04 & 0x3]; +#elif defined(CONFIG_MACH_ASPEED_G5) + size = ast2500_dram_table[reg04 & 0x3]; +#else + size = ast2400_dram_table[reg04 & 0x3]; +#endif + return size; +} +EXPORT_SYMBOL(aspeed_get_dram_size); + +static const u32 aspeed_vga_table[] = { + 0x800000, //8MB + 0x1000000, //16MB + 0x2000000, //32MB + 0x4000000, //64MB +}; + +extern u32 aspeed_get_vga_size(void) +{ + u32 reg04; + u32 size; + + regmap_read(aspeed_regmap, ASPEED_MCR_CONF, ®04); + + size = aspeed_vga_table[((reg04 & 0xC) >> 2)]; + return size; +} +EXPORT_SYMBOL(aspeed_get_vga_size); + static bool regmap_is_volatile(struct device *dev, unsigned int reg) { switch (reg) { @@ -209,8 +275,8 @@ static int config_irq(void *ctx, struct platform_device *pdev) /* register interrupt handler */ irq = platform_get_irq(pdev, 0); dev_dbg(&pdev->dev, "got irq %d\n", irq); - if (irq < 0) - return irq; + if (!irq) + return -ENODEV; rc = devm_request_irq(&pdev->dev, irq, mcr_isr, IRQF_TRIGGER_HIGH, DRV_NAME, ctx); @@ -239,7 +305,11 @@ 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"); +#ifdef CONFIG_MACH_ASPEED_G4 + np = of_find_node_by_path("/memory@40000000"); +#else + np = of_find_node_by_path("/memory@80000000"); +#endif if (!np) { dev_err(mci->pdev, "dt: missing /memory node\n"); return -ENODEV; @@ -281,11 +351,19 @@ static int aspeed_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct edac_mc_layer layers[2]; struct mem_ctl_info *mci; + struct device_node *np; + struct resource *res; void __iomem *regs; - u32 reg04; int rc; - regs = devm_platform_ioremap_resource(pdev, 0); + /* setup regmap */ + np = dev->of_node; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENOENT; + + regs = devm_ioremap_resource(dev, res); if (IS_ERR(regs)) return PTR_ERR(regs); @@ -294,13 +372,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, ®04); - if (!(reg04 & ASPEED_MCR_CONF_ECC)) { - dev_err(&pdev->dev, "ECC mode is not configured in u-boot\n"); - return -EPERM; - } - edac_op_state = EDAC_OPSTATE_INT; /* allocate & init EDAC MC data structure */ @@ -373,13 +444,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" }, {}, }; - static struct platform_driver aspeed_driver = { .driver = { .name = DRV_NAME, @@ -395,18 +466,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); - MODULE_LICENSE("GPL"); MODULE_AUTHOR("Stefan Schaeckeler "); -MODULE_DESCRIPTION("Aspeed AST2500 EDAC driver"); +MODULE_DESCRIPTION("Aspeed EDAC driver"); MODULE_VERSION("1.0"); -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DDCB4C63777 for ; Mon, 30 Nov 2020 08:37:30 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 63D9E206E3 for ; Mon, 30 Nov 2020 08:37:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Qff2Z5UH"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="USxE162/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 63D9E206E3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=aspeedtech.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=YNWkF4xwl3OTztEZcfI3sOBPb536lkRYTqnmKM4Fhu8=; b=Qff2Z5UH/IK8OLJN6qksvs5E5 zCI+vTxeAgE5eGpaE78m7Ef6q/oJQIjvX+xHWJSpQmuZVysduaYcSvZoBMkX95pvMuTEM+28qujOi WuSW+6VjaxmhNBRn3yhFPXLK9GphXV9pc9DUu74g3I+lLf5FM1vpFuPoSIgR7ywoxYAWNdV406qMW aUHPV8azVxtdROFyjC6dRifKHeMwh5tRKxzL2fAK+J30wL9Gb6InKVunZopgzvA3YtHrZ/6G5zoYR bJQ94pThWr+ZU+TSoKal/MFWk2QwsZzMQ5jOjJD8vSs4davXnKv6OR4MW6iTRaAHR2X7vo/2kWdOt ZNRYtPhog==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kjefQ-0002t1-H7; Mon, 30 Nov 2020 08:36:16 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kjefC-0002pp-Ip for linux-arm-kernel@merlin.infradead.org; Mon, 30 Nov 2020 08:36:03 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:CC:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=EM8j8pc2Z7/nDytFibl52iEZHf+shCDremiF81g/M20=; b=USxE162/yY99Oa7sMggdfAmPf/ M15QO05SjYR0ENpbalNV3CkDWm5RNf+Bnn4dxFvpHb3E6B1ghDRGS451z0KMkFyu18fgp43cPfAK3 D3RC29nOVP2r4uDQNMtIe0eFLvvtz1HIk9DI/1I6KTRKRalf5S8iWK2lcprMtxTmk7Xa6DrUBGvN2 4AeMK9711UfZeJL190r8NOz0oGZeybzd15IbYhKr+XouKhvvSHp/88e8ZSYmP+xEyFlxvkefiClDM 4pjTnzCAPHVp1fwX7QrBu2trkERTV21RmHjbTT5hL0b2K2cDXBtqibt3o30dhY7Sp18F0whpFwxOl b6PkOpYA==; Received: from twspam01.aspeedtech.com ([211.20.114.71]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kjef4-0004Nk-Vj for linux-arm-kernel@lists.infradead.org; Mon, 30 Nov 2020 08:36:01 +0000 Received: from mail.aspeedtech.com ([192.168.0.24]) by twspam01.aspeedtech.com with ESMTP id 0AU8Vqmw067868; Mon, 30 Nov 2020 16:31:52 +0800 (GMT-8) (envelope-from troy_lee@aspeedtech.com) Received: from TroyLee-PC.localdomain (192.168.100.253) by TWMBX02.aspeed.com (192.168.0.24) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 30 Nov 2020 16:34:13 +0800 From: Troy Lee To: Stefan Schaeckeler , Rob Herring , Joel Stanley , Andrew Jeffery , "Borislav Petkov" , Mauro Carvalho Chehab , Tony Luck , James Morse , Robert Richter , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , "moderated list:ARM/ASPEED MACHINE SUPPORT" , "moderated list:ARM/ASPEED MACHINE SUPPORT" , open list , "open list:EDAC-CORE" Subject: [PATCH 3/3] edac: Supporting AST2400 and AST2600 edac driver Date: Mon, 30 Nov 2020 16:33:45 +0800 Message-ID: <20201130083345.4814-3-troy_lee@aspeedtech.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201130083345.4814-1-troy_lee@aspeedtech.com> References: <20201130083345.4814-1-troy_lee@aspeedtech.com> MIME-Version: 1.0 X-Originating-IP: [192.168.100.253] X-ClientProxiedBy: TWMBX02.aspeed.com (192.168.0.24) To TWMBX02.aspeed.com (192.168.0.24) X-DNSRBL: X-MAIL: twspam01.aspeedtech.com 0AU8Vqmw067868 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201130_083556_431641_23D4A3EF X-CRM114-Status: GOOD ( 21.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: leetroy@gmail.com, troy_lee@aspeedtech.com, ryan_chen@aspeedtech.com Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Adding AST2400 and AST2600 edac driver support. Signed-off-by: Troy Lee --- drivers/edac/Kconfig | 6 +- drivers/edac/aspeed_edac.c | 114 +++++++++++++++++++++++++++++-------- 2 files changed, 94 insertions(+), 26 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) help - Support for error detection and correction on the Aspeed AST 2500 SoC. + Support for error detection and correction on the Aspeed AST BMC SoC. First, ECC must be configured in the bootloader. Then, this driver 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..03a3c12f6bf6 100644 --- a/drivers/edac/aspeed_edac.c +++ b/drivers/edac/aspeed_edac.c @@ -14,12 +14,11 @@ #include #include "edac_module.h" - #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 */ #define ASPEED_MCR_INTR_CTRL 0x50 /* interrupt control/status register */ #define ASPEED_MCR_ADDR_UNREC 0x58 /* address of first un-recoverable error */ #define ASPEED_MCR_ADDR_REC 0x5c /* address of last recoverable error */ @@ -34,10 +33,8 @@ #define ASPEED_MCR_INTR_CTRL_CNT_UNREC GENMASK(15, 12) #define ASPEED_MCR_INTR_CTRL_ENABLE (BIT(0) | BIT(1)) - 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 +50,6 @@ static int regmap_reg_write(void *context, unsigned int reg, unsigned int val) return 0; } - static int regmap_reg_read(void *context, unsigned int reg, unsigned int *val) { void __iomem *regs = (void __iomem *)context; @@ -63,6 +59,76 @@ static int regmap_reg_read(void *context, unsigned int reg, unsigned int *val) 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); +} +EXPORT_SYMBOL(aspeed_sdmc_disable_mem_protection); + +static const u32 ast2400_dram_table[] = { + 0x04000000, //64MB + 0x08000000, //128MB + 0x10000000, //256MB + 0x20000000, //512MB +}; + +static const u32 ast2500_dram_table[] = { + 0x08000000, //128MB + 0x10000000, //256MB + 0x20000000, //512MB + 0x40000000, //1024MB +}; + +static const u32 ast2600_dram_table[] = { + 0x10000000, //256MB + 0x20000000, //512MB + 0x40000000, //1024MB + 0x80000000, //2048MB +}; + +extern u32 aspeed_get_dram_size(void) +{ + u32 reg04; + u32 size; + + regmap_read(aspeed_regmap, ASPEED_MCR_CONF, ®04); + +#if defined(CONFIG_MACH_ASPEED_G6) + size = ast2600_dram_table[reg04 & 0x3]; +#elif defined(CONFIG_MACH_ASPEED_G5) + size = ast2500_dram_table[reg04 & 0x3]; +#else + size = ast2400_dram_table[reg04 & 0x3]; +#endif + return size; +} +EXPORT_SYMBOL(aspeed_get_dram_size); + +static const u32 aspeed_vga_table[] = { + 0x800000, //8MB + 0x1000000, //16MB + 0x2000000, //32MB + 0x4000000, //64MB +}; + +extern u32 aspeed_get_vga_size(void) +{ + u32 reg04; + u32 size; + + regmap_read(aspeed_regmap, ASPEED_MCR_CONF, ®04); + + size = aspeed_vga_table[((reg04 & 0xC) >> 2)]; + return size; +} +EXPORT_SYMBOL(aspeed_get_vga_size); + static bool regmap_is_volatile(struct device *dev, unsigned int reg) { switch (reg) { @@ -209,8 +275,8 @@ static int config_irq(void *ctx, struct platform_device *pdev) /* register interrupt handler */ irq = platform_get_irq(pdev, 0); dev_dbg(&pdev->dev, "got irq %d\n", irq); - if (irq < 0) - return irq; + if (!irq) + return -ENODEV; rc = devm_request_irq(&pdev->dev, irq, mcr_isr, IRQF_TRIGGER_HIGH, DRV_NAME, ctx); @@ -239,7 +305,11 @@ 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"); +#ifdef CONFIG_MACH_ASPEED_G4 + np = of_find_node_by_path("/memory@40000000"); +#else + np = of_find_node_by_path("/memory@80000000"); +#endif if (!np) { dev_err(mci->pdev, "dt: missing /memory node\n"); return -ENODEV; @@ -281,11 +351,19 @@ static int aspeed_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct edac_mc_layer layers[2]; struct mem_ctl_info *mci; + struct device_node *np; + struct resource *res; void __iomem *regs; - u32 reg04; int rc; - regs = devm_platform_ioremap_resource(pdev, 0); + /* setup regmap */ + np = dev->of_node; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENOENT; + + regs = devm_ioremap_resource(dev, res); if (IS_ERR(regs)) return PTR_ERR(regs); @@ -294,13 +372,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, ®04); - if (!(reg04 & ASPEED_MCR_CONF_ECC)) { - dev_err(&pdev->dev, "ECC mode is not configured in u-boot\n"); - return -EPERM; - } - edac_op_state = EDAC_OPSTATE_INT; /* allocate & init EDAC MC data structure */ @@ -373,13 +444,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" }, {}, }; - static struct platform_driver aspeed_driver = { .driver = { .name = DRV_NAME, @@ -395,18 +466,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); - MODULE_LICENSE("GPL"); MODULE_AUTHOR("Stefan Schaeckeler "); -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