[Spice-devel] [qxl] Use pci_io_write8 instead of outb

Christophe Fergeau cfergeau at redhat.com
Fri May 15 00:31:20 PDT 2015


From: Adam Jackson <ajax at redhat.com>

This ensures better portability as some arches (eg aarch64) don't have
outb.
On linux pci_io_* try to open the sysfs map file corresponding to the
I/O port range, which the kernel translates arch-appropriately.  If
there is no such file then it'll try to use port instructions if that's
a thing the architecture has.  So you only need one path, pciaccess
exists to get the portability right for you.

https://bugzilla.redhat.com/show_bug.cgi?id=1201877
---
Hey,

This patch was suggested by Adam as a way to fix the build failure reported in rhbz#1201877
It hasn't been runtime tested on aarch64, but it builds there. I've ran some
quick tests on x86, and things are fine there.

Christophe


 src/qxl.h        | 3 ++-
 src/qxl_driver.c | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/qxl.h b/src/qxl.h
index f46bc58..ff55604 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -273,6 +273,7 @@ struct _qxl_screen_t
 #ifndef XSPICE
 #ifdef XSERVER_LIBPCIACCESS
     struct pci_device *		pci;
+    struct pci_io_handle *	io;
 #else
     pciVideoPtr			pci;
     PCITAG			pci_tag;
@@ -631,7 +632,7 @@ void ioport_write(qxl_screen_t *qxl, uint32_t io_port, uint32_t val);
 #else
 static inline void ioport_write(qxl_screen_t *qxl, int port, int val)
 {
-    outb(qxl->io_base + port, val);
+    pci_io_write8(qxl->io, port, val);
 }
 #endif
 
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index 942067f..ce0a88e 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -219,6 +219,8 @@ unmap_memory_helper (qxl_screen_t *qxl)
 	pci_device_unmap_range (qxl->pci, qxl->vram, qxl->pci->regions[1].size);
     if (qxl->rom)
 	pci_device_unmap_range (qxl->pci, qxl->rom, qxl->pci->regions[2].size);
+    if (qxl->io)
+	pci_device_close_io (qxl->pci, qxl->io);
 #else
     if (qxl->ram)
 	xf86UnMapVidMem (scrnIndex, qxl->ram, (1 << qxl->pci->size[0]));
@@ -251,6 +253,9 @@ map_memory_helper (qxl_screen_t *qxl)
                           qxl->pci->regions[2].size, 0,
                           (void **)&qxl->rom);
     
+    qxl->io = pci_device_open_io(qxl->pci,
+                                qxl->pci->regions[3].base_addr,
+                                qxl->pci->regions[3].size);
     qxl->io_base = qxl->pci->regions[3].base_addr;
 #else
     qxl->ram = xf86MapPciMem (scrnIndex, VIDMEM_FRAMEBUFFER,
-- 
2.4.0



More information about the Spice-devel mailing list