• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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