/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef __GUNYAH_RSC_MGR_PRIV_H #define __GUNYAH_RSC_MGR_PRIV_H #include #include #include #define GUNYAH_VMID_INVAL U16_MAX #define GUNYAH_MEM_HANDLE_INVAL U32_MAX struct gunyah_rm; int gunyah_rm_notifier_register(struct gunyah_rm *rm, struct notifier_block *nb); int gunyah_rm_notifier_unregister(struct gunyah_rm *rm, struct notifier_block *nb); struct device *gunyah_rm_get(struct gunyah_rm *rm); void gunyah_rm_put(struct gunyah_rm *rm); struct gunyah_rm_vm_exited_payload { __le16 vmid; __le16 exit_type; __le32 exit_reason_size; u8 exit_reason[]; } __packed; enum gunyah_rm_notification_id { /* clang-format off */ GUNYAH_RM_NOTIFICATION_VM_EXITED = 0x56100001, GUNYAH_RM_NOTIFICATION_VM_STATUS = 0x56100008, /* clang-format on */ }; enum gunyah_rm_vm_status { /* clang-format off */ GUNYAH_RM_VM_STATUS_NO_STATE = 0, GUNYAH_RM_VM_STATUS_INIT = 1, GUNYAH_RM_VM_STATUS_READY = 2, GUNYAH_RM_VM_STATUS_RUNNING = 3, GUNYAH_RM_VM_STATUS_PAUSED = 4, GUNYAH_RM_VM_STATUS_LOAD = 5, GUNYAH_RM_VM_STATUS_AUTH = 6, GUNYAH_RM_VM_STATUS_INIT_FAILED = 8, GUNYAH_RM_VM_STATUS_EXITED = 9, GUNYAH_RM_VM_STATUS_RESETTING = 10, GUNYAH_RM_VM_STATUS_RESET = 11, /* clang-format on */ }; struct gunyah_rm_vm_status_payload { __le16 vmid; u16 reserved; u8 vm_status; u8 os_status; __le16 app_status; } __packed; /* RPC Calls */ int gunyah_rm_mem_share(struct gunyah_rm *rm, struct gunyah_rm_mem_parcel *parcel); int gunyah_rm_mem_reclaim(struct gunyah_rm *rm, struct gunyah_rm_mem_parcel *parcel); int gunyah_rm_alloc_vmid(struct gunyah_rm *rm, u16 vmid); int gunyah_rm_dealloc_vmid(struct gunyah_rm *rm, u16 vmid); int gunyah_rm_vm_reset(struct gunyah_rm *rm, u16 vmid); int gunyah_rm_vm_start(struct gunyah_rm *rm, u16 vmid); int gunyah_rm_vm_stop(struct gunyah_rm *rm, u16 vmid); enum gunyah_rm_vm_auth_mechanism { /* clang-format off */ GUNYAH_RM_VM_AUTH_NONE = 0, GUNYAH_RM_VM_AUTH_QCOM_PIL_ELF = 1, GUNYAH_RM_VM_AUTH_QCOM_ANDROID_PVM = 2, /* clang-format on */ }; int gunyah_rm_vm_configure(struct gunyah_rm *rm, u16 vmid, enum gunyah_rm_vm_auth_mechanism auth_mechanism, u32 mem_handle, u64 image_offset, u64 image_size, u64 dtb_offset, u64 dtb_size); int gunyah_rm_vm_init(struct gunyah_rm *rm, u16 vmid); int gunyah_rm_vm_set_boot_context(struct gunyah_rm *rm, u16 vmid, u8 reg_set, u8 reg_index, u64 value); struct gunyah_rm_hyp_resource { u8 type; u8 reserved; __le16 partner_vmid; __le32 resource_handle; __le32 resource_label; __le64 cap_id; __le32 virq_handle; __le32 virq; __le64 base; __le64 size; } __packed; struct gunyah_rm_hyp_resources { __le32 n_entries; struct gunyah_rm_hyp_resource entries[]; } __packed; int gunyah_rm_get_hyp_resources(struct gunyah_rm *rm, u16 vmid, struct gunyah_rm_hyp_resources **resources); int gunyah_rm_get_vmid(struct gunyah_rm *rm, u16 *vmid); int gunyah_rm_vm_set_demand_paging(struct gunyah_rm *rm, u16 vmid, u32 count, struct gunyah_rm_mem_entry *mem_entries); enum gunyah_rm_range_id { GUNYAH_RM_RANGE_ID_IMAGE = 0, GUNYAH_RM_RANGE_ID_FIRMWARE = 1, }; int gunyah_rm_vm_set_firmware_mem(struct gunyah_rm *rm, u16 vmid, struct gunyah_rm_mem_parcel *parcel, u64 fw_offset, u64 fw_size); int gunyah_rm_vm_set_address_layout(struct gunyah_rm *rm, u16 vmid, enum gunyah_rm_range_id range_id, u64 base_address, u64 size); struct gunyah_resource * gunyah_rm_alloc_resource(struct gunyah_rm *rm, struct gunyah_rm_hyp_resource *hyp_resource); void gunyah_rm_free_resource(struct gunyah_resource *ghrsc); int gunyah_rm_call(struct gunyah_rm *rsc_mgr, u32 message_id, const void *req_buf, size_t req_buf_size, void **resp_buf, size_t *resp_buf_size); int gunyah_rm_platform_pre_mem_share(struct gunyah_rm *rm, struct gunyah_rm_mem_parcel *mem_parcel); int gunyah_rm_platform_post_mem_reclaim( struct gunyah_rm *rm, struct gunyah_rm_mem_parcel *mem_parcel); int gunyah_rm_platform_pre_demand_page(struct gunyah_rm *rm, u16 vmid, enum gunyah_pagetable_access access, struct folio *folio); int gunyah_rm_platform_reclaim_demand_page(struct gunyah_rm *rm, u16 vmid, enum gunyah_pagetable_access access, struct folio *folio); #endif