drm/i915/bdw: Split up PPGTT cleanup
This will make the code more readable, and extensible which is needed for upcoming feature work. Eventually, we'll do the same for init. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
822cdc5293
commit
b45a67157a
|
@ -319,36 +319,53 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm,
|
||||||
kunmap_atomic(pt_vaddr);
|
kunmap_atomic(pt_vaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen8_ppgtt_free(struct i915_hw_ppgtt *ppgtt)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ppgtt->num_pd_pages ; i++)
|
||||||
|
kfree(ppgtt->gen8_pt_dma_addr[i]);
|
||||||
|
|
||||||
|
__free_pages(ppgtt->gen8_pt_pages, get_order(ppgtt->num_pt_pages << PAGE_SHIFT));
|
||||||
|
__free_pages(ppgtt->pd_pages, get_order(ppgtt->num_pd_pages << PAGE_SHIFT));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gen8_ppgtt_unmap_pages(struct i915_hw_ppgtt *ppgtt)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < ppgtt->num_pd_pages; i++) {
|
||||||
|
/* TODO: In the future we'll support sparse mappings, so this
|
||||||
|
* will have to change. */
|
||||||
|
if (!ppgtt->pd_dma_addr[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_unmap_page(ppgtt->base.dev->pdev,
|
||||||
|
ppgtt->pd_dma_addr[i],
|
||||||
|
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
for (j = 0; j < GEN8_PDES_PER_PAGE; j++) {
|
||||||
|
dma_addr_t addr = ppgtt->gen8_pt_dma_addr[i][j];
|
||||||
|
if (addr)
|
||||||
|
pci_unmap_page(ppgtt->base.dev->pdev,
|
||||||
|
addr,
|
||||||
|
PAGE_SIZE,
|
||||||
|
PCI_DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
|
static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
|
||||||
{
|
{
|
||||||
struct i915_hw_ppgtt *ppgtt =
|
struct i915_hw_ppgtt *ppgtt =
|
||||||
container_of(vm, struct i915_hw_ppgtt, base);
|
container_of(vm, struct i915_hw_ppgtt, base);
|
||||||
int i, j;
|
|
||||||
|
|
||||||
list_del(&vm->global_link);
|
list_del(&vm->global_link);
|
||||||
drm_mm_takedown(&vm->mm);
|
drm_mm_takedown(&vm->mm);
|
||||||
|
|
||||||
for (i = 0; i < ppgtt->num_pd_pages ; i++) {
|
gen8_ppgtt_unmap_pages(ppgtt);
|
||||||
if (ppgtt->pd_dma_addr[i]) {
|
gen8_ppgtt_free(ppgtt);
|
||||||
pci_unmap_page(ppgtt->base.dev->pdev,
|
|
||||||
ppgtt->pd_dma_addr[i],
|
|
||||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
|
||||||
|
|
||||||
for (j = 0; j < GEN8_PDES_PER_PAGE; j++) {
|
|
||||||
dma_addr_t addr = ppgtt->gen8_pt_dma_addr[i][j];
|
|
||||||
if (addr)
|
|
||||||
pci_unmap_page(ppgtt->base.dev->pdev,
|
|
||||||
addr,
|
|
||||||
PAGE_SIZE,
|
|
||||||
PCI_DMA_BIDIRECTIONAL);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kfree(ppgtt->gen8_pt_dma_addr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
__free_pages(ppgtt->gen8_pt_pages, get_order(ppgtt->num_pt_pages << PAGE_SHIFT));
|
|
||||||
__free_pages(ppgtt->pd_pages, get_order(ppgtt->num_pd_pages << PAGE_SHIFT));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue