Revision 34ba1dc8

b/hw/ppc440_bamboo.c
27 27
#include "ppc.h"
28 28
#include "ppc405.h"
29 29
#include "sysemu.h"
30
#include "sysbus.h"
30 31

  
31 32
#define BINARY_DEVICE_TREE_FILE "bamboo.dtb"
32 33

  
......
50 51

  
51 52
static target_phys_addr_t entry;
52 53

  
53
static PCIBus *ppc4xx_pci_init(CPUState *env, qemu_irq pci_irqs[4],
54
                               target_phys_addr_t config_space,
55
                               target_phys_addr_t int_ack,
56
                               target_phys_addr_t special_cycle,
57
                               target_phys_addr_t registers)
58
{
59
    return NULL;
60
}
61

  
62
CPUState *ppc440ep_init(MemoryRegion *address_space_mem, ram_addr_t *ram_size,
63
                        PCIBus **pcip, const unsigned int pci_irq_nrs[4],
64
                        int do_init, const char *cpu_model)
65
{
66
    MemoryRegion *ram_memories
67
        = g_malloc(PPC440EP_SDRAM_NR_BANKS * sizeof(*ram_memories));
68
    target_phys_addr_t ram_bases[PPC440EP_SDRAM_NR_BANKS];
69
    target_phys_addr_t ram_sizes[PPC440EP_SDRAM_NR_BANKS];
70
    CPUState *env;
71
    qemu_irq *pic;
72
    qemu_irq *irqs;
73
    qemu_irq *pci_irqs;
74

  
75
    if (cpu_model == NULL) {
76
        cpu_model = "440EP";
77
    }
78
    env = cpu_init(cpu_model);
79
    if (!env) {
80
        fprintf(stderr, "Unable to initialize CPU!\n");
81
        exit(1);
82
    }
83

  
84
    ppc_booke_timers_init(env, 400000000, 0);
85
    ppc_dcr_init(env, NULL, NULL);
86

  
87
    /* interrupt controller */
88
    irqs = g_malloc0(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
89
    irqs[PPCUIC_OUTPUT_INT] = ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
90
    irqs[PPCUIC_OUTPUT_CINT] = ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
91
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
92

  
93
    /* SDRAM controller */
94
    memset(ram_bases, 0, sizeof(ram_bases));
95
    memset(ram_sizes, 0, sizeof(ram_sizes));
96
    *ram_size = ppc4xx_sdram_adjust(*ram_size, PPC440EP_SDRAM_NR_BANKS,
97
                                    ram_memories,
98
                                    ram_bases, ram_sizes,
99
                                    ppc440ep_sdram_bank_sizes);
100
    /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
101
    ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
102
                      ram_bases, ram_sizes, do_init);
103

  
104
    /* PCI */
105
    pci_irqs = g_malloc(sizeof(qemu_irq) * 4);
106
    pci_irqs[0] = pic[pci_irq_nrs[0]];
107
    pci_irqs[1] = pic[pci_irq_nrs[1]];
108
    pci_irqs[2] = pic[pci_irq_nrs[2]];
109
    pci_irqs[3] = pic[pci_irq_nrs[3]];
110
    *pcip = ppc4xx_pci_init(env, pci_irqs,
111
                            PPC440EP_PCI_CONFIG,
112
                            PPC440EP_PCI_INTACK,
113
                            PPC440EP_PCI_SPECIAL,
114
                            PPC440EP_PCI_REGS);
115
    if (!*pcip)
116
        printf("couldn't create PCI controller!\n");
117

  
118
    isa_mmio_init(PPC440EP_PCI_IO, PPC440EP_PCI_IOLEN);
119

  
120
    if (serial_hds[0] != NULL) {
121
        serial_mm_init(address_space_mem, 0xef600300, 0, pic[0],
122
                       PPC_SERIAL_MM_BAUDBASE, serial_hds[0],
123
                       DEVICE_BIG_ENDIAN);
124
    }
125
    if (serial_hds[1] != NULL) {
126
        serial_mm_init(address_space_mem, 0xef600400, 0, pic[1],
127
                       PPC_SERIAL_MM_BAUDBASE, serial_hds[1],
128
                       DEVICE_BIG_ENDIAN);
129
    }
130

  
131
    return env;
132
}
133

  
134 54
static int bamboo_load_device_tree(target_phys_addr_t addr,
135 55
                                     uint32_t ramsize,
136 56
                                     target_phys_addr_t initrd_base,
......
245 165
{
246 166
    unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 };
247 167
    MemoryRegion *address_space_mem = get_system_memory();
168
    MemoryRegion *ram_memories
169
        = g_malloc(PPC440EP_SDRAM_NR_BANKS * sizeof(*ram_memories));
170
    target_phys_addr_t ram_bases[PPC440EP_SDRAM_NR_BANKS];
171
    target_phys_addr_t ram_sizes[PPC440EP_SDRAM_NR_BANKS];
172
    qemu_irq *pic;
173
    qemu_irq *irqs;
248 174
    PCIBus *pcibus;
249 175
    CPUState *env;
250 176
    uint64_t elf_entry;
251 177
    uint64_t elf_lowaddr;
252 178
    target_phys_addr_t loadaddr = 0;
253 179
    target_long initrd_size = 0;
180
    DeviceState *dev;
254 181
    int success;
255 182
    int i;
256 183

  
257 184
    /* Setup CPU. */
258
    env = ppc440ep_init(address_space_mem, &ram_size, &pcibus,
259
                        pci_irq_nrs, 1, cpu_model);
185
    if (cpu_model == NULL) {
186
        cpu_model = "440EP";
187
    }
188
    env = cpu_init(cpu_model);
189
    if (!env) {
190
        fprintf(stderr, "Unable to initialize CPU!\n");
191
        exit(1);
192
    }
193

  
260 194
    qemu_register_reset(main_cpu_reset, env);
195
    ppc_booke_timers_init(env, 400000000, 0);
196
    ppc_dcr_init(env, NULL, NULL);
197

  
198
    /* interrupt controller */
199
    irqs = g_malloc0(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
200
    irqs[PPCUIC_OUTPUT_INT] = ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
201
    irqs[PPCUIC_OUTPUT_CINT] = ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
202
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
203

  
204
    /* SDRAM controller */
205
    memset(ram_bases, 0, sizeof(ram_bases));
206
    memset(ram_sizes, 0, sizeof(ram_sizes));
207
    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
208
                                   ram_memories,
209
                                   ram_bases, ram_sizes,
210
                                   ppc440ep_sdram_bank_sizes);
211
    /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
212
    ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
213
                      ram_bases, ram_sizes, 1);
