Commit 5eec7182 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by Joonas Lahtinen

drm/i915: Align engine->uabi_class/instance with i915_drm.h

In our ABI we have defined I915_ENGINE_CLASS_INVALID_NONE and
I915_ENGINE_CLASS_INVALID_VIRTUAL as negative values which creates
implicit coupling with type widths used in, also ABI, struct
i915_engine_class_instance.

One place where we export engine->uabi_class
I915_ENGINE_CLASS_INVALID_VIRTUAL is from our our tracepoints. Because the
type of the former is u8 in contrast to u16 defined in the ABI, 254 will
be returned instead of 65534 which userspace would legitimately expect.

Another place is I915_CONTEXT_PARAM_ENGINES.

Therefore we need to align the type used to store engine ABI class and
instance.

v2:
 * Update the commit message mentioning get_engines and cc stable.
   (Chris)
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Fixes: 6d06779e ("drm/i915: Load balancing across a virtual engine")
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: <stable@vger.kernel.org> # v5.3+
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20200116134508.25211-1-tvrtko.ursulin@linux.intel.com
(cherry picked from commit 0b3bd0cd)
Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent ecc4d2a5
...@@ -9,16 +9,16 @@ ...@@ -9,16 +9,16 @@
#include "i915_gem_ioctls.h" #include "i915_gem_ioctls.h"
#include "i915_gem_object.h" #include "i915_gem_object.h"
static __always_inline u32 __busy_read_flag(u8 id) static __always_inline u32 __busy_read_flag(u16 id)
{ {
if (id == (u8)I915_ENGINE_CLASS_INVALID) if (id == (u16)I915_ENGINE_CLASS_INVALID)
return 0xffff0000u; return 0xffff0000u;
GEM_BUG_ON(id >= 16); GEM_BUG_ON(id >= 16);
return 0x10000u << id; return 0x10000u << id;
} }
static __always_inline u32 __busy_write_id(u8 id) static __always_inline u32 __busy_write_id(u16 id)
{ {
/* /*
* The uABI guarantees an active writer is also amongst the read * The uABI guarantees an active writer is also amongst the read
...@@ -29,14 +29,14 @@ static __always_inline u32 __busy_write_id(u8 id) ...@@ -29,14 +29,14 @@ static __always_inline u32 __busy_write_id(u8 id)
* last_read - hence we always set both read and write busy for * last_read - hence we always set both read and write busy for
* last_write. * last_write.
*/ */
if (id == (u8)I915_ENGINE_CLASS_INVALID) if (id == (u16)I915_ENGINE_CLASS_INVALID)
return 0xffffffffu; return 0xffffffffu;
return (id + 1) | __busy_read_flag(id); return (id + 1) | __busy_read_flag(id);
} }
static __always_inline unsigned int static __always_inline unsigned int
__busy_set_if_active(const struct dma_fence *fence, u32 (*flag)(u8 id)) __busy_set_if_active(const struct dma_fence *fence, u32 (*flag)(u16 id))
{ {
const struct i915_request *rq; const struct i915_request *rq;
...@@ -57,7 +57,7 @@ __busy_set_if_active(const struct dma_fence *fence, u32 (*flag)(u8 id)) ...@@ -57,7 +57,7 @@ __busy_set_if_active(const struct dma_fence *fence, u32 (*flag)(u8 id))
return 0; return 0;
/* Beware type-expansion follies! */ /* Beware type-expansion follies! */
BUILD_BUG_ON(!typecheck(u8, rq->engine->uabi_class)); BUILD_BUG_ON(!typecheck(u16, rq->engine->uabi_class));
return flag(rq->engine->uabi_class); return flag(rq->engine->uabi_class);
} }
......
...@@ -274,8 +274,8 @@ struct intel_engine_cs { ...@@ -274,8 +274,8 @@ struct intel_engine_cs {
u8 class; u8 class;
u8 instance; u8 instance;
u8 uabi_class; u16 uabi_class;
u8 uabi_instance; u16 uabi_instance;
u32 uabi_capabilities; u32 uabi_capabilities;
u32 context_size; u32 context_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment