ANDROID: virt: gunyah: Add a gunyah hcall for ioremap
Add a gunyah hook for ioremap to let the hypervisor know what iomem regions are being used by the guest. Bug: 424772814 Change-Id: I46b25f704fcd2c35d16558718e36eef560f56bb9 Signed-off-by: Prakruthi Deepak Heragu <quic_pheragu@quicinc.com>
This commit is contained in:
committed by
Treehugger Robot
parent
a7c066a30e
commit
52cc64794a
@@ -44,6 +44,7 @@ EXPORT_SYMBOL_GPL(arch_is_gunyah_guest);
|
|||||||
#define GUNYAH_HYPERCALL_MSGQ_RECV GUNYAH_HYPERCALL(0x801C)
|
#define GUNYAH_HYPERCALL_MSGQ_RECV GUNYAH_HYPERCALL(0x801C)
|
||||||
#define GUNYAH_HYPERCALL_ADDRSPACE_MAP GUNYAH_HYPERCALL(0x802B)
|
#define GUNYAH_HYPERCALL_ADDRSPACE_MAP GUNYAH_HYPERCALL(0x802B)
|
||||||
#define GUNYAH_HYPERCALL_ADDRSPACE_UNMAP GUNYAH_HYPERCALL(0x802C)
|
#define GUNYAH_HYPERCALL_ADDRSPACE_UNMAP GUNYAH_HYPERCALL(0x802C)
|
||||||
|
#define GUNYAH_HYPERCALL_ADDRSPACE_CONFIG_VMMIO_RANGE GUNYAH_HYPERCALL(0x8060)
|
||||||
#define GUNYAH_HYPERCALL_MEMEXTENT_DONATE GUNYAH_HYPERCALL(0x8061)
|
#define GUNYAH_HYPERCALL_MEMEXTENT_DONATE GUNYAH_HYPERCALL(0x8061)
|
||||||
#define GUNYAH_HYPERCALL_VCPU_RUN GUNYAH_HYPERCALL(0x8065)
|
#define GUNYAH_HYPERCALL_VCPU_RUN GUNYAH_HYPERCALL(0x8065)
|
||||||
#define GUNYAH_HYPERCALL_ADDRSPC_MODIFY_PAGES GUNYAH_HYPERCALL(0x8069)
|
#define GUNYAH_HYPERCALL_ADDRSPC_MODIFY_PAGES GUNYAH_HYPERCALL(0x8069)
|
||||||
@@ -81,6 +82,34 @@ enum gunyah_error gunyah_hypercall_addrspc_modify_pages(u64 capid, u64 addr,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gunyah_hypercall_addrspc_modify_pages);
|
EXPORT_SYMBOL_GPL(gunyah_hypercall_addrspc_modify_pages);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gunyah_hypercall_addrspc_configure_vmmio_range() - Configure virtual MMIO device regions for
|
||||||
|
* the address space.
|
||||||
|
* @capid: Address space capability ID
|
||||||
|
* @base: Base guest address of MMIO region
|
||||||
|
* @size: Size of the MMIO region
|
||||||
|
* @op: Map or Unmap
|
||||||
|
*/
|
||||||
|
enum gunyah_error gunyah_hypercall_addrspc_configure_vmmio_range(u64 capid, u64 base,
|
||||||
|
u64 size, u64 op)
|
||||||
|
{
|
||||||
|
struct arm_smccc_1_2_regs args = {
|
||||||
|
.a0 = GUNYAH_HYPERCALL_ADDRSPACE_CONFIG_VMMIO_RANGE,
|
||||||
|
.a1 = capid,
|
||||||
|
.a2 = base,
|
||||||
|
.a3 = size,
|
||||||
|
.a4 = op,
|
||||||
|
/* Reserved. Must be 0 */
|
||||||
|
.a5 = 0,
|
||||||
|
};
|
||||||
|
struct arm_smccc_1_2_regs res;
|
||||||
|
|
||||||
|
arm_smccc_1_2_hvc(&args, &res);
|
||||||
|
|
||||||
|
return res.a0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(gunyah_hypercall_addrspc_configure_vmmio_range);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gunyah_hypercall_bell_send() - Assert a gunyah doorbell
|
* gunyah_hypercall_bell_send() - Assert a gunyah doorbell
|
||||||
* @capid: capability ID of the doorbell
|
* @capid: capability ID of the doorbell
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/* Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. */
|
/* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */
|
||||||
|
|
||||||
#include <linux/gunyah.h>
|
#include <linux/gunyah.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/pgtable.h>
|
||||||
#include <linux/virtio_balloon.h>
|
#include <linux/virtio_balloon.h>
|
||||||
|
|
||||||
#include <asm/hypervisor.h>
|
#include <asm/hypervisor.h>
|
||||||
@@ -16,6 +18,28 @@ struct addrspace_info_area_rootvm_addrspace_cap {
|
|||||||
|
|
||||||
static u64 our_addrspace_capid;
|
static u64 our_addrspace_capid;
|
||||||
|
|
||||||
|
static int gunyah_mmio_guard_ioremap_hook(phys_addr_t phys, size_t size, pgprot_t *prot)
|
||||||
|
{
|
||||||
|
pteval_t protval = pgprot_val(*prot);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We only expect MMIO emulation for regions mapped with device
|
||||||
|
* attributes.
|
||||||
|
*/
|
||||||
|
if (protval != PROT_DEVICE_nGnRE && protval != PROT_DEVICE_nGnRnE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = gunyah_hypercall_addrspc_configure_vmmio_range(our_addrspace_capid,
|
||||||
|
phys, size, GUNYAH_ADDRSPACE_VMMIO_CONFIGURE_OP_ADD_RANGE);
|
||||||
|
|
||||||
|
if (ret == GUNYAH_ERROR_UNIMPLEMENTED || ret == GUNYAH_ERROR_BUSY)
|
||||||
|
/* Gunyah would have configured VMMIO via DT */
|
||||||
|
ret = GUNYAH_ERROR_OK;
|
||||||
|
|
||||||
|
return gunyah_error_remap(ret);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_VIRTIO_BALLOON_HYP_OPS
|
#ifdef CONFIG_VIRTIO_BALLOON_HYP_OPS
|
||||||
static void gunyah_page_relinquish(struct page *page, unsigned int nr)
|
static void gunyah_page_relinquish(struct page *page, unsigned int nr)
|
||||||
{
|
{
|
||||||
@@ -71,6 +95,7 @@ static int __init gunyah_guest_init(void)
|
|||||||
|
|
||||||
our_addrspace_capid = info->addrspace_cap;
|
our_addrspace_capid = info->addrspace_cap;
|
||||||
|
|
||||||
|
arm64_ioremap_prot_hook_register(&gunyah_mmio_guard_ioremap_hook);
|
||||||
#ifdef CONFIG_VIRTIO_BALLOON_HYP_OPS
|
#ifdef CONFIG_VIRTIO_BALLOON_HYP_OPS
|
||||||
virtio_balloon_hyp_ops = &gunyah_virtio_balloon_hyp_ops;
|
virtio_balloon_hyp_ops = &gunyah_virtio_balloon_hyp_ops;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -600,8 +600,9 @@ gunyah_hypercall_vcpu_run(u64 capid, unsigned long *resume_data,
|
|||||||
#define GUNYAH_ADDRSPC_MODIFY_FLAG_SANITIZE_BIT 1
|
#define GUNYAH_ADDRSPC_MODIFY_FLAG_SANITIZE_BIT 1
|
||||||
enum gunyah_error
|
enum gunyah_error
|
||||||
gunyah_hypercall_addrspc_modify_pages(u64 capid, u64 addr, u64 size, u64 flags);
|
gunyah_hypercall_addrspc_modify_pages(u64 capid, u64 addr, u64 size, u64 flags);
|
||||||
|
|
||||||
enum gunyah_error
|
enum gunyah_error
|
||||||
gunyah_hypercall_addrspace_find_info_area(unsigned long *ipa, unsigned long *size);
|
gunyah_hypercall_addrspace_find_info_area(unsigned long *ipa, unsigned long *size);
|
||||||
|
enum gunyah_error
|
||||||
|
#define GUNYAH_ADDRSPACE_VMMIO_CONFIGURE_OP_ADD_RANGE 0
|
||||||
|
gunyah_hypercall_addrspc_configure_vmmio_range(u64 capid, u64 base, u64 size, u64 op);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user