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]);
|
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 *df_priority[] = { "good", "acceptable", "sub-optimal", "unknown priority" };
|
||||||
const char *mem_control[] = { "8-bit", "16-bit", "8/16-bit", "32-bit" };
|
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" };
|
const char *dma_speed[] = { "compatibility", "Type A", "Type B", "Type F" };
|
||||||
#endif
|
#endif
|
||||||
uint16_t i = 9;
|
uint16_t i = 9;
|
||||||
@@ -937,9 +937,9 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size)
|
|||||||
case 0x05: /* DMA */
|
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],
|
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],
|
dma_transfer[card->rom[i + 2] & 3],
|
||||||
(card->rom[i + 2] & 0x04) ? "not " : "",
|
(card->rom[i + 2] & 0x04) ? "" : "not ",
|
||||||
(card->rom[i + 2] & 0x08) ? "not " : "",
|
(card->rom[i + 2] & 0x08) ? "" : "not ",
|
||||||
(card->rom[i + 2] & 0x10) ? "not " : "",
|
(card->rom[i + 2] & 0x10) ? "" : "not ",
|
||||||
dma_speed[(card->rom[i + 2] >> 5) & 3]);
|
dma_speed[(card->rom[i + 2] >> 5) & 3]);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@@ -1004,6 +1004,29 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size)
|
|||||||
|
|
||||||
break;
|
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 */
|
case 0x0f: /* end tag */
|
||||||
/* Calculate checksum. */
|
/* Calculate checksum. */
|
||||||
res = 0x00;
|
res = 0x00;
|
||||||
|
Reference in New Issue
Block a user