xref: /openbmc/qemu/hw/isa/smc37c669-superio.c (revision 7bea0dd4)
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