Catch FreeBSD up to the pcie gart changes. Required minor modification to
authorEric Anholt <anholt@freebsd.org>
Tue, 8 Nov 2005 02:38:01 +0000 (02:38 +0000)
committerEric Anholt <anholt@freebsd.org>
Tue, 8 Nov 2005 02:38:01 +0000 (02:38 +0000)
    radeon_cp.c to use a drm_local_map_t-type mapping (drm_core_ioremap
    rather than drm_ioremap), which contains private device mapping
    information on BSD. I also changed the ati_pcigart interface to use
    "void *" for pointers to kva rather than "unsigned long". While PCIGART
    support appears to be broken on FreeBSD currently, I think this is not
    new, and BusType PCI remains working on my r100 in Linux.

bsd-core/ati_pcigart.c
bsd-core/drmP.h
linux-core/ati_pcigart.c
linux-core/drmP.h
shared-core/r128_cce.c
shared-core/radeon_cp.c

index 71b08d6..d48d0a8 100644 (file)
 #define ATI_MAX_PCIGART_PAGES          8192    /* 32 MB aperture, 4K pages */
 #define ATI_PCIGART_TABLE_SIZE         32768
 
-int drm_ati_pcigart_init(drm_device_t *dev, unsigned long *addr,
-                        dma_addr_t *bus_addr, int is_pcie)
+int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
 {
        unsigned long pages;
-       u32 *pci_gart = 0, page_base;
+       u32 *pci_gart = NULL, page_base;
        int i, j;
 
-       *addr = 0;
-       *bus_addr = 0;
-
        if (dev->sg == NULL) {
                DRM_ERROR( "no scatter/gather memory!\n" );
                return 0;
        }
 
-       dev->sg->dmah = drm_pci_alloc(dev, ATI_PCIGART_TABLE_SIZE, 0,
-           0xfffffffful);
-       if (dev->sg->dmah == NULL) {
-               DRM_ERROR("cannot allocate PCI GART table!\n");
-               return 0;
+       if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
+               /* GART table in system memory */
+               dev->sg->dmah = drm_pci_alloc(dev, ATI_PCIGART_TABLE_SIZE, 0,
+                   0xfffffffful);
+               if (dev->sg->dmah == NULL) {
+                       DRM_ERROR("cannot allocate PCI GART table!\n");
+                       return 0;
+               }
+       
+               gart_info->addr = (void *)dev->sg->dmah->vaddr;
+               gart_info->bus_addr = dev->sg->dmah->busaddr;
+               pci_gart = (u32 *)dev->sg->dmah->vaddr;
+       } else {
+               /* GART table in framebuffer memory */
+               pci_gart = gart_info->addr;
        }
-
-       *addr = (long)dev->sg->dmah->vaddr;
-       *bus_addr = dev->sg->dmah->busaddr;
-       pci_gart = (u32 *)dev->sg->dmah->vaddr;
-
+       
        pages = DRM_MIN(dev->sg->pages, ATI_MAX_PCIGART_PAGES);
 
        bzero(pci_gart, ATI_PCIGART_TABLE_SIZE);
@@ -71,12 +73,9 @@ int drm_ati_pcigart_init(drm_device_t *dev, unsigned long *addr,
                page_base = (u32) dev->sg->busaddr[i];
 
                for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
-                       if (is_pcie) {
-                               *pci_gart = (cpu_to_le32(page_base)>>8) | 0xc;
-                               DRM_DEBUG("PCIE: %d %08X %08X to %p\n", i,
-                                   page_base, (cpu_to_le32(page_base)>>8)|0xc,
-                                   pci_gart);
-                       } else
+                       if (gart_info->is_pcie)
+                               *pci_gart = (cpu_to_le32(page_base) >> 8) | 0xc;
+                       else
                                *pci_gart = cpu_to_le32(page_base);
                        pci_gart++;
                        page_base += ATI_PCIGART_PAGE_SIZE;
@@ -88,8 +87,7 @@ int drm_ati_pcigart_init(drm_device_t *dev, unsigned long *addr,
        return 1;
 }
 
-int drm_ati_pcigart_cleanup(drm_device_t *dev, unsigned long addr,
-                           dma_addr_t bus_addr)
+int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
 {
        if (dev->sg == NULL) {
                DRM_ERROR( "no scatter/gather memory!\n" );
index b98049c..dda1256 100644 (file)
@@ -622,6 +622,18 @@ typedef struct drm_vbl_sig {
        int             pid;
 } drm_vbl_sig_t;
 
+/* location of GART table */
+#define DRM_ATI_GART_MAIN 1
+#define DRM_ATI_GART_FB   2
+
+typedef struct ati_pcigart_info {
+       int gart_table_location;
+       int is_pcie;
+       void *addr;
+       dma_addr_t bus_addr;
+       drm_local_map_t mapping;
+} drm_ati_pcigart_info;
+
 struct drm_driver_info {
        int     (*load)(struct drm_device *, unsigned long flags);
        int     (*firstopen)(struct drm_device *);
@@ -907,10 +919,10 @@ extern int                drm_sysctl_cleanup(drm_device_t *dev);
 #endif /* __FreeBSD__ */
 
 /* ATI PCIGART support (ati_pcigart.c) */
-int    drm_ati_pcigart_init(drm_device_t *dev, unsigned long *addr,
-                            dma_addr_t *bus_addr, int is_pcie);
-int    drm_ati_pcigart_cleanup(drm_device_t *dev, unsigned long addr,
-                               dma_addr_t bus_addr);
+int    drm_ati_pcigart_init(drm_device_t *dev,
+                            drm_ati_pcigart_info *gart_info);
+int    drm_ati_pcigart_cleanup(drm_device_t *dev,
+                               drm_ati_pcigart_info *gart_info);
 
 /* Locking IOCTL support (drm_drv.c) */
 int    drm_lock(DRM_IOCTL_ARGS);
index 7555702..404c5b7 100644 (file)
@@ -52,7 +52,7 @@
 # define ATI_MAX_PCIGART_PAGES         8192    /**< 32 MB aperture, 4K pages */
 # define ATI_PCIGART_PAGE_SIZE         4096    /**< PCI GART page size */
 
-static unsigned long drm_ati_alloc_pcigart_table(void)
+static void *drm_ati_alloc_pcigart_table(void)
 {
        unsigned long address;
        struct page *page;
@@ -72,29 +72,29 @@ static unsigned long drm_ati_alloc_pcigart_table(void)
        }
 
        DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address);
-       return address;
+       return (void *)address;
 }
 
-static void drm_ati_free_pcigart_table(unsigned long address)
+static void drm_ati_free_pcigart_table(void *address)
 {
        struct page *page;
        int i;
        DRM_DEBUG("%s\n", __FUNCTION__);
 
-       page = virt_to_page(address);
+       page = virt_to_page((unsigned long)address);
 
        for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) {
                __put_page(page);
                ClearPageReserved(page);
        }
 
-       free_pages(address, ATI_PCIGART_TABLE_ORDER);
+       free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER);
 }
 
 int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info *gart_info)
 {
        drm_sg_mem_t *entry = dev->sg;
-       unsigned long address = 0;
+       void *address = NULL;
        unsigned long pages;
        u32 *pci_gart, page_base, bus_address = 0;
        int i, j, ret = 0;
@@ -119,7 +119,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info *gart_info)
                        goto done;
                }
                
