From e2d545eeb718f9e5c0a1ab79d998560a8afe703b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 3 Feb 2023 01:11:17 -0500 Subject: [PATCH] Add many more flash rom options --- src/include/86box/flash.h | 30 ++- src/mem/sst_flash.c | 409 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 416 insertions(+), 23 deletions(-) diff --git a/src/include/86box/flash.h b/src/include/86box/flash.h index 21ba6b212..d161d416b 100644 --- a/src/include/86box/flash.h +++ b/src/include/86box/flash.h @@ -11,8 +11,10 @@ * * * Authors: Miran Grca, + * Jasmine Iwanek, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. + * Copyright 2022-2023 Jasmine Iwanek. */ #ifndef EMU_FLASH_H @@ -26,10 +28,36 @@ extern const device_t intel_flash_bxb_device; extern const device_t sst_flash_29ee010_device; extern const device_t sst_flash_29ee020_device; + +extern const device_t winbond_flash_w29c512_device; extern const device_t winbond_flash_w29c010_device; extern const device_t winbond_flash_w29c020_device; +extern const device_t winbond_flash_w29c040_device; + +extern const device_t sst_flash_39sf512_device; extern const device_t sst_flash_39sf010_device; extern const device_t sst_flash_39sf020_device; extern const device_t sst_flash_39sf040_device; +extern const device_t sst_flash_39lf512_device; +extern const device_t sst_flash_39lf010_device; +extern const device_t sst_flash_39lf020_device; +extern const device_t sst_flash_39lf040_device; +extern const device_t sst_flash_39lf080_device; +extern const device_t sst_flash_39lf016_device; + +extern const device_t sst_flash_49lf002_device; +extern const device_t sst_flash_49lf020_device; +extern const device_t sst_flash_49lf020a_device; +extern const device_t sst_flash_49lf003_device; +extern const device_t sst_flash_49lf030_device; +extern const device_t sst_flash_49lf004_device; +extern const device_t sst_flash_49lf004c_device; +extern const device_t sst_flash_49lf040_device; +extern const device_t sst_flash_49lf008_device; +extern const device_t sst_flash_49lf008c_device; +extern const device_t sst_flash_49lf080_device; +extern const device_t sst_flash_49lf016_device; +extern const device_t sst_flash_49lf160_device; + #endif /*EMU_FLASH_H*/ diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index a58aa6895..551e2da63 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -13,10 +13,12 @@ * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, + * Jasmine Iwanek, * * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. - * Copyright 2020 Melissa Goad. + * Copyright 2020 Melissa Goad. + * Copyright 2022-2023 Jasmine Iwanek. */ #include #include @@ -67,23 +69,69 @@ static char flash_path[1024]; /* 1st cycle variant only on 39 */ #define SST 0xbf /* SST Manufacturer's ID */ + +#define SST29EE512 0x5d00 +#define SST29LE_VE512 0x3d00 #define SST29EE010 0x0700 #define SST29LE_VE010 0x0800 #define SST29EE020 0x1000 #define SST29LE_VE020 0x1200 + #define SST39SF512 0xb400 #define SST39SF010 0xb500 #define SST39SF020 0xb600 #define SST39SF040 0xb700 -#define WINBOND 0xda /* Winbond Manufacturer's ID */ -#define W29C010 0xC100 -#define W29C020 0x4500 +#define SST39LF512 0xd400 +#define SST39LF010 0xd500 +#define SST39LF020 0xd600 +#define SST39LF040 0xd700 +#define SST39LF080 0xd800 +#define SST39LF016 0xd900 -#define SIZE_512K 0x010000 -#define SIZE_1M 0x020000 -#define SIZE_2M 0x040000 -#define SIZE_4M 0x080000 +/* +// 16 wide +#define SST39WF400 0x272f +#define SST39WF400B 0x272e +#define SST39WF800 0x273f +#define SST39WF800B 0x273e +#define SST39WF1601 0xbf274b +#define SST39WF1602 0xbf274a + +#define SST39LF100 0x2788 +#define SST39LF200 0x2789 +#define SST39LF400 0x2780 +#define SST39LF800 0x2781 +#define SST39LF160 0x2782 +*/ + +#define SST49LF002 0x5700 +#define SST49LF020 0x6100 +#define SST49LF020A 0x5200 +#define SST49LF003 0x1b00 +#define SST49LF004 0x6000 +#define SST49LF004C 0x5400 +#define SST49LF040 0x5100 +#define SST49LF008 0x5a00 +#define SST49LF008C 0x5900 +#define SST49LF080 0x5b00 +#define SST49LF030 0x1c00 +#define SST49LF160 0x4c00 +#define SST49LF016 0x5c00 + +#define WINBOND 0xda /* Winbond Manufacturer's ID */ +#define W29C512 0xc800 +#define W29C010 0xc100 +#define W29C020 0x4500 +#define W29C040 0x4600 + +#define SIZE_512K 0x010000 +#define SIZE_1M 0x020000 +#define SIZE_2M 0x040000 +#define SIZE_3M 0x060000 +#define SIZE_4M 0x080000 +#define SIZE_8M 0x100000 +#define SIZE_16M 0x200000 static void sst_sector_erase(sst_t *dev, uint32_t addr) @@ -483,20 +531,6 @@ const device_t sst_flash_29ee010_device = { .config = NULL }; -const device_t winbond_flash_w29c010_device = { - .name = "Winbond W29C010 Flash BIOS", - .internal_name = "winbond_flash_w29c010", - .flags = 0, - .local = WINBOND | W29C010 | SIZE_1M, - .init = sst_init, - .close = sst_close, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - const device_t sst_flash_29ee020_device = { .name = "SST 29EE020 Flash BIOS", .internal_name = "sst_flash_29ee020", @@ -511,6 +545,34 @@ const device_t sst_flash_29ee020_device = { .config = NULL }; +const device_t winbond_flash_w29c512_device = { + .name = "Winbond W29C512 Flash BIOS", + .internal_name = "winbond_flash_w29c512", + .flags = 0, + .local = WINBOND | W29C010 | SIZE_512K, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t winbond_flash_w29c010_device = { + .name = "Winbond W29C010 Flash BIOS", + .internal_name = "winbond_flash_w29c010", + .flags = 0, + .local = WINBOND | W29C010 | SIZE_1M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t winbond_flash_w29c020_device = { .name = "Winbond W29C020 Flash BIOS", .internal_name = "winbond_flash_w29c020", @@ -525,6 +587,34 @@ const device_t winbond_flash_w29c020_device = { .config = NULL }; +const device_t winbond_flash_w29c040_device = { + .name = "Winbond W29C040 Flash BIOS", + .internal_name = "winbond_flash_w29c040", + .flags = 0, + .local = WINBOND | W29C040 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39sf512_device = { + .name = "SST 39SF512 Flash BIOS", + .internal_name = "sst_flash_39sf512", + .flags = 0, + .local = SST | SST39SF512 | SIZE_512K, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t sst_flash_39sf010_device = { .name = "SST 39SF010 Flash BIOS", .internal_name = "sst_flash_39sf010", @@ -566,3 +656,278 @@ const device_t sst_flash_39sf040_device = { .force_redraw = NULL, .config = NULL }; + +const device_t sst_flash_39lf512_device = { + .name = "SST 39LF512 Flash BIOS", + .internal_name = "sst_flash_39lf512", + .flags = 0, + .local = SST | SST39LF512 | SIZE_512K, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf010_device = { + .name = "SST 39LF010 Flash BIOS", + .internal_name = "sst_flash_39lf010", + .flags = 0, + .local = SST | SST39LF010 | SIZE_1M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf020_device = { + .name = "SST 39LF020 Flash BIOS", + .internal_name = "sst_flash_39lf020", + .flags = 0, + .local = SST | SST39LF020 | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf040_device = { + .name = "SST 39LF040 Flash BIOS", + .internal_name = "sst_flash_39lf040", + .flags = 0, + .local = SST | SST39LF040 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf080_device = { + .name = "SST 39LF080 Flash BIOS", + .internal_name = "sst_flash_39lf080", + .flags = 0, + .local = SST | SST39LF080 | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf016_device = { + .name = "SST 39LF016 Flash BIOS", + .internal_name = "sst_flash_39lf016", + .flags = 0, + .local = SST | SST39LF016 | SIZE_16M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +/* + * Firmware Hubs. The FWH signals are not implemented yet. Firmware Hubs do write cycles + * to read/write on the flash. SST Flashes still do traditional flashing via PP Mode. Our + * BIOS firmwares don't seem to utilize FWH R/W thus the FWH ports remain unknown for an + * implementation. We just contain the ID's so the BIOS can do ESCD & DMI writes with no + * worries. + */ + +const device_t sst_flash_49lf002_device = { + .name = "SST 49LF002 Firmware Hub", + .internal_name = "sst_flash_49lf002", + .flags = 0, + .local = SST | SST49LF002 | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf020_device = { + .name = "SST 49LF020 Firmware Hub", + .internal_name = "sst_flash_49lf0020", + .flags = 0, + .local = SST | SST49LF020 | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf020a_device = { + .name = "SST 49LF020A Firmware Hub", + .internal_name = "sst_flash_49lf0020a", + .flags = 0, + .local = SST | SST49LF020A | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf003_device = { + .name = "SST 49LF003 Firmware Hub", + .internal_name = "sst_flash_49lf003", + .flags = 0, + .local = SST | SST49LF003 | SIZE_3M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf030_device = { + .name = "SST 49LF030 Firmware Hub", + .internal_name = "sst_flash_49lf030", + .flags = 0, + .local = SST | SST49LF030 | SIZE_3M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf004_device = { + .name = "SST 49LF004 Firmware Hub", + .internal_name = "sst_flash_49lf004", + .flags = 0, + .local = SST | SST49LF004 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf004c_device = { + .name = "SST 49LF004C Firmware Hub", + .internal_name = "sst_flash_49lf004c", + .flags = 0, + .local = SST | SST49LF004C | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf040_device = { + .name = "SST 49LF040 Firmware Hub", + .internal_name = "sst_flash_49lf040", + .flags = 0, + .local = SST | SST49LF040 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf008_device = { + .name = "SST 49LF008 Firmware Hub", + .internal_name = "sst_flash_49lf008", + .flags = 0, + .local = SST | SST49LF008 | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf008c_device = { + .name = "SST 49LF008C Firmware Hub", + .internal_name = "sst_flash_49lf008c", + .flags = 0, + .local = SST | SST49LF008C | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf080_device = { + .name = "SST 49LF080 Firmware Hub", + .internal_name = "sst_flash_49lf080", + .flags = 0, + .local = SST | SST49LF080 | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf016_device = { + .name = "SST 49LF016 Firmware Hub", + .internal_name = "sst_flash_49lf016", + .flags = 0, + .local = SST | SST49LF016 | SIZE_16M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf160_device = { + + .name = "SST 49LF160 Firmware Hub", + .internal_name = "sst_flash_49lf160", + .flags = 0, + .local = SST | SST49LF160 | SIZE_16M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +};