patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device
@ 2021-06-17  6:54 谢华伟(此时此刻)
  2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 1/2] bus/pci: use PCI standard sysfs entry to get PIO address 谢华伟(此时此刻)
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: 谢华伟(此时此刻) @ 2021-06-17  6:54 UTC (permalink / raw)
  To: stable
  Cc: david.marchand, maxime.coquelin, ferruh.yigit, grive, heqing.zhu,
	谢华伟(此时此刻)

virtio PMD assumes legacy device only supports PIO(port-mapped) BAR 
resource. This is wrong. As we need to create lots of devices, adn PIO 
resource on x86 is very limited, we expose MMIO(memory-mapped I/O) BAR.

Kernel supports both PIO and MMIO BAR for legacy virtio-pci device, and 
for all other pci devices. This patchset handles different type of BAR in
the similar way.

In previous implementation, under igb_uio driver we get PIO address from
igb_uio sysfs entry; with uio_pci_generic, we get PIO address from
/proc/ioports for x86, and for other ARCHs, we get PIO address from
standard PCI sysfs entry. For PIO/MMIO RW, there is different path for 
different drivers and arch.

All of the above is too much twisted. This patchset unifies the way to get 
both PIO and MMIO address for different driver and ARCHs, all from standard
resource attr under pci sysfs. This is most generic.

We distinguish PIO and MMIO by their address range like how kernel does.
It is ugly but works.

huawei xie (2):
  bus/pci: use PCI standard sysfs entry to get PIO address
  bus/pci: support MMIO in PCI ioport accessors

 drivers/bus/pci/linux/pci.c     |  81 ---------------
 drivers/bus/pci/linux/pci_uio.c | 214 ++++++++++++++++++++++++++++------------
 2 files changed, 150 insertions(+), 145 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-stable] [PATCH 20.11 1/2] bus/pci: use PCI standard sysfs entry to get PIO address
  2021-06-17  6:54 [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device 谢华伟(此时此刻)
@ 2021-06-17  6:54 ` 谢华伟(此时此刻)
  2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 2/2] bus/pci: support MMIO in PCI ioport accessors 谢华伟(此时此刻)
  2021-06-20 15:02 ` [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device Xueming(Steven) Li
  2 siblings, 0 replies; 5+ messages in thread
From: 谢华伟(此时此刻) @ 2021-06-17  6:54 UTC (permalink / raw)
  To: stable
  Cc: david.marchand, maxime.coquelin, ferruh.yigit, grive, heqing.zhu,
	谢华伟(此时此刻)

Currently virtio PMD assumes legacy device uses PIO bar.
There are three ways to get PIO(PortIO) address for virtio legacy device.
    1) under igb_uio, get PIO address from uio/uio# sysfs attribute, for
instance: /sys/bus/pci/devices/0000:00:09.0/uio/uio0/portio/port0/start
    2) under uio_pci_generic
        for X86, get PIO address from /proc/ioport.
        for other ARCH, get PIO address from standard PCI sysfs attribute,
for instance: /sys/bus/pci/devices/0000:00:09.0/resource

Actually, "port0/start" in igb_uio and "resource" point to exactly the
same thing, i.e, pci_dev->resource[0] in kernel source code.

This patch refactors these messy things, and uses standard PCI sysfs
attribute "resource".

Signed-off-by: huawei xie <huawei.xhw@alibaba-inc.com>
---
 drivers/bus/pci/linux/pci.c     | 77 -----------------------------------------
 drivers/bus/pci/linux/pci_uio.c | 64 ++++++++++++++++++++++++----------
 2 files changed, 46 insertions(+), 95 deletions(-)

diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 2e1808b..0f38abf 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -677,71 +677,6 @@ int rte_pci_write_config(const struct rte_pci_device *device,
 	}
 }
 
