Hi Udit, On 07/08/25 10:16, Kumar, Udit wrote: > > On 7/30/2025 7:07 PM, Neha Malcom Francis wrote: >> Instead of defaulting to choosing the entire DDR region when enabling >> inline ECC, allow picking of a range within the DDR space using DT to >> enable. >> >> It expects such a node within the memory node, in the absence of which >> we resort to enabling inline ECC for the entire DDR region: >> >> inline_ecc: protected@9e780000 { >> device_type = "ecc"; >> reg = <0x9e780000 0x0080000>; >> bootph-all; >> }; > > Please mention , where you expect this node to available in all > controller nodes or just one controller (in case of multiple controllers) >
This is not part of the memorycontroller node; it is a subnode of the memory/ node. > >> >> Signed-off-by: Neha Malcom Francis <n-fran...@ti.com> >> --- >> drivers/ram/k3-ddrss/k3-ddrss.c | 55 +++++++++++++++++++++++++++++++-- >> 1 file changed, 52 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/ram/k3-ddrss/k3-ddrss.c >> b/drivers/ram/k3-ddrss/k3-ddrss.c >> index a94755c3542..cd117d7eba7 100644 >> --- a/drivers/ram/k3-ddrss/k3-ddrss.c >> +++ b/drivers/ram/k3-ddrss/k3-ddrss.c >> @@ -155,6 +155,7 @@ struct k3_ddrss_desc { >> lpddr4_obj *driverdt; >> lpddr4_config config; >> lpddr4_privatedata pd; >> + struct k3_ddrss_ecc_region ecc_range; >> struct k3_ddrss_ecc_region ecc_regions[K3_DDRSS_MAX_ECC_REG]; >> u64 ecc_reserved_space; >> u64 ddr_bank_base[CONFIG_NR_DRAM_BANKS]; >> @@ -733,6 +734,30 @@ static void k3_ddrss_ddr_reg_init(struct >> k3_ddrss_desc *ddrss) >> writel(DDRSS_ECC_CTRL_REG_DEFAULT, ddrss->ddrss_ss_cfg + >> DDRSS_ECC_CTRL_REG); >> } >> +static void k3_ddrss_ddr_inline_ecc_base_size_calc(struct >> k3_ddrss_ecc_region *range) >> +{ >> + fdt_addr_t base; >> + fdt_size_t size; >> + ofnode node1; >> + >> + node1 = ofnode_null(); >> + >> + do { >> + node1 = ofnode_by_prop_value(node1, "device_type", "ecc", 4); >> + } while (!ofnode_is_enabled(node1)); >> + > > Depending where you expect node to available, parsing logic may change a > little As mentioned above, it will always be in a single place i.e. memory/ node. The distribution to the different memory controllers is handled by the driver. > > >> + base = ofnode_get_addr_size(node1, "reg", &size); >> + >> + if (base == FDT_ADDR_T_NONE) { >> + debug("%s: Failed to get ECC node reg and size\n", __func__); >> + range->start = 0; >> + range->range = 0; >> + } else { >> + range->start = base; >> + range->range = size; >> + } >> +} >> + >> static void k3_ddrss_lpddr4_ecc_calc_reserved_mem(struct >> k3_ddrss_desc *ddrss) >> { >> fdtdec_setup_mem_size_base_lowest(); >> @@ -782,8 +807,11 @@ static void k3_ddrss_lpddr4_ecc_init(struct >> k3_ddrss_desc *ddrss) >> static int k3_ddrss_probe(struct udevice *dev) >> { >> + u64 end; >> int ret; >> struct k3_ddrss_desc *ddrss = dev_get_priv(dev); >> + __maybe_unused u32 ddr_ram_size, ecc_res; > > ddr_ram_size may go above u32 > >> + __maybe_unused struct k3_ddrss_ecc_region *range = >> &ddrss->ecc_range; >> debug("%s(dev=%p)\n", __func__, dev); >> @@ -821,9 +849,30 @@ static int k3_ddrss_probe(struct udevice *dev) >> k3_ddrss_lpddr4_ecc_calc_reserved_mem(ddrss); >> - /* Always configure one region that covers full DDR space */ >> - ddrss->ecc_regions[0].start = 0; >> - ddrss->ecc_regions[0].range = ddrss->ddr_ram_size - >> ddrss->ecc_reserved_space; > > patch 1/8 is remove here, please check if you really need 1/8 ? > 1/8 still changes what ddrss->ecc_regions[0].start implies. So the call to k3_ddrss_set_ecc_range_r0 is also changed there. > >> + k3_ddrss_ddr_inline_ecc_base_size_calc(range); >> + >> + end = ddrss->ecc_range.start + ddrss->ecc_range.range; >> + ddr_ram_size = ddrss->ddr_ram_size; >> + ecc_res = ddrss->ecc_reserved_space; >> + >> + if (!range->range) { >> + /* Configure entire DDR space by default */ >> + debug("%s: Defaulting to protecting entire DDR space >> using inline ECC\n", >> + __func__); >> + ddrss->ecc_range.start = ddrss->ddr_bank_base[0]; >> + ddrss->ecc_range.range = ddr_ram_size - ecc_res; >> + } else { >> + ddrss->ecc_range.start = range->start; >> + ddrss->ecc_range.range = range->range; >> + } >> + > > Please add comment here for below code . > > I think you are trying to fix, if end goes above one ddr Yes will add comments here, thanks for the review! > >> + if (end > (ddr_ram_size - ecc_res)) >> + ddrss->ecc_regions[0].range = ddr_ram_size - ecc_res; >> + else >> + ddrss->ecc_regions[0].range = ddrss->ecc_range.range; >> + >> + ddrss->ecc_regions[0].start = ddrss->ecc_range.start - >> ddrss->ddr_bank_base[0]; >> + >> k3_ddrss_lpddr4_ecc_init(ddrss); >> } >> -- Thanking You Neha Malcom Francis