Skip to content

Commit 06f5b92

Browse files
committed
Merge tag 'drm-intel-fixes-2024-08-08' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-fixes
- correct dual pps handling for MTL_PCH+ [display] (Dnyaneshwar Bhadane) - Adjust vma offset for framebuffer mmap offset [gem] (Andi Shyti) - Fix Virtual Memory mapping boundaries calculation [gem] (Andi Shyti) - Allow evicting to use the requested placement (David Gow) - Attempt to get pages without eviction first (David Gow) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Tvrtko Ursulin <tursulin@igalia.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZrSFpj20b1LbBhCJ@linux
2 parents fe0ce0d + 787db3b commit 06f5b92

File tree

4 files changed

+62
-12
lines changed

4 files changed

+62
-12
lines changed

drivers/gpu/drm/i915/display/intel_backlight.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,6 +1449,9 @@ bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
14491449

14501450
static int cnp_num_backlight_controllers(struct drm_i915_private *i915)
14511451
{
1452+
if (INTEL_PCH_TYPE(i915) >= PCH_MTL)
1453+
return 2;
1454+
14521455
if (INTEL_PCH_TYPE(i915) >= PCH_DG1)
14531456
return 1;
14541457

drivers/gpu/drm/i915/display/intel_pps.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,9 @@ static int intel_num_pps(struct drm_i915_private *i915)
351351
if (IS_GEMINILAKE(i915) || IS_BROXTON(i915))
352352
return 2;
353353

354+
if (INTEL_PCH_TYPE(i915) >= PCH_MTL)
355+
return 2;
356+
354357
if (INTEL_PCH_TYPE(i915) >= PCH_DG1)
355358
return 1;
356359

drivers/gpu/drm/i915/gem/i915_gem_mman.c

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,41 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
290290
return i915_error_to_vmf_fault(err);
291291
}
292292

293+
static void set_address_limits(struct vm_area_struct *area,
294+
struct i915_vma *vma,
295+
unsigned long obj_offset,
296+
unsigned long *start_vaddr,
297+
unsigned long *end_vaddr)
298+
{
299+
unsigned long vm_start, vm_end, vma_size; /* user's memory parameters */
300+
long start, end; /* memory boundaries */
301+
302+
/*
303+
* Let's move into the ">> PAGE_SHIFT"
304+
* domain to be sure not to lose bits
305+
*/
306+
vm_start = area->vm_start >> PAGE_SHIFT;
307+
vm_end = area->vm_end >> PAGE_SHIFT;
308+
vma_size = vma->size >> PAGE_SHIFT;
309+
310+
/*
311+
* Calculate the memory boundaries by considering the offset
312+
* provided by the user during memory mapping and the offset
313+
* provided for the partial mapping.
314+
*/
315+
start = vm_start;
316+
start -= obj_offset;
317+
start += vma->gtt_view.partial.offset;
318+
end = start + vma_size;
319+
320+
start = max_t(long, start, vm_start);
321+
end = min_t(long, end, vm_end);
322+
323+
/* Let's move back into the "<< PAGE_SHIFT" domain */
324+
*start_vaddr = (unsigned long)start << PAGE_SHIFT;
325+
*end_vaddr = (unsigned long)end << PAGE_SHIFT;
326+
}
327+
293328
static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
294329
{
295330
#define MIN_CHUNK_PAGES (SZ_1M >> PAGE_SHIFT)
@@ -302,14 +337,18 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
302337
struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
303338
bool write = area->vm_flags & VM_WRITE;
304339
struct i915_gem_ww_ctx ww;
340+
unsigned long obj_offset;
341+
unsigned long start, end; /* memory boundaries */
305342
intel_wakeref_t wakeref;
306343
struct i915_vma *vma;
307344
pgoff_t page_offset;
345+
unsigned long pfn;
308346
int srcu;
309347
int ret;
310348

311-
/* We don't use vmf->pgoff since that has the fake offset */
349+
obj_offset = area->vm_pgoff - drm_vma_node_start(&mmo->vma_node);
312350
page_offset = (vmf->address - area->vm_start) >> PAGE_SHIFT;
351+
page_offset += obj_offset;
313352

314353
trace_i915_gem_object_fault(obj, page_offset, true, write);
315354

@@ -402,12 +441,14 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
402441
if (ret)
403442
goto err_unpin;
404443

444+
set_address_limits(area, vma, obj_offset, &start, &end);
445+
446+
pfn = (ggtt->gmadr.start + i915_ggtt_offset(vma)) >> PAGE_SHIFT;
447+
pfn += (start - area->vm_start) >> PAGE_SHIFT;
448+
pfn += obj_offset - vma->gtt_view.partial.offset;
449+
405450
/* Finally, remap it using the new GTT offset */
406-
ret = remap_io_mapping(area,
407-
area->vm_start + (vma->gtt_view.partial.offset << PAGE_SHIFT),
408-
(ggtt->gmadr.start + i915_ggtt_offset(vma)) >> PAGE_SHIFT,
409-
min_t(u64, vma->size, area->vm_end - area->vm_start),
410-
&ggtt->iomap);
451+
ret = remap_io_mapping(area, start, pfn, end - start, &ggtt->iomap);
411452
if (ret)
412453
goto err_fence;
413454

@@ -1084,6 +1125,8 @@ int i915_gem_fb_mmap(struct drm_i915_gem_object *obj, struct vm_area_struct *vma
10841125
mmo = mmap_offset_attach(obj, mmap_type, NULL);
10851126
if (IS_ERR(mmo))
10861127
return PTR_ERR(mmo);
1128+
1129+
vma->vm_pgoff += drm_vma_node_start(&mmo->vma_node);
10871130
}
10881131

10891132
/*

drivers/gpu/drm/i915/gem/i915_gem_ttm.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ i915_ttm_placement_from_obj(const struct drm_i915_gem_object *obj,
165165
i915_ttm_place_from_region(num_allowed ? obj->mm.placements[0] :
166166
obj->mm.region, &places[0], obj->bo_offset,
167167
obj->base.size, flags);
168-
places[0].flags |= TTM_PL_FLAG_DESIRED;
169168

170169
/* Cache this on object? */
171170
for (i = 0; i < num_allowed; ++i) {
@@ -779,13 +778,16 @@ static int __i915_ttm_get_pages(struct drm_i915_gem_object *obj,
779778
.interruptible = true,
780779
.no_wait_gpu = false,
781780
};
782-
int real_num_busy;
781+
struct ttm_placement initial_placement;
782+
struct ttm_place initial_place;
783783
int ret;
784784

785785
/* First try only the requested placement. No eviction. */
786-
real_num_busy = placement->num_placement;
787-
placement->num_placement = 1;
788-
ret = ttm_bo_validate(bo, placement, &ctx);
786+
initial_placement.num_placement = 1;
787+
memcpy(&initial_place, placement->placement, sizeof(struct ttm_place));
788+
initial_place.flags |= TTM_PL_FLAG_DESIRED;
789+
initial_placement.placement = &initial_place;
790+
ret = ttm_bo_validate(bo, &initial_placement, &ctx);
789791
if (ret) {
790792
ret = i915_ttm_err_to_gem(ret);
791793
/*
@@ -800,7 +802,6 @@ static int __i915_ttm_get_pages(struct drm_i915_gem_object *obj,
800802
* If the initial attempt fails, allow all accepted placements,
801803
* evicting if necessary.
802804
*/
803-
placement->num_placement = real_num_busy;
804805
ret = ttm_bo_validate(bo, placement, &ctx);
805806
if (ret)
806807
return i915_ttm_err_to_gem(ret);

0 commit comments

Comments
 (0)