11d0ca40eSJavier Almansa Sobrino /* 2bef44f60SAlexeiFedorov * Copyright (c) 2022-2025, Arm Limited. All rights reserved. 31d0ca40eSJavier Almansa Sobrino * 41d0ca40eSJavier Almansa Sobrino * SPDX-License-Identifier: BSD-3-Clause 51d0ca40eSJavier Almansa Sobrino */ 61d0ca40eSJavier Almansa Sobrino 71d0ca40eSJavier Almansa Sobrino #ifndef RMM_CORE_MANIFEST_H 81d0ca40eSJavier Almansa Sobrino #define RMM_CORE_MANIFEST_H 91d0ca40eSJavier Almansa Sobrino 101d0ca40eSJavier Almansa Sobrino #include <assert.h> 111d0ca40eSJavier Almansa Sobrino #include <stddef.h> 121d0ca40eSJavier Almansa Sobrino #include <stdint.h> 131d0ca40eSJavier Almansa Sobrino 141d0ca40eSJavier Almansa Sobrino #include <lib/cassert.h> 151d0ca40eSJavier Almansa Sobrino 161d0ca40eSJavier Almansa Sobrino #define RMMD_MANIFEST_VERSION_MAJOR U(0) 17*90552c61SAlexeiFedorov #define RMMD_MANIFEST_VERSION_MINOR U(5) 1832904472SSoby Mathew 1932904472SSoby Mathew #define RMM_CONSOLE_MAX_NAME_LEN U(8) 201d0ca40eSJavier Almansa Sobrino 211d0ca40eSJavier Almansa Sobrino /* 22*90552c61SAlexeiFedorov * Version encoding: 231d0ca40eSJavier Almansa Sobrino * - Bit[31] RES0 241d0ca40eSJavier Almansa Sobrino * - Bits [30:16] Major version 251d0ca40eSJavier Almansa Sobrino * - Bits [15:0] Minor version 261d0ca40eSJavier Almansa Sobrino */ 27*90552c61SAlexeiFedorov #define SET_VERSION(_major, _minor) \ 281d0ca40eSJavier Almansa Sobrino ((((_major) & 0x7FFF) << 16) | ((_minor) & 0xFFFF)) 291d0ca40eSJavier Almansa Sobrino 30*90552c61SAlexeiFedorov /* Boot Manifest version */ 31*90552c61SAlexeiFedorov #define RMMD_MANIFEST_VERSION SET_VERSION( \ 321d0ca40eSJavier Almansa Sobrino RMMD_MANIFEST_VERSION_MAJOR, \ 331d0ca40eSJavier Almansa Sobrino RMMD_MANIFEST_VERSION_MINOR) 341d0ca40eSJavier Almansa Sobrino 351d0ca40eSJavier Almansa Sobrino #define RMMD_GET_MANIFEST_VERSION_MAJOR(_version) \ 361d0ca40eSJavier Almansa Sobrino ((_version >> 16) & 0x7FFF) 371d0ca40eSJavier Almansa Sobrino 381d0ca40eSJavier Almansa Sobrino #define RMMD_GET_MANIFEST_VERSION_MINOR(_version) \ 391d0ca40eSJavier Almansa Sobrino (_version & 0xFFFF) 401d0ca40eSJavier Almansa Sobrino 41*90552c61SAlexeiFedorov #define PCIE_RC_INFO_VERSION_MAJOR U(0) 42*90552c61SAlexeiFedorov #define PCIE_RC_INFO_VERSION_MINOR U(1) 43*90552c61SAlexeiFedorov 44*90552c61SAlexeiFedorov /* PCIe Root Complex info structure version */ 45*90552c61SAlexeiFedorov #define PCIE_RC_INFO_VERSION SET_VERSION( \ 46*90552c61SAlexeiFedorov PCIE_RC_INFO_VERSION_MAJOR, \ 47*90552c61SAlexeiFedorov PCIE_RC_INFO_VERSION_MINOR) 48*90552c61SAlexeiFedorov 49bef44f60SAlexeiFedorov /* Memory bank/device region structure */ 50bef44f60SAlexeiFedorov struct memory_bank { 51*90552c61SAlexeiFedorov uint64_t base; /* Base address */ 52bef44f60SAlexeiFedorov uint64_t size; /* Size of memory bank/device region */ 53a97bfa5fSAlexeiFedorov }; 54a97bfa5fSAlexeiFedorov 55bef44f60SAlexeiFedorov CASSERT(offsetof(struct memory_bank, base) == 0UL, 56a97bfa5fSAlexeiFedorov rmm_manifest_base_unaligned); 57bef44f60SAlexeiFedorov CASSERT(offsetof(struct memory_bank, size) == 8UL, 58a97bfa5fSAlexeiFedorov rmm_manifest_size_unaligned); 59a97bfa5fSAlexeiFedorov 60bef44f60SAlexeiFedorov /* Memory/device region layout info structure */ 61bef44f60SAlexeiFedorov struct memory_info { 62bef44f60SAlexeiFedorov uint64_t num_banks; /* Number of memory banks/device regions */ 63bef44f60SAlexeiFedorov struct memory_bank *banks; /* Pointer to memory_bank[] */ 64bef44f60SAlexeiFedorov uint64_t checksum; /* Checksum of memory_info data */ 65a97bfa5fSAlexeiFedorov }; 66a97bfa5fSAlexeiFedorov 67bef44f60SAlexeiFedorov CASSERT(offsetof(struct memory_info, num_banks) == 0UL, 6882685904SAlexeiFedorov rmm_manifest_num_banks_unaligned); 69bef44f60SAlexeiFedorov CASSERT(offsetof(struct memory_info, banks) == 8UL, 70a97bfa5fSAlexeiFedorov rmm_manifest_dram_data_unaligned); 71bef44f60SAlexeiFedorov CASSERT(offsetof(struct memory_info, checksum) == 16UL, 7282685904SAlexeiFedorov rmm_manifest_checksum_unaligned); 73a97bfa5fSAlexeiFedorov 7432904472SSoby Mathew /* Console info structure */ 7532904472SSoby Mathew struct console_info { 76*90552c61SAlexeiFedorov uint64_t base; /* Console base address */ 7732904472SSoby Mathew uint64_t map_pages; /* Num of pages to be mapped in RMM for the console MMIO */ 7832904472SSoby Mathew char name[RMM_CONSOLE_MAX_NAME_LEN]; /* Name of console */ 79aa99881dSAlexeiFedorov uint64_t clk_in_hz; /* UART clock (in Hz) for the console */ 8032904472SSoby Mathew uint64_t baud_rate; /* Baud rate */ 8132904472SSoby Mathew uint64_t flags; /* Additional flags RES0 */ 8232904472SSoby Mathew }; 8332904472SSoby Mathew 8432904472SSoby Mathew CASSERT(offsetof(struct console_info, base) == 0UL, 8532904472SSoby Mathew rmm_manifest_console_base_unaligned); 8632904472SSoby Mathew CASSERT(offsetof(struct console_info, map_pages) == 8UL, 8732904472SSoby Mathew rmm_manifest_console_map_pages_unaligned); 8832904472SSoby Mathew CASSERT(offsetof(struct console_info, name) == 16UL, 8932904472SSoby Mathew rmm_manifest_console_name_unaligned); 9032904472SSoby Mathew CASSERT(offsetof(struct console_info, clk_in_hz) == 24UL, 9132904472SSoby Mathew rmm_manifest_console_clk_in_hz_unaligned); 9232904472SSoby Mathew CASSERT(offsetof(struct console_info, baud_rate) == 32UL, 9332904472SSoby Mathew rmm_manifest_console_baud_rate_unaligned); 9432904472SSoby Mathew CASSERT(offsetof(struct console_info, flags) == 40UL, 9532904472SSoby Mathew rmm_manifest_console_flags_unaligned); 9632904472SSoby Mathew 9732904472SSoby Mathew struct console_list { 9832904472SSoby Mathew uint64_t num_consoles; /* Number of consoles */ 99aa99881dSAlexeiFedorov struct console_info *consoles; /* Pointer to console_info[] */ 100aa99881dSAlexeiFedorov uint64_t checksum; /* Checksum of console_list data */ 10132904472SSoby Mathew }; 10232904472SSoby Mathew 10332904472SSoby Mathew CASSERT(offsetof(struct console_list, num_consoles) == 0UL, 10432904472SSoby Mathew rmm_manifest_num_consoles); 10532904472SSoby Mathew CASSERT(offsetof(struct console_list, consoles) == 8UL, 10632904472SSoby Mathew rmm_manifest_consoles); 10732904472SSoby Mathew CASSERT(offsetof(struct console_list, checksum) == 16UL, 10832904472SSoby Mathew rmm_manifest_console_list_checksum); 10932904472SSoby Mathew 110*90552c61SAlexeiFedorov /* SMMUv3 Info structure */ 111*90552c61SAlexeiFedorov struct smmu_info { 112*90552c61SAlexeiFedorov uint64_t smmu_base; /* SMMUv3 base address */ 113*90552c61SAlexeiFedorov uint64_t smmu_r_base; /* SMMUv3 Realm Pages base address */ 114*90552c61SAlexeiFedorov }; 115*90552c61SAlexeiFedorov 116*90552c61SAlexeiFedorov CASSERT(offsetof(struct smmu_info, smmu_base) == 0UL, 117*90552c61SAlexeiFedorov rmm_manifest_smmu_base); 118*90552c61SAlexeiFedorov CASSERT(offsetof(struct smmu_info, smmu_r_base) == 8UL, 119*90552c61SAlexeiFedorov rmm_manifest_smmu_r_base); 120*90552c61SAlexeiFedorov 121*90552c61SAlexeiFedorov /* SMMUv3 Info List structure */ 122*90552c61SAlexeiFedorov struct smmu_list { 123*90552c61SAlexeiFedorov uint64_t num_smmus; /* Number of smmu_info entries */ 124*90552c61SAlexeiFedorov struct smmu_info *smmus; /* Pointer to smmu_info[] array */ 125*90552c61SAlexeiFedorov uint64_t checksum; /* Checksum of smmu_list data */ 126*90552c61SAlexeiFedorov }; 127*90552c61SAlexeiFedorov 128*90552c61SAlexeiFedorov CASSERT(offsetof(struct smmu_list, num_smmus) == 0UL, 129*90552c61SAlexeiFedorov rmm_manifest_num_smmus); 130*90552c61SAlexeiFedorov CASSERT(offsetof(struct smmu_list, smmus) == 8UL, 131*90552c61SAlexeiFedorov rmm_manifest_smmus); 132*90552c61SAlexeiFedorov CASSERT(offsetof(struct smmu_list, checksum) == 16UL, 133*90552c61SAlexeiFedorov rmm_manifest_smmu_list_checksum); 134*90552c61SAlexeiFedorov 135*90552c61SAlexeiFedorov /* PCIe BDF Mapping Info structure */ 136*90552c61SAlexeiFedorov struct bdf_mapping_info { 137*90552c61SAlexeiFedorov uint16_t mapping_base; /* Base of BDF mapping (inclusive) */ 138*90552c61SAlexeiFedorov uint16_t mapping_top; /* Top of BDF mapping (exclusive) */ 139*90552c61SAlexeiFedorov uint16_t mapping_off; /* Mapping offset, as per Arm Base System Architecture: */ 140*90552c61SAlexeiFedorov /* StreamID = zero_extend(RequesterID[N-1:0]) + (1<<N)*Constant_B */ 141*90552c61SAlexeiFedorov uint16_t smmu_idx; /* SMMU index in smmu_info[] array */ 142*90552c61SAlexeiFedorov }; 143*90552c61SAlexeiFedorov 144*90552c61SAlexeiFedorov CASSERT(offsetof(struct bdf_mapping_info, mapping_base) == 0UL, 145*90552c61SAlexeiFedorov rmm_manifest_mapping_base); 146*90552c61SAlexeiFedorov CASSERT(offsetof(struct bdf_mapping_info, mapping_top) == 2UL, 147*90552c61SAlexeiFedorov rmm_manifest_mapping_top); 148*90552c61SAlexeiFedorov CASSERT(offsetof(struct bdf_mapping_info, mapping_off) == 4UL, 149*90552c61SAlexeiFedorov rmm_manifest_mapping_off); 150*90552c61SAlexeiFedorov CASSERT(offsetof(struct bdf_mapping_info, smmu_idx) == 6UL, 151*90552c61SAlexeiFedorov rmm_manifest_smmu_ptr); 152*90552c61SAlexeiFedorov 153*90552c61SAlexeiFedorov /* PCIe Root Port Info structure */ 154*90552c61SAlexeiFedorov struct root_port_info { 155*90552c61SAlexeiFedorov uint16_t root_port_id; /* Root Port identifier */ 156*90552c61SAlexeiFedorov uint16_t padding; /* RES0 */ 157*90552c61SAlexeiFedorov uint32_t num_bdf_mappings; /* Number of BDF mappings */ 158*90552c61SAlexeiFedorov struct bdf_mapping_info *bdf_mappings; /* Pointer to bdf_mapping_info[] array */ 159*90552c61SAlexeiFedorov }; 160*90552c61SAlexeiFedorov 161*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_port_info, root_port_id) == 0UL, 162*90552c61SAlexeiFedorov rmm_manifest_root_port_id); 163*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_port_info, num_bdf_mappings) == 4UL, 164*90552c61SAlexeiFedorov rmm_manifest_num_bdf_mappingss); 165*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_port_info, bdf_mappings) == 8UL, 166*90552c61SAlexeiFedorov rmm_manifest_bdf_mappings); 167*90552c61SAlexeiFedorov 168*90552c61SAlexeiFedorov /* PCIe Root Complex info structure v0.1 */ 169*90552c61SAlexeiFedorov struct root_complex_info { 170*90552c61SAlexeiFedorov uint64_t ecam_base; /* ECAM base address. Size is implicitly 256MB */ 171*90552c61SAlexeiFedorov uint8_t segment; /* PCIe segment identifier */ 172*90552c61SAlexeiFedorov uint8_t padding[3]; /* RES0 */ 173*90552c61SAlexeiFedorov uint32_t num_root_ports; /* Number of root ports */ 174*90552c61SAlexeiFedorov struct root_port_info *root_ports; /* Pointer to root_port_info[] array */ 175*90552c61SAlexeiFedorov }; 176*90552c61SAlexeiFedorov 177*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_info, ecam_base) == 0UL, 178*90552c61SAlexeiFedorov rmm_manifest_ecam_base); 179*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_info, segment) == 8UL, 180*90552c61SAlexeiFedorov rmm_manifest_segment); 181*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_info, num_root_ports) == 12UL, 182*90552c61SAlexeiFedorov rmm_manifest_num_root_ports); 183*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_info, root_ports) == 16UL, 184*90552c61SAlexeiFedorov rmm_manifest_root_ports); 185*90552c61SAlexeiFedorov 186*90552c61SAlexeiFedorov /* PCIe Root Complex List structure */ 187*90552c61SAlexeiFedorov struct root_complex_list { 188*90552c61SAlexeiFedorov uint64_t num_root_complex; /* Number of pci_rc_info entries */ 189*90552c61SAlexeiFedorov uint32_t rc_info_version; /* PCIe Root Complex info structure version */ 190*90552c61SAlexeiFedorov uint32_t padding; /* RES0 */ 191*90552c61SAlexeiFedorov struct root_complex_info *root_complex; /* Pointer to pci_rc_info[] array */ 192*90552c61SAlexeiFedorov uint64_t checksum; /* Checksum of pci_rc_list data */ 193*90552c61SAlexeiFedorov }; 194*90552c61SAlexeiFedorov 195*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_list, num_root_complex) == 0UL, 196*90552c61SAlexeiFedorov rmm_manifest_num_root_complex); 197*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_list, rc_info_version) == 8UL, 198*90552c61SAlexeiFedorov rmm_manifest_rc_info_version); 199*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_list, root_complex) == 16UL, 200*90552c61SAlexeiFedorov rmm_manifest_root_complex); 201*90552c61SAlexeiFedorov CASSERT(offsetof(struct root_complex_list, checksum) == 24UL, 202*90552c61SAlexeiFedorov rmm_manifest_root_complex_list_checksum); 203*90552c61SAlexeiFedorov 204*90552c61SAlexeiFedorov /* Boot manifest core structure as per v0.5 */ 205a97bfa5fSAlexeiFedorov struct rmm_manifest { 2061d0ca40eSJavier Almansa Sobrino uint32_t version; /* Manifest version */ 207dc0ca64eSJavier Almansa Sobrino uint32_t padding; /* RES0 */ 208*90552c61SAlexeiFedorov uint64_t plat_data; /* Manifest platform data */ 209bef44f60SAlexeiFedorov /* Platform NS DRAM data (v0.2) */ 210bef44f60SAlexeiFedorov struct memory_info plat_dram; 211bef44f60SAlexeiFedorov /* Platform console list (v0.3) */ 212bef44f60SAlexeiFedorov struct console_list plat_console; 213bef44f60SAlexeiFedorov /* Platform device address ranges (v0.4) */ 214bef44f60SAlexeiFedorov struct memory_info plat_ncoh_region; 215bef44f60SAlexeiFedorov struct memory_info plat_coh_region; 216*90552c61SAlexeiFedorov /* Platform SMMUv3 list (v0.5) */ 217*90552c61SAlexeiFedorov struct smmu_list plat_smmu; 218*90552c61SAlexeiFedorov /* Platform PCIe Root Complex list (v0.5) */ 219*90552c61SAlexeiFedorov struct root_complex_list plat_root_complex; 220a97bfa5fSAlexeiFedorov }; 2211d0ca40eSJavier Almansa Sobrino 22282685904SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, version) == 0UL, 223a97bfa5fSAlexeiFedorov rmm_manifest_version_unaligned); 22482685904SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, plat_data) == 8UL, 225a97bfa5fSAlexeiFedorov rmm_manifest_plat_data_unaligned); 22682685904SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, plat_dram) == 16UL, 227a97bfa5fSAlexeiFedorov rmm_manifest_plat_dram_unaligned); 22832904472SSoby Mathew CASSERT(offsetof(struct rmm_manifest, plat_console) == 40UL, 22932904472SSoby Mathew rmm_manifest_plat_console_unaligned); 230bef44f60SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, plat_ncoh_region) == 64UL, 231bef44f60SAlexeiFedorov rmm_manifest_plat_ncoh_region_unaligned); 232bef44f60SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, plat_coh_region) == 88UL, 233bef44f60SAlexeiFedorov rmm_manifest_plat_coh_region_unaligned); 234*90552c61SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, plat_smmu) == 112UL, 235*90552c61SAlexeiFedorov rmm_manifest_plat_smmu_unaligned); 236*90552c61SAlexeiFedorov CASSERT(offsetof(struct rmm_manifest, plat_root_complex) == 136UL, 237*90552c61SAlexeiFedorov rmm_manifest_plat_root_complex); 2381d0ca40eSJavier Almansa Sobrino 2391d0ca40eSJavier Almansa Sobrino #endif /* RMM_CORE_MANIFEST_H */ 240