Commit 77313e84 authored by panhengchang's avatar panhengchang Committed by yangxiangkai
Browse files

virtcca feature : disable swiotlb for passthrough device

virtcca inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/#IB4D2Y



--------------------------------

VirtCCA Feature:
disable swiotlb for passthrough device

Signed-off-by: default avatarpanhengchang <panhengchang@huawei.com>
---
parent c22607a5
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/vmalloc.h>
#include <linux/swiotlb.h>

#include <asm/cacheflush.h>
#include <asm/set_memory.h>
@@ -69,6 +70,7 @@ bool is_virtcca_cvm_world(void)
{
	return cvm_guest_enable && static_branch_likely(&cvm_tsi_present);
}
EXPORT_SYMBOL_GPL(is_virtcca_cvm_world);

static int change_page_range_cvm(pte_t *ptep, unsigned long addr, void *data)
{
@@ -120,6 +122,32 @@ int set_cvm_memory_decrypted(unsigned long addr, int numpages)
	return __set_memory_encrypted(addr, numpages, false);
}

/*
 * struct io_tlb_no_swiotlb_mem - whether use the
 * bounce buffer mechanism or not
 * @for_alloc: %true if the pool is used for memory allocation.
 *	Here it is set to %false, to force devices to use direct dma operations.
 *
 * @force_bounce: %true if swiotlb bouncing is forced.
 *	Here it is set to %false, to force devices to use direct dma operations.
 */
static struct io_tlb_mem io_tlb_no_swiotlb_mem = {
	.for_alloc = false,
	.force_bounce = false,
};

void enable_swiotlb_for_cvm_dev(struct device *dev, bool enable)
{
	if (!is_virtcca_cvm_world())
		return;

	if (enable)
		swiotlb_dev_init(dev);
	else
		dev->dma_io_tlb_mem = &io_tlb_no_swiotlb_mem;
}
EXPORT_SYMBOL_GPL(enable_swiotlb_for_cvm_dev);

void swiotlb_unmap_notify(unsigned long paddr, unsigned long size)
{
	struct arm_smccc_res res;
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <linux/swiotlb.h>
#include <linux/sysfs.h>
#include <linux/dma-map-ops.h> /* for dma_default_coherent */
#include <linux/virtcca_cvm_domain.h>

#include "base.h"
#include "physical_location.h"
@@ -3137,6 +3138,7 @@ void device_initialize(struct device *dev)
	dev->dma_coherent = dma_default_coherent;
#endif
	swiotlb_dev_init(dev);
	enable_swiotlb_for_cvm_dev(dev, false);
}
EXPORT_SYMBOL_GPL(device_initialize);

+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#ifdef CONFIG_HISI_VIRTCCA_GUEST
#include <linux/swiotlb.h>
#include <asm/virtcca_cvm_guest.h>
#include <linux/virtcca_cvm_domain.h>
#endif

#include <linux/irqchip.h>
@@ -6191,6 +6192,7 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists,
#ifdef CONFIG_HISI_VIRTCCA_GUEST
	if (is_virtcca_cvm_world()) {
		device_initialize(&cvm_alloc_device);
		enable_swiotlb_for_cvm_dev(&cvm_alloc_device, true);
		raw_spin_lock_init(&cvm_its_lock);
	}
#endif
+2 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@
#include <linux/virtio_config.h>
#include <uapi/linux/virtio_mmio.h>
#include <linux/virtio_ring.h>

#include <linux/virtcca_cvm_domain.h>


/* The alignment to use between consumer and producer parts of vring.
@@ -619,6 +619,7 @@ static int virtio_mmio_probe(struct platform_device *pdev)
	unsigned long magic;
	int rc;

	enable_swiotlb_for_cvm_dev(&pdev->dev, true);
	vm_dev = kzalloc(sizeof(*vm_dev), GFP_KERNEL);
	if (!vm_dev)
		return -ENOMEM;
+2 −0
Original line number Diff line number Diff line
@@ -525,6 +525,8 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
	struct virtio_pci_device *vp_dev, *reg_dev = NULL;
	int rc;

	enable_swiotlb_for_cvm_dev(&pci_dev->dev, true);

	/* allocate our structure and fill it out */
	vp_dev = kzalloc(sizeof(struct virtio_pci_device), GFP_KERNEL);
	if (!vp_dev)
Loading