Files
2025-08-12 22:16:57 +02:00

150 lines
4.4 KiB
C
Executable File

/* 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 <linux/gunyah.h>
#include <linux/notifier.h>
#include <linux/types.h>
#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