PERFORCE change 82648 for review
Eric Anholt
anholt at FreeBSD.org
Fri Aug 26 21:31:05 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=82648
Change 82648 by anholt at anholt_leguin on 2005/08/26 21:30:43
MF DRI vendor branch 2005-08-26 (resource allocation fix, 1 compile fix)
Affected files ...
.. //depot/projects/drm-merge/sys/dev/drm/drmP.h#8 integrate
.. //depot/projects/drm-merge/sys/dev/drm/drm_bufs.c#7 integrate
.. //depot/projects/drm-merge/sys/dev/drm/drm_drv.c#6 integrate
Differences ...
==== //depot/projects/drm-merge/sys/dev/drm/drmP.h#8 (text+ko) ====
@@ -687,6 +687,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
*/
@@ -749,6 +752,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/sys/dev/drm/drm_bufs.c#7 (text+ko) ====
@@ -32,6 +32,8 @@
* $FreeBSD$
*/
+#include "dev/pci/pcireg.h"
+
#include "dev/drm/drmP.h"
/*
@@ -50,46 +52,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/sys/dev/drm/drm_drv.c#6 (text+ko) ====
@@ -34,7 +34,7 @@
#include "dev/drm/drmP.h"
#include "dev/drm/drm.h"
-#include "drm_sarea.h"
+#include "dev/drm/drm_sarea.h"
int drm_debug_flag = 0;
@@ -475,6 +475,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