-#if defined(RTE_ARCH_X86)
-static int
-pci_ioport_map(struct rte_pci_device *dev, int bar __rte_unused,
-		struct rte_pci_ioport *p)
-{
-	uint16_t start, end;
-	FILE *fp;
-	char *line = NULL;
-	char pci_id[16];
-	int found = 0;
-	size_t linesz;
-
-	if (rte_eal_iopl_init() != 0) {
-		RTE_LOG(ERR, EAL, "%s(): insufficient ioport permissions for PCI device %s\n",
-			__func__, dev->name);
-		return -1;
-	}
-
-	snprintf(pci_id, sizeof(pci_id), PCI_PRI_FMT,
-		 dev->addr.domain, dev->addr.bus,
-		 dev->addr.devid, dev->addr.function);
-
-	fp = fopen("/proc/ioports", "r");
-	if (fp == NULL) {
-		RTE_LOG(ERR, EAL, "%s(): can't open ioports\n", __func__);
-		return -1;
-	}
-
-	while (getdelim(&line, &linesz, '\n', fp) > 0) {
-		char *ptr = line;
-		char *left;
-		int n;
-
-		n = strcspn(ptr, ":");
-		ptr[n] = 0;
-		left = &ptr[n + 1];
-
-		while (*left && isspace(*left))
-			left++;
-
-		if (!strncmp(left, pci_id, strlen(pci_id))) {
-			found = 1;
-
-			while (*ptr && isspace(*ptr))
-				ptr++;
-
-			sscanf(ptr, "%04hx-%04hx", &start, &end);
-
-			break;
-		}
-	}
-
-	free(line);
-	fclose(fp);
-
-	if (!found)
-		return -1;
-
-	p->base = start;
-	RTE_LOG(DEBUG, EAL, "PCI Port IO found start=0x%x\n", start);
-
-	return 0;
-}
-#endif
-
 int
 rte_pci_ioport_map(struct rte_pci_device *dev, int bar,
 		struct rte_pci_ioport *p)
