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
= (const 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 uint16_t irq_state
[ISA_NUM_IRQS
];
553 ViaSuperIOState via_sio
;
554 MC146818RtcState rtc
;
562 static const VMStateDescription vmstate_via
= {
565 .minimum_version_id
= 1,
566 .fields
= (const VMStateField
[]) {
567 VMSTATE_PCI_DEVICE(dev
, ViaISAState
),
568 VMSTATE_END_OF_LIST()
572 static void via_isa_init(Object
*obj
)
574 ViaISAState
*s
= VIA_ISA(obj
);
576 object_initialize_child(obj
, "rtc", &s
->rtc
, TYPE_MC146818_RTC
);
577 object_initialize_child(obj
, "ide", &s
->ide
, TYPE_VIA_IDE
);
578 object_initialize_child(obj
, "uhci1", &s
->uhci
[0], TYPE_VT82C686B_USB_UHCI
);
579 object_initialize_child(obj
, "uhci2", &s
->uhci
[1], TYPE_VT82C686B_USB_UHCI
);
580 object_initialize_child(obj
, "ac97", &s
->ac97
, TYPE_VIA_AC97
);
581 object_initialize_child(obj
, "mc97", &s
->mc97
, TYPE_VIA_MC97
);
584 static const TypeInfo via_isa_info
= {
585 .name
= TYPE_VIA_ISA
,
586 .parent
= TYPE_PCI_DEVICE
,
587 .instance_size
= sizeof(ViaISAState
),
588 .instance_init
= via_isa_init
,
590 .interfaces
= (InterfaceInfo
[]) {
591 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
596 static int via_isa_get_pci_irq(const ViaISAState
*s
, int pin
)
600 return s
->dev
.config
[0x55] >> 4;
602 return s
->dev
.config
[0x56] & 0xf;
604 return s
->dev
.config
[0x56] >> 4;
606 return s
->dev
.config
[0x57] >> 4;
611 void via_isa_set_irq(PCIDevice
*d
, int pin
, int level
)
613 ViaISAState
*s
= VIA_ISA(pci_get_function_0(d
));
614 uint8_t irq
= d
->config
[PCI_INTERRUPT_LINE
], max_irq
= 15;
615 int f
= PCI_FUNC(d
->devfn
);
616 uint16_t mask
= BIT(f
);
619 case 0: /* PIRQ/PINT inputs */
620 irq
= via_isa_get_pci_irq(s
, pin
);
621 f
= 8 + pin
; /* Use function 8-11 for PCI interrupt inputs */
623 case 2: /* USB ports 0-1 */
624 case 3: /* USB ports 2-3 */
625 case 5: /* AC97 audio */
630 /* Keep track of the state of all sources */
632 s
->irq_state
[0] |= mask
;
634 s
->irq_state
[0] &= ~mask
;
636 if (irq
== 0 || irq
== 0xff) {
637 return; /* disabled */
639 if (unlikely(irq
> max_irq
|| irq
== 2)) {
640 qemu_log_mask(LOG_GUEST_ERROR
, "Invalid ISA IRQ routing %d for %d",
644 /* Record source state at mapped IRQ */
646 s
->irq_state
[irq
] |= mask
;
648 s
->irq_state
[irq
] &= ~mask
;
650 /* Make sure there are no stuck bits if mapping has changed */
651 s
->irq_state
[irq
] &= s
->irq_state
[0];
652 /* ISA IRQ level is the OR of all sources routed to it */
653 qemu_set_irq(s
->isa_irqs_in
[irq
], !!s
->irq_state
[irq
]);
656 static void via_isa_pirq(void *opaque
, int pin
, int level
)
658 via_isa_set_irq(opaque
, pin
, level
);
661 static void via_isa_request_i8259_irq(void *opaque
, int irq
, int level
)
663 ViaISAState
*s
= opaque
;
664 qemu_set_irq(s
->cpu_intr
, level
);
667 static void via_isa_realize(PCIDevice
*d
, Error
**errp
)
669 ViaISAState
*s
= VIA_ISA(d
);
670 DeviceState
*dev
= DEVICE(d
);
671 PCIBus
*pci_bus
= pci_get_bus(d
);
676 qdev_init_gpio_out(dev
, &s
->cpu_intr
, 1);
677 qdev_init_gpio_in_named(dev
, via_isa_pirq
, "pirq", PCI_NUM_PINS
);
678 isa_irq
= qemu_allocate_irqs(via_isa_request_i8259_irq
, s
, 1);
679 isa_bus
= isa_bus_new(dev
, pci_address_space(d
), pci_address_space_io(d
),
686 s
->isa_irqs_in
= i8259_init(isa_bus
, *isa_irq
);
687 isa_bus_register_input_irqs(isa_bus
, s
->isa_irqs_in
);
688 i8254_pit_init(isa_bus
, 0x40, 0, NULL
);
689 i8257_dma_init(isa_bus
, 0);
692 qdev_prop_set_int32(DEVICE(&s
->rtc
), "base_year", 2000);
693 if (!qdev_realize(DEVICE(&s
->rtc
), BUS(isa_bus
), errp
)) {
696 isa_connect_gpio_out(ISA_DEVICE(&s
->rtc
), 0, s
->rtc
.isairq
);
698 for (i
= 0; i
< PCI_CONFIG_HEADER_SIZE
; i
++) {
699 if (i
< PCI_COMMAND
|| i
>= PCI_REVISION_ID
) {
705 if (!qdev_realize(DEVICE(&s
->via_sio
), BUS(isa_bus
), errp
)) {
709 /* Function 1: IDE */
710 qdev_prop_set_int32(DEVICE(&s
->ide
), "addr", d
->devfn
+ 1);
711 if (!qdev_realize(DEVICE(&s
->ide
), BUS(pci_bus
), errp
)) {
714 for (i
= 0; i
< 2; i
++) {
715 qdev_connect_gpio_out_named(DEVICE(&s
->ide
), "isa-irq", i
,
716 s
->isa_irqs_in
[14 + i
]);
719 /* Functions 2-3: USB Ports */
720 for (i
= 0; i
< ARRAY_SIZE(s
->uhci
); i
++) {
721 qdev_prop_set_int32(DEVICE(&s
->uhci
[i
]), "addr", d
->devfn
+ 2 + i
);
722 if (!qdev_realize(DEVICE(&s
->uhci
[i
]), BUS(pci_bus
), errp
)) {
727 /* Function 4: Power Management */
728 qdev_prop_set_int32(DEVICE(&s
->pm
), "addr", d
->devfn
+ 4);
729 if (!qdev_realize(DEVICE(&s
->pm
), BUS(pci_bus
), errp
)) {
733 /* Function 5: AC97 Audio */
734 qdev_prop_set_int32(DEVICE(&s
->ac97
), "addr", d
->devfn
+ 5);
735 if (!qdev_realize(DEVICE(&s
->ac97
), BUS(pci_bus
), errp
)) {
739 /* Function 6: MC97 Modem */
740 qdev_prop_set_int32(DEVICE(&s
->mc97
), "addr", d
->devfn
+ 6);
741 if (!qdev_realize(DEVICE(&s
->mc97
), BUS(pci_bus
), errp
)) {
746 /* TYPE_VT82C686B_ISA */
748 static void vt82c686b_write_config(PCIDevice
*d
, uint32_t addr
,
749 uint32_t val
, int len
)
751 ViaISAState
*s
= VIA_ISA(d
);
753 trace_via_isa_write(addr
, val
, len
);
754 pci_default_write_config(d
, addr
, val
, len
);
756 /* BIT(1): enable or disable superio config io ports */
757 via_superio_io_enable(&s
->via_sio
, val
& BIT(1));
761 static void vt82c686b_isa_reset(DeviceState
*dev
)
763 ViaISAState
*s
= VIA_ISA(dev
);
764 uint8_t *pci_conf
= s
->dev
.config
;
766 pci_set_long(pci_conf
+ PCI_CAPABILITY_LIST
, 0x000000c0);
767 pci_set_word(pci_conf
+ PCI_COMMAND
, PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
|
768 PCI_COMMAND_MASTER
| PCI_COMMAND_SPECIAL
);
769 pci_set_word(pci_conf
+ PCI_STATUS
, PCI_STATUS_DEVSEL_MEDIUM
);
771 pci_conf
[0x48] = 0x01; /* Miscellaneous Control 3 */
772 pci_conf
[0x4a] = 0x04; /* IDE interrupt Routing */
773 pci_conf
[0x4f] = 0x03; /* DMA/Master Mem Access Control 3 */
774 pci_conf
[0x50] = 0x2d; /* PnP DMA Request Control */
775 pci_conf
[0x59] = 0x04;
776 pci_conf
[0x5a] = 0x04; /* KBC/RTC Control*/
777 pci_conf
[0x5f] = 0x04;
778 pci_conf
[0x77] = 0x10; /* GPIO Control 1/2/3/4 */
781 static void vt82c686b_init(Object
*obj
)
783 ViaISAState
*s
= VIA_ISA(obj
);
785 object_initialize_child(obj
, "sio", &s
->via_sio
, TYPE_VT82C686B_SUPERIO
);
786 object_initialize_child(obj
, "pm", &s
->pm
, TYPE_VT82C686B_PM
);
789 static void vt82c686b_class_init(ObjectClass
*klass
, void *data
)
791 DeviceClass
*dc
= DEVICE_CLASS(klass
);
792 PCIDeviceClass
*k
= PCI_DEVICE_CLASS(klass
);
794 k
->realize
= via_isa_realize
;
795 k
->config_write
= vt82c686b_write_config
;
796 k
->vendor_id
= PCI_VENDOR_ID_VIA
;
797 k
->device_id
= PCI_DEVICE_ID_VIA_82C686B_ISA
;
798 k
->class_id
= PCI_CLASS_BRIDGE_ISA
;
800 dc
->reset
= vt82c686b_isa_reset
;
801 dc
->desc
= "ISA bridge";
802 dc
->vmsd
= &vmstate_via
;
803 /* Reason: part of VIA VT82C686 southbridge, needs to be wired up */
804 dc
->user_creatable
= false;
807 static const TypeInfo vt82c686b_isa_info
= {
808 .name
= TYPE_VT82C686B_ISA
,
809 .parent
= TYPE_VIA_ISA
,
810 .instance_size
= sizeof(ViaISAState
),
811 .instance_init
= vt82c686b_init
,
812 .class_init
= vt82c686b_class_init
,
815 /* TYPE_VT8231_ISA */
817 static void vt8231_write_config(PCIDevice
*d
, uint32_t addr
,
818 uint32_t val
, int len
)
820 ViaISAState
*s
= VIA_ISA(d
);
822 trace_via_isa_write(addr
, val
, len
);
823 pci_default_write_config(d
, addr
, val
, len
);
825 /* BIT(2): enable or disable superio config io ports */
826 via_superio_io_enable(&s
->via_sio
, val
& BIT(2));
830 static void vt8231_isa_reset(DeviceState
*dev
)
832 ViaISAState
*s
= VIA_ISA(dev
);
833 uint8_t *pci_conf
= s
->dev
.config
;
835 pci_set_long(pci_conf
+ PCI_CAPABILITY_LIST
, 0x000000c0);
836 pci_set_word(pci_conf
+ PCI_COMMAND
, PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
|
837 PCI_COMMAND_MASTER
| PCI_COMMAND_SPECIAL
);
838 pci_set_word(pci_conf
+ PCI_STATUS
, PCI_STATUS_DEVSEL_MEDIUM
);
840 pci_conf
[0x4c] = 0x04; /* IDE interrupt Routing */
841 pci_conf
[0x58] = 0x40; /* Miscellaneous Control 0 */
842 pci_conf
[0x67] = 0x08; /* Fast IR Config */
843 pci_conf
[0x6b] = 0x01; /* Fast IR I/O Base */
846 static void vt8231_init(Object
*obj
)
848 ViaISAState
*s
= VIA_ISA(obj
);
850 object_initialize_child(obj
, "sio", &s
->via_sio
, TYPE_VT8231_SUPERIO
);
851 object_initialize_child(obj
, "pm", &s
->pm
, TYPE_VT8231_PM
);
854 static void vt8231_class_init(ObjectClass
*klass
, void *data
)
856 DeviceClass
*dc
= DEVICE_CLASS(klass
);
857 PCIDeviceClass
*k
= PCI_DEVICE_CLASS(klass
);
859 k
->realize
= via_isa_realize
;
860 k
->config_write
= vt8231_write_config
;
861 k
->vendor_id
= PCI_VENDOR_ID_VIA
;
862 k
->device_id
= PCI_DEVICE_ID_VIA_8231_ISA
;
863 k
->class_id
= PCI_CLASS_BRIDGE_ISA
;
865 dc
->reset
= vt8231_isa_reset
;
866 dc
->desc
= "ISA bridge";
867 dc
->vmsd
= &vmstate_via
;
868 /* Reason: part of VIA VT8231 southbridge, needs to be wired up */
869 dc
->user_creatable
= false;
872 static const TypeInfo vt8231_isa_info
= {
873 .name
= TYPE_VT8231_ISA
,
874 .parent
= TYPE_VIA_ISA
,
875 .instance_size
= sizeof(ViaISAState
),
876 .instance_init
= vt8231_init
,
877 .class_init
= vt8231_class_init
,
881 static void vt82c686b_register_types(void)
883 type_register_static(&via_pm_info
);
884 type_register_static(&vt82c686b_pm_info
);
885 type_register_static(&vt8231_pm_info
);
886 type_register_static(&via_superio_info
);
887 type_register_static(&vt82c686b_superio_info
);
888 type_register_static(&vt8231_superio_info
);
889 type_register_static(&via_isa_info
);
890 type_register_static(&vt82c686b_isa_info
);
891 type_register_static(&vt8231_isa_info
);
894 type_init(vt82c686b_register_types
)