214

  
215
    /* PCI */
216
    dev = sysbus_create_varargs("ppc4xx-pcihost", PPC440EP_PCI_CONFIG,
217
                                pic[pci_irq_nrs[0]], pic[pci_irq_nrs[1]],
218
                                pic[pci_irq_nrs[2]], pic[pci_irq_nrs[3]],
219
                                NULL);
220
    pcibus = (PCIBus *)qdev_get_child_bus(dev, "pci.0");
221
    if (!pcibus) {
222
        fprintf(stderr, "couldn't create PCI controller!\n");
223
        exit(1);
224
    }
225

  
226
    isa_mmio_init(PPC440EP_PCI_IO, PPC440EP_PCI_IOLEN);
227

  
228
    if (serial_hds[0] != NULL) {
229
        serial_mm_init(address_space_mem, 0xef600300, 0, pic[0],
230
                       PPC_SERIAL_MM_BAUDBASE, serial_hds[0],
231
                       DEVICE_BIG_ENDIAN);
232
    }
233
    if (serial_hds[1] != NULL) {
234
        serial_mm_init(address_space_mem, 0xef600400, 0, pic[1],
235
                       PPC_SERIAL_MM_BAUDBASE, serial_hds[1],
236
                       DEVICE_BIG_ENDIAN);
237
    }
261 238

  
262 239
    if (pcibus) {
263 240
        /* Register network interfaces. */

Also available in: Unified diff