Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755477AbbBFWFi (ORCPT ); Fri, 6 Feb 2015 17:05:38 -0500 Received: from mail-bl2on0096.outbound.protection.outlook.com ([65.55.169.96]:40297 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752833AbbBFWFf (ORCPT ); Fri, 6 Feb 2015 17:05:35 -0500 Message-ID: <54D53AB3.6040205@opensource.altera.com> Date: Fri, 6 Feb 2015 16:05:39 -0600 From: Thor Thayer User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Mark Rutland CC: "bp@alien8.de" , "dougthompson@xmission.com" , "m.chehab@samsung.com" , "robh+dt@kernel.org" , Pawel Moll , "ijc+devicetree@hellion.org.uk" , "galak@codeaurora.org" , "linux@arm.linux.org.uk" , "dinguyen@opensource.altera.com" , "grant.likely@linaro.org" , "devicetree@vger.kernel.org" , "linux-doc@vger.kernel.org" , "linux-edac@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "tthayer.linux@gmail.com" Subject: Re: [PATCHv6 2/5] arm: socfpga: Enable OCRAM ECC on startup. References: <1420772036-3112-1-git-send-email-tthayer@opensource.altera.com> <1420772036-3112-3-git-send-email-tthayer@opensource.altera.com> <20150206184544.GC10324@leverpostej> In-Reply-To: <20150206184544.GC10324@leverpostej> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY2PR06CA023.namprd06.prod.outlook.com (10.141.250.141) To CY1PR0301MB0636.namprd03.prod.outlook.com (25.160.158.142) X-Microsoft-Antispam: UriScan:; X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB0636; X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004);SRVR:CY1PR0301MB0636; X-Forefront-PRVS: 047999FF16 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6049001)(6009001)(51704005)(479174004)(164054003)(24454002)(377454003)(50986999)(42186005)(23746002)(64126003)(47776003)(65956001)(66066001)(87976001)(76176999)(87266999)(54356999)(40100003)(46102003)(33656002)(110136001)(19580405001)(19580395003)(50466002)(77156002)(80316001)(86362001)(122386002)(2950100001)(62966003)(92566002)(83506001)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR0301MB0636;H:[137.57.160.203];FPR:;SPF:None;MLV:sfv;LANG:en; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB0636; X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2015 22:05:30.8655 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB0636 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4112 Lines: 143 Hi Mark, On 02/06/2015 12:45 PM, Mark Rutland wrote: > On Fri, Jan 09, 2015 at 02:53:53AM +0000, tthayer@opensource.altera.com wrote: >> From: Thor Thayer >> >> This patch enables the ECC for On-Chip RAM on machine >> startup. The ECC has to be enabled before data is >> is stored in memory otherwise the ECC will fail on >> reads. > > Where else is this OCRAM used? > > If we need the ECC to be enabled before use, a module_init call that > seems to be unrelated to any other usage doesn't seem right to me. > Hopefully I've just misunderstood something here. > Thank you for reviewing this. The OCRAM will be used to store data and functions for putting and removing the SoC from sleep. However, in this scenario, we won't have the ECC enabled. To initialize ECC, the OCRAM needs to enable ECC then clear the entire memory to zero before using it. Doing this early in the startup sequence seemed appropriate. Maybe I'm misunderstanding your concern. < snip> >> +static int __init socfpga_init_ocram_ecc(void) >> +{ >> + struct device_node *np; >> + struct resource res; >> + u32 iram_addr; >> + void __iomem *mapped_ocr_edac_addr; >> + resource_size_t size; >> + struct gen_pool *gp; >> + int ret; >> + >> + /* Get the size of the on-chip RAM */ >> + np = of_find_compatible_node(NULL, NULL, "mmio-sram"); >> + if (!np) { >> + pr_err("%s: Unable to find mmio-sram in dtb\n", __func__); >> + return -ENODEV; >> + } >> + >> + ret = of_address_to_resource(np, 0, &res); >> + if (ret) { >> + of_node_put(np); >> + pr_err("%s: Problem getting SRAM address in dtb\n", __func__); >> + return -ENODEV; >> + } >> + size = resource_size(&res); >> + of_node_put(np); >> + >> + /* Find the OCRAM EDAC device tree node */ >> + np = of_find_compatible_node(NULL, NULL, "altr,ocram-edac"); >> + if (!np) { >> + pr_err("%s: Unable to find altr,ocram-edac\n", __func__); >> + return -ENODEV; >> + } >> + >> + mapped_ocr_edac_addr = of_iomap(np, 0); >> + if (!mapped_ocr_edac_addr) { >> + of_node_put(np); >> + pr_err("%s: Unable to map OCRAM ecc regs.\n", __func__); >> + return -ENODEV; >> + } >> + >> + gp = of_get_named_gen_pool(np, "iram", 0); >> + if (!gp) { >> + of_node_put(np); >> + pr_err("%s: OCRAM cannot find gen pool\n", __func__); >> + return -ENODEV; >> + } >> + of_node_put(np); >> + >> + iram_addr = gen_pool_alloc(gp, size / sizeof(size_t)); > > Why divide by sizeof(size_t) here? As far as I am aware, resource_size > gives you a size in bytes... > Yes, you are right. I shouldn't have changed this - for some reason when I re-read the function prototype, I thought this function was allocating integers. Thank you. >> + if (iram_addr == 0) { >> + pr_err("%s: cannot alloc from gen pool\n", __func__); >> + return -ENODEV; >> + } >> + >> + /* Clear any pending OCRAM ECC interrupts, then enable ECC */ >> + writel(ALTR_OCRAM_CLEAR_ECC, mapped_ocr_edac_addr); >> + writel(ALTR_OCRAM_ECC_EN, mapped_ocr_edac_addr); >> + >> + memset((void *)iram_addr, 0, size); > > ...and here we write size bytes, not (size / sizeof(size_t)) bytes, so > we're poking memory we weren't allocated. > > How is this memory mapped exactly? Is memset safe? > > Thanks, > Mark. > Yes, thank you for catching that. OK. I think I understand your point now. I need to enable the OCRAM ECC before the gen_pool_create() which is called by the "ocram:sram@ffff0000" node. In that case, I should move this OCRAM ECC enable into the same place as L2 ecc is enabled. Thor >> + >> + gen_pool_free(gp, iram_addr, size / sizeof(size_t)); >> + >> + iounmap(mapped_ocr_edac_addr); >> + >> + return 0; >> +} >> + >> +static void __exit socfpga_exit_ocram_ecc(void) >> +{ >> +} >> + >> +module_init(socfpga_init_ocram_ecc); >> +module_exit(socfpga_exit_ocram_ecc); >> -- >> 1.7.9.5 >> >> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/