1*7bea0dd4SPhilippe Mathieu-Daudé /* 2*7bea0dd4SPhilippe Mathieu-Daudé * SMC FDC37C669 Super I/O controller 3*7bea0dd4SPhilippe Mathieu-Daudé * 4*7bea0dd4SPhilippe Mathieu-Daudé * Copyright (c) 2018 Philippe Mathieu-Daudé 5*7bea0dd4SPhilippe Mathieu-Daudé * 6*7bea0dd4SPhilippe Mathieu-Daudé * This code is licensed under the GNU GPLv2 and later. 7*7bea0dd4SPhilippe Mathieu-Daudé * See the COPYING file in the top-level directory. 8*7bea0dd4SPhilippe Mathieu-Daudé * SPDX-License-Identifier: GPL-2.0-or-later 9*7bea0dd4SPhilippe Mathieu-Daudé */ 10*7bea0dd4SPhilippe Mathieu-Daudé 11*7bea0dd4SPhilippe Mathieu-Daudé #include "qemu/osdep.h" 12*7bea0dd4SPhilippe Mathieu-Daudé #include "hw/isa/superio.h" 13*7bea0dd4SPhilippe Mathieu-Daudé 14*7bea0dd4SPhilippe Mathieu-Daudé /* UARTs (compatible with NS16450 or PC16550) */ 15*7bea0dd4SPhilippe Mathieu-Daudé 16*7bea0dd4SPhilippe Mathieu-Daudé static bool is_serial_enabled(ISASuperIODevice *sio, uint8_t index) 17*7bea0dd4SPhilippe Mathieu-Daudé { 18*7bea0dd4SPhilippe Mathieu-Daudé return index < 2; 19*7bea0dd4SPhilippe Mathieu-Daudé } 20*7bea0dd4SPhilippe Mathieu-Daudé 21*7bea0dd4SPhilippe Mathieu-Daudé static uint16_t get_serial_iobase(ISASuperIODevice *sio, uint8_t index) 22*7bea0dd4SPhilippe Mathieu-Daudé { 23*7bea0dd4SPhilippe Mathieu-Daudé return index ? 0x2f8 : 0x3f8; 24*7bea0dd4SPhilippe Mathieu-Daudé } 25*7bea0dd4SPhilippe Mathieu-Daudé 26*7bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_serial_irq(ISASuperIODevice *sio, uint8_t index) 27*7bea0dd4SPhilippe Mathieu-Daudé { 28*7bea0dd4SPhilippe Mathieu-Daudé return index ? 3 : 4; 29*7bea0dd4SPhilippe Mathieu-Daudé } 30*7bea0dd4SPhilippe Mathieu-Daudé 31*7bea0dd4SPhilippe Mathieu-Daudé /* Parallel port */ 32*7bea0dd4SPhilippe Mathieu-Daudé 33*7bea0dd4SPhilippe Mathieu-Daudé static bool is_parallel_enabled(ISASuperIODevice *sio, uint8_t index) 34*7bea0dd4SPhilippe Mathieu-Daudé { 35*7bea0dd4SPhilippe Mathieu-Daudé return index < 1; 36*7bea0dd4SPhilippe Mathieu-Daudé } 37*7bea0dd4SPhilippe Mathieu-Daudé 38*7bea0dd4SPhilippe Mathieu-Daudé static uint16_t get_parallel_iobase(ISASuperIODevice *sio, uint8_t index) 39*7bea0dd4SPhilippe Mathieu-Daudé { 40*7bea0dd4SPhilippe Mathieu-Daudé return 0x3bc; 41*7bea0dd4SPhilippe Mathieu-Daudé } 42*7bea0dd4SPhilippe Mathieu-Daudé 43*7bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_parallel_irq(ISASuperIODevice *sio, uint8_t index) 44*7bea0dd4SPhilippe Mathieu-Daudé { 45*7bea0dd4SPhilippe Mathieu-Daudé return 7; 46*7bea0dd4SPhilippe Mathieu-Daudé } 47*7bea0dd4SPhilippe Mathieu-Daudé 48*7bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_parallel_dma(ISASuperIODevice *sio, uint8_t index) 49*7bea0dd4SPhilippe Mathieu-Daudé { 50*7bea0dd4SPhilippe Mathieu-Daudé return 3; 51*7bea0dd4SPhilippe Mathieu-Daudé } 52*7bea0dd4SPhilippe Mathieu-Daudé 53*7bea0dd4SPhilippe Mathieu-Daudé /* Diskette controller (Software compatible with the Intel PC8477) */ 54*7bea0dd4SPhilippe Mathieu-Daudé 55*7bea0dd4SPhilippe Mathieu-Daudé static bool is_fdc_enabled(ISASuperIODevice *sio, uint8_t index) 56*7bea0dd4SPhilippe Mathieu-Daudé { 57*7bea0dd4SPhilippe Mathieu-Daudé return index < 1; 58*7bea0dd4SPhilippe Mathieu-Daudé } 59*7bea0dd4SPhilippe Mathieu-Daudé 60*7bea0dd4SPhilippe Mathieu-Daudé static uint16_t get_fdc_iobase(ISASuperIODevice *sio, uint8_t index) 61*7bea0dd4SPhilippe Mathieu-Daudé { 62*7bea0dd4SPhilippe Mathieu-Daudé return 0x3f0; 63*7bea0dd4SPhilippe Mathieu-Daudé } 64*7bea0dd4SPhilippe Mathieu-Daudé 65*7bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_fdc_irq(ISASuperIODevice *sio, uint8_t index) 66*7bea0dd4SPhilippe Mathieu-Daudé { 67*7bea0dd4SPhilippe Mathieu-Daudé return 6; 68*7bea0dd4SPhilippe Mathieu-Daudé } 69*7bea0dd4SPhilippe Mathieu-Daudé 70*7bea0dd4SPhilippe Mathieu-Daudé static unsigned int get_fdc_dma(ISASuperIODevice *sio, uint8_t index) 71*7bea0dd4SPhilippe Mathieu-Daudé { 72*7bea0dd4SPhilippe Mathieu-Daudé return 2; 73*7bea0dd4SPhilippe Mathieu-Daudé } 74*7bea0dd4SPhilippe Mathieu-Daudé 75*7bea0dd4SPhilippe Mathieu-Daudé static void smc37c669_class_init(ObjectClass *klass, void *data) 76*7bea0dd4SPhilippe Mathieu-Daudé { 77*7bea0dd4SPhilippe Mathieu-Daudé ISASuperIOClass *sc = ISA_SUPERIO_CLASS(klass); 78*7bea0dd4SPhilippe Mathieu-Daudé 79*7bea0dd4SPhilippe Mathieu-Daudé sc->parallel = (ISASuperIOFuncs){ 80*7bea0dd4SPhilippe Mathieu-Daudé .count = 1, 81*7bea0dd4SPhilippe Mathieu-Daudé .is_enabled = is_parallel_enabled, 82*7bea0dd4SPhilippe Mathieu-Daudé .get_iobase = get_parallel_iobase, 83*7bea0dd4SPhilippe Mathieu-Daudé .get_irq = get_parallel_irq, 84*7bea0dd4SPhilippe Mathieu-Daudé .get_dma = get_parallel_dma, 85*7bea0dd4SPhilippe Mathieu-Daudé }; 86*7bea0dd4SPhilippe Mathieu-Daudé sc->serial = (ISASuperIOFuncs){ 87*7bea0dd4SPhilippe Mathieu-Daudé .count = 2, 88*7bea0dd4SPhilippe Mathieu-Daudé .is_enabled = is_serial_enabled, 89*7bea0dd4SPhilippe Mathieu-Daudé .get_iobase = get_serial_iobase, 90*7bea0dd4SPhilippe Mathieu-Daudé .get_irq = get_serial_irq, 91*7bea0dd4SPhilippe Mathieu-Daudé }; 92*7bea0dd4SPhilippe Mathieu-Daudé sc->floppy = (ISASuperIOFuncs){ 93*7bea0dd4SPhilippe Mathieu-Daudé .count = 1, 94*7bea0dd4SPhilippe Mathieu-Daudé .is_enabled = is_fdc_enabled, 95*7bea0dd4SPhilippe Mathieu-Daudé .get_iobase = get_fdc_iobase, 96*7bea0dd4SPhilippe Mathieu-Daudé .get_irq = get_fdc_irq, 97*7bea0dd4SPhilippe Mathieu-Daudé .get_dma = get_fdc_dma, 98*7bea0dd4SPhilippe Mathieu-Daudé }; 99*7bea0dd4SPhilippe Mathieu-Daudé sc->ide.count = 0; 100*7bea0dd4SPhilippe Mathieu-Daudé } 101*7bea0dd4SPhilippe Mathieu-Daudé 102*7bea0dd4SPhilippe Mathieu-Daudé static const TypeInfo smc37c669_type_info = { 103*7bea0dd4SPhilippe Mathieu-Daudé .name = TYPE_SMC37C669_SUPERIO, 104*7bea0dd4SPhilippe Mathieu-Daudé .parent = TYPE_ISA_SUPERIO, 105*7bea0dd4SPhilippe Mathieu-Daudé .instance_size = sizeof(ISASuperIODevice), 106*7bea0dd4SPhilippe Mathieu-Daudé .class_size = sizeof(ISASuperIOClass), 107*7bea0dd4SPhilippe Mathieu-Daudé .class_init = smc37c669_class_init, 108*7bea0dd4SPhilippe Mathieu-Daudé }; 109*7bea0dd4SPhilippe Mathieu-Daudé 110*7bea0dd4SPhilippe Mathieu-Daudé static void smc37c669_register_types(void) 111*7bea0dd4SPhilippe Mathieu-Daudé { 112*7bea0dd4SPhilippe Mathieu-Daudé type_register_static(&smc37c669_type_info); 113*7bea0dd4SPhilippe Mathieu-Daudé } 114*7bea0dd4SPhilippe Mathieu-Daudé 115*7bea0dd4SPhilippe Mathieu-Daudé type_init(smc37c669_register_types) 116