xref: /openbmc/qemu/hw/isa/smc37c669-superio.c (revision 64a3b4d5)
17bea0dd4SPhilippe Mathieu-Daudé /*
27bea0dd4SPhilippe Mathieu-Daudé  * SMC FDC37C669 Super I/O controller
37bea0dd4SPhilippe Mathieu-Daudé  *
47bea0dd4SPhilippe Mathieu-Daudé  * Copyright (c) 2018 Philippe Mathieu-Daudé
57bea0dd4SPhilippe Mathieu-Daudé  *
6*b822dfaeSPhilippe Mathieu-Daudé  * This work is licensed under the terms of the GNU GPL, version 2 or later.
77bea0dd4SPhilippe Mathieu-Daudé  * See the COPYING file in the top-level directory.
87bea0dd4SPhilippe Mathieu-Daudé  * SPDX-License-Identifier: GPL-2.0-or-later
97bea0dd4SPhilippe Mathieu-Daudé  */
107bea0dd4SPhilippe Mathieu-Daudé 
117bea0dd4SPhilippe Mathieu-Daudé #include "qemu/osdep.h"
127bea0dd4SPhilippe Mathieu-Daudé #include "hw/isa/superio.h"
130b8fa32fSMarkus Armbruster #include "qemu/module.h"
147bea0dd4SPhilippe Mathieu-Daudé 
157bea0dd4SPhilippe Mathieu-Daudé /* UARTs (compatible with NS16450 or PC16550) */
167bea0dd4SPhilippe Mathieu-Daudé 
is_serial_enabled(ISASuperIODevice * sio,uint8_t index)177bea0dd4SPhilippe Mathieu-Daudé static bool is_serial_enabled(ISASuperIODevice *sio, uint8_t index)
187bea0dd4SPhilippe Mathieu-Daudé {
197bea0dd4SPhilippe Mathieu-Daudé     return index < 2;
207bea0dd4SPhilippe Mathieu-Daudé }
217bea0dd4SPhilippe Mathieu-Daudé 
get_serial_iobase(ISASuperIODevice * sio,uint8_t index)227bea0dd4SPhilippe Mathieu-Daudé static uint16_t get_serial_iobase(ISASuperIODevice *sio, uint8_t index)
237bea0dd4SPhilippe Mathieu-Daudé {
247bea0dd4SPhilippe Mathieu-Daudé     return index ? 0x2f8 : 0x3f8;
257bea0dd4SPhilippe Mathieu-Daudé }
267bea0dd4SPhilippe Mathieu-Daudé 
get_serial_irq(ISASuperIODevice * sio,uint8_t index)277bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_serial_irq(ISASuperIODevice *sio, uint8_t index)
287bea0dd4SPhilippe Mathieu-Daudé {
297bea0dd4SPhilippe Mathieu-Daudé     return index ? 3 : 4;
307bea0dd4SPhilippe Mathieu-Daudé }
317bea0dd4SPhilippe Mathieu-Daudé 
327bea0dd4SPhilippe Mathieu-Daudé /* Parallel port */
337bea0dd4SPhilippe Mathieu-Daudé 
is_parallel_enabled(ISASuperIODevice * sio,uint8_t index)347bea0dd4SPhilippe Mathieu-Daudé static bool is_parallel_enabled(ISASuperIODevice *sio, uint8_t index)
357bea0dd4SPhilippe Mathieu-Daudé {
367bea0dd4SPhilippe Mathieu-Daudé     return index < 1;
377bea0dd4SPhilippe Mathieu-Daudé }
387bea0dd4SPhilippe Mathieu-Daudé 
get_parallel_iobase(ISASuperIODevice * sio,uint8_t index)397bea0dd4SPhilippe Mathieu-Daudé static uint16_t get_parallel_iobase(ISASuperIODevice *sio, uint8_t index)
407bea0dd4SPhilippe Mathieu-Daudé {
4175cacb12SPhilippe Mathieu-Daudé     return 0x378;
427bea0dd4SPhilippe Mathieu-Daudé }
437bea0dd4SPhilippe Mathieu-Daudé 
get_parallel_irq(ISASuperIODevice * sio,uint8_t index)447bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_parallel_irq(ISASuperIODevice *sio, uint8_t index)
457bea0dd4SPhilippe Mathieu-Daudé {
467bea0dd4SPhilippe Mathieu-Daudé     return 7;
477bea0dd4SPhilippe Mathieu-Daudé }
487bea0dd4SPhilippe Mathieu-Daudé 
get_parallel_dma(ISASuperIODevice * sio,uint8_t index)497bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_parallel_dma(ISASuperIODevice *sio, uint8_t index)
507bea0dd4SPhilippe Mathieu-Daudé {
517bea0dd4SPhilippe Mathieu-Daudé     return 3;
527bea0dd4SPhilippe Mathieu-Daudé }
537bea0dd4SPhilippe Mathieu-Daudé 
547bea0dd4SPhilippe Mathieu-Daudé /* Diskette controller (Software compatible with the Intel PC8477) */
557bea0dd4SPhilippe Mathieu-Daudé 
is_fdc_enabled(ISASuperIODevice * sio,uint8_t index)567bea0dd4SPhilippe Mathieu-Daudé static bool is_fdc_enabled(ISASuperIODevice *sio, uint8_t index)
577bea0dd4SPhilippe Mathieu-Daudé {
587bea0dd4SPhilippe Mathieu-Daudé     return index < 1;
597bea0dd4SPhilippe Mathieu-Daudé }
607bea0dd4SPhilippe Mathieu-Daudé 
get_fdc_iobase(ISASuperIODevice * sio,uint8_t index)617bea0dd4SPhilippe Mathieu-Daudé static uint16_t get_fdc_iobase(ISASuperIODevice *sio, uint8_t index)
627bea0dd4SPhilippe Mathieu-Daudé {
637bea0dd4SPhilippe Mathieu-Daudé     return 0x3f0;
647bea0dd4SPhilippe Mathieu-Daudé }
657bea0dd4SPhilippe Mathieu-Daudé 
get_fdc_irq(ISASuperIODevice * sio,uint8_t index)667bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_fdc_irq(ISASuperIODevice *sio, uint8_t index)
677bea0dd4SPhilippe Mathieu-Daudé {
687bea0dd4SPhilippe Mathieu-Daudé     return 6;
697bea0dd4SPhilippe Mathieu-Daudé }
707bea0dd4SPhilippe Mathieu-Daudé 
get_fdc_dma(ISASuperIODevice * sio,uint8_t index)717bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_fdc_dma(ISASuperIODevice *sio, uint8_t index)
727bea0dd4SPhilippe Mathieu-Daudé {
737bea0dd4SPhilippe Mathieu-Daudé     return 2;
747bea0dd4SPhilippe Mathieu-Daudé }
757bea0dd4SPhilippe Mathieu-Daudé 
smc37c669_class_init(ObjectClass * klass,void * data)767bea0dd4SPhilippe Mathieu-Daudé static void smc37c669_class_init(ObjectClass *klass, void *data)
777bea0dd4SPhilippe Mathieu-Daudé {
787bea0dd4SPhilippe Mathieu-Daudé     ISASuperIOClass *sc = ISA_SUPERIO_CLASS(klass);
797bea0dd4SPhilippe Mathieu-Daudé 
807bea0dd4SPhilippe Mathieu-Daudé     sc->parallel = (ISASuperIOFuncs){
817bea0dd4SPhilippe Mathieu-Daudé         .count = 1,
827bea0dd4SPhilippe Mathieu-Daudé         .is_enabled = is_parallel_enabled,
837bea0dd4SPhilippe Mathieu-Daudé         .get_iobase = get_parallel_iobase,
847bea0dd4SPhilippe Mathieu-Daudé         .get_irq    = get_parallel_irq,
857bea0dd4SPhilippe Mathieu-Daudé         .get_dma    = get_parallel_dma,
867bea0dd4SPhilippe Mathieu-Daudé     };
877bea0dd4SPhilippe Mathieu-Daudé     sc->serial = (ISASuperIOFuncs){
887bea0dd4SPhilippe Mathieu-Daudé         .count = 2,
897bea0dd4SPhilippe Mathieu-Daudé         .is_enabled = is_serial_enabled,
907bea0dd4SPhilippe Mathieu-Daudé         .get_iobase = get_serial_iobase,
917bea0dd4SPhilippe Mathieu-Daudé         .get_irq    = get_serial_irq,
927bea0dd4SPhilippe Mathieu-Daudé     };
937bea0dd4SPhilippe Mathieu-Daudé     sc->floppy = (ISASuperIOFuncs){
947bea0dd4SPhilippe Mathieu-Daudé         .count = 1,
957bea0dd4SPhilippe Mathieu-Daudé         .is_enabled = is_fdc_enabled,
967bea0dd4SPhilippe Mathieu-Daudé         .get_iobase = get_fdc_iobase,
977bea0dd4SPhilippe Mathieu-Daudé         .get_irq    = get_fdc_irq,
987bea0dd4SPhilippe Mathieu-Daudé         .get_dma    = get_fdc_dma,
997bea0dd4SPhilippe Mathieu-Daudé     };
1007bea0dd4SPhilippe Mathieu-Daudé     sc->ide.count = 0;
1017bea0dd4SPhilippe Mathieu-Daudé }
1027bea0dd4SPhilippe Mathieu-Daudé 
1037bea0dd4SPhilippe Mathieu-Daudé static const TypeInfo smc37c669_type_info = {
1047bea0dd4SPhilippe Mathieu-Daudé     .name          = TYPE_SMC37C669_SUPERIO,
1057bea0dd4SPhilippe Mathieu-Daudé     .parent        = TYPE_ISA_SUPERIO,
1067bea0dd4SPhilippe Mathieu-Daudé     .instance_size = sizeof(ISASuperIODevice),
1077bea0dd4SPhilippe Mathieu-Daudé     .class_size    = sizeof(ISASuperIOClass),
1087bea0dd4SPhilippe Mathieu-Daudé     .class_init    = smc37c669_class_init,
1097bea0dd4SPhilippe Mathieu-Daudé };
1107bea0dd4SPhilippe Mathieu-Daudé 
smc37c669_register_types(void)1117bea0dd4SPhilippe Mathieu-Daudé static void smc37c669_register_types(void)
1127bea0dd4SPhilippe Mathieu-Daudé {
1137bea0dd4SPhilippe Mathieu-Daudé     type_register_static(&smc37c669_type_info);
1147bea0dd4SPhilippe Mathieu-Daudé }
1157bea0dd4SPhilippe Mathieu-Daudé 
1167bea0dd4SPhilippe Mathieu-Daudé type_init(smc37c669_register_types)
117