From 643e14cfa2005090a6a3a3949191f4baa7b434e7 Mon Sep 17 00:00:00 2001 From: Kaushal Kumar Date: Tue, 19 Nov 2019 19:14:20 +0530 Subject: [PATCH] ANDROID: GKI: drivers: of: Add APIs to find DDR device rank, HBB Add APIs to find the DDR device rank and Highest Bank Bit (HBB) information from their respective memory nodes. Bug: 153905290 Test: compile Change-Id: Iae94efc681daf2cf0a531dceb8d2acdcf3484388 Signed-off-by: Kaushal Kumar (cherry picked from commit 789ad9a7a829c6c423125eac3490967916c46ba9) Signed-off-by: Will McVicker --- drivers/of/fdt.c | 63 ++++++++++++++++++++++++++++++++++++++++++ include/linux/of_fdt.h | 2 ++ 2 files changed, 65 insertions(+) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 85b0055a5ae4..688f1226eea2 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -80,6 +80,69 @@ void of_fdt_limit_memory(int limit) } } +/** + * of_fdt_get_ddrhbb - Return the highest bank bit of ddr on the current device + * + * On match, returns a non-zero positive value which matches the highest bank + * bit. + * Otherwise returns -ENOENT. + */ +int of_fdt_get_ddrhbb(int channel, int rank) +{ + int memory; + int len; + int ret; + /* Single spaces reserved for channel(0-9), rank(0-9) */ + char pname[] = "ddr_device_hbb_ch _rank "; + fdt32_t *prop = NULL; + + memory = fdt_path_offset(initial_boot_params, "/memory"); + if (memory > 0) { + snprintf(pname, sizeof(pname), + "ddr_device_hbb_ch%d_rank%d", channel, rank); + prop = fdt_getprop_w(initial_boot_params, memory, + pname, &len); + } + + if (!prop || len != sizeof(u32)) + return -ENOENT; + + ret = fdt32_to_cpu(*prop); + + return ret; +} + +/** + * of_fdt_get_ddrrank - Return the rank of ddr on the current device + * + * On match, returns a non-zero positive value which matches the ddr rank. + * Otherwise returns -ENOENT. + */ +int of_fdt_get_ddrrank(int channel) +{ + int memory; + int len; + int ret; + /* Single space reserved for channel(0-9) */ + char pname[] = "ddr_device_rank_ch "; + fdt32_t *prop = NULL; + + memory = fdt_path_offset(initial_boot_params, "/memory"); + if (memory > 0) { + snprintf(pname, sizeof(pname), + "ddr_device_rank_ch%d", channel); + prop = fdt_getprop_w(initial_boot_params, memory, + pname, &len); + } + + if (!prop || len != sizeof(u32)) + return -ENOENT; + + ret = fdt32_to_cpu(*prop); + + return ret; +} + /** * of_fdt_get_ddrtype - Return the type of ddr (4/5) on the current device * diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index f41f3c463307..280bffadd0b4 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h @@ -48,6 +48,8 @@ extern char __dtb_end[]; extern u64 of_flat_dt_translate_address(unsigned long node); extern void of_fdt_limit_memory(int limit); extern int of_fdt_get_ddrtype(void); +extern int of_fdt_get_ddrrank(int channel); +extern int of_fdt_get_ddrhbb(int channel, int rank); #endif /* CONFIG_OF_FLATTREE */ #ifdef CONFIG_OF_EARLY_FLATTREE