diff options
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/ati.c | 8 | ||||
-rw-r--r-- | src/atidri.c | 25 | ||||
-rw-r--r-- | src/atipcirename.h | 110 | ||||
-rw-r--r-- | src/atipreinit.c | 126 | ||||
-rw-r--r-- | src/atiprint.c | 10 | ||||
-rw-r--r-- | src/atiprobe.c | 73 | ||||
-rw-r--r-- | src/atistruct.h | 4 | ||||
-rw-r--r-- | src/atividmem.c | 203 |
9 files changed, 304 insertions, 258 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 709b98c..dd7007e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -186,4 +186,5 @@ EXTRA_DIST = \ theatre_detect.h \ theatre.h \ theatre_reg.h \ - atipciids.h + atipciids.h \ + atipcirename.h @@ -57,6 +57,8 @@ #include "config.h" #endif +#include "atipcirename.h" + #include "ati.h" #include "atimodule.h" #include "ativersion.h" @@ -111,12 +113,12 @@ ATIProbe while ((pVideo = *xf86PciVideoInfo++) != NULL) { - if ((pVideo->vendor != PCI_VENDOR_ATI) || - (pVideo->chipType == PCI_CHIP_MACH32)) + if ((PCI_DEV_VENDOR_ID(pVideo) != PCI_VENDOR_ATI) || + (PCI_DEV_DEVICE_ID(pVideo) == PCI_CHIP_MACH32)) continue; /* Check for Rage128's, Radeon's and later adapters */ - Chip = ATIChipID(pVideo->chipType, pVideo->chipRev); + Chip = ATIChipID(PCI_DEV_DEVICE_ID(pVideo), PCI_DEV_REVISION(pVideo)); if (Chip <= ATI_CHIP_Mach64) DoMach64 = TRUE; else if (Chip <= ATI_CHIP_Rage128) diff --git a/src/atidri.c b/src/atidri.c index 07adda7..bc862a8 100644 --- a/src/atidri.c +++ b/src/atidri.c @@ -774,8 +774,8 @@ static Bool ATIDRISetAgpMode( ScreenPtr pScreen ) xf86DrvMsg( pScreen->myNum, X_INFO, "[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x; Card 0x%04x/0x%04x]\n", mode, vendor, device, - pATI->PCIInfo->vendor, - pATI->PCIInfo->chipType ); + PCI_DEV_VENDOR_ID(pATI->PCIInfo), + PCI_DEV_DEVICE_ID(pATI->PCIInfo) ); if ( drmAgpEnable( pATI->drmFD, mode ) < 0 ) { xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] AGP not enabled\n" ); @@ -1134,18 +1134,15 @@ static Bool ATIDRIIrqInit( ScreenPtr pScreen ) if ( pATI->irq <= 0 ) { pATI->irq = drmGetInterruptFromBusID(pATI->drmFD, - ((pciConfigPtr)pATI->PCIInfo - ->thisCard)->busnum, - ((pciConfigPtr)pATI->PCIInfo - ->thisCard)->devnum, - ((pciConfigPtr)pATI->PCIInfo - ->thisCard)->funcnum); + PCI_CFG_BUS(pATI->PCIInfo), + PCI_CFG_DEV(pATI->PCIInfo), + PCI_CFG_FUNC(pATI->PCIInfo)); if ( pATI->irq <= 0 ) { xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, "[drm] Couldn't find IRQ for bus id %d:%d:%d\n", - ((pciConfigPtr)pATI->PCIInfo->thisCard)->busnum, - ((pciConfigPtr)pATI->PCIInfo->thisCard)->devnum, - ((pciConfigPtr)pATI->PCIInfo->thisCard)->funcnum); + PCI_CFG_BUS(pATI->PCIInfo), + PCI_CFG_DEV(pATI->PCIInfo), + PCI_CFG_FUNC(pATI->PCIInfo)); pATI->irq = 0; } else if ((drmCtlInstHandler(pATI->drmFD, pATI->irq)) != 0) { xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, @@ -1243,9 +1240,9 @@ Bool ATIDRIScreenInit( ScreenPtr pScreen ) pDRIInfo->busIdString = xalloc( 64 ); sprintf( pDRIInfo->busIdString, "PCI:%d:%d:%d", - pATI->PCIInfo->bus, - pATI->PCIInfo->device, - pATI->PCIInfo->func ); + PCI_DEV_BUS(pATI->PCIInfo), + PCI_DEV_DEV(pATI->PCIInfo), + PCI_DEV_FUNC(pATI->PCIInfo) ); } pDRIInfo->ddxDriverMajorVersion = ATI_VERSION_MAJOR; pDRIInfo->ddxDriverMinorVersion = ATI_VERSION_MINOR; diff --git a/src/atipcirename.h b/src/atipcirename.h new file mode 100644 index 0000000..280a81a --- /dev/null +++ b/src/atipcirename.h @@ -0,0 +1,110 @@ +/* + * Copyright 2007 George Sapountzis + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** + * Macros for porting drivers from legacy xfree86 PCI code to the pciaccess + * library. The main purpose being to facilitate source code compatibility. + */ + +#ifndef ATIPCIRENAME_H +#define ATIPCIRENAME_H + +enum region_type { + REGION_MEM, + REGION_IO +}; + +#ifndef PCIACCESS + +/* pciVideoPtr */ +#define PCI_DEV_VENDOR_ID(_pcidev) ((_pcidev)->vendor) +#define PCI_DEV_DEVICE_ID(_pcidev) ((_pcidev)->chipType) +#define PCI_DEV_REVISION(_pcidev) ((_pcidev)->chipRev) + +#define PCI_DEV_TAG(_pcidev) pciTag((_pcidev)->bus, \ + (_pcidev)->device, \ + (_pcidev)->func) +#define PCI_DEV_BUS(_pcidev) ((_pcidev)->bus) +#define PCI_DEV_DEV(_pcidev) ((_pcidev)->device) +#define PCI_DEV_FUNC(_pcidev) ((_pcidev)->func) + +/* pciConfigPtr */ +#define PCI_CFG_TAG(_pcidev) (((pciConfigPtr)(_pcidev)->thisCard)->tag) +#define PCI_CFG_BUS(_pcidev) (((pciConfigPtr)(_pcidev)->thisCard)->busnum) +#define PCI_CFG_DEV(_pcidev) (((pciConfigPtr)(_pcidev)->thisCard)->devnum) +#define PCI_CFG_FUNC(_pcidev) (((pciConfigPtr)(_pcidev)->thisCard)->funcnum) + +/* region addr: xfree86 uses different fields for memory regions and I/O ports */ +#define PCI_REGION_BASE(_pcidev, _b, _type) \ + (((_type) == REGION_MEM) ? (_pcidev)->memBase[(_b)] \ + : (_pcidev)->ioBase[(_b)]) + +/* region size: xfree86 uses the log2 of the region size, + * but with zero meaning no region, not size of one XXX */ +#define PCI_REGION_SIZE(_pcidev, _b) \ + (((_pcidev)->size[(_b)] > 0) ? (1 << (_pcidev)->size[(_b)]) : 0) + +/* read/write PCI configuration space */ +#define PCI_READ_LONG(_pcidev, _value_ptr, _offset) \ + *(_value_ptr) = pciReadLong(PCI_CFG_TAG(_pcidev), (_offset)) + +#define PCI_WRITE_LONG(_pcidev, _value, _offset) \ + pciWriteLong(PCI_CFG_TAG(_pcidev), (_offset), (_value)) + +#else /* PCIACCESS */ + +typedef struct pci_device *pciVideoPtr; + +#define PCI_DEV_VENDOR_ID(_pcidev) ((_pcidev)->vendor_id) +#define PCI_DEV_DEVICE_ID(_pcidev) ((_pcidev)->device_id) +#define PCI_DEV_REVISION(_pcidev) ((_pcidev)->revision) + +/* pci-rework functions take a 'pci_device' parameter instead of a tag */ +#define PCI_DEV_TAG(_pcidev) (_pcidev) + +/* PCI_DEV macros, typically used in printf's, add domain ? XXX */ +#define PCI_DEV_BUS(_pcidev) ((_pcidev)->bus) +#define PCI_DEV_DEV(_pcidev) ((_pcidev)->dev) +#define PCI_DEV_FUNC(_pcidev) ((_pcidev)->func) + +/* pci-rework functions take a 'pci_device' parameter instead of a tag */ +#define PCI_CFG_TAG(_pcidev) (_pcidev) + +/* PCI_CFG macros, typically used in DRI init, contain the domain */ +#define PCI_CFG_BUS(_pcidev) (((_pcidev)->domain << 8) | \ + (_pcidev)->bus) +#define PCI_CFG_DEV(_pcidev) ((_pcidev)->dev) +#define PCI_CFG_FUNC(_pcidev) ((_pcidev)->func) + +#define PCI_REGION_BASE(_pcidev, _b, _type) ((_pcidev)->regions[(_b)].base_addr) +#define PCI_REGION_SIZE(_pcidev, _b) ((_pcidev)->regions[(_b)].size) + +#define PCI_READ_LONG(_pcidev, _value_ptr, _offset) \ + pci_device_cfg_read_u32((_pcidev), (_value_ptr), (_offset)) + +#define PCI_WRITE_LONG(_pcidev, _value, _offset) \ + pci_device_cfg_write_u32((_pcidev), (_value), (_offset)) + +#endif /* PCIACCESS */ + +#endif /* ATIPCIRENAME_H */ diff --git a/src/atipreinit.c b/src/atipreinit.c index d960e88..8114f51 100644 --- a/src/atipreinit.c +++ b/src/atipreinit.c @@ -101,24 +101,6 @@ static const rgb defaultWeight = {0, 0, 0}; static const Gamma defaultGamma = {0.0, 0.0, 0.0}; /* - * ATIMach64Map -- - * - * This function attempts to mmap() a Mach64's MMIO aperture. - */ -static void -ATIMach64Map -( - int iScreen, - ATIPtr pATI -) -{ - (void)ATIMapApertures(iScreen, pATI); - if (!pATI->pBlock[0] || - (pATI->config_chip_id != inr(CONFIG_CHIP_ID))) - ATIUnmapApertures(iScreen, pATI); -} - -/* * ATIPrintNoiseIfRequested -- * * This function formats debugging information on the server's stderr when @@ -175,7 +157,6 @@ ATIPreInit resPtr pResources; pciVideoPtr pVideo; DisplayModePtr pMode; - unsigned long Block0Base; CARD32 IOValue; int i, j; int Numerator, Denominator; @@ -402,6 +383,24 @@ ATIPreInit return TRUE; } +#ifndef AVOID_CPIO + + /* I/O bases might no longer be valid after BIOS initialisation */ + { + if (pATI->CPIODecoding == BLOCK_IO) + pATI->CPIOBase = PCI_REGION_BASE(pVideo, 1, REGION_IO); + + pATI->MMIOInLinear = FALSE; + + /* Set MMIO address from PCI configuration space, if available */ + if ((pATI->Block0Base = PCI_REGION_BASE(pVideo, 2, REGION_MEM))) + { + pATI->Block0Base += 0x0400U; + } + } + +#endif /* AVOID_CPIO */ + #ifdef AVOID_CPIO pScreenInfo->racMemFlags = @@ -424,51 +423,17 @@ ATIPreInit /* Finish probing the adapter */ { - - if (pATI->CPIODecoding == BLOCK_IO) - pATI->CPIOBase = pVideo->ioBase[1]; - - /* Set MMIO address from PCI configuration space, if available */ - if ((pATI->Block0Base = pVideo->memBase[2])) - { - if (pATI->Block0Base >= (CARD32)(-1 << pVideo->size[2])) - pATI->Block0Base = 0; - else - pATI->Block0Base += 0x0400U; - } - - Block0Base = pATI->Block0Base; /* save */ - - do - { - /* - * Find and mmap() MMIO area. Allow only auxiliary aperture if - * it exists. - */ - if (!pATI->Block0Base) - { - /* Check tail end of linear (8MB or 4MB) aperture */ - if ((pATI->Block0Base = pVideo->memBase[0])) - { - pATI->Block0Base += 0x007FFC00U; - ATIMach64Map(pScreenInfo->scrnIndex, pATI); - if (pATI->pBlock[0]) - break; - - pATI->Block0Base -= 0x00400000U; - ATIMach64Map(pScreenInfo->scrnIndex, pATI); - if (pATI->pBlock[0]) - break; - } - - /* Check VGA MMIO aperture */ - pATI->Block0Base = 0x000BFC00U; - } - - ATIMach64Map(pScreenInfo->scrnIndex, pATI); - } while (0); - - pATI->Block0Base = Block0Base; /* restore */ + /* + * For MMIO register access, the MMIO address is computed when probing + * and there are no BIOS calls. This mapping should always succeed. + * + * For CPIO register access, the MMIO address is computed above in the + * presence of an auxiliary aperture. Otherwise, it is set to zero and + * gets computed when we read the linear aperture configuration. This + * mapping is either irrelevant or a no-op. + */ + if (!ATIMapApertures(pScreenInfo->scrnIndex, pATI)) + return FALSE; #ifdef AVOID_CPIO @@ -481,15 +446,25 @@ ATIPreInit #endif /* AVOID_CPIO */ + /* + * Verify register access by comparing against the CONFIG_CHIP_ID + * value saved by adapter detection. + */ + if (pATI->config_chip_id != inr(CONFIG_CHIP_ID)) + { + xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, + "Adapter registers not mapped correctly.\n"); + ATIUnmapApertures(pScreenInfo->scrnIndex, pATI); + return FALSE; + } + pATIHW->crtc_gen_cntl = inr(CRTC_GEN_CNTL); if (!(pATIHW->crtc_gen_cntl & CRTC_EN) && (pATI->Chip >= ATI_CHIP_264CT)) { xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, "Adapter has not been initialised.\n"); - ATIPrintNoiseIfRequested(pATI, BIOS, BIOSSize); - ATIUnmapApertures(pScreenInfo->scrnIndex, pATI); - return FALSE; + goto bail_locked; } #ifdef AVOID_CPIO @@ -499,9 +474,7 @@ ATIPreInit xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, "Adapters found to be in VGA mode on server entry are not" " supported by the MMIO-only version of this driver.\n"); - ATIPrintNoiseIfRequested(pATI, BIOS, BIOSSize); - ATIUnmapApertures(pScreenInfo->scrnIndex, pATI); - return FALSE; + goto bail_locked; } #endif /* AVOID_CPIO */ @@ -1809,8 +1782,9 @@ ATIPreInit if (pATI->LinearBase && pATI->LinearSize) { - int AcceleratorVideoRAM = pATI->LinearSize >> 10; - int ServerVideoRAM = pATI->VideoRAM; + int AcceleratorVideoRAM = 0, ServerVideoRAM; + +#ifndef AVOID_CPIO /* * Unless specified in PCI configuration space, set MMIO @@ -1823,6 +1797,10 @@ ATIPreInit pATI->MMIOInLinear = TRUE; } +#endif /* AVOID_CPIO */ + + AcceleratorVideoRAM = pATI->LinearSize >> 10; + /* * Account for MMIO area at the tail end of the linear * aperture, if it is needed or if it cannot be disabled. @@ -1830,6 +1808,8 @@ ATIPreInit if (pATI->MMIOInLinear || (pATI->Chip < ATI_CHIP_264VTB)) AcceleratorVideoRAM -= 2; + ServerVideoRAM = pATI->VideoRAM; + if (pATI->Cursor > ATI_CURSOR_SOFTWARE) { /* @@ -2475,6 +2455,8 @@ ATIPreInit bail: ATILock(pATI); + +bail_locked: ATIPrintNoiseIfRequested(pATI, BIOS, BIOSSize); ATIUnmapApertures(pScreenInfo->scrnIndex, pATI); diff --git a/src/atiprint.c b/src/atiprint.c index d435e21..60d9c21 100644 --- a/src/atiprint.c +++ b/src/atiprint.c @@ -355,8 +355,6 @@ ATIPrintRegisters ATIPtr pATI ) { - pciVideoPtr pVideo = pATI->PCIInfo; - pciConfigPtr pPCI = pVideo->thisCard; int Index; CARD32 lcd_index, tv_out_index, lcd_gen_ctrl; CARD8 dac_read, dac_mask, dac_write; @@ -642,10 +640,14 @@ ATIPrintRegisters xf86ErrorFVerb(4, "\n\n PCI configuration register values:"); for (Index = 0; Index < 256; Index+= 4) { + pciVideoPtr pVideo = pATI->PCIInfo; + uint32_t data; + + PCI_READ_LONG(pVideo, &data, Index); + if (!(Index & 15)) xf86ErrorFVerb(4, "\n 0x%02X: ", Index); - xf86ErrorFVerb(4, " 0x%08lX", - (unsigned long)pciReadLong(pPCI->tag, Index)); + xf86ErrorFVerb(4, " 0x%08X", data); } } diff --git a/src/atiprobe.c b/src/atiprobe.c index 5f22032..cddcc61 100644 --- a/src/atiprobe.c +++ b/src/atiprobe.c @@ -214,29 +214,36 @@ ATIMach64Probe const ATIChipType Chip ) { - CARD16 ChipType = pVideo->chipType; + CARD16 ChipType = PCI_DEV_DEVICE_ID(pVideo); + + pATI->MMIOInLinear = FALSE; /* * Probe through auxiliary MMIO aperture if one exists. Because such * apertures can be enabled/disabled only through PCI, this probes no * further. */ - if ((pVideo->size[2] >= 12) && - (pATI->Block0Base = pVideo->memBase[2]) && - (pATI->Block0Base < (CARD32)(-1 << pVideo->size[2]))) + if ((PCI_REGION_SIZE(pVideo, 2) >= (1 << 12)) && + (pATI->Block0Base = PCI_REGION_BASE(pVideo, 2, REGION_MEM))) { pATI->Block0Base += 0x00000400U; - goto LastProbe; + if (ATIMach64Detect(pATI, ChipType, Chip)) + return pATI; + + return NULL; } /* * Probe through the primary MMIO aperture that exists at the tail end * of the linear aperture. Test for both 8MB and 4MB linear apertures. */ - if ((pVideo->size[0] >= 22) && (pATI->Block0Base = pVideo->memBase[0])) + if ((PCI_REGION_SIZE(pVideo, 0) >= (1 << 22)) && + (pATI->Block0Base = PCI_REGION_BASE(pVideo, 0, REGION_MEM))) { + pATI->MMIOInLinear = TRUE; + pATI->Block0Base += 0x007FFC00U; - if ((pVideo->size[0] >= 23) && + if ((PCI_REGION_SIZE(pVideo, 0) >= (1 << 23)) && ATIMach64Detect(pATI, ChipType, Chip)) return pATI; @@ -245,17 +252,6 @@ ATIMach64Probe return pATI; } - /* - * A last, perhaps desparate, probe attempt. Note that if this succeeds, - * there's a VGA in the system and it's likely the PIO version of the - * driver should be used instead (barring OS issues). - */ - pATI->Block0Base = 0x000BFC00U; - -LastProbe: - if (ATIMach64Detect(pATI, ChipType, Chip)) - return pATI; - return NULL; } @@ -276,11 +272,10 @@ ATIMach64Probe ) { CARD32 IOValue; - CARD16 ChipType = pVideo->chipType; + CARD16 ChipType = PCI_DEV_DEVICE_ID(pVideo); if ((pATI->CPIODecoding == BLOCK_IO) && - ((pVideo->size[1] < 8) || - (pATI->CPIOBase >= (CARD32)(-1 << pVideo->size[1])))) + (PCI_REGION_SIZE(pVideo, 1) < (1 << 8))) return NULL; if (!ATIMach64Detect(pATI, ChipType, Chip)) @@ -380,21 +375,22 @@ ATIMach64ProbeIO #ifndef AVOID_CPIO /* Next, look for sparse I/O Mach64's */ - if (!pVideo->size[1]) + if (!PCI_REGION_SIZE(pVideo, 1)) { static const IOADDRESS Mach64SparseIOBases[] = { 0x02ECU, 0x01CCU, 0x01C8U }; + uint32_t PciReg; + uint32_t j; + pciConfigPtr pPCI = pVideo->thisCard; - CARD32 PciReg; - CARD32 j; if (pPCI == NULL) goto SkipSparse; - PciReg = pciReadLong(pPCI->tag, PCI_REG_USERCONFIG); + PCI_READ_LONG(pVideo, &PciReg, PCI_REG_USERCONFIG); j = PciReg & 0x03U; if (j == 0x03U) @@ -402,7 +398,7 @@ ATIMach64ProbeIO xf86Msg(X_WARNING, ATI_NAME ": " "PCI Mach64 in slot %d:%d:%d cannot be enabled\n" "because it has neither a block, nor a sparse, I/O base.\n", - pVideo->bus, pVideo->device, pVideo->func); + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo)); goto SkipSparse; } @@ -422,14 +418,17 @@ ATIMach64ProbeIO xf86Msg(X_WARNING, ATI_NAME ": " "PCI Mach64 in slot %d:%d:%d will not be probed\n" "set option \"probe_sparse\" to force sparse I/O probing.\n", - pVideo->bus, pVideo->device, pVideo->func); + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo)); goto SkipSparse; } /* Possibly fix block I/O indicator */ if (PciReg & 0x00000004U) - pciWriteLong(pPCI->tag, PCI_REG_USERCONFIG, PciReg & ~0x00000004U); + { + PciReg &= ~0x00000004U; + PCI_WRITE_LONG(pVideo, PciReg, PCI_REG_USERCONFIG); + } pATI->CPIOBase = Mach64SparseIOBases[j]; pATI->CPIODecoding = SPARSE_IO; @@ -439,7 +438,7 @@ ATIMach64ProbeIO { xf86Msg(X_WARNING, ATI_NAME ": " "PCI Mach64 in slot %d:%d:%d could not be detected!\n", - pVideo->bus, pVideo->device, pVideo->func); + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo)); } else { @@ -447,7 +446,7 @@ ATIMach64ProbeIO xf86Msg(X_INFO, ATI_NAME ": " "Shared PCI Mach64 in slot %d:%d:%d with sparse PIO base" " 0x%04lX detected.\n", - pVideo->bus, pVideo->device, pVideo->func, + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo), Mach64SparseIOBases[j]); if (pATI->VGAAdapter) @@ -459,7 +458,7 @@ SkipSparse: #else /* AVOID_CPIO */ - if (!pVideo->size[1]) + if (!PCI_REGION_SIZE(pVideo, 1)) { /* The adapter's CPIO base is of little concern here */ pATI->CPIOBase = 0; @@ -472,23 +471,23 @@ SkipSparse: xf86Msg(X_INFO, ATI_NAME ": " "Shared PCI Mach64 in slot %d:%d:%d with Block 0 base" " 0x%08lX detected.\n", - pVideo->bus, pVideo->device, pVideo->func, + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo), pATI->Block0Base); } else { xf86Msg(X_WARNING, ATI_NAME ": " "PCI Mach64 in slot %d:%d:%d could not be detected!\n", - pVideo->bus, pVideo->device, pVideo->func); + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo)); } } #endif /* AVOID_CPIO */ /* Lastly, look for block I/O devices */ - if (pVideo->size[1]) + if (PCI_REGION_SIZE(pVideo, 1)) { - pATI->CPIOBase = pVideo->ioBase[1]; + pATI->CPIOBase = PCI_REGION_BASE(pVideo, 1, REGION_IO); pATI->CPIODecoding = BLOCK_IO; pATI->PCIInfo = pVideo; @@ -497,7 +496,7 @@ SkipSparse: ProbeSuccess = TRUE; xf86Msg(X_INFO, ATI_NAME ": " "Shared PCI/AGP Mach64 in slot %d:%d:%d detected.\n", - pVideo->bus, pVideo->device, pVideo->func); + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo)); #ifndef AVOID_CPIO @@ -511,7 +510,7 @@ SkipSparse: { xf86Msg(X_WARNING, ATI_NAME ": " "PCI/AGP Mach64 in slot %d:%d:%d could not be detected!\n", - pVideo->bus, pVideo->device, pVideo->func); + PCI_DEV_BUS(pVideo), PCI_DEV_DEV(pVideo), PCI_DEV_FUNC(pVideo)); } } diff --git a/src/atistruct.h b/src/atistruct.h index 99be359..3496d2a 100644 --- a/src/atistruct.h +++ b/src/atistruct.h @@ -61,6 +61,8 @@ #include "xf86Pci.h" #include "xf86Resources.h" +#include "atipcirename.h" + #define CacheSlotOf(____Register) ((____Register) / UnitOf(DWORD_SELECT)) /* @@ -336,7 +338,7 @@ typedef struct _ATIRec * Cursor-related definitions. */ xf86CursorInfoPtr pCursorInfo; - pointer pCursorPage, pCursorImage; + pointer pCursorImage; unsigned long CursorBase; CARD32 CursorOffset; CARD16 CursorXOffset, CursorYOffset; diff --git a/src/atividmem.c b/src/atividmem.c index b1a7a8d..7ab203e 100644 --- a/src/atividmem.c +++ b/src/atividmem.c @@ -67,6 +67,16 @@ const char *ATIMemoryTypeNames_264xT[] = "Unknown video memory type" }; +/* + * FIXME: This is an internal Xserver function that should be exported and + * called explicitely with pci-rework, pci-rework does not setup mtrr's. + * + * It is called implicitely by xf86MapPciMem(VIDMEM_FRAMEBUFFER). + */ +#define nop_setWC(_screenNum, _base, _size, _enable) \ +do { \ +} while (0) + #ifndef AVOID_CPIO /* @@ -103,20 +113,19 @@ ATIUnmapLinear ATIPtr pATI ) { - if (pATI->pMemory) - { - xf86UnMapVidMem(iScreen, pATI->pMemory, pATI->LinearSize); + pciVideoPtr pVideo = pATI->PCIInfo; -#if X_BYTE_ORDER != X_LITTLE_ENDIAN - - if (pATI->pMemoryLE) - xf86UnMapVidMem(iScreen, pATI->pMemoryLE, pATI->LinearSize); - -#endif /* X_BYTE_ORDER */ + if (pATI->pMemoryLE) + { + if (pATI->LinearBase) + nop_setWC(iScreen, pATI->LinearBase, pATI->LinearSize, FALSE); + xf86UnMapVidMem(iScreen, pATI->pMemoryLE, (1U << pVideo->size[0])); } pATI->pMemory = pATI->pMemoryLE = NULL; + + pATI->pCursorImage = NULL; } /* @@ -138,27 +147,14 @@ ATIUnmapMMIO } /* - * ATIUnmapCursor -- - * - * Unmap hardware cursor image area. - */ -static void -ATIUnmapCursor -( - int iScreen, - ATIPtr pATI -) -{ - if (pATI->pCursorPage) - xf86UnMapVidMem(iScreen, pATI->pCursorPage, getpagesize()); - - pATI->pCursorPage = pATI->pCursorImage = NULL; -} - -/* * ATIMapApertures -- * * This function maps all apertures used by the driver. + * + * It is called three times: + * - to setup MMIO for an MMIO-only driver during Probe + * - to setup MMIO for an MMIO-only driver during PreInit + * - to setup MMIO (with Block0Base set) and FB (with LinearBase set) */ Bool ATIMapApertures @@ -168,8 +164,7 @@ ATIMapApertures ) { pciVideoPtr pVideo = pATI->PCIInfo; - PCITAG Tag = ((pciConfigPtr)(pVideo->thisCard))->tag; - unsigned long PageSize = getpagesize(); + int mode; if (pATI->Mapped) return TRUE; @@ -184,10 +179,10 @@ ATIMapApertures * aperture is supported. Hence, the hard-coded values here... */ pATI->pBank = xf86MapDomainMemory(iScreen, VIDMEM_MMIO_32BIT, - Tag, 0x000A0000U, 0x00010000U); + PCI_CFG_TAG(pVideo), 0x000A0000U, 0x00010000U); if (!pATI->pBank) - return FALSE; + goto bail; pATI->Mapped = TRUE; } @@ -195,143 +190,102 @@ ATIMapApertures #endif /* AVOID_CPIO */ /* Map linear aperture */ - if (pATI->LinearBase) + if (pATI->LinearBase || (pATI->Block0Base && pATI->MMIOInLinear)) { - pATI->pMemory = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER, - Tag, pATI->LinearBase, pATI->LinearSize); - - if (!pATI->pMemory) - { - -#ifndef AVOID_CPIO + mode = VIDMEM_FRAMEBUFFER; - ATIUnmapVGA(iScreen, pATI); + /* Reset write-combining for the whole FB when MMIO registers fall in + * the linear aperture. + */ + if (pATI->MMIOInLinear) + mode = VIDMEM_MMIO; -#endif /* AVOID_CPIO */ + pATI->pMemoryLE = xf86MapPciMem(iScreen, mode, PCI_CFG_TAG(pVideo), + pVideo->memBase[0], + (1U << pVideo->size[0])); - pATI->Mapped = FALSE; - return FALSE; - } + if (!pATI->pMemoryLE) + goto bail; pATI->Mapped = TRUE; #if X_BYTE_ORDER == X_LITTLE_ENDIAN - if ((pATI->CursorBase >= pATI->LinearBase) && - ((pATI->CursorOffset + 0x00000400UL) <= (CARD32)pATI->LinearSize)) - pATI->pCursorImage = (char *)pATI->pMemory + pATI->CursorOffset; - - pATI->pMemoryLE = pATI->pMemory; + pATI->pMemory = pATI->pMemoryLE; #else /* if X_BYTE_ORDER != X_LITTLE_ENDIAN */ - /* - * Map the little-endian aperture (used for video, etc.). Note that - * caching of this area is _not_ wanted. - */ - { - pATI->pMemoryLE = xf86MapPciMem(iScreen, VIDMEM_MMIO, Tag, - pATI->LinearBase - 0x00800000U, pATI->LinearSize); - - if (!pATI->pMemoryLE) - { - ATIUnmapLinear(iScreen, pATI); - -#ifndef AVOID_CPIO - - ATIUnmapVGA(iScreen, pATI); - -#endif /* AVOID_CPIO */ - - pATI->Mapped = FALSE; - return FALSE; - } - } + pATI->pMemory = (char *)pATI->pMemoryLE + 0x00800000U; #endif /* X_BYTE_ORDER */ + /* Set write-combining for the FB (and the HW cursor on LE) */ + if (pATI->LinearBase) + nop_setWC(iScreen, pATI->LinearBase, pATI->LinearSize, TRUE); + + if (pATI->CursorBase) + pATI->pCursorImage = (char *)pATI->pMemoryLE + pATI->CursorOffset; } /* Map MMIO aperture */ - if (pATI->Block0Base) + if (pATI->Block0Base && !pATI->MMIOInLinear) { - unsigned long MMIOBase = pATI->Block0Base & ~(PageSize - 1); - - pATI->pMMIO = xf86MapPciMem(iScreen, VIDMEM_MMIO, - Tag, MMIOBase, PageSize); + mode = VIDMEM_MMIO; + pATI->pMMIO = xf86MapPciMem(iScreen, mode, PCI_CFG_TAG(pVideo), + pVideo->memBase[2], + getpagesize()); if (!pATI->pMMIO) - { - -#if X_BYTE_ORDER == X_LITTLE_ENDIAN + goto bail; - ATIUnmapCursor(iScreen, pATI); + pATI->Mapped = TRUE; -#endif /* X_BYTE_ORDER */ + pATI->pBlock[0] = (char *)pATI->pMMIO + 0x00000400U; - ATIUnmapLinear(iScreen, pATI); + if (pATI->Block1Base) + pATI->pBlock[1] = (char *)pATI->pBlock[0] - 0x00000400U; + } + else if (pATI->Block0Base) + { + unsigned long mmio_offset, linear_size; -#ifndef AVOID_CPIO + mmio_offset = pATI->Block0Base - PCI_REGION_BASE(pVideo, 0, REGION_MEM); - ATIUnmapVGA(iScreen, pATI); + linear_size = PCI_REGION_SIZE(pVideo, 0); -#endif /* AVOID_CPIO */ + pATI->pMMIO = NULL; - pATI->Mapped = FALSE; - return FALSE; - } + /* Check that requested MMIO offset falls in the linear aperture. This + * ensures that we do not poke outside a mapped region and bails early + * for old mach64 cards with a 4MB linear aperture (unless they have an + * extended BE aperture which would give a size of 8MB). + */ + if (mmio_offset + 0x00000400U > linear_size) + goto bail; pATI->Mapped = TRUE; - pATI->pBlock[0] = (char *)pATI->pMMIO + - (pATI->Block0Base - MMIOBase); + pATI->pBlock[0] = (char *)pATI->pMemoryLE + mmio_offset; if (pATI->Block1Base) pATI->pBlock[1] = (char *)pATI->pBlock[0] - 0x00000400U; - -#if X_BYTE_ORDER == X_LITTLE_ENDIAN - - if (!pATI->pCursorImage) - -#endif /* X_BYTE_ORDER */ - - { - if ((pATI->CursorBase >= MMIOBase) && - ((pATI->CursorBase + 0x00000400UL) <= (MMIOBase + PageSize))) - pATI->pCursorImage = (char *)pATI->pMMIO + - (pATI->CursorBase - MMIOBase); - } } - /* Map hardware cursor image area */ - if (pATI->CursorBase && !pATI->pCursorImage) - { - unsigned long CursorBase = pATI->CursorBase & ~(PageSize - 1); + return TRUE; - pATI->pCursorPage = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER, - Tag, CursorBase, PageSize); +bail: - if (!pATI->pCursorPage) - { - ATIUnmapCursor(iScreen, pATI); - ATIUnmapMMIO(iScreen, pATI); - ATIUnmapLinear(iScreen, pATI); + ATIUnmapLinear(iScreen, pATI); #ifndef AVOID_CPIO - ATIUnmapVGA(iScreen, pATI); + ATIUnmapVGA(iScreen, pATI); #endif /* AVOID_CPIO */ - pATI->Mapped = FALSE; - return FALSE; - } - - pATI->pCursorImage = (char *)pATI->pCursorPage + - (pATI->CursorBase - CursorBase); - } + pATI->Mapped = FALSE; - return TRUE; + return FALSE; } /* @@ -350,9 +304,6 @@ ATIUnmapApertures return; pATI->Mapped = FALSE; - /* Unmap hardware cursor image area */ - ATIUnmapCursor(iScreen, pATI); - /* Unmap MMIO area */ ATIUnmapMMIO(iScreen, pATI); |