From 188080e15f309f0a432d09e95f0d2be9cb2b2279 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 29 Oct 2024 13:36:47 +0100 Subject: [PATCH] intel/display: add i915_gem_evict_for_node When the aperture is close to full or such fragmented, this unimplemented function may be invoked. Fixes #5377 --- repos/dde_linux/patches/i915_ggtt.patch | 28 +++++++++++ repos/dde_linux/ports/linux.hash | 2 +- repos/dde_linux/ports/linux.port | 1 + .../src/driver/framebuffer/intel/pc/dummies.c | 48 +++++++++++++++++++ .../framebuffer/intel/pc/generated_dummies.c | 29 ----------- .../intel/pc/spec/x86_32/source.list | 1 + .../intel/pc/spec/x86_64/source.list | 1 + 7 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 repos/dde_linux/patches/i915_ggtt.patch diff --git a/repos/dde_linux/patches/i915_ggtt.patch b/repos/dde_linux/patches/i915_ggtt.patch new file mode 100644 index 0000000000..17691b5ec2 --- /dev/null +++ b/repos/dde_linux/patches/i915_ggtt.patch @@ -0,0 +1,28 @@ +intel_fb: avoid pagefault, since gt not setup by our port + +--- src/linux/drivers/gpu/drm/i915/i915_gem_evict.c ++++ src/linux/drivers/gpu/drm/i915/i915_gem_evict.c +@@ -187,8 +187,9 @@ + if (i915_is_ggtt(vm)) { + struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); + +- list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) +- intel_gt_retire_requests(gt); ++ if (gt) ++ list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) ++ intel_gt_retire_requests(gt); + } else { + intel_gt_retire_requests(vm->gt); + } +@@ -353,8 +354,9 @@ + struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); + struct intel_gt *gt; + +- list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) +- intel_gt_retire_requests(gt); ++ if (gt) ++ list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) ++ intel_gt_retire_requests(gt); + } else { + intel_gt_retire_requests(vm->gt); + } diff --git a/repos/dde_linux/ports/linux.hash b/repos/dde_linux/ports/linux.hash index e5e5f25405..c86a76eb00 100644 --- a/repos/dde_linux/ports/linux.hash +++ b/repos/dde_linux/ports/linux.hash @@ -1 +1 @@ -501de7d0dc5363c9f271c2cd853b963b2a881438 +5e77186d61fe216b38cf516c5a40babcfdbd50ad diff --git a/repos/dde_linux/ports/linux.port b/repos/dde_linux/ports/linux.port index ba49c27c46..c9f4661b39 100644 --- a/repos/dde_linux/ports/linux.port +++ b/repos/dde_linux/ports/linux.port @@ -10,6 +10,7 @@ DIR(linux) := src/linux # Patches # PATCH_FILES := i915_irq.patch \ + i915_ggtt.patch \ iwlwifi_break_busy_loop.patch \ iwlwifi_enable_irq_before_pnvm.patch \ iwlwifi_limit_rx_bufs.patch \ diff --git a/repos/pc/src/driver/framebuffer/intel/pc/dummies.c b/repos/pc/src/driver/framebuffer/intel/pc/dummies.c index 5e3ead6fcc..d133c9db54 100644 --- a/repos/pc/src/driver/framebuffer/intel/pc/dummies.c +++ b/repos/pc/src/driver/framebuffer/intel/pc/dummies.c @@ -720,3 +720,51 @@ int intel_pxp_key_check(struct intel_pxp *pxp, struct drm_i915_gem_object *obj, lx_emul_trace(__func__); return -ENODEV; } + + +int intel_gt_wait_for_idle(struct intel_gt *gt, long timeout) +{ + printk("%s - timeout=%ld\n", __func__, timeout); + lx_emul_trace(__func__); + return 0; +} + + +long intel_gt_retire_requests_timeout(struct intel_gt * gt, long timeout, long * remaining_timeout) +{ + printk("%s - timeout=%ld\n", __func__, timeout); + + if (remaining_timeout) + *remaining_timeout = 0; + + return 0; +} + + +void * vmap(struct page ** pages, unsigned int count, unsigned long flags, pgprot_t prot) +{ + bool contiguous = true; + void * vmap_addr = 0; + unsigned long prev_addr = 0; + + for (unsigned i = 0; i < count; i++) { + void * virt_addr = page_address(pages[i]); + + if (!i) + vmap_addr = virt_addr; + + if (i && contiguous) + contiguous = (void *)(prev_addr + 4096) == virt_addr; + + prev_addr = (unsigned long)virt_addr; + + if (!contiguous) + break; + } + + if (!contiguous) + printk("%s -- failed, pages are non contiguous count=%u\n", + __func__, count); + + return contiguous ? vmap_addr : 0; +} diff --git a/repos/pc/src/driver/framebuffer/intel/pc/generated_dummies.c b/repos/pc/src/driver/framebuffer/intel/pc/generated_dummies.c index 8277515973..d715fd6de5 100644 --- a/repos/pc/src/driver/framebuffer/intel/pc/generated_dummies.c +++ b/repos/pc/src/driver/framebuffer/intel/pc/generated_dummies.c @@ -712,20 +712,6 @@ struct intel_context * i915_gem_engines_iter_next(struct i915_gem_engines_iter * } -extern int i915_gem_evict_for_node(struct i915_address_space * vm,struct i915_gem_ww_ctx * ww,struct drm_mm_node * target,unsigned int flags); -int i915_gem_evict_for_node(struct i915_address_space * vm,struct i915_gem_ww_ctx * ww,struct drm_mm_node * target,unsigned int flags) -{ - lx_emul_trace_and_stop(__func__); -} - - -extern int i915_gem_evict_something(struct i915_address_space * vm,struct i915_gem_ww_ctx * ww,u64 min_size,u64 alignment,unsigned long color,u64 start,u64 end,unsigned flags); -int i915_gem_evict_something(struct i915_address_space * vm,struct i915_gem_ww_ctx * ww,u64 min_size,u64 alignment,unsigned long color,u64 start,u64 end,unsigned flags) -{ - lx_emul_trace_and_stop(__func__); -} - - extern int i915_gem_execbuffer2_ioctl(struct drm_device * dev,void * data,struct drm_file * file); int i915_gem_execbuffer2_ioctl(struct drm_device * dev,void * data,struct drm_file * file) { @@ -1227,13 +1213,6 @@ void intel_gt_mcr_unlock(struct intel_gt * gt,unsigned long flags) } -extern long intel_gt_retire_requests_timeout(struct intel_gt * gt,long timeout,long * remaining_timeout); -long intel_gt_retire_requests_timeout(struct intel_gt * gt,long timeout,long * remaining_timeout) -{ - lx_emul_trace_and_stop(__func__); -} - - extern int intel_gt_runtime_resume(struct intel_gt * gt); int intel_gt_runtime_resume(struct intel_gt * gt) { @@ -2086,14 +2065,6 @@ void update_group_capacity(struct sched_domain * sd,int cpu) } -#include - -void * vmap(struct page ** pages,unsigned int count,unsigned long flags,pgprot_t prot) -{ - lx_emul_trace_and_stop(__func__); -} - - #include void * vmap_pfn(unsigned long * pfns,unsigned int count,pgprot_t prot) diff --git a/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_32/source.list b/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_32/source.list index 2adf8fbe6d..61dd65c19a 100644 --- a/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_32/source.list +++ b/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_32/source.list @@ -191,6 +191,7 @@ drivers/gpu/drm/i915/i915_active.c drivers/gpu/drm/i915/i915_config.c drivers/gpu/drm/i915/i915_driver.c drivers/gpu/drm/i915/i915_drm_client.c +drivers/gpu/drm/i915/i915_gem_evict.c drivers/gpu/drm/i915/i915_gem_gtt.c drivers/gpu/drm/i915/i915_gem_ww.c drivers/gpu/drm/i915/i915_getparam.c diff --git a/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_64/source.list b/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_64/source.list index e80978deed..99c373c7d0 100644 --- a/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_64/source.list +++ b/repos/pc/src/driver/framebuffer/intel/pc/spec/x86_64/source.list @@ -194,6 +194,7 @@ drivers/gpu/drm/i915/i915_active.c drivers/gpu/drm/i915/i915_config.c drivers/gpu/drm/i915/i915_driver.c drivers/gpu/drm/i915/i915_drm_client.c +drivers/gpu/drm/i915/i915_gem_evict.c drivers/gpu/drm/i915/i915_gem_gtt.c drivers/gpu/drm/i915/i915_gem_ww.c drivers/gpu/drm/i915/i915_getparam.c