Statistics
| Branch: | Revision:

root / hw / ppc4xx_pci.c @ 6d3b6d3d

History | View | Annotate | Download (11.1 kB)

1 825bb581 aurel32
/*
2 825bb581 aurel32
 * This program is free software; you can redistribute it and/or modify
3 825bb581 aurel32
 * it under the terms of the GNU General Public License, version 2, as
4 825bb581 aurel32
 * published by the Free Software Foundation.
5 825bb581 aurel32
 *
6 825bb581 aurel32
 * This program is distributed in the hope that it will be useful,
7 825bb581 aurel32
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 825bb581 aurel32
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9 825bb581 aurel32
 * GNU General Public License for more details.
10 825bb581 aurel32
 *
11 825bb581 aurel32
 * You should have received a copy of the GNU General Public License
12 8167ee88 Blue Swirl
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
13 825bb581 aurel32
 *
14 825bb581 aurel32
 * Copyright IBM Corp. 2008
15 825bb581 aurel32
 *
16 825bb581 aurel32
 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
17 825bb581 aurel32
 */
18 825bb581 aurel32
19 825bb581 aurel32
/* This file implements emulation of the 32-bit PCI controller found in some
20 825bb581 aurel32
 * 4xx SoCs, such as the 440EP. */
21 825bb581 aurel32
22 825bb581 aurel32
#include "hw.h"
23 0c34a5d7 aurel32
#include "ppc.h"
24 0c34a5d7 aurel32
#include "ppc4xx.h"
25 825bb581 aurel32
#include "pci.h"
26 825bb581 aurel32
#include "pci_host.h"
27 1e39101c Avi Kivity
#include "exec-memory.h"
28 825bb581 aurel32
29 825bb581 aurel32
#undef DEBUG
30 825bb581 aurel32
#ifdef DEBUG
31 825bb581 aurel32
#define DPRINTF(fmt, ...) do { printf(fmt, ## __VA_ARGS__); } while (0)
32 825bb581 aurel32
#else
33 001faf32 Blue Swirl
#define DPRINTF(fmt, ...)
34 825bb581 aurel32
#endif /* DEBUG */
35 825bb581 aurel32
36 825bb581 aurel32
struct PCIMasterMap {
37 825bb581 aurel32
    uint32_t la;
38 825bb581 aurel32
    uint32_t ma;
39 825bb581 aurel32
    uint32_t pcila;
40 825bb581 aurel32
    uint32_t pciha;
41 825bb581 aurel32
};
42 825bb581 aurel32
43 825bb581 aurel32
struct PCITargetMap {
44 825bb581 aurel32
    uint32_t ms;
45 825bb581 aurel32
    uint32_t la;
46 825bb581 aurel32
};
47 825bb581 aurel32
48 825bb581 aurel32
#define PPC4xx_PCI_NR_PMMS 3
49 825bb581 aurel32
#define PPC4xx_PCI_NR_PTMS 2
50 825bb581 aurel32
51 825bb581 aurel32
struct PPC4xxPCIState {
52 623f7c21 Alexander Graf
    PCIHostState pci_state;
53 623f7c21 Alexander Graf
54 825bb581 aurel32
    struct PCIMasterMap pmm[PPC4xx_PCI_NR_PMMS];
55 825bb581 aurel32
    struct PCITargetMap ptm[PPC4xx_PCI_NR_PTMS];
56 623f7c21 Alexander Graf
    qemu_irq irq[4];
57 825bb581 aurel32
58 623f7c21 Alexander Graf
    MemoryRegion container;
59 623f7c21 Alexander Graf
    MemoryRegion iomem;
60 825bb581 aurel32
};
61 825bb581 aurel32
typedef struct PPC4xxPCIState PPC4xxPCIState;
62 825bb581 aurel32
63 825bb581 aurel32
#define PCIC0_CFGADDR       0x0
64 825bb581 aurel32
#define PCIC0_CFGDATA       0x4
65 825bb581 aurel32
66 825bb581 aurel32
/* PLB Memory Map (PMM) registers specify which PLB addresses are translated to
67 825bb581 aurel32
 * PCI accesses. */
