⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -