2 * VT82C686B south bridge support
4 * Copyright (c) 2008 yajin (yajin@vm-kernel.org)
5 * Copyright (c) 2009 chenming (chenming@rdc.faw.com.cn)
6 * Copyright (c) 2010 Huacai Chen (zltjiangshi@gmail.com)
7 * This code is licensed under the GNU GPL v2.
9 * Contributions after 2012-01-13 are licensed under the terms of the
10 * GNU GPL, version 2 or (at your option) any later version.
12 * VT8231 south bridge support and general clean up to allow it
13 * Copyright (c) 2018-2020 BALATON Zoltan
16 #include "qemu/osdep.h"
17 #include "hw/isa/vt82c686.h"
18 #include "hw/pci/pci.h"
19 #include "hw/qdev-properties.h"
20 #include "hw/ide/pci.h"
21 #include "hw/isa/isa.h"
22 #include "hw/isa/superio.h"
23 #include "hw/intc/i8259.h"
25 #include "hw/dma/i8257.h"
26 #include "hw/usb/hcd-uhci.h"
27 #include "hw/timer/i8254.h"
28 #include "hw/rtc/mc146818rtc.h"
29 #include "migration/vmstate.h"
30 #include "hw/isa/apm.h"
31 #include "hw/acpi/acpi.h"
32 #include "hw/i2c/pm_smbus.h"
33 #include "qapi/error.h"
35 #include "qemu/module.h"
36 #include "qemu/range.h"
37 #include "qemu/timer.h"
40 #define TYPE_VIA_PM "via-pm"
41 OBJECT_DECLARE_SIMPLE_TYPE(ViaPMState
, VIA_PM
)
51 static void pm_io_space_update(ViaPMState
*s
)
53 uint32_t pmbase
= pci_get_long(s
->dev
.config
+ 0x48) & 0xff80UL
;
55 memory_region_transaction_begin();
56 memory_region_set_address(&s
->io
, pmbase
);
57 memory_region_set_enabled(&s
->io
, s
->dev
.config
[0x41] & BIT(7));
58 memory_region_transaction_commit();
61 static void smb_io_space_update(ViaPMState
*s
)
63 uint32_t smbase
= pci_get_long(s
->dev
.config
+ 0x90) & 0xfff0UL
;
65 memory_region_transaction_begin();
66 memory_region_set_address(&s
->smb
.io
, smbase
);
67 memory_region_set_enabled(&s
->smb
.io
, s
->dev
.config
[0xd2] & BIT(0));
68 memory_region_transaction_commit();
71 static int vmstate_acpi_post_load(void *opaque
, int version_id
)
73 ViaPMState
*s
= opaque
;
75 pm_io_space_update(s
);
76 smb_io_space_update(s
);
80 static const VMStateDescription vmstate_acpi
= {
81 .name
= "vt82c686b_pm",
83 .minimum_version_id
= 1,
84 .post_load
= vmstate_acpi_post_load
,
85 .fields
= (VMStateField
[]) {
86 VMSTATE_PCI_DEVICE(dev
, ViaPMState
),
87 VMSTATE_UINT16(ar
.pm1
.evt
.sts
, ViaPMState
),
88 VMSTATE_UINT16(ar
.pm1
.evt
.en
, ViaPMState
),
89 VMSTATE_UINT16(ar
.pm1
.cnt
.cnt
, ViaPMState
),
90 VMSTATE_STRUCT(apm
, ViaPMState
, 0, vmstate_apm
, APMState
),
91 VMSTATE_TIMER_PTR(ar
.tmr
.timer
, ViaPMState
),
92 VMSTATE_INT64(ar
.tmr
.overflow_time
, ViaPMState
),
97 static void pm_write_config(PCIDevice
*d
, uint32_t addr
, uint32_t val
, int len
)
99 ViaPMState
*s
= VIA_PM(d
);
101 trace_via_pm_write(addr
, val
, len
);
102 pci_default_write_config(d
, addr
, val
, len
);
103 if (ranges_overlap(addr
, len
, 0x48, 4)) {
104 uint32_t v
= pci_get_long(s
->dev
.config
+ 0x48);
105 pci_set_long(s
->dev
.config
+ 0x48, (v
& 0xff80UL
) | 1);
107 if (range_covers_byte(addr
, len
, 0x41)) {
108 pm_io_space_update(s
);
110 if (ranges_overlap(addr
, len
, 0x90, 4)) {
111 uint32_t v
= pci_get_long(s
->dev
.config
+ 0x90);
112 pci_set_long(s
->dev
.config
+ 0x90, (v
& 0xfff0UL
) | 1);
114 if (range_covers_byte(addr
, len
, 0xd2)) {
115 s
->dev
.config
[0xd2] &= 0xf;
116 smb_io_space_update(s
);
120 static void pm_io_write(void *op
, hwaddr addr
, uint64_t data
, unsigned size
)
122 trace_via_pm_io_write(addr
, data
, size
);
125 static uint64_t pm_io_read(void *op
, hwaddr addr
, unsigned size
)
127 trace_via_pm_io_read(addr
, 0, size
);
131 static const MemoryRegionOps pm_io_ops
= {
133 .write
= pm_io_write
,
134 .endianness
= DEVICE_NATIVE_ENDIAN
,
136 .min_access_size
= 1,
137 .max_access_size
= 1,
141 static void pm_update_sci(ViaPMState
*s
)
143 int sci_level
, pmsts
;
145 pmsts
= acpi_pm1_evt_get_sts(&s
->ar
);
146 sci_level
= (((pmsts
& s
->ar
.pm1
.evt
.en
) &
147 (ACPI_BITMASK_RT_CLOCK_ENABLE
|
148 ACPI_BITMASK_POWER_BUTTON_ENABLE
|
149 ACPI_BITMASK_GLOBAL_LOCK_ENABLE
|
150 ACPI_BITMASK_TIMER_ENABLE
)) != 0);
151 if (pci_get_byte(s
->dev
.config
+ PCI_INTERRUPT_PIN
)) {
154 * Fix device model that realizes this PM device and remove
156 * The device model should wire SCI and setup
157 * PCI_INTERRUPT_PIN properly.
158 * If PIN# = 0(interrupt pin isn't used), don't raise SCI as
161 pci_set_irq(&s
->dev
, sci_level
);
163 /* schedule a timer interruption if needed */
164 acpi_pm_tmr_update(&s
->ar
, (s
->ar
.pm1
.evt
.en
& ACPI_BITMASK_TIMER_ENABLE
) &&
165 !(pmsts
& ACPI_BITMASK_TIMER_STATUS
));
168 static void pm_tmr_timer(ACPIREGS
*ar
)
170 ViaPMState
*s
= container_of(ar
, ViaPMState
, ar
);
174 static void via_pm_reset(DeviceState
*d
)
176 ViaPMState
*s
= VIA_PM(d
);
178 memset(s
->dev
.config
+ PCI_CONFIG_HEADER_SIZE
, 0,
179 PCI_CONFIG_SPACE_SIZE
- PCI_CONFIG_HEADER_SIZE
);
180 /* Power Management IO base */
181 pci_set_long(s
->dev
.config
+ 0x48, 1);
183 pci_set_long(s
->dev
.config
+ 0x90, 1);
185 acpi_pm1_evt_reset(&s
->ar
);
186 acpi_pm1_cnt_reset(&s
->ar
);
187 acpi_pm_tmr_reset(&s
->ar
);
190 pm_io_space_update(s
);
191 smb_io_space_update(s
);
194 static void via_pm_realize(PCIDevice
*dev
, Error
**errp
)
196 ViaPMState
*s
= VIA_PM(dev
);
198 pci_set_word(dev
->config
+ PCI_STATUS
, PCI_STATUS_FAST_BACK
|
199 PCI_STATUS_DEVSEL_MEDIUM
);
201 pm_smbus_init(DEVICE(s
), &s
->smb
, false);
202 memory_region_add_subregion(pci_address_space_io(dev
), 0, &s
->smb
.io
);
203 memory_region_set_enabled(&s
->smb
.io
, false);
205 apm_init(dev
, &s
->apm
, NULL
, s
);
207 memory_region_init_io(&s
->io
, OBJECT(dev
), &pm_io_ops
, s
, "via-pm", 128);
208 memory_region_add_subregion(pci_address_space_io(dev
), 0, &s
->io
);
209 memory_region_set_enabled(&s
->io
, false);
211 acpi_pm_tmr_init(&s
->ar
, pm_tmr_timer
, &s
->io
);
212 acpi_pm1_evt_init(&s
->ar
, pm_tmr_timer
, &s
->io
);
213 acpi_pm1_cnt_init(&s
->ar
, &s
->io
, false, false, 2, false);
216 typedef struct via_pm_init_info
{
220 static void via_pm_class_init(ObjectClass
*klass
, void *data
)
222 DeviceClass
*dc
= DEVICE_CLASS(klass
);
223 PCIDeviceClass
*k
= PCI_DEVICE_CLASS(klass
);
224 ViaPMInitInfo
*info
= data
;
226 k
->realize
= via_pm_realize
;
227 k
->config_write
= pm_write_config
;
228 k
->vendor_id
= PCI_VENDOR_ID_VIA
;
229 k
->device_id
= info
->device_id
;
230 k
->class_id
= PCI_CLASS_BRIDGE_OTHER
;
232 dc
->reset
= via_pm_reset
;
233 /* Reason: part of VIA south bridge, does not exist stand alone */
234 dc
->user_creatable
= false;
235 dc
->vmsd
= &vmstate_acpi
;
238 static const TypeInfo via_pm_info
= {
240 .parent
= TYPE_PCI_DEVICE
,
241 .instance_size
= sizeof(ViaPMState
),
243 .interfaces
= (InterfaceInfo
[]) {
244 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
249 static const ViaPMInitInfo vt82c686b_pm_init_info
= {
250 .device_id
= PCI_DEVICE_ID_VIA_82C686B_PM
,
253 #define TYPE_VT82C686B_PM "vt82c686b-pm"
255 static const TypeInfo vt82c686b_pm_info
= {
256 .name
= TYPE_VT82C686B_PM
,
257 .parent
= TYPE_VIA_PM
,
258 .class_init
= via_pm_class_init
,
259 .class_data
= (void *)&vt82c686b_pm_init_info
,
262 static const ViaPMInitInfo vt8231_pm_init_info
= {
263 .device_id
= PCI_DEVICE_ID_VIA_8231_PM
,
266 #define TYPE_VT8231_PM "vt8231-pm"
268 static const TypeInfo vt8231_pm_info
= {
269 .name
= TYPE_VT8231_PM
,
270 .parent
= TYPE_VIA_PM
,
271 .class_init
= via_pm_class_init
,
272 .class_data
= (void *)&vt8231_pm_init_info
,
276 #define TYPE_VIA_SUPERIO "via-superio"
277 OBJECT_DECLARE_SIMPLE_TYPE(ViaSuperIOState
, VIA_SUPERIO
)
279 struct ViaSuperIOState
{
280 ISASuperIODevice superio
;
282 const MemoryRegionOps
*io_ops
;
286 static inline void via_superio_io_enable(ViaSuperIOState
*s
, bool enable
)
288 memory_region_set_enabled(&s
->io
, enable
);
291 static void via_superio_realize(DeviceState
*d
, Error
**errp
)
293 ViaSuperIOState
*s
= VIA_SUPERIO(d
);
294 ISASuperIOClass
*ic
= ISA_SUPERIO_GET_CLASS(s
);
295 Error
*local_err
= NULL
;
298 ic
->parent_realize(d
, &local_err
);
300 error_propagate(errp
, local_err
);
303 memory_region_init_io(&s
->io
, OBJECT(d
), s
->io_ops
, s
, "via-superio", 2);
304 memory_region_set_enabled(&s
->io
, false);
305 /* The floppy also uses 0x3f0 and 0x3f1 but this seems to work anyway */
306 memory_region_add_subregion(isa_address_space_io(ISA_DEVICE(s
)), 0x3f0,
310 static uint64_t via_superio_cfg_read(void *opaque
, hwaddr addr
, unsigned size
)
312 ViaSuperIOState
*sc
= opaque
;
313 uint8_t idx
= sc
->regs
[0];
314 uint8_t val
= sc
->regs
[idx
];
319 if (addr
== 1 && idx
== 0) {
320 val
= 0; /* reading reg 0 where we store index value */
322 trace_via_superio_read(idx
, val
);
326 static void via_superio_class_init(ObjectClass
*klass
, void *data
)
328 DeviceClass
*dc
= DEVICE_CLASS(klass
);
329 ISASuperIOClass
*sc
= ISA_SUPERIO_CLASS(klass
);
331 sc
->parent_realize
= dc
->realize
;
332 dc
->realize
= via_superio_realize
;
335 static const TypeInfo via_superio_info
= {
336 .name
= TYPE_VIA_SUPERIO
,
337 .parent
= TYPE_ISA_SUPERIO
,
338 .instance_size
= sizeof(ViaSuperIOState
),
339 .class_size
= sizeof(ISASuperIOClass
),
340 .class_init
= via_superio_class_init
,
344 #define TYPE_VT82C686B_SUPERIO "vt82c686b-superio"
346 static void vt82c686b_superio_cfg_write(void *opaque
, hwaddr addr
,
347 uint64_t data
, unsigned size
)
349 ViaSuperIOState
*sc
= opaque
;
350 uint8_t idx
= sc
->regs
[0];
352 if (addr
== 0) { /* config index register */
357 /* config data register */
358 trace_via_superio_write(idx
, data
);
369 /* ignore write to read only registers */
371 /* case 0xe6 ... 0xe8: Should set base port of parallel and serial */
373 qemu_log_mask(LOG_UNIMP
,
374 "via_superio_cfg: unimplemented register 0x%x\n", idx
);
377 sc
->regs
[idx
] = data
;
380 static const MemoryRegionOps vt82c686b_superio_cfg_ops
= {
381 .read
= via_superio_cfg_read
,
382 .write
= vt82c686b_superio_cfg_write
,
383 .endianness
= DEVICE_NATIVE_ENDIAN
,
385 .min_access_size
= 1,
386 .max_access_size
= 1,
390 static void vt82c686b_superio_reset(DeviceState
*dev
)
392 ViaSuperIOState
*s
= VIA_SUPERIO(dev
);
394 memset(s
->regs
, 0, sizeof(s
->regs
));
396 vt82c686b_superio_cfg_write(s
, 0, 0xe0, 1);
397 vt82c686b_superio_cfg_write(s
, 1, 0x3c, 1);
398 /* Function select - all disabled */
399 vt82c686b_superio_cfg_write(s
, 0, 0xe2, 1);
400 vt82c686b_superio_cfg_write(s
, 1, 0x03, 1);
401 /* Floppy ctrl base addr 0x3f0-7 */
402 vt82c686b_superio_cfg_write(s
, 0, 0xe3, 1);
403 vt82c686b_superio_cfg_write(s
, 1, 0xfc, 1);
404 /* Parallel port base addr 0x378-f */
405 vt82c686b_superio_cfg_write(s
, 0, 0xe6, 1);
406 vt82c686b_superio_cfg_write(s
, 1, 0xde, 1);
407 /* Serial port 1 base addr 0x3f8-f */
408 vt82c686b_superio_cfg_write(s
, 0, 0xe7, 1);
409 vt82c686b_superio_cfg_write(s
, 1, 0xfe, 1);
410 /* Serial port 2 base addr 0x2f8-f */
411 vt82c686b_superio_cfg_write(s
, 0, 0xe8, 1);
412 vt82c686b_superio_cfg_write(s
, 1, 0xbe, 1);
414 vt82c686b_superio_cfg_write(s
, 0, 0, 1);
417 static void vt82c686b_superio_init(Object
*obj
)
419 VIA_SUPERIO(obj
)->io_ops
= &vt82c686b_superio_cfg_ops
;
422 static void vt82c686b_superio_class_init(ObjectClass
*klass
, void *data
)
424 DeviceClass
*dc
= DEVICE_CLASS(klass
);
425 ISASuperIOClass
*sc
= ISA_SUPERIO_CLASS(klass
);
427 dc
->reset
= vt82c686b_superio_reset
;
428 sc
->serial
.count
= 2;
429 sc
->parallel
.count
= 1;
430 sc
->ide
.count
= 0; /* emulated by via-ide */
431 sc
->floppy
.count
= 1;
434 static const TypeInfo vt82c686b_superio_info
= {
435 .name
= TYPE_VT82C686B_SUPERIO
,
436 .parent
= TYPE_VIA_SUPERIO
,
437 .instance_size
= sizeof(ViaSuperIOState
),
438 .instance_init
= vt82c686b_superio_init
,
439 .class_size
= sizeof(ISASuperIOClass
),
440 .class_init
= vt82c686b_superio_class_init
,
444 #define TYPE_VT8231_SUPERIO "vt8231-superio"
446 static void vt8231_superio_cfg_write(void *opaque
, hwaddr addr
,
447 uint64_t data
, unsigned size
)
449 ViaSuperIOState
*sc
= opaque
;
450 uint8_t idx
= sc
->regs
[0];
452 if (addr
== 0) { /* config index register */
457 /* config data register */
458 trace_via_superio_write(idx
, data
);
466 /* ignore write to read only registers */
469 qemu_log_mask(LOG_UNIMP
,
470 "via_superio_cfg: unimplemented register 0x%x\n", idx
);
473 sc
->regs
[idx
] = data
;
476 static const MemoryRegionOps vt8231_superio_cfg_ops
= {
477 .read
= via_superio_cfg_read
,
478 .write
= vt8231_superio_cfg_write
,
479 .endianness
= DEVICE_NATIVE_ENDIAN
,
481 .min_access_size
= 1,
482 .max_access_size
= 1,
486 static void vt8231_superio_reset(DeviceState
*dev
)
488 ViaSuperIOState
*s
= VIA_SUPERIO(dev
);
490 memset(s
->regs
, 0, sizeof(s
->regs
));
492 s
->regs
[0xf0] = 0x3c;
493 /* Device revision */
494 s
->regs
[0xf1] = 0x01;
495 /* Function select - all disabled */
496 vt8231_superio_cfg_write(s
, 0, 0xf2, 1);
497 vt8231_superio_cfg_write(s
, 1, 0x03, 1);
498 /* Serial port base addr */
499 vt8231_superio_cfg_write(s
, 0, 0xf4, 1);
500 vt8231_superio_cfg_write(s
, 1, 0xfe, 1);
501 /* Parallel port base addr */
502 vt8231_superio_cfg_write(s
, 0, 0xf6, 1);
503 vt8231_superio_cfg_write(s
, 1, 0xde, 1);
504 /* Floppy ctrl base addr */
505 vt8231_superio_cfg_write(s
, 0, 0xf7, 1);
506 vt8231_superio_cfg_write(s
, 1, 0xfc, 1);
508 vt8231_superio_cfg_write(s
, 0, 0, 1);
511 static void vt8231_superio_init(Object
*obj
)
513 VIA_SUPERIO(obj
)->io_ops
= &vt8231_superio_cfg_ops
;
516 static uint16_t vt8231_superio_serial_iobase(ISASuperIODevice
*sio
,
519 return 0x2f8; /* FIXME: This should be settable via registers f2-f4 */
522 static void vt8231_superio_class_init(ObjectClass
*klass
, void *data
)
524 DeviceClass
*dc
= DEVICE_CLASS(klass
);
525 ISASuperIOClass
*sc
= ISA_SUPERIO_CLASS(klass
);
527 dc
->reset
= vt8231_superio_reset
;
528 sc
->serial
.count
= 1;
529 sc
->serial
.get_iobase
= vt8231_superio_serial_iobase
;
530 sc
->parallel
.count
= 1;
531 sc
->ide
.count
= 0; /* emulated by via-ide */
532 sc
->floppy
.count
= 1;
535 static const TypeInfo vt8231_superio_info
= {
536 .name
= TYPE_VT8231_SUPERIO
,
537 .parent
= TYPE_VIA_SUPERIO
,
538 .instance_size
= sizeof(ViaSuperIOState
),
539 .instance_init
= vt8231_superio_init
,
540 .class_size
= sizeof(ISASuperIOClass
),
541 .class_init
= vt8231_superio_class_init
,
545 #define TYPE_VIA_ISA "via-isa"
546 OBJECT_DECLARE_SIMPLE_TYPE(ViaISAState
, VIA_ISA
)
551 qemu_irq
*isa_irqs_in
;
552 ViaSuperIOState via_sio
;
553 MC146818RtcState rtc
;
561 static const VMStateDescription vmstate_via
= {
564 .minimum_version_id
= 1,
565 .fields
= (VMStateField
[]) {
566 VMSTATE_PCI_DEVICE(dev
, ViaISAState
),
567 VMSTATE_END_OF_LIST()
571 static void via_isa_init(Object
*obj
)
573 ViaISAState
*s
= VIA_ISA(obj
);
575 object_initialize_child(obj
, "rtc", &s
->rtc
, TYPE_MC146818_RTC
);
576 object_initialize_child(obj
, "ide", &s
->ide
, TYPE_VIA_IDE
);
577 object_initialize_child(obj
, "uhci1", &s
->uhci
[0], TYPE_VT82C686B_USB_UHCI
);
578 object_initialize_child(obj
, "uhci2", &s
->uhci
[1], TYPE_VT82C686B_USB_UHCI
);
579 object_initialize_child(obj
, "ac97", &s
->ac97
, TYPE_VIA_AC97
);
580 object_initialize_child(obj
, "mc97", &s
->mc97
, TYPE_VIA_MC97
);
583 static const TypeInfo via_isa_info
= {
584 .name
= TYPE_VIA_ISA
,
585 .parent
= TYPE_PCI_DEVICE
,
586 .instance_size
= sizeof(ViaISAState
),
587 .instance_init
= via_isa_init
,
589 .interfaces
= (InterfaceInfo
[]) {
590 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
595 void via_isa_set_irq(PCIDevice
*d
, int n
, int level
)
597 ViaISAState
*s
= VIA_ISA(d
);
598 qemu_set_irq(s
->isa_irqs_in
[n
], level
);
601 static void via_isa_request_i8259_irq(void *opaque
, int irq
, int level
)
603 ViaISAState
*s
= opaque
;
604 qemu_set_irq(s
->cpu_intr
, level
);
607 static int via_isa_get_pci_irq(const ViaISAState
*s
, int irq_num
)
611 return s
->dev
.config
[0x55] >> 4;
613 return s
->dev
.config
[0x56] & 0xf;
615 return s
->dev
.config
[0x56] >> 4;
617 return s
->dev
.config
[0x57] >> 4;
622 static void via_isa_set_pci_irq(void *opaque
, int irq_num
, int level
)
624 ViaISAState
*s
= opaque
;
625 PCIBus
*bus
= pci_get_bus(&s
->dev
);
626 int i
, pic_level
, pic_irq
= via_isa_get_pci_irq(s
, irq_num
);
628 /* IRQ 0: disabled, IRQ 2,8,13: reserved */
632 if (unlikely(pic_irq
== 2 || pic_irq
== 8 || pic_irq
== 13)) {
633 qemu_log_mask(LOG_GUEST_ERROR
, "Invalid ISA IRQ routing");
636 /* The pic level is the logical OR of all the PCI irqs mapped to it. */
638 for (i
= 0; i
< PCI_NUM_PINS
; i
++) {
639 if (pic_irq
== via_isa_get_pci_irq(s
, i
)) {
640 pic_level
|= pci_bus_get_irq_level(bus
, i
);
643 /* Now we change the pic irq level according to the via irq mappings. */
644 qemu_set_irq(s
->isa_irqs_in
[pic_irq
], pic_level
);
647 static void via_isa_realize(PCIDevice
*d
, Error
**errp
)
649 ViaISAState
*s
= VIA_ISA(d
);
650 DeviceState
*dev
= DEVICE(d
);
651 PCIBus
*pci_bus
= pci_get_bus(d
);
656 qdev_init_gpio_out(dev
, &s
->cpu_intr
, 1);
657 isa_irq
= qemu_allocate_irqs(via_isa_request_i8259_irq
, s
, 1);
658 isa_bus
= isa_bus_new(dev
, pci_address_space(d
), pci_address_space_io(d
),
665 s
->isa_irqs_in
= i8259_init(isa_bus
, *isa_irq
);
666 isa_bus_register_input_irqs(isa_bus
, s
->isa_irqs_in
);
667 i8254_pit_init(isa_bus
, 0x40, 0, NULL
);
668 i8257_dma_init(isa_bus
, 0);
670 qdev_init_gpio_in_named(dev
, via_isa_set_pci_irq
, "pirq", PCI_NUM_PINS
);
673 qdev_prop_set_int32(DEVICE(&s
->rtc
), "base_year", 2000);
674 if (!qdev_realize(DEVICE(&s
->rtc
), BUS(isa_bus
), errp
)) {
677 isa_connect_gpio_out(ISA_DEVICE(&s
->rtc
), 0, s
->rtc
.isairq
);
679 for (i
= 0; i
< PCI_CONFIG_HEADER_SIZE
; i
++) {
680 if (i
< PCI_COMMAND
|| i
>= PCI_REVISION_ID
) {
686 if (!qdev_realize(DEVICE(&s
->via_sio
), BUS(isa_bus
), errp
)) {
690 /* Function 1: IDE */
691 qdev_prop_set_int32(DEVICE(&s
->ide
), "addr", d
->devfn
+ 1);
692 if (!qdev_realize(DEVICE(&s
->ide
), BUS(pci_bus
), errp
)) {
696 /* Functions 2-3: USB Ports */
697 for (i
= 0; i
< ARRAY_SIZE(s
->uhci
); i
++) {
698 qdev_prop_set_int32(DEVICE(&s
->uhci
[i
]), "addr", d
->devfn
+ 2 + i
);
699 if (!qdev_realize(DEVICE(&s
->uhci
[i
]), BUS(pci_bus
), errp
)) {
704 /* Function 4: Power Management */
705 qdev_prop_set_int32(DEVICE(&s
->pm
), "addr", d
->devfn
+ 4);
706 if (!qdev_realize(DEVICE(&s
->pm
), BUS(pci_bus
), errp
)) {
710 /* Function 5: AC97 Audio */
711 qdev_prop_set_int32(DEVICE(&s
->ac97
), "addr", d
->devfn
+ 5);
712 if (!qdev_realize(DEVICE(&s
->ac97
), BUS(pci_bus
), errp
)) {
716 /* Function 6: MC97 Modem */
717 qdev_prop_set_int32(DEVICE(&s
->mc97
), "addr", d
->devfn
+ 6);
718 if (!qdev_realize(DEVICE(&s
->mc97
), BUS(pci_bus
), errp
)) {
723 /* TYPE_VT82C686B_ISA */
725 static void vt82c686b_write_config(PCIDevice
*d
, uint32_t addr
,
726 uint32_t val
, int len
)
728 ViaISAState
*s
= VIA_ISA(d
);
730 trace_via_isa_write(addr
, val
, len
);
731 pci_default_write_config(d
, addr
, val
, len
);
733 /* BIT(1): enable or disable superio config io ports */
734 via_superio_io_enable(&s
->via_sio
, val
& BIT(1));
738 static void vt82c686b_isa_reset(DeviceState
*dev
)
740 ViaISAState
*s
= VIA_ISA(dev
);
741 uint8_t *pci_conf
= s
->dev
.config
;
743 pci_set_long(pci_conf
+ PCI_CAPABILITY_LIST
, 0x000000c0);
744 pci_set_word(pci_conf
+ PCI_COMMAND
, PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
|
745 PCI_COMMAND_MASTER
| PCI_COMMAND_SPECIAL
);
746 pci_set_word(pci_conf
+ PCI_STATUS
, PCI_STATUS_DEVSEL_MEDIUM
);
748 pci_conf
[0x48] = 0x01; /* Miscellaneous Control 3 */
749 pci_conf
[0x4a] = 0x04; /* IDE interrupt Routing */
750 pci_conf
[0x4f] = 0x03; /* DMA/Master Mem Access Control 3 */
751 pci_conf
[0x50] = 0x2d; /* PnP DMA Request Control */
752 pci_conf
[0x59] = 0x04;
753 pci_conf
[0x5a] = 0x04; /* KBC/RTC Control*/
754 pci_conf
[0x5f] = 0x04;
755 pci_conf
[0x77] = 0x10; /* GPIO Control 1/2/3/4 */
758 static void vt82c686b_init(Object
*obj
)
760 ViaISAState
*s
= VIA_ISA(obj
);
762 object_initialize_child(obj
, "sio", &s
->via_sio
, TYPE_VT82C686B_SUPERIO
);
763 object_initialize_child(obj
, "pm", &s
->pm
, TYPE_VT82C686B_PM
);
766 static void vt82c686b_class_init(ObjectClass
*klass
, void *data
)
768 DeviceClass
*dc
= DEVICE_CLASS(klass
);
769 PCIDeviceClass
*k
= PCI_DEVICE_CLASS(klass
);
771 k
->realize
= via_isa_realize
;
772 k
->config_write
= vt82c686b_write_config
;
773 k
->vendor_id
= PCI_VENDOR_ID_VIA
;
774 k
->device_id
= PCI_DEVICE_ID_VIA_82C686B_ISA
;
775 k
->class_id
= PCI_CLASS_BRIDGE_ISA
;
777 dc
->reset
= vt82c686b_isa_reset
;
778 dc
->desc
= "ISA bridge";
779 dc
->vmsd
= &vmstate_via
;
780 /* Reason: part of VIA VT82C686 southbridge, needs to be wired up */
781 dc
->user_creatable
= false;
784 static const TypeInfo vt82c686b_isa_info
= {
785 .name
= TYPE_VT82C686B_ISA
,
786 .parent
= TYPE_VIA_ISA
,
787 .instance_size
= sizeof(ViaISAState
),
788 .instance_init
= vt82c686b_init
,
789 .class_init
= vt82c686b_class_init
,
792 /* TYPE_VT8231_ISA */
794 static void vt8231_write_config(PCIDevice
*d
, uint32_t addr
,
795 uint32_t val
, int len
)
797 ViaISAState
*s
= VIA_ISA(d
);
799 trace_via_isa_write(addr
, val
, len
);
800 pci_default_write_config(d
, addr
, val
, len
);
802 /* BIT(2): enable or disable superio config io ports */
803 via_superio_io_enable(&s
->via_sio
, val
& BIT(2));
807 static void vt8231_isa_reset(DeviceState
*dev
)
809 ViaISAState
*s
= VIA_ISA(dev
);
810 uint8_t *pci_conf
= s
->dev
.config
;
812 pci_set_long(pci_conf
+ PCI_CAPABILITY_LIST
, 0x000000c0);
813 pci_set_word(pci_conf
+ PCI_COMMAND
, PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
|
814 PCI_COMMAND_MASTER
| PCI_COMMAND_SPECIAL
);
815 pci_set_word(pci_conf
+ PCI_STATUS
, PCI_STATUS_DEVSEL_MEDIUM
);
817 pci_conf
[0x58] = 0x40; /* Miscellaneous Control 0 */
818 pci_conf
[0x67] = 0x08; /* Fast IR Config */
819 pci_conf
[0x6b] = 0x01; /* Fast IR I/O Base */
822 static void vt8231_init(Object
*obj
)
824 ViaISAState
*s
= VIA_ISA(obj
);
826 object_initialize_child(obj
, "sio", &s
->via_sio
, TYPE_VT8231_SUPERIO
);
827 object_initialize_child(obj
, "pm", &s
->pm
, TYPE_VT8231_PM
);
830 static void vt8231_class_init(ObjectClass
*klass
, void *data
)
832 DeviceClass
*dc
= DEVICE_CLASS(klass
);
833 PCIDeviceClass
*k
= PCI_DEVICE_CLASS(klass
);
835 k
->realize
= via_isa_realize
;
836 k
->config_write
= vt8231_write_config
;
837 k
->vendor_id
= PCI_VENDOR_ID_VIA
;
838 k
->device_id
= PCI_DEVICE_ID_VIA_8231_ISA
;
839 k
->class_id
= PCI_CLASS_BRIDGE_ISA
;
841 dc
->reset
= vt8231_isa_reset
;
842 dc
->desc
= "ISA bridge";
843 dc
->vmsd
= &vmstate_via
;
844 /* Reason: part of VIA VT8231 southbridge, needs to be wired up */
845 dc
->user_creatable
= false;
848 static const TypeInfo vt8231_isa_info
= {
849 .name
= TYPE_VT8231_ISA
,
850 .parent
= TYPE_VIA_ISA
,
851 .instance_size
= sizeof(ViaISAState
),
852 .instance_init
= vt8231_init
,
853 .class_init
= vt8231_class_init
,
857 static void vt82c686b_register_types(void)
859 type_register_static(&via_pm_info
);
860 type_register_static(&vt82c686b_pm_info
);
861 type_register_static(&vt8231_pm_info
);
862 type_register_static(&via_superio_info
);
863 type_register_static(&vt82c686b_superio_info
);
864 type_register_static(&vt8231_superio_info
);
865 type_register_static(&via_isa_info
);
866 type_register_static(&vt82c686b_isa_info
);
867 type_register_static(&vt8231_isa_info
);
870 type_init(vt82c686b_register_types
)