68 825bb581 aurel32
#define PCIL0_PMM0LA        0x0
69 825bb581 aurel32
#define PCIL0_PMM0MA        0x4
70 825bb581 aurel32
#define PCIL0_PMM0PCILA     0x8
71 825bb581 aurel32
#define PCIL0_PMM0PCIHA     0xc
72 825bb581 aurel32
#define PCIL0_PMM1LA        0x10
73 825bb581 aurel32
#define PCIL0_PMM1MA        0x14
74 825bb581 aurel32
#define PCIL0_PMM1PCILA     0x18
75 825bb581 aurel32
#define PCIL0_PMM1PCIHA     0x1c
76 825bb581 aurel32
#define PCIL0_PMM2LA        0x20
77 825bb581 aurel32
#define PCIL0_PMM2MA        0x24
78 825bb581 aurel32
#define PCIL0_PMM2PCILA     0x28
79 825bb581 aurel32
#define PCIL0_PMM2PCIHA     0x2c
80 825bb581 aurel32
81 825bb581 aurel32
/* PCI Target Map (PTM) registers specify which PCI addresses are translated to
82 825bb581 aurel32
 * PLB accesses. */
83 825bb581 aurel32
#define PCIL0_PTM1MS        0x30
84 825bb581 aurel32
#define PCIL0_PTM1LA        0x34
85 825bb581 aurel32
#define PCIL0_PTM2MS        0x38
86 825bb581 aurel32
#define PCIL0_PTM2LA        0x3c
87 623f7c21 Alexander Graf
#define PCI_REG_BASE        0x800000
88 825bb581 aurel32
#define PCI_REG_SIZE        0x40
89 825bb581 aurel32
90 623f7c21 Alexander Graf
#define PCI_ALL_SIZE        (PCI_REG_BASE + PCI_REG_SIZE)
91 825bb581 aurel32
92 da726e5e Avi Kivity
static uint64_t pci4xx_cfgaddr_read(void *opaque, target_phys_addr_t addr,
93 da726e5e Avi Kivity
                                    unsigned size)
94 825bb581 aurel32
{
95 825bb581 aurel32
    PPC4xxPCIState *ppc4xx_pci = opaque;
96 825bb581 aurel32
97 825bb581 aurel32
    return ppc4xx_pci->pci_state.config_reg;
98 825bb581 aurel32
}
99 825bb581 aurel32
100 da726e5e Avi Kivity
static void pci4xx_cfgaddr_write(void *opaque, target_phys_addr_t addr,
101 da726e5e Avi Kivity
                                  uint64_t value, unsigned size)
102 825bb581 aurel32
{
103 825bb581 aurel32
    PPC4xxPCIState *ppc4xx_pci = opaque;
104 825bb581 aurel32
105 825bb581 aurel32
    ppc4xx_pci->pci_state.config_reg = value & ~0x3;
106 825bb581 aurel32
}
107 825bb581 aurel32
108 da726e5e Avi Kivity
static const MemoryRegionOps pci4xx_cfgaddr_ops = {
109 da726e5e Avi Kivity
    .read = pci4xx_cfgaddr_read,
110 da726e5e Avi Kivity
    .write = pci4xx_cfgaddr_write,
111 da726e5e Avi Kivity
    .endianness = DEVICE_LITTLE_ENDIAN,
112 825bb581 aurel32
};
113 825bb581 aurel32
114 c227f099 Anthony Liguori
static void ppc4xx_pci_reg_write4(void *opaque, target_phys_addr_t offset,
115 da726e5e Avi Kivity
                                  uint64_t value, unsigned size)
