diff --git a/drivers/gpu/drm/xe/tests/xe_rtp_test.c b/drivers/gpu/drm/xe/tests/xe_rtp_test.c index f56f005dbd98..dfb15d81d799 100644 --- a/drivers/gpu/drm/xe/tests/xe_rtp_test.c +++ b/drivers/gpu/drm/xe/tests/xe_rtp_test.c @@ -238,6 +238,34 @@ static const struct rtp_rules_test_case rtp_rules_cases[] = { .expected_err = -EINVAL, XE_RTP_RULES(FUNC(match_no), OR, OR, FUNC(match_no)), }, + + /* No match because hwe is NULL. */ + { + .name = "missing-context-engine-class", + .expected_match = false, + XE_RTP_RULES(ENGINE_CLASS(RENDER)), + }, + + /* + * Missing context (hwe==NULL) does not cause parsing to stop, hence we + * expect a match. + */ + { + .name = "missing-context-engine-class-or-yes", + .expected_match = true, + XE_RTP_RULES(ENGINE_CLASS(RENDER), OR, FUNC(match_yes)), + }, + + /* + * Missing context (hwe==NULL) does not cause parsing to stop, hence we + * expect a syntax error. + */ + { + .name = "missing-context-engine-class-or-or-yes", + .expected_match = true, + .expected_err = -EINVAL, + XE_RTP_RULES(ENGINE_CLASS(RENDER), OR, OR, FUNC(match_yes)), + }, }; static void xe_rtp_rules_tests(struct kunit *test) diff --git a/drivers/gpu/drm/xe/xe_rtp.c b/drivers/gpu/drm/xe/xe_rtp.c index 299fa4209a26..df72b456ab16 100644 --- a/drivers/gpu/drm/xe/xe_rtp.c +++ b/drivers/gpu/drm/xe/xe_rtp.c @@ -67,67 +67,85 @@ static bool rule_matches_with_err(const struct xe_device *xe, xe->info.subplatform == r->subplatform; break; case XE_RTP_MATCH_PLATFORM_STEP: - if (drm_WARN_ON(&xe->drm, xe->info.step.platform == STEP_NONE)) - goto error; + if (drm_WARN_ON(&xe->drm, xe->info.step.platform == STEP_NONE)) { + match = false; + break; + } match = xe->info.step.platform >= r->step_start && xe->info.step.platform < r->step_end; break; case XE_RTP_MATCH_GRAPHICS_VERSION: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.graphics_verx100 == r->ver_start && (!has_samedia(xe) || !xe_gt_is_media_type(gt)); break; case XE_RTP_MATCH_GRAPHICS_VERSION_RANGE: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.graphics_verx100 >= r->ver_start && xe->info.graphics_verx100 <= r->ver_end && (!has_samedia(xe) || !xe_gt_is_media_type(gt)); break; case XE_RTP_MATCH_GRAPHICS_VERSION_ANY_GT: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.graphics_verx100 == r->ver_start; break; case XE_RTP_MATCH_GRAPHICS_STEP: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.step.graphics >= r->step_start && xe->info.step.graphics < r->step_end && (!has_samedia(xe) || !xe_gt_is_media_type(gt)); break; case XE_RTP_MATCH_MEDIA_VERSION: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.media_verx100 == r->ver_start && (!has_samedia(xe) || xe_gt_is_media_type(gt)); break; case XE_RTP_MATCH_MEDIA_VERSION_RANGE: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.media_verx100 >= r->ver_start && xe->info.media_verx100 <= r->ver_end && (!has_samedia(xe) || xe_gt_is_media_type(gt)); break; case XE_RTP_MATCH_MEDIA_STEP: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.step.media >= r->step_start && xe->info.step.media < r->step_end && (!has_samedia(xe) || xe_gt_is_media_type(gt)); break; case XE_RTP_MATCH_MEDIA_VERSION_ANY_GT: - if (drm_WARN_ON(&xe->drm, !gt)) - goto error; + if (drm_WARN_ON(&xe->drm, !gt)) { + match = false; + break; + } match = xe->info.media_verx100 == r->ver_start; break; @@ -138,14 +156,18 @@ static bool rule_matches_with_err(const struct xe_device *xe, match = xe->info.is_dgfx; break; case XE_RTP_MATCH_ENGINE_CLASS: - if (drm_WARN_ON(&xe->drm, !hwe)) - goto error; + if (drm_WARN_ON(&xe->drm, !hwe)) { + match = false; + break; + } match = hwe->class == r->engine_class; break; case XE_RTP_MATCH_NOT_ENGINE_CLASS: - if (drm_WARN_ON(&xe->drm, !hwe)) - goto error; + if (drm_WARN_ON(&xe->drm, !hwe)) { + match = false; + break; + } match = hwe->class != r->engine_class; break;