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é 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é 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é 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é 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é 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é 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é 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é 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é 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é 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é 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é 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é 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