Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8914391b authored by chris hyser's avatar chris hyser Committed by David S. Miller
Browse files

sparc64: Enable PCI IOMMU version 2 API



Enable Version 2 of the PCI IOMMU API needed for advanced features
such as PCI Relaxed Ordering and greater than 2 GB DMA address
space per root complex.

Signed-off-by: default avatarChris Hyser <chris.hyser@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cdd4f4c7
Loading
Loading
Loading
Loading
+26 −10
Original line number Original line Diff line number Diff line
@@ -30,8 +30,19 @@
#define DRIVER_NAME	"pci_sun4v"
#define DRIVER_NAME	"pci_sun4v"
#define PFX		DRIVER_NAME ": "
#define PFX		DRIVER_NAME ": "


static unsigned long vpci_major = 1;
static unsigned long vpci_major;
static unsigned long vpci_minor = 1;
static unsigned long vpci_minor;

struct vpci_version {
	unsigned long major;
	unsigned long minor;
};

/* Ordered from largest major to lowest */
static struct vpci_version vpci_versions[] = {
	{ .major = 2, .minor = 0 },
	{ .major = 1, .minor = 1 },
};


#define PGLIST_NENTS	(PAGE_SIZE / sizeof(u64))
#define PGLIST_NENTS	(PAGE_SIZE / sizeof(u64))


@@ -907,21 +918,26 @@ static int pci_sun4v_probe(struct platform_device *op)
	struct device_node *dp;
	struct device_node *dp;
	struct iommu *iommu;
	struct iommu *iommu;
	u32 devhandle;
	u32 devhandle;
	int i, err;
	int i, err = -ENODEV;


	dp = op->dev.of_node;
	dp = op->dev.of_node;


	if (!hvapi_negotiated++) {
	if (!hvapi_negotiated++) {
		err = sun4v_hvapi_register(HV_GRP_PCI,
		for (i = 0; i < ARRAY_SIZE(vpci_versions); i++) {
					   vpci_major,
			vpci_major = vpci_versions[i].major;
			vpci_minor = vpci_versions[i].minor;

			err = sun4v_hvapi_register(HV_GRP_PCI, vpci_major,
						   &vpci_minor);
						   &vpci_minor);
			if (!err)
				break;
		}


		if (err) {
		if (err) {
			printk(KERN_ERR PFX "Could not register hvapi, "
			pr_err(PFX "Could not register hvapi, err=%d\n", err);
			       "err=%d\n", err);
			return err;
			return err;
		}
		}
		printk(KERN_INFO PFX "Registered hvapi major[%lu] minor[%lu]\n",
		pr_info(PFX "Registered hvapi major[%lu] minor[%lu]\n",
			vpci_major, vpci_minor);
			vpci_major, vpci_minor);


		dma_ops = &sun4v_dma_ops;
		dma_ops = &sun4v_dma_ops;