Unverified Commit 961f596c authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!15333 VirtCCA Feature: cvm support UEFI boot

Merge Pull Request from: @gongchangsui 
 
## VirtCCA Feature: 
1. cvm support UEFI boot
2. An interface to retrieve the TMI version is added
3. Intercept the situation where devices with both NVM adn CVM passthrough under same PCIe root port
4. Improve nfs workqueue bind method
5. The cvm removes the vcpu binding limit.
6. Bug fix: Resolve the issue of host hard lockup
## QA:
1. [openEuler/QA](https://gitee.com/openeuler/QA/pulls/938)
---
> virtcca inclusion
> category: feature
> bugzilla: https://gitee.com/openeuler/kernel/issues/IBQSQW


> Signed-off-by: default avatargongchangsui <gongchangsui@outlook.com>

 
 
Link:https://gitee.com/openeuler/kernel/pulls/15333

 

Reviewed-by: default avatarWeilong Chen <chenweilong@huawei.com>
Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Reviewed-by: default avatarHe Jingxian <hejingxian@huawei.com>
Reviewed-by: default avatarKevin Zhu <zhukeqian1@huawei.com>
Reviewed-by: default avatarzhangyi (F) <yi.zhang@huawei.com>
Reviewed-by: default avatarYue Haibing <yuehaibing@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 75004e70 11954536
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#define TMI_ERROR_INTERNAL		11
#define TMI_ERROR_CVM_POWEROFF		12
#define TMI_ERROR_TTT_CREATED		13
#define TMI_ERROR_TTT_DESTROY_AGAIN	14

#define TMI_RETURN_STATUS(ret)		((ret) & 0xFF)
#define TMI_RETURN_INDEX(ret)		(((ret) >> 8) & 0xFF)
@@ -230,6 +231,7 @@ struct tmi_tec_run {
#define TMI_FNUM_FEATURES               U(0x26C)
#define TMI_FNUM_TTT_MAP_RANGE          U(0x26D)
#define TMI_FNUM_TTT_UNMAP_RANGE        U(0x26E)
#define TMI_FNUM_TTT_DESTROY            U(0x26F)
#define TMI_FNUM_INF_TEST               U(0x270)
#define TMI_FNUM_KAE_INIT               U(0x273)
#define TMI_FNUM_KAE_ENABLE             U(0x274)
@@ -266,6 +268,7 @@ struct tmi_tec_run {
#define TMI_TMM_MEM_INFO_SHOW           TMI_FID(SMC_64, TMI_FNUM_MEM_INFO_SHOW)
#define TMI_TMM_TTT_MAP_RANGE           TMI_FID(SMC_64, TMI_FNUM_TTT_MAP_RANGE)
#define TMI_TMM_TTT_UNMAP_RANGE         TMI_FID(SMC_64, TMI_FNUM_TTT_UNMAP_RANGE)
#define TMI_TMM_TTT_DESTROY             TMI_FID(SMC_64, TMI_FNUM_TTT_DESTROY)
#define TMI_TMM_INF_TEST                TMI_FID(SMC_64, TMI_FNUM_INF_TEST)
#define TMI_TMM_KAE_INIT                TMI_FID(SMC_64, TMI_FNUM_KAE_INIT)
#define TMI_TMM_KAE_ENABLE              TMI_FID(SMC_64, TMI_FNUM_KAE_ENABLE)
@@ -392,6 +395,7 @@ u64 tmi_ttt_create(u64 numa_set, u64 rd, u64 map_addr, u64 level);
u64 tmi_psci_complete(u64 calling_tec, u64 target_tec);
u64 tmi_features(u64 index);
u64 tmi_ttt_map_range(u64 rd, u64 map_addr, u64 size, u64 cur_node, u64 target_node);
u64 tmi_ttt_destroy(u64 rd);
u64 tmi_mem_info_show(u64 mem_info_addr);

u64 tmi_dev_ttt_create(u64 numa_set, u64 rd, u64 map_addr, u64 level);
@@ -413,6 +417,7 @@ u64 tmi_kae_init(void);
u64 tmi_kae_enable(u64 rd, u64 numa_set, u64 is_enable);

u64 mmio_va_to_pa(void *addr);
int virtcca_io_mem_abort(struct kvm_vcpu *vcpu, unsigned long hva, phys_addr_t fault_ipa);
void kvm_cvm_vcpu_put(struct kvm_vcpu *vcpu);
int kvm_load_user_data(struct kvm *kvm, unsigned long arg);
unsigned long cvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu,
+11 −0
Original line number Diff line number Diff line
@@ -75,8 +75,19 @@ struct virtcca_cvm {
	u32 cvm_vmid;
	u64 rd;
	u64 loader_start;
#ifndef __GENKSYMS__
	union {
		u64 image_end;
		u64 mmio_start;
	};
	union {
		u64 initrd_start;
		u64 mmio_end;
	};
#else
	u64 image_end;
	u64 initrd_start;
#endif
	u64 dtb_end;
	u64 ram_size;
	struct kvm_numa_info numa_info;
+28 −1
Original line number Diff line number Diff line
@@ -24,8 +24,16 @@

#define SMMU_DOMAIN_IS_SAME     0x2

int virtcca_attach_secure_dev(struct iommu_domain *domain, struct iommu_group *group,
enum cc_dev_type {
	CC_DEV_NONE_TYPE,	/* No assigned CC devices */
	CC_DEV_HOST_TYPE,	/* CC devices assigned to the host */
	CC_DEV_NVM_TYPE,	/* CC devices assigned to normal vm */
	CC_DEV_CVM_TYPE,	/* CC devices assigned to confidential vm */
};

int virtcca_attach_dev(struct iommu_domain *domain, struct iommu_group *group,
	bool iommu_secure);
void virtcca_detach_dev(struct iommu_domain *domain, struct iommu_group *group);

u64 virtcca_get_iommu_device_msi_addr(struct iommu_group *iommu_group);
int virtcca_iommu_group_set_dev_msi_addr(struct iommu_group *iommu_group, unsigned long *iova);
@@ -81,6 +89,8 @@ u64 get_g_cc_dev_msi_addr(u32 sid);

void set_g_cc_dev_msi_addr(u32 sid, u64 msi_addr);

u32 get_g_coda_dev_vm_type(u32 sid);

void g_cc_dev_table_init(void);

u32 virtcca_tmi_dev_attach(struct arm_smmu_domain *arm_smmu_domain, struct kvm *kvm);
@@ -88,5 +98,22 @@ u32 virtcca_tmi_dev_attach(struct arm_smmu_domain *arm_smmu_domain, struct kvm *
void virtcca_iommu_dma_get_msi_page(void *cookie, dma_addr_t *iova, phys_addr_t *phys);

int virtcca_msi_map(struct vfio_pci_core_device *vdev);

static inline u8 virtcca_readb(void __iomem *addr, struct pci_dev *pdev)
{
	return tmi_mmio_read(mmio_va_to_pa(addr), CVM_RW_8_BIT, pci_dev_id(pdev));
}

static inline u16 virtcca_readw(void __iomem *addr, struct pci_dev *pdev)
{
	return tmi_mmio_read(mmio_va_to_pa(addr), CVM_RW_16_BIT, pci_dev_id(pdev));
}

static inline u32 virtcca_readl(void __iomem *addr, struct pci_dev *pdev)
{
	return tmi_mmio_read(mmio_va_to_pa(addr), CVM_RW_32_BIT, pci_dev_id(pdev));
}
size_t virtcca_pci_get_rom_size(void *pdev, void __iomem *rom,
			       size_t size);
#endif
#endif
+3 −0
Original line number Diff line number Diff line
@@ -7,6 +7,9 @@

#ifdef CONFIG_HISI_VIRTCCA_HOST

#define UEFI_LOADER_START 0x0
#define UEFI_SIZE 0x8000000

bool is_virtcca_cvm_enable(void);

#else
+6 −0
Original line number Diff line number Diff line
@@ -1763,6 +1763,12 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu)
		goto out_unlock;
	}

#ifdef CONFIG_HISI_VIRTCCA_CODA
	ret = virtcca_io_mem_abort(vcpu, hva, fault_ipa);
	if (ret != -EPERM)
		goto out_unlock;
#endif

	/* Userspace should not be able to register out-of-bounds IPAs */
	VM_BUG_ON(fault_ipa >= kvm_phys_size(vcpu->kvm));

Loading