From: Imre Deak <imre.deak@intel.com>
To: Ben Widawsky <benjamin.widawsky@intel.com>
Cc: Intel GFX <intel-gfx@lists.freedesktop.org>,
Ben Widawsky <ben@bwidawsk.net>
Subject: Re: [PATCH 3/9] drm/i915/bdw: Split ppgtt initialization up
Date: Thu, 20 Feb 2014 15:10:58 +0200 [thread overview]
Message-ID: <1392901858.14149.4.camel@intelbox> (raw)
In-Reply-To: <1392876349-24684-4-git-send-email-benjamin.widawsky@intel.com>
[-- Attachment #1.1: Type: text/plain, Size: 7785 bytes --]
On Wed, 2014-02-19 at 22:05 -0800, Ben Widawsky wrote:
> Like cleanup in an earlier patch, the code becomes much more readable,
> and easier to extend if we extract out helper functions for the various
> stages of init.
>
> Note that with this patch it becomes really simple, and tempting to begin
> using the 'goto out' idiom with explicit free/fini semantics. I've
> kept the error path as similar as possible to the cleanup() function to
> make sure cleanup is as robust as possible
>
> v2: Remove comment "NB:From here on, ppgtt->base.cleanup() should
> function properly"
> Update commit message to reflect above
>
> v3: Rebased on top of bugfixes found in the previous patch by Imre
> Moved number of pd pages assertion to the proper place (Imre)
>
> v4:
> Allocate dma address space for num_pd_pages, not num_pd_entries (Ben)
> Don't use gen8_pt_dma_addr after free on error path (Imre)
> With new fix from v4 of the previous patch.
>
> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Looks ok to me:
Reviewed-by: Imre Deak <imre.deak@intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem_gtt.c | 164 +++++++++++++++++++++++++-----------
> 1 file changed, 116 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 7956659..0af3587 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -366,6 +366,113 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
> gen8_ppgtt_free(ppgtt);
> }
>
> +static int gen8_ppgtt_allocate_page_tables(struct i915_hw_ppgtt *ppgtt,
> + const int max_pdp)
> +{
> + struct page *pt_pages;
> + const int num_pt_pages = GEN8_PDES_PER_PAGE * max_pdp;
> +
> + pt_pages = alloc_pages(GFP_KERNEL, get_order(num_pt_pages << PAGE_SHIFT));
> + if (!pt_pages)
> + return -ENOMEM;
> +
> + ppgtt->gen8_pt_pages = pt_pages;
> + ppgtt->num_pt_pages = 1 << get_order(num_pt_pages << PAGE_SHIFT);
> +
> + return 0;
> +}
> +
> +static int gen8_ppgtt_allocate_dma(struct i915_hw_ppgtt *ppgtt)
> +{
> + int i;
> +
> + for (i = 0; i < ppgtt->num_pd_pages; i++) {
> + ppgtt->gen8_pt_dma_addr[i] = kcalloc(GEN8_PDES_PER_PAGE,
> + sizeof(dma_addr_t),
> + GFP_KERNEL);
> + if (!ppgtt->gen8_pt_dma_addr[i])
> + return -ENOMEM;
> + }
> +
> + return 0;
> +}
> +
> +static int gen8_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt,
> + const int max_pdp)
> +{
> + ppgtt->pd_pages = alloc_pages(GFP_KERNEL, get_order(max_pdp << PAGE_SHIFT));
> + if (!ppgtt->pd_pages)
> + return -ENOMEM;
> +
> + ppgtt->num_pd_pages = 1 << get_order(max_pdp << PAGE_SHIFT);
> + BUG_ON(ppgtt->num_pd_pages > GEN8_LEGACY_PDPS);
> +
> + return 0;
> +}
> +
> +static int gen8_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt,
> + const int max_pdp)
> +{
> + int ret;
> +
> + ret = gen8_ppgtt_allocate_page_directories(ppgtt, max_pdp);
> + if (ret)
> + return ret;
> +
> + ret = gen8_ppgtt_allocate_page_tables(ppgtt, max_pdp);
> + if (ret) {
> + __free_pages(ppgtt->pd_pages, get_order(max_pdp << PAGE_SHIFT));
> + return ret;
> + }
> +
> + ppgtt->num_pd_entries = max_pdp * GEN8_PDES_PER_PAGE;
> +
> + ret = gen8_ppgtt_allocate_dma(ppgtt);
> + if (ret)
> + gen8_ppgtt_free(ppgtt);
> +
> + return ret;
> +}
> +
> +static int gen8_ppgtt_setup_page_directories(struct i915_hw_ppgtt *ppgtt,
> + const int pd)
> +{
> + dma_addr_t pd_addr;
> + int ret;
> +
> + pd_addr = pci_map_page(ppgtt->base.dev->pdev,
> + &ppgtt->pd_pages[pd], 0,
> + PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
> +
> + ret = pci_dma_mapping_error(ppgtt->base.dev->pdev, pd_addr);
> + if (ret)
> + return ret;
> +
> + ppgtt->pd_dma_addr[pd] = pd_addr;
> +
> + return 0;
> +}
> +
> +static int gen8_ppgtt_setup_page_tables(struct i915_hw_ppgtt *ppgtt,
> + const int pd,
> + const int pt)
> +{
> + dma_addr_t pt_addr;
> + struct page *p;
> + int ret;
> +
> + p = &ppgtt->gen8_pt_pages[pd * GEN8_PDES_PER_PAGE + pt];
> + pt_addr = pci_map_page(ppgtt->base.dev->pdev,
> + p, 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
> + ret = pci_dma_mapping_error(ppgtt->base.dev->pdev, pt_addr);
> + if (ret)
> + return ret;
> +
> + ppgtt->gen8_pt_dma_addr[pd][pt] = pt_addr;
> +
> + return 0;
> +}
> +
> /**
> * GEN8 legacy ppgtt programming is accomplished through a max 4 PDP registers
> * with a net effect resembling a 2-level page table in normal x86 terms. Each
> @@ -378,69 +485,30 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
> */
> static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size)
> {
> - struct page *pt_pages;
> const int max_pdp = DIV_ROUND_UP(size, 1 << 30);
> - const int num_pt_pages = GEN8_PDES_PER_PAGE * max_pdp;
> - struct pci_dev *hwdev = ppgtt->base.dev->pdev;
> + const int min_pt_pages = GEN8_PDES_PER_PAGE * max_pdp;
> int i, j, ret;
>
> if (size % (1<<30))
> DRM_INFO("Pages will be wasted unless GTT size (%llu) is divisible by 1GB\n", size);
>
> - /* 1. Do all our allocations for page directories and page tables */
> - ppgtt->pd_pages = alloc_pages(GFP_KERNEL, get_order(max_pdp << PAGE_SHIFT));
> - if (!ppgtt->pd_pages)
> - return -ENOMEM;
> -
> - pt_pages = alloc_pages(GFP_KERNEL, get_order(num_pt_pages << PAGE_SHIFT));
> - if (!pt_pages) {
> - __free_pages(ppgtt->pd_pages, get_order(max_pdp << PAGE_SHIFT));
> - return -ENOMEM;
> - }
> -
> - ppgtt->gen8_pt_pages = pt_pages;
> - ppgtt->num_pd_pages = 1 << get_order(max_pdp << PAGE_SHIFT);
> - ppgtt->num_pt_pages = 1 << get_order(num_pt_pages << PAGE_SHIFT);
> - ppgtt->num_pd_entries = max_pdp * GEN8_PDES_PER_PAGE;
> - BUG_ON(ppgtt->num_pd_pages > GEN8_LEGACY_PDPS);
> -
> - for (i = 0; i < max_pdp; i++) {
> - ppgtt->gen8_pt_dma_addr[i] = kcalloc(GEN8_PDES_PER_PAGE,
> - sizeof(dma_addr_t),
> - GFP_KERNEL);
> - if (!ppgtt->gen8_pt_dma_addr[i]) {
> - ret = -ENOMEM;
> - goto bail;
> - }
> - }
> + /* 1. Do all our allocations for page directories and page tables. */
> + ret = gen8_ppgtt_alloc(ppgtt, max_pdp);
> + if (ret)
> + return ret;
>
> /*
> - * 2. Create all the DMA mappings for the page directories and page
> - * tables
> + * 2. Create DMA mappings for the page directories and page tables.
> */
> for (i = 0; i < max_pdp; i++) {
> - dma_addr_t pd_addr, pt_addr;
> -
> - /* Get the page directory mappings */
> - pd_addr = pci_map_page(hwdev, &ppgtt->pd_pages[i], 0,
> - PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
> - ret = pci_dma_mapping_error(ppgtt->base.dev->pdev, pd_addr);
> + ret = gen8_ppgtt_setup_page_directories(ppgtt, i);
> if (ret)
> goto bail;
>
> - ppgtt->pd_dma_addr[i] = pd_addr;
> -
> - /* And the page table mappings per page directory */
> for (j = 0; j < GEN8_PDES_PER_PAGE; j++) {
> - struct page *p = &pt_pages[i * GEN8_PDES_PER_PAGE + j];
> -
> - pt_addr = pci_map_page(hwdev, p, 0, PAGE_SIZE,
> - PCI_DMA_BIDIRECTIONAL);
> - ret = pci_dma_mapping_error(hwdev, pt_addr);
> + ret = gen8_ppgtt_setup_page_tables(ppgtt, i, j);
> if (ret)
> goto bail;
> -
> - ppgtt->gen8_pt_dma_addr[i][j] = pt_addr;
> }
> }
>
> @@ -479,7 +547,7 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size)
> ppgtt->num_pd_pages, ppgtt->num_pd_pages - max_pdp);
> DRM_DEBUG_DRIVER("Allocated %d pages for page tables (%lld wasted)\n",
> ppgtt->num_pt_pages,
> - (ppgtt->num_pt_pages - num_pt_pages) +
> + (ppgtt->num_pt_pages - min_pt_pages) +
> size % (1<<30));
> return 0;
>
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 490 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2014-02-20 13:11 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <to=1387921357-22942-1-git-send-email-benjamin.widawsky@intel.com>
2014-02-12 22:28 ` [PATCH 0/9] [REPOST] BDW 4G GGTT + PPGTT cleanups Ben Widawsky
2014-02-12 22:28 ` [PATCH 1/9] drm/i915/bdw: Split up PPGTT cleanup Ben Widawsky
2014-02-13 10:40 ` Chris Wilson
2014-02-12 22:28 ` [PATCH 2/9] drm/i915/bdw: Reorganize PPGTT init Ben Widawsky
2014-02-19 14:59 ` Imre Deak
2014-02-19 20:06 ` [PATCH] [v3] " Ben Widawsky
2014-02-19 21:00 ` Imre Deak
2014-02-19 21:18 ` Ben Widawsky
2014-02-12 22:28 ` [PATCH 3/9] drm/i915/bdw: Split ppgtt initialization up Ben Widawsky
2014-02-19 17:03 ` Imre Deak
2014-02-12 22:28 ` [PATCH 4/9] drm/i915: Make clear/insert vfuncs args absolute Ben Widawsky
2014-02-13 0:14 ` Chris Wilson
2014-02-13 0:34 ` Ben Widawsky
2014-02-19 17:26 ` Imre Deak
2014-02-12 22:28 ` [PATCH 5/9] drm/i915/bdw: Reorganize PT allocations Ben Widawsky
2014-02-12 23:45 ` Chris Wilson
2014-02-12 23:52 ` Ben Widawsky
2014-02-19 19:11 ` Imre Deak
2014-02-19 19:25 ` Imre Deak
2014-02-19 21:06 ` Ben Widawsky
2014-02-19 21:20 ` Imre Deak
2014-02-19 21:31 ` Ben Widawsky
2014-02-12 22:28 ` [PATCH 6/9] Revert "drm/i915/bdw: Limit GTT to 2GB" Ben Widawsky
2014-02-19 19:14 ` Imre Deak
2014-02-12 22:28 ` [PATCH 7/9] drm/i915: Update i915_gem_gtt.c copyright Ben Widawsky
2014-02-12 23:19 ` Damien Lespiau
2014-02-12 23:22 ` Ben Widawsky
2014-02-19 19:20 ` Imre Deak
2014-02-12 22:28 ` [PATCH 8/9] drm/i915: Split GEN6 PPGTT cleanup Ben Widawsky
2014-02-13 10:29 ` Chris Wilson
2014-02-12 22:28 ` [PATCH 9/9] drm/i915: Split GEN6 PPGTT initialization up Ben Widawsky
2014-02-13 10:33 ` Chris Wilson
2014-02-13 11:47 ` [PATCH 0/9] [REPOST] BDW 4G GGTT + PPGTT cleanups Ville Syrjälä
2014-02-19 17:17 ` Ben Widawsky
2014-02-20 6:05 ` [PATCH 0/9] [v2] " Ben Widawsky
2014-02-21 21:06 ` [PATCH 10/9] drm/i915/bdw: Kill ppgtt->num_pt_pages Ben Widawsky
2014-02-24 17:17 ` Imre Deak
2014-03-04 15:42 ` Daniel Vetter
2014-03-04 14:50 ` [PATCH 0/9] [v2] BDW 4G GGTT + PPGTT cleanups Daniel Vetter
2014-02-20 6:05 ` [PATCH 1/9] drm/i915/bdw: Free PPGTT struct Ben Widawsky
2014-02-20 9:31 ` Imre Deak
2014-02-20 19:47 ` [PATCH .5/9] drm/i915: Move ppgtt_release out of the header Ben Widawsky
2014-02-20 19:47 ` [PATCH 1/9] [v2] drm/i915/bdw: Free PPGTT struct Ben Widawsky
2014-02-24 16:43 ` Imre Deak
2014-02-24 16:18 ` [PATCH .5/9] drm/i915: Move ppgtt_release out of the header Imre Deak
2014-03-04 14:53 ` Daniel Vetter
2014-02-20 6:05 ` [PATCH 2/9] drm/i915/bdw: Reorganize PPGTT init Ben Widawsky
2014-02-20 6:05 ` [PATCH 3/9] drm/i915/bdw: Split ppgtt initialization up Ben Widawsky
2014-02-20 13:10 ` Imre Deak [this message]
2014-02-20 6:05 ` [PATCH 4/9] drm/i915: Make clear/insert vfuncs args absolute Ben Widawsky
2014-02-20 10:37 ` Imre Deak
2014-02-20 19:35 ` Ben Widawsky
2014-02-20 19:50 ` [PATCH 4/9] [v3] " Ben Widawsky
2014-02-24 16:52 ` Imre Deak
2014-02-20 6:05 ` [PATCH 5/9] drm/i915/bdw: Reorganize PT allocations Ben Widawsky
2014-02-20 11:28 ` Imre Deak
2014-02-20 19:51 ` [PATCH 5/9] [v5] " Ben Widawsky
2014-02-24 17:03 ` Imre Deak
2014-02-24 23:38 ` Ben Widawsky
2014-02-20 6:05 ` [PATCH 6/9] Revert "drm/i915/bdw: Limit GTT to 2GB" Ben Widawsky
2014-02-20 6:05 ` [PATCH 7/9] drm/i915: Update i915_gem_gtt.c copyright Ben Widawsky
2014-02-20 6:05 ` [PATCH 8/9] drm/i915: Split GEN6 PPGTT cleanup Ben Widawsky
2014-02-20 6:05 ` [PATCH 9/9] drm/i915: Split GEN6 PPGTT initialization up Ben Widawsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1392901858.14149.4.camel@intelbox \
--to=imre.deak@intel.com \
--cc=ben@bwidawsk.net \
--cc=benjamin.widawsky@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.