/* * Copyright (c) 2021, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include #include struct fconf_mpmm_config fconf_mpmm_config; static struct mpmm_topology fconf_mpmm_topology; /* * Within a `cpu` node, determine support for MPMM via the `supports-mpmm` * property. * * Returns `0` on success, or a negative integer representing an error code. */ static int fconf_populate_mpmm_cpu(const void *fdt, int off, uintptr_t mpidr) { int ret, len; int core_pos; struct mpmm_core *core; core_pos = plat_core_pos_by_mpidr(mpidr); if (core_pos < 0) { return -FDT_ERR_BADVALUE; } core = &fconf_mpmm_topology.cores[core_pos]; fdt_getprop(fdt, off, "supports-mpmm", &len); if (len >= 0) { core->supported = true; ret = 0; } else { core->supported = false; ret = len; } return ret; } /* * Populates the global `fconf_mpmm_config` structure based on what's described * by the hardware configuration device tree blob. * * The device tree is expected to provide a `supports-mpmm` property for each * `cpu` node, like so: * * cpu@0 { * supports-mpmm; * }; * * This property indicates whether the core implements MPMM, as we cannot detect * support for it dynamically. */ static int fconf_populate_mpmm(uintptr_t config) { int ret = fdtw_for_each_cpu( (const void *)config, fconf_populate_mpmm_cpu); if (ret == 0) { fconf_mpmm_config.topology = &fconf_mpmm_topology; } else { ERROR("FCONF: failed to configure MPMM: %d\n", ret); } return ret; } FCONF_REGISTER_POPULATOR(HW_CONFIG, mpmm, fconf_populate_mpmm);