150 lines
4.4 KiB
C
Executable File
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
|