[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [patch 12/19] qemu: add pci_unregister_device
From: |
Marcelo Tosatti |
Subject: |
[Qemu-devel] [patch 12/19] qemu: add pci_unregister_device |
Date: |
Tue, 10 Feb 2009 18:31:03 -0200 |
User-agent: |
quilt/0.46-1 |
Unregister the pci device, unassign its IO and memory regions, and free
associated data.
Add a callback so drivers can free device state.
Signed-off-by: Marcelo Tosatti <address@hidden>
Index: trunk/hw/pci.c
===================================================================
--- trunk.orig/hw/pci.c
+++ trunk/hw/pci.c
@@ -196,6 +196,48 @@ PCIDevice *pci_register_device(PCIBus *b
return pci_dev;
}
+static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr)
+{
+ return addr + pci_mem_base;
+}
+
+static void pci_unregister_io_regions(PCIDevice *pci_dev)
+{
+ PCIIORegion *r;
+ int i;
+
+ for(i = 0; i < PCI_NUM_REGIONS; i++) {
+ r = &pci_dev->io_regions[i];
+ if (!r->size || r->addr == -1)
+ continue;
+ if (r->type == PCI_ADDRESS_SPACE_IO) {
+ isa_unassign_ioport(r->addr, r->size);
+ } else {
+ cpu_register_physical_memory(pci_to_cpu_addr(r->addr),
+ r->size,
+ IO_MEM_UNASSIGNED);
+ }
+ }
+}
+
+int pci_unregister_device(PCIDevice *pci_dev)
+{
+ int ret = 0;
+
+ if (pci_dev->unregister)
+ ret = pci_dev->unregister(pci_dev);
+ if (ret)
+ return ret;
+
+ pci_unregister_io_regions(pci_dev);
+
+ qemu_free_irqs(pci_dev->irq);
+ pci_irq_index--;
+ pci_dev->bus->devices[pci_dev->devfn] = NULL;
+ qemu_free(pci_dev);
+ return 0;
+}
+
void pci_register_io_region(PCIDevice *pci_dev, int region_num,
uint32_t size, int type,
PCIMapIORegionFunc *map_func)
@@ -218,11 +260,6 @@ void pci_register_io_region(PCIDevice *p
*(uint32_t *)(pci_dev->config + addr) = cpu_to_le32(type);
}
-static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr)
-{
- return addr + pci_mem_base;
-}
-
static void pci_update_mappings(PCIDevice *d)
{
PCIIORegion *r;
Index: trunk/hw/pci.h
===================================================================
--- trunk.orig/hw/pci.h
+++ trunk/hw/pci.h
@@ -125,6 +125,7 @@ typedef uint32_t PCIConfigReadFunc(PCIDe
uint32_t address, int len);
typedef void PCIMapIORegionFunc(PCIDevice *pci_dev, int region_num,
uint32_t addr, uint32_t size, int type);
+typedef int PCIUnregisterFunc(PCIDevice *pci_dev);
#define PCI_ADDRESS_SPACE_MEM 0x00
#define PCI_ADDRESS_SPACE_IO 0x01
@@ -189,6 +190,7 @@ struct PCIDevice {
/* do not access the following fields */
PCIConfigReadFunc *config_read;
PCIConfigWriteFunc *config_write;
+ PCIUnregisterFunc *unregister;
/* ??? This is a PC-specific hack, and should be removed. */
int irq_index;
@@ -203,6 +205,7 @@ PCIDevice *pci_register_device(PCIBus *b
int instance_size, int devfn,
PCIConfigReadFunc *config_read,
PCIConfigWriteFunc *config_write);
+int pci_unregister_device(PCIDevice *pci_dev);
void pci_register_io_region(PCIDevice *pci_dev, int region_num,
uint32_t size, int type,
--
- [Qemu-devel] [patch 03/19] qemu: dynamic drive/drive_opt index allocation, (continued)
- [Qemu-devel] [patch 03/19] qemu: dynamic drive/drive_opt index allocation, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 01/19] qemu: add pci helper functions, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 04/19] qemu: dynamic nic info index allocation, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 05/19] qemu: drive removal support, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 06/19] qemu: record devfn on block driver instance, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 07/19] qemu: move drives_opt for external use, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 09/19] qemu: add net_client_uninit / qemu_find_vlan_client, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 08/19] qemu: net/drive add/remove tweaks, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 10/19] qemu: add cpu_unregister_io_memory and make io mem table index dynamic, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 11/19] qemu: add qemu_free_irqs, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 12/19] qemu: add pci_unregister_device,
Marcelo Tosatti <=
- [Qemu-devel] [patch 13/19] qemu: warn if PCI region is not power of two, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 14/19] qemu: LSI SCSI and e1000 unregister callbacks, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 16/19] qemu: initialize hot add system / acpi gpe, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 15/19] qemu: zero ioport_opaque on isa_unassign_ioport, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 18/19] From: Markus Armbruster <address@hidden>, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 17/19] qemu: pci hotplug GPE support, Marcelo Tosatti, 2009/02/10
- [Qemu-devel] [patch 19/19] qemu: PCI device, disk and host network hot-add / hot-remove, Marcelo Tosatti, 2009/02/10