-               bus_address = pci_map_single(dev->pdev, (void *)address,
+               bus_address = pci_map_single(dev->pdev, address,
                                             ATI_PCIGART_TABLE_PAGES * PAGE_SIZE,
                                             PCI_DMA_TODEVICE);
                if (bus_address == 0) {
@@ -133,7 +133,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info *gart_info)
        {
                address = gart_info->addr;
                bus_address = gart_info->bus_addr;
-               DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n", bus_address, address);
+               DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n", bus_address, (unsigned long)address);
        }
 
        pci_gart = (u32 *) address;
@@ -152,7 +152,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info *gart_info)
                if (entry->busaddr[i] == 0) {
                        DRM_ERROR("unable to map PCIGART pages!\n");
                        drm_ati_pcigart_cleanup(dev, gart_info);
-                       address = 0;
+                       address = NULL;
                        bus_address = 0;
                        goto done;
                }
index c0ac922..7b344c7 100644 (file)
@@ -529,8 +529,9 @@ typedef struct drm_vbl_sig {
 typedef struct ati_pcigart_info {
        int gart_table_location;
        int is_pcie;
-       unsigned long addr;
+       void *addr;
        dma_addr_t bus_addr;
+       drm_local_map_t mapping;
 } drm_ati_pcigart_info;
 
 /**
index cb84fa8..06880e0 100644 (file)
@@ -559,7 +559,8 @@ static int r128_do_init_cce(drm_device_t * dev, drm_r128_init_t * init)
        if (dev_priv->is_pci) {
 #endif
                dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
-               dev_priv->gart_info.addr = dev_priv->gart_info.bus_addr = 0;
+               dev_priv->gart_info.addr = NULL;
+               dev_priv->gart_info.bus_addr = 0;
                dev_priv->gart_info.is_pcie = 0;
                if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
                        DRM_ERROR("failed to init PCI GART!\n");
index 9b5c9a8..30f6373 100644 (file)
@@ -1541,16 +1541,20 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
                /* if we have an offset set from userspace */
                if (dev_priv->pcigart_offset) {
                        dev_priv->gart_info.bus_addr = dev_priv->pcigart_offset + dev_priv->fb_location;
-                       dev_priv->gart_info.addr = (unsigned long)drm_ioremap(dev_priv->gart_info.bus_addr, RADEON_PCIGART_TABLE_SIZE, dev);
+                       dev_priv->gart_info.mapping.offset = dev_priv->gart_info.bus_addr;
+                       dev_priv->gart_info.mapping.size = RADEON_PCIGART_TABLE_SIZE;
+                       drm_core_ioremap(&dev_priv->gart_info.mapping, dev);
+                       dev_priv->gart_info.addr = dev_priv->gart_info.mapping.handle;
 
                        dev_priv->gart_info.is_pcie = !!(dev_priv->flags & CHIP_IS_PCIE);
                        dev_priv->gart_info.gart_table_location = DRM_ATI_GART_FB;
                        
-                       DRM_DEBUG("Setting phys_pci_gart to %08lX %08lX\n", dev_priv->gart_info.addr, dev_priv->pcigart_offset);
+                       DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n", dev_priv->gart_info.addr, dev_priv->pcigart_offset);
                }
                else {
                        dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
-                       dev_priv->gart_info.addr = dev_priv->gart_info.bus_addr= 0;
+                       dev_priv->gart_info.addr = NULL;
+                       dev_priv->gart_info.bus_addr = 0;
                        if (dev_priv->flags & CHIP_IS_PCIE)
                        {
                                DRM_ERROR("Cannot use PCI Express without GART in FB memory\n");
@@ -1618,7 +1622,7 @@ static int radeon_do_cleanup_cp(drm_device_t * dev)
 
                if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB)
                {
-                       drm_ioremapfree((void *)dev_priv->gart_info.addr, RADEON_PCIGART_TABLE_SIZE, dev);
+                       drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
                        dev_priv->gart_info.addr = 0;
                }
        }