📄 pci.c
字号:
d->config[0x21] = 0x80; d->config[0x22] = 0x90; // memory_limit d->config[0x23] = 0x80; d->config[0x24] = 0x00; // prefetchable_memory_base d->config[0x25] = 0x84; d->config[0x26] = 0x00; // prefetchable_memory_limit d->config[0x27] = 0x85;#endif return s;}/* Uninorth PCI host (for all Mac99 and newer machines */static void pci_unin_main_config_writel (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque; int i;#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif for (i = 11; i < 32; i++) { if ((val & (1 << i)) != 0) break; }#if 0 s->config_reg = 0x80000000 | (1 << 16) | (val & 0x7FC) | (i << 11);#else s->config_reg = 0x80000000 | (0 << 16) | (val & 0x7FC) | (i << 11);#endif}static uint32_t pci_unin_main_config_readl (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; int devfn; devfn = (s->config_reg >> 8) & 0xFF; val = (1 << (devfn >> 3)) | ((devfn & 0x07) << 8) | (s->config_reg & 0xFC);#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif return val;}static CPUWriteMemoryFunc *pci_unin_main_config_write[] = { &pci_unin_main_config_writel, &pci_unin_main_config_writel, &pci_unin_main_config_writel,};static CPUReadMemoryFunc *pci_unin_main_config_read[] = { &pci_unin_main_config_readl, &pci_unin_main_config_readl, &pci_unin_main_config_readl,};static void pci_unin_main_writeb (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque; pci_data_write(s, addr & 7, val, 1);}static void pci_unin_main_writew (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN val = bswap16(val);#endif pci_data_write(s, addr & 7, val, 2);}static void pci_unin_main_writel (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif pci_data_write(s, addr & 7, val, 4);}static uint32_t pci_unin_main_readb (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = pci_data_read(s, addr & 7, 1); return val;}static uint32_t pci_unin_main_readw (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = pci_data_read(s, addr & 7, 2);#ifdef TARGET_WORDS_BIGENDIAN val = bswap16(val);#endif return val;}static uint32_t pci_unin_main_readl (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = pci_data_read(s, addr, 4);#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif return val;}static CPUWriteMemoryFunc *pci_unin_main_write[] = { &pci_unin_main_writeb, &pci_unin_main_writew, &pci_unin_main_writel,};static CPUReadMemoryFunc *pci_unin_main_read[] = { &pci_unin_main_readb, &pci_unin_main_readw, &pci_unin_main_readl,};#if 0static void pci_unin_config_writel (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif s->config_reg = 0x80000000 | (val & ~0x00000001);}static uint32_t pci_unin_config_readl (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = (s->config_reg | 0x00000001) & ~0x80000000;#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif return val;}static CPUWriteMemoryFunc *pci_unin_config_write[] = { &pci_unin_config_writel, &pci_unin_config_writel, &pci_unin_config_writel,};static CPUReadMemoryFunc *pci_unin_config_read[] = { &pci_unin_config_readl, &pci_unin_config_readl, &pci_unin_config_readl,};static void pci_unin_writeb (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque; pci_data_write(s, addr & 3, val, 1);}static void pci_unin_writew (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN val = bswap16(val);#endif pci_data_write(s, addr & 3, val, 2);}static void pci_unin_writel (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif pci_data_write(s, addr & 3, val, 4);}static uint32_t pci_unin_readb (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = pci_data_read(s, addr & 3, 1); return val;}static uint32_t pci_unin_readw (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = pci_data_read(s, addr & 3, 2);#ifdef TARGET_WORDS_BIGENDIAN val = bswap16(val);#endif return val;}static uint32_t pci_unin_readl (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; val = pci_data_read(s, addr & 3, 4);#ifdef TARGET_WORDS_BIGENDIAN val = bswap32(val);#endif return val;}static CPUWriteMemoryFunc *pci_unin_write[] = { &pci_unin_writeb, &pci_unin_writew, &pci_unin_writel,};static CPUReadMemoryFunc *pci_unin_read[] = { &pci_unin_readb, &pci_unin_readw, &pci_unin_readl,};#endifPCIBus *pci_pmac_init(void){ PCIBus *s; PCIDevice *d; int pci_mem_config, pci_mem_data; /* Use values found on a real PowerMac */ /* Uninorth main bus */ s = pci_register_bus(); s->set_irq = pci_set_irq_simple; pci_mem_config = cpu_register_io_memory(0, pci_unin_main_config_read, pci_unin_main_config_write, s); pci_mem_data = cpu_register_io_memory(0, pci_unin_main_read, pci_unin_main_write, s); cpu_register_physical_memory(0xf2800000, 0x1000, pci_mem_config); cpu_register_physical_memory(0xf2c00000, 0x1000, pci_mem_data); s->devfn_min = 11 << 3; d = pci_register_device(s, "Uni-north main", sizeof(PCIDevice), 11 << 3, NULL, NULL); d->config[0x00] = 0x6b; // vendor_id : Apple d->config[0x01] = 0x10; d->config[0x02] = 0x1F; // device_id d->config[0x03] = 0x00; d->config[0x08] = 0x00; // revision d->config[0x0A] = 0x00; // class_sub = pci host d->config[0x0B] = 0x06; // class_base = PCI_bridge d->config[0x0C] = 0x08; // cache_line_size d->config[0x0D] = 0x10; // latency_timer d->config[0x0E] = 0x00; // header_type d->config[0x34] = 0x00; // capabilities_pointer#if 0 // XXX: not activated as PPC BIOS doesn't handle mutiple buses properly /* pci-to-pci bridge */ d = pci_register_device("Uni-north bridge", sizeof(PCIDevice), 0, 13 << 3, NULL, NULL); d->config[0x00] = 0x11; // vendor_id : TI d->config[0x01] = 0x10; d->config[0x02] = 0x26; // device_id d->config[0x03] = 0x00; d->config[0x08] = 0x05; // revision d->config[0x0A] = 0x04; // class_sub = pci2pci d->config[0x0B] = 0x06; // class_base = PCI_bridge d->config[0x0C] = 0x08; // cache_line_size d->config[0x0D] = 0x20; // latency_timer d->config[0x0E] = 0x01; // header_type d->config[0x18] = 0x01; // primary_bus d->config[0x19] = 0x02; // secondary_bus d->config[0x1A] = 0x02; // subordinate_bus d->config[0x1B] = 0x20; // secondary_latency_timer d->config[0x1C] = 0x11; // io_base d->config[0x1D] = 0x01; // io_limit d->config[0x20] = 0x00; // memory_base d->config[0x21] = 0x80; d->config[0x22] = 0x00; // memory_limit d->config[0x23] = 0x80; d->config[0x24] = 0x01; // prefetchable_memory_base d->config[0x25] = 0x80; d->config[0x26] = 0xF1; // prefectchable_memory_limit d->config[0x27] = 0x7F; // d->config[0x34] = 0xdc // capabilities_pointer#endif#if 0 // XXX: not needed for now /* Uninorth AGP bus */ s = &pci_bridge[1]; pci_mem_config = cpu_register_io_memory(0, pci_unin_config_read, pci_unin_config_write, s); pci_mem_data = cpu_register_io_memory(0, pci_unin_read, pci_unin_write, s); cpu_register_physical_memory(0xf0800000, 0x1000, pci_mem_config); cpu_register_physical_memory(0xf0c00000, 0x1000, pci_mem_data); d = pci_register_device("Uni-north AGP", sizeof(PCIDevice), 0, 11 << 3, NULL, NULL); d->config[0x00] = 0x6b; // vendor_id : Apple d->config[0x01] = 0x10; d->config[0x02] = 0x20; // device_id d->config[0x03] = 0x00; d->config[0x08] = 0x00; // revision d->config[0x0A] = 0x00; // class_sub = pci host d->config[0x0B] = 0x06; // class_base = PCI_bridge d->config[0x0C] = 0x08; // cache_line_size d->config[0x0D] = 0x10; // latency_timer d->config[0x0E] = 0x00; // header_type // d->config[0x34] = 0x80; // capabilities_pointer#endif#if 0 // XXX: not needed for now /* Uninorth internal bus */ s = &pci_bridge[2]; pci_mem_config = cpu_register_io_memory(0, pci_unin_config_read, pci_unin_config_write, s); pci_mem_data = cpu_register_io_memory(0, pci_unin_read, pci_unin_write, s); cpu_register_physical_memory(0xf4800000, 0x1000, pci_mem_config); cpu_register_physical_memory(0xf4c00000, 0x1000, pci_mem_data); d = pci_register_device("Uni-north internal", sizeof(PCIDevice), 3, 11 << 3, NULL, NULL); d->config[0x00] = 0x6b; // vendor_id : Apple d->config[0x01] = 0x10; d->config[0x02] = 0x1E; // device_id d->config[0x03] = 0x00; d->config[0x08] = 0x00; // revision d->config[0x0A] = 0x00; // class_sub = pci host d->config[0x0B] = 0x06; // class_base = PCI_bridge d->config[0x0C] = 0x08; // cache_line_size d->config[0x0D] = 0x10; // latency_timer d->config[0x0E] = 0x00; // header_type d->config[0x34] = 0x00; // capabilities_pointer#endif return s;}/* Ultrasparc APB PCI host */static void pci_apb_config_writel (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque; int i; for (i = 11; i < 32; i++) { if ((val & (1 << i)) != 0) break; } s->config_reg = 0x80000000 | (1 << 16) | (val & 0x7FC) | (i << 11);}static uint32_t pci_apb_config_readl (void *opaque, target_phys_addr_t addr){ PCIBus *s = opaque; uint32_t val; int devfn; devfn = (s->config_reg >> 8) & 0xFF; val = (1 << (devfn >> 3)) | ((devfn & 0x07) << 8) | (s->config_reg & 0xFC); return val;}static CPUWriteMemoryFunc *pci_apb_config_write[] = { &pci_apb_config_writel, &pci_apb_config_writel, &pci_apb_config_writel,};static CPUReadMemoryFunc *pci_apb_config_read[] = { &pci_apb_config_readl, &pci_apb_config_readl, &pci_apb_config_readl,};static void apb_config_writel (void *opaque, target_phys_addr_t addr, uint32_t val){ //PCIBus *s = opaque; switch (addr & 0x3f) { case 0x00: // Control/Status case 0x10: // AFSR case 0x18: // AFAR case 0x20: // Diagnostic case 0x28: // Target address space // XXX default: break; }}static uint32_t apb_config_readl (void *opaque, target_phys_addr_t addr){ //PCIBus *s = opaque; uint32_t val; switch (addr & 0x3f) { case 0x00: // Control/Status case 0x10: // AFSR case 0x18: // AFAR case 0x20: // Diagnostic case 0x28: // Target address space // XXX default: val = 0; break; } return val;}static CPUWriteMemoryFunc *apb_config_write[] = { &apb_config_writel, &apb_config_writel, &apb_config_writel,};static CPUReadMemoryFunc *apb_config_read[] = { &apb_config_readl, &apb_config_readl, &apb_config_readl,};static void pci_apb_writeb (void *opaque, target_phys_addr_t addr, uint32_t val){ PCIBus *s = opaque; pci_data_write(s, addr & 7, val, 1);}static void pci_apb_writew (void *opaque, target_phys_addr_t addr, uint32_t val)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -