diff options
-rw-r--r-- | product/juno/scp_ramfw/config_clock.c | 37 | ||||
-rw-r--r-- | product/juno/scp_ramfw/config_juno_cdcel937.c | 15 | ||||
-rw-r--r-- | product/juno/scp_ramfw/config_mock_clock.c | 40 | ||||
-rw-r--r-- | product/juno/scp_ramfw/config_mock_clock.h | 18 | ||||
-rw-r--r-- | product/juno/scp_ramfw/firmware.mk | 2 |
5 files changed, 108 insertions, 4 deletions
diff --git a/product/juno/scp_ramfw/config_clock.c b/product/juno/scp_ramfw/config_clock.c index ac017cfa..cd7fdfcb 100644 --- a/product/juno/scp_ramfw/config_clock.c +++ b/product/juno/scp_ramfw/config_clock.c @@ -5,13 +5,16 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include "config_mock_clock.h" #include "config_power_domain.h" #include "juno_clock.h" +#include "juno_id.h" #include <mod_clock.h> #include <mod_juno_cdcel937.h> #include <mod_juno_hdlcd.h> #include <mod_juno_soc_clock_ram.h> +#include <mod_mock_clock.h> #include <mod_power_domain.h> #include <fwk_element.h> @@ -23,10 +26,6 @@ static struct fwk_element clock_dev_desc_table[] = { [JUNO_CLOCK_IDX_I2SCLK] = { .name = "I2SCLK", .data = &((struct mod_clock_dev_config) { - .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_JUNO_CDCEL937, - JUNO_CLOCK_CDCEL937_IDX_I2SCLK), - .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_JUNO_CDCEL937, - MOD_JUNO_CDCEL937_API_IDX_CLOCK_DRIVER), .pd_source_id = FWK_ID_NONE_INIT, }), }, @@ -108,6 +107,36 @@ static struct fwk_element clock_dev_desc_table[] = { static const struct fwk_element *clock_get_dev_desc_table(fwk_id_t module_id) { + int status; + enum juno_idx_platform platform_id = JUNO_IDX_PLATFORM_COUNT; + struct mod_clock_dev_config *dev_cfg; + + status = juno_id_get_platform(&platform_id); + if (!fwk_expect(status == FWK_SUCCESS)) + return NULL; + + /* + * When running under an FVP the I2S clock does not fully function, + * as it requires the I2C hardware interrupt to properly work. This + * is replaced with the mock clock. + * + * Referencing and dereferencing is required to bypass the const qualifier. + */ + dev_cfg = (struct mod_clock_dev_config + *)(clock_dev_desc_table[JUNO_CLOCK_IDX_I2SCLK].data); + if (platform_id == JUNO_IDX_PLATFORM_FVP) { + *((fwk_id_t *)(&dev_cfg->api_id)) = (fwk_id_t)FWK_ID_API_INIT( + FWK_MODULE_IDX_MOCK_CLOCK, MOD_MOCK_CLOCK_API_TYPE_DRIVER); + *((fwk_id_t *)(&dev_cfg->driver_id)) = (fwk_id_t)FWK_ID_ELEMENT_INIT( + FWK_MODULE_IDX_MOCK_CLOCK, MOD_MOCK_CLOCK_ELEMENT_IDX_I2S); + } else { + *((fwk_id_t *)(&dev_cfg->api_id)) = (fwk_id_t)FWK_ID_API_INIT( + FWK_MODULE_IDX_JUNO_CDCEL937, + MOD_JUNO_CDCEL937_API_IDX_CLOCK_DRIVER); + *((fwk_id_t *)(&dev_cfg->driver_id)) = (fwk_id_t)FWK_ID_ELEMENT_INIT( + FWK_MODULE_IDX_JUNO_CDCEL937, JUNO_CLOCK_CDCEL937_IDX_I2SCLK); + } + return clock_dev_desc_table; } diff --git a/product/juno/scp_ramfw/config_juno_cdcel937.c b/product/juno/scp_ramfw/config_juno_cdcel937.c index fc9a8004..ed4d205a 100644 --- a/product/juno/scp_ramfw/config_juno_cdcel937.c +++ b/product/juno/scp_ramfw/config_juno_cdcel937.c @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include "config_mock_clock.h" #include "juno_clock.h" #include "juno_id.h" #include "juno_mmap.h" @@ -13,6 +14,7 @@ #include <mod_clock.h> #include <mod_juno_cdcel937.h> #include <mod_juno_hdlcd.h> +#include <mod_mock_clock.h> #include <fwk_assert.h> #include <fwk_element.h> @@ -186,6 +188,19 @@ static const struct fwk_element *juno_cdcel937_get_element_table( if (status != FWK_SUCCESS) return NULL; + /* If running under a FVP, direct interactions to the mocked elements */ + if (platform_id == JUNO_IDX_PLATFORM_FVP) { + config = + (struct mod_juno_cdcel937_dev_config + *)(juno_cdcel937_element_table[JUNO_CLOCK_CDCEL937_IDX_I2SCLK] + .data); + + config->clock_hal_id = (fwk_id_t)FWK_ID_ELEMENT_INIT( + FWK_MODULE_IDX_MOCK_CLOCK, MOD_MOCK_CLOCK_ELEMENT_IDX_I2S); + config->clock_api_id = (fwk_id_t)FWK_ID_API_INIT( + FWK_MODULE_IDX_MOCK_CLOCK, MOD_MOCK_CLOCK_API_TYPE_RESPONSE_DRIVER); + } + /* Add the lookup table to the HDLCD elements */ for (int i = 0; i < JUNO_CLOCK_CDCEL937_IDX_COUNT; i++) { diff --git a/product/juno/scp_ramfw/config_mock_clock.c b/product/juno/scp_ramfw/config_mock_clock.c new file mode 100644 index 00000000..91d968e3 --- /dev/null +++ b/product/juno/scp_ramfw/config_mock_clock.c @@ -0,0 +1,40 @@ +/* + * Arm SCP/MCP Software + * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config_mock_clock.h" + +#include <mod_mock_clock.h> + +#include <fwk_macros.h> +#include <fwk_module.h> + +static const struct mod_mock_clock_rate i2s_rate_table[] = { + { .rate = 1536000 }, { .rate = 2116800 }, { .rate = 2304000 }, + { .rate = 4233600 }, { .rate = 4608000 }, { .rate = 8467200 }, + { .rate = 9216000 }, +}; + +static const struct fwk_element element_table[] = { + [MOD_MOCK_CLOCK_ELEMENT_IDX_I2S] = + { + .name = "MOCK_I2SCLK", + .data = &(const struct mod_mock_clock_element_cfg){ + .rate_table = i2s_rate_table, + .rate_count = FWK_ARRAY_SIZE(i2s_rate_table), + }, + }, + [MOD_MOCK_CLOCK_ELEMENT_IDX_COUNT] = { 0 }, /* Termination description. */ +}; + +static const struct fwk_element *get_element_table(fwk_id_t module_id) +{ + return element_table; +} + +struct fwk_module_config config_mock_clock = { + .elements = FWK_MODULE_DYNAMIC_ELEMENTS(get_element_table), +}; diff --git a/product/juno/scp_ramfw/config_mock_clock.h b/product/juno/scp_ramfw/config_mock_clock.h new file mode 100644 index 00000000..057233ba --- /dev/null +++ b/product/juno/scp_ramfw/config_mock_clock.h @@ -0,0 +1,18 @@ +/* + * Arm SCP/MCP Software + * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef CONFIG_MOCK_CLOCK_H +#define CONFIG_MOCK_CLOCK_H + +/* Mock clock element indices for Juno */ +enum mod_mock_clock_element_idx { + MOD_MOCK_CLOCK_ELEMENT_IDX_I2S, + + MOD_MOCK_CLOCK_ELEMENT_IDX_COUNT, +}; + +#endif /* CONFIG_MOCK_CLOCK_H */ diff --git a/product/juno/scp_ramfw/firmware.mk b/product/juno/scp_ramfw/firmware.mk index 45ef556d..e21998e0 100644 --- a/product/juno/scp_ramfw/firmware.mk +++ b/product/juno/scp_ramfw/firmware.mk @@ -52,6 +52,7 @@ BS_FIRMWARE_MODULES := \ juno_xrp7724 \ reg_sensor \ psu \ + mock_clock \ mock_psu \ juno_pvt \ juno_thermal @@ -97,6 +98,7 @@ BS_FIRMWARE_SOURCES := \ config_sensor.c \ config_reg_sensor.c \ config_psu.c \ + config_mock_clock.c \ config_mock_psu.c \ config_juno_pvt.c \ config_juno_thermal.c \ |