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