mei: add mei_quirk_probe function
The main purpose of this function is to exclude ME devices without support for MEI/HECI interface from binding Currently affected systems are C600/X79 based servers that expose PCI device even though it doesn't supported ME Interface. MEI driver accessing such nonfunctional device can corrupt the system. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
07b509b794
commit
9a123f1983
|
@ -905,6 +905,27 @@ static struct miscdevice mei_misc_device = {
|
|||
.minor = MISC_DYNAMIC_MINOR,
|
||||
};
|
||||
|
||||
/**
|
||||
* mei_quirk_probe - probe for devices that doesn't valid ME interface
|
||||
* @pdev: PCI device structure
|
||||
* @ent: entry into pci_device_table
|
||||
*
|
||||
* returns true if ME Interface is valid, false otherwise
|
||||
*/
|
||||
static bool __devinit mei_quirk_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
u32 reg;
|
||||
if (ent->device == MEI_DEV_ID_PBG_1) {
|
||||
pci_read_config_dword(pdev, 0x48, ®);
|
||||
/* make sure that bit 9 is up and bit 10 is down */
|
||||
if ((reg & 0x600) == 0x200) {
|
||||
dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* mei_probe - Device Initialization Routine
|
||||
*
|
||||
|
@ -920,6 +941,12 @@ static int __devinit mei_probe(struct pci_dev *pdev,
|
|||
int err;
|
||||
|
||||
mutex_lock(&mei_mutex);
|
||||
|
||||
if (!mei_quirk_probe(pdev, ent)) {
|
||||
err = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (mei_device) {
|
||||
err = -EEXIST;
|
||||
goto end;
|
||||
|
|
Loading…
Reference in New Issue