From e45c6bc8a9ca13855569161080bec84a046bd1cb Mon Sep 17 00:00:00 2001 From: Viswanath L Date: Fri, 22 Sep 2023 03:15:27 +0000 Subject: [PATCH] nvadsp: Move DRAM map to custom property Move DRAM map DT entries from 'reg' to a new custom property "nvidia,dram_map". This is to restrict the use of 'reg' only for actual registers, which will be tightly controlled by 'ranges' property. Bug 4164138 Bug 3682950 Change-Id: Ia535d136b15a0ba6d7758ed3a2d70ace2c8cf763 Signed-off-by: Viswanath L Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2983549 Tested-by: mobile promotions Reviewed-by: mobile promotions --- drivers/platform/tegra/nvadsp/dev.c | 29 ++++++++++++++++------------- drivers/platform/tegra/nvadsp/dev.h | 18 +++++++++++------- drivers/platform/tegra/nvadsp/os.c | 16 ++++++++++------ 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/drivers/platform/tegra/nvadsp/dev.c b/drivers/platform/tegra/nvadsp/dev.c index b04cfbc3..0726aabe 100644 --- a/drivers/platform/tegra/nvadsp/dev.c +++ b/drivers/platform/tegra/nvadsp/dev.c @@ -280,6 +280,21 @@ static int __init nvadsp_parse_dt(struct platform_device *pdev) } } + for (iter = 0; iter < MAX_DRAM_MAP; iter++) { + if (of_property_read_u64_index(dev->of_node, + "nvidia,dram_map", (iter * MAX_DRAM_MAP), + &drv_data->dram_map[iter].addr)) + break; + + if (of_property_read_u64_index(dev->of_node, + "nvidia,dram_map", (iter * MAX_DRAM_MAP) + 1, + &drv_data->dram_map[iter].size)) { + dev_err(dev, + "Failed to get DRAM map with ID %d\n", iter); + return -EINVAL; + } + } + if (!of_property_read_string(dev->of_node, "nvidia,adsp_elf", &adsp_elf)) { if (strlen(adsp_elf) < MAX_FW_STR) @@ -334,7 +349,7 @@ static int __init nvadsp_probe(struct platform_device *pdev) void __iomem *base = NULL; uint32_t aram_addr; uint32_t aram_size; - int dram_iter, irq_iter, iter; + int irq_iter, iter; int irq_num; int ret = 0; @@ -403,18 +418,6 @@ static int __init nvadsp_probe(struct platform_device *pdev) drv_data->base_regs_saved = drv_data->base_regs; - for (dram_iter = 0; dram_iter < ADSP_MAX_DRAM_MAP; dram_iter++) { - res = platform_get_resource(pdev, IORESOURCE_MEM, iter++); - if (!res) { - dev_err(dev, - "Failed to get DRAM map with ID %d\n", iter); - ret = -EINVAL; - goto out; - } - - drv_data->dram_region[dram_iter] = res; - } - for (irq_iter = 0; irq_iter < NVADSP_VIRQ_MAX; irq_iter++) { irq_num = platform_get_irq(pdev, irq_iter); if (irq_num < 0) { diff --git a/drivers/platform/tegra/nvadsp/dev.h b/drivers/platform/tegra/nvadsp/dev.h index fd7ea27a..41807976 100644 --- a/drivers/platform/tegra/nvadsp/dev.h +++ b/drivers/platform/tegra/nvadsp/dev.h @@ -32,12 +32,6 @@ enum { APE_MAX_REG }; -enum { - ADSP_DRAM1, - ADSP_DRAM2, - ADSP_MAX_DRAM_MAP -}; - /* * Note: These enums should be aligned to the adsp_mem node mentioned in the * device tree @@ -82,6 +76,14 @@ enum adsp_evp_dt { #define NVADSP_ELF "adsp.elf" #define MAX_FW_STR 30 +/* Max no. of entries in "nvidia,cluster_mem" */ +#define MAX_DRAM_MAP 2 + +struct nvadsp_reg_map { + u64 addr; + u64 size; +}; + enum nvadsp_virqs { MBOX_SEND_VIRQ, MBOX_RECV_VIRQ, @@ -157,7 +159,6 @@ struct nvadsp_drv_data { void __iomem **base_regs; void __iomem **base_regs_saved; struct platform_device *pdev; - struct resource *dram_region[ADSP_MAX_DRAM_MAP]; struct hwmbox_queue hwmbox_send_queue; struct nvadsp_mbox **mboxes; @@ -245,6 +246,9 @@ struct nvadsp_drv_data { /* "nvidia,cluster_mem" */ struct nvadsp_cluster_mem cluster_mem[MAX_CLUSTER_MEM]; + + /* "nvidia,dram_map" */ + struct nvadsp_reg_map dram_map[MAX_DRAM_MAP]; }; #define ADSP_CONFIG 0x04 diff --git a/drivers/platform/tegra/nvadsp/os.c b/drivers/platform/tegra/nvadsp/os.c index 62dcd49e..141c4236 100644 --- a/drivers/platform/tegra/nvadsp/os.c +++ b/drivers/platform/tegra/nvadsp/os.c @@ -93,7 +93,6 @@ struct nvadsp_os_data { struct platform_device *pdev; struct global_sym_info *adsp_glo_sym_tbl; void __iomem *hwmailbox_base; - struct resource **dram_region; struct nvadsp_debug_log logger; struct nvadsp_cnsl console; struct work_struct restart_os_work; @@ -303,13 +302,19 @@ err_out: bool is_adsp_dram_addr(u64 addr) { int i; - struct resource **dram = priv.dram_region; + struct nvadsp_drv_data *drv_data = platform_get_drvdata(priv.pdev); - for (i = 0; i < ADSP_MAX_DRAM_MAP; i++) { - if ((dram[i]->start) && (addr >= dram[i]->start) && - (addr <= dram[i]->end)) + for (i = 0; i < MAX_DRAM_MAP; i++) { + struct nvadsp_reg_map *dram = &drv_data->dram_map[i]; + + if (dram->size == 0) + break; + + if ((addr >= dram->addr) && + (addr < (dram->addr + dram->size))) return true; } + return false; } @@ -2596,7 +2601,6 @@ int __init nvadsp_os_probe(struct platform_device *pdev) int ret = 0; priv.hwmailbox_base = drv_data->base_regs[hwmb_reg_idx()]; - priv.dram_region = drv_data->dram_region; priv.adsp_os_addr = drv_data->adsp_mem[ADSP_OS_ADDR]; priv.adsp_os_size = drv_data->adsp_mem[ADSP_OS_SIZE];