PERFORCE change 82647 for review

Eric Anholt anholt at FreeBSD.org
Fri Aug 26 21:30:03 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=82647

Change 82647 by anholt at anholt_leguin on 2005/08/26 21:29:30

	MF DRI CVS 2005-08-26 #2: Resource allocation fix.

Affected files ...

.. //depot/projects/drm-merge-vendor/sys/dev/drm/drmP.h#5 edit
.. //depot/projects/drm-merge-vendor/sys/dev/drm/drm_bufs.c#4 edit
.. //depot/projects/drm-merge-vendor/sys/dev/drm/drm_drv.c#5 edit

Differences ...

==== //depot/projects/drm-merge-vendor/sys/dev/drm/drmP.h#5 (text+ko) ====

@@ -686,6 +686,9 @@
 	unsigned use_mtrr :1;
 };
 
+/* Length for the array of resource pointers for drm_get_resource_*. */
+#define DRM_MAX_PCI_RESOURCE	3
+
 /** 
  * DRM device functions structure
  */
@@ -748,6 +751,10 @@
 #endif
 	void		  *irqh;	/* Handle from bus_setup_intr      */
 
+	/* Storage of resource pointers for drm_get_resource_* */
+	struct resource   *pcir[DRM_MAX_PCI_RESOURCE];
+	int		  pcirid[DRM_MAX_PCI_RESOURCE];
+
 	int		  pci_domain;
 	int		  pci_bus;
 	int		  pci_slot;

==== //depot/projects/drm-merge-vendor/sys/dev/drm/drm_bufs.c#4 (text+ko) ====

@@ -31,6 +31,8 @@
  *
  */
 
+#include "dev/pci/pcireg.h"
+
 #include "drmP.h"
 
 /*
@@ -49,46 +51,45 @@
 	return order;
 }
 
-unsigned long drm_get_resource_start(drm_device_t *dev, unsigned int resource)
+/* Allocation of PCI memory resources (framebuffer, registers, etc.) for
+ * drm_get_resource_*.  Note that they are not RF_ACTIVE, so there's no virtual
+ * address for accessing them.  Cleaned up at lastclose.
+ */
+static int drm_alloc_resource(drm_device_t *dev, int resource)
 {
-	struct resource *bsr;
-	unsigned long offset;
+	if (resource >= DRM_MAX_PCI_RESOURCE) {
+		DRM_ERROR("Resource %d too large\n", resource);
+		return 1;
+	}
+	if (dev->pcir[resource] != NULL)
+		return 0;
 
-	resource = resource * 4 + 0x10;
+	dev->pcirid[resource] = PCIR_BAR(resource);
+	dev->pcir[resource] = bus_alloc_resource_any(dev->device,
+	    SYS_RES_MEMORY, &dev->pcirid[resource], RF_SHAREABLE);
 
-	bsr = bus_alloc_resource_any(dev->device, SYS_RES_MEMORY, &resource,
-	    RF_ACTIVE | RF_SHAREABLE);
-	if (bsr == NULL) {
+	if (dev->pcir[resource] == NULL) {
 		DRM_ERROR("Couldn't find resource 0x%x\n", resource);
-		return 0;
+		return 1;
 	}
 
-	offset = rman_get_start(bsr);
+	return 0;
+}
 
-	bus_release_resource(dev->device, SYS_RES_MEMORY, resource, bsr);
+unsigned long drm_get_resource_start(drm_device_t *dev, unsigned int resource)
+{
+	if (drm_alloc_resource(dev, resource) != 0)
+		return 0;
 
-	return offset;
+	return rman_get_start(dev->pcir[resource]);
 }
 
 unsigned long drm_get_resource_len(drm_device_t *dev, unsigned int resource)
 {
-	struct resource *bsr;
-	unsigned long len;
+	if (drm_alloc_resource(dev, resource) != 0)
+		return 0;
 
-	resource = resource * 4 + 0x10;
-
-	bsr = bus_alloc_resource_any(dev->device, SYS_RES_MEMORY, &resource,
-	    RF_ACTIVE | RF_SHAREABLE);
-	if (bsr == NULL) {
-		DRM_ERROR("Couldn't find resource 0x%x\n", resource);
-		return ENOMEM;
-	}
-
-	len = rman_get_size(bsr);
-
-	bus_release_resource(dev->device, SYS_RES_MEMORY, resource, bsr);
-
-	return len;
+	return rman_get_size(dev->pcir[resource]);
 }
 
 int drm_addmap(drm_device_t * dev, unsigned long offset, unsigned long size,

==== //depot/projects/drm-merge-vendor/sys/dev/drm/drm_drv.c#5 (text+ko) ====

@@ -474,6 +474,13 @@
 	TAILQ_FOREACH_SAFE(map, &dev->maplist, link, mapsave) {
 		drm_rmmap(dev, map);
 	}
+	for (i = 0; i < DRM_MAX_PCI_RESOURCE; i++) {
+		if (dev->pcir[i] == NULL)
+			continue;
+		bus_release_resource(dev->device, SYS_RES_MEMORY,
+		    dev->pcirid[i], dev->pcir[i]);
+		dev->pcir[i] = NULL;
+	}
 
 	drm_dma_takedown(dev);
 	if ( dev->lock.hw_lock ) {


More information about the p4-projects mailing list