From 86607f1a501b4ba353e451fa731e1f9cbf38df5a Mon Sep 17 00:00:00 2001
From: Bernardo Innocenti <bernie@codewiz.org>
Date: Tue, 27 Nov 2007 11:54:56 +0100
Subject: [PATCH] Convert to libpciaccess
Organization: One Laptop Per Child

This patch converts amd_drv to the new PCI API.
Backwards compatibility with the old API is being temporarily maintained.
---
 src/amd_gx_driver.c |   45 +++++++++++++++++--
 src/amd_lx_driver.c |  120 +++++++++++++++++++++++++++++++++++++--------------
 src/amd_lx_exa.c    |    2 +-
 src/cimarron.c      |    6 +-
 src/durango.c       |    8 ++--
 5 files changed, 136 insertions(+), 45 deletions(-)

diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c
index f2a9bf0..0947f56 100644
--- a/src/amd_gx_driver.c
+++ b/src/amd_gx_driver.c
@@ -48,6 +48,13 @@
 #include "fb.h"
 #include "randrstr.h"
 
+#ifdef XSERVER_LIBPCIACCESS
+# include <pciaccess.h>
+  typedef struct pci_device pci_device_t;
+#else
+  typedef pciVideoRec pci_device_t;
+#endif
+
 #include "amd.h"
 #include "gfx_defs.h"
 #include "gfx_regs.h"
@@ -328,7 +335,33 @@ GXMapMem(ScrnInfoPtr pScrni)
   GeodeRec *pGeode = GEODEPTR(pScrni);
   int index = pScrni->scrnIndex;
 
-  pciVideoRec *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index);
+  pci_device_t *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index);
+
+#ifdef XSERVER_LIBPCIACCESS
+  int err;
+
+  if ((err = pci_device_map_range(pci,
+       pci->regions[2].base_addr, pci->regions[2].size,
+	   PCI_DEV_MAP_FLAG_WRITABLE, (void **)&gfx_virt_regptr))
+   || (err = pci_device_map_range(pci,
+       pci->regions[1].base_addr, pci->regions[1].size,
+	   PCI_DEV_MAP_FLAG_WRITABLE, (void **)&gfx_virt_gpptr))
+   || (err = pci_device_map_range(pci,
+       pci->regions[3].base_addr, pci->regions[3].size,
+	   PCI_DEV_MAP_FLAG_WRITABLE, (void **)&gfx_virt_vidptr))
+   || (err = pci_device_map_range(pci,
+       pci->regions[0].base_addr, pGeode->FBAvail,
+	   PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE, (void **)&gfx_virt_fbptr)))
+  {
+    xf86DrvMsg(index, X_ERROR, "Unable to map PCI ranges: %s (%d)\n",
+	    strerror (err), err);
+    return FALSE;
+  }
+
+  pci_device_map_range(pci, 0xF0000, 0x10000,
+      PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE, (void **)&XpressROMPtr);
+
+#else /* !XSERVER_LIBPCIACCESS */
 
   gfx_virt_regptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO,
 						   pci->memBase[2], pci->size[2]);
@@ -342,16 +375,18 @@ GXMapMem(ScrnInfoPtr pScrni)
   gfx_virt_fbptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_FRAMEBUFFER,
 						  pci->memBase[0], pGeode->FBAvail);
 
-  gfx_gx2_scratch_base = pGeode->FBAvail - 0x4000;
-
   XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000);
 
-  pGeode->FBBase = gfx_virt_fbptr;
-
   if ((!gfx_virt_regptr) || (!gfx_virt_gpptr) ||
       (!gfx_virt_vidptr) || (!gfx_virt_fbptr))
     return FALSE;
 
+#endif /* !XSERVER_LIBPCIACCESS */
+
+  gfx_gx2_scratch_base = pGeode->FBAvail - 0x4000;
+
+  pGeode->FBBase = gfx_virt_fbptr;
+
   if (!pGeode->NoAccel && pGeode->useEXA)
     pGeode->pExa->memoryBase = pGeode->FBBase;
 
diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c
index f528903..9552137 100644
--- a/src/amd_lx_driver.c
+++ b/src/amd_lx_driver.c
@@ -61,8 +61,19 @@
 #include "miscstruct.h"
 #include "micmap.h"
 #include "vbe.h"
-#include "fb.h"
 #include "randrstr.h"
+
+#ifdef XSERVER_LIBPCIACCESS
+  #include <pciaccess.h>
+  typedef struct pci_device pci_device_t;
+  #define PCI_MEM_BASE(_pcidev, _b) ((_pcidev)->regions[(_b)].base_addr)
+  #define PCI_DEV_DEV(_pcidev)      ((_pcidev)->dev)
+#else
+  typedef pciVideoRec pci_device_t;
+  #define PCI_MEM_BASE(_pcidev, _b) ((_pcidev)->memBase[(_b)])
+  #define PCI_DEV_DEV(_pcidev)      ((_pcidev)->device)
+#endif
+
 #include "cim_defs.h"
 #include "cim_regs.h"
 #include "amd.h"
