i7300_idle: allow testing on i5000-series hardware w/o re-compile

Testing the i7300_idle driver on i5000-series hardware required
an edit to i7300_idle.h to "#define SUPPORT_I5000 1" and a re-build
of both i7300_idle and ioat_dma.

Replace that build-time scheme with a load-time module parameter:
"7300_idle.forceload=1" to make it easier to test the driver
on hardware that while not officially validated, works fine
and is much more commonly available.

By default (no modparam) the driver will continue to load
only on the i7300.

Note that ioat_dma runs a copy of i7300_idle's probe routine
to know to reserve an IOAT channel for i7300_idle.
This change makes ioat_dma do that always on the i5000,
just like it does on the i7300.

Signed-off-by: Len Brown <len.brown@intel.com>
Acked-by: Andrew Henroid <andrew.d.henroid@intel.com>
This commit is contained in:
Len Brown 2009-05-27 23:59:58 -04:00
parent cd86a536c8
commit 2f102607ac
3 changed files with 16 additions and 12 deletions

View File

@ -173,7 +173,7 @@ static int ioat_dma_enumerate_channels(struct ioatdma_device *device)
xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale)); xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale));
#ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL #ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL
if (i7300_idle_platform_probe(NULL, NULL) == 0) { if (i7300_idle_platform_probe(NULL, NULL, 1) == 0) {
device->common.chancnt--; device->common.chancnt--;
} }
#endif #endif

View File

@ -41,6 +41,10 @@ static int debug;
module_param_named(debug, debug, uint, 0644); module_param_named(debug, debug, uint, 0644);
MODULE_PARM_DESC(debug, "Enable debug printks in this driver"); MODULE_PARM_DESC(debug, "Enable debug printks in this driver");
static int forceload;
module_param_named(forceload, forceload, uint, 0644);
MODULE_PARM_DESC(debug, "Enable driver testing on unvalidated i5000");
#define dprintk(fmt, arg...) \ #define dprintk(fmt, arg...) \
do { if (debug) printk(KERN_INFO I7300_PRINT fmt, ##arg); } while (0) do { if (debug) printk(KERN_INFO I7300_PRINT fmt, ##arg); } while (0)
@ -552,7 +556,7 @@ static int __init i7300_idle_init(void)
cpus_clear(idle_cpumask); cpus_clear(idle_cpumask);
total_us = 0; total_us = 0;
if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev)) if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev, forceload))
return -ENODEV; return -ENODEV;
if (i7300_idle_thrt_save()) if (i7300_idle_thrt_save())

View File

@ -16,35 +16,33 @@
struct fbd_ioat { struct fbd_ioat {
unsigned int vendor; unsigned int vendor;
unsigned int ioat_dev; unsigned int ioat_dev;
unsigned int enabled;
}; };
/* /*
* The i5000 chip-set has the same hooks as the i7300 * The i5000 chip-set has the same hooks as the i7300
* but support is disabled by default because this driver * but it is not enabled by default and must be manually
* has not been validated on that platform. * manually enabled with "forceload=1" because it is
* only lightly validated.
*/ */
#define SUPPORT_I5000 0
static const struct fbd_ioat fbd_ioat_list[] = { static const struct fbd_ioat fbd_ioat_list[] = {
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB, 1},
#if SUPPORT_I5000 {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT, 0},
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT},
#endif
{0, 0} {0, 0}
}; };
/* table of devices that work with this driver */ /* table of devices that work with this driver */
static const struct pci_device_id pci_tbl[] = { 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_FBD_CNB) },
#if SUPPORT_I5000
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5000_ERR) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5000_ERR) },
#endif
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
/* Check for known platforms with I/O-AT */ /* Check for known platforms with I/O-AT */
static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev, static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev,
struct pci_dev **ioat_dev) struct pci_dev **ioat_dev,
int enable_all)
{ {
int i; int i;
struct pci_dev *memdev, *dmadev; struct pci_dev *memdev, *dmadev;
@ -69,6 +67,8 @@ static inline int i7300_idle_platform_probe(struct pci_dev **fbd_dev,
for (i = 0; fbd_ioat_list[i].vendor != 0; i++) { for (i = 0; fbd_ioat_list[i].vendor != 0; i++) {
if (dmadev->vendor == fbd_ioat_list[i].vendor && if (dmadev->vendor == fbd_ioat_list[i].vendor &&
dmadev->device == fbd_ioat_list[i].ioat_dev) { dmadev->device == fbd_ioat_list[i].ioat_dev) {
if (!(fbd_ioat_list[i].enabled || enable_all))
continue;
if (fbd_dev) if (fbd_dev)
*fbd_dev = memdev; *fbd_dev = memdev;
if (ioat_dev) if (ioat_dev)