nouveau: add linux compat defines for PCI config access, use them for nvidia IGPs

main
Stuart Bennett 2009-03-24 23:26:30 +00:00
parent b71f3f114e
commit 03ca202fa5
2 changed files with 34 additions and 18 deletions

View File

@ -125,3 +125,7 @@ do { \
#define DRM_SPINLOCK_IRQSAVE(l, _flags) spin_lock_irqsave(l, _flags);
#define DRM_SPINUNLOCK_IRQRESTORE(l, _flags) spin_unlock_irqrestore(l, _flags);
#define DRM_SPINLOCK_ASSERT(l) do {} while (0)
#define DRM_PCI_DEV struct pci_dev
#define drm_pci_get_bsf(b, s, f) pci_get_bus_and_slot(b, PCI_DEVFN(s, f))
#define drm_pci_read_config_dword pci_read_config_dword

View File

@ -231,34 +231,46 @@ void nouveau_mem_close(struct drm_device *dev)
nouveau_mem_takedown(&dev_priv->pci_heap);
}
/*XXX won't work on BSD because of pci_read_config_dword */
/*XXX BSD needs compat functions for pci access
* #define DRM_PCI_DEV struct device
* #define drm_pci_get_bsf pci_get_bsf
* and a small inline to do *val = pci_read_config(pdev->device, where, 4);
* might work
*/
static uint32_t nforce_pci_fn_read_config_dword(int devfn, int where, uint32_t *val)
{
#ifdef __linux__
DRM_PCI_DEV *pdev;
if (!(pdev = drm_pci_get_bsf(0, 0, devfn))) {
DRM_ERROR("nForce PCI device function 0x%02x not found\n",
devfn);
return -ENODEV;
}
return drm_pci_read_config_dword(pdev, where, val);
#else
DRM_ERROR("BSD compat for checking IGP memory amount needed\n");
return 0;
#endif
}
static uint32_t
nouveau_mem_fb_amount_igp(struct drm_device *dev)
{
#if defined(__linux__)
struct drm_nouveau_private *dev_priv = dev->dev_private;
struct pci_dev *bridge;
uint32_t mem;
uint32_t mem = 0;
bridge = pci_get_bus_and_slot(0, PCI_DEVFN(0,1));
if (!bridge) {
DRM_ERROR("no bridge device\n");
return 0;
}
if (dev_priv->flags&NV_NFORCE) {
pci_read_config_dword(bridge, 0x7C, &mem);
if (dev_priv->flags & NV_NFORCE) {
nforce_pci_fn_read_config_dword(1, 0x7C, &mem);
return (uint64_t)(((mem >> 6) & 31) + 1)*1024*1024;
} else
if(dev_priv->flags&NV_NFORCE2) {
pci_read_config_dword(bridge, 0x84, &mem);
}
if (dev_priv->flags & NV_NFORCE2) {
nforce_pci_fn_read_config_dword(1, 0x84, &mem);
return (uint64_t)(((mem >> 4) & 127) + 1)*1024*1024;
}
DRM_ERROR("impossible!\n");
#else
DRM_ERROR("Linux kernel >= 2.6.19 required to check for igp memory amount\n");
#endif
return 0;
}