You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.9 KiB
83 lines
1.9 KiB
|
|
#ifndef I7300_IDLE_H |
|
#define I7300_IDLE_H |
|
|
|
#include <linux/pci.h> |
|
|
|
/* |
|
* I/O AT controls (PCI bus 0 device 8 function 0) |
|
* DIMM controls (PCI bus 0 device 16 function 1) |
|
*/ |
|
#define IOAT_BUS 0 |
|
#define IOAT_DEVFN PCI_DEVFN(8, 0) |
|
#define MEMCTL_BUS 0 |
|
#define MEMCTL_DEVFN PCI_DEVFN(16, 1) |
|
|
|
struct fbd_ioat { |
|
unsigned int vendor; |
|
unsigned int ioat_dev; |
|
unsigned int enabled; |
|
}; |
|
|
|
/* |
|
* The i5000 chip-set has the same hooks as the i7300 |
|
* but it is not enabled by default and must be manually |
|
* manually enabled with "forceload=1" because it is |
|
* only lightly validated. |
|
*/ |
|
|
|
static const struct fbd_ioat fbd_ioat_list[] = { |
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB, 1}, |
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT, 0}, |
|
{0, 0} |
|
}; |
|
|
|
/* table of devices that work with this driver */ |
|
static const struct pci_device_id pci_tbl[] = { |
|
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_FBD_CNB) }, |
|
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5000_ERR) }, |
|
{ } /* Terminating entry */ |
|
}; |
|
|
|
/* Check for known platforms with I/O-AT */ |
|
static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev, |
|
struct pci_dev **ioat_dev, |
|
int enable_all) |
|
{ |
|
int i; |
|
struct pci_dev *memdev, *dmadev; |
|
|
|
memdev = pci_get_bus_and_slot(MEMCTL_BUS, MEMCTL_DEVFN); |
|
if (!memdev) |
|
return -ENODEV; |
|
|
|
for (i = 0; pci_tbl[i].vendor != 0; i++) { |
|
if (memdev->vendor == pci_tbl[i].vendor && |
|
memdev->device == pci_tbl[i].device) { |
|
break; |
|
} |
|
} |
|
if (pci_tbl[i].vendor == 0) |
|
return -ENODEV; |
|
|
|
dmadev = pci_get_bus_and_slot(IOAT_BUS, IOAT_DEVFN); |
|
if (!dmadev) |
|
return -ENODEV; |
|
|
|
for (i = 0; fbd_ioat_list[i].vendor != 0; i++) { |
|
if (dmadev->vendor == fbd_ioat_list[i].vendor && |
|
dmadev->device == fbd_ioat_list[i].ioat_dev) { |
|
if (!(fbd_ioat_list[i].enabled || enable_all)) |
|
continue; |
|
if (fbd_dev) |
|
*fbd_dev = memdev; |
|
if (ioat_dev) |
|
*ioat_dev = dmadev; |
|
|
|
return 0; |
|
} |
|
} |
|
return -ENODEV; |
|
} |
|
|
|
#endif
|
|
|