Commit 750e76b4 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gt: Move the [class][inst] lookup for engines onto the GT

To maintain a fast lookup from a GT centric irq handler, we want the
engine lookup tables on the intel_gt. To avoid having multiple copies of
the same multi-dimension lookup table, move the generic user engine
lookup into an rbtree (for fast and flexible indexing).

v2: Split uabi_instance cf uabi_class
v3: Set uabi_class/uabi_instance after collating all engines to provide a
stable uabi across parallel unordered construction.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> #v2
Link: https://patchwork.freedesktop.org/patch/msgid/20190806124300.24945-2-chris@chris-wilson.co.uk
parent c29579d2
...@@ -72,9 +72,10 @@ obj-y += gt/ ...@@ -72,9 +72,10 @@ obj-y += gt/
gt-y += \ gt-y += \
gt/intel_breadcrumbs.o \ gt/intel_breadcrumbs.o \
gt/intel_context.o \ gt/intel_context.o \
gt/intel_engine_pool.o \
gt/intel_engine_cs.o \ gt/intel_engine_cs.o \
gt/intel_engine_pool.o \
gt/intel_engine_pm.o \ gt/intel_engine_pm.o \
gt/intel_engine_user.o \
gt/intel_gt.o \ gt/intel_gt.o \
gt/intel_gt_pm.o \ gt/intel_gt_pm.o \
gt/intel_hangcheck.o \ gt/intel_hangcheck.o \
......
...@@ -70,6 +70,7 @@ ...@@ -70,6 +70,7 @@
#include <drm/i915_drm.h> #include <drm/i915_drm.h>
#include "gt/intel_lrc_reg.h" #include "gt/intel_lrc_reg.h"
#include "gt/intel_engine_user.h"
#include "i915_gem_context.h" #include "i915_gem_context.h"
#include "i915_globals.h" #include "i915_globals.h"
...@@ -1729,7 +1730,7 @@ get_engines(struct i915_gem_context *ctx, ...@@ -1729,7 +1730,7 @@ get_engines(struct i915_gem_context *ctx,
if (e->engines[n]) { if (e->engines[n]) {
ci.engine_class = e->engines[n]->engine->uabi_class; ci.engine_class = e->engines[n]->engine->uabi_class;
ci.engine_instance = e->engines[n]->engine->instance; ci.engine_instance = e->engines[n]->engine->uabi_instance;
} }
if (copy_to_user(&user->engines[n], &ci, sizeof(ci))) { if (copy_to_user(&user->engines[n], &ci, sizeof(ci))) {
......
...@@ -122,8 +122,6 @@ hangcheck_action_to_str(const enum intel_engine_hangcheck_action a) ...@@ -122,8 +122,6 @@ hangcheck_action_to_str(const enum intel_engine_hangcheck_action a)
return "unknown"; return "unknown";
} }
void intel_engines_set_scheduler_caps(struct drm_i915_private *i915);
static inline unsigned int static inline unsigned int
execlists_num_ports(const struct intel_engine_execlists * const execlists) execlists_num_ports(const struct intel_engine_execlists * const execlists)
{ {
...@@ -422,7 +420,6 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine); ...@@ -422,7 +420,6 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine);
bool intel_engines_are_idle(struct intel_gt *gt); bool intel_engines_are_idle(struct intel_gt *gt);
void intel_engines_reset_default_submission(struct intel_gt *gt); void intel_engines_reset_default_submission(struct intel_gt *gt);
unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915);
bool intel_engine_can_store_dword(struct intel_engine_cs *engine); bool intel_engine_can_store_dword(struct intel_engine_cs *engine);
...@@ -431,9 +428,6 @@ void intel_engine_dump(struct intel_engine_cs *engine, ...@@ -431,9 +428,6 @@ void intel_engine_dump(struct intel_engine_cs *engine,
struct drm_printer *m, struct drm_printer *m,
const char *header, ...); const char *header, ...);
struct intel_engine_cs *
intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance);
static inline void intel_engine_context_in(struct intel_engine_cs *engine) static inline void intel_engine_context_in(struct intel_engine_cs *engine)
{ {
unsigned long flags; unsigned long flags;
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "intel_engine.h" #include "intel_engine.h"
#include "intel_engine_pm.h" #include "intel_engine_pm.h"
#include "intel_engine_pool.h" #include "intel_engine_pool.h"
#include "intel_engine_user.h"
#include "intel_context.h" #include "intel_context.h"
#include "intel_lrc.h" #include "intel_lrc.h"
#include "intel_reset.h" #include "intel_reset.h"
...@@ -286,9 +287,7 @@ static void intel_engine_sanitize_mmio(struct intel_engine_cs *engine) ...@@ -286,9 +287,7 @@ static void intel_engine_sanitize_mmio(struct intel_engine_cs *engine)
intel_engine_set_hwsp_writemask(engine, ~0u); intel_engine_set_hwsp_writemask(engine, ~0u);
} }
static int static int intel_engine_setup(struct intel_gt *gt, enum intel_engine_id id)
intel_engine_setup(struct drm_i915_private *dev_priv,
enum intel_engine_id id)
{ {
const struct engine_info *info = &intel_engines[id]; const struct engine_info *info = &intel_engines[id];
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
...@@ -304,10 +303,9 @@ intel_engine_setup(struct drm_i915_private *dev_priv, ...@@ -304,10 +303,9 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
if (GEM_DEBUG_WARN_ON(info->instance > MAX_ENGINE_INSTANCE)) if (GEM_DEBUG_WARN_ON(info->instance > MAX_ENGINE_INSTANCE))
return -EINVAL; return -EINVAL;
if (GEM_DEBUG_WARN_ON(dev_priv->engine_class[info->class][info->instance])) if (GEM_DEBUG_WARN_ON(gt->engine_class[info->class][info->instance]))
return -EINVAL; return -EINVAL;
GEM_BUG_ON(dev_priv->engine[id]);
engine = kzalloc(sizeof(*engine), GFP_KERNEL); engine = kzalloc(sizeof(*engine), GFP_KERNEL);
if (!engine) if (!engine)
return -ENOMEM; return -ENOMEM;
...@@ -316,12 +314,12 @@ intel_engine_setup(struct drm_i915_private *dev_priv, ...@@ -316,12 +314,12 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
engine->id = id; engine->id = id;
engine->mask = BIT(id); engine->mask = BIT(id);
engine->i915 = dev_priv; engine->i915 = gt->i915;
engine->gt = &dev_priv->gt; engine->gt = gt;
engine->uncore = &dev_priv->uncore; engine->uncore = gt->uncore;
__sprint_engine_name(engine->name, info); __sprint_engine_name(engine->name, info);
engine->hw_id = engine->guc_id = info->hw_id; engine->hw_id = engine->guc_id = info->hw_id;
engine->mmio_base = __engine_mmio_base(dev_priv, info->mmio_bases); engine->mmio_base = __engine_mmio_base(gt->i915, info->mmio_bases);
engine->class = info->class; engine->class = info->class;
engine->instance = info->instance; engine->instance = info->instance;
...@@ -331,14 +329,12 @@ intel_engine_setup(struct drm_i915_private *dev_priv, ...@@ -331,14 +329,12 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
*/ */
engine->destroy = (typeof(engine->destroy))kfree; engine->destroy = (typeof(engine->destroy))kfree;
engine->uabi_class = intel_engine_classes[info->class].uabi_class; engine->context_size = intel_engine_context_size(gt->i915,
engine->context_size = intel_engine_context_size(dev_priv,
engine->class); engine->class);
if (WARN_ON(engine->context_size > BIT(20))) if (WARN_ON(engine->context_size > BIT(20)))
engine->context_size = 0; engine->context_size = 0;
if (engine->context_size) if (engine->context_size)
DRIVER_CAPS(dev_priv)->has_logical_contexts = true; DRIVER_CAPS(gt->i915)->has_logical_contexts = true;
/* Nothing to do here, execute in order of dependencies */ /* Nothing to do here, execute in order of dependencies */
engine->schedule = NULL; engine->schedule = NULL;
...@@ -350,8 +346,11 @@ intel_engine_setup(struct drm_i915_private *dev_priv, ...@@ -350,8 +346,11 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
/* Scrub mmio state on takeover */ /* Scrub mmio state on takeover */
intel_engine_sanitize_mmio(engine); intel_engine_sanitize_mmio(engine);
dev_priv->engine_class[info->class][info->instance] = engine; gt->engine_class[info->class][info->instance] = engine;
dev_priv->engine[id] = engine;
intel_engine_add_user(engine);
gt->i915->engine[id] = engine;
return 0; return 0;
} }
...@@ -434,7 +433,7 @@ int intel_engines_init_mmio(struct drm_i915_private *i915) ...@@ -434,7 +433,7 @@ int intel_engines_init_mmio(struct drm_i915_private *i915)
if (!HAS_ENGINE(i915, i)) if (!HAS_ENGINE(i915, i))
continue; continue;
err = intel_engine_setup(i915, i); err = intel_engine_setup(&i915->gt, i);
if (err) if (err)
goto cleanup; goto cleanup;
...@@ -677,47 +676,6 @@ int intel_engines_setup(struct drm_i915_private *i915) ...@@ -677,47 +676,6 @@ int intel_engines_setup(struct drm_i915_private *i915)
return err; return err;
} }
void intel_engines_set_scheduler_caps(struct drm_i915_private *i915)
{
static const struct {
u8 engine;
u8 sched;
} map[] = {
#define MAP(x, y) { ilog2(I915_ENGINE_##x), ilog2(I915_SCHEDULER_CAP_##y) }
MAP(HAS_PREEMPTION, PREEMPTION),
MAP(HAS_SEMAPHORES, SEMAPHORES),
MAP(SUPPORTS_STATS, ENGINE_BUSY_STATS),
#undef MAP
};
struct intel_engine_cs *engine;
enum intel_engine_id id;
u32 enabled, disabled;
enabled = 0;
disabled = 0;
for_each_engine(engine, i915, id) { /* all engines must agree! */
int i;
if (engine->schedule)
enabled |= (I915_SCHEDULER_CAP_ENABLED |
I915_SCHEDULER_CAP_PRIORITY);
else
disabled |= (I915_SCHEDULER_CAP_ENABLED |
I915_SCHEDULER_CAP_PRIORITY);
for (i = 0; i < ARRAY_SIZE(map); i++) {
if (engine->flags & BIT(map[i].engine))
enabled |= BIT(map[i].sched);
else
disabled |= BIT(map[i].sched);
}
}
i915->caps.scheduler = enabled & ~disabled;
if (!(i915->caps.scheduler & I915_SCHEDULER_CAP_ENABLED))
i915->caps.scheduler = 0;
}
struct measure_breadcrumb { struct measure_breadcrumb {
struct i915_request rq; struct i915_request rq;
struct intel_timeline timeline; struct intel_timeline timeline;
...@@ -1187,20 +1145,6 @@ bool intel_engine_can_store_dword(struct intel_engine_cs *engine) ...@@ -1187,20 +1145,6 @@ bool intel_engine_can_store_dword(struct intel_engine_cs *engine)
} }
} }
unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915)
{
struct intel_engine_cs *engine;
enum intel_engine_id id;
unsigned int which;
which = 0;
for_each_engine(engine, i915, id)
if (engine->default_state)
which |= BIT(engine->uabi_class);
return which;
}
static int print_sched_attr(struct drm_i915_private *i915, static int print_sched_attr(struct drm_i915_private *i915,
const struct i915_sched_attr *attr, const struct i915_sched_attr *attr,
char *buf, int x, int len) char *buf, int x, int len)
...@@ -1498,29 +1442,6 @@ void intel_engine_dump(struct intel_engine_cs *engine, ...@@ -1498,29 +1442,6 @@ void intel_engine_dump(struct intel_engine_cs *engine,
intel_engine_print_breadcrumbs(engine, m); intel_engine_print_breadcrumbs(engine, m);
} }
static u8 user_class_map[] = {
[I915_ENGINE_CLASS_RENDER] = RENDER_CLASS,
[I915_ENGINE_CLASS_COPY] = COPY_ENGINE_CLASS,
[I915_ENGINE_CLASS_VIDEO] = VIDEO_DECODE_CLASS,
[I915_ENGINE_CLASS_VIDEO_ENHANCE] = VIDEO_ENHANCEMENT_CLASS,
};
struct intel_engine_cs *
intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance)
{
if (class >= ARRAY_SIZE(user_class_map))
return NULL;
class = user_class_map[class];
GEM_BUG_ON(class > MAX_ENGINE_CLASS);
if (instance > MAX_ENGINE_INSTANCE)
return NULL;
return i915->engine_class[class][instance];
}
/** /**
* intel_enable_engine_stats() - Enable engine busy tracking on engine * intel_enable_engine_stats() - Enable engine busy tracking on engine
* @engine: engine to enable stats collection * @engine: engine to enable stats collection
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/llist.h> #include <linux/llist.h>
#include <linux/rbtree.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -267,15 +268,19 @@ struct intel_engine_cs { ...@@ -267,15 +268,19 @@ struct intel_engine_cs {
unsigned int guc_id; unsigned int guc_id;
intel_engine_mask_t mask; intel_engine_mask_t mask;
u8 uabi_class;
u8 class; u8 class;
u8 instance; u8 instance;
u8 uabi_class;
u8 uabi_instance;
u32 context_size; u32 context_size;
u32 mmio_base; u32 mmio_base;
u32 uabi_capabilities; u32 uabi_capabilities;
struct rb_node uabi_node;
struct intel_sseu sseu; struct intel_sseu sseu;
struct intel_ring *buffer; struct intel_ring *buffer;
......
/*
* SPDX-License-Identifier: MIT
*
* Copyright © 2019 Intel Corporation
*/
#include <linux/list.h>
#include <linux/list_sort.h>
#include <linux/llist.h>
#include "i915_drv.h"
#include "intel_engine.h"
#include "intel_engine_user.h"
struct intel_engine_cs *
intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance)
{
struct rb_node *p = i915->uabi_engines.rb_node;
while (p) {
struct intel_engine_cs *it =
rb_entry(p, typeof(*it), uabi_node);
if (class < it->uabi_class)
p = p->rb_left;
else if (class > it->uabi_class ||
instance > it->uabi_instance)
p = p->rb_right;
else if (instance < it->uabi_instance)
p = p->rb_left;
else
return it;
}
return NULL;
}
void intel_engine_add_user(struct intel_engine_cs *engine)
{
llist_add((struct llist_node *)&engine->uabi_node,
(struct llist_head *)&engine->i915->uabi_engines);
}
static const u8 uabi_classes[] = {
[RENDER_CLASS] = I915_ENGINE_CLASS_RENDER,
[COPY_ENGINE_CLASS] = I915_ENGINE_CLASS_COPY,
[VIDEO_DECODE_CLASS] = I915_ENGINE_CLASS_VIDEO,
[VIDEO_ENHANCEMENT_CLASS] = I915_ENGINE_CLASS_VIDEO_ENHANCE,
};
static int engine_cmp(void *priv, struct list_head *A, struct list_head *B)
{
const struct intel_engine_cs *a =
container_of((struct rb_node *)A, typeof(*a), uabi_node);
const struct intel_engine_cs *b =
container_of((struct rb_node *)B, typeof(*b), uabi_node);
if (uabi_classes[a->class] < uabi_classes[b->class])
return -1;
if (uabi_classes[a->class] > uabi_classes[b->class])
return 1;
if (a->instance < b->instance)
return -1;
if (a->instance > b->instance)
return 1;
return 0;
}
static struct llist_node *get_engines(struct drm_i915_private *i915)
{
return llist_del_all((struct llist_head *)&i915->uabi_engines);
}
static void sort_engines(struct drm_i915_private *i915,
struct list_head *engines)
{
struct llist_node *pos, *next;
llist_for_each_safe(pos, next, get_engines(i915)) {
struct intel_engine_cs *engine =
container_of((struct rb_node *)pos, typeof(*engine),
uabi_node);
list_add((struct list_head *)&engine->uabi_node, engines);
}
list_sort(NULL, engines, engine_cmp);
}
static void set_scheduler_caps(struct drm_i915_private *i915)
{
static const struct {
u8 engine;
u8 sched;
} map[] = {
#define MAP(x, y) { ilog2(I915_ENGINE_##x), ilog2(I915_SCHEDULER_CAP_##y) }
MAP(HAS_PREEMPTION, PREEMPTION),
MAP(HAS_SEMAPHORES, SEMAPHORES),
MAP(SUPPORTS_STATS, ENGINE_BUSY_STATS),
#undef MAP
};
struct intel_engine_cs *engine;
u32 enabled, disabled;
enabled = 0;
disabled = 0;
for_each_uabi_engine(engine, i915) { /* all engines must agree! */
int i;
if (engine->schedule)
enabled |= (I915_SCHEDULER_CAP_ENABLED |
I915_SCHEDULER_CAP_PRIORITY);
else
disabled |= (I915_SCHEDULER_CAP_ENABLED |
I915_SCHEDULER_CAP_PRIORITY);
for (i = 0; i < ARRAY_SIZE(map); i++) {
if (engine->flags & BIT(map[i].engine))
enabled |= BIT(map[i].sched);
else
disabled |= BIT(map[i].sched);
}
}
i915->caps.scheduler = enabled & ~disabled;
if (!(i915->caps.scheduler & I915_SCHEDULER_CAP_ENABLED))
i915->caps.scheduler = 0;
}
void intel_engines_driver_register(struct drm_i915_private *i915)
{
u8 uabi_instances[4] = {};
struct list_head *it, *next;
struct rb_node **p, *prev;
LIST_HEAD(engines);
sort_engines(i915, &engines);
prev = NULL;
p = &i915->uabi_engines.rb_node;
list_for_each_safe(it, next, &engines) {
struct intel_engine_cs *engine =
container_of((struct rb_node *)it, typeof(*engine),
uabi_node);
GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
engine->uabi_class = uabi_classes[engine->class];
GEM_BUG_ON(engine->uabi_class >= ARRAY_SIZE(uabi_instances));
engine->uabi_instance = uabi_instances[engine->uabi_class]++;
rb_link_node(&engine->uabi_node, prev, p);
rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
GEM_BUG_ON(intel_engine_lookup_user(i915,
engine->uabi_class,
engine->uabi_instance) != engine);
prev = &engine->uabi_node;
p = &prev->rb_right;
}
if (IS_ENABLED(CONFIG_DRM_I915_SELFTESTS) &&
IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) {
struct intel_engine_cs *engine;
unsigned int isolation;
int class, inst;
int errors = 0;
for (class = 0; class < ARRAY_SIZE(uabi_instances); class++) {
for (inst = 0; inst < uabi_instances[class]; inst++) {
engine = intel_engine_lookup_user(i915,
class, inst);
if (!engine) {
pr_err("UABI engine not found for { class:%d, instance:%d }\n",
class, inst);
errors++;
continue;
}
if (engine->uabi_class != class ||
engine->uabi_instance != inst) {
pr_err("Wrong UABI engine:%s { class:%d, instance:%d } found for { class:%d, instance:%d }\n",
engine->name,
engine->uabi_class,
engine->uabi_instance,
class, inst);
errors++;
continue;
}
}
}
/*
* Make sure that classes with multiple engine instances all
* share the same basic configuration.
*/
isolation = intel_engines_has_context_isolation(i915);
for_each_uabi_engine(engine, i915) {
unsigned int bit = BIT(engine->uabi_class);
unsigned int expected = engine->default_state ? bit : 0;
if ((isolation & bit) != expected) {
pr_err("mismatching default context state for class %d on engine %s\n",
engine->uabi_class, engine->name);
errors++;
}
}
if (WARN(errors, "Invalid UABI engine mapping found"))
i915->uabi_engines = RB_ROOT;
}
set_scheduler_caps(i915);
}
unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915)
{
struct intel_engine_cs *engine;
unsigned int which;
which = 0;
for_each_uabi_engine(engine, i915)
if (engine->default_state)
which |= BIT(engine->uabi_class);
return which;
}
/*
* SPDX-License-Identifier: MIT
*
* Copyright © 2019 Intel Corporation
*/
#ifndef INTEL_ENGINE_USER_H
#define INTEL_ENGINE_USER_H
#include <linux/types.h>
struct drm_i915_private;
struct intel_engine_cs;
struct intel_engine_cs *
intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance);
unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915);
void intel_engine_add_user(struct intel_engine_cs *engine);
void intel_engines_driver_register(struct drm_i915_private *i915);
#endif /* INTEL_ENGINE_USER_H */
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
struct drm_i915_private; struct drm_i915_private;
struct i915_ggtt; struct i915_ggtt;
struct intel_engine_cs;
struct intel_uncore; struct intel_uncore;
struct intel_hangcheck { struct intel_hangcheck {
...@@ -76,6 +77,9 @@ struct intel_gt { ...@@ -76,6 +77,9 @@ struct intel_gt {
u32 pm_ier; u32 pm_ier;
u32 pm_guc_events; u32 pm_guc_events;
struct intel_engine_cs *engine_class[MAX_ENGINE_CLASS + 1]
[MAX_ENGINE_INSTANCE + 1];
}; };
enum intel_gt_scratch_field { enum intel_gt_scratch_field {
......
...@@ -1792,6 +1792,7 @@ static int live_virtual_engine(void *arg) ...@@ -1792,6 +1792,7 @@ static int live_virtual_engine(void *arg)
struct drm_i915_private *i915 = arg; struct drm_i915_private *i915 = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
struct intel_gt *gt = &i915->gt;
enum intel_engine_id id; enum intel_engine_id id;
unsigned int class, inst; unsigned int class, inst;
int err = -ENODEV; int err = -ENODEV;
...@@ -1815,10 +1816,10 @@ static int live_virtual_engine(void *arg) ...@@ -1815,10 +1816,10 @@ static int live_virtual_engine(void *arg)
nsibling = 0; nsibling = 0;
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) { for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!i915->engine_class[class][inst]) if (!gt->engine_class[class][inst])
continue; continue;
siblings[nsibling++] = i915->engine_class[class][inst]; siblings[nsibling++] = gt->engine_class[class][inst];
} }
if (nsibling < 2) if (nsibling < 2)
continue; continue;
...@@ -1939,6 +1940,7 @@ static int live_virtual_mask(void *arg) ...@@ -1939,6 +1940,7 @@ static int live_virtual_mask(void *arg)
{ {
struct drm_i915_private *i915 = arg; struct drm_i915_private *i915 = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
struct intel_gt *gt = &i915->gt;
unsigned int class, inst; unsigned int class, inst;
int err = 0; int err = 0;
...@@ -1952,10 +1954,10 @@ static int live_virtual_mask(void *arg) ...@@ -1952,10 +1954,10 @@ static int live_virtual_mask(void *arg)
nsibling = 0; nsibling = 0;
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) { for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!i915->engine_class[class][inst]) if (!gt->engine_class[class][inst])
break; break;
siblings[nsibling++] = i915->engine_class[class][inst]; siblings[nsibling++] = gt->engine_class[class][inst];
} }
if (nsibling < 2) if (nsibling < 2)
continue; continue;
...@@ -2116,6 +2118,7 @@ static int live_virtual_bond(void *arg) ...@@ -2116,6 +2118,7 @@ static int live_virtual_bond(void *arg)
}; };
struct drm_i915_private *i915 = arg; struct drm_i915_private *i915 = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
struct intel_gt *gt = &i915->gt;
unsigned int class, inst; unsigned int class, inst;
int err = 0; int err = 0;
...@@ -2130,11 +2133,11 @@ static int live_virtual_bond(void *arg) ...@@ -2130,11 +2133,11 @@ static int live_virtual_bond(void *arg)
nsibling = 0; nsibling = 0;
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) { for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!i915->engine_class[class][inst]) if (!gt->engine_class[class][inst])
break; break;
GEM_BUG_ON(nsibling == ARRAY_SIZE(siblings)); GEM_BUG_ON(nsibling == ARRAY_SIZE(siblings));
siblings[nsibling++] = i915->engine_class[class][inst]; siblings[nsibling++] = gt->engine_class[class][inst];
} }
if (nsibling < 2) if (nsibling < 2)
continue; continue;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
#include "gem/i915_gem_pm.h" #include "gem/i915_gem_pm.h"
#include "gt/intel_engine_user.h"
#include "gt/intel_gt.h" #include "gt/intel_gt.h"
#include "i915_selftest.h" #include "i915_selftest.h"
#include "intel_reset.h" #include "intel_reset.h"
......
...@@ -488,7 +488,7 @@ static void guc_add_request(struct intel_guc *guc, struct i915_request *rq) ...@@ -488,7 +488,7 @@ static void guc_add_request(struct intel_guc *guc, struct i915_request *rq)
ring_tail, rq->fence.seqno); ring_tail, rq->fence.seqno);
guc_ring_doorbell(client); guc_ring_doorbell(client);
client->submissions[engine->id] += 1; client->submissions[engine->guc_id] += 1;
} }
/* /*
......
...@@ -1352,11 +1352,10 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine, ...@@ -1352,11 +1352,10 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv) int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv)
{ {
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id;
bool active = false; bool active = false;
/* If the command parser is not enabled, report 0 - unsupported */ /* If the command parser is not enabled, report 0 - unsupported */
for_each_engine(engine, dev_priv, id) { for_each_uabi_engine(engine, dev_priv) {
if (intel_engine_needs_cmd_parser(engine)) { if (intel_engine_needs_cmd_parser(engine)) {
active = true; active = true;
break; break;
......
...@@ -415,7 +415,6 @@ static int i915_interrupt_info(struct seq_file *m, void *data) ...@@ -415,7 +415,6 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int i, pipe; int i, pipe;
...@@ -618,7 +617,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data) ...@@ -618,7 +617,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
I915_READ(GEN11_GUNIT_CSME_INTR_MASK)); I915_READ(GEN11_GUNIT_CSME_INTR_MASK));
} else if (INTEL_GEN(dev_priv) >= 6) { } else if (INTEL_GEN(dev_priv) >= 6) {
for_each_engine(engine, dev_priv, id) { for_each_uabi_engine(engine, dev_priv) {
seq_printf(m, seq_printf(m,
"Graphics Interrupt mask (%s): %08x\n", "Graphics Interrupt mask (%s): %08x\n",
engine->name, ENGINE_READ(engine, RING_IMR)); engine->name, ENGINE_READ(engine, RING_IMR));
...@@ -1890,7 +1889,6 @@ static void i915_guc_client_info(struct seq_file *m, ...@@ -1890,7 +1889,6 @@ static void i915_guc_client_info(struct seq_file *m,
struct intel_guc_client *client) struct intel_guc_client *client)
{ {
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id;
u64 tot = 0; u64 tot = 0;
seq_printf(m, "\tPriority %d, GuC stage index: %u, PD offset 0x%x\n", seq_printf(m, "\tPriority %d, GuC stage index: %u, PD offset 0x%x\n",
...@@ -1898,8 +1896,8 @@ static void i915_guc_client_info(struct seq_file *m, ...@@ -1898,8 +1896,8 @@ static void i915_guc_client_info(struct seq_file *m,
seq_printf(m, "\tDoorbell id %d, offset: 0x%lx\n", seq_printf(m, "\tDoorbell id %d, offset: 0x%lx\n",
client->doorbell_id, client->doorbell_offset); client->doorbell_id, client->doorbell_offset);
for_each_engine(engine, dev_priv, id) { for_each_uabi_engine(engine, dev_priv) {
u64 submissions = client->submissions[id]; u64 submissions = client->submissions[engine->guc_id];
tot += submissions; tot += submissions;
seq_printf(m, "\tSubmissions: %llu %s\n", seq_printf(m, "\tSubmissions: %llu %s\n",
submissions, engine->name); submissions, engine->name);
...@@ -1939,7 +1937,6 @@ static int i915_guc_stage_pool(struct seq_file *m, void *data) ...@@ -1939,7 +1937,6 @@ static int i915_guc_stage_pool(struct seq_file *m, void *data)
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
const struct intel_guc *guc = &dev_priv->gt.uc.guc; const struct intel_guc *guc = &dev_priv->gt.uc.guc;
struct guc_stage_desc *desc = guc->stage_desc_pool_vaddr; struct guc_stage_desc *desc = guc->stage_desc_pool_vaddr;
intel_engine_mask_t tmp;
int index; int index;
if (!USES_GUC_SUBMISSION(dev_priv)) if (!USES_GUC_SUBMISSION(dev_priv))
...@@ -1968,7 +1965,7 @@ static int i915_guc_stage_pool(struct seq_file *m, void *data) ...@@ -1968,7 +1965,7 @@ static int i915_guc_stage_pool(struct seq_file *m, void *data)
desc->wq_addr, desc->wq_size); desc->wq_addr, desc->wq_size);
seq_putc(m, '\n'); seq_putc(m, '\n');
for_each_engine(engine, dev_priv, tmp) { for_each_uabi_engine(engine, dev_priv) {
u32 guc_engine_id = engine->guc_id; u32 guc_engine_id = engine->guc_id;
struct guc_execlist_context *lrc = struct guc_execlist_context *lrc =
&desc->lrc[guc_engine_id]; &desc->lrc[guc_engine_id];
...@@ -2806,7 +2803,6 @@ static int i915_engine_info(struct seq_file *m, void *unused) ...@@ -2806,7 +2803,6 @@ static int i915_engine_info(struct seq_file *m, void *unused)
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
enum intel_engine_id id;
struct drm_printer p; struct drm_printer p;
wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm); wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
...@@ -2818,7 +2814,7 @@ static int i915_engine_info(struct seq_file *m, void *unused) ...@@ -2818,7 +2814,7 @@ static int i915_engine_info(struct seq_file *m, void *unused)
RUNTIME_INFO(dev_priv)->cs_timestamp_frequency_khz); RUNTIME_INFO(dev_priv)->cs_timestamp_frequency_khz);
p = drm_seq_file_printer(m); p = drm_seq_file_printer(m);
for_each_engine(engine, dev_priv, id) for_each_uabi_engine(engine, dev_priv)
intel_engine_dump(engine, &p, "%s\n", engine->name); intel_engine_dump(engine, &p, "%s\n", engine->name);
intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref); intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
...@@ -2899,9 +2895,8 @@ static int i915_wa_registers(struct seq_file *m, void *unused) ...@@ -2899,9 +2895,8 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
{ {
struct drm_i915_private *i915 = node_to_i915(m->private); struct drm_i915_private *i915 = node_to_i915(m->private);
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id;
for_each_engine(engine, i915, id) { for_each_uabi_engine(engine, i915) {
const struct i915_wa_list *wal = &engine->ctx_wa_list; const struct i915_wa_list *wal = &engine->ctx_wa_list;
const struct i915_wa *wa; const struct i915_wa *wa;
unsigned int count; unsigned int count;
......
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
#include "gem/i915_gem_context.h" #include "gem/i915_gem_context.h"
#include "gem/i915_gem_ioctls.h" #include "gem/i915_gem_ioctls.h"
#include "gt/intel_engine_user.h"
#include "gt/intel_gt.h" #include "gt/intel_gt.h"
#include "gt/intel_gt_pm.h" #include "gt/intel_gt_pm.h"
#include "gt/intel_reset.h" #include "gt/intel_reset.h"
......
...@@ -1376,11 +1376,12 @@ struct drm_i915_private { ...@@ -1376,11 +1376,12 @@ struct drm_i915_private {
wait_queue_head_t gmbus_wait_queue; wait_queue_head_t gmbus_wait_queue;
struct pci_dev *bridge_dev; struct pci_dev *bridge_dev;
struct intel_engine_cs *engine[I915_NUM_ENGINES];
/* Context used internally to idle the GPU and setup initial state */ /* Context used internally to idle the GPU and setup initial state */
struct i915_gem_context *kernel_context; struct i915_gem_context *kernel_context;
struct intel_engine_cs *engine_class[MAX_ENGINE_CLASS + 1]
[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *engine[I915_NUM_ENGINES];
struct rb_root uabi_engines;
struct resource mch_res; struct resource mch_res;
...@@ -1924,6 +1925,14 @@ static inline struct drm_i915_private *wopcm_to_i915(struct intel_wopcm *wopcm) ...@@ -1924,6 +1925,14 @@ static inline struct drm_i915_private *wopcm_to_i915(struct intel_wopcm *wopcm)
((engine__) = (dev_priv__)->engine[__mask_next_bit(tmp__)]), 1 : \ ((engine__) = (dev_priv__)->engine[__mask_next_bit(tmp__)]), 1 : \
0;) 0;)
#define rb_to_uabi_engine(rb) \
rb_entry_safe(rb, struct intel_engine_cs, uabi_node)
#define for_each_uabi_engine(engine__, i915__) \
for ((engine__) = rb_to_uabi_engine(rb_first(&(i915__)->uabi_engines));\
(engine__); \
(engine__) = rb_to_uabi_engine(rb_next(&(engine__)->uabi_node)))
enum hdmi_force_audio { enum hdmi_force_audio {
HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */ HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */
HDMI_AUDIO_OFF, /* force turn off HDMI audio */ HDMI_AUDIO_OFF, /* force turn off HDMI audio */
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include "gem/i915_gem_ioctls.h" #include "gem/i915_gem_ioctls.h"
#include "gem/i915_gem_pm.h" #include "gem/i915_gem_pm.h"
#include "gem/i915_gemfs.h" #include "gem/i915_gemfs.h"
#include "gt/intel_engine_user.h"
#include "gt/intel_gt.h" #include "gt/intel_gt.h"
#include "gt/intel_gt_pm.h" #include "gt/intel_gt_pm.h"
#include "gt/intel_mocs.h" #include "gt/intel_mocs.h"
...@@ -1359,24 +1360,6 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915) ...@@ -1359,24 +1360,6 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915)
i915_gem_object_unpin_map(engine->default_state); i915_gem_object_unpin_map(engine->default_state);
} }
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) {
unsigned int found = intel_engines_has_context_isolation(i915);
/*
* Make sure that classes with multiple engine instances all
* share the same basic configuration.
*/
for_each_engine(engine, i915, id) {
unsigned int bit = BIT(engine->uabi_class);
unsigned int expected = engine->default_state ? bit : 0;
if ((found & bit) != expected) {
DRM_ERROR("mismatching default context state for class %d on engine %s\n",
engine->uabi_class, engine->name);
}
}
}
out_ctx: out_ctx:
i915_gem_context_unlock_engines(ctx); i915_gem_context_unlock_engines(ctx);
i915_gem_context_set_closed(ctx); i915_gem_context_set_closed(ctx);
...@@ -1600,7 +1583,8 @@ int i915_gem_init(struct drm_i915_private *dev_priv) ...@@ -1600,7 +1583,8 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
void i915_gem_driver_register(struct drm_i915_private *i915) void i915_gem_driver_register(struct drm_i915_private *i915)
{ {
i915_gem_driver_register__shrinker(i915); i915_gem_driver_register__shrinker(i915);
intel_engines_set_scheduler_caps(i915);
intel_engines_driver_register(i915);
} }
void i915_gem_driver_unregister(struct drm_i915_private *i915) void i915_gem_driver_unregister(struct drm_i915_private *i915)
......
...@@ -3251,7 +3251,7 @@ gen11_engine_irq_handler(struct intel_gt *gt, const u8 class, ...@@ -3251,7 +3251,7 @@ gen11_engine_irq_handler(struct intel_gt *gt, const u8 class,
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
if (instance <= MAX_ENGINE_INSTANCE) if (instance <= MAX_ENGINE_INSTANCE)
engine = gt->i915->engine_class[class][instance]; engine = gt->engine_class[class][instance];
else else
engine = NULL; engine = NULL;
......
...@@ -1875,7 +1875,6 @@ static int gen8_configure_all_contexts(struct drm_i915_private *i915, ...@@ -1875,7 +1875,6 @@ static int gen8_configure_all_contexts(struct drm_i915_private *i915,
#undef ctx_flexeuN #undef ctx_flexeuN
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
struct i915_gem_context *ctx; struct i915_gem_context *ctx;
enum intel_engine_id id;
int i; int i;
for (i = 2; i < ARRAY_SIZE(regs); i++) for (i = 2; i < ARRAY_SIZE(regs); i++)
...@@ -1915,7 +1914,7 @@ static int gen8_configure_all_contexts(struct drm_i915_private *i915, ...@@ -1915,7 +1914,7 @@ static int gen8_configure_all_contexts(struct drm_i915_private *i915,
* If we don't modify the kernel_context, we do not get events while * If we don't modify the kernel_context, we do not get events while
* idle. * idle.
*/ */
for_each_engine(engine, i915, id) { for_each_uabi_engine(engine, i915) {
struct intel_context *ce = engine->kernel_context; struct intel_context *ce = engine->kernel_context;
int err; int err;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "gt/intel_engine.h" #include "gt/intel_engine.h"
#include "gt/intel_engine_pm.h" #include "gt/intel_engine_pm.h"
#include "gt/intel_engine_user.h"
#include "gt/intel_gt_pm.h" #include "gt/intel_gt_pm.h"
#include "i915_drv.h" #include "i915_drv.h"
...@@ -860,7 +861,6 @@ create_event_attributes(struct i915_pmu *pmu) ...@@ -860,7 +861,6 @@ create_event_attributes(struct i915_pmu *pmu)
struct i915_ext_attribute *i915_attr = NULL, *i915_iter; struct i915_ext_attribute *i915_attr = NULL, *i915_iter;
struct attribute **attr = NULL, **attr_iter; struct attribute **attr = NULL, **attr_iter;
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id;
unsigned int i; unsigned int i;
/* Count how many counters we will be exposing. */ /* Count how many counters we will be exposing. */
...@@ -869,7 +869,7 @@ create_event_attributes(struct i915_pmu *pmu) ...@@ -869,7 +869,7 @@ create_event_attributes(struct i915_pmu *pmu)
count++; count++;
} }
for_each_engine(engine, i915, id) { for_each_uabi_engine(engine, i915) {
for (i = 0; i < ARRAY_SIZE(engine_events); i++) { for (i = 0; i < ARRAY_SIZE(engine_events); i++) {
if (!engine_event_status(engine, if (!engine_event_status(engine,
engine_events[i].sample)) engine_events[i].sample))
...@@ -920,7 +920,7 @@ create_event_attributes(struct i915_pmu *pmu) ...@@ -920,7 +920,7 @@ create_event_attributes(struct i915_pmu *pmu)
} }
/* Initialize supported engine counters. */ /* Initialize supported engine counters. */
for_each_engine(engine, i915, id) { for_each_uabi_engine(engine, i915) {
for (i = 0; i < ARRAY_SIZE(engine_events); i++) { for (i = 0; i < ARRAY_SIZE(engine_events); i++) {
char *str; char *str;
...@@ -937,7 +937,7 @@ create_event_attributes(struct i915_pmu *pmu) ...@@ -937,7 +937,7 @@ create_event_attributes(struct i915_pmu *pmu)
i915_iter = i915_iter =
add_i915_attr(i915_iter, str, add_i915_attr(i915_iter, str,
__I915_PMU_ENGINE(engine->uabi_class, __I915_PMU_ENGINE(engine->uabi_class,
engine->instance, engine->uabi_instance,
engine_events[i].sample)); engine_events[i].sample));
str = kasprintf(GFP_KERNEL, "%s-%s.unit", str = kasprintf(GFP_KERNEL, "%s-%s.unit",
......
...@@ -105,7 +105,6 @@ query_engine_info(struct drm_i915_private *i915, ...@@ -105,7 +105,6 @@ query_engine_info(struct drm_i915_private *i915,
struct drm_i915_query_engine_info query; struct drm_i915_query_engine_info query;
struct drm_i915_engine_info info = { }; struct drm_i915_engine_info info = { };
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id;
int len, ret; int len, ret;
if (query_item->flags) if (query_item->flags)
...@@ -125,9 +124,9 @@ query_engine_info(struct drm_i915_private *i915, ...@@ -125,9 +124,9 @@ query_engine_info(struct drm_i915_private *i915,
info_ptr = &query_ptr->engines[0]; info_ptr = &query_ptr->engines[0];
for_each_engine(engine, i915, id) { for_each_uabi_engine(engine, i915) {
info.engine.engine_class = engine->uabi_class; info.engine.engine_class = engine->uabi_class;
info.engine.engine_instance = engine->instance; info.engine.engine_instance = engine->uabi_instance;
info.capabilities = engine->uabi_capabilities; info.capabilities = engine->uabi_capabilities;
if (__copy_to_user(info_ptr, &info, sizeof(info))) if (__copy_to_user(info_ptr, &info, sizeof(info)))
......
...@@ -677,7 +677,7 @@ TRACE_EVENT(i915_request_queue, ...@@ -677,7 +677,7 @@ TRACE_EVENT(i915_request_queue,
__entry->dev = rq->i915->drm.primary->index; __entry->dev = rq->i915->drm.primary->index;
__entry->hw_id = rq->gem_context->hw_id; __entry->hw_id = rq->gem_context->hw_id;
__entry->class = rq->engine->uabi_class; __entry->class = rq->engine->uabi_class;
__entry->instance = rq->engine->instance; __entry->instance = rq->engine->uabi_instance;
__entry->ctx = rq->fence.context; __entry->ctx = rq->fence.context;
__entry->seqno = rq->fence.seqno; __entry->seqno = rq->fence.seqno;
__entry->flags = flags; __entry->flags = flags;
...@@ -706,7 +706,7 @@ DECLARE_EVENT_CLASS(i915_request, ...@@ -706,7 +706,7 @@ DECLARE_EVENT_CLASS(i915_request,
__entry->dev = rq->i915->drm.primary->index; __entry->dev = rq->i915->drm.primary->index;
__entry->hw_id = rq->gem_context->hw_id; __entry->hw_id = rq->gem_context->hw_id;
__entry->class = rq->engine->uabi_class; __entry->class = rq->engine->uabi_class;
__entry->instance = rq->engine->instance; __entry->instance = rq->engine->uabi_instance;
__entry->ctx = rq->fence.context; __entry->ctx = rq->fence.context;
__entry->seqno = rq->fence.seqno; __entry->seqno = rq->fence.seqno;
), ),
...@@ -751,7 +751,7 @@ TRACE_EVENT(i915_request_in, ...@@ -751,7 +751,7 @@ TRACE_EVENT(i915_request_in,
__entry->dev = rq->i915->drm.primary->index; __entry->dev = rq->i915->drm.primary->index;
__entry->hw_id = rq->gem_context->hw_id; __entry->hw_id = rq->gem_context->hw_id;
__entry->class = rq->engine->uabi_class; __entry->class = rq->engine->uabi_class;
__entry->instance = rq->engine->instance; __entry->instance = rq->engine->uabi_instance;
__entry->ctx = rq->fence.context; __entry->ctx = rq->fence.context;
__entry->seqno = rq->fence.seqno; __entry->seqno = rq->fence.seqno;
__entry->prio = rq->sched.attr.priority; __entry->prio = rq->sched.attr.priority;
...@@ -782,7 +782,7 @@ TRACE_EVENT(i915_request_out, ...@@ -782,7 +782,7 @@ TRACE_EVENT(i915_request_out,
__entry->dev = rq->i915->drm.primary->index; __entry->dev = rq->i915->drm.primary->index;
__entry->hw_id = rq->gem_context->hw_id; __entry->hw_id = rq->gem_context->hw_id;
__entry->class = rq->engine->uabi_class; __entry->class = rq->engine->uabi_class;
__entry->instance = rq->engine->instance; __entry->instance = rq->engine->uabi_instance;
__entry->ctx = rq->fence.context; __entry->ctx = rq->fence.context;
__entry->seqno = rq->fence.seqno; __entry->seqno = rq->fence.seqno;
__entry->completed = i915_request_completed(rq); __entry->completed = i915_request_completed(rq);
...@@ -847,7 +847,7 @@ TRACE_EVENT(i915_request_wait_begin, ...@@ -847,7 +847,7 @@ TRACE_EVENT(i915_request_wait_begin,
__entry->dev = rq->i915->drm.primary->index; __entry->dev = rq->i915->drm.primary->index;
__entry->hw_id = rq->gem_context->hw_id; __entry->hw_id = rq->gem_context->hw_id;
__entry->class = rq->engine->uabi_class; __entry->class = rq->engine->uabi_class;
__entry->instance = rq->engine->instance; __entry->instance = rq->engine->uabi_instance;
__entry->ctx = rq->fence.context; __entry->ctx = rq->fence.context;
__entry->seqno = rq->fence.seqno; __entry->seqno = rq->fence.seqno;
__entry->flags = flags; __entry->flags = flags;
......
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