diff --git a/drivers/arm/css/scp/css_sds.c b/drivers/arm/css/scp/css_sds.c index e42ee10d7..d9965c671 100644 --- a/drivers/arm/css/scp/css_sds.c +++ b/drivers/arm/css/scp/css_sds.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -20,7 +20,7 @@ int css_scp_boot_image_xfer(void *image, unsigned int image_size) int ret; unsigned int image_offset, image_flags; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SCP SDS initialization failed\n"); panic(); @@ -28,13 +28,15 @@ int css_scp_boot_image_xfer(void *image, unsigned int image_size) VERBOSE("Writing SCP image metadata\n"); image_offset = (uintptr_t) image - ARM_TRUSTED_SRAM_BASE; - ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET, + ret = sds_struct_write(SDS_SCP_AP_REGION_ID, + SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET, &image_offset, SDS_SCP_IMG_ADDR_SIZE, SDS_ACCESS_MODE_NON_CACHED); if (ret != SDS_OK) goto sds_fail; - ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET, + ret = sds_struct_write(SDS_SCP_AP_REGION_ID, + SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET, &image_size, SDS_SCP_IMG_SIZE_SIZE, SDS_ACCESS_MODE_NON_CACHED); if (ret != SDS_OK) @@ -42,7 +44,8 @@ int css_scp_boot_image_xfer(void *image, unsigned int image_size) VERBOSE("Marking SCP image metadata as valid\n"); image_flags = SDS_SCP_IMG_VALID_FLAG_BIT; - ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET, + ret = sds_struct_write(SDS_SCP_AP_REGION_ID, + SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET, &image_flags, SDS_SCP_IMG_FLAG_SIZE, SDS_ACCESS_MODE_NON_CACHED); if (ret != SDS_OK) @@ -68,7 +71,8 @@ int css_scp_boot_ready(void) /* Wait for the SCP RAM Firmware to complete its initialization process */ while (retry > 0) { - ret = sds_struct_read(SDS_FEATURE_AVAIL_STRUCT_ID, 0, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + SDS_FEATURE_AVAIL_STRUCT_ID, 0, &scp_feature_availability_flags, SDS_FEATURE_AVAIL_SIZE, SDS_ACCESS_MODE_NON_CACHED); diff --git a/drivers/arm/css/sds/sds.c b/drivers/arm/css/sds/sds.c index 1fb196c70..a5e638939 100644 --- a/drivers/arm/css/sds/sds.c +++ b/drivers/arm/css/sds/sds.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -15,40 +15,39 @@ #include "sds_private.h" -/* - * Variables used to track and maintain the state of the memory region reserved - * for usage by the SDS framework. - */ +/* Array of SDS memory region descriptions */ +static sds_region_desc_t *sds_regions; -/* Pointer to the base of the SDS memory region */ -static uintptr_t sds_mem_base; - -/* Size of the SDS memory region in bytes */ -static size_t sds_mem_size; +/* Total count of SDS memory regions */ +static unsigned int sds_region_cnt; /* * Perform some non-exhaustive tests to determine whether any of the fields * within a Structure Header contain obviously invalid data. * Returns SDS_OK on success, SDS_ERR_FAIL on error. */ -static int sds_struct_is_valid(uintptr_t header) +static int sds_struct_is_valid(unsigned int region_id, uintptr_t header) { size_t struct_size = GET_SDS_HEADER_STRUCT_SIZE(header); /* Zero is not a valid identifier */ - if (GET_SDS_HEADER_ID(header) == 0) + if (GET_SDS_HEADER_ID(header) == 0) { return SDS_ERR_FAIL; + } /* Check SDS Schema version */ - if (GET_SDS_HEADER_VERSION(header) == SDS_REGION_SCH_VERSION) + if (GET_SDS_HEADER_VERSION(header) == SDS_REGION_SCH_VERSION) { return SDS_ERR_FAIL; + } /* The SDS Structure sizes have to be multiple of 8 */ - if ((struct_size == 0) || ((struct_size % 8) != 0)) + if ((struct_size == 0) || ((struct_size % 8) != 0)) { return SDS_ERR_FAIL; + } - if (struct_size > sds_mem_size) + if (struct_size > sds_regions[region_id].size) { return SDS_ERR_FAIL; + } return SDS_OK; } @@ -57,10 +56,11 @@ static int sds_struct_is_valid(uintptr_t header) * Validate the SDS structure headers. * Returns SDS_OK on success, SDS_ERR_FAIL on error. */ -static int validate_sds_struct_headers(void) +static int validate_sds_struct_headers(unsigned int region_id) { unsigned int i, structure_count; uintptr_t header; + uintptr_t sds_mem_base = sds_regions[region_id].base; structure_count = GET_SDS_REGION_STRUCTURE_COUNT(sds_mem_base); @@ -71,7 +71,7 @@ static int validate_sds_struct_headers(void) /* Iterate over structure headers and validate each one */ for (i = 0; i < structure_count; i++) { - if (sds_struct_is_valid(header) != SDS_OK) { + if (sds_struct_is_valid(region_id, header) != SDS_OK) { WARN("SDS: Invalid structure header detected\n"); return SDS_ERR_FAIL; } @@ -84,10 +84,12 @@ static int validate_sds_struct_headers(void) * Get the structure header pointer corresponding to the structure ID. * Returns SDS_OK on success, SDS_ERR_STRUCT_NOT_FOUND on error. */ -static int get_struct_header(uint32_t structure_id, struct_header_t **header) +static int get_struct_header(unsigned int region_id, uint32_t structure_id, + struct_header_t **header) { unsigned int i, structure_count; uintptr_t current_header; + uintptr_t sds_mem_base = sds_regions[region_id].base; assert(header); @@ -116,12 +118,14 @@ static int get_struct_header(uint32_t structure_id, struct_header_t **header) * Returns SDS_OK if structure header exists else SDS_ERR_STRUCT_NOT_FOUND * if not found. */ -int sds_struct_exists(unsigned int structure_id) +int sds_struct_exists(unsigned int region_id, unsigned int structure_id) { struct_header_t *header = NULL; int ret; - ret = get_struct_header(structure_id, &header); + assert(region_id < sds_region_cnt); + + ret = get_struct_header(region_id, structure_id, &header); if (ret == SDS_OK) { assert(header); } @@ -136,18 +140,21 @@ int sds_struct_exists(unsigned int structure_id) * The `data` is the pointer to store the read data of size specified by `size`. * Returns SDS_OK on success or corresponding error codes on failure. */ -int sds_struct_read(uint32_t structure_id, unsigned int fld_off, - void *data, size_t size, sds_access_mode_t mode) +int sds_struct_read(unsigned int region_id, uint32_t structure_id, + unsigned int fld_off, void *data, size_t size, + sds_access_mode_t mode) { int status; uintptr_t field_base; struct_header_t *header = NULL; + assert(region_id < sds_region_cnt); + if (!data) return SDS_ERR_INVALID_PARAMS; /* Check if a structure with this ID exists */ - status = get_struct_header(structure_id, &header); + status = get_struct_header(region_id, structure_id, &header); if (status != SDS_OK) return status; @@ -182,18 +189,21 @@ int sds_struct_read(uint32_t structure_id, unsigned int fld_off, * The `data` is the pointer to data of size specified by `size`. * Returns SDS_OK on success or corresponding error codes on failure. */ -int sds_struct_write(uint32_t structure_id, unsigned int fld_off, - void *data, size_t size, sds_access_mode_t mode) +int sds_struct_write(unsigned int region_id, uint32_t structure_id, + unsigned int fld_off, void *data, size_t size, + sds_access_mode_t mode) { int status; uintptr_t field_base; struct_header_t *header = NULL; + assert(region_id < sds_region_cnt); + if (!data) return SDS_ERR_INVALID_PARAMS; /* Check if a structure with this ID exists */ - status = get_struct_header(structure_id, &header); + status = get_struct_header(region_id, structure_id, &header); if (status != SDS_OK) return status; @@ -226,12 +236,18 @@ int sds_struct_write(uint32_t structure_id, unsigned int fld_off, /* * Initialize the SDS driver. Also verifies the SDS version and sanity of - * the SDS structure headers. + * the SDS structure headers in the given SDS region. * Returns SDS_OK on success, SDS_ERR_FAIL on error. */ -int sds_init(void) +int sds_init(unsigned int region_id) { - sds_mem_base = (uintptr_t)PLAT_ARM_SDS_MEM_BASE; + if (sds_regions == NULL) { + sds_regions = plat_sds_get_regions(&sds_region_cnt); + } + + assert(region_id < sds_region_cnt); + + uintptr_t sds_mem_base = sds_regions[region_id].base; if (!IS_SDS_REGION_VALID(sds_mem_base)) { WARN("SDS: No valid SDS Memory Region found\n"); @@ -244,15 +260,16 @@ int sds_init(void) return SDS_ERR_FAIL; } - sds_mem_size = GET_SDS_REGION_SIZE(sds_mem_base); - if (sds_mem_size > PLAT_ARM_SDS_MEM_SIZE_MAX) { + sds_regions[region_id].size = GET_SDS_REGION_SIZE(sds_mem_base); + if (sds_regions[region_id].size > PLAT_ARM_SDS_MEM_SIZE_MAX) { WARN("SDS: SDS Memory Region exceeds size limit\n"); return SDS_ERR_FAIL; } - INFO("SDS: Detected SDS Memory Region (%zu bytes)\n", sds_mem_size); + INFO("SDS: Detected SDS Memory Region (%zu bytes)\n", + sds_regions[region_id].size); - if (validate_sds_struct_headers() != SDS_OK) + if (validate_sds_struct_headers(region_id) != SDS_OK) return SDS_ERR_FAIL; return SDS_OK; diff --git a/include/drivers/arm/css/sds.h b/include/drivers/arm/css/sds.h index db4cbaaf5..ab9577512 100644 --- a/include/drivers/arm/css/sds.h +++ b/include/drivers/arm/css/sds.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -79,12 +79,33 @@ typedef enum { SDS_ACCESS_MODE_CACHED, } sds_access_mode_t; -int sds_init(void); -int sds_struct_exists(unsigned int structure_id); -int sds_struct_read(uint32_t structure_id, unsigned int fld_off, void *data, - size_t size, sds_access_mode_t mode); -int sds_struct_write(uint32_t structure_id, unsigned int fld_off, void *data, - size_t size, sds_access_mode_t mode); +/* + * The following structure describes a SDS memory region. Its items are used + * to track and maintain the state of the memory region reserved for usage + * by the SDS framework. + * + * The base address of the SDS memory region is platform specific. The + * SDS description structure must already contain the address when it is + * returned by the plat_sds_get_regions() platform API during SDS region + * initialization. + * The size of the SDS memory region is dynamically discovered during the + * initialization of the region and written into the 'size' item of the + * SDS description structure. + */ +typedef struct { + uintptr_t base; /* Pointer to the base of the SDS memory region */ + size_t size; /* Size of the SDS memory region in bytes */ +} sds_region_desc_t; + +/* API to get the platform specific SDS region description(s) */ +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count); + +int sds_init(unsigned int region_id); +int sds_struct_exists(unsigned int region_id, unsigned int structure_id); +int sds_struct_read(unsigned int region_id, uint32_t structure_id, + unsigned int fld_off, void *data, size_t size, sds_access_mode_t mode); +int sds_struct_write(unsigned int region_id, uint32_t structure_id, + unsigned int fld_off, void *data, size_t size, sds_access_mode_t mode); #endif /*__ASSEMBLER__ */ #endif /* SDS_H */ diff --git a/include/plat/arm/css/common/css_def.h b/include/plat/arm/css/common/css_def.h index f87f857c5..0aea54803 100644 --- a/include/plat/arm/css/common/css_def.h +++ b/include/plat/arm/css/common/css_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -75,6 +75,7 @@ * The SCMI Channel is placed right after the SDS region */ #define CSS_SCMI_PAYLOAD_BASE (PLAT_ARM_SDS_MEM_BASE + PLAT_ARM_SDS_MEM_SIZE_MAX) +#define CSS_SCMI_PAYLOAD_SIZE_MAX 0x100 /* 2x128 bytes for bidirectional communication */ #define CSS_SCMI_MHU_DB_REG_OFF MHU_CPU_INTR_S_SET_OFFSET /* Trusted mailbox base address common to all CSS */ diff --git a/plat/arm/board/juno/include/platform_def.h b/plat/arm/board/juno/include/platform_def.h index 5c9a7a3af..b276f7b10 100644 --- a/plat/arm/board/juno/include/platform_def.h +++ b/plat/arm/board/juno/include/platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -246,12 +246,14 @@ /* MHU related constants */ #define PLAT_CSS_MHU_BASE UL(0x2b1f0000) +#if CSS_USE_SCMI_SDS_DRIVER +/* Index of SDS region used in the communication between AP and SCP */ +#define SDS_SCP_AP_REGION_ID U(0) +#else /* * Base address of the first memory region used for communication between AP * and SCP. Used by the BOM and SCPI protocols. - */ -#if !CSS_USE_SCMI_SDS_DRIVER -/* + * * Note that this is located at the same address as SCP_BOOT_CFG_ADDR, which * means the SCP/AP configuration data gets overwritten when the AP initiates * communication with the SCP. The configuration data is expected to be a @@ -261,7 +263,7 @@ #define PLAT_CSS_SCP_COM_SHARED_MEM_BASE (ARM_TRUSTED_SRAM_BASE + UL(0x80)) #define PLAT_CSS_PRIMARY_CPU_SHIFT 8 #define PLAT_CSS_PRIMARY_CPU_BIT_WIDTH 4 -#endif +#endif /* CSS_USE_SCMI_SDS_DRIVER */ /* * SCP_BL2 uses up whatever remaining space is available as it is loaded before diff --git a/plat/arm/board/juno/juno_bl1_setup.c b/plat/arm/board/juno/juno_bl1_setup.c index a9d5cc37f..2bc948d68 100644 --- a/plat/arm/board/juno/juno_bl1_setup.c +++ b/plat/arm/board/juno/juno_bl1_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -32,13 +32,14 @@ static int is_watchdog_reset(void) int ret; uint32_t scp_reset_synd_flags; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SCP SDS initialization failed\n"); panic(); } - ret = sds_struct_read(SDS_RESET_SYNDROME_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + SDS_RESET_SYNDROME_STRUCT_ID, SDS_RESET_SYNDROME_OFFSET, &scp_reset_synd_flags, SDS_RESET_SYNDROME_SIZE, diff --git a/plat/arm/board/juno/juno_common.c b/plat/arm/board/juno/juno_common.c index 02614da4a..2cd01e417 100644 --- a/plat/arm/board/juno/juno_common.c +++ b/plat/arm/board/juno/juno_common.c @@ -1,14 +1,16 @@ /* - * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ +#include #include -#include +#include #include #include +#include /* * Table of memory regions for different BL stages to map using the MMU. @@ -138,3 +140,16 @@ int32_t plat_get_soc_revision(void) return (int32_t)(((sys_id >> V2M_SYS_ID_REV_SHIFT) & V2M_SYS_ID_REV_MASK) & SOC_ID_REV_MASK); } + +#if CSS_USE_SCMI_SDS_DRIVER +static sds_region_desc_t juno_sds_regions[] = { + { .base = PLAT_ARM_SDS_MEM_BASE }, +}; + +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) +{ + *region_count = ARRAY_SIZE(juno_sds_regions); + + return juno_sds_regions; +} +#endif /* CSS_USE_SCMI_SDS_DRIVER */ diff --git a/plat/arm/board/morello/include/platform_def.h b/plat/arm/board/morello/include/platform_def.h index 993aa4687..3cf723e13 100644 --- a/plat/arm/board/morello/include/platform_def.h +++ b/plat/arm/board/morello/include/platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023, Arm Limited. All rights reserved. + * Copyright (c) 2020-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -59,6 +59,10 @@ #if CSS_USE_SCMI_SDS_DRIVER #define MORELLO_SCMI_PAYLOAD_BASE ULL(0x45400000) +/* + * Index of SDS region used in the communication with SCP + */ +#define SDS_SCP_AP_REGION_ID U(0) #else #define PLAT_CSS_SCP_COM_SHARED_MEM_BASE ULL(0x45400000) #endif diff --git a/plat/arm/board/morello/morello_bl2_setup.c b/plat/arm/board/morello/morello_bl2_setup.c index 39020e236..38e2e6a22 100644 --- a/plat/arm/board/morello/morello_bl2_setup.c +++ b/plat/arm/board/morello/morello_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023, Arm Limited. All rights reserved. + * Copyright (c) 2021-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -155,13 +155,14 @@ void bl2_platform_setup(void) int ret; struct morello_plat_info plat_info; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed. ret:%d\n", ret); panic(); } - ret = sds_struct_read(MORELLO_SDS_PLATFORM_INFO_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + MORELLO_SDS_PLATFORM_INFO_STRUCT_ID, MORELLO_SDS_PLATFORM_INFO_OFFSET, &plat_info, MORELLO_SDS_PLATFORM_INFO_SIZE, diff --git a/plat/arm/board/morello/morello_bl31_setup.c b/plat/arm/board/morello/morello_bl31_setup.c index 8469cd134..637382559 100644 --- a/plat/arm/board/morello/morello_bl31_setup.c +++ b/plat/arm/board/morello/morello_bl31_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023, Arm Limited. All rights reserved. + * Copyright (c) 2020-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -43,13 +43,14 @@ void bl31_platform_setup(void) #ifdef TARGET_PLATFORM_SOC int ret; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed. ret:%d\n", ret); panic(); } - ret = sds_struct_read(MORELLO_SDS_PLATFORM_INFO_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + MORELLO_SDS_PLATFORM_INFO_STRUCT_ID, MORELLO_SDS_PLATFORM_INFO_OFFSET, &plat_info, MORELLO_SDS_PLATFORM_INFO_SIZE, diff --git a/plat/arm/board/morello/morello_image_load.c b/plat/arm/board/morello/morello_image_load.c index 4ea2bb301..cfe8bee58 100644 --- a/plat/arm/board/morello/morello_image_load.c +++ b/plat/arm/board/morello/morello_image_load.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023, Arm Limited. All rights reserved. + * Copyright (c) 2021-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,6 +13,7 @@ #include "morello_def.h" #include #include +#include /* In client mode, a part of the DDR memory is reserved for Tag bits. * Calculate the usable memory size after subtracting the Tag memory. @@ -167,13 +168,14 @@ bl_params_t *plat_get_next_bl_params(void) struct morello_plat_info plat_info; struct morello_firmware_version fw_version; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed. ret:%d\n", ret); panic(); } - ret = sds_struct_read(MORELLO_SDS_PLATFORM_INFO_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + MORELLO_SDS_PLATFORM_INFO_STRUCT_ID, MORELLO_SDS_PLATFORM_INFO_OFFSET, &plat_info, MORELLO_SDS_PLATFORM_INFO_SIZE, @@ -183,7 +185,8 @@ bl_params_t *plat_get_next_bl_params(void) panic(); } - ret = sds_struct_read(MORELLO_SDS_FIRMWARE_VERSION_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + MORELLO_SDS_FIRMWARE_VERSION_STRUCT_ID, MORELLO_SDS_FIRMWARE_VERSION_OFFSET, &fw_version, MORELLO_SDS_FIRMWARE_VERSION_SIZE, diff --git a/plat/arm/board/morello/morello_plat.c b/plat/arm/board/morello/morello_plat.c index 2ca3d08c9..61fed642b 100644 --- a/plat/arm/board/morello/morello_plat.c +++ b/plat/arm/board/morello/morello_plat.c @@ -1,12 +1,14 @@ /* - * Copyright (c) 2020-2023, Arm Limited. All rights reserved. + * Copyright (c) 2020-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include +#include #include +#include #include #include "morello_def.h" @@ -68,3 +70,16 @@ void plat_arm_secure_wdt_stop(void) { sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); } + +#if CSS_USE_SCMI_SDS_DRIVER +static sds_region_desc_t morello_sds_regions[] = { + { .base = PLAT_ARM_SDS_MEM_BASE }, +}; + +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) +{ + *region_count = ARRAY_SIZE(morello_sds_regions); + + return morello_sds_regions; +} +#endif /* CSS_USE_SCMI_SDS_DRIVER */ diff --git a/plat/arm/board/n1sdp/include/platform_def.h b/plat/arm/board/n1sdp/include/platform_def.h index 74d0c9116..82f1e7f62 100644 --- a/plat/arm/board/n1sdp/include/platform_def.h +++ b/plat/arm/board/n1sdp/include/platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2023, Arm Limited. All rights reserved. + * Copyright (c) 2018-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -77,6 +77,10 @@ #if CSS_USE_SCMI_SDS_DRIVER #define N1SDP_SCMI_PAYLOAD_BASE 0x45400000 +/* + * Index of SDS region used in the communication with SCP + */ +#define SDS_SCP_AP_REGION_ID U(0) #else #define PLAT_CSS_SCP_COM_SHARED_MEM_BASE 0x45400000 #endif diff --git a/plat/arm/board/n1sdp/n1sdp_bl2_setup.c b/plat/arm/board/n1sdp/n1sdp_bl2_setup.c index 5f8af9f34..5a5b9a5f0 100644 --- a/plat/arm/board/n1sdp/n1sdp_bl2_setup.c +++ b/plat/arm/board/n1sdp/n1sdp_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Arm Limited. All rights reserved. + * Copyright (c) 2022-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -11,6 +11,7 @@ #include "n1sdp_def.h" #include +#include struct n1sdp_plat_info { bool multichip_mode; @@ -60,13 +61,14 @@ void bl2_platform_setup(void) int ret; struct n1sdp_plat_info plat_info; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed\n"); panic(); } - ret = sds_struct_read(N1SDP_SDS_PLATFORM_INFO_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + N1SDP_SDS_PLATFORM_INFO_STRUCT_ID, N1SDP_SDS_PLATFORM_INFO_OFFSET, &plat_info, N1SDP_SDS_PLATFORM_INFO_SIZE, diff --git a/plat/arm/board/n1sdp/n1sdp_bl31_setup.c b/plat/arm/board/n1sdp/n1sdp_bl31_setup.c index 430aab688..27ea7f7dc 100644 --- a/plat/arm/board/n1sdp/n1sdp_bl31_setup.c +++ b/plat/arm/board/n1sdp/n1sdp_bl31_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2023, Arm Limited. All rights reserved. + * Copyright (c) 2018-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -127,13 +127,14 @@ void bl31_platform_setup(void) int ret; struct n1sdp_plat_info plat_info; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed\n"); panic(); } - ret = sds_struct_read(N1SDP_SDS_PLATFORM_INFO_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + N1SDP_SDS_PLATFORM_INFO_STRUCT_ID, N1SDP_SDS_PLATFORM_INFO_OFFSET, &plat_info, N1SDP_SDS_PLATFORM_INFO_SIZE, diff --git a/plat/arm/board/n1sdp/n1sdp_image_load.c b/plat/arm/board/n1sdp/n1sdp_image_load.c index 6c3528ce8..6ae2b2623 100644 --- a/plat/arm/board/n1sdp/n1sdp_image_load.c +++ b/plat/arm/board/n1sdp/n1sdp_image_load.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Arm Limited. All rights reserved. + * Copyright (c) 2022-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,6 +13,7 @@ #include "n1sdp_def.h" #include +#include /* * Platform information structure stored in SDS. @@ -108,13 +109,14 @@ bl_params_t *plat_get_next_bl_params(void) int ret; struct n1sdp_plat_info plat_info; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed. ret:%d\n", ret); panic(); } - ret = sds_struct_read(N1SDP_SDS_PLATFORM_INFO_STRUCT_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + N1SDP_SDS_PLATFORM_INFO_STRUCT_ID, N1SDP_SDS_PLATFORM_INFO_OFFSET, &plat_info, N1SDP_SDS_PLATFORM_INFO_SIZE, diff --git a/plat/arm/board/n1sdp/n1sdp_plat.c b/plat/arm/board/n1sdp/n1sdp_plat.c index 747ff068c..42efdeef7 100644 --- a/plat/arm/board/n1sdp/n1sdp_plat.c +++ b/plat/arm/board/n1sdp/n1sdp_plat.c @@ -1,12 +1,14 @@ /* - * Copyright (c) 2018-2023, Arm Limited. All rights reserved. + * Copyright (c) 2018-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include +#include #include +#include #include #include "n1sdp_def.h" @@ -71,3 +73,16 @@ void plat_arm_secure_wdt_stop(void) { sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); } + +#if CSS_USE_SCMI_SDS_DRIVER +static sds_region_desc_t n1sdp_sds_regions[] = { + { .base = PLAT_ARM_SDS_MEM_BASE }, +}; + +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) +{ + *region_count = ARRAY_SIZE(n1sdp_sds_regions); + + return n1sdp_sds_regions; +} +#endif /* CSS_USE_SCMI_SDS_DRIVER */ diff --git a/plat/arm/board/tc/include/platform_def.h b/plat/arm/board/tc/include/platform_def.h index 59fff6e2a..867750eda 100644 --- a/plat/arm/board/tc/include/platform_def.h +++ b/plat/arm/board/tc/include/platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023, Arm Limited. All rights reserved. + * Copyright (c) 2020-2024, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -240,6 +240,17 @@ #define PLAT_ARM_SCMI_CHANNEL_COUNT 1 +/* Index of SDS region used in the communication with SCP */ +#define SDS_SCP_AP_REGION_ID U(0) +/* Index of SDS region used in the communication with RSS */ +#define SDS_RSS_AP_REGION_ID U(1) +/* + * Memory region for RSS's shared data storage (SDS) + * It is placed right after the SCMI payload area. + */ +#define PLAT_ARM_RSS_AP_SDS_MEM_BASE (CSS_SCMI_PAYLOAD_BASE + \ + CSS_SCMI_PAYLOAD_SIZE_MAX) + #define PLAT_ARM_CLUSTER_COUNT U(1) #define PLAT_MAX_CPUS_PER_CLUSTER U(8) #define PLAT_MAX_PE_PER_CPU U(1) diff --git a/plat/arm/board/tc/tc_plat.c b/plat/arm/board/tc/tc_plat.c index 766bfb570..27d4b117f 100644 --- a/plat/arm/board/tc/tc_plat.c +++ b/plat/arm/board/tc/tc_plat.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include #include @@ -159,3 +161,15 @@ void plat_arm_secure_wdt_refresh(void) { sbsa_wdog_refresh(SBSA_SECURE_WDOG_REFRESH_BASE); } + +static sds_region_desc_t tc_sds_regions[] = { + { .base = PLAT_ARM_SDS_MEM_BASE }, + { .base = PLAT_ARM_RSS_AP_SDS_MEM_BASE }, +}; + +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) +{ + *region_count = ARRAY_SIZE(tc_sds_regions); + + return tc_sds_regions; +} diff --git a/plat/arm/css/sgi/include/sgi_base_platform_def.h b/plat/arm/css/sgi/include/sgi_base_platform_def.h index dab5f8b21..2126a8663 100644 --- a/plat/arm/css/sgi/include/sgi_base_platform_def.h +++ b/plat/arm/css/sgi/include/sgi_base_platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -298,6 +298,8 @@ #endif +/* Index of SDS region used in the communication with SCP */ +#define SDS_SCP_AP_REGION_ID U(0) /* SDS ID for unusable CPU MPID list structure */ #define SDS_ISOLATED_CPU_LIST_ID U(128) diff --git a/plat/arm/css/sgi/sgi_image_load.c b/plat/arm/css/sgi/sgi_image_load.c index ac4bfd292..0a9bba9df 100644 --- a/plat/arm/css/sgi/sgi_image_load.c +++ b/plat/arm/css/sgi/sgi_image_load.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2022, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -30,13 +30,14 @@ void plat_arm_sgi_get_isolated_cpu_list(struct isolated_cpu_mpid_list *list) { int ret; - ret = sds_init(); + ret = sds_init(SDS_SCP_AP_REGION_ID); if (ret != SDS_OK) { ERROR("SDS initialization failed, error: %d\n", ret); panic(); } - ret = sds_struct_read(SDS_ISOLATED_CPU_LIST_ID, 0, &list->num_entries, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + SDS_ISOLATED_CPU_LIST_ID, 0, &list->num_entries, sizeof(list->num_entries), SDS_ACCESS_MODE_CACHED); if (ret != SDS_OK) { INFO("SDS CPU num elements read failed, error: %d\n", ret); @@ -54,7 +55,8 @@ void plat_arm_sgi_get_isolated_cpu_list(struct isolated_cpu_mpid_list *list) return; } - ret = sds_struct_read(SDS_ISOLATED_CPU_LIST_ID, + ret = sds_struct_read(SDS_SCP_AP_REGION_ID, + SDS_ISOLATED_CPU_LIST_ID, sizeof(list->num_entries), &list->mpid_list, sizeof(list->mpid_list[0]) * list->num_entries, @@ -152,4 +154,3 @@ bl_params_t *plat_get_next_bl_params(void) return arm_get_next_bl_params(); } - diff --git a/plat/arm/css/sgi/sgi_plat.c b/plat/arm/css/sgi/sgi_plat.c index 01b426e88..fe64d3431 100644 --- a/plat/arm/css/sgi/sgi_plat.c +++ b/plat/arm/css/sgi/sgi_plat.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -174,3 +176,14 @@ void plat_arm_secure_wdt_stop(void) { sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); } + +static sds_region_desc_t sgi_sds_regions[] = { + { .base = PLAT_ARM_SDS_MEM_BASE }, +}; + +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) +{ + *region_count = ARRAY_SIZE(sgi_sds_regions); + + return sgi_sds_regions; +} diff --git a/plat/arm/css/sgi/sgi_plat_v2.c b/plat/arm/css/sgi/sgi_plat_v2.c index 624fed34f..d241f7096 100644 --- a/plat/arm/css/sgi/sgi_plat_v2.c +++ b/plat/arm/css/sgi/sgi_plat_v2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -8,9 +8,11 @@ #include +#include +#include +#include #include #include -#include #if SPM_MM #include @@ -176,3 +178,14 @@ void plat_arm_secure_wdt_stop(void) { sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); } + +static sds_region_desc_t sgi_sds_regions[] = { + { .base = PLAT_ARM_SDS_MEM_BASE }, +}; + +sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) +{ + *region_count = ARRAY_SIZE(sgi_sds_regions); + + return sgi_sds_regions; +}