116 825bb581 aurel32
{
117 825bb581 aurel32
    struct PPC4xxPCIState *pci = opaque;
118 825bb581 aurel32
119 825bb581 aurel32
    /* We ignore all target attempts at PCI configuration, effectively
120 825bb581 aurel32
     * assuming a bidirectional 1:1 mapping of PLB and PCI space. */
121 825bb581 aurel32
122 825bb581 aurel32
    switch (offset) {
123 825bb581 aurel32
    case PCIL0_PMM0LA:
124 825bb581 aurel32
        pci->pmm[0].la = value;
125 825bb581 aurel32
        break;
126 825bb581 aurel32
    case PCIL0_PMM0MA:
127 825bb581 aurel32
        pci->pmm[0].ma = value;
128 825bb581 aurel32
        break;
129 825bb581 aurel32
    case PCIL0_PMM0PCIHA:
130 825bb581 aurel32
        pci->pmm[0].pciha = value;
131 825bb581 aurel32
        break;
132 825bb581 aurel32
    case PCIL0_PMM0PCILA:
133 825bb581 aurel32
        pci->pmm[0].pcila = value;
134 825bb581 aurel32
        break;
135 825bb581 aurel32
136 825bb581 aurel32
    case PCIL0_PMM1LA:
137 825bb581 aurel32
        pci->pmm[1].la = value;
138 825bb581 aurel32
        break;
139 825bb581 aurel32
    case PCIL0_PMM1MA:
140 825bb581 aurel32
        pci->pmm[1].ma = value;
141 825bb581 aurel32
        break;
142 825bb581 aurel32
    case PCIL0_PMM1PCIHA:
143 825bb581 aurel32
        pci->pmm[1].pciha = value;
144 825bb581 aurel32
        break;
145 825bb581 aurel32
    case PCIL0_PMM1PCILA:
146 825bb581 aurel32
        pci->pmm[1].pcila = value;
147 825bb581 aurel32
        break;
148 825bb581 aurel32
149 825bb581 aurel32
    case PCIL0_PMM2LA:
150 825bb581 aurel32
        pci->pmm[2].la = value;
151 825bb581 aurel32
        break;
152 825bb581 aurel32
    case PCIL0_PMM2MA:
153 825bb581 aurel32
        pci->pmm[2].ma = value;
154 825bb581 aurel32
        break;
155 825bb581 aurel32
    case PCIL0_PMM2PCIHA:
156 825bb581 aurel32
        pci->pmm[2].pciha = value;
157 825bb581 aurel32
        break;
158 825bb581 aurel32
    case PCIL0_PMM2PCILA:
159 825bb581 aurel32
        pci->pmm[2].pcila = value;
160 825bb581 aurel32
        break;
161 825bb581 aurel32
162 825bb581 aurel32
    case PCIL0_PTM1MS:
163 825bb581 aurel32
        pci->ptm[0].ms = value;
164 825bb581 aurel32
        break;
165 825bb581 aurel32
    case PCIL0_PTM1LA:
166 825bb581 aurel32
        pci->ptm[0].la = value;
167 825bb581 aurel32
        break;
168 825bb581 aurel32
    case PCIL0_PTM2MS:
169 825bb581 aurel32
        pci->ptm[1].ms = value;
170 825bb581 aurel32
        break;
171 825bb581 aurel32
    case PCIL0_PTM2LA:
172 825bb581 aurel32
        pci->ptm[1].la = value;
173 825bb581 aurel32
        break;
174 825bb581 aurel32
175 825bb581 aurel32
    default:
176 825bb581 aurel32
        printf("%s: unhandled PCI internal register 0x%lx\n", __func__,
177 825bb581 aurel32
               (unsigned long)offset);
178 825bb581 aurel32
        break;
179 825bb581 aurel32
    }
180 825bb581 aurel32
}
181 825bb581 aurel32
182 da726e5e Avi Kivity
static uint64_t ppc4xx_pci_reg_read4(void *opaque, target_phys_addr_t offset,
183 da726e5e Avi Kivity
                                     unsigned size)
184 825bb581 aurel32
{
185 825bb581 aurel32
    struct PPC4xxPCIState *pci = opaque;
186 825bb581 aurel32
    uint32_t value;
187 825bb581 aurel32
188 825bb581 aurel32
    switch (offset) {
189 825bb581 aurel32
    case PCIL0_PMM0LA:
190 825bb581 aurel32
        value = pci->pmm[0].la;
191 825bb581 aurel32
        break;
192 825bb581 aurel32
    case PCIL0_PMM0MA:
193 825bb581 aurel32
        value = pci->pmm[0].ma;
194 825bb581 aurel32
        break;
195 825bb581 aurel32
    case PCIL0_PMM0PCIHA:
196 825bb581 aurel32
        value = pci->pmm[0].pciha;
197 825bb581 aurel32
        break;
198 825bb581 aurel32
    case PCIL0_PMM0PCILA:
199 825bb581 aurel32
        value = pci->pmm[0].pcila;
200 825bb581 aurel32
        break;
201 825bb581 aurel32
202 825bb581 aurel32
    case PCIL0_PMM1LA:
203 825bb581 aurel32
        value = pci->pmm[1].la;
204 825bb581 aurel32
        break;
205 825bb581 aurel32
    case PCIL0_PMM1MA:
206 825bb581 aurel32
        value = pci->pmm[1].ma;
207 825bb581 aurel32
        break;
208 825bb581 aurel32
    case PCIL0_PMM1PCIHA:
209 825bb581 aurel32
        value = pci->pmm[1].pciha;
210 825bb581 aurel32
        break;
211 825bb581 aurel32
    case PCIL0_PMM1PCILA:
212 825bb581 aurel32
        value = pci->pmm[1].pcila;
213 825bb581 aurel32
        break;
214 825bb581 aurel32
215 825bb581 aurel32
    case PCIL0_PMM2LA:
216 825bb581 aurel32
        value = pci->pmm[2].la;
217 825bb581 aurel32
        break;
218 825bb581 aurel32
    case PCIL0_PMM2MA:
219 825bb581 aurel32
        value = pci->pmm[2].ma;
220 825bb581 aurel32
        break;
221 825bb581 aurel32
    case PCIL0_PMM2PCIHA:
222 825bb581 aurel32
        value = pci->pmm[2].pciha;
223 825bb581 aurel32
        break;
224 825bb581 aurel32
    case PCIL0_PMM2PCILA:
225 825bb581 aurel32
        value = pci->pmm[2].pcila;
226 825bb581 aurel32
        break;
227 825bb581 aurel32
228 825bb581 aurel32
    case PCIL0_PTM1MS:
229 825bb581 aurel32
        value = pci->ptm[0].ms;
230 825bb581 aurel32
        break;
231 825bb581 aurel32
    case PCIL0_PTM1LA:
232 825bb581 aurel32
        value = pci->ptm[0].la;
233 825bb581 aurel32
        break;
234 825bb581 aurel32
    case PCIL0_PTM2MS:
235 825bb581 aurel32
        value = pci->ptm[1].ms;
236 825bb581 aurel32
        break;
237 825bb581 aurel32
    case PCIL0_PTM2LA:
238 825bb581 aurel32
        value = pci->ptm[1].la;
239 825bb581 aurel32
        break;
240 825bb581 aurel32
241 825bb581 aurel32
    default:
242 825bb581 aurel32
        printf("%s: invalid PCI internal register 0x%lx\n", __func__,
243 825bb581 aurel32
               (unsigned long)offset);
244 825bb581 aurel32
        value = 0;
245 825bb581 aurel32
    }
246 825bb581 aurel32
247 825bb581 aurel32
    return value;
248 825bb581 aurel32
}
249 825bb581 aurel32
250 da726e5e Avi Kivity
static const MemoryRegionOps pci_reg_ops = {
251 da726e5e Avi Kivity
    .read = ppc4xx_pci_reg_read4,
252 da726e5e Avi Kivity
    .write = ppc4xx_pci_reg_write4,
253 da726e5e Avi Kivity
    .endianness = DEVICE_LITTLE_ENDIAN,
254 825bb581 aurel32
};
255 825bb581 aurel32
256 825bb581 aurel32
static void ppc4xx_pci_reset(void *opaque)
257 825bb581 aurel32
{
258 825bb581 aurel32
    struct PPC4xxPCIState *pci = opaque;
259 825bb581 aurel32
260 825bb581 aurel32
    memset(pci->pmm, 0, sizeof(pci->pmm));
261 825bb581 aurel32
    memset(pci->ptm, 0, sizeof(pci->ptm));
262 825bb581 aurel32
}
263 825bb581 aurel32
264 825bb581 aurel32
/* On Bamboo, all pins from each slot are tied to a single board IRQ. This
265 825bb581 aurel32
 * may need further refactoring for other boards. */
