// SPDX-License-Identifier: GPL-2.0 /* * Kunit test for drm_hdmi_state_helper functions */ #include <drm/drm_atomic.h> #include <drm/drm_atomic_state_helper.h> #include <drm/drm_atomic_uapi.h> #include <drm/drm_drv.h> #include <drm/drm_edid.h> #include <drm/drm_connector.h> #include <drm/drm_fourcc.h> #include <drm/drm_kunit_helpers.h> #include <drm/drm_managed.h> #include <drm/drm_modeset_helper_vtables.h> #include <drm/drm_print.h> #include <drm/drm_probe_helper.h> #include <drm/display/drm_hdmi_helper.h> #include <drm/display/drm_hdmi_state_helper.h> #include "../drm_crtc_internal.h" #include <kunit/test.h> #include "drm_kunit_edid.h" struct drm_atomic_helper_connector_hdmi_priv { … }; #define connector_to_priv(c) … static struct drm_display_mode *find_preferred_mode(struct drm_connector *connector) { … } static int light_up_connector(struct kunit *test, struct drm_device *drm, struct drm_crtc *crtc, struct drm_connector *connector, struct drm_display_mode *mode, struct drm_modeset_acquire_ctx *ctx) { … } static int set_connector_edid(struct kunit *test, struct drm_connector *connector, const char *edid, size_t edid_len) { … } static const struct drm_connector_hdmi_funcs dummy_connector_hdmi_funcs = …; static enum drm_mode_status reject_connector_tmds_char_rate_valid(const struct drm_connector *connector, const struct drm_display_mode *mode, unsigned long long tmds_rate) { … } static const struct drm_connector_hdmi_funcs reject_connector_hdmi_funcs = …; static int dummy_connector_get_modes(struct drm_connector *connector) { … } static const struct drm_connector_helper_funcs dummy_connector_helper_funcs = …; static void dummy_hdmi_connector_reset(struct drm_connector *connector) { … } static const struct drm_connector_funcs dummy_connector_funcs = …; static struct drm_atomic_helper_connector_hdmi_priv * drm_atomic_helper_connector_hdmi_init(struct kunit *test, unsigned int formats, unsigned int max_bpc) { … } /* * Test that if we change the RGB quantization property to a different * value, we trigger a mode change on the connector's CRTC, which will * in turn disable/enable the connector. */ static void drm_test_check_broadcast_rgb_crtc_mode_changed(struct kunit *test) { … } /* * Test that if we set the RGB quantization property to the same value, * we don't trigger a mode change on the connector's CRTC and leave the * connector unaffected. */ static void drm_test_check_broadcast_rgb_crtc_mode_not_changed(struct kunit *test) { … } /* * Test that for an HDMI connector, with an HDMI monitor, if the * Broadcast RGB property is set to auto with a mode that isn't the * VIC-1 mode, we will get a limited RGB Quantization Range. */ static void drm_test_check_broadcast_rgb_auto_cea_mode(struct kunit *test) { … } /* * Test that for an HDMI connector, with an HDMI monitor, if the * Broadcast RGB property is set to auto with a VIC-1 mode, we will get * a full RGB Quantization Range. */ static void drm_test_check_broadcast_rgb_auto_cea_mode_vic_1(struct kunit *test) { … } /* * Test that for an HDMI connector, with an HDMI monitor, if the * Broadcast RGB property is set to full with a mode that isn't the * VIC-1 mode, we will get a full RGB Quantization Range. */ static void drm_test_check_broadcast_rgb_full_cea_mode(struct kunit *test) { … } /* * Test that for an HDMI connector, with an HDMI monitor, if the * Broadcast RGB property is set to full with a VIC-1 mode, we will get * a full RGB Quantization Range. */ static void drm_test_check_broadcast_rgb_full_cea_mode_vic_1(struct kunit *test) { … } /* * Test that for an HDMI connector, with an HDMI monitor, if the * Broadcast RGB property is set to limited with a mode that isn't the * VIC-1 mode, we will get a limited RGB Quantization Range. */ static void drm_test_check_broadcast_rgb_limited_cea_mode(struct kunit *test) { … } /* * Test that for an HDMI connector, with an HDMI monitor, if the * Broadcast RGB property is set to limited with a VIC-1 mode, we will * get a limited RGB Quantization Range. */ static void drm_test_check_broadcast_rgb_limited_cea_mode_vic_1(struct kunit *test) { … } /* * Test that if we change the maximum bpc property to a different value, * we trigger a mode change on the connector's CRTC, which will in turn * disable/enable the connector. */ static void drm_test_check_output_bpc_crtc_mode_changed(struct kunit *test) { … } /* * Test that if we set the output bpc property to the same value, we * don't trigger a mode change on the connector's CRTC and leave the * connector unaffected. */ static void drm_test_check_output_bpc_crtc_mode_not_changed(struct kunit *test) { … } /* * Test that if we have an HDMI connector but a !HDMI display, we always * output RGB with 8 bpc. */ static void drm_test_check_output_bpc_dvi(struct kunit *test) { … } /* * Test that when doing a commit which would use RGB 8bpc, the TMDS * clock rate stored in the connector state is equal to the mode clock */ static void drm_test_check_tmds_char_rate_rgb_8bpc(struct kunit *test) { … } /* * Test that when doing a commit which would use RGB 10bpc, the TMDS * clock rate stored in the connector state is equal to 1.25 times the * mode pixel clock */ static void drm_test_check_tmds_char_rate_rgb_10bpc(struct kunit *test) { … } /* * Test that when doing a commit which would use RGB 12bpc, the TMDS * clock rate stored in the connector state is equal to 1.5 times the * mode pixel clock */ static void drm_test_check_tmds_char_rate_rgb_12bpc(struct kunit *test) { … } /* * Test that if we filter a rate through our hook, it's indeed rejected * by the whole atomic_check logic. * * We do so by first doing a commit on the pipeline to make sure that it * works, change the HDMI helpers pointer, and then try the same commit * again to see if it fails as it should. */ static void drm_test_check_hdmi_funcs_reject_rate(struct kunit *test) { … } /* * Test that if: * - We have an HDMI connector supporting RGB only * - The chosen mode has a TMDS character rate higher than the display * supports in RGB/12bpc * - The chosen mode has a TMDS character rate lower than the display * supports in RGB/10bpc. * * Then we will pick the latter, and the computed TMDS character rate * will be equal to 1.25 times the mode pixel clock. */ static void drm_test_check_max_tmds_rate_bpc_fallback(struct kunit *test) { … } /* * Test that if: * - We have an HDMI connector supporting both RGB and YUV422 and up to * 12 bpc * - The chosen mode has a TMDS character rate higher than the display * supports in RGB/12bpc but lower than the display supports in * RGB/10bpc * - The chosen mode has a TMDS character rate lower than the display * supports in YUV422/12bpc. * * Then we will prefer to keep the RGB format with a lower bpc over * picking YUV422. */ static void drm_test_check_max_tmds_rate_format_fallback(struct kunit *test) { … } /* * Test that if a driver and screen supports RGB and YUV formats, and we * try to set the VIC 1 mode, we end up with 8bpc RGB even if we could * have had a higher bpc. */ static void drm_test_check_output_bpc_format_vic_1(struct kunit *test) { … } /* * Test that if a driver supports only RGB but the screen also supports * YUV formats, we only end up with an RGB format. */ static void drm_test_check_output_bpc_format_driver_rgb_only(struct kunit *test) { … } /* * Test that if a screen supports only RGB but the driver also supports * YUV formats, we only end up with an RGB format. */ static void drm_test_check_output_bpc_format_display_rgb_only(struct kunit *test) { … } /* * Test that if a display supports higher bpc but the driver only * supports 8 bpc, we only end up with 8 bpc even if we could have had a * higher bpc. */ static void drm_test_check_output_bpc_format_driver_8bpc_only(struct kunit *test) { … } /* * Test that if a driver supports higher bpc but the display only * supports 8 bpc, we only end up with 8 bpc even if we could have had a * higher bpc. */ static void drm_test_check_output_bpc_format_display_8bpc_only(struct kunit *test) { … } static struct kunit_case drm_atomic_helper_connector_hdmi_check_tests[] = …; static struct kunit_suite drm_atomic_helper_connector_hdmi_check_test_suite = …; /* * Test that the value of the Broadcast RGB property out of reset is set * to auto. */ static void drm_test_check_broadcast_rgb_value(struct kunit *test) { … } /* * Test that if the connector was initialised with a maximum bpc of 8, * the value of the max_bpc and max_requested_bpc properties out of * reset are also set to 8, and output_bpc is set to 0 and will be * filled at atomic_check time. */ static void drm_test_check_bpc_8_value(struct kunit *test) { … } /* * Test that if the connector was initialised with a maximum bpc of 10, * the value of the max_bpc and max_requested_bpc properties out of * reset are also set to 10, and output_bpc is set to 0 and will be * filled at atomic_check time. */ static void drm_test_check_bpc_10_value(struct kunit *test) { … } /* * Test that if the connector was initialised with a maximum bpc of 12, * the value of the max_bpc and max_requested_bpc properties out of * reset are also set to 12, and output_bpc is set to 0 and will be * filled at atomic_check time. */ static void drm_test_check_bpc_12_value(struct kunit *test) { … } /* * Test that the value of the output format property out of reset is set * to RGB, even if the driver supports more than that. */ static void drm_test_check_format_value(struct kunit *test) { … } /* * Test that the value of the output format property out of reset is set * to 0, and will be computed at atomic_check time. */ static void drm_test_check_tmds_char_value(struct kunit *test) { … } static struct kunit_case drm_atomic_helper_connector_hdmi_reset_tests[] = …; static struct kunit_suite drm_atomic_helper_connector_hdmi_reset_test_suite = …; kunit_test_suites(…); MODULE_AUTHOR(…) …; MODULE_DESCRIPTION(…) …; MODULE_LICENSE(…) …;