From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LUi57-0002ui-E6 for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:21 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LUi56-0002td-35 for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:20 -0500 Received: from [199.232.76.173] (port=37323 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LUi55-0002tT-Qz for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:19 -0500 Received: from mx2.redhat.com ([66.187.237.31]:34146) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LUi55-0000gd-7B for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:19 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n14DkIq5010766 for ; Wed, 4 Feb 2009 08:46:18 -0500 Message-Id: <20090204133924.314509077@localhost.localdomain> References: <20090204133303.113145633@localhost.localdomain> Date: Wed, 04 Feb 2009 11:33:15 -0200 From: Marcelo Tosatti Content-Disposition: inline; filename=pci-unregister Subject: [Qemu-devel] [patch 12/18] qemu: add pci_unregister_device Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Marcelo Tosatti 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 Index: trunk/hw/pci.c =================================================================== --- trunk.orig/hw/pci.c +++ trunk/hw/pci.c @@ -198,6 +198,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) @@ -220,11 +262,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, --