xref: /openbmc/qemu/hw/pci-host/uninorth.c (revision 65a117da)
1 /*
2  * QEMU Uninorth PCI host (for all Mac99 and newer machines)
3  *
4  * Copyright (c) 2006 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 
25 #include "qemu/osdep.h"
26 #include "hw/irq.h"
27 #include "hw/ppc/mac.h"
28 #include "hw/qdev-properties.h"
29 #include "qemu/module.h"
30 #include "hw/pci/pci.h"
31 #include "hw/pci/pci_host.h"
32 #include "hw/pci-host/uninorth.h"
33 #include "trace.h"
34 
35 static const int unin_irq_line[] = { 0x1b, 0x1c, 0x1d, 0x1e };
36 
37 static int pci_unin_map_irq(PCIDevice *pci_dev, int irq_num)
38 {
39     return (irq_num + (pci_dev->devfn >> 3)) & 3;
40 }
41 
42 static void pci_unin_set_irq(void *opaque, int irq_num, int level)
43 {
44     UNINHostState *s = opaque;
45 
46     trace_unin_set_irq(unin_irq_line[irq_num], level);
47     qemu_set_irq(s->irqs[irq_num], level);
48 }
49 
50 static uint32_t unin_get_config_reg(uint32_t reg, uint32_t addr)
51 {
52     uint32_t retval;
53 
54     if (reg & (1u << 31)) {
55         /* XXX OpenBIOS compatibility hack */
56         retval = reg | (addr & 3);
57     } else if (reg & 1) {
58         /* CFA1 style */
59         retval = (reg & ~7u) | (addr & 7);
60     } else {
61         uint32_t slot, func;
62 
63         /* Grab CFA0 style values */
64         slot = ctz32(reg & 0xfffff800);
65         if (slot == 32) {
66             slot = -1; /* XXX: should this be 0? */
67         }
68         func = (reg >> 8) & 7;
69 
70         /* ... and then convert them to x86 format */
71         /* config pointer */
72         retval = (reg & (0xff - 7)) | (addr & 7);
73         /* slot */
74         retval |= slot << 11;
75         /* fn */
76         retval |= func << 8;
77     }
78 
79     trace_unin_get_config_reg(reg, addr, retval);
80 
81     return retval;
82 }
83 
84 static void unin_data_write(void *opaque, hwaddr addr,
85                             uint64_t val, unsigned len)
86 {
87     UNINHostState *s = opaque;
88     PCIHostState *phb = PCI_HOST_BRIDGE(s);
89     trace_unin_data_write(addr, len, val);
90     pci_data_write(phb->bus,
91                    unin_get_config_reg(phb->config_reg, addr),
92                    val, len);
93 }
94 
95 static uint64_t unin_data_read(void *opaque, hwaddr addr,
96                                unsigned len)
97 {
98     UNINHostState *s = opaque;
99     PCIHostState *phb = PCI_HOST_BRIDGE(s);
100     uint32_t val;
101 
102     val = pci_data_read(phb->bus,
103                         unin_get_config_reg(phb->config_reg, addr),
104                         len);
105     trace_unin_data_read(addr, len, val);
106     return val;
107 }
108 
109 static const MemoryRegionOps unin_data_ops = {
110     .read = unin_data_read,
111     .write = unin_data_write,
112     .endianness = DEVICE_LITTLE_ENDIAN,
113 };
114 
115 static void pci_unin_init_irqs(UNINHostState *s)
116 {
117     int i;
118 
119     for (i = 0; i < ARRAY_SIZE(s->irqs); i++) {
120         s->irqs[i] = qdev_get_gpio_in(DEVICE(s->pic), unin_irq_line[i]);
121     }
122 }
123 
124 static char *pci_unin_main_ofw_unit_address(const SysBusDevice *dev)
125 {
126     UNINHostState *s = UNI_NORTH_PCI_HOST_BRIDGE(dev);
127 
128     return g_strdup_printf("%x", s->ofw_addr);
129 }
130 
131 static void pci_unin_main_realize(DeviceState *dev, Error **errp)
132 {
133     UNINHostState *s = UNI_NORTH_PCI_HOST_BRIDGE(dev);
134     PCIHostState *h = PCI_HOST_BRIDGE(dev);
135 
136     h->bus = pci_register_root_bus(dev, NULL,
137                                    pci_unin_set_irq, pci_unin_map_irq,
138                                    s,
139                                    &s->pci_mmio,
140                                    &s->pci_io,
141                                    PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
142 
143     pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north-pci");
144     pci_unin_init_irqs(s);
145 
146     /* DEC 21154 bridge */
147 #if 0
148     /* XXX: not activated as PPC BIOS doesn't handle multiple buses properly */
149     pci_create_simple(h->bus, PCI_DEVFN(12, 0), "dec-21154");
150 #endif
151 }
152 
153 static void pci_unin_main_init(Object *obj)
154 {
155     UNINHostState *s = UNI_NORTH_PCI_HOST_BRIDGE(obj);
156     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
157     PCIHostState *h = PCI_HOST_BRIDGE(obj);
158 
159     /* Use values found on a real PowerMac */
160     /* Uninorth main bus */
161     memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_le_ops,
162                           obj, "unin-pci-conf-idx", 0x1000);
163     memory_region_init_io(&h->data_mem, OBJECT(h), &unin_data_ops, obj,
164                           "unin-pci-conf-data", 0x1000);
165 
166     memory_region_init(&s->pci_mmio, OBJECT(s), "unin-pci-mmio",
167                        0x100000000ULL);
168     memory_region_init_io(&s->pci_io, OBJECT(s), &unassigned_io_ops, obj,
169                           "unin-pci-isa-mmio", 0x00800000);
170 
171     memory_region_init_alias(&s->pci_hole, OBJECT(s),
172                              "unin-pci-hole", &s->pci_mmio,
173                              0x80000000ULL, 0x10000000ULL);
174 
175     object_property_add_link(obj, "pic", TYPE_OPENPIC,
176                              (Object **) &s->pic,
177                              qdev_prop_allow_set_link_before_realize,
178                              0);
179 
180     sysbus_init_mmio(sbd, &h->conf_mem);
181     sysbus_init_mmio(sbd, &h->data_mem);
182     sysbus_init_mmio(sbd, &s->pci_hole);
183     sysbus_init_mmio(sbd, &s->pci_io);
184 }
185 
186 static void pci_u3_agp_realize(DeviceState *dev, Error **errp)
187 {
188     UNINHostState *s = U3_AGP_HOST_BRIDGE(dev);
189     PCIHostState *h = PCI_HOST_BRIDGE(dev);
190 
191     h->bus = pci_register_root_bus(dev, NULL,
192                                    pci_unin_set_irq, pci_unin_map_irq,
193                                    s,
194                                    &s->pci_mmio,
195                                    &s->pci_io,
196                                    PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
197 
198     pci_create_simple(h->bus, PCI_DEVFN(11, 0), "u3-agp");
199     pci_unin_init_irqs(s);
200 }
201 
202 static void pci_u3_agp_init(Object *obj)
203 {
204     UNINHostState *s = U3_AGP_HOST_BRIDGE(obj);
205     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
206     PCIHostState *h = PCI_HOST_BRIDGE(obj);
207 
208     /* Uninorth U3 AGP bus */
209     memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_le_ops,
210                           obj, "unin-pci-conf-idx", 0x1000);
211     memory_region_init_io(&h->data_mem, OBJECT(h), &unin_data_ops, obj,
212                           "unin-pci-conf-data", 0x1000);
213 
214     memory_region_init(&s->pci_mmio, OBJECT(s), "unin-pci-mmio",
215                        0x100000000ULL);
216     memory_region_init_io(&s->pci_io, OBJECT(s), &unassigned_io_ops, obj,
217                           "unin-pci-isa-mmio", 0x00800000);
218 
219     memory_region_init_alias(&s->pci_hole, OBJECT(s),
220                              "unin-pci-hole", &s->pci_mmio,
221                              0x80000000ULL, 0x70000000ULL);
222 
223     object_property_add_link(obj, "pic", TYPE_OPENPIC,
224                              (Object **) &s->pic,
225                              qdev_prop_allow_set_link_before_realize,
226                              0);
227 
228     sysbus_init_mmio(sbd, &h->conf_mem);
229     sysbus_init_mmio(sbd, &h->data_mem);
230     sysbus_init_mmio(sbd, &s->pci_hole);
231     sysbus_init_mmio(sbd, &s->pci_io);
232 }
233 
234 static void pci_unin_agp_realize(DeviceState *dev, Error **errp)
235 {
236     UNINHostState *s = UNI_NORTH_AGP_HOST_BRIDGE(dev);
237     PCIHostState *h = PCI_HOST_BRIDGE(dev);
238 
239     h->bus = pci_register_root_bus(dev, NULL,
240                                    pci_unin_set_irq, pci_unin_map_irq,
241                                    s,
242                                    &s->pci_mmio,
243                                    &s->pci_io,
244                                    PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
245 
246     pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north-agp");
247     pci_unin_init_irqs(s);
248 }
249 
250 static void pci_unin_agp_init(Object *obj)
251 {
252     UNINHostState *s = UNI_NORTH_AGP_HOST_BRIDGE(obj);
253     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
254     PCIHostState *h = PCI_HOST_BRIDGE(obj);
255 
256     /* Uninorth AGP bus */
257     memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_le_ops,
258                           obj, "unin-agp-conf-idx", 0x1000);
259     memory_region_init_io(&h->data_mem, OBJECT(h), &pci_host_data_le_ops,
260                           obj, "unin-agp-conf-data", 0x1000);
261 
262     object_property_add_link(obj, "pic", TYPE_OPENPIC,
263                              (Object **) &s->pic,
264                              qdev_prop_allow_set_link_before_realize,
265                              0);
266 
267     sysbus_init_mmio(sbd, &h->conf_mem);
268     sysbus_init_mmio(sbd, &h->data_mem);
269 }
270 
271 static void pci_unin_internal_realize(DeviceState *dev, Error **errp)
272 {
273     UNINHostState *s = UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE(dev);
274     PCIHostState *h = PCI_HOST_BRIDGE(dev);
275 
276     h->bus = pci_register_root_bus(dev, NULL,
277                                    pci_unin_set_irq, pci_unin_map_irq,
278                                    s,
279                                    &s->pci_mmio,
280                                    &s->pci_io,
281                                    PCI_DEVFN(14, 0), 4, TYPE_PCI_BUS);
282 
283     pci_create_simple(h->bus, PCI_DEVFN(14, 0), "uni-north-internal-pci");
284     pci_unin_init_irqs(s);
285 }
286 
287 static void pci_unin_internal_init(Object *obj)
288 {
289     UNINHostState *s = UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE(obj);
290     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
291     PCIHostState *h = PCI_HOST_BRIDGE(obj);
292 
293     /* Uninorth internal bus */
294     memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_le_ops,
295                           obj, "unin-pci-conf-idx", 0x1000);
296     memory_region_init_io(&h->data_mem, OBJECT(h), &pci_host_data_le_ops,
297                           obj, "unin-pci-conf-data", 0x1000);
298 
299     object_property_add_link(obj, "pic", TYPE_OPENPIC,
300                              (Object **) &s->pic,
301                              qdev_prop_allow_set_link_before_realize,
302                              0);
303 
304     sysbus_init_mmio(sbd, &h->conf_mem);
305     sysbus_init_mmio(sbd, &h->data_mem);
306 }
307 
308 static void unin_main_pci_host_realize(PCIDevice *d, Error **errp)
309 {
310     /* cache_line_size */
311     d->config[0x0C] = 0x08;
312     /* latency_timer */
313     d->config[0x0D] = 0x10;
314     /* capabilities_pointer */
315     d->config[0x34] = 0x00;
316 
317     /*
318      * Set kMacRISCPCIAddressSelect (0x48) register to indicate PCI
319      * memory space with base 0x80000000, size 0x10000000 for Apple's
320      * AppleMacRiscPCI driver
321      */
322     d->config[0x48] = 0x0;
323     d->config[0x49] = 0x0;
324     d->config[0x4a] = 0x0;
325     d->config[0x4b] = 0x1;
326 }
327 
328 static void unin_agp_pci_host_realize(PCIDevice *d, Error **errp)
329 {
330     /* cache_line_size */
331     d->config[0x0C] = 0x08;
332     /* latency_timer */
333     d->config[0x0D] = 0x10;
334     /* capabilities_pointer
335     d->config[0x34] = 0x80; */
336 }
337 
338 static void u3_agp_pci_host_realize(PCIDevice *d, Error **errp)
339 {
340     /* cache line size */
341     d->config[0x0C] = 0x08;
342     /* latency timer */
343     d->config[0x0D] = 0x10;
344 }
345 
346 static void unin_internal_pci_host_realize(PCIDevice *d, Error **errp)
347 {
348     /* cache_line_size */
349     d->config[0x0C] = 0x08;
350     /* latency_timer */
351     d->config[0x0D] = 0x10;
352     /* capabilities_pointer */
353     d->config[0x34] = 0x00;
354 }
355 
356 static void unin_main_pci_host_class_init(ObjectClass *klass, void *data)
357 {
358     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
359     DeviceClass *dc = DEVICE_CLASS(klass);
360 
361     k->realize   = unin_main_pci_host_realize;
362     k->vendor_id = PCI_VENDOR_ID_APPLE;
363     k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_PCI;
364     k->revision  = 0x00;
365     k->class_id  = PCI_CLASS_BRIDGE_HOST;
366     /*
367      * PCI-facing part of the host bridge, not usable without the
368      * host-facing part, which can't be device_add'ed, yet.
369      */
370     dc->user_creatable = false;
371 }
372 
373 static const TypeInfo unin_main_pci_host_info = {
374     .name = "uni-north-pci",
375     .parent = TYPE_PCI_DEVICE,
376     .instance_size = sizeof(PCIDevice),
377     .class_init = unin_main_pci_host_class_init,
378     .interfaces = (InterfaceInfo[]) {
379         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
380         { },
381     },
382 };
383 
384 static void u3_agp_pci_host_class_init(ObjectClass *klass, void *data)
385 {
386     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
387     DeviceClass *dc = DEVICE_CLASS(klass);
388 
389     k->realize   = u3_agp_pci_host_realize;
390     k->vendor_id = PCI_VENDOR_ID_APPLE;
391     k->device_id = PCI_DEVICE_ID_APPLE_U3_AGP;
392     k->revision  = 0x00;
393     k->class_id  = PCI_CLASS_BRIDGE_HOST;
394     /*
395      * PCI-facing part of the host bridge, not usable without the
396      * host-facing part, which can't be device_add'ed, yet.
397      */
398     dc->user_creatable = false;
399 }
400 
401 static const TypeInfo u3_agp_pci_host_info = {
402     .name = "u3-agp",
403     .parent = TYPE_PCI_DEVICE,
404     .instance_size = sizeof(PCIDevice),
405     .class_init = u3_agp_pci_host_class_init,
406     .interfaces = (InterfaceInfo[]) {
407         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
408         { },
409     },
410 };
411 
412 static void unin_agp_pci_host_class_init(ObjectClass *klass, void *data)
413 {
414     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
415     DeviceClass *dc = DEVICE_CLASS(klass);
416 
417     k->realize   = unin_agp_pci_host_realize;
418     k->vendor_id = PCI_VENDOR_ID_APPLE;
419     k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_AGP;
420     k->revision  = 0x00;
421     k->class_id  = PCI_CLASS_BRIDGE_HOST;
422     /*
423      * PCI-facing part of the host bridge, not usable without the
424      * host-facing part, which can't be device_add'ed, yet.
425      */
426     dc->user_creatable = false;
427 }
428 
429 static const TypeInfo unin_agp_pci_host_info = {
430     .name = "uni-north-agp",
431     .parent = TYPE_PCI_DEVICE,
432     .instance_size = sizeof(PCIDevice),
433     .class_init = unin_agp_pci_host_class_init,
434     .interfaces = (InterfaceInfo[]) {
435         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
436         { },
437     },
438 };
439 
440 static void unin_internal_pci_host_class_init(ObjectClass *klass, void *data)
441 {
442     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
443     DeviceClass *dc = DEVICE_CLASS(klass);
444 
445     k->realize   = unin_internal_pci_host_realize;
446     k->vendor_id = PCI_VENDOR_ID_APPLE;
447     k->device_id = PCI_DEVICE_ID_APPLE_UNI_N_I_PCI;
448     k->revision  = 0x00;
449     k->class_id  = PCI_CLASS_BRIDGE_HOST;
450     /*
451      * PCI-facing part of the host bridge, not usable without the
452      * host-facing part, which can't be device_add'ed, yet.
453      */
454     dc->user_creatable = false;
455 }
456 
457 static const TypeInfo unin_internal_pci_host_info = {
458     .name = "uni-north-internal-pci",
459     .parent = TYPE_PCI_DEVICE,
460     .instance_size = sizeof(PCIDevice),
461     .class_init = unin_internal_pci_host_class_init,
462     .interfaces = (InterfaceInfo[]) {
463         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
464         { },
465     },
466 };
467 
468 static Property pci_unin_main_pci_host_props[] = {
469     DEFINE_PROP_UINT32("ofw-addr", UNINHostState, ofw_addr, -1),
470     DEFINE_PROP_END_OF_LIST()
471 };
472 
473 static void pci_unin_main_class_init(ObjectClass *klass, void *data)
474 {
475     DeviceClass *dc = DEVICE_CLASS(klass);
476     SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
477 
478     dc->realize = pci_unin_main_realize;
479     device_class_set_props(dc, pci_unin_main_pci_host_props);
480     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
481     dc->fw_name = "pci";
482     sbc->explicit_ofw_unit_address = pci_unin_main_ofw_unit_address;
483 }
484 
485 static const TypeInfo pci_unin_main_info = {
486     .name          = TYPE_UNI_NORTH_PCI_HOST_BRIDGE,
487     .parent        = TYPE_PCI_HOST_BRIDGE,
488     .instance_size = sizeof(UNINHostState),
489     .instance_init = pci_unin_main_init,
490     .class_init    = pci_unin_main_class_init,
491 };
492 
493 static void pci_u3_agp_class_init(ObjectClass *klass, void *data)
494 {
495     DeviceClass *dc = DEVICE_CLASS(klass);
496 
497     dc->realize = pci_u3_agp_realize;
498     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
499 }
500 
501 static const TypeInfo pci_u3_agp_info = {
502     .name          = TYPE_U3_AGP_HOST_BRIDGE,
503     .parent        = TYPE_PCI_HOST_BRIDGE,
504     .instance_size = sizeof(UNINHostState),
505     .instance_init = pci_u3_agp_init,
506     .class_init    = pci_u3_agp_class_init,
507 };
508 
509 static void pci_unin_agp_class_init(ObjectClass *klass, void *data)
510 {
511     DeviceClass *dc = DEVICE_CLASS(klass);
512 
513     dc->realize = pci_unin_agp_realize;
514     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
515 }
516 
517 static const TypeInfo pci_unin_agp_info = {
518     .name          = TYPE_UNI_NORTH_AGP_HOST_BRIDGE,
519     .parent        = TYPE_PCI_HOST_BRIDGE,
520     .instance_size = sizeof(UNINHostState),
521     .instance_init = pci_unin_agp_init,
522     .class_init    = pci_unin_agp_class_init,
523 };
524 
525 static void pci_unin_internal_class_init(ObjectClass *klass, void *data)
526 {
527     DeviceClass *dc = DEVICE_CLASS(klass);
528 
529     dc->realize = pci_unin_internal_realize;
530     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
531 }
532 
533 static const TypeInfo pci_unin_internal_info = {
534     .name          = TYPE_UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE,
535     .parent        = TYPE_PCI_HOST_BRIDGE,
536     .instance_size = sizeof(UNINHostState),
537     .instance_init = pci_unin_internal_init,
538     .class_init    = pci_unin_internal_class_init,
539 };
540 
541 /* UniN device */
542 static void unin_write(void *opaque, hwaddr addr, uint64_t value,
543                        unsigned size)
544 {
545     trace_unin_write(addr, value);
546 }
547 
548 static uint64_t unin_read(void *opaque, hwaddr addr, unsigned size)
549 {
550     uint32_t value;
551 
552     switch (addr) {
553     case 0:
554         value = UNINORTH_VERSION_10A;
555         break;
556     default:
557         value = 0;
558     }
559 
560     trace_unin_read(addr, value);
561 
562     return value;
563 }
564 
565 static const MemoryRegionOps unin_ops = {
566     .read = unin_read,
567     .write = unin_write,
568     .endianness = DEVICE_BIG_ENDIAN,
569 };
570 
571 static void unin_init(Object *obj)
572 {
573     UNINState *s = UNI_NORTH(obj);
574     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
575 
576     memory_region_init_io(&s->mem, obj, &unin_ops, s, "unin", 0x1000);
577 
578     sysbus_init_mmio(sbd, &s->mem);
579 }
580 
581 static void unin_class_init(ObjectClass *klass, void *data)
582 {
583     DeviceClass *dc = DEVICE_CLASS(klass);
584 
585     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
586 }
587 
588 static const TypeInfo unin_info = {
589     .name          = TYPE_UNI_NORTH,
590     .parent        = TYPE_SYS_BUS_DEVICE,
591     .instance_size = sizeof(UNINState),
592     .instance_init = unin_init,
593     .class_init    = unin_class_init,
594 };
595 
596 static void unin_register_types(void)
597 {
598     type_register_static(&unin_main_pci_host_info);
599     type_register_static(&u3_agp_pci_host_info);
600     type_register_static(&unin_agp_pci_host_info);
601     type_register_static(&unin_internal_pci_host_info);
602 
603     type_register_static(&pci_unin_main_info);
604     type_register_static(&pci_u3_agp_info);
605     type_register_static(&pci_unin_agp_info);
606     type_register_static(&pci_unin_internal_info);
607 
608     type_register_static(&unin_info);
609 }
610 
611 type_init(unin_register_types)
612