Revision b5cec4c5 hw/spapr.c

b/hw/spapr.c
34 34

  
35 35
#include "hw/spapr.h"
36 36
#include "hw/spapr_vio.h"
37
#include "hw/xics.h"
37 38

  
38 39
#include <libfdt.h>
39 40

  
......
45 46
#define TIMEBASE_FREQ           512000000ULL
46 47

  
47 48
#define MAX_CPUS                32
49
#define XICS_IRQS		1024
48 50

  
49 51
sPAPREnvironment *spapr;
50 52

  
......
64 66
    uint32_t end_prop = cpu_to_be32(initrd_base + initrd_size);
65 67
    uint32_t pft_size_prop[] = {0, cpu_to_be32(hash_shift)};
66 68
    char hypertas_prop[] = "hcall-pft\0hcall-term\0hcall-dabr";
69
    uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(smp_cpus)};
67 70
    int i;
68 71
    char *modelname;
69 72
    int ret;
......
125 128

  
126 129
    for (i = 0; i < smp_cpus; i++) {
127 130
        CPUState *env = envs[i];
131
        uint32_t gserver_prop[] = {cpu_to_be32(i), 0}; /* HACK! */
128 132
        char *nodename;
129 133
        uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
130 134
                           0xffffffff, 0xffffffff};
......
155 159
                           pft_size_prop, sizeof(pft_size_prop))));
156 160
        _FDT((fdt_property_string(fdt, "status", "okay")));
157 161
        _FDT((fdt_property(fdt, "64-bit", NULL, 0)));
162
        _FDT((fdt_property_cell(fdt, "ibm,ppc-interrupt-server#s", i)));
163
        _FDT((fdt_property(fdt, "ibm,ppc-interrupt-gserver#s",
164
                           gserver_prop, sizeof(gserver_prop))));
158 165

  
159 166
        if (envs[i]->mmu_model & POWERPC_MMU_1TSEG) {
160 167
            _FDT((fdt_property(fdt, "ibm,processor-segment-sizes",
......
176 183

  
177 184
    _FDT((fdt_end_node(fdt)));
178 185

  
186
    /* interrupt controller */
187
    _FDT((fdt_begin_node(fdt, "interrupt-controller@0")));
188

  
189
    _FDT((fdt_property_string(fdt, "device_type",
190
                              "PowerPC-External-Interrupt-Presentation")));
191
    _FDT((fdt_property_string(fdt, "compatible", "IBM,ppc-xicp")));
192
    _FDT((fdt_property_cell(fdt, "reg", 0)));
193
    _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0)));
194
    _FDT((fdt_property(fdt, "ibm,interrupt-server-ranges",
195
                       interrupt_server_ranges_prop,
196
                       sizeof(interrupt_server_ranges_prop))));
197

  
198
    _FDT((fdt_end_node(fdt)));
199

  
179 200
    /* vdevice */
180 201
    _FDT((fdt_begin_node(fdt, "vdevice")));
181 202

  
......
183 204
    _FDT((fdt_property_string(fdt, "compatible", "IBM,vdevice")));
184 205
    _FDT((fdt_property_cell(fdt, "#address-cells", 0x1)));
185 206
    _FDT((fdt_property_cell(fdt, "#size-cells", 0x0)));
207
    _FDT((fdt_property_cell(fdt, "#interrupt-cells", 0x2)));
208
    _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0)));
186 209

  
187 210
    _FDT((fdt_end_node(fdt)));
188 211

  
......
296 319
    }
297 320
    qemu_free(filename);
298 321

  
322
    /* Set up Interrupt Controller */
323
    spapr->icp = xics_system_init(smp_cpus, envs, XICS_IRQS);
324

  
325
    /* Set up VIO bus */
299 326
    spapr->vio_bus = spapr_vio_bus_init();
300 327

  
301 328
    for (i = 0; i < MAX_SERIAL_PORTS; i++) {

Also available in: Unified diff