266 825bb581 aurel32
static int ppc4xx_pci_map_irq(PCIDevice *pci_dev, int irq_num)
267 825bb581 aurel32
{
268 825bb581 aurel32
    int slot = pci_dev->devfn >> 3;
269 825bb581 aurel32
270 825bb581 aurel32
    DPRINTF("%s: devfn %x irq %d -> %d\n", __func__,
271 825bb581 aurel32
            pci_dev->devfn, irq_num, slot);
272 825bb581 aurel32
273 825bb581 aurel32
    return slot - 1;
274 825bb581 aurel32
}
275 825bb581 aurel32
276 5d4e84c8 Juan Quintela
static void ppc4xx_pci_set_irq(void *opaque, int irq_num, int level)
277 825bb581 aurel32
{
278 5d4e84c8 Juan Quintela
    qemu_irq *pci_irqs = opaque;
279 5d4e84c8 Juan Quintela
280 825bb581 aurel32
    DPRINTF("%s: PCI irq %d\n", __func__, irq_num);
281 d49bc1fb Alexander Graf
    if (irq_num < 0) {
282 d49bc1fb Alexander Graf
        fprintf(stderr, "%s: PCI irq %d\n", __func__, irq_num);
283 d49bc1fb Alexander Graf
        return;
284 d49bc1fb Alexander Graf
    }
285 825bb581 aurel32
    qemu_set_irq(pci_irqs[irq_num], level);
286 825bb581 aurel32
}
287 825bb581 aurel32
288 b605f222 Juan Quintela
static const VMStateDescription vmstate_pci_master_map = {
289 b605f222 Juan Quintela
    .name = "pci_master_map",
290 b605f222 Juan Quintela
    .version_id = 0,
291 b605f222 Juan Quintela
    .minimum_version_id = 0,
292 b605f222 Juan Quintela
    .minimum_version_id_old = 0,
293 b605f222 Juan Quintela
    .fields      = (VMStateField[]) {
294 b605f222 Juan Quintela
        VMSTATE_UINT32(la, struct PCIMasterMap),
295 b605f222 Juan Quintela
        VMSTATE_UINT32(ma, struct PCIMasterMap),
296 b605f222 Juan Quintela
        VMSTATE_UINT32(pcila, struct PCIMasterMap),
297 b605f222 Juan Quintela
        VMSTATE_UINT32(pciha, struct PCIMasterMap),
298 b605f222 Juan Quintela
        VMSTATE_END_OF_LIST()
299 825bb581 aurel32
    }
300 b605f222 Juan Quintela
};
301 825bb581 aurel32
302 b605f222 Juan Quintela
static const VMStateDescription vmstate_pci_target_map = {
303 b605f222 Juan Quintela
    .name = "pci_target_map",
304 b605f222 Juan Quintela
    .version_id = 0,
305 b605f222 Juan Quintela
    .minimum_version_id = 0,
306 b605f222 Juan Quintela
    .minimum_version_id_old = 0,
307 b605f222 Juan Quintela
    .fields      = (VMStateField[]) {
308 b605f222 Juan Quintela
        VMSTATE_UINT32(ms, struct PCITargetMap),
309 b605f222 Juan Quintela
        VMSTATE_UINT32(la, struct PCITargetMap),
310 b605f222 Juan Quintela
        VMSTATE_END_OF_LIST()
311 825bb581 aurel32
    }
312 b605f222 Juan Quintela
};
313 825bb581 aurel32
314 b605f222 Juan Quintela
static const VMStateDescription vmstate_ppc4xx_pci = {
315 b605f222 Juan Quintela
    .name = "ppc4xx_pci",
316 b605f222 Juan Quintela
    .version_id = 1,
317 b605f222 Juan Quintela
    .minimum_version_id = 1,
318 b605f222 Juan Quintela
    .minimum_version_id_old = 1,
319 b605f222 Juan Quintela
    .fields      = (VMStateField[]) {
320 b605f222 Juan Quintela
        VMSTATE_STRUCT_ARRAY(pmm, PPC4xxPCIState, PPC4xx_PCI_NR_PMMS, 1,
321 b605f222 Juan Quintela
                             vmstate_pci_master_map,
322 b605f222 Juan Quintela
                             struct PCIMasterMap),
323 b605f222 Juan Quintela
        VMSTATE_STRUCT_ARRAY(ptm, PPC4xxPCIState, PPC4xx_PCI_NR_PTMS, 1,
324 b605f222 Juan Quintela
                             vmstate_pci_target_map,
325 b605f222 Juan Quintela
                             struct PCITargetMap),
326 b605f222 Juan Quintela
        VMSTATE_END_OF_LIST()
327 825bb581 aurel32
    }
328 b605f222 Juan Quintela
};
329 825bb581 aurel32
330 825bb581 aurel32
/* XXX Interrupt acknowledge cycles not supported. */
331 623f7c21 Alexander Graf
static int ppc4xx_pcihost_initfn(SysBusDevice *dev)
332 623f7c21 Alexander Graf
{
333 623f7c21 Alexander Graf
    PPC4xxPCIState *s;
334 623f7c21 Alexander Graf
    PCIHostState *h;
335 623f7c21 Alexander Graf
    PCIBus *b;
336 623f7c21 Alexander Graf
    int i;
337 623f7c21 Alexander Graf
338 623f7c21 Alexander Graf
    h = FROM_SYSBUS(PCIHostState, sysbus_from_qdev(dev));
339 623f7c21 Alexander Graf
    s = DO_UPCAST(PPC4xxPCIState, pci_state, h);
340 623f7c21 Alexander Graf
341 623f7c21 Alexander Graf
    for (i = 0; i < ARRAY_SIZE(s->irq); i++) {
342 623f7c21 Alexander Graf
        sysbus_init_irq(dev, &s->irq[i]);
343 623f7c21 Alexander Graf
    }
344 623f7c21 Alexander Graf
345 623f7c21 Alexander Graf
    b = pci_register_bus(&s->pci_state.busdev.qdev, NULL, ppc4xx_pci_set_irq,
346 623f7c21 Alexander Graf
                         ppc4xx_pci_map_irq, s->irq, get_system_memory(),
347 623f7c21 Alexander Graf
                         get_system_io(), 0, 4);
348 623f7c21 Alexander Graf
    s->pci_state.bus = b;
349 623f7c21 Alexander Graf
350 623f7c21 Alexander Graf
    pci_create_simple(b, 0, "ppc4xx-host-bridge");
351 623f7c21 Alexander Graf
352 623f7c21 Alexander Graf
    /* XXX split into 2 memory regions, one for config space, one for regs */
353 623f7c21 Alexander Graf
    memory_region_init(&s->container, "pci-container", PCI_ALL_SIZE);
354 623f7c21 Alexander Graf
    memory_region_init_io(&h->conf_mem, &pci_host_conf_le_ops, h,
355 623f7c21 Alexander Graf
                          "pci-conf-idx", 4);
356 623f7c21 Alexander Graf
    memory_region_init_io(&h->data_mem, &pci_host_data_le_ops, h,
357 623f7c21 Alexander Graf
                          "pci-conf-data", 4);
358 623f7c21 Alexander Graf
    memory_region_init_io(&s->iomem, &pci_reg_ops, s,
359 623f7c21 Alexander Graf
                          "pci.reg", PCI_REG_SIZE);
360 623f7c21 Alexander Graf
    memory_region_add_subregion(&s->container, PCIC0_CFGADDR, &h->conf_mem);
361 623f7c21 Alexander Graf
    memory_region_add_subregion(&s->container, PCIC0_CFGDATA, &h->data_mem);
362 623f7c21 Alexander Graf
    memory_region_add_subregion(&s->container, PCI_REG_BASE, &s->iomem);
363 623f7c21 Alexander Graf
    sysbus_init_mmio(dev, &s->container);
364 623f7c21 Alexander Graf
    qemu_register_reset(ppc4xx_pci_reset, s);
365 623f7c21 Alexander Graf
366 623f7c21 Alexander Graf
    return 0;
367 623f7c21 Alexander Graf
}
368 623f7c21 Alexander Graf
369 40021f08 Anthony Liguori
static void ppc4xx_host_bridge_class_init(ObjectClass *klass, void *data)
370 40021f08 Anthony Liguori
{
371 40021f08 Anthony Liguori
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
372 39bffca2 Anthony Liguori
    DeviceClass *dc = DEVICE_CLASS(klass);
373 40021f08 Anthony Liguori
374 39bffca2 Anthony Liguori
    dc->desc        = "Host bridge";
375 40021f08 Anthony Liguori
    k->vendor_id    = PCI_VENDOR_ID_IBM;
376 40021f08 Anthony Liguori
    k->device_id    = PCI_DEVICE_ID_IBM_440GX;
377 40021f08 Anthony Liguori
    k->class_id     = PCI_CLASS_BRIDGE_OTHER;
378 40021f08 Anthony Liguori
}
379 40021f08 Anthony Liguori
380 39bffca2 Anthony Liguori
static TypeInfo ppc4xx_host_bridge_info = {
381 39bffca2 Anthony Liguori
    .name          = "ppc4xx-host-bridge",
382 39bffca2 Anthony Liguori
    .parent        = TYPE_PCI_DEVICE,
383 39bffca2 Anthony Liguori
    .instance_size = sizeof(PCIDevice),
384 39bffca2 Anthony Liguori
    .class_init    = ppc4xx_host_bridge_class_init,
385 623f7c21 Alexander Graf
};
386 623f7c21 Alexander Graf
387 999e12bb Anthony Liguori
static void ppc4xx_pcihost_class_init(ObjectClass *klass, void *data)
388 999e12bb Anthony Liguori
{
389 999e12bb Anthony Liguori
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
390 39bffca2 Anthony Liguori
    DeviceClass *dc = DEVICE_CLASS(klass);
391 999e12bb Anthony Liguori
392 999e12bb Anthony Liguori
    k->init = ppc4xx_pcihost_initfn;
393 39bffca2 Anthony Liguori
    dc->vmsd = &vmstate_ppc4xx_pci;
394 999e12bb Anthony Liguori
}
395 999e12bb Anthony Liguori
396 39bffca2 Anthony Liguori
static TypeInfo ppc4xx_pcihost_info = {
397 39bffca2 Anthony Liguori
    .name          = "ppc4xx-pcihost",
398 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
399 39bffca2 Anthony Liguori
    .instance_size = sizeof(PPC4xxPCIState),
400 39bffca2 Anthony Liguori
    .class_init    = ppc4xx_pcihost_class_init,
401 623f7c21 Alexander Graf
};
402 623f7c21 Alexander Graf
403 83f7d43a Andreas Färber
static void ppc4xx_pci_register_types(void)
404 825bb581 aurel32
{
405 39bffca2 Anthony Liguori
    type_register_static(&ppc4xx_pcihost_info);
406 39bffca2 Anthony Liguori
    type_register_static(&ppc4xx_host_bridge_info);
407 825bb581 aurel32
}
408 83f7d43a Andreas Färber
409 83f7d43a Andreas Färber
type_init(ppc4xx_pci_register_types)