diff --git a/drivers/gpu/drm/xe/tests/xe_rtp_test.c b/drivers/gpu/drm/xe/tests/xe_rtp_test.c index b3eab1337b0c..f56f005dbd98 100644 --- a/drivers/gpu/drm/xe/tests/xe_rtp_test.c +++ b/drivers/gpu/drm/xe/tests/xe_rtp_test.c @@ -195,11 +195,49 @@ static const struct rtp_rules_test_case rtp_rules_cases[] = { XE_RTP_RULES(OR), }, { - .name = "or-anything", - .expected_match = false, + .name = "or-yes", + .expected_match = true, .expected_err = -EINVAL, XE_RTP_RULES(OR, FUNC(match_yes)), }, + { + .name = "or-no", + .expected_match = false, + .expected_err = -EINVAL, + XE_RTP_RULES(OR, FUNC(match_no)), + }, + { + .name = "yes-or", + .expected_match = true, + /* FIXME: The parser should raise an error here. */ + .expected_err = 0, + XE_RTP_RULES(FUNC(match_yes), OR), + }, + { + .name = "no-or", + .expected_match = false, + .expected_err = -EINVAL, + XE_RTP_RULES(FUNC(match_no), OR), + }, + { + .name = "no-or-or-yes", + .expected_match = true, + .expected_err = -EINVAL, + XE_RTP_RULES(FUNC(match_no), OR, OR, FUNC(match_yes)), + }, + { + .name = "yes-or-or-no", + .expected_match = true, + /* FIXME: The parser should raise an error here. */ + .expected_err = 0, + XE_RTP_RULES(FUNC(match_yes), OR, OR, FUNC(match_no)), + }, + { + .name = "no-or-or-no", + .expected_match = false, + .expected_err = -EINVAL, + XE_RTP_RULES(FUNC(match_no), OR, OR, FUNC(match_no)), + }, }; 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 0e1adf07e4e7..299fa4209a26 100644 --- a/drivers/gpu/drm/xe/xe_rtp.c +++ b/drivers/gpu/drm/xe/xe_rtp.c @@ -47,12 +47,18 @@ static bool rule_matches_with_err(const struct xe_device *xe, for (r = rules, i = 0; i < n_rules; r = &rules[++i]) { switch (r->match_type) { case XE_RTP_MATCH_OR: + if (drm_WARN_ON(&xe->drm, !rcount)) { + if (err) + *err = -EINVAL; + continue; + } + /* - * This is only reached if a complete set of - * rules passed or none were evaluated. For both cases, - * shortcut the other rules and return the proper value. + * This is only reached if a complete conjunction of + * rules passed, in which case we shortcut the other + * rules and return true. */ - goto done; + return true; case XE_RTP_MATCH_PLATFORM: match = xe->info.platform == r->platform; break; @@ -169,7 +175,6 @@ static bool rule_matches_with_err(const struct xe_device *xe, } } -done: if (drm_WARN_ON(&xe->drm, !rcount)) goto error;