FAILED: patch "[PATCH] drm/i915/gt: Fix reservation address in ggtt_reserve_guc_top" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.4.y
git checkout FETCH_HEAD
git cherry-pick -x b7599d241778d0b10cdf7a5c755aa7db9b83250c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023100431-penalty-pegboard-c849@gregkh' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b7599d241778d0b10cdf7a5c755aa7db9b83250c Mon Sep 17 00:00:00 2001
From: Javier Pello <[email protected]>
Date: Sat, 2 Sep 2023 17:10:39 +0200
Subject: [PATCH] drm/i915/gt: Fix reservation address in ggtt_reserve_guc_top
There is an assertion in ggtt_reserve_guc_top that the global GTT is of size at least GUC_GGTT_TOP, which is not the case on a 32-bit platform; see commit 562d55d991b39ce376c492df2f7890fd6a541ffc ("drm/i915/bdw: Only use 2g GGTT for 32b platforms"). If GEM_BUG_ON is enabled, this triggers a BUG(); if GEM_BUG_ON is disabled, the subsequent reservation fails and the driver fails to initialise the device:
i915 0000:00:02.0: [drm:i915_init_ggtt [i915]] Failed to reserve top of GGTT for GuC
i915 0000:00:02.0: Device initialization failed (-28)
i915 0000:00:02.0: Please file a bug on drm/i915; see https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs for details.
i915: probe of 0000:00:02.0 failed with error -28
Make the reservation at the top of the available space, whatever that is, instead of assuming that the top will be GUC_GGTT_TOP.
drivers/gpu/drm/i915/gt/intel_ggtt.c +17 -6
@@ -511,20 +511,31 @@ void intel_ggtt_unbind_vma(struct i915_address_space *vm, vm->clear_range (vm, vma_res->start, vma_res->vma_size); } +/* +* Reserve the top of the GuC address space for firmware images. Addresses +* beyond GUC_GGTT_TOP in the GuC address space are inaccessible by GuC, +* which makes for a suitable range to hold GuC/HuC firmware images if the +* size of the GGTT is 4G. However, on a 32-bit platform the size of the GGTT +* is limited to 2G, which is less than GUC_GGTT_TOP, but we reserve a chunk +* of the same size anyway, which is far more than needed, to keep the logic +* in uc_fw_ggtt_offset() simple. +*/ +#define GUC_TOP_RESERVE_SIZE (SZ_4G - GUC_GGTT_TOP) +static int ggtt_reserve_guc_top (struct i915_ggtt *ggtt) { -u64 size; +u64 offset;int ret;if (!intel_uc_uses_guc (&ggtt->vm.gt->uc))return 0 ; -GEM_BUG_ON (ggtt->vm.total <=GUC_GGTT_TOP ); - size = ggtt->vm.total -GUC_GGTT_TOP ; +GEM_BUG_ON (ggtt->vm.total <=GUC_TOP_RESERVE_SIZE ); + offset = ggtt->vm.total -GUC_TOP_RESERVE_SIZE ; - ret =i915_gem_gtt_reserve (&ggtt->vm,NULL , &ggtt->uc_fw, size, -GUC_GGTT_TOP ,I915_COLOR_UNEVICTABLE , -PIN_NOEVICT ); + ret =i915_gem_gtt_reserve (&ggtt->vm,NULL , &ggtt->uc_fw, +GUC_TOP_RESERVE_SIZE , offset, +I915_COLOR_UNEVICTABLE ,PIN_NOEVICT );if (ret)drm_dbg (&ggtt->vm.i915->drm,"Failed to reserve top of GGTT for GuC\n" );