You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
5.7 KiB
253 lines
5.7 KiB
/*
|
|
* 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 <stdint.h>
|
|
|
|
#include <services/sp_res_desc_def.h>
|
|
|
|
/*******************************************************************************
|
|
* 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 */
|
|
|