Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c488dbba authored by Michel Thierry's avatar Michel Thierry Committed by Daniel Vetter
Browse files

drm/i915: Extract PPGTT param from page_directory alloc



This will be useful for when we move to 48b addressing, and the PDP isn't
the root of the page table structure.

v2: Rebase after changes for Gen8+ systems with less than 4GB of memory.
v3: Rebase after Mika's code review.

Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
Signed-off-by: Michel Thierry <michel.thierry@intel.com> (v2)
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 09942c65
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -716,12 +716,11 @@ static int gen8_ppgtt_alloc_pagetabs(struct i915_page_directory *pd,
	return -ENOMEM;
}

static int gen8_ppgtt_alloc_page_directories(struct i915_page_directory_pointer *pdp,
static int gen8_ppgtt_alloc_page_directories(struct i915_hw_ppgtt *ppgtt,
				     struct i915_page_directory_pointer *pdp,
				     uint64_t start,
				     uint64_t length)
{
	struct i915_hw_ppgtt *ppgtt =
		container_of(pdp, struct i915_hw_ppgtt, pdp);
	struct i915_page_directory *unused;
	uint64_t temp;
	uint32_t pdpe;
@@ -732,7 +731,7 @@ static int gen8_ppgtt_alloc_page_directories(struct i915_page_directory_pointer
	gen8_for_each_pdpe(unused, pdp, start, length, temp, pdpe) {
		WARN_ON(unused);
		pdp->page_directory[pdpe] = alloc_pd_single();
		if (IS_ERR(ppgtt->pdp.page_directory[pdpe]))
		if (IS_ERR(pdp->page_directory[pdpe]))
			goto unwind_out;

		gen8_initialize_pd(&ppgtt->base,
@@ -743,8 +742,8 @@ static int gen8_ppgtt_alloc_page_directories(struct i915_page_directory_pointer
	 * 4GB of memory. This won't be needed after a subsequent patch.
	 */
	while (pdpe < GEN8_LEGACY_PDPES) {
		ppgtt->pdp.page_directory[pdpe] = alloc_pd_single();
		if (IS_ERR(ppgtt->pdp.page_directory[pdpe]))
		pdp->page_directory[pdpe] = alloc_pd_single();
		if (IS_ERR(pdp->page_directory[pdpe]))
			goto unwind_out;

		gen8_initialize_pd(&ppgtt->base,
@@ -756,7 +755,7 @@ static int gen8_ppgtt_alloc_page_directories(struct i915_page_directory_pointer

unwind_out:
	while (pdpe--)
		unmap_and_free_pd(ppgtt->pdp.page_directory[pdpe]);
		unmap_and_free_pd(pdp->page_directory[pdpe]);

	return -ENOMEM;
}
@@ -770,7 +769,7 @@ static int gen8_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt,
	uint32_t pdpe;
	int ret;

	ret = gen8_ppgtt_alloc_page_directories(&ppgtt->pdp, start, length);
	ret = gen8_ppgtt_alloc_page_directories(ppgtt, &ppgtt->pdp, start, length);
	if (ret)
		return ret;