27
27
#include "ppc_mac.h"
31
//#define DEBUG_GRACKLE
34
#define GRACKLE_DPRINTF(fmt, args...) \
35
do { printf("GRACKLE: " fmt , ##args); } while (0)
37
#define GRACKLE_DPRINTF(fmt, args...)
30
40
typedef target_phys_addr_t pci_addr_t;
31
41
#include "pci_host.h"
87
102
static void pci_grackle_set_irq(qemu_irq *pic, int irq_num, int level)
104
GRACKLE_DPRINTF("set_irq num %d level %d\n", irq_num, level);
89
105
qemu_set_irq(pic[irq_num + 0x15], level);
108
static void pci_grackle_save(QEMUFile* f, void *opaque)
110
PCIDevice *d = opaque;
112
pci_device_save(d, f);
115
static int pci_grackle_load(QEMUFile* f, void *opaque, int version_id)
117
PCIDevice *d = opaque;
122
return pci_device_load(d, f);
125
static void pci_grackle_reset(void *opaque)
92
129
PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic)
107
144
cpu_register_physical_memory(base + 0x00200000, 0x1000, pci_mem_data);
108
145
d = pci_register_device(s->bus, "Grackle host bridge", sizeof(PCIDevice),
110
d->config[0x00] = 0x57; // vendor_id
111
d->config[0x01] = 0x10;
112
d->config[0x02] = 0x02; // device_id
113
d->config[0x03] = 0x00;
147
pci_config_set_vendor_id(d->config, PCI_VENDOR_ID_MOTOROLA);
148
pci_config_set_device_id(d->config, PCI_DEVICE_ID_MOTOROLA_MPC106);
114
149
d->config[0x08] = 0x00; // revision
115
150
d->config[0x09] = 0x01;
116
d->config[0x0a] = 0x00; // class_sub = host
117
d->config[0x0b] = 0x06; // class_base = PCI_bridge
151
pci_config_set_class(d->config, PCI_CLASS_BRIDGE_HOST);
118
152
d->config[0x0e] = 0x00; // header_type
121
155
/* PCI2PCI bridge same values as PearPC - check this */
122
d->config[0x00] = 0x11; // vendor_id
123
d->config[0x01] = 0x10;
124
d->config[0x02] = 0x26; // device_id
125
d->config[0x03] = 0x00;
156
pci_config_set_vendor_id(d->config, PCI_VENDOR_ID_DEC);
157
pci_config_set_device_id(d->config, PCI_DEVICE_ID_DEC_21154);
126
158
d->config[0x08] = 0x02; // revision
127
d->config[0x0a] = 0x04; // class_sub = pci2pci
128
d->config[0x0b] = 0x06; // class_base = PCI_bridge
159
pci_config_set_class(d->config, PCI_CLASS_BRIDGE_PCI);
129
160
d->config[0x0e] = 0x01; // header_type
131
162
d->config[0x18] = 0x0; // primary_bus
144
175
d->config[0x26] = 0x00; // prefetchable_memory_limit
145
176
d->config[0x27] = 0x85;
178
register_savevm("grackle", 0, 1, pci_grackle_save, pci_grackle_load, d);
179
qemu_register_reset(pci_grackle_reset, d);
180
pci_grackle_reset(d);