ISA PNP ROM parsing fixes (fixed DMA flags and added support for fixed-sized 10-bit I/O address).
This commit is contained in:
@@ -737,7 +737,7 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size)
|
||||
isapnp_log("ISAPnP: Parsing ROM resources for card %c%c%c%02X%02X (serial %08X)\n", '@' + ((vendor >> 10) & 0x1f), '@' + ((vendor >> 5) & 0x1f), '@' + (vendor & 0x1f), card->rom[2], card->rom[3], (card->rom[7] << 24) | (card->rom[6] << 16) | (card->rom[5] << 8) | card->rom[4]);
|
||||
const char *df_priority[] = { "good", "acceptable", "sub-optimal", "unknown priority" };
|
||||
const char *mem_control[] = { "8-bit", "16-bit", "8/16-bit", "32-bit" };
|
||||
const char *dma_transfer[] = { "8-bit", "8/16-bit", "16-bit", "unknown" };
|
||||
const char *dma_transfer[] = { "8-bit", "8/16-bit", "16-bit", "Reserved" };
|
||||
const char *dma_speed[] = { "compatibility", "Type A", "Type B", "Type F" };
|
||||
#endif
|
||||
uint16_t i = 9;
|
||||
@@ -937,9 +937,9 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size)
|
||||
case 0x05: /* DMA */
|
||||
isapnp_log("ISAPnP: >>%s DMA index %d with mask %02X, %s, %sbus master, %scount by byte, %scount by word, %s speed\n", in_df ? ">" : "", dma++, card->rom[i + 1],
|
||||
dma_transfer[card->rom[i + 2] & 3],
|
||||
(card->rom[i + 2] & 0x04) ? "not " : "",
|
||||
(card->rom[i + 2] & 0x08) ? "not " : "",
|
||||
(card->rom[i + 2] & 0x10) ? "not " : "",
|
||||
(card->rom[i + 2] & 0x04) ? "" : "not ",
|
||||
(card->rom[i + 2] & 0x08) ? "" : "not ",
|
||||
(card->rom[i + 2] & 0x10) ? "" : "not ",
|
||||
dma_speed[(card->rom[i + 2] >> 5) & 3]);
|
||||
break;
|
||||
#endif
|
||||
@@ -1004,6 +1004,29 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size)
|
||||
|
||||
break;
|
||||
|
||||
case 0x09: /* Fixed I/O port */
|
||||
if (!ld) {
|
||||
isapnp_log("ISAPnP: >>%s Fixed I/O descriptor with no logical device\n", in_df ? ">" : "");
|
||||
break;
|
||||
}
|
||||
|
||||
if (io > 7) {
|
||||
isapnp_log("ISAPnP: >>%s Fixed I/O descriptor overflow (%d)\n", in_df ? ">" : "", io++);
|
||||
break;
|
||||
}
|
||||
|
||||
isapnp_log("ISAPnP: >>%s Fixed I/O range %d with %d ports at %04X\n", in_df ? ">" : "", io, card->rom[i + 3], *((uint16_t *) &card->rom[i + 1]));
|
||||
|
||||
/* Fixed I/O port ranges of this kind are always 10-bit. */
|
||||
ld->io_16bit &= ~(1 << io);
|
||||
|
||||
if (card->rom[i + 3] > ld->io_len[io])
|
||||
ld->io_len[io] = card->rom[i + 3];
|
||||
|
||||
io++;
|
||||
|
||||
break;
|
||||
|
||||
case 0x0f: /* end tag */
|
||||
/* Calculate checksum. */
|
||||
res = 0x00;
|
||||
|
Reference in New Issue
Block a user