@@ -400,10 +411,46 @@ LXMapMem(ScrnInfoPtr pScrni)
     unsigned long cmd_bfr_phys;
     PCITAG tag;
 
-    pciVideoRec *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index);
-    tag = pciTag(pci->bus, pci->device, pci->func);
+    pci_device_t *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index);
+
+    tag = pciTag(pci->bus, PCI_DEV_DEV(pci), pci->func);
+
+#ifdef XSERVER_LIBPCIACCESS
+    int err;
+
+    if ((err = pci_device_map_range(pci,
+         pci->regions[1].base_addr, LX_GP_REG_SIZE,
+	     PCI_DEV_MAP_FLAG_WRITABLE,
+		 (void **)&cim_gp_ptr))
+     || (err = pci_device_map_range(pci,
+         pci->regions[2].base_addr, LX_VG_REG_SIZE,
+	     PCI_DEV_MAP_FLAG_WRITABLE,
+		 (void **)&cim_vg_ptr))
+     || (err = pci_device_map_range(pci,
+         pci->regions[3].base_addr, LX_VID_REG_SIZE,
+	     PCI_DEV_MAP_FLAG_WRITABLE,
+		 (void **)&cim_vid_ptr))
+     || (err = pci_device_map_range(pci,
+         pci->regions[4].base_addr, LX_VIP_REG_SIZE,
+	     PCI_DEV_MAP_FLAG_WRITABLE,
+		 (void **)&cim_vip_ptr))
+     || (err = pci_device_map_range(pci,
+         pci->regions[0].base_addr, pGeode->FBAvail + CIM_CMD_BFR_SZ,
+	     PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE,
+		 (void **)&cim_fb_ptr)))
+    {
+        xf86DrvMsg(index, X_ERROR, "Unable to map PCI ranges: %s (%d)\n",
+	        strerror (err), err);
+        return FALSE;
+    }
+
+	pci_device_map_range(pci, 0xF0000, 0x10000,
+		PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE,
+		(void **)&XpressROMPtr);
+
+#else /* !XSERVER_LIBPCIACCESS */
 
-    cim_gp_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO,
+	cim_gp_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO,
 						tag, pci->memBase[1], LX_GP_REG_SIZE);
 
     cim_vg_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO,
@@ -411,28 +458,31 @@ LXMapMem(ScrnInfoPtr pScrni)
 
     cim_vid_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO,
 						 tag, pci->memBase[3], LX_VID_REG_SIZE);
-    
+
     cim_vip_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO,
 						 tag, pci->memBase[4], LX_VIP_REG_SIZE);
 
     cim_fb_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_FRAMEBUFFER,
 						tag, pci->memBase[0], pGeode->FBAvail + CIM_CMD_BFR_SZ);
 
+    if (!cim_gp_ptr || !cim_vg_ptr || !cim_vid_ptr || !cim_fb_ptr ||
+	!cim_vip_ptr)
+      return FALSE;
+
+    XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000);
+
+#endif /* !XSERVER_LIBPCIACCESS */
+
     if (pScrni->memPhysBase == 0)
-      pScrni->memPhysBase = pci->memBase[0];
+      pScrni->memPhysBase = PCI_MEM_BASE(pci, 0);
 
-    cmd_bfr_phys = pci->memBase[0] + pGeode->CmdBfrOffset;
+    cmd_bfr_phys = PCI_MEM_BASE(pci, 0) + pGeode->CmdBfrOffset;
     cim_cmd_base_ptr = cim_fb_ptr + pGeode->CmdBfrOffset;
 
-    if (!cim_gp_ptr || !cim_vg_ptr || !cim_vid_ptr || !cim_fb_ptr ||
-	!cim_vip_ptr)
-      return FALSE;
 
-    gp_set_frame_buffer_base(pci->memBase[0], pGeode->FBAvail);
+    gp_set_frame_buffer_base(PCI_MEM_BASE(pci, 0), pGeode->FBAvail);
     gp_set_command_buffer_base(cmd_bfr_phys, 0, pGeode->CmdBfrSize);
 
-    XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000);
-
     pGeode->FBBase = cim_fb_ptr;
 
     if (!pGeode->NoAccel)
@@ -471,39 +521,45 @@ LXPreInit(ScrnInfoPtr pScrni, int flags)
 {
     GeodePtr pGeode;
     ClockRangePtr GeodeClockRange;
+    EntityInfoPtr pEnt;
     OptionInfoRec *GeodeOptions = &LX_GeodeOptions[0];
     rgb defaultWeight = { 0, 0, 0 };
     int modecnt;
     char *s, *panelgeo = NULL;
+    Bool useVGA;
 
-    pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1);
+    if (pScrni->numEntities != 1)
+      return FALSE;
 
-    if (pGeode == NULL)
-	return FALSE;
+    pEnt = xf86GetEntityInfo(pScrni->entityList[0]);
 
-    /* Probe for VGA */
-    pGeode->useVGA = TRUE;
-    pGeode->VGAActive = FALSE;
+    if (pEnt->resources)
+      return FALSE;
+
+    useVGA = LXCheckVGA(pScrni);
 
-    if (xf86LoadSubModule(pScrni, "vgahw")) {
-      if (vgaHWGetHWRec(pScrni)) 
-	pGeode->useVGA = LXCheckVGA(pScrni);
+    if (flags & PROBE_DETECT) {
+	if (useVGA)
+		GeodeProbeDDC(pScrni, pEnt->index);
+
+	return TRUE;
     }
 
-    if (pGeode->useVGA)
-      pGeode->vesa = xcalloc(sizeof(VESARec), 1);
+    pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1);
 
-    if (pScrni->numEntities != 1)
-	return FALSE;
+    if (pGeode == NULL)
+      return FALSE;
 
-    pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]);
+    pGeode->useVGA = useVGA;
+    pGeode->VGAActive = FALSE;
+    pGeode->pEnt = pEnt;
 
-    if (pGeode->pEnt->resources)
-	return FALSE;
+    if (pGeode->useVGA) {
+	if (!xf86LoadSubModule(pScrni, "vgahw") ||
+		!vgaHWGetHWRec(pScrni))
+		pGeode->useVGA = FALSE;
 
-    if (pGeode->useVGA && (flags & PROBE_DETECT)) {
-	    GeodeProbeDDC(pScrni, pGeode->pEnt->index);
-	    return TRUE;
+        pGeode->vesa = xcalloc(sizeof(VESARec), 1);
     }
 
     cim_rdmsr = LXReadMSR;
diff --git a/src/amd_lx_exa.c b/src/amd_lx_exa.c
index 17972ac..387bcb7 100644
--- a/src/amd_lx_exa.c
+++ b/src/amd_lx_exa.c
@@ -414,7 +414,7 @@ struct blend_ops_t {
   { CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE },
   { },
   /* PictOpOverReverse */
-  { CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST }, 
+  { CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_DEST }, 
   { },
   /* PictOpIn */
   { CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_SOURCE }, { },
diff --git a/src/cimarron.c b/src/cimarron.c
index 65df4d2..c3aa8c2 100644
--- a/src/cimarron.c
+++ b/src/cimarron.c
@@ -166,13 +166,13 @@
 /* registers of their respective blocks.                                */
 /*----------------------------------------------------------------------*/
 
-unsigned char *cim_gp_ptr = (unsigned char *)0;
-unsigned char *cim_fb_ptr = (unsigned char *)0;
+unsigned char *cim_gp_ptr =  (unsigned char *)0;
+unsigned char *cim_fb_ptr =  (unsigned char *)0;
 unsigned char *cim_cmd_base_ptr = (unsigned char *)0;
 unsigned char *cim_cmd_ptr = (unsigned char *)0;
 unsigned char *cim_vid_ptr = (unsigned char *)0;
 unsigned char *cim_vip_ptr = (unsigned char *)0;
-unsigned char *cim_vg_ptr = (unsigned char *)0;
+unsigned char *cim_vg_ptr =  (unsigned char *)0;
 
 /* Define hooks for reading and writing MSRs - this is a major hack
  * to share the MSR code with the GX code */
diff --git a/src/durango.c b/src/durango.c
index adc5565..119459f 100644
--- a/src/durango.c
+++ b/src/durango.c
@@ -89,14 +89,14 @@
 #include "gfx_defs.h"
 
 unsigned char *gfx_virt_regptr = (unsigned char *)0x40000000;
-unsigned char *gfx_virt_fbptr = (unsigned char *)0x40800000;
+unsigned char *gfx_virt_fbptr  = (unsigned char *)0x40800000;
 unsigned char *gfx_virt_vidptr = (unsigned char *)0x40010000;
 unsigned char *gfx_virt_vipptr = (unsigned char *)0x40015000;
-unsigned char *gfx_virt_spptr = (unsigned char *)0x40000000;
-unsigned char *gfx_virt_gpptr = (unsigned char *)0x40000000;
+unsigned char *gfx_virt_spptr  = (unsigned char *)0x40000000;
+unsigned char *gfx_virt_gpptr  = (unsigned char *)0x40000000;
 
 unsigned char *gfx_phys_regptr = (unsigned char *)0x40000000;
-unsigned char *gfx_phys_fbptr = (unsigned char *)0x40800000;
+unsigned char *gfx_phys_fbptr  = (unsigned char *)0x40800000;
 unsigned char *gfx_phys_vidptr = (unsigned char *)0x40010000;
 unsigned char *gfx_phys_vipptr = (unsigned char *)0x40015000;
 
-- 
1.5.3.3

