📄 remove-pci-bridge-setup
字号:
# HG changeset patch# User kfraser@localhost.localdomain# Node ID a8d31d5ce2589762c3226185deeca3afca47a698# Parent b8cc9ffda0a3dc449b026c72c97f78dea2e6f114[HVM] Move PCI and PCI-ISA bridge setup to hvmloader.Signed-off-by: Keir Fraser <keir@xensource.com>Index: ioemu/target-i386-dm/piix_pci-dm.c===================================================================--- ioemu.orig/target-i386-dm/piix_pci-dm.c 2007-05-09 14:07:46.000000000 +0100+++ ioemu/target-i386-dm/piix_pci-dm.c 2007-05-09 14:07:56.000000000 +0100@@ -220,228 +220,3 @@ piix3_reset(d); return d->devfn; }--/***********************************************************/-/* XXX: the following should be moved to the PC BIOS */--static __attribute__((unused)) uint32_t isa_inb(uint32_t addr)-{- return cpu_inb(NULL, addr);-}--static void isa_outb(uint32_t val, uint32_t addr)-{- cpu_outb(NULL, addr, val);-}--static __attribute__((unused)) uint32_t isa_inw(uint32_t addr)-{- return cpu_inw(NULL, addr);-}--static __attribute__((unused)) void isa_outw(uint32_t val, uint32_t addr)-{- cpu_outw(NULL, addr, val);-}--static __attribute__((unused)) uint32_t isa_inl(uint32_t addr)-{- return cpu_inl(NULL, addr);-}--static __attribute__((unused)) void isa_outl(uint32_t val, uint32_t addr)-{- cpu_outl(NULL, addr, val);-}--static uint32_t pci_bios_io_addr;-static uint32_t pci_bios_mem_addr;-/* host irqs corresponding to PCI irqs A-D */-static uint8_t pci_irqs[4] = { 10, 11, 10, 11 };--static void pci_config_writel(PCIDevice *d, uint32_t addr, uint32_t val)-{- PCIBus *s = d->bus;- addr |= (pci_bus_num(s) << 16) | (d->devfn << 8);- pci_data_write(s, addr, val, 4);-}--static void pci_config_writew(PCIDevice *d, uint32_t addr, uint32_t val)-{- PCIBus *s = d->bus;- addr |= (pci_bus_num(s) << 16) | (d->devfn << 8);- pci_data_write(s, addr, val, 2);-}--static void pci_config_writeb(PCIDevice *d, uint32_t addr, uint32_t val)-{- PCIBus *s = d->bus;- addr |= (pci_bus_num(s) << 16) | (d->devfn << 8);- pci_data_write(s, addr, val, 1);-}--static __attribute__((unused)) uint32_t pci_config_readl(PCIDevice *d, uint32_t addr)-{- PCIBus *s = d->bus;- addr |= (pci_bus_num(s) << 16) | (d->devfn << 8);- return pci_data_read(s, addr, 4);-}--static uint32_t pci_config_readw(PCIDevice *d, uint32_t addr)-{- PCIBus *s = d->bus;- addr |= (pci_bus_num(s) << 16) | (d->devfn << 8);- return pci_data_read(s, addr, 2);-}--static uint32_t pci_config_readb(PCIDevice *d, uint32_t addr)-{- PCIBus *s = d->bus;- addr |= (pci_bus_num(s) << 16) | (d->devfn << 8);- return pci_data_read(s, addr, 1);-}--static void pci_set_io_region_addr(PCIDevice *d, int region_num, uint32_t addr)-{- PCIIORegion *r;- uint16_t cmd;- uint32_t ofs;-- if ( region_num == PCI_ROM_SLOT ) {- ofs = 0x30;- }else{- ofs = 0x10 + region_num * 4;- }-- pci_config_writel(d, ofs, addr);- r = &d->io_regions[region_num];-- /* enable memory mappings */- cmd = pci_config_readw(d, PCI_COMMAND);- if ( region_num == PCI_ROM_SLOT )- cmd |= 2;- else if (r->type & PCI_ADDRESS_SPACE_IO)- cmd |= 1;- else- cmd |= 2;- pci_config_writew(d, PCI_COMMAND, cmd);-}--static void pci_bios_init_device(PCIDevice *d)-{- int class;- PCIIORegion *r;- uint32_t *paddr;- int i, pin, pic_irq, vendor_id, device_id;-- class = pci_config_readw(d, PCI_CLASS_DEVICE);- vendor_id = pci_config_readw(d, PCI_VENDOR_ID);- device_id = pci_config_readw(d, PCI_DEVICE_ID);- switch(class) {- case 0x0101:- if (vendor_id == 0x8086 && device_id == 0x7010) {- /* PIIX3 IDE */- pci_config_writew(d, 0x40, 0x8000); // enable IDE0- pci_config_writew(d, 0x42, 0x8000); // enable IDE1- goto default_map;- } else {- /* IDE: we map it as in ISA mode */- pci_set_io_region_addr(d, 0, 0x1f0);- pci_set_io_region_addr(d, 1, 0x3f4);- pci_set_io_region_addr(d, 2, 0x170);- pci_set_io_region_addr(d, 3, 0x374);- }- break;- case 0x0680:- if (vendor_id == 0x8086 && device_id == 0x7113) {- /*- * PIIX4 ACPI PM.- * Special device with special PCI config space. No ordinary BARs.- */- pci_config_writew(d, 0x20, 0x0000); // No smb bus IO enable- pci_config_writew(d, 0x22, 0x0000);- pci_config_writew(d, 0x3c, 0x0009); // Hardcoded IRQ9- pci_config_writew(d, 0x3d, 0x0001);- }- break;- case 0x0300:- if (vendor_id != 0x1234)- goto default_map;- /* VGA: map frame buffer to default Bochs VBE address */- pci_set_io_region_addr(d, 0, 0xE0000000);- break;- case 0x0800:- /* PIC */- vendor_id = pci_config_readw(d, PCI_VENDOR_ID);- device_id = pci_config_readw(d, PCI_DEVICE_ID);- if (vendor_id == 0x1014) {- /* IBM */- if (device_id == 0x0046 || device_id == 0xFFFF) {- /* MPIC & MPIC2 */- pci_set_io_region_addr(d, 0, 0x80800000 + 0x00040000);- }- }- break;- case 0xff00:- if (vendor_id == 0x0106b &&- (device_id == 0x0017 || device_id == 0x0022)) {- /* macio bridge */- pci_set_io_region_addr(d, 0, 0x80800000);- }- break;- default:- default_map:- /* default memory mappings */- for(i = 0; i < PCI_NUM_REGIONS; i++) {- r = &d->io_regions[i];- if (r->size) {- if (r->type & PCI_ADDRESS_SPACE_IO)- paddr = &pci_bios_io_addr;- else- paddr = &pci_bios_mem_addr;- *paddr = (*paddr + r->size - 1) & ~(r->size - 1);- pci_set_io_region_addr(d, i, *paddr);- *paddr += r->size;- }- }- break;- }-- /* map the interrupt */- pin = pci_config_readb(d, PCI_INTERRUPT_PIN);- if (pin != 0) {- pin = pci_slot_get_pirq(d, pin - 1);- pic_irq = pci_irqs[pin];- pci_config_writeb(d, PCI_INTERRUPT_LINE, pic_irq);- }-}--/*- * This function initializes the PCI devices as a normal PCI BIOS- * would do. It is provided just in case the BIOS has no support for- * PCI.- */-void pci_bios_init(void)-{- int i, irq;- uint8_t elcr[2];-- pci_bios_io_addr = 0xc000;- pci_bios_mem_addr = HVM_BELOW_4G_MMIO_START;-- /* activate IRQ mappings */- elcr[0] = 0x00;- elcr[1] = 0x00;- for(i = 0; i < 4; i++) {- irq = pci_irqs[i];- /* set to trigger level */- elcr[irq >> 3] |= (1 << (irq & 7));- /* activate irq remapping in PIIX */- pci_config_writeb(piix3_dev, 0x60 + i, irq);- }- isa_outb(elcr[0], 0x4d0);- isa_outb(elcr[1], 0x4d1);-- pci_for_each_device(pci_bios_init_device);-}-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -