static void check_pdev(const struct pci_dev *pdev) { #define PCI_STATUS_CHECK \ (PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT | \ PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT | \ PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY) u16 seg = pdev->seg; u8 bus = pdev->bus; u8 dev = PCI_SLOT(pdev->devfn); u8 func = PCI_FUNC(pdev->devfn); u16 val; if ( command_mask ) { val = pci_conf_read16(seg, bus, dev, func, PCI_COMMAND); if ( val & command_mask ) pci_conf_write16(seg, bus, dev, func, PCI_COMMAND, val & ~command_mask); val = pci_conf_read16(seg, bus, dev, func, PCI_STATUS); if ( val & PCI_STATUS_CHECK ) { printk(XENLOG_INFO "%04x:%02x:%02x.%u status %04x -> %04x\n", seg, bus, dev, func, val, val & ~PCI_STATUS_CHECK); pci_conf_write16(seg, bus, dev, func, PCI_STATUS, val & PCI_STATUS_CHECK); } } switch ( pci_conf_read8(seg, bus, dev, func, PCI_HEADER_TYPE) & 0x7f ) { case PCI_HEADER_TYPE_BRIDGE: if ( !bridge_ctl_mask ) break; val = pci_conf_read16(seg, bus, dev, func, PCI_BRIDGE_CONTROL); if ( val & bridge_ctl_mask ) pci_conf_write16(seg, bus, dev, func, PCI_BRIDGE_CONTROL, val & ~bridge_ctl_mask); val = pci_conf_read16(seg, bus, dev, func, PCI_SEC_STATUS); if ( val & PCI_STATUS_CHECK ) { printk(XENLOG_INFO "%04x:%02x:%02x.%u secondary status %04x -> %04x\n", seg, bus, dev, func, val, val & ~PCI_STATUS_CHECK); pci_conf_write16(seg, bus, dev, func, PCI_SEC_STATUS, val & PCI_STATUS_CHECK); } break; case PCI_HEADER_TYPE_CARDBUS: /* TODO */ break; } #undef PCI_STATUS_CHECK }
static void p5064_enable_ide(void) { #if CFG_PCI pcitag_t tag; if (pci_find_device(0x8086,0x7010,0,&tag) == 0) { pci_conf_write16(tag,0x40,0x8000); } #endif }