116 lines
2.7 KiB
C
116 lines
2.7 KiB
C
/*
|
|
* SMC FDC37C669 Super I/O controller
|
|
*
|
|
* Copyright (c) 2018 Philippe Mathieu-Daudé
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "hw/isa/superio.h"
|
|
#include "qemu/module.h"
|
|
|
|
/* UARTs (compatible with NS16450 or PC16550) */
|
|
|
|
static bool is_serial_enabled(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return index < 2;
|
|
}
|
|
|
|
static uint16_t get_serial_iobase(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return index ? 0x2f8 : 0x3f8;
|
|
}
|
|
|
|
static unsigned int get_serial_irq(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return index ? 3 : 4;
|
|
}
|
|
|
|
/* Parallel port */
|
|
|
|
static bool is_parallel_enabled(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return index < 1;
|
|
}
|
|
|
|
static uint16_t get_parallel_iobase(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return 0x378;
|
|
}
|
|
|
|
static unsigned int get_parallel_irq(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return 7;
|
|
}
|
|
|
|
static unsigned int get_parallel_dma(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
/* Diskette controller (Software compatible with the Intel PC8477) */
|
|
|
|
static bool is_fdc_enabled(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return index < 1;
|
|
}
|
|
|
|
static uint16_t get_fdc_iobase(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return 0x3f0;
|
|
}
|
|
|
|
static unsigned int get_fdc_irq(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return 6;
|
|
}
|
|
|
|
static unsigned int get_fdc_dma(ISASuperIODevice *sio, uint8_t index)
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
static void smc37c669_class_init(ObjectClass *klass, void *data)
|
|
{
|
|
ISASuperIOClass *sc = ISA_SUPERIO_CLASS(klass);
|
|
|
|
sc->parallel = (ISASuperIOFuncs){
|
|
.count = 1,
|
|
.is_enabled = is_parallel_enabled,
|
|
.get_iobase = get_parallel_iobase,
|
|
.get_irq = get_parallel_irq,
|
|
.get_dma = get_parallel_dma,
|
|
};
|
|
sc->serial = (ISASuperIOFuncs){
|
|
.count = 2,
|
|
.is_enabled = is_serial_enabled,
|
|
.get_iobase = get_serial_iobase,
|
|
.get_irq = get_serial_irq,
|
|
};
|
|
sc->floppy = (ISASuperIOFuncs){
|
|
.count = 1,
|
|
.is_enabled = is_fdc_enabled,
|
|
.get_iobase = get_fdc_iobase,
|
|
.get_irq = get_fdc_irq,
|
|
.get_dma = get_fdc_dma,
|
|
};
|
|
sc->ide.count = 0;
|
|
}
|
|
|
|
static const TypeInfo smc37c669_type_info = {
|
|
.name = TYPE_SMC37C669_SUPERIO,
|
|
.parent = TYPE_ISA_SUPERIO,
|
|
.instance_size = sizeof(ISASuperIODevice),
|
|
.class_size = sizeof(ISASuperIOClass),
|
|
.class_init = smc37c669_class_init,
|
|
};
|
|
|
|
static void smc37c669_register_types(void)
|
|
{
|
|
type_register_static(&smc37c669_type_info);
|
|
}
|
|
|
|
type_init(smc37c669_register_types)
|