Fixed the SM(S)C) FDC37C93x NVR handling and make any non-PIIX4 machine that uses it, use its full NVR capabilities.

This commit is contained in:
OBattler
2024-04-18 03:49:47 +02:00
parent 9947af00d4
commit 75919a1cb9
9 changed files with 143 additions and 72 deletions

View File

@@ -43,6 +43,7 @@ extern const device_t fdc37c931apm_compaq_device;
extern const device_t fdc37c932fr_device;
extern const device_t fdc37c932qf_device;
extern const device_t fdc37c935_device;
extern const device_t fdc37c935_no_nvr_device;
extern const device_t fdc37m60x_device;
extern const device_t fdc37m60x_370_device;
extern const device_t it8661f_device;

View File

@@ -143,8 +143,7 @@ machine_at_spitfire_init(const machine_t *model)
pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);
device_add(&i440lx_device);
device_add(&piix4e_device);
device_add(&keyboard_ps2_pci_device);
device_add(&fdc37c935_device);
device_add(&fdc37c935_no_nvr_device);
device_add(&intel_flash_bxt_device);
spd_register(SPD_TYPE_SDRAM, 0xF, 256);
device_add(&lm78_device); /* no reporting in BIOS */

View File

@@ -127,13 +127,13 @@ machine_at_p6bap_init(const machine_t *model)
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 5);
pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 5);
pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 5, 1);
pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 5, 1, 2);
pci_register_slot(0x0c, PCI_CARD_NORMAL, 5, 1, 2, 3);
pci_register_slot(0x0d, PCI_CARD_NORMAL, 5, 3, 2, 1);
pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 5);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 4);
pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4);
pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 4, 1);
pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2);
pci_register_slot(0x0c, PCI_CARD_NORMAL, 4, 1, 2, 3);
pci_register_slot(0x0d, PCI_CARD_NORMAL, 4, 3, 2, 1);
pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);
device_add(&via_apro133a_device); /* Rebranded as ET82C693A */
device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */
device_add(&w83977ef_device);
@@ -162,13 +162,13 @@ machine_at_p6bat_init(const machine_t *model)
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 5);
pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 5);
pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 5, 1);
pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 5, 1, 2);
pci_register_slot(0x0c, PCI_CARD_NORMAL, 5, 1, 2, 3);
pci_register_slot(0x0d, PCI_CARD_NORMAL, 5, 3, 2, 1);
pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 5);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 4);
pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4);
pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 4, 1);
pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2);
pci_register_slot(0x0c, PCI_CARD_NORMAL, 4, 1, 2, 3);
pci_register_slot(0x0d, PCI_CARD_NORMAL, 4, 3, 2, 1);
pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);
device_add(&via_apro133_device);
device_add(&via_vt82c596b_device);
device_add(&w83977ef_device);

View File

@@ -73,9 +73,7 @@ machine_at_acerv35n_init(const machine_t *model)
pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4);
device_add(&i430hx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_pci_device);
device_add(&fdc37c932fr_device);
device_add(&sst_flash_29ee010_device);
return ret;
@@ -155,7 +153,7 @@ machine_at_m7shi_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
@@ -166,7 +164,6 @@ machine_at_m7shi_init(const machine_t *model)
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
device_add(&i430hx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c935_device);
device_add(&intel_flash_bxt_device);
@@ -574,7 +571,6 @@ machine_at_presario2240_init(const machine_t *model)
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c932qf_device);
device_add(&sst_flash_29ee020_device);
@@ -605,7 +601,6 @@ machine_at_presario4500_init(const machine_t *model)
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c931apm_compaq_device);
device_add(&sst_flash_29ee020_device);
@@ -623,7 +618,7 @@ machine_at_p55va_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -634,7 +629,6 @@ machine_at_p55va_init(const machine_t *model)
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c932fr_device);
device_add(&intel_flash_bxt_device);
@@ -652,7 +646,7 @@ machine_at_brio80xx_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
@@ -663,7 +657,6 @@ machine_at_brio80xx_init(const machine_t *model)
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c935_device);
device_add(&sst_flash_29ee020_device);
@@ -719,7 +712,7 @@ machine_at_pb810_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -733,7 +726,6 @@ machine_at_pb810_init(const machine_t *model)
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_device);
device_add(&fdc37c935_device);
device_add(&intel_flash_bxt_device);
@@ -1469,7 +1461,6 @@ machine_at_thunderbolt_init(const machine_t *model)
pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 0, 1, 2);
device_add(&i430tx_device);
device_add(&piix4_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c935_device);
device_add(&intel_flash_bxt_device);
spd_register(SPD_TYPE_SDRAM, 0x3, 128);

View File

