From: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
To: Michal Wajdeczko <michal.wajdeczko@intel.com>,
intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/5] drm/i915/wopcm: Check WOPCM layout separately from calculations
Date: Thu, 15 Aug 2019 17:10:26 -0700 [thread overview]
Message-ID: <d3f8973f-8aa7-e7e3-6d44-30e42e6537d5@intel.com> (raw)
In-Reply-To: <20190815214841.17856-1-michal.wajdeczko@intel.com>
On 8/15/19 2:48 PM, Michal Wajdeczko wrote:
> We can do WOPCM partitioning using rough estimates and limits
> and perform detailed check as separate step.
>
> v2: oops! s/max/min
>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/intel_wopcm.c | 105 ++++++++++++++++++++---------
> 1 file changed, 74 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
> index 2975e00f57f5..39f2764ca3a8 100644
> --- a/drivers/gpu/drm/i915/intel_wopcm.c
> +++ b/drivers/gpu/drm/i915/intel_wopcm.c
> @@ -87,7 +87,8 @@ void intel_wopcm_init_early(struct intel_wopcm *wopcm)
> else
> wopcm->size = GEN9_WOPCM_SIZE;
>
> - DRM_DEBUG_DRIVER("WOPCM size: %uKiB\n", wopcm->size / 1024);
> + DRM_DEV_DEBUG_DRIVER(i915->drm.dev, "WOPCM: size %uKiB\n",
> + wopcm->size / SZ_1K);
> }
>
> static inline u32 context_reserved_size(struct drm_i915_private *i915)
> @@ -138,9 +139,9 @@ static inline int gen9_check_huc_fw_fits(u32 guc_wopcm_size, u32 huc_fw_size)
> return 0;
> }
>
> -static inline int check_hw_restriction(struct drm_i915_private *i915,
> - u32 guc_wopcm_base, u32 guc_wopcm_size,
> - u32 huc_fw_size)
> +static inline bool check_hw_restrictions(struct drm_i915_private *i915,
> + u32 guc_wopcm_base, u32 guc_wopcm_size,
> + u32 huc_fw_size)
> {
> int err = 0;
>
> @@ -151,7 +152,64 @@ static inline int check_hw_restriction(struct drm_i915_private *i915,
> (IS_GEN(i915, 9) || IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0)))
> err = gen9_check_huc_fw_fits(guc_wopcm_size, huc_fw_size);
>
> - return err;
> + return !err;
> +}
> +
> +static inline bool __check_layout(struct drm_i915_private *i915, u32 wopcm_size,
> + u32 guc_wopcm_base, u32 guc_wopcm_size,
> + u32 guc_fw_size, u32 huc_fw_size)
> +{
> + const u32 ctx_rsvd = context_reserved_size(i915);
> + u32 size;
> +
> + if (unlikely(guc_wopcm_base > wopcm_size)) {
> + dev_err(i915->drm.dev,
> + "WOPCM: invalid GuC region base: %uK > %uK\n",
> + guc_wopcm_base / SZ_1K, wopcm_size / SZ_1K);
> + return false;
> + }
> +
> + size = wopcm_size - ctx_rsvd;
> + if (unlikely(guc_wopcm_base > size)) {
> + dev_err(i915->drm.dev,
> + "WOPCM: invalid GuC region base: %uK > %uK\n",
> + guc_wopcm_base / SZ_1K, size / SZ_1K);
> + return false;
> + }
> +
> + if (unlikely(guc_wopcm_size > wopcm_size)) {
> + dev_err(i915->drm.dev,
> + "WOPCM: invalid GuC region size: %uK > %uK\n",
> + guc_wopcm_size / SZ_1K, wopcm_size / SZ_1K);
> + return false;
> + }
> +
> + size = wopcm_size - guc_wopcm_base - ctx_rsvd;
> + if (unlikely(guc_wopcm_size > size)) {
> + dev_err(i915->drm.dev,
> + "WOPCM: invalid GuC region size: %uK > %uK\n",
> + guc_wopcm_size / SZ_1K, size / SZ_1K);
> + return false;
> + }
I think we can consolidate all the checks above in just:
wopcm_guc_max = wopcm_size - ctx_rsvd;
if (range_overflows(guc_wopcm_base, guc_wopcm_size, wopcm_guc_max)
return false;
> +
> + size = guc_fw_size + GUC_WOPCM_RESERVED + GUC_WOPCM_STACK_RESERVED;
> + if (unlikely(guc_wopcm_size < size)) {
> + dev_err(i915->drm.dev, "WOPCM: no space for %s: %uK < %uK\n",
> + intel_uc_fw_type_repr(INTEL_UC_FW_TYPE_GUC),
> + guc_wopcm_size / SZ_1K, size / SZ_1K);
> + return false;
> + }
> +
> + size = huc_fw_size + WOPCM_RESERVED_SIZE;
> + if (unlikely(guc_wopcm_base < size)) {
> + dev_err(i915->drm.dev, "WOPCM: no space for %s: %uK < %uK\n",
> + intel_uc_fw_type_repr(INTEL_UC_FW_TYPE_HUC),
> + guc_wopcm_base / SZ_1K, size / SZ_1K);
> + return false;
> + }
> +
> + return check_hw_restrictions(i915, guc_wopcm_base, guc_wopcm_size,
> + huc_fw_size);
> }
>
> /**
> @@ -172,8 +230,6 @@ void intel_wopcm_init(struct intel_wopcm *wopcm)
> u32 ctx_rsvd = context_reserved_size(i915);
> u32 guc_wopcm_base;
> u32 guc_wopcm_size;
> - u32 guc_wopcm_rsvd;
> - int err;
>
> if (!guc_fw_size)
> return;
> @@ -183,39 +239,26 @@ void intel_wopcm_init(struct intel_wopcm *wopcm)
> GEM_BUG_ON(wopcm->guc.size);
> GEM_BUG_ON(guc_fw_size >= wopcm->size);
> GEM_BUG_ON(huc_fw_size >= wopcm->size);
> + GEM_BUG_ON(ctx_rsvd + WOPCM_RESERVED_SIZE >= wopcm->size);
>
> if (i915_inject_probe_failure(i915))
> return;
>
> guc_wopcm_base = ALIGN(huc_fw_size + WOPCM_RESERVED_SIZE,
> GUC_WOPCM_OFFSET_ALIGNMENT);
> - if ((guc_wopcm_base + ctx_rsvd) >= wopcm->size) {
> - DRM_ERROR("GuC WOPCM base (%uKiB) is too big.\n",
> - guc_wopcm_base / 1024);
> - return;
> - }
> -
> + guc_wopcm_base = min(wopcm->size - ctx_rsvd, guc_wopcm_base);
This line confused me quite a bit until we chatted on IM about it. maybe
add a comment, e.g.:
/*
* we want to keep all the checks in the same place to be able to re-use
* them when we find locked values in WOPCM so we don't validate
* guc_wopcm_base here, but we still need to clamp it to make sure the
* following math is sane.
*/
Also, with my suggestion for consolidation above, for the checks we
always care about wopcm->size - ctx_rsvd, so maybe store that in a local
var to use it here and below and pass that into __check_layout().
Daniele
> guc_wopcm_size = wopcm->size - guc_wopcm_base - ctx_rsvd;
> guc_wopcm_size &= GUC_WOPCM_SIZE_MASK;
>
> - DRM_DEBUG_DRIVER("Calculated GuC WOPCM Region: [%uKiB, %uKiB)\n",
> - guc_wopcm_base / 1024, guc_wopcm_size / 1024);
> + DRM_DEV_DEBUG_DRIVER(i915->drm.dev,
> + "Calculated GuC WOPCM Region: [%uKiB, %uKiB)\n",
> + guc_wopcm_base / SZ_1K, guc_wopcm_size / SZ_1K);
>
> - guc_wopcm_rsvd = GUC_WOPCM_RESERVED + GUC_WOPCM_STACK_RESERVED;
> - if ((guc_fw_size + guc_wopcm_rsvd) > guc_wopcm_size) {
> - DRM_ERROR("Need %uKiB WOPCM for GuC, %uKiB available.\n",
> - (guc_fw_size + guc_wopcm_rsvd) / 1024,
> - guc_wopcm_size / 1024);
> - return;
> + if (__check_layout(i915, wopcm->size, guc_wopcm_base, guc_wopcm_size,
> + guc_fw_size, huc_fw_size)) {
> + wopcm->guc.base = guc_wopcm_base;
> + wopcm->guc.size = guc_wopcm_size;
> + GEM_BUG_ON(!wopcm->guc.base);
> + GEM_BUG_ON(!wopcm->guc.size);
> }
> -
> - err = check_hw_restriction(i915, guc_wopcm_base, guc_wopcm_size,
> - huc_fw_size);
> - if (err)
> - return;
> -
> - wopcm->guc.base = guc_wopcm_base;
> - wopcm->guc.size = guc_wopcm_size;
> - GEM_BUG_ON(!wopcm->guc.base);
> - GEM_BUG_ON(!wopcm->guc.size);
> }
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2019-08-16 0:10 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-15 17:12 [PATCH 0/5] More WOPCM fixes Michal Wajdeczko
2019-08-15 17:12 ` [PATCH 1/5] drm/i915/uc: Move FW size sanity check back to fetch Michal Wajdeczko
2019-08-15 17:12 ` [PATCH 2/5] drm/i915/wopcm: Check WOPCM layout separately from calculations Michal Wajdeczko
2019-08-15 21:48 ` Michal Wajdeczko
2019-08-16 0:10 ` Daniele Ceraolo Spurio [this message]
2019-08-16 0:21 ` Michal Wajdeczko
2019-08-16 0:28 ` Daniele Ceraolo Spurio
2019-08-15 17:12 ` [PATCH 3/5] drm/i915/wopcm: Try to use already locked WOPCM layout Michal Wajdeczko
2019-08-16 0:14 ` Daniele Ceraolo Spurio
2019-08-15 17:12 ` [PATCH 4/5] drm/i915/wopcm: Update error messages Michal Wajdeczko
2019-08-15 17:12 ` [PATCH 5/5] drm/i915/wopmc: Fix SPDX tag location Michal Wajdeczko
2019-08-15 17:52 ` ✗ Fi.CI.BAT: failure for More WOPCM fixes Patchwork
2019-08-15 21:40 ` Michal Wajdeczko
2019-08-15 23:25 ` ✓ Fi.CI.BAT: success for More WOPCM fixes (rev2) Patchwork
2019-08-16 15:56 ` ✓ Fi.CI.IGT: " Patchwork
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=d3f8973f-8aa7-e7e3-6d44-30e42e6537d5@intel.com \
--to=daniele.ceraolospurio@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=michal.wajdeczko@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox