On Sat, Jul 04, 2026 at 12:51:07PM +0200, Michał Grzelak wrote:
> On Wed, 1 Jul 2026, Imre Deak wrote:
> > Add a simple baseline test for DP link caps iteration using a fixed
> > standard DP configuration table. This provides a minimal validity check,
> > independent of more complex test setups, verifying the iterator returns
> > expected configurations in ascending and descending order.
> >
> > Signed-off-by: Imre Deak <[email protected]>
> > ---
> > .../i915/display/tests/intel_dp_link_test.c | 200 ++++++++++++++++++
> > 1 file changed, 200 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/tests/intel_dp_link_test.c
> > b/drivers/gpu/drm/i915/display/tests/intel_dp_link_test.c
> > index b77472e9bbe12..1dc5bf6888990 100644
> > --- a/drivers/gpu/drm/i915/display/tests/intel_dp_link_test.c
> > +++ b/drivers/gpu/drm/i915/display/tests/intel_dp_link_test.c
> > @@ -7,6 +7,7 @@
> >
> > #include <linux/compiler.h>
> > #include <linux/device.h>
> > +#include <linux/log2.h>
> > #include <linux/prandom.h>
> > #include <linux/random.h>
> >
> > @@ -20,6 +21,18 @@
> > #include "intel_dp_link_caps.h"
> > #include "intel_dp_link_training.h"
> >
> > +#define LINK_TEST_NUM_LANE_CONFIGS(__max_lane_count) \
> > + (ilog2(__max_lane_count) + 1)
> > +
> > +#define LINK_TEST_NUM_CONFIGS(__num_rates, __max_lane_count) \
> > + ((__num_rates) * LINK_TEST_NUM_LANE_CONFIGS(__max_lane_count))
> > +
> > +#define LINK_TEST_MAX_LANE_COUNT ((u32)4)
> > +#define LINK_TEST_MAX_CONFIGS
> > LINK_TEST_NUM_CONFIGS(DP_MAX_SUPPORTED_RATES, \
> > +
> > LINK_TEST_MAX_LANE_COUNT)
> > +
> > +#define LINK_TEST_NUM_RANDOM_ITERATIONS 50
> > +
> > struct test_ctx {
> > struct {
> > struct intel_display display;
> > @@ -38,7 +51,194 @@ struct test_ctx {
> > struct rnd_state rnd;
> > };
> >
> > +struct link_rate_set {
> > + const int *entries;
> > + int size;
> > +};
> > +
> > +struct link_config_set {
> > + struct intel_dp_link_config entries[LINK_TEST_MAX_CONFIGS];
> > + int size;
> > +};
> > +
> > +static const int standard_dp_link_rates[] = {
> > + 162000, 270000, 540000, 810000, 1000000, 1350000, 2000000
> > +};
> > +
> > +#define LINK_TEST_NUM_STANDARD_RATES (ARRAY_SIZE(standard_dp_link_rates))
> > +
> > +static const struct link_config_set standard_dp_link_configs[] = {
> > + [INTEL_DP_LINK_CAPS_ORDER_KEY_BW] = { /* MBps
> > PBN */
> > + .entries = {
> > + { .rate = 162000, .lane_count = 1 }, /* 162.0 3.00
> > */
> > + { .rate = 270000, .lane_count = 1 }, /* 270.0 5.00
> > */
> > + { .rate = 162000, .lane_count = 2 }, /* 324.0 6.00
> > */
> > + { .rate = 270000, .lane_count = 2 }, /* 540.0 10.00
> > */
> > + { .rate = 540000, .lane_count = 1 }, /* 540.0 10.00
> > */
> > + { .rate = 162000, .lane_count = 4 }, /* 648.0 12.00
> > */
> > + { .rate = 810000, .lane_count = 1 }, /* 810.0 15.00
> > */
> > + { .rate = 270000, .lane_count = 4 }, /* 1080.0 20.00
> > */
> > + { .rate = 540000, .lane_count = 2 }, /* 1080.0 20.00
> > */
> > + { .rate = 1000000, .lane_count = 1 }, /* 1208.9 22.39
> > */
> > + { .rate = 810000, .lane_count = 2 }, /* 1620.0 30.00
> > */
> > + { .rate = 1350000, .lane_count = 1 }, /* 1632.0 30.22
> > */
> > + { .rate = 540000, .lane_count = 4 }, /* 2160.0 40.00
> > */
> > + { .rate = 1000000, .lane_count = 2 }, /* 2417.8 44.77
> > */
> > + { .rate = 2000000, .lane_count = 1 }, /* 2417.8 44.77
> > */
> > + { .rate = 810000, .lane_count = 4 }, /* 3240.0 60.00
> > */
> > + { .rate = 1350000, .lane_count = 2 }, /* 3264.0 60.44
> > */
> > + { .rate = 1000000, .lane_count = 4 }, /* 4835.6 89.55
> > */
> > + { .rate = 2000000, .lane_count = 2 }, /* 4835.6 89.55
> > */
> > + { .rate = 1350000, .lane_count = 4 }, /* 6527.9 120.89
> > */
> > + { .rate = 2000000, .lane_count = 4 }, /* 9671.1 179.09
> > */
> > + },
> > + .size =
> > LINK_TEST_NUM_CONFIGS(ARRAY_SIZE(standard_dp_link_rates),
> > + LINK_TEST_MAX_LANE_COUNT),
> > + },
> > + [INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE] = {
> > + .entries = {
> > + { .rate = 162000, .lane_count = 1 },
> > + { .rate = 162000, .lane_count = 2 },
> > + { .rate = 162000, .lane_count = 4 },
> > +
> > + { .rate = 270000, .lane_count = 1 },
> > + { .rate = 270000, .lane_count = 2 },
> > + { .rate = 270000, .lane_count = 4 },
> > +
> > + { .rate = 540000, .lane_count = 1 },
> > + { .rate = 540000, .lane_count = 2 },
> > + { .rate = 540000, .lane_count = 4 },
> > +
> > + { .rate = 810000, .lane_count = 1 },
> > + { .rate = 810000, .lane_count = 2 },
> > + { .rate = 810000, .lane_count = 4 },
> > +
> > + { .rate = 1000000, .lane_count = 1 },
> > + { .rate = 1000000, .lane_count = 2 },
> > + { .rate = 1000000, .lane_count = 4 },
> > +
> > + { .rate = 1350000, .lane_count = 1 },
> > + { .rate = 1350000, .lane_count = 2 },
> > + { .rate = 1350000, .lane_count = 4 },
> > +
> > + { .rate = 2000000, .lane_count = 1 },
> > + { .rate = 2000000, .lane_count = 2 },
> > + { .rate = 2000000, .lane_count = 4 },
> > + },
> > + .size =
> > LINK_TEST_NUM_CONFIGS(ARRAY_SIZE(standard_dp_link_rates),
> > + LINK_TEST_MAX_LANE_COUNT),
> > + },
> > + [INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE] = {
> > + .entries = {
> > + { .rate = 162000, .lane_count = 1 },
> > + { .rate = 270000, .lane_count = 1 },
> > + { .rate = 540000, .lane_count = 1 },
> > + { .rate = 810000, .lane_count = 1 },
> > + { .rate = 1000000, .lane_count = 1 },
> > + { .rate = 1350000, .lane_count = 1 },
> > + { .rate = 2000000, .lane_count = 1 },
> > +
> > + { .rate = 162000, .lane_count = 2 },
> > + { .rate = 270000, .lane_count = 2 },
> > + { .rate = 540000, .lane_count = 2 },
> > + { .rate = 810000, .lane_count = 2 },
> > + { .rate = 1000000, .lane_count = 2 },
> > + { .rate = 1350000, .lane_count = 2 },
> > + { .rate = 2000000, .lane_count = 2 },
> > +
> > + { .rate = 162000, .lane_count = 4 },
> > + { .rate = 270000, .lane_count = 4 },
> > + { .rate = 540000, .lane_count = 4 },
> > + { .rate = 810000, .lane_count = 4 },
> > + { .rate = 1000000, .lane_count = 4 },
> > + { .rate = 1350000, .lane_count = 4 },
> > + { .rate = 2000000, .lane_count = 4 },
> > + },
> > + .size =
> > LINK_TEST_NUM_CONFIGS(ARRAY_SIZE(standard_dp_link_rates),
> > + LINK_TEST_MAX_LANE_COUNT),
> > + },
> > +};
> > +
> > +static bool link_configs_match(const struct intel_dp_link_config *a,
> > + const struct intel_dp_link_config *b)
> > +{
> > + return a->rate == b->rate && a->lane_count == b->lane_count;
>
> maybe: s/\<a\>/lc_a/ and s/\<b\>/lc_b/
It's customary to use a/b as pointers for two objects being compared in
simple functions like this.
>
> > +}
> > +
> > +static const struct intel_dp_link_caps_order config_orders[] = {
> > + {
> > + .key = INTEL_DP_LINK_CAPS_ORDER_KEY_BW,
> > + .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_ASC,
> > + }, {
> > + .key = INTEL_DP_LINK_CAPS_ORDER_KEY_BW,
> > + .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
> > + }, {
> > + .key = INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE,
> > + .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_ASC,
> > + }, {
> > + .key = INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE,
> > + .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
> > + }
> > +};
> > +
> > +static const struct link_config_set *
> > +link_caps_config_order_key_to_set(struct kunit *test, enum
> > intel_dp_link_caps_order_key key)
> > +{
> > + return &standard_dp_link_configs[key];
> > +}
> > +
> > +/*
> > + * TEST: Baseline with fixed reference table
> > + * -----------------------------------------
>
> Didn't find in other KUnit tests such header, but I think the info
> provided is valuable.
The header describes the group of tests added in this patch, similarly
to the two other group of tests added in the follow-up patches.
> Can we add it to the line below, something like:
>
> * Verify baseline link_caps config iterator using fixed standard DP config
> tables.
Not sure, to me the line below describes sufficiently what this test
group does.
> > + * Verify the link_caps config iterator using fixed standard DP config
> > tables.
> > + */
> > +static void baseline_test_for_order(struct kunit *test,
> > + struct intel_dp_link_caps *link_caps,
> > + struct intel_dp_link_caps_order
> > config_order)
> > +{
> > + struct test_ctx *ctx = test->priv;
> > + const struct link_config_set *config_set =
> > + link_caps_config_order_key_to_set(test, config_order.key);
> > + const struct intel_dp_link_caps_test_ops *ops = ctx->link_caps_ops;
> > + struct intel_dp_link_config iter_config;
> > + struct intel_dp_link_caps_iter iter;
> > + int pos = 0;
> > +
> > + ops->iter_start(&iter, link_caps, config_order,
> > INTEL_DP_LINK_CAPS_FILTER_ALL);
> > + for_each_dp_link_config(&iter, &iter_config) {
> > + int idx = pos;
> > +
> > + if (config_order.dir == INTEL_DP_LINK_CAPS_ORDER_DIR_DESC)
> > + idx = config_set->size - idx - 1;
> > +
> > + KUNIT_EXPECT_TRUE(test, link_configs_match(&iter_config,
> > +
> > &config_set->entries[idx]));
> > +
> > + pos++;
> > + }
> > + ops->iter_end(&iter);
> > +}
> > +
> > +static void intel_dp_link_caps_test_baseline(struct kunit *test)
> > +{
> > + struct test_ctx *ctx = test->priv;
> > + struct intel_dp_link_caps *link_caps = ctx->dev.dig_port.dp.link.caps;
> > + const struct intel_dp_link_caps_test_ops *ops =
> > + ctx->link_caps_ops;
> > + int i;
> > +
> > + ops->update(link_caps,
> > + standard_dp_link_rates, LINK_TEST_NUM_STANDARD_RATES,
> > + LINK_TEST_MAX_LANE_COUNT,
> > + true);
> > +
> > + for (i = 0; i < ARRAY_SIZE(config_orders); i++)
> > + baseline_test_for_order(test, link_caps, config_orders[i]);
> > +}
> > +
> > static struct kunit_case intel_dp_link_test_cases[] = {
> > + KUNIT_CASE(intel_dp_link_caps_test_baseline),
> > +
>
> looks like a superfluous newline.
The newline keeps the {} separate from test entry lines.
> With all that addressed:
>
> Reviewed-by: Michał Grzelak <[email protected]>
>
> BR,
> Michał
>
> > {}
> > };
> >
> > --
> > 2.49.1
> >
> >