@@ -534,7 +534,7 @@ machine_at_acerm3a_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -546,7 +546,6 @@ machine_at_acerm3a_init(const machine_t *model)
pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0);
device_add(&i430hx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_pci_device);
device_add(&fdc37c935_device);
device_add(&sst_flash_29ee010_device);
@@ -686,7 +685,7 @@ machine_at_dellhannibalp_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -698,7 +697,6 @@ machine_at_dellhannibalp_init(const machine_t *model)
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4);
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c932fr_device);
device_add(&intel_flash_bxt_ami_device);
@@ -720,7 +718,7 @@ machine_at_gw2kte_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -732,7 +730,6 @@ machine_at_gw2kte_init(const machine_t *model)
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4);
device_add(&i430vx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c932fr_device);
device_add(&intel_flash_bxt_ami_device);
@@ -850,7 +847,6 @@ machine_at_vectra54_init(const machine_t *model)
if (gfxcard[0] == VID_INTERNAL)
device_add(&s3_phoenix_trio64_onboard_pci_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&i430fx_device);
device_add(&piix_device);
device_add(&fdc37c931apm_device);

View File

@@ -175,7 +175,7 @@ machine_at_acerv60n_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model,2 );
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -187,7 +187,6 @@ machine_at_acerv60n_init(const machine_t *model)
pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1);
device_add(&i440fx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_pci_device);
device_add(&fdc37c935_device);
device_add(&sst_flash_29ee010_device);
@@ -366,7 +365,7 @@ machine_at_m6mi_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -377,7 +376,6 @@ machine_at_m6mi_init(const machine_t *model)
pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3);
device_add(&i440fx_device);
device_add(&piix3_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&fdc37c935_device);
device_add(&intel_flash_bxt_device);

View File