@@ -756,14 +691,8 @@ int rte_pci_write_config(const struct rte_pci_device *device,
 		break;
 #endif
 	case RTE_PCI_KDRV_IGB_UIO:
-		ret = pci_uio_ioport_map(dev, bar, p);
-		break;
 	case RTE_PCI_KDRV_UIO_GENERIC:
-#if defined(RTE_ARCH_X86)
-		ret = pci_ioport_map(dev, bar, p);
-#else
 		ret = pci_uio_ioport_map(dev, bar, p);
-#endif
 		break;
 	default:
 		break;
@@ -830,14 +759,8 @@ int rte_pci_write_config(const struct rte_pci_device *device,
 		break;
 #endif
 	case RTE_PCI_KDRV_IGB_UIO:
-		ret = pci_uio_ioport_unmap(p);
-		break;
 	case RTE_PCI_KDRV_UIO_GENERIC:
-#if defined(RTE_ARCH_X86)
-		ret = 0;
-#else
 		ret = pci_uio_ioport_unmap(p);
-#endif
 		break;
 	default:
 		break;
diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c
index 624b2e2..aa03da7 100644
--- a/drivers/bus/pci/linux/pci_uio.c
+++ b/drivers/bus/pci/linux/pci_uio.c
@@ -373,10 +373,13 @@
 pci_uio_ioport_map(struct rte_pci_device *dev, int bar,
 		   struct rte_pci_ioport *p)
 {
+	FILE *f = NULL;
 	char dirname[PATH_MAX];
 	char filename[PATH_MAX];
-	int uio_num;
-	unsigned long start;
+	char buf[BUFSIZ];
+	uint64_t phys_addr, end_addr, flags;
+	unsigned long base;
+	int i;
 
 	if (rte_eal_iopl_init() != 0) {
 		RTE_LOG(ERR, EAL, "%s(): insufficient ioport permissions for PCI device %s\n",
@@ -384,41 +387,66 @@
 		return -1;
 	}
 
-	uio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname), 0);
-	if (uio_num < 0)
+	/* open and read addresses of the corresponding resource in sysfs */
+	snprintf(filename, sizeof(filename), "%s/" PCI_PRI_FMT "/resource",
+		rte_pci_get_sysfs_path(), dev->addr.domain, dev->addr.bus,
+		dev->addr.devid, dev->addr.function);
+	f = fopen(filename, "r");
+	if (f == NULL) {
+		RTE_LOG(ERR, EAL, "%s(): Cannot open sysfs resource: %s\n",
+			__func__, strerror(errno));
 		return -1;
+	}
 
-	/* get portio start */
-	snprintf(filename, sizeof(filename),
-		 "%s/portio/port%d/start", dirname, bar);
-	if (eal_parse_sysfs_value(filename, &start) < 0) {
-		RTE_LOG(ERR, EAL, "%s(): cannot parse portio start\n",
-			__func__);
-		return -1;
+	for (i = 0; i < bar + 1; i++) {
+		if (fgets(buf, sizeof(buf), f) == NULL) {
+			RTE_LOG(ERR, EAL, "%s(): Cannot read sysfs resource\n", __func__);
+			goto error;
+		}
 	}
-	/* ensure we don't get anything funny here, read/write will cast to
-	 * uin16_t */
-	if (start > UINT16_MAX)
-		return -1;
+	if (pci_parse_one_sysfs_resource(buf, sizeof(buf), &phys_addr,
+		&end_addr, &flags) < 0)
+		goto error;
+
+	if (!(flags & IORESOURCE_IO)) {
+		RTE_LOG(ERR, EAL, "%s(): bar resource other than IO is not supported\n", __func__);
+		goto error;
+	}
+	base = (unsigned long)phys_addr;
+	RTE_LOG(INFO, EAL, "%s(): PIO BAR %08lx detected\n", __func__, base);
+
+	if (base > UINT16_MAX)
+		goto error;
 
 	/* FIXME only for primary process ? */
 	if (dev->intr_handle.type == RTE_INTR_HANDLE_UNKNOWN) {
+		int uio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname), 0);
+		if (uio_num < 0) {
+			RTE_LOG(ERR, EAL, "cannot open %s: %s\n",
+				dirname, strerror(errno));
+			goto error;
+		}
 
 		snprintf(filename, sizeof(filename), "/dev/uio%u", uio_num);
 		dev->intr_handle.fd = open(filename, O_RDWR);
 		if (dev->intr_handle.fd < 0) {
 			RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
 				filename, strerror(errno));
-			return -1;
+			goto error;
 		}
 		dev->intr_handle.type = RTE_INTR_HANDLE_UIO;
 	}
 
-	RTE_LOG(DEBUG, EAL, "PCI Port IO found start=0x%lx\n", start);
+	RTE_LOG(DEBUG, EAL, "PCI Port IO found start=0x%lx\n", base);
 
-	p->base = start;
+	p->base = base;
 	p->len = 0;
+	fclose(f);
 	return 0;
+error:
+	if (f)
+		fclose(f);
+	return -1;
 }
 #else
 int
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-stable] [PATCH 20.11 2/2] bus/pci: support MMIO in PCI ioport accessors
  2021-06-17  6:54 [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device 谢华伟(此时此刻)
  2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 1/2] bus/pci: use PCI standard sysfs entry to get PIO address 谢华伟(此时此刻)
