blob: 7be2715e4e7140015593323130334f72e90aca01 [file] [log] [blame]
David Brazdil7a462ec2019-08-15 12:27:47 +01001/*
2 * Copyright 2019 The Hafnium Authors.
3 *
Andrew Walbrane959ec12020-06-17 15:01:09 +01004 * Use of this source code is governed by a BSD-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/BSD-3-Clause.
David Brazdil7a462ec2019-08-15 12:27:47 +01007 */
8
9#pragma once
10
Olivier Deprez62d99e32020-01-09 15:58:07 +010011#include "hf/addr.h"
J-Alves77b6f4f2023-03-15 11:34:49 +000012#include "hf/boot_params.h"
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -070013#include "hf/fdt.h"
Andrew Walbranb5ab43c2020-04-30 11:32:54 +010014#include "hf/ffa.h"
J-Alves7ec9d6e2023-02-28 16:39:56 +000015#include "hf/ffa_partition_manifest.h"
David Brazdil7a462ec2019-08-15 12:27:47 +010016#include "hf/memiter.h"
David Brazdil136f2942019-09-23 14:11:03 +010017#include "hf/string.h"
Andrew Scullae9962e2019-10-03 16:51:16 +010018#include "hf/vm.h"
David Brazdil0dbb41f2019-09-09 18:03:35 +010019
Olivier Deprez62d99e32020-01-09 15:58:07 +010020/**
David Brazdil7a462ec2019-08-15 12:27:47 +010021 * Holds information about one of the VMs described in the manifest.
22 */
23struct manifest_vm {
24 /* Properties defined for both primary and secondary VMs. */
David Brazdil136f2942019-09-23 14:11:03 +010025 struct string debug_name;
26 struct string kernel_filename;
Andrew Scullae9962e2019-10-03 16:51:16 +010027 struct smc_whitelist smc_whitelist;
Olivier Deprez62d99e32020-01-09 15:58:07 +010028 bool is_ffa_partition;
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -070029 bool is_hyp_loaded;
J-Alves7ec9d6e2023-02-28 16:39:56 +000030 struct ffa_partition_manifest partition;
David Brazdil7a462ec2019-08-15 12:27:47 +010031
David Brazdile6f83222019-09-23 14:47:37 +010032 union {
33 /* Properties specific to the primary VM. */
34 struct {
David Brazdil080ee312020-02-25 15:30:30 -080035 uint64_t boot_address;
David Brazdile6f83222019-09-23 14:47:37 +010036 struct string ramdisk_filename;
37 } primary;
38 /* Properties specific to secondary VMs. */
39 struct {
40 uint64_t mem_size;
Andrew Walbranb5ab43c2020-04-30 11:32:54 +010041 ffa_vcpu_count_t vcpu_count;
Fuad Tabba50469e02020-06-30 15:14:28 +010042 struct string fdt_filename;
David Brazdile6f83222019-09-23 14:47:37 +010043 } secondary;
44 };
David Brazdil7a462ec2019-08-15 12:27:47 +010045};
46
47/**
48 * Hafnium manifest parsed from FDT.
49 */
50struct manifest {
Andrew Walbranb5ab43c2020-04-30 11:32:54 +010051 bool ffa_tee_enabled;
52 ffa_vm_count_t vm_count;
David Brazdil7a462ec2019-08-15 12:27:47 +010053 struct manifest_vm vm[MAX_VMS];
54};
55
56enum manifest_return_code {
57 MANIFEST_SUCCESS = 0,
David Brazdila2358d42020-01-27 18:51:38 +000058 MANIFEST_ERROR_FILE_SIZE,
59 MANIFEST_ERROR_NO_ROOT_NODE,
David Brazdil7a462ec2019-08-15 12:27:47 +010060 MANIFEST_ERROR_NO_HYPERVISOR_FDT_NODE,
David Brazdil74e9c3b2019-08-28 11:09:08 +010061 MANIFEST_ERROR_NOT_COMPATIBLE,
David Brazdil7a462ec2019-08-15 12:27:47 +010062 MANIFEST_ERROR_RESERVED_VM_ID,
63 MANIFEST_ERROR_NO_PRIMARY_VM,
64 MANIFEST_ERROR_TOO_MANY_VMS,
65 MANIFEST_ERROR_PROPERTY_NOT_FOUND,
66 MANIFEST_ERROR_MALFORMED_STRING,
David Brazdil0dbb41f2019-09-09 18:03:35 +010067 MANIFEST_ERROR_STRING_TOO_LONG,
David Brazdil7a462ec2019-08-15 12:27:47 +010068 MANIFEST_ERROR_MALFORMED_INTEGER,
69 MANIFEST_ERROR_INTEGER_OVERFLOW,
Andrew Scullae9962e2019-10-03 16:51:16 +010070 MANIFEST_ERROR_MALFORMED_INTEGER_LIST,
Andrew Scullb2c3a242019-11-04 13:52:36 +000071 MANIFEST_ERROR_MALFORMED_BOOLEAN,
Manish Pandey6542f5c2020-04-27 14:37:46 +010072 MANIFEST_ERROR_MEMORY_REGION_NODE_EMPTY,
Manish Pandeye68e7932020-04-23 15:29:28 +010073 MANIFEST_ERROR_DEVICE_REGION_NODE_EMPTY,
Manish Pandeyf06c9072020-09-29 15:41:58 +010074 MANIFEST_ERROR_RXTX_SIZE_MISMATCH,
Varun Wadekar4afbfd72022-10-13 14:30:18 +010075 MANIFEST_ERROR_MEM_REGION_EMPTY,
Daniel Boulbyc1a613d2022-10-18 11:26:17 +010076 MANIFEST_ERROR_MEM_REGION_UNALIGNED,
Karl Meakinf6d49402023-04-04 18:14:26 +010077 MANIFEST_ERROR_BASE_ADDRESS_AND_RELATIVE_ADDRESS,
Daniel Boulbya7e9e182022-06-27 14:21:01 +010078 MANIFEST_ERROR_MEM_REGION_OVERLAP,
J-Alves77b6f4f2023-03-15 11:34:49 +000079 MANIFEST_ERROR_MEMORY_MISSING,
80 MANIFEST_ERROR_MEM_REGION_INVALID,
Daniel Boulby4339edc2024-02-21 14:59:00 +000081 MANIFEST_ERROR_DEVICE_MEM_REGION_INVALID,
Raghu Krishnamurthy384693c2021-10-11 13:56:24 -070082 MANIFEST_ERROR_INVALID_MEM_PERM,
Daniel Boulby801f8ef2022-06-27 14:21:01 +010083 MANIFEST_ERROR_INTERRUPT_ID_REPEATED,
Madhukar Pappireddy5c04a382022-12-28 11:29:26 -060084 MANIFEST_ERROR_ILLEGAL_NS_INT_ACTION,
J-Alvesbb2703a2025-02-10 12:11:56 +000085 MANIFEST_ERROR_ILLEGAL_SRI_POLICY,
86 MANIFEST_ERROR_SRI_POLICY_NOT_SUPPORTED,
Raghu Krishnamurthy98da1ca2022-10-04 08:59:01 -070087 MANIFEST_ERROR_INTERRUPT_ID_NOT_IN_LIST,
Madhukar Pappireddy5c04a382022-12-28 11:29:26 -060088 MANIFEST_ERROR_ILLEGAL_OTHER_S_INT_ACTION,
Kathleen Capella4a2a6e72023-04-21 14:43:26 -040089 MANIFEST_ERROR_INVALID_BOOT_ORDER,
Kathleen Capella422b10b2023-06-30 18:28:27 -040090 MANIFEST_ERROR_UUID_ALL_ZEROS,
Karl Meakin45abeeb2024-08-02 16:55:44 +010091 MANIFEST_ERROR_TOO_MANY_UUIDS,
Madhukar Pappireddy3c2b7912023-10-11 14:47:27 -050092 MANIFEST_ERROR_MISSING_SMMU_ID,
93 MANIFEST_ERROR_MISMATCH_DMA_ACCESS_PERMISSIONS,
94 MANIFEST_ERROR_STREAM_IDS_OVERFLOW,
Madhukar Pappireddy8a364472023-10-11 15:34:07 -050095 MANIFEST_ERROR_DMA_ACCESS_PERMISSIONS_OVERFLOW,
Karl Meakin18694022024-08-02 13:59:25 +010096 MANIFEST_ERROR_DMA_DEVICE_OVERFLOW,
97 MANIFEST_ERROR_VM_AVAILABILITY_MESSAGE_INVALID,
Madhukar Pappireddyc35573d2025-03-17 18:00:32 -050098 MANIFEST_ERROR_ILLEGAL_LIFECYCLE_SUPPORT,
99 MANIFEST_ERROR_ILLEGAL_ABORT_ACTION,
David Brazdil7a462ec2019-08-15 12:27:47 +0100100};
101
Olivier Deprez62d99e32020-01-09 15:58:07 +0100102enum manifest_return_code manifest_init(struct mm_stage1_locked stage1_locked,
J-Alves77b6f4f2023-03-15 11:34:49 +0000103 struct manifest **manifest_ret,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100104 struct memiter *manifest_fdt,
J-Alves77b6f4f2023-03-15 11:34:49 +0000105 struct boot_params *boot_params,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100106 struct mpool *ppool);
Daniel Boulby801f8ef2022-06-27 14:21:01 +0100107void manifest_deinit(struct mpool *ppool);
J-Alves77b6f4f2023-03-15 11:34:49 +0000108enum manifest_return_code parse_ffa_manifest(
109 struct fdt *fdt, struct manifest_vm *vm,
110 struct fdt_node *boot_info_node, const struct boot_params *boot_params);
J-Alves35315782022-01-25 17:58:32 +0000111
Olivier Deprez62d99e32020-01-09 15:58:07 +0100112void manifest_dump(struct manifest_vm *vm);
David Brazdil7a462ec2019-08-15 12:27:47 +0100113
114const char *manifest_strerror(enum manifest_return_code ret_code);