diff --git a/include/services/sp_res_desc.h b/include/services/sp_res_desc.h new file mode 100644 index 0000000..dc00221 --- /dev/null +++ b/include/services/sp_res_desc.h @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2018, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef SPM_RES_DESC_H +#define SPM_RES_DESC_H + +#include +#include + +/******************************************************************************* + * Attribute Section + ******************************************************************************/ + +struct sp_rd_sect_attribute { + /* + * Version of the resource description. + */ + uint16_t version; + + /* + * Type of the Secure Partition: + * - bit[0]: SP Type + * - b'0: UP SP + * - b'1: MP SP + * If UP SP: + * - bit[1]: Type of UP SP + * - b'0: Migratable UP SP + * - b'1: Pinned UP SP + */ + uint16_t sp_type; + + /* + * If this is a Pinned UP SP, PE on which the Pinned UP SP will run. + */ + uint32_t pe_mpidr; + + /* + * Run-Time Exception Level: + * - 0: SEL0 SP + * - 1: SEL1 SP + */ + uint8_t runtime_el; + + /* + * Type of Execution: + * - 0: Init-time only + * - 1: Run-time Execution + */ + uint8_t exec_type; + + /* + * Expected behavior upon failure: + * - 0: Restartable + * - 1: One-Shot + */ + uint8_t panic_policy; + + /* + * Translation Granule to use in the SP translation regime: + * - 0: 4KB + * - 1: 16KB + * - 2: 64KB + */ + uint8_t xlat_granule; + + /* + * Size of the SP binary in bytes. + */ + uint32_t binary_size; + + /* + * - If SP is NOT PIE: + * - VA Address where the SP expects to be loaded. + * - If SP is PIE: + * - Ignored. + */ + uint64_t load_address; + + /* + * Initial execution address. This is a VA as the SP sees it. + */ + uint64_t entrypoint; +}; + +/******************************************************************************* + * Memory Region Section + ******************************************************************************/ + +struct sp_rd_sect_mem_region { + /* + * Name of a Memory region, including null terminator. Reserved names: + * - "Client Shared Memory Region": + * Memory region where memory shared by clients shall be mapped. + * - "Queue Memory Region": + * Memory region shared with SPM for SP queue management. + */ + char name[RD_MEM_REGION_NAME_LEN]; + + /* + * Memory Attributes: + * - bits[3:0]: Type of memory + * - 0: Device + * - 1: Code + * - 2: Data + * - 3: BSS + * - 4: Read-only Data + * - 5: SPM-to-SP Shared Memory Region + * - 6: Client Shared Memory Region + * - 7: Miscellaneous + * - If memory is { SPM-to-SP shared Memory, Client Shared Memory, + * Miscellaneous } + * - bits[4]: Position Independent + * - b'0: Position Dependent + * - b'1: Position Independent + */ + uint32_t attr; + + /* + * Base address of the memory region. + */ + uint64_t base; + + /* + * Size of the memory region. + */ + uint64_t size; + + /* + * Pointer to next memory region (or NULL if this is the last one). + */ + struct sp_rd_sect_mem_region *next; +}; + +/******************************************************************************* + * Notification Section + ******************************************************************************/ + +struct sp_rd_sect_notification { + /* + * Notification attributes: + * - bit[31]: Notification Type + * - b'0: Platform Notification + * - b'1: Interrupt + * If Notification Type == Platform Notification + * - bits[15:0]: Implementation-defined Notification ID + * If Notification Type == Interrupt + * - bits[15:0]: IRQ number + * - bits[23:16]: Interrupt Priority + * - bit[24]: Trigger Type + * - b'0: Edge Triggered + * - b'1: Level Triggered + * - bit[25]: Trigger Level + * - b'0: Falling or Low + * - b'1: Rising or High + */ + uint32_t attr; + + /* + * Processing Element. + * If Notification Type == Interrupt && IRQ number is { SGI, LPI } + * - PE ID to which IRQ will be forwarded + */ + uint32_t pe; + + /* + * Pointer to next notification (or NULL if this is the last one). + */ + struct sp_rd_sect_notification *next; +}; + +/******************************************************************************* + * Service Description Section + ******************************************************************************/ + +struct sp_rd_sect_service { + /* + * Service identifier. + */ + uint32_t uuid[4]; + + /* + * Accessibility Options: + * - bit[0]: Accessibility by secure-world clients + * - b'0: Not Accessible + * - b'1: Accessible + * - bit[1]: Accessible by EL3 + * - b'0: Not Accessible + * - b'1: Accessible + * - bit[2]: Accessible by normal-world clients + * - b'0: Not Accessible + * - b'1: Accessible + */ + uint8_t accessibility; + + /* + * Request type supported: + * - bit[0]: Blocking request + * - b'0: Not Enable + * - b'1: Enable + * - bit[1]: Non-blocking request + * - b'0: Not Enable + * - b'1: Enable + */ + uint8_t request_type; + + /* + * Maximum number of client connections that the service can support. + */ + uint16_t connection_quota; + + /* + * If the service requires secure world memory to be shared with its + * clients: + * - Maximum amount of secure world memory in bytes to reserve from the + * secure world memory pool for the service. + */ + uint32_t secure_mem_size; + + /* + * Interrupt number used to notify the SP for the service. + * - Should also be enabled in the Notification Section. + */ + uint32_t interrupt_num; + + /* + * Pointer to next service (or NULL if this is the last one). + */ + struct sp_rd_sect_service *next; +}; + +/******************************************************************************* + * Complete resource description struct + ******************************************************************************/ + +struct sp_res_desc { + + /* Attribute Section */ + struct sp_rd_sect_attribute attribute; + + /* System Resource Section */ + struct sp_rd_sect_mem_region *mem_region; + + struct sp_rd_sect_notification *notification; + + /* Service Section */ + struct sp_rd_sect_service *service; +}; + +#endif /* SPM_RES_DESC_H */ diff --git a/include/services/sp_res_desc_def.h b/include/services/sp_res_desc_def.h new file mode 100644 index 0000000..68df297 --- /dev/null +++ b/include/services/sp_res_desc_def.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef SPM_RES_DESC_DEFS_H +#define SPM_RES_DESC_DEFS_H + +#include + +/******************************************************************************* + * Attribute Section + ******************************************************************************/ + +#define RD_ATTR_TYPE_UP_MIGRATABLE U(0) +#define RD_ATTR_TYPE_UP_PINNED U(2) +#define RD_ATTR_TYPE_MP U(1) + +#define RD_ATTR_RUNTIME_SEL0 U(0) +#define RD_ATTR_RUNTIME_SEL1 U(1) + +#define RD_ATTR_INIT_ONLY U(0) +#define RD_ATTR_RUNTIME U(1) + +#define RD_ATTR_PANIC_RESTART U(0) +#define RD_ATTR_PANIC_ONESHOT U(1) + +#define RD_ATTR_XLAT_GRANULE_4KB U(0) +#define RD_ATTR_XLAT_GRANULE_16KB U(1) +#define RD_ATTR_XLAT_GRANULE_64KB U(2) + +/******************************************************************************* + * Memory Region Section + ******************************************************************************/ + +#define RD_MEM_REGION_NAME_LEN U(32) + +#define RD_MEM_DEVICE U(0) +#define RD_MEM_NORMAL_CODE U(1) +#define RD_MEM_NORMAL_DATA U(2) +#define RD_MEM_NORMAL_BSS U(3) +#define RD_MEM_NORMAL_RODATA U(4) +#define RD_MEM_NORMAL_SPM_SP_SHARED_MEM U(5) +#define RD_MEM_NORMAL_CLIENT_SHARED_MEM U(6) +#define RD_MEM_NORMAL_MISCELLANEOUS U(7) + +#define RD_MEM_MASK U(15) + +#define RD_MEM_IS_PIE (U(1) << 4) + +/******************************************************************************* + * Notification Section + ******************************************************************************/ + +#define RD_NOTIF_TYPE_PLATFORM (U(0) << 31) +#define RD_NOTIF_TYPE_INTERRUPT (U(1) << 31) + +#define RD_NOTIF_PLAT_ID_MASK U(0xFFFF) +#define RD_NOTIF_PLAT_ID_SHIFT U(0) + +#define RD_NOTIF_PLATFORM(id) \ + (RD_NOTIF_TYPE_PLATFORM \ + | (((id) & RD_NOTIF_PLAT_ID_MASK) << RD_NOTIF_PLAT_ID_SHIFT)) + +#define RD_NOTIF_IRQ_NUM_MASK U(0xFFFF) +#define RD_NOTIF_IRQ_NUM_SHIFT U(0) +#define RD_NOTIF_IRQ_PRIO_MASK U(0xFF) +#define RD_NOTIF_IRQ_PRIO_SHIFT U(16) + +#define RD_NOTIF_IRQ_EDGE_FALLING U(0) +#define RD_NOTIF_IRQ_EDGE_RISING U(2) +#define RD_NOTIF_IRQ_LEVEL_LOW U(1) +#define RD_NOTIF_IRQ_LEVEL_HIGH U(3) +#define RD_NOTIF_IRQ_TRIGGER_SHIFT U(24) + +#define RD_NOTIF_IRQ(num, prio, trig) \ + (RD_NOTIF_TYPE_IRQ \ + | (((num) & RD_NOTIF_IRQ_NUM_MASK) << RD_NOTIF_IRQ_NUM_SHIFT) \ + | (((prio) & RD_NOTIF_IRQ_PRIO_MASK) << RD_NOTIF_IRQ_PRIO_SHIFT) \ + | (((trig) << RD_NOTIF_IRQ_TRIGGER_SHIFT))) + +/******************************************************************************* + * Service Description Section + ******************************************************************************/ + +#define RD_SERV_ACCESS_SECURE (U(1) << 0) +#define RD_SERV_ACCESS_EL3 (U(1) << 1) +#define RD_SERV_ACCESS_NORMAL (U(1) << 2) + +#define RD_SERV_SUPPORT_BLOCKING (U(1) << 0) +#define RD_SERV_SUPPORT_NON_BLOCKING (U(1) << 0) + +#endif /* SPM_RES_DESC_DEFS_H */