915_debian_xorg_bar_amd64.diff
Package: xserver-xfree86
Version: 4.3.0.dfsg.1-10
Severity: wishlist
Tags: patch,upstream,fixed-upstream,sid,amd64
I do not know if I tagged this report right and put the right severity level,
but it should be 'grave' severity instead of 'wishlist' if it was not
targeting only amd64 arch, right?
I think this patch could possible fix the problems with recents amd64 cpus,
xfree86, nforce4 and pci-express cards mentioned here:
http://www.nvnews.net/vbulletin/showthread.php?t=42597&page=4 and fixed here:
https://bugs.freedesktop.org/show_bug.cgi?id=2322 .
This patch should go right in the debian/patches directory of xserver-xfree86
debian source, if I'm right. If not, please tell me how to serve you better
next time.
Greetings.
915_debian_xorg_bar_amd64.diff :
--- xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h~ 2005-01-25
22:22:36.053919000 +0100
+++ xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h 2005-01-25
22:26:16.180455272 +0100
@@ -305,7 +305,7 @@
(((b) & PCI_MAP_MEMORY_TYPE_MASK) == PCI_MAP_MEMORY_TYPE_64BIT)
#define PCIGETMEMORY(b) ((b) & PCI_MAP_MEMORY_ADDRESS_MASK)
-#define PCIGETMEMORY64HIGH(b) (*((CARD32*)&b + 1))
+#define PCIGETMEMORY64HIGH(b) (*((CARD32*)&(b) + 1))
#define PCIGETMEMORY64(b) \
(PCIGETMEMORY(b) | ((CARD64)PCIGETMEMORY64HIGH(b) << 32))
--- xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c~ 2005-01-25
22:22:42.255976000 +0100
+++ xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c 2005-01-25
22:25:52.944987600 +0100
@@ -159,7 +159,6 @@
int i = 0, j, k;
int num = 0;
pciVideoPtr info;
- Bool mem64 = FALSE;
int DoIsolateDeviceCheck = 0;
if (xf86IsolateDevice.bus || xf86IsolateDevice.device ||
xf86IsolateDevice.func)
@@ -280,120 +279,39 @@
* 64-bit base addresses are checked for and avoided on 32-bit
* platforms.
*/
- if (pcrp->pci_base0) {
- if (pcrp->pci_base0 & PCI_MAP_IO) {
- info->ioBase[0] = (memType)PCIGETIO(pcrp->pci_base0);
- info->type[0] = pcrp->pci_base0 & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[0] = pcrp->pci_base0 & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[0] = (memType)PCIGETMEMORY(pcrp->pci_base0);
- if (PCI_MAP_IS64BITMEM(pcrp->pci_base0)) {
- mem64 = TRUE;
-#if defined(LONG64) || defined(WORD64)
- info->memBase[0] |=
- (memType)PCIGETMEMORY64HIGH(pcrp->pci_base1) << 32;
-#else
- if (pcrp->pci_base1)
- info->memBase[0] = 0;
-#endif
- }
- }
- }
-
- if (pcrp->pci_base1 && !mem64) {
- if (pcrp->pci_base1 & PCI_MAP_IO) {
- info->ioBase[1] = (memType)PCIGETIO(pcrp->pci_base1);
- info->type[1] = pcrp->pci_base1 & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[1] = pcrp->pci_base1 & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[1] = (memType)PCIGETMEMORY(pcrp->pci_base1);
- if (PCI_MAP_IS64BITMEM(pcrp->pci_base1)) {
- mem64 = TRUE;
-#if defined(LONG64) || defined(WORD64)
- info->memBase[1] |=
- (memType)PCIGETMEMORY64HIGH(pcrp->pci_base2) << 32;
-#else
- if (pcrp->pci_base2)
- info->memBase[1] = 0;
-#endif
- }
- }
- } else
- mem64 = FALSE;
-
- if (pcrp->pci_base2 && !mem64) {
- if (pcrp->pci_base2 & PCI_MAP_IO) {
- info->ioBase[2] = (memType)PCIGETIO(pcrp->pci_base2);
- info->type[2] = pcrp->pci_base2 & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[2] = pcrp->pci_base2 & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[2] = (memType)PCIGETMEMORY(pcrp->pci_base2);
- if (PCI_MAP_IS64BITMEM(pcrp->pci_base2)) {
- mem64 = TRUE;
-#if defined(LONG64) || defined(WORD64)
- info->memBase[2] |=
- (memType)PCIGETMEMORY64HIGH(pcrp->pci_base3) << 32;
-#else
- if (pcrp->pci_base3)
- info->memBase[2] = 0;
-#endif
- }
- }
- } else
- mem64 = FALSE;
+ for (j = 0; j < 6; ++j) {
+ CARD32 bar = (&pcrp->pci_base0)[j];
- if (pcrp->pci_base3 && !mem64) {
- if (pcrp->pci_base3 & PCI_MAP_IO) {
- info->ioBase[3] = (memType)PCIGETIO(pcrp->pci_base3);
- info->type[3] = pcrp->pci_base3 & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[3] = pcrp->pci_base3 & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[3] = (memType)PCIGETMEMORY(pcrp->pci_base3);
- if (PCI_MAP_IS64BITMEM(pcrp->pci_base3)) {
- mem64 = TRUE;
+ if (bar != 0) {
+ if (bar & PCI_MAP_IO) {
+ info->ioBase[j] = (memType)PCIGETIO(bar);
+ info->type[j] = bar & PCI_MAP_IO_ATTR_MASK;
+ } else {
+ info->type[j] = bar & PCI_MAP_MEMORY_ATTR_MASK;
+ info->memBase[j] = (memType)PCIGETMEMORY(bar);
+ if (PCI_MAP_IS64BITMEM(bar)) {
+ if (j == 5) {
+ xf86MsgVerb(X_WARNING, 0,
+ "****BAR5 specified as 64-bit wide, "
+ "which is not possible. "
+ "Ignoring BAR5.****\n");
+ info->memBase[j] = 0;
+ } else {
+ CARD32 bar_hi = PCIGETMEMORY64HIGH((&pcrp->pci_base0)[j]);
#if defined(LONG64) || defined(WORD64)
- info->memBase[3] |=
- (memType)PCIGETMEMORY64HIGH(pcrp->pci_base4) << 32;
+ info->memBase[3] |=
+- (memType)PCIGETMEMORY64HIGH(pcrp->pci_base4) << 32;
#else
- if (pcrp->pci_base4)
- info->memBase[3] = 0;
-#endif
- }
- }
- } else
- mem64 = FALSE;
-
- if (pcrp->pci_base4 && !mem64) {
- if (pcrp->pci_base4 & PCI_MAP_IO) {
- info->ioBase[4] = (memType)PCIGETIO(pcrp->pci_base4);
- info->type[4] = pcrp->pci_base4 & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[4] = pcrp->pci_base4 & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[4] = (memType)PCIGETMEMORY(pcrp->pci_base4);
- if (PCI_MAP_IS64BITMEM(pcrp->pci_base4)) {
- mem64 = TRUE;
-#if defined(LONG64) || defined(WORD64)
- info->memBase[4] |=
- (memType)PCIGETMEMORY64HIGH(pcrp->pci_base5) << 32;
-#else
- if (pcrp->pci_base5)
- info->memBase[4] = 0;
+ /* 64 bit architecture */
+ if (bar_hi != 0)
+ info->memBase[j] = 0;
#endif
+ ++j; /* Step over the next BAR */
+ }
+ }
}
}
- } else
- mem64 = FALSE;
-
- if (pcrp->pci_base5 && !mem64) {
- if (pcrp->pci_base5 & PCI_MAP_IO) {
- info->ioBase[5] = (memType)PCIGETIO(pcrp->pci_base5);
- info->type[5] = pcrp->pci_base5 & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[5] = pcrp->pci_base5 & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[5] = (memType)PCIGETMEMORY(pcrp->pci_base5);
- }
- } else
- mem64 = FALSE;
+ }
info->listed_class = pcrp->listed_class;
}
i++;
--
:wq
Marco Amadori <elessar@dei.unipd.it>
Reply to: