Skip to content

Commit

Permalink
drm/tests: Add output bpc tests
Browse files Browse the repository at this point in the history
Now that we're tracking the output bpc count in the connector state,
let's add a few tests to make sure it works as expected.

Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Tested-by: Sui Jingfeng <sui.jingfeng@linux.dev>
Link: https://patchwork.freedesktop.org/patch/msgid/20240527-kms-hdmi-connector-state-v15-6-c5af16c3aae2@kernel.org
Signed-off-by: Maxime Ripard <mripard@kernel.org>
  • Loading branch information
Maxime Ripard committed May 28, 2024
1 parent c6d219f commit eb66d34
Show file tree
Hide file tree
Showing 5 changed files with 703 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/gpu/drm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ config DRM_KUNIT_TEST
depends on DRM && KUNIT && MMU
select DRM_BUDDY
select DRM_DISPLAY_DP_HELPER
select DRM_DISPLAY_HDMI_STATE_HELPER
select DRM_DISPLAY_HELPER
select DRM_EXEC
select DRM_EXPORT_FOR_TESTS if m
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/tests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ obj-$(CONFIG_DRM_KUNIT_TEST) += \
drm_format_test.o \
drm_framebuffer_test.o \
drm_gem_shmem_test.o \
drm_hdmi_state_helper_test.o \
drm_managed_test.o \
drm_mm_test.o \
drm_modes_test.o \
Expand Down
155 changes: 155 additions & 0 deletions drivers/gpu/drm/tests/drm_connector_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#include <kunit/test.h>

#include "../drm_crtc_internal.h"

struct drm_connector_init_priv {
struct drm_device drm;
struct drm_connector connector;
Expand Down Expand Up @@ -206,6 +208,154 @@ static void drm_test_connector_hdmi_init_null_ddc(struct kunit *test)
KUNIT_EXPECT_EQ(test, ret, 0);
}

/*
* Test that the registration of a connector with an invalid maximum bpc
* count fails.
*/
static void drm_test_connector_hdmi_init_bpc_invalid(struct kunit *test)
{
struct drm_connector_init_priv *priv = test->priv;
int ret;

ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector,
&dummy_funcs,
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
9);
KUNIT_EXPECT_LT(test, ret, 0);
}

/*
* Test that the registration of a connector with a null maximum bpc
* count fails.
*/
static void drm_test_connector_hdmi_init_bpc_null(struct kunit *test)
{
struct drm_connector_init_priv *priv = test->priv;
int ret;

ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector,
&dummy_funcs,
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
0);
KUNIT_EXPECT_LT(test, ret, 0);
}

/*
* Test that the registration of a connector with a maximum bpc count of
* 8 succeeds, registers the max bpc property, but doesn't register the
* HDR output metadata one.
*/
static void drm_test_connector_hdmi_init_bpc_8(struct kunit *test)
{
struct drm_connector_init_priv *priv = test->priv;
struct drm_connector_state *state;
struct drm_connector *connector = &priv->connector;
struct drm_property *prop;
uint64_t val;
int ret;

ret = drmm_connector_hdmi_init(&priv->drm, connector,
&dummy_funcs,
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
8);
KUNIT_EXPECT_EQ(test, ret, 0);

prop = connector->max_bpc_property;
KUNIT_ASSERT_NOT_NULL(test, prop);
KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id));

ret = drm_object_property_get_default_value(&connector->base, prop, &val);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, val, 8);

state = connector->state;
KUNIT_EXPECT_EQ(test, state->max_bpc, 8);
KUNIT_EXPECT_EQ(test, state->max_requested_bpc, 8);

prop = priv->drm.mode_config.hdr_output_metadata_property;
KUNIT_ASSERT_NOT_NULL(test, prop);
KUNIT_EXPECT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id));
}

/*
* Test that the registration of a connector with a maximum bpc count of
* 10 succeeds and registers the max bpc and HDR output metadata
* properties.
*/
static void drm_test_connector_hdmi_init_bpc_10(struct kunit *test)
{
struct drm_connector_init_priv *priv = test->priv;
struct drm_connector_state *state;
struct drm_connector *connector = &priv->connector;
struct drm_property *prop;
uint64_t val;
int ret;

ret = drmm_connector_hdmi_init(&priv->drm, connector,
&dummy_funcs,
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
10);
KUNIT_EXPECT_EQ(test, ret, 0);

prop = connector->max_bpc_property;
KUNIT_ASSERT_NOT_NULL(test, prop);
KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id));

ret = drm_object_property_get_default_value(&connector->base, prop, &val);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, val, 10);

state = connector->state;
KUNIT_EXPECT_EQ(test, state->max_bpc, 10);
KUNIT_EXPECT_EQ(test, state->max_requested_bpc, 10);

prop = priv->drm.mode_config.hdr_output_metadata_property;
KUNIT_ASSERT_NOT_NULL(test, prop);
KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id));
}

/*
* Test that the registration of a connector with a maximum bpc count of
* 12 succeeds and registers the max bpc and HDR output metadata
* properties.
*/
static void drm_test_connector_hdmi_init_bpc_12(struct kunit *test)
{
struct drm_connector_init_priv *priv = test->priv;
struct drm_connector_state *state;
struct drm_connector *connector = &priv->connector;
struct drm_property *prop;
uint64_t val;
int ret;

ret = drmm_connector_hdmi_init(&priv->drm, connector,
&dummy_funcs,
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
12);
KUNIT_EXPECT_EQ(test, ret, 0);

prop = connector->max_bpc_property;
KUNIT_ASSERT_NOT_NULL(test, prop);
KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id));

ret = drm_object_property_get_default_value(&connector->base, prop, &val);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, val, 12);

state = connector->state;
KUNIT_EXPECT_EQ(test, state->max_bpc, 12);
KUNIT_EXPECT_EQ(test, state->max_requested_bpc, 12);

prop = priv->drm.mode_config.hdr_output_metadata_property;
KUNIT_ASSERT_NOT_NULL(test, prop);
KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id));
}

/*
* Test that the registration of an HDMI connector with an HDMI
* connector type succeeds.
Expand Down Expand Up @@ -284,6 +434,11 @@ KUNIT_ARRAY_PARAM(drm_connector_hdmi_init_type_invalid,

static struct kunit_case drmm_connector_hdmi_init_tests[] = {
KUNIT_CASE(drm_test_connector_hdmi_init_valid),
KUNIT_CASE(drm_test_connector_hdmi_init_bpc_8),
KUNIT_CASE(drm_test_connector_hdmi_init_bpc_10),
KUNIT_CASE(drm_test_connector_hdmi_init_bpc_12),
KUNIT_CASE(drm_test_connector_hdmi_init_bpc_invalid),
KUNIT_CASE(drm_test_connector_hdmi_init_bpc_null),
KUNIT_CASE(drm_test_connector_hdmi_init_null_ddc),
KUNIT_CASE_PARAM(drm_test_connector_hdmi_init_type_valid,
drm_connector_hdmi_init_type_valid_gen_params),
Expand Down
Loading

0 comments on commit eb66d34

Please sign in to comment.