@@ -10513,7 +10513,7 @@ const machine_t machines[] = {
.max = 196608,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -10678,7 +10678,7 @@ const machine_t machines[] = {
.max = 131072,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -10760,7 +10760,7 @@ const machine_t machines[] = {
.max = 131072,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -10967,7 +10967,7 @@ const machine_t machines[] = {
.max = 196608,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -11616,7 +11616,7 @@ const machine_t machines[] = {
.max = 131072,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -11656,7 +11656,7 @@ const machine_t machines[] = {
.max = 131072,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -11738,7 +11738,7 @@ const machine_t machines[] = {
.max = 131072,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -13217,7 +13217,7 @@ const machine_t machines[] = {
.max = 524288,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
@@ -13541,7 +13541,7 @@ const machine_t machines[] = {
.max = 786432,
.step = 8192
},
.nvrmask = 127,
.nvrmask = 511,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,

View File

@@ -309,7 +309,6 @@ typedef struct local_t {
uint8_t irq_state;
uint8_t smi_status;
uint8_t addr[8];
uint8_t wp[2];
uint8_t bank[8];
uint8_t *lock;
@@ -317,6 +316,8 @@ typedef struct local_t {
int16_t count;
int16_t state;
uint16_t addr[8];
int32_t smi_enable;
uint64_t ecount;

View File

@@ -31,6 +31,7 @@
#include <86box/hdc_ide.h>
#include <86box/fdd.h>
#include <86box/fdc.h>
#include <86box/keyboard.h>
#include <86box/nvr.h>
#include <86box/apm.h>
#include <86box/acpi.h>
@@ -51,11 +52,13 @@ typedef struct access_bus_t {
typedef struct fdc37c93x_t {
uint8_t chip_id;
uint8_t is_apm;
uint8_t has_nvr;
uint8_t tries;
uint8_t gpio_regs[2];
uint8_t auxio_reg;
uint8_t regs[48];
uint8_t ld_regs[11][256];
uint16_t superio_base;
uint16_t gpio_base; /* Set to EA */
uint16_t auxio_base;
uint16_t nvr_sec_base;
@@ -66,8 +69,23 @@ typedef struct fdc37c93x_t {
access_bus_t *access_bus;
nvr_t *nvr;
acpi_t *acpi;
void *kbc;
} fdc37c93x_t;
static void fdc37c93x_write(uint16_t port, uint8_t val, void *priv);
static uint8_t fdc37c93x_read(uint16_t port, void *priv);
static uint16_t
make_port_superio(fdc37c93x_t *dev)
{
uint16_t r0 = dev->regs[0x26];
uint16_t r1 = dev->regs[0x27];
uint16_t p = (r1 << 8) + r0;
return p;
}
static uint16_t
make_port(fdc37c93x_t *dev, uint8_t ld)
{
@@ -126,6 +144,16 @@ fdc37c93x_gpio_write(uint16_t port, uint8_t val, void *priv)
dev->gpio_regs[0] = (dev->gpio_regs[0] & 0xfc) | (val & 0x03);
}
static void
fdc37c93x_superio_handler(fdc37c93x_t *dev)
{
io_removehandler(dev->superio_base, 0x0002,
fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev);
dev->superio_base = make_port_superio(dev);
io_sethandler(dev->superio_base, 0x0002,
fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev);
}
static void
fdc37c93x_fdc_handler(fdc37c93x_t *dev)
{
@@ -180,7 +208,9 @@ fdc37c93x_serial_handler(fdc37c93x_t *dev, int uart)
static void
fdc37c93x_nvr_pri_handler(fdc37c93x_t *dev)
{
uint8_t local_enable = !!dev->ld_regs[6][0x30];
uint8_t local_enable = !!dev->ld_regs[6][0x30];
local_enable &= ((dev->ld_regs[6][0xf0] & 0x90) != 0x80);
nvr_at_handler(0, 0x70, dev->nvr);
if (local_enable)
@@ -193,6 +223,9 @@ fdc37c93x_nvr_sec_handler(fdc37c93x_t *dev)
uint16_t ld_port = 0;
uint8_t local_enable = !!dev->ld_regs[6][0x30];
local_enable &= (((dev->ld_regs[6][0xf0] & 0xe0) == 0x80) ||
((dev->ld_regs[6][0xf0] & 0xe0) == 0xe0));
nvr_at_sec_handler(0, dev->nvr_sec_base, dev->nvr);
if (local_enable) {
dev->nvr_sec_base = ld_port = make_port_sec(dev, 6) & 0xFFFE;
@@ -203,6 +236,14 @@ fdc37c93x_nvr_sec_handler(fdc37c93x_t *dev)
}
}
static void
fdc37c93x_kbc_handler(fdc37c93x_t *dev)
{
uint8_t local_enable = !!dev->ld_regs[7][0x30];
kbc_at_handler(local_enable, dev->kbc);
}
static void
fdc37c93x_auxio_handler(fdc37c93x_t *dev)
{
@@ -401,10 +442,9 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv)
switch (dev->regs[7]) {
case 0x01:
case 0x02:
case 0x07:
return;
case 0x06:
if (dev->chip_id != 0x30)
if (!dev->has_nvr)
return;
/* Bits 0 to 3 of logical device 6 (RTC) register F0h must stay set
once they are set. */
@@ -453,6 +493,10 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv)
fdc37c93x_access_bus_handler(dev);
break;
case 0x27:
fdc37c93x_superio_handler(dev);
break;
default:
break;
}
@@ -566,12 +610,15 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv)
break;
case 6:
/* RTC/NVR */
if (dev->chip_id != 0x30)
break;
if (!dev->has_nvr)
return;
switch (dev->cur_reg) {
case 0x30:
if (valxor)
if (valxor) {
fdc37c93x_nvr_pri_handler(dev);
fdc37c93x_nvr_sec_handler(dev);
}
break;
case 0x62:
case 0x63:
if (valxor)
@@ -617,6 +664,9 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv)
nvr_bank_set(0, 0, dev->nvr);
nvr_bank_set(1, 0xff, dev->nvr);
}
fdc37c93x_nvr_pri_handler(dev);
fdc37c93x_nvr_sec_handler(dev);
}
break;
@@ -624,6 +674,18 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv)
break;
}
break;
case 7:
/* Keyboard */
switch (dev->cur_reg) {
case 0x30:
if (valxor)
fdc37c93x_kbc_handler(dev);
break;
default:
break;
}
break;
case 8:
/* Auxiliary I/O */
switch (dev->cur_reg) {
@@ -730,7 +792,7 @@ fdc37c93x_reset(fdc37c93x_t *dev)
memset(dev->ld_regs[i], 0, 256);
/* Logical device 0: FDD */
dev->ld_regs[0][0x30] = 1;
dev->ld_regs[0][0x30] = 0;
dev->ld_regs[0][0x60] = 3;
dev->ld_regs[0][0x61] = 0xF0;
dev->ld_regs[0][0x70] = 6;
@@ -756,7 +818,7 @@ fdc37c93x_reset(fdc37c93x_t *dev)
dev->ld_regs[2][0x70] = 0xF;
/* Logical device 3: Parallel Port */
dev->ld_regs[3][0x30] = 1;
dev->ld_regs[3][0x30] = 0;
dev->ld_regs[3][0x60] = 3;
dev->ld_regs[3][0x61] = 0x78;
dev->ld_regs[3][0x70] = 7;
@@ -764,7 +826,7 @@ fdc37c93x_reset(fdc37c93x_t *dev)
dev->ld_regs[3][0xF0] = 0x3C;
/* Logical device 4: Serial Port 1 */
dev->ld_regs[4][0x30] = 1;
dev->ld_regs[4][0x30] = 0;
dev->ld_regs[4][0x60] = 3;
dev->ld_regs[4][0x61] = 0xf8;
dev->ld_regs[4][0x70] = 4;
@@ -772,7 +834,7 @@ fdc37c93x_reset(fdc37c93x_t *dev)
serial_setup(dev->uart[0], COM1_ADDR, dev->ld_regs[4][0x70]);
/* Logical device 5: Serial Port 2 */
dev->ld_regs[5][0x30] = 1;
dev->ld_regs[5][0x30] = 0;
dev->ld_regs[5][0x60] = 2;
dev->ld_regs[5][0x61] = 0xf8;
dev->ld_regs[5][0x70] = 3;
@@ -782,12 +844,13 @@ fdc37c93x_reset(fdc37c93x_t *dev)
serial_setup(dev->uart[1], COM2_ADDR, dev->ld_regs[5][0x70]);
/* Logical device 6: RTC */
dev->ld_regs[6][0x30] = 1;
dev->ld_regs[6][0x63] = (dev->chip_id == 0x30) ? 0x70 : 0x00;
dev->ld_regs[6][0x30] = 0;
dev->ld_regs[6][0x63] = (dev->has_nvr) ? 0x70 : 0x00;
dev->ld_regs[6][0xF0] = 0;
dev->ld_regs[6][0xF4] = 3;
/* Logical device 7: Keyboard */
dev->ld_regs[7][0x30] = 1;
dev->ld_regs[7][0x30] = 0;
dev->ld_regs[7][0x61] = 0x60;
dev->ld_regs[7][0x70] = 1;
@@ -810,13 +873,22 @@ fdc37c93x_reset(fdc37c93x_t *dev)
fdc_reset(dev->fdc);
fdc37c93x_fdc_handler(dev);
if (dev->chip_id == 0x30) {
if (dev->has_nvr) {
fdc37c93x_nvr_pri_handler(dev);
fdc37c93x_nvr_sec_handler(dev);
nvr_bank_set(0, 0, dev->nvr);
nvr_bank_set(1, 0xff, dev->nvr);
nvr_lock_set(0x80, 0x20, 0, dev->nvr);
nvr_lock_set(0xa0, 0x20, 0, dev->nvr);
nvr_lock_set(0xc0, 0x20, 0, dev->nvr);
nvr_lock_set(0xe0, 0x20, 0, dev->nvr);
}
fdc37c93x_kbc_handler(dev);
fdc37c93x_superio_handler(dev);
dev->locked = 0;
}
@@ -874,6 +946,7 @@ fdc37c93x_init(const device_t *info)
dev->chip_id = info->local & 0xff;
dev->is_apm = (info->local >> 8) & 0x01;
is_compaq = (info->local >> 8) & 0x02;
dev->has_nvr = !((info->local >> 8) & 0x04);
dev->gpio_regs[0] = 0xff;
#if 0
@@ -881,7 +954,7 @@ fdc37c93x_init(const device_t *info)
#endif
dev->gpio_regs[1] = (dev->chip_id == 0x30) ? 0xff : 0xfd;
if (dev->chip_id == 0x30) {
if (dev->has_nvr) {
dev->nvr = device_add(&at_nvr_device);
nvr_bank_set(0, 0, dev->nvr);
@@ -901,20 +974,17 @@ fdc37c93x_init(const device_t *info)
fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev);
io_sethandler(0x0fb, 0x0001,
fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev);
} else {
io_sethandler(FDC_SECONDARY_ADDR, 0x0002,
fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev);
io_sethandler(FDC_PRIMARY_ADDR, 0x0002,
fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev);
}
dev->kbc = device_add(&keyboard_ps2_ami_pci_device);
fdc37c93x_reset(dev);
return dev;
}
const device_t fdc37c931apm_device = {
.name = "SMC FDC37C932QF Super I/O",
.name = "SMC FDC37C931APM Super I/O",
.internal_name = "fdc37c931apm",
.flags = 0,
.local = 0x130, /* Share the same ID with the 932QF. */
@@ -928,7 +998,7 @@ const device_t fdc37c931apm_device = {
};
const device_t fdc37c931apm_compaq_device = {
.name = "SMC FDC37C932QF Super I/O (Compaq Presario 4500)",
.name = "SMC FDC37C931APM Super I/O (Compaq Presario 4500)",
.internal_name = "fdc37c931apm_compaq",
.flags = 0,
.local = 0x330, /* Share the same ID with the 932QF. */
@@ -982,3 +1052,18 @@ const device_t fdc37c935_device = {
.force_redraw = NULL,
.config = NULL
};
const device_t fdc37c935_no_nvr_device = {
.name = "SMC FDC37C935 Super I/O",
.internal_name = "fdc37c935",
.flags = 0,
.local = 0x402,
.init = fdc37c93x_init,
.close = fdc37c93x_close,
.reset = NULL,
{ .available = NULL },
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};