Revision 5851e08c hw/pci.c

b/hw/pci.c
196 196
    return pci_dev;
197 197
}
198 198

  
199
static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr)
200
{
201
    return addr + pci_mem_base;
202
}
203

  
204
static void pci_unregister_io_regions(PCIDevice *pci_dev)
205
{
206
    PCIIORegion *r;
207
    int i;
208

  
209
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
210
        r = &pci_dev->io_regions[i];
211
        if (!r->size || r->addr == -1)
212
            continue;
213
        if (r->type == PCI_ADDRESS_SPACE_IO) {
214
            isa_unassign_ioport(r->addr, r->size);
215
        } else {
216
            cpu_register_physical_memory(pci_to_cpu_addr(r->addr),
217
                                                     r->size,
218
                                                     IO_MEM_UNASSIGNED);
219
        }
220
    }
221
}
222

  
223
int pci_unregister_device(PCIDevice *pci_dev)
224
{
225
    int ret = 0;
226

  
227
    if (pci_dev->unregister)
228
        ret = pci_dev->unregister(pci_dev);
229
    if (ret)
230
        return ret;
231

  
232
    pci_unregister_io_regions(pci_dev);
233

  
234
    qemu_free_irqs(pci_dev->irq);
235
    pci_irq_index--;
236
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
237
    qemu_free(pci_dev);
238
    return 0;
239
}
240

  
199 241
void pci_register_io_region(PCIDevice *pci_dev, int region_num,
200 242
                            uint32_t size, int type,
201 243
                            PCIMapIORegionFunc *map_func)
......
218 260
    *(uint32_t *)(pci_dev->config + addr) = cpu_to_le32(type);
219 261
}
220 262

  
221
static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr)
222
{
223
    return addr + pci_mem_base;
224
}
225

  
226 263
static void pci_update_mappings(PCIDevice *d)
227 264
{
228 265
    PCIIORegion *r;

Also available in: Unified diff