@ 2021-06-17  6:54 ` 谢华伟(此时此刻)
  2021-06-20 15:02 ` [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device Xueming(Steven) Li
  2 siblings, 0 replies; 5+ messages in thread
From: 谢华伟(此时此刻) @ 2021-06-17  6:54 UTC (permalink / raw)
  To: stable
  Cc: david.marchand, maxime.coquelin, ferruh.yigit, grive, heqing.zhu,
	谢华伟(此时此刻)

With I/O BAR, we get PIO(port-mapped I/O) address.
With MMIO(memory-mapped I/O) BAR, we get mapped virtual address.
We distinguish PIO and MMIO by their address range like how kernel does,
i.e, address below 64K is PIO.
ioread/write8/16/32 is provided to access PIO/MMIO.
By the way, for virtio on arch other than x86, BAR flag indicates PIO
but is mapped.

Signed-off-by: huawei xie <huawei.xhw@alibaba-inc.com>
---
 drivers/bus/pci/linux/pci.c     |   4 -
 drivers/bus/pci/linux/pci_uio.c | 168 +++++++++++++++++++++++++++-------------
 2 files changed, 113 insertions(+), 59 deletions(-)

diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 0f38abf..0dc99e9 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -715,8 +715,6 @@ int rte_pci_write_config(const struct rte_pci_device *device,
 		break;
 #endif
 	case RTE_PCI_KDRV_IGB_UIO:
-		pci_uio_ioport_read(p, data, len, offset);
-		break;
 	case RTE_PCI_KDRV_UIO_GENERIC:
 		pci_uio_ioport_read(p, data, len, offset);
 		break;
@@ -736,8 +734,6 @@ int rte_pci_write_config(const struct rte_pci_device *device,
 		break;
 #endif
 	case RTE_PCI_KDRV_IGB_UIO:
-		pci_uio_ioport_write(p, data, len, offset);
-		break;
 	case RTE_PCI_KDRV_UIO_GENERIC:
 		pci_uio_ioport_write(p, data, len, offset);
 		break;
diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c
index aa03da7..0907051 100644
--- a/drivers/bus/pci/linux/pci_uio.c
+++ b/drivers/bus/pci/linux/pci_uio.c
@@ -368,6 +368,8 @@
 	return -1;
 }
 
+#define PIO_MAX 0x10000
+
 #if defined(RTE_ARCH_X86)
 int
 pci_uio_ioport_map(struct rte_pci_device *dev, int bar,
@@ -381,12 +383,6 @@
 	unsigned long base;
 	int i;
 
-	if (rte_eal_iopl_init() != 0) {
-		RTE_LOG(ERR, EAL, "%s(): insufficient ioport permissions for PCI device %s\n",
-			__func__, dev->name);
-		return -1;
-	}
-
 	/* open and read addresses of the corresponding resource in sysfs */
 	snprintf(filename, sizeof(filename), "%s/" PCI_PRI_FMT "/resource",
 		rte_pci_get_sysfs_path(), dev->addr.domain, dev->addr.bus,
@@ -408,15 +404,27 @@
 		&end_addr, &flags) < 0)
 		goto error;
 
-	if (!(flags & IORESOURCE_IO)) {
-		RTE_LOG(ERR, EAL, "%s(): bar resource other than IO is not supported\n", __func__);
-		goto error;
-	}
-	base = (unsigned long)phys_addr;
-	RTE_LOG(INFO, EAL, "%s(): PIO BAR %08lx detected\n", __func__, base);
+	if (flags & IORESOURCE_IO) {
+		if (rte_eal_iopl_init()) {
+			RTE_LOG(ERR, EAL, "%s(): insufficient ioport permissions for PCI device %s\n",
+				__func__, dev->name);
+			goto error;
+		}
+
+		base = (unsigned long)phys_addr;
+		if (base > PIO_MAX) {
+			RTE_LOG(ERR, EAL, "%s(): %08lx too large PIO resource\n", __func__, base);
+			goto error;
+		}
 
-	if (base > UINT16_MAX)
+		RTE_LOG(DEBUG, EAL, "%s(): PIO BAR %08lx detected\n", __func__, base);
+	} else if (flags & IORESOURCE_MEM) {
+		base = (unsigned long)dev->mem_resource[bar].addr;
+		RTE_LOG(DEBUG, EAL, "%s(): MMIO BAR %08lx detected\n", __func__, base);
+	} else {
+		RTE_LOG(ERR, EAL, "%s(): unknown BAR type\n", __func__);
 		goto error;
+	}
 
 	/* FIXME only for primary process ? */
 	if (dev->intr_handle.type == RTE_INTR_HANDLE_UNKNOWN) {
@@ -517,6 +525,92 @@
 }
 #endif
 
+#if defined(RTE_ARCH_X86)
+static inline uint8_t ioread8(void *addr)
+{
+	uint8_t val;
+
+	val = (uint64_t)(uintptr_t)addr >= PIO_MAX ?
+		*(volatile uint8_t *)addr :
+		inb_p((unsigned long)addr);
+
+	return val;
+}
+
+static inline uint16_t ioread16(void *addr)
+{
+	uint16_t val;
+
+	val = (uint64_t)(uintptr_t)addr >= PIO_MAX ?
+		*(volatile uint16_t *)addr :
+		inw_p((unsigned long)addr);
+
+	return val;
+}
+
+static inline uint32_t ioread32(void *addr)
+{
+	uint32_t val;
+
+	val = (uint64_t)(uintptr_t)addr >= PIO_MAX ?
+		*(volatile uint32_t *)addr :
+		inl_p((unsigned long)addr);
+
+	return val;
+}
+
+static inline void iowrite8(uint8_t val, void *addr)
+{
+	(uint64_t)(uintptr_t)addr >= PIO_MAX ?
+		*(volatile uint8_t *)addr = val :
+		outb_p(val, (unsigned long)addr);
+}
+
+static inline void iowrite16(uint16_t val, void *addr)
+{
+	(uint64_t)(uintptr_t)addr >= PIO_MAX ?
+		*(volatile uint16_t *)addr = val :
+		outw_p(val, (unsigned long)addr);
+}
+
+static inline void iowrite32(uint32_t val, void *addr)
+{
+	(uint64_t)(uintptr_t)addr >= PIO_MAX ?
+		*(volatile uint32_t *)addr = val :
+		outl_p(val, (unsigned long)addr);
+}
+#else
+static inline uint8_t ioread8(void *addr)
+{
+	return *(volatile uint8_t *)addr;
+}
+
+static inline uint16_t ioread16(void *addr)
+{
+	return *(volatile uint16_t *)addr;
+}
+
+static inline uint32_t ioread32(void *addr)
+{
+	return *(volatile uint32_t *)addr;
+}
+
+static inline void iowrite8(uint8_t val, void *addr)
+{
+	*(volatile uint8_t *)addr = val;
+}
+
+static inline void iowrite16(uint16_t val, void *addr)
+{
+	*(volatile uint16_t *)addr = val;
+}
+
+static inline void iowrite32(uint32_t val, void *addr)
+{
+	*(volatile uint32_t *)addr = val;
+}
+#endif
+
 void
 pci_uio_ioport_read(struct rte_pci_ioport *p,
 		    void *data, size_t len, off_t offset)
@@ -528,25 +622,13 @@
 	for (d = data; len > 0; d += size, reg += size, len -= size) {
 		if (len >= 4) {
 			size = 4;
-#if defined(RTE_ARCH_X86)
-			*(uint32_t *)d = inl(reg);
-#else
-			*(uint32_t *)d = *(volatile uint32_t *)reg;
-#endif
+			*(uint32_t *)d = ioread32((void *)reg);
 		} else if (len >= 2) {
 			size = 2;
-#if defined(RTE_ARCH_X86)
-			*(uint16_t *)d = inw(reg);
-#else
-			*(uint16_t *)d = *(volatile uint16_t *)reg;
-#endif
+			*(uint16_t *)d = ioread16((void *)reg);
 		} else {
 			size = 1;
-#if defined(RTE_ARCH_X86)
-			*d = inb(reg);
-#else
-			*d = *(volatile uint8_t *)reg;
-#endif
+			*d = ioread8((void *)reg);
 		}
 	}
 }
@@ -562,37 +644,13 @@
 	for (s = data; len > 0; s += size, reg += size, len -= size) {
 		if (len >= 4) {
 			size = 4;
-#if defined(RTE_ARCH_X86)
-#ifdef __GLIBC__
-			outl_p(*(const uint32_t *)s, reg);
-#else
-			outl(*(const uint32_t *)s, reg);
-#endif
-#else
-			*(volatile uint32_t *)reg = *(const uint32_t *)s;
-#endif
+			iowrite32(*(const uint32_t *)s, (void *)reg);
 		} else if (len >= 2) {
 			size = 2;
-#if defined(RTE_ARCH_X86)
-#ifdef __GLIBC__
-			outw_p(*(const uint16_t *)s, reg);
-#else
-			outw(*(const uint16_t *)s, reg);
-#endif
-#else
-			*(volatile uint16_t *)reg = *(const uint16_t *)s;
-#endif
+			iowrite16(*(const uint16_t *)s, (void *)reg);
 		} else {
 			size = 1;
-#if defined(RTE_ARCH_X86)
-#ifdef __GLIBC__
-			outb_p(*s, reg);
-#else
-			outb(*s, reg);
-#endif
-#else
-			*(volatile uint8_t *)reg = *s;
-#endif
+			iowrite8(*s, (void *)reg);
 		}
 	}
 }
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device
  2021-06-17  6:54 [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device 谢华伟(此时此刻)
  2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 1/2] bus/pci: use PCI standard sysfs entry to get PIO address 谢华伟(此时此刻)
  2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 2/2] bus/pci: support MMIO in PCI ioport accessors 谢华伟(此时此刻)
@ 2021-06-20 15:02 ` Xueming(Steven) Li
  2021-06-22  7:38   ` Thomas Monjalon
  2 siblings, 1 reply; 5+ messages in thread
From: Xueming(Steven) Li @ 2021-06-20 15:02 UTC (permalink / raw)
  To: 谢华伟(此时此刻),
	stable, Luca Boccassi, Kevin Traynor
  Cc: david.marchand, maxime.coquelin, ferruh.yigit, grive, heqing.zhu

Hi Huawei,

Thanks for the backport! Here is the backport policy:
https://doc.dpdk.org/guides/contributing/stable.html#what-changes-should-be-backported

The patch set is small enough, but it changed the public PCI component, a little risky IMHO.

BTW, the patch subject seems different than upstream version, why not use upstream patch?
We are expecting a line of "[ upstream commit <id> ] at begging of path commit log.

Best Regards,
Xueming

> -----Original Message-----
> From: stable <stable-bounces@dpdk.org> On Behalf Of 谢华伟(此时此刻)
> Sent: Thursday, June 17, 2021 2:55 PM
> To: stable@dpdk.org
> Cc: david.marchand@redhat.com; maxime.coquelin@redhat.com; ferruh.yigit@intel.com; grive@u256.net; heqing.zhu@intel.com; 谢
> 华伟(此时此刻) <huawei.xhw@alibaba-inc.com>
> Subject: [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device
> 
> virtio PMD assumes legacy device only supports PIO(port-mapped) BAR resource. This is wrong. As we need to create lots of devices,
> adn PIO resource on x86 is very limited, we expose MMIO(memory-mapped I/O) BAR.
> 
> Kernel supports both PIO and MMIO BAR for legacy virtio-pci device, and for all other pci devices. This patchset handles different type
> of BAR in the similar way.
> 
> In previous implementation, under igb_uio driver we get PIO address from igb_uio sysfs entry; with uio_pci_generic, we get PIO
> address from /proc/ioports for x86, and for other ARCHs, we get PIO address from standard PCI sysfs entry. For PIO/MMIO RW, there
> is different path for different drivers and arch.
> 
> All of the above is too much twisted. This patchset unifies the way to get both PIO and MMIO address for different driver and ARCHs,
> all from standard resource attr under pci sysfs. This is most generic.
> 
> We distinguish PIO and MMIO by their address range like how kernel does.
> It is ugly but works.
> 
> huawei xie (2):
>   bus/pci: use PCI standard sysfs entry to get PIO address
>   bus/pci: support MMIO in PCI ioport accessors
> 
>  drivers/bus/pci/linux/pci.c     |  81 ---------------
>  drivers/bus/pci/linux/pci_uio.c | 214 ++++++++++++++++++++++++++++------------
>  2 files changed, 150 insertions(+), 145 deletions(-)
> 
> --
> 1.8.3.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device
  2021-06-20 15:02 ` [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device Xueming(Steven) Li
@ 2021-06-22  7:38   ` Thomas Monjalon
  0 siblings, 0 replies; 5+ messages in thread
From: Thomas Monjalon @ 2021-06-22  7:38 UTC (permalink / raw)
  To: 谢华伟(此时此刻),
	Xueming(Steven) Li
  Cc: stable, Luca Boccassi, Kevin Traynor, david.marchand,
	maxime.coquelin, ferruh.yigit, grive, heqing.zhu,
	christian.ehrhardt

20/06/2021 17:02, Xueming(Steven) Li:
> Hi Huawei,
> 
> Thanks for the backport! Here is the backport policy:
> https://doc.dpdk.org/guides/contributing/stable.html#what-changes-should-be-backported
> 
> The patch set is small enough, but it changed the public PCI component, a little risky IMHO.

And more important, it is clearly a new feature.
I don't think it should be backported, otherwise it means we backport everything.


> BTW, the patch subject seems different than upstream version, why not use upstream patch?
> We are expecting a line of "[ upstream commit <id> ] at begging of path commit log.
> 
> Best Regards,
> Xueming
> 
> > -----Original Message-----
> > From: stable <stable-bounces@dpdk.org> On Behalf Of 谢华伟(此时此刻)
> > Sent: Thursday, June 17, 2021 2:55 PM
> > To: stable@dpdk.org
> > Cc: david.marchand@redhat.com; maxime.coquelin@redhat.com; ferruh.yigit@intel.com; grive@u256.net; heqing.zhu@intel.com; 谢
> > 华伟(此时此刻) <huawei.xhw@alibaba-inc.com>
> > Subject: [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device
> > 
> > virtio PMD assumes legacy device only supports PIO(port-mapped) BAR resource. This is wrong. As we need to create lots of devices,
> > adn PIO resource on x86 is very limited, we expose MMIO(memory-mapped I/O) BAR.
> > 
> > Kernel supports both PIO and MMIO BAR for legacy virtio-pci device, and for all other pci devices. This patchset handles different type
> > of BAR in the similar way.
> > 
> > In previous implementation, under igb_uio driver we get PIO address from igb_uio sysfs entry; with uio_pci_generic, we get PIO
> > address from /proc/ioports for x86, and for other ARCHs, we get PIO address from standard PCI sysfs entry. For PIO/MMIO RW, there
> > is different path for different drivers and arch.
> > 
> > All of the above is too much twisted. This patchset unifies the way to get both PIO and MMIO address for different driver and ARCHs,
> > all from standard resource attr under pci sysfs. This is most generic.
> > 
> > We distinguish PIO and MMIO by their address range like how kernel does.
> > It is ugly but works.
> > 
> > huawei xie (2):
> >   bus/pci: use PCI standard sysfs entry to get PIO address
> >   bus/pci: support MMIO in PCI ioport accessors
> > 
> >  drivers/bus/pci/linux/pci.c     |  81 ---------------
> >  drivers/bus/pci/linux/pci_uio.c | 214 ++++++++++++++++++++++++++++------------
> >  2 files changed, 150 insertions(+), 145 deletions(-)
> > 
> > --
> > 1.8.3.1
> 
> 






^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-06-22  7:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-17  6:54 [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device 谢华伟(此时此刻)
2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 1/2] bus/pci: use PCI standard sysfs entry to get PIO address 谢华伟(此时此刻)
2021-06-17  6:54 ` [dpdk-stable] [PATCH 20.11 2/2] bus/pci: support MMIO in PCI ioport accessors 谢华伟(此时此刻)
2021-06-20 15:02 ` [dpdk-stable] [PATCH 20.11 0/2] support both PIO and MMIO BAR for legacy virito device Xueming(Steven) Li
2021-06-22  7:38   ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).