mirror of
https://github.com/torvalds/linux.git
synced 2026-05-02 13:32:40 -04:00
drm/xe/rtp: Allow to OR rules
Some workarounds started to depend on different set of conditions where
the action should be applied if any of them match. See e.g.
commit 24d0d98af1 ("drm/xe/xe2lpm: Fixup Wa_14020756599"). Add
XE_RTP_MATCH_OR that allows to implement a logical OR for the rules.
Normal precedence applies:
r1, r2, OR, r3
means
(r1 AND r2) OR r3
The check is shortcut as soon as a set of conditions match.
v2: Do not match on empty number of rules-other-than-OR evaluated
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240618050044.324454-4-lucas.demarchi@intel.com
This commit is contained in:
committed by
Matt Roper
parent
512660cd1f
commit
dc72c52a42
@@ -90,6 +90,59 @@ static const struct rtp_test_case cases[] = {
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "match-or",
|
||||
.expected_reg = REGULAR_REG1,
|
||||
.expected_set_bits = REG_BIT(0) | REG_BIT(1) | REG_BIT(2),
|
||||
.expected_clr_bits = REG_BIT(0) | REG_BIT(1) | REG_BIT(2),
|
||||
.expected_count = 1,
|
||||
.entries = (const struct xe_rtp_entry_sr[]) {
|
||||
{ XE_RTP_NAME("first"),
|
||||
XE_RTP_RULES(FUNC(match_yes), OR, FUNC(match_no)),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(0)))
|
||||
},
|
||||
{ XE_RTP_NAME("middle"),
|
||||
XE_RTP_RULES(FUNC(match_no), FUNC(match_no), OR,
|
||||
FUNC(match_yes), OR,
|
||||
FUNC(match_no)),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(1)))
|
||||
},
|
||||
{ XE_RTP_NAME("last"),
|
||||
XE_RTP_RULES(FUNC(match_no), OR, FUNC(match_yes)),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(2)))
|
||||
},
|
||||
{ XE_RTP_NAME("no-match"),
|
||||
XE_RTP_RULES(FUNC(match_no), OR, FUNC(match_no)),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(3)))
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "match-or-xfail",
|
||||
.expected_reg = REGULAR_REG1,
|
||||
.expected_count = 0,
|
||||
.entries = (const struct xe_rtp_entry_sr[]) {
|
||||
{ XE_RTP_NAME("leading-or"),
|
||||
XE_RTP_RULES(OR, FUNC(match_yes)),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(0)))
|
||||
},
|
||||
{ XE_RTP_NAME("trailing-or"),
|
||||
/*
|
||||
* First condition is match_no, otherwise the failure
|
||||
* wouldn't really trigger as RTP stops processing as
|
||||
* soon as it has a matching set of rules
|
||||
*/
|
||||
XE_RTP_RULES(FUNC(match_no), OR),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(1)))
|
||||
},
|
||||
{ XE_RTP_NAME("no-or-or-yes"),
|
||||
XE_RTP_RULES(FUNC(match_no), OR, OR, FUNC(match_yes)),
|
||||
XE_RTP_ACTIONS(SET(REGULAR_REG1, REG_BIT(2)))
|
||||
},
|
||||
{}
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "no-match-no-add-multiple-rules",
|
||||
.expected_reg = REGULAR_REG1,
|
||||
|
||||
Reference in New Issue
Block a user