Commit 67a64e51 authored by Chris Wilson's avatar Chris Wilson

drm/i915/selftests: Refactor sibling selection

Tvrtko spotted that some selftests were using 'break' not 'continue',
which will fail for discontiguous engine layouts such as on Icelake
(which may have vcs0 and vcs2).
Reported-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200518102911.3463-1-chris@chris-wilson.co.uk
parent 993fa32e
...@@ -3600,13 +3600,30 @@ static int nop_virtual_engine(struct intel_gt *gt, ...@@ -3600,13 +3600,30 @@ static int nop_virtual_engine(struct intel_gt *gt,
return err; return err;
} }
static unsigned int select_siblings(struct intel_gt *gt,
unsigned int class,
struct intel_engine_cs **siblings)
{
unsigned int n = 0;
unsigned int inst;
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!gt->engine_class[class][inst])
continue;
siblings[n++] = gt->engine_class[class][inst];
}
return n;
}
static int live_virtual_engine(void *arg) static int live_virtual_engine(void *arg)
{ {
struct intel_gt *gt = arg; struct intel_gt *gt = 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;
enum intel_engine_id id; enum intel_engine_id id;
unsigned int class, inst; unsigned int class;
int err; int err;
if (intel_uc_uses_guc_submission(&gt->uc)) if (intel_uc_uses_guc_submission(&gt->uc))
...@@ -3624,13 +3641,7 @@ static int live_virtual_engine(void *arg) ...@@ -3624,13 +3641,7 @@ static int live_virtual_engine(void *arg)
for (class = 0; class <= MAX_ENGINE_CLASS; class++) { for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
int nsibling, n; int nsibling, n;
nsibling = 0; nsibling = select_siblings(gt, class, siblings);
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!gt->engine_class[class][inst])
continue;
siblings[nsibling++] = gt->engine_class[class][inst];
}
if (nsibling < 2) if (nsibling < 2)
continue; continue;
...@@ -3739,7 +3750,7 @@ static int live_virtual_mask(void *arg) ...@@ -3739,7 +3750,7 @@ static int live_virtual_mask(void *arg)
{ {
struct intel_gt *gt = arg; struct intel_gt *gt = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
unsigned int class, inst; unsigned int class;
int err; int err;
if (intel_uc_uses_guc_submission(&gt->uc)) if (intel_uc_uses_guc_submission(&gt->uc))
...@@ -3748,13 +3759,7 @@ static int live_virtual_mask(void *arg) ...@@ -3748,13 +3759,7 @@ static int live_virtual_mask(void *arg)
for (class = 0; class <= MAX_ENGINE_CLASS; class++) { for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
unsigned int nsibling; unsigned int nsibling;
nsibling = 0; nsibling = select_siblings(gt, class, siblings);
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!gt->engine_class[class][inst])
break;
siblings[nsibling++] = gt->engine_class[class][inst];
}
if (nsibling < 2) if (nsibling < 2)
continue; continue;
...@@ -3876,7 +3881,7 @@ static int live_virtual_preserved(void *arg) ...@@ -3876,7 +3881,7 @@ static int live_virtual_preserved(void *arg)
{ {
struct intel_gt *gt = arg; struct intel_gt *gt = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
unsigned int class, inst; unsigned int class;
/* /*
* Check that the context image retains non-privileged (user) registers * Check that the context image retains non-privileged (user) registers
...@@ -3894,13 +3899,7 @@ static int live_virtual_preserved(void *arg) ...@@ -3894,13 +3899,7 @@ static int live_virtual_preserved(void *arg)
for (class = 0; class <= MAX_ENGINE_CLASS; class++) { for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
int nsibling, err; int nsibling, err;
nsibling = 0; nsibling = select_siblings(gt, class, siblings);
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!gt->engine_class[class][inst])
continue;
siblings[nsibling++] = gt->engine_class[class][inst];
}
if (nsibling < 2) if (nsibling < 2)
continue; continue;
...@@ -4111,7 +4110,7 @@ static int live_virtual_bond(void *arg) ...@@ -4111,7 +4110,7 @@ static int live_virtual_bond(void *arg)
}; };
struct intel_gt *gt = arg; struct intel_gt *gt = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
unsigned int class, inst; unsigned int class;
int err; int err;
if (intel_uc_uses_guc_submission(&gt->uc)) if (intel_uc_uses_guc_submission(&gt->uc))
...@@ -4121,14 +4120,7 @@ static int live_virtual_bond(void *arg) ...@@ -4121,14 +4120,7 @@ static int live_virtual_bond(void *arg)
const struct phase *p; const struct phase *p;
int nsibling; int nsibling;
nsibling = 0; nsibling = select_siblings(gt, class, siblings);
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!gt->engine_class[class][inst])
break;
GEM_BUG_ON(nsibling == ARRAY_SIZE(siblings));
siblings[nsibling++] = gt->engine_class[class][inst];
}
if (nsibling < 2) if (nsibling < 2)
continue; continue;
...@@ -4266,7 +4258,7 @@ static int live_virtual_reset(void *arg) ...@@ -4266,7 +4258,7 @@ static int live_virtual_reset(void *arg)
{ {
struct intel_gt *gt = arg; struct intel_gt *gt = arg;
struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1]; struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
unsigned int class, inst; unsigned int class;
/* /*
* Check that we handle a reset event within a virtual engine. * Check that we handle a reset event within a virtual engine.
...@@ -4284,13 +4276,7 @@ static int live_virtual_reset(void *arg) ...@@ -4284,13 +4276,7 @@ static int live_virtual_reset(void *arg)
for (class = 0; class <= MAX_ENGINE_CLASS; class++) { for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
int nsibling, err; int nsibling, err;
nsibling = 0; nsibling = select_siblings(gt, class, siblings);
for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
if (!gt->engine_class[class][inst])
continue;
siblings[nsibling++] = gt->engine_class[class][inst];
}
if (nsibling < 2) if (nsibling < 2)
continue; continue;
......
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