feat(ethos-n): add reserved memory address support

The FCONF parsing of the HW_CONFIG for the Arm(R) Ethos(TM)-N NPU now
supports reading the address of the reserved memory setup for the NPU so
the address can be used in the SiP service for the NPU.

Change-Id: I0968255a966e84896b00ea935d6aa3d5232c5f7b
Signed-off-by: Mikael Olsson <mikael.olsson@arm.com>
This commit is contained in:
Mikael Olsson 2023-02-10 11:39:40 +01:00 committed by Joanna Farley
parent 7820777fa3
commit a19a0241a6
2 changed files with 47 additions and 3 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021-2022, Arm Limited. All rights reserved. * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -45,6 +45,7 @@ struct ethosn_core_t {
struct ethosn_device_t { struct ethosn_device_t {
bool has_reserved_memory; bool has_reserved_memory;
uint64_t reserved_memory_addr;
uint32_t num_cores; uint32_t num_cores;
struct ethosn_core_t cores[ETHOSN_DEV_CORE_NUM_MAX]; struct ethosn_core_t cores[ETHOSN_DEV_CORE_NUM_MAX];
uint32_t num_allocators; uint32_t num_allocators;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021-2022, Arm Limited. All rights reserved. * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -20,6 +20,38 @@ struct ethosn_sub_allocator_t {
uint32_t stream_id; uint32_t stream_id;
}; };
static int fdt_node_read_reserved_memory_addr(const void *fdt,
int dev_node,
uint64_t *reserved_mem_addrs)
{
uintptr_t addr;
uint32_t phandle;
int err;
int mem_node;
err = fdt_read_uint32(fdt, dev_node, "memory-region", &phandle);
if (err != 0) {
ERROR("FCONF: Failed to get reserved memory phandle\n");
return err;
}
mem_node = fdt_node_offset_by_phandle(fdt, phandle);
if (mem_node < 0) {
ERROR("FCONF: Failed to find reserved memory node from phandle\n");
return mem_node;
}
err = fdt_get_reg_props_by_index(fdt, mem_node, 0U, &addr, NULL);
if (err != 0) {
ERROR("FCONF: Failed to read reserved memory address\n");
return err;
}
*reserved_mem_addrs = addr;
return 0;
}
static bool fdt_node_has_reserved_memory(const void *fdt, int dev_node) static bool fdt_node_has_reserved_memory(const void *fdt, int dev_node)
{ {
return fdt_get_property(fdt, dev_node, "memory-region", NULL) != NULL; return fdt_get_property(fdt, dev_node, "memory-region", NULL) != NULL;
@ -233,8 +265,10 @@ int fconf_populate_ethosn_config(uintptr_t config)
struct ethosn_device_t *dev = &ethosn_config.devices[dev_count]; struct ethosn_device_t *dev = &ethosn_config.devices[dev_count];
uint32_t dev_asset_alloc_count = 0U; uint32_t dev_asset_alloc_count = 0U;
uint32_t dev_core_count = 0U; uint32_t dev_core_count = 0U;
uint64_t reserved_memory_addr = 0U;
bool has_reserved_memory; bool has_reserved_memory;
int sub_node; int sub_node;
int err;
if (!fdt_node_is_enabled(hw_conf_dtb, ethosn_node)) { if (!fdt_node_is_enabled(hw_conf_dtb, ethosn_node)) {
continue; continue;
@ -246,8 +280,16 @@ int fconf_populate_ethosn_config(uintptr_t config)
} }
has_reserved_memory = fdt_node_has_reserved_memory(hw_conf_dtb, ethosn_node); has_reserved_memory = fdt_node_has_reserved_memory(hw_conf_dtb, ethosn_node);
if (has_reserved_memory) {
err = fdt_node_read_reserved_memory_addr(hw_conf_dtb,
ethosn_node,
&reserved_memory_addr);
if (err != 0) {
return err;
}
}
fdt_for_each_subnode(sub_node, hw_conf_dtb, ethosn_node) { fdt_for_each_subnode(sub_node, hw_conf_dtb, ethosn_node) {
int err;
if (!fdt_node_is_enabled(hw_conf_dtb, sub_node)) { if (!fdt_node_is_enabled(hw_conf_dtb, sub_node)) {
/* Ignore disabled sub node */ /* Ignore disabled sub node */
@ -323,6 +365,7 @@ int fconf_populate_ethosn_config(uintptr_t config)
dev->num_cores = dev_core_count; dev->num_cores = dev_core_count;
dev->num_allocators = dev_asset_alloc_count; dev->num_allocators = dev_asset_alloc_count;
dev->has_reserved_memory = has_reserved_memory; dev->has_reserved_memory = has_reserved_memory;
dev->reserved_memory_addr = reserved_memory_addr;
++dev_count; ++dev_count;
} }