]PATCH 2/3] Do not ignore resources being registered

Tiago Vignatti vignatti at freedesktop.org
Sun May 3 19:12:33 PDT 2009


In post-pciaccess Xorg, we were ignoring the lists of resources 
registered. Let the userspace application control it again and put the 
application aware of multiple PCI resources.

Signed-off-by: Tiago Vignatti <vignatti at freedesktop.org>
---
  hw/xfree86/common/xf86Bus.c    |   26 ++++++++++++++++++++++++--
  hw/xfree86/common/xf86pciBus.c |   32 ++++++++++++++++++++++++++++++++
  hw/xfree86/common/xf86pciBus.h |    1 +
  3 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index 8040f58..87d97f0 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -1316,6 +1316,24 @@ xf86ConvertListToHost(int entityIndex, resPtr list)
      }
  }

+static resList
+xf86GetResourcesImplicitly(int entityIndex)
+{
+    if (entityIndex >= xf86NumEntities) return NULL;
+
+    switch (xf86Entities[entityIndex]->bus.type) {
+    case BUS_ISA:
+    case BUS_NONE:
+    case BUS_SBUS:
+    return NULL;
+    case BUS_PCI:
+    return GetImplicitPciResources(entityIndex);
+    case BUS_last:
+    return NULL;
+    }
+    return NULL;
+}
+
  /*
   * xf86RegisterResources() -- attempts to register listed resources.
   * Returns a resPtr listing all resources not successfully registered, by
@@ -1328,8 +1346,12 @@ xf86RegisterResources(int entityIndex, resList 
list, unsigned long access)
      resRange range;
      resList list_f = NULL;

-    if (!list)
-	return NULL;
+    if (!list) {
+    list = xf86GetResourcesImplicitly(entityIndex);
+    /* these resources have to be in host address space already */
+    if (!list) return NULL;
+    list_f = list;
+    }

      while(list->type != ResEnd) {
  	range = *list;
diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
index e87cb97..1e2c6da 100644
--- a/hw/xfree86/common/xf86pciBus.c
+++ b/hw/xfree86/common/xf86pciBus.c
@@ -886,3 +886,35 @@ pciConvertRange2Host(int entityIndex, resRange *pRange)
      pRange->type &= ~(ResDomain | ResBus);
      pRange->type |= pvp->domain << 24;
  }
+
+resList
+GetImplicitPciResources(int entityIndex)
+{
+    int i, num = 0;
+    resList list = NULL;
+
+    struct pci_device *const dev = xf86GetPciInfoForEntity(entityIndex);
+    if (!dev)
+        return NULL;
+
+    for (i = 0; i < 6; i++) {
+        struct pci_mem_region *r = &dev->regions[i];
+        if (r->size && !r->is_IO) {
+            list = xnfrealloc(list,sizeof(resRange) * (++num));
+            list[num - 1].a = r->base_addr;
+            list[num - 1].b = r->base_addr + r->size - 1;
+            list[num - 1].type = ResShrMemBlock | ResBios;
+        }
+        /*TODO: not sure if this deals correctly with IO accesses.
+         else if (r->size && !r->is_IO) {
+            list = xnfrealloc(list,sizeof(resRange) * (++num));
+            list[num - 1].a = r->base_addr;
+            list[num - 1].b = r->base_addr + r->size - 1;
+            list[num - 1].type = ResShrIoBlock | ResBios;
+        }*/
+    }
+    list = xnfrealloc(list,sizeof(resRange) * (++num));
+    list[num - 1].type = ResEnd;
+
+    return list;
+}
diff --git a/hw/xfree86/common/xf86pciBus.h b/hw/xfree86/common/xf86pciBus.h
index 1cbfa38..d0d501f 100644
--- a/hw/xfree86/common/xf86pciBus.h
+++ b/hw/xfree86/common/xf86pciBus.h
@@ -70,5 +70,6 @@ void PciBusStateEnter(void);
  void PciStateLeave(void);
  void PciBusStateLeave(void);
  void pciConvertRange2Host(int entityIndex, resRange *pRange);
+resList GetImplicitPciResources(int entityIndex);

  #endif /* _XF86_PCI_BUS_H */
-- 
1.5.4.3


More information about the xorg-devel mailing list