1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 */ 5 #ifndef __GUNYAH_RSC_MGR_PRIV_H 6 #define __GUNYAH_RSC_MGR_PRIV_H 7 8 #include <linux/gunyah.h> 9 #include <linux/notifier.h> 10 #include <linux/types.h> 11 #include <linux/android_kabi.h> 12 13 #define GUNYAH_VMID_INVAL U16_MAX 14 #define GUNYAH_MEM_HANDLE_INVAL U32_MAX 15 16 struct gunyah_rm; 17 18 int gunyah_rm_notifier_register(struct gunyah_rm *rm, 19 struct notifier_block *nb); 20 int gunyah_rm_notifier_unregister(struct gunyah_rm *rm, 21 struct notifier_block *nb); 22 struct device *gunyah_rm_get(struct gunyah_rm *rm); 23 void gunyah_rm_put(struct gunyah_rm *rm); 24 25 struct gunyah_rm_vm_exited_payload { 26 __le16 vmid; 27 __le16 exit_type; 28 __le32 exit_reason_size; 29 u8 exit_reason[]; 30 } __packed; 31 32 enum gunyah_rm_notification_id { 33 /* clang-format off */ 34 GUNYAH_RM_NOTIFICATION_VM_EXITED = 0x56100001, 35 GUNYAH_RM_NOTIFICATION_VM_STATUS = 0x56100008, 36 /* clang-format on */ 37 }; 38 39 enum gunyah_rm_vm_status { 40 /* clang-format off */ 41 GUNYAH_RM_VM_STATUS_NO_STATE = 0, 42 GUNYAH_RM_VM_STATUS_INIT = 1, 43 GUNYAH_RM_VM_STATUS_READY = 2, 44 GUNYAH_RM_VM_STATUS_RUNNING = 3, 45 GUNYAH_RM_VM_STATUS_PAUSED = 4, 46 GUNYAH_RM_VM_STATUS_LOAD = 5, 47 GUNYAH_RM_VM_STATUS_AUTH = 6, 48 GUNYAH_RM_VM_STATUS_INIT_FAILED = 8, 49 GUNYAH_RM_VM_STATUS_EXITED = 9, 50 GUNYAH_RM_VM_STATUS_RESETTING = 10, 51 GUNYAH_RM_VM_STATUS_RESET = 11, 52 GUNYAH_RM_VM_STATUS_RESET_FAILED = 12, 53 /* clang-format on */ 54 }; 55 ANDROID_KABI_ENUMERATOR_IGNORE(gunyah_rm_vm_status, GUNYAH_RM_VM_STATUS_RESET_FAILED); 56 57 struct gunyah_rm_vm_status_payload { 58 __le16 vmid; 59 u16 reserved; 60 u8 vm_status; 61 u8 os_status; 62 __le16 app_status; 63 } __packed; 64 65 /* RPC Calls */ 66 int gunyah_rm_mem_share(struct gunyah_rm *rm, 67 struct gunyah_rm_mem_parcel *parcel); 68 int gunyah_rm_mem_reclaim(struct gunyah_rm *rm, 69 struct gunyah_rm_mem_parcel *parcel); 70 71 int gunyah_rm_alloc_vmid(struct gunyah_rm *rm, u16 vmid); 72 int gunyah_rm_dealloc_vmid(struct gunyah_rm *rm, u16 vmid); 73 int gunyah_rm_vm_reset(struct gunyah_rm *rm, u16 vmid); 74 int gunyah_rm_vm_start(struct gunyah_rm *rm, u16 vmid); 75 int gunyah_rm_vm_stop(struct gunyah_rm *rm, u16 vmid); 76 77 enum gunyah_rm_vm_auth_mechanism { 78 /* clang-format off */ 79 GUNYAH_RM_VM_AUTH_NONE = 0, 80 GUNYAH_RM_VM_AUTH_QCOM_TRUSTED_VM = 1, 81 GUNYAH_RM_VM_AUTH_QCOM_ANDROID_PVM = 2, 82 /* clang-format on */ 83 }; 84 85 #define GUNYAH_VM_AUTH_PARAM_PAS_ID 0 86 struct gunyah_rm_vm_authenticate_param_entry { 87 u32 param_type; 88 u32 param; 89 } __packed; 90 91 int gunyah_rm_vm_authenticate(struct gunyah_rm *rm, u16 vmid, 92 ssize_t n_entries, 93 struct gunyah_rm_vm_authenticate_param_entry *entry); 94 int gunyah_rm_vm_configure(struct gunyah_rm *rm, u16 vmid, 95 enum gunyah_rm_vm_auth_mechanism auth_mechanism, 96 u32 mem_handle, u64 image_offset, u64 image_size, 97 u64 dtb_offset, u64 dtb_size); 98 int gunyah_rm_vm_init(struct gunyah_rm *rm, u16 vmid); 99 int gunyah_rm_vm_set_boot_context(struct gunyah_rm *rm, u16 vmid, u8 reg_set, 100 u8 reg_index, u64 value); 101 102 struct gunyah_rm_hyp_resource { 103 u8 type; 104 u8 reserved; 105 __le16 partner_vmid; 106 __le32 resource_handle; 107 __le32 resource_label; 108 __le64 cap_id; 109 __le32 virq_handle; 110 __le32 virq; 111 __le64 base; 112 __le64 size; 113 } __packed; 114 115 struct gunyah_rm_hyp_resources { 116 __le32 n_entries; 117 struct gunyah_rm_hyp_resource entries[]; 118 } __packed; 119 120 int gunyah_rm_get_hyp_resources(struct gunyah_rm *rm, u16 vmid, 121 struct gunyah_rm_hyp_resources **resources); 122 123 int gunyah_rm_get_vmid(struct gunyah_rm *rm, u16 *vmid); 124 125 int gunyah_rm_vm_set_demand_paging(struct gunyah_rm *rm, u16 vmid, u32 count, 126 struct gunyah_rm_mem_entry *mem_entries); 127 128 enum gunyah_rm_range_id { 129 GUNYAH_RM_RANGE_ID_IMAGE = 0, 130 GUNYAH_RM_RANGE_ID_FIRMWARE = 1, 131 }; 132 133 int gunyah_rm_vm_set_firmware_mem(struct gunyah_rm *rm, u16 vmid, struct gunyah_rm_mem_parcel *parcel, 134 u64 fw_offset, u64 fw_size); 135 136 int gunyah_rm_vm_set_address_layout(struct gunyah_rm *rm, u16 vmid, 137 enum gunyah_rm_range_id range_id, 138 u64 base_address, u64 size); 139 140 struct gunyah_resource * 141 gunyah_rm_alloc_resource(struct gunyah_rm *rm, 142 struct gunyah_rm_hyp_resource *hyp_resource); 143 void gunyah_rm_free_resource(struct gunyah_resource *ghrsc); 144 145 int gunyah_rm_call(struct gunyah_rm *rsc_mgr, u32 message_id, 146 const void *req_buf, size_t req_buf_size, void **resp_buf, 147 size_t *resp_buf_size); 148 149 int gunyah_rm_platform_pre_mem_share(struct gunyah_rm *rm, 150 struct gunyah_rm_mem_parcel *mem_parcel); 151 int gunyah_rm_platform_post_mem_reclaim( 152 struct gunyah_rm *rm, struct gunyah_rm_mem_parcel *mem_parcel); 153 154 int gunyah_rm_platform_pre_demand_page(struct gunyah_rm *rm, u16 vmid, 155 enum gunyah_pagetable_access access, 156 struct folio *folio); 157 int gunyah_rm_platform_reclaim_demand_page(struct gunyah_rm *rm, u16 vmid, 158 enum gunyah_pagetable_access access, 159 struct folio *folio); 160 161 #endif 162