isa: implement isa_is_ioport_assigned via memory_region_find

Open-code isa_is_ioport_assigned via a memory region lookup. As all IO
ports are now directly or indirectly registered via the memory API, this
becomes possible and will finally allow us to drop the ioport tables.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Jan Kiszka 2013-06-22 08:07:01 +02:00 committed by Paolo Bonzini
parent 8ab9b41876
commit b6f3296292
4 changed files with 10 additions and 16 deletions

View File

@ -383,14 +383,15 @@ static void piix4_pm_powerdown_req(Notifier *n, void *opaque)
static void piix4_pm_machine_ready(Notifier *n, void *opaque) static void piix4_pm_machine_ready(Notifier *n, void *opaque)
{ {
PIIX4PMState *s = container_of(n, PIIX4PMState, machine_ready); PIIX4PMState *s = container_of(n, PIIX4PMState, machine_ready);
MemoryRegion *io_as = pci_address_space_io(&s->dev);
uint8_t *pci_conf; uint8_t *pci_conf;
pci_conf = s->dev.config; pci_conf = s->dev.config;
pci_conf[0x5f] = (isa_is_ioport_assigned(0x378) ? 0x80 : 0) | 0x10; pci_conf[0x5f] = 0x10 |
(memory_region_find(io_as, 0x378, 1).mr ? 0x80 : 0);
pci_conf[0x63] = 0x60; pci_conf[0x63] = 0x60;
pci_conf[0x67] = (isa_is_ioport_assigned(0x3f8) ? 0x08 : 0) | pci_conf[0x67] = (memory_region_find(io_as, 0x3f8, 1).mr ? 0x08 : 0) |
(isa_is_ioport_assigned(0x2f8) ? 0x90 : 0); (memory_region_find(io_as, 0x2f8, 1).mr ? 0x90 : 0);
} }
static int piix4_pm_initfn(PCIDevice *dev) static int piix4_pm_initfn(PCIDevice *dev)

View File

@ -477,22 +477,23 @@ static const MemoryRegionOps rbca_mmio_ops = {
static void ich9_lpc_machine_ready(Notifier *n, void *opaque) static void ich9_lpc_machine_ready(Notifier *n, void *opaque)
{ {
ICH9LPCState *s = container_of(n, ICH9LPCState, machine_ready); ICH9LPCState *s = container_of(n, ICH9LPCState, machine_ready);
MemoryRegion *io_as = pci_address_space_io(&s->d);
uint8_t *pci_conf; uint8_t *pci_conf;
pci_conf = s->d.config; pci_conf = s->d.config;
if (isa_is_ioport_assigned(0x3f8)) { if (memory_region_find(io_as, 0x3f8, 1).mr) {
/* com1 */ /* com1 */
pci_conf[0x82] |= 0x01; pci_conf[0x82] |= 0x01;
} }
if (isa_is_ioport_assigned(0x2f8)) { if (memory_region_find(io_as, 0x2f8, 1).mr) {
/* com2 */ /* com2 */
pci_conf[0x82] |= 0x02; pci_conf[0x82] |= 0x02;
} }
if (isa_is_ioport_assigned(0x378)) { if (memory_region_find(io_as, 0x378, 1).mr) {
/* lpt */ /* lpt */
pci_conf[0x82] |= 0x04; pci_conf[0x82] |= 0x04;
} }
if (isa_is_ioport_assigned(0x3f0)) { if (memory_region_find(io_as, 0x3f0, 1).mr) {
/* floppy */ /* floppy */
pci_conf[0x82] |= 0x08; pci_conf[0x82] |= 0x08;
} }

View File

@ -40,7 +40,6 @@ typedef void (IOPortDestructor)(void *opaque);
void ioport_register(IORange *iorange); void ioport_register(IORange *iorange);
void isa_unassign_ioport(pio_addr_t start, int length); void isa_unassign_ioport(pio_addr_t start, int length);
bool isa_is_ioport_assigned(pio_addr_t start);
void cpu_outb(pio_addr_t addr, uint8_t val); void cpu_outb(pio_addr_t addr, uint8_t val);
void cpu_outw(pio_addr_t addr, uint16_t val); void cpu_outw(pio_addr_t addr, uint16_t val);

View File

@ -273,13 +273,6 @@ void isa_unassign_ioport(pio_addr_t start, int length)
} }
} }
bool isa_is_ioport_assigned(pio_addr_t start)
{
return (ioport_read_table[0][start] || ioport_write_table[0][start] ||
ioport_read_table[1][start] || ioport_write_table[1][start] ||
ioport_read_table[2][start] || ioport_write_table[2][start]);
}
/***********************************************************/ /***********************************************************/
void cpu_outb(pio_addr_t addr, uint8_t val) void cpu_outb(pio_addr_t addr, uint8_t val)