[PATCH v2 00/41] drm: Analog TV Improvements

From: Maxime Ripard
Date: Mon Aug 29 2022 - 09:12:34 EST


Hi,

Here's a series aiming at improving the command line named modes support,
and more importantly how we deal with all the analog TV variants.

The named modes support were initially introduced to allow to specify the
analog TV mode to be used.

However, this was causing multiple issues:

* The mode name parsed on the command line was passed directly to the
driver, which had to figure out which mode it was suppose to match;

* Figuring that out wasn't really easy, since the video= argument or what
the userspace might not even have a name in the first place, but
instead could have passed a mode with the same timings;

* The fallback to matching on the timings was mostly working as long as
we were supporting one 525 lines (most likely NSTC) and one 625 lines
(PAL), but couldn't differentiate between two modes with the same
timings (NTSC vs PAL-M vs NSTC-J for example);

* There was also some overlap with the tv mode property registered by
drm_mode_create_tv_properties(), but named modes weren't interacting
with that property at all.

* Even though that property was generic, its possible values were
specific to each drivers, which made some generic support difficult.

Thus, I chose to tackle in multiple steps:

* A new TV norm property was introduced, with generic values, each driver
reporting through a bitmask what standard it supports to the userspace;

* This option was added to the command line parsing code to be able to
specify it on the kernel command line, and new atomic_check and reset
helpers were created to integrate properly into atomic KMS;

* The named mode parsing code is now creating a proper display mode for
the given named mode, and the TV standard will thus be part of the
connector state;

* Two drivers were converted and tested for now (vc4 and sun4i), with
some backward compatibility code to translate the old TV mode to the
new TV mode;

Unit tests were created along the way.

One can switch from NTSC to PAL now using (on vc4)

modetest -M vc4 -s 53:720x480i -w 53:'tv norm':0

modetest -M vc4 -s 53:720x480i -w 53:'tv norm':4

Let me know what you think,
Maxime

Changes from v1 (https://lore.kernel.org/dri-devel/20220728-rpi-analog-tv-properties-v1-0-3d53ae722097@xxxxxxxxxx/):
- Kept the older TV mode property as legacy so we can keep the old drivers functional
- Renamed the tv_norm property to tv_mode
- Added a function to create PAL and NTSC compatible display modes
- Added some helpers to instantiate a mock DRM device in Kunit
- More Kunit tests
- Removed the HD analog TV modes
- Renamed some of the tests
- Renamed some of the named modes
- Fixed typos in commit logs
- Added the various tags

Cc: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
Cc: Mateusz Kwiatkowski <kfyatek+publicgit@xxxxxxxxx>
Cc: "Noralf Trønnes" <noralf@xxxxxxxxxxx>
Cc: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx>
Cc: Dom Cobley <dom@xxxxxxxxxxxxxxx>
Cc: Phil Elwell <phil@xxxxxxxxxxxxxxx>
Cc: <dri-devel@xxxxxxxxxxxxxxxxxxxxx>

---
Geert Uytterhoeven (1):
drm/modes: parse_cmdline: Add support for named modes containing dashes

Mateusz Kwiatkowski (5):
drm/vc4: vec: Refactor VEC TV mode setting
drm/vc4: vec: Remove redundant atomic_mode_set
drm/vc4: vec: Fix timings for VEC modes
drm/vc4: vec: Fix definition of PAL-M mode
drm/vc4: vec: Add support for more analog TV standards

Maxime Ripard (35):
drm/tests: Order Kunit tests in Makefile
drm/tests: Add Kunit Helpers
drm/atomic-helper: Rename drm_atomic_helper_connector_tv_reset to avoid ambiguity
drm/connector: Rename subconnector state variable
drm/atomic: Add TV subconnector property to get/set_property
drm/connector: Rename legacy TV property
drm/connector: Only register TV mode property if present
drm/connector: Rename drm_mode_create_tv_properties
drm/connector: Add TV standard property
drm/modes: Add a function to generate analog display modes
drm/modes: Only consider bpp and refresh before options
drm/client: Add some tests for drm_connector_pick_cmdline_mode()
drm/modes: Move named modes parsing to a separate function
drm/modes: Switch to named mode descriptors
drm/modes: Fill drm_cmdline mode from named modes
drm/connector: Add pixel clock to cmdline mode
drm/connector: Add a function to lookup a TV mode by its name
drm/modes: Introduce the tv_mode property as a command-line option
drm/modes: Properly generate a drm_display_mode from a named mode
drm/modes: Introduce more named modes
drm/atomic-helper: Add a TV properties reset helper
drm/atomic-helper: Add an analog TV atomic_check implementation
drm/vc4: vec: Remove empty mode_fixup
drm/vc4: vec: Convert to atomic helpers
drm/vc4: vec: Switch for common modes
drm/vc4: vec: Use TV Reset implementation
drm/vc4: vec: Convert to the new TV mode property
drm/sun4i: tv: Remove unused mode_valid
drm/sun4i: tv: Convert to atomic hooks
drm/sun4i: tv: Merge mode_set into atomic_enable
drm/sun4i: tv: Remove useless function
drm/sun4i: tv: Remove useless destroy function
drm/sun4i: tv: Rename error label
drm/sun4i: tv: Add missing reset assertion
drm/sun4i: tv: Convert to the new TV mode property

drivers/gpu/drm/drm_atomic_state_helper.c | 115 ++++-
drivers/gpu/drm/drm_atomic_uapi.c | 8 +
drivers/gpu/drm/drm_client_modeset.c | 4 +
drivers/gpu/drm/drm_connector.c | 119 ++++-
drivers/gpu/drm/drm_modes.c | 638 +++++++++++++++++++++++-
drivers/gpu/drm/gud/gud_connector.c | 8 +-
drivers/gpu/drm/i2c/ch7006_drv.c | 6 +-
drivers/gpu/drm/i915/display/intel_tv.c | 2 +-
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | 6 +-
drivers/gpu/drm/sun4i/sun4i_tv.c | 198 +++-----
drivers/gpu/drm/tests/Makefile | 16 +-
drivers/gpu/drm/tests/drm_client_modeset_test.c | 239 +++++++++
drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 216 ++++++++
drivers/gpu/drm/tests/drm_kunit_helpers.c | 54 ++
drivers/gpu/drm/tests/drm_kunit_helpers.h | 9 +
drivers/gpu/drm/tests/drm_modes_test.c | 131 +++++
drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +-
drivers/gpu/drm/vc4/vc4_vec.c | 422 ++++++++++------
include/drm/drm_atomic_state_helper.h | 4 +
include/drm/drm_connector.h | 165 +++++-
include/drm/drm_mode_config.h | 12 +-
include/drm/drm_modes.h | 17 +
22 files changed, 2057 insertions(+), 334 deletions(-)
---
base-commit: 8869fa666a9e6782c3c896c1fa57d65adca23249
change-id: 20220728-rpi-analog-tv-properties-0914dfcee460

Best regards,
--
Maxime Ripard <maxime@xxxxxxxxxx>