From patchwork Tue Mar 18 05:48:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 3847531 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 8B6859F334 for ; Tue, 18 Mar 2014 05:49:32 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A0A1F2026F for ; Tue, 18 Mar 2014 05:49:31 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 9FD702015D for ; Tue, 18 Mar 2014 05:49:30 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 008C72B115; Mon, 17 Mar 2014 22:49:30 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id B7A0C2B0E5 for ; Mon, 17 Mar 2014 22:49:11 -0700 (PDT) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 17 Mar 2014 22:49:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,675,1389772800"; d="scan'208";a="474655781" Received: from unknown (HELO ironside.amr.corp.intel.com) ([10.255.13.186]) by orsmga001.jf.intel.com with ESMTP; 17 Mar 2014 22:49:10 -0700 From: Ben Widawsky To: Intel GFX Date: Mon, 17 Mar 2014 22:48:50 -0700 Message-Id: <1395121738-29126-19-git-send-email-benjamin.widawsky@intel.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395121738-29126-1-git-send-email-benjamin.widawsky@intel.com> References: <1395121738-29126-1-git-send-email-benjamin.widawsky@intel.com> Subject: [Intel-gfx] [PATCH 18/26] drm/i915: Always dma map page table allocations X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP There is never a case where we don't want to do it. Since we've broken up the allocations into nice clean helper functions, it's both easy and obvious to do the dma mapping at the same time. Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/i915_gem_gtt.c | 78 ++++++++----------------------------- 1 file changed, 17 insertions(+), 61 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 92e03dd..9630109 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -187,20 +187,6 @@ static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr, pci_unmap_page((dev)->pdev, (pt)->daddr, 4096, PCI_DMA_BIDIRECTIONAL); \ } while (0); - -static void dma_unmap_pt_range(struct i915_pagedir *pd, - unsigned pde, size_t n, - struct drm_device *dev) -{ - if (WARN_ON(pde + n > I915_PDES_PER_PD)) - n = I915_PDES_PER_PD - pde; - - n += pde; - - for (; pde < n; pde++) - dma_unmap_pt_single(pd->page_tables[pde], dev); -} - /** * dma_map_pt_single() - Create a dma mapping for a page table * @pt: Page table to get a DMA map for @@ -230,33 +216,12 @@ static int dma_map_pt_single(struct i915_pagetab *pt, struct drm_device *dev) return 0; } -static int dma_map_pt_range(struct i915_pagedir *pd, - unsigned pde, size_t n, - struct drm_device *dev) -{ - const int first = pde; - - if (WARN_ON(pde + n > I915_PDES_PER_PD)) - n = I915_PDES_PER_PD - pde; - - n += pde; - - for (; pde < n; pde++) { - int ret; - ret = dma_map_pt_single(pd->page_tables[pde], dev); - if (ret) { - dma_unmap_pt_range(pd, first, pde, dev); - return ret; - } - } - - return 0; -} - -static void free_pt_single(struct i915_pagetab *pt) +static void free_pt_single(struct i915_pagetab *pt, struct drm_device *dev) { if (WARN_ON(!pt->page)) return; + + dma_unmap_pt_single(pt, dev); __free_page(pt->page); kfree(pt); } @@ -264,6 +229,7 @@ static void free_pt_single(struct i915_pagetab *pt) static struct i915_pagetab *alloc_pt_single(struct drm_device *dev) { struct i915_pagetab *pt; + int ret; pt = kzalloc(sizeof(*pt), GFP_KERNEL); if (!pt) @@ -275,6 +241,13 @@ static struct i915_pagetab *alloc_pt_single(struct drm_device *dev) return ERR_PTR(-ENOMEM); } + ret = dma_map_pt_single(pt, dev); + if (ret) { + __free_page(pt->page); + kfree(pt); + return ERR_PTR(ret); + } + return pt; } @@ -318,7 +291,7 @@ static int alloc_pt_range(struct i915_pagedir *pd, uint16_t pde, size_t count, err_out: while (i--) - free_pt_single(pd->page_tables[i]); + free_pt_single(pd->page_tables[i], dev); return ret; } @@ -486,7 +459,7 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm, kunmap_atomic(pt_vaddr); } -static void gen8_free_page_tables(struct i915_pagedir *pd) +static void gen8_free_page_tables(struct i915_pagedir *pd, struct drm_device *dev) { int i; @@ -494,7 +467,7 @@ static void gen8_free_page_tables(struct i915_pagedir *pd) return; for (i = 0; i < I915_PDES_PER_PD; i++) { - free_pt_single(pd->page_tables[i]); + free_pt_single(pd->page_tables[i], dev); pd->page_tables[i] = NULL; } } @@ -504,7 +477,7 @@ static void gen8_ppgtt_free(struct i915_hw_ppgtt *ppgtt) int i; for (i = 0; i < ppgtt->num_pd_pages; i++) { - gen8_free_page_tables(ppgtt->pdp.pagedir[i]); + gen8_free_page_tables(ppgtt->pdp.pagedir[i], ppgtt->base.dev); free_pd_single(ppgtt->pdp.pagedir[i]); } } @@ -561,7 +534,7 @@ static int gen8_ppgtt_allocate_page_tables(struct i915_hw_ppgtt *ppgtt) unwind_out: while (i--) - gen8_free_page_tables(ppgtt->pdp.pagedir[i]); + gen8_free_page_tables(ppgtt->pdp.pagedir[i], ppgtt->base.dev); return -ENOMEM; } @@ -659,18 +632,9 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) * 2. Create DMA mappings for the page directories and page tables. */ for (i = 0; i < max_pdp; i++) { - struct i915_pagedir *pd; ret = gen8_ppgtt_setup_page_directories(ppgtt, i); if (ret) goto bail; - - pd = ppgtt->pdp.pagedir[i]; - - for (j = 0; j < I915_PDES_PER_PD; j++) { - ret = dma_map_pt_single(pd->page_tables[j], ppgtt->base.dev); - if (ret) - goto bail; - } } /* @@ -1088,7 +1052,7 @@ static void gen6_ppgtt_free(struct i915_hw_ppgtt *ppgtt) int i; for (i = 0; i < ppgtt->num_pd_entries; i++) - free_pt_single(ppgtt->pd.page_tables[i]); + free_pt_single(ppgtt->pd.page_tables[i], ppgtt->base.dev); free_pd_single(&ppgtt->pd); } @@ -1102,7 +1066,6 @@ static void gen6_ppgtt_cleanup(struct i915_address_space *vm) drm_mm_takedown(&ppgtt->base.mm); drm_mm_remove_node(&ppgtt->node); - dma_unmap_pt_range(&ppgtt->pd, 0, ppgtt->num_pd_entries, vm->dev); gen6_ppgtt_free(ppgtt); } @@ -1189,13 +1152,6 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt) if (ret) return ret; - ret = dma_map_pt_range(&ppgtt->pd, 0, ppgtt->num_pd_entries, - ppgtt->base.dev); - if (ret) { - gen6_ppgtt_free(ppgtt); - return ret; - } - ppgtt->base.clear_range = gen6_ppgtt_clear_range; ppgtt->base.insert_entries = gen6_ppgtt_insert_entries; ppgtt->base.cleanup = gen6_ppgtt_cleanup;