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 mode 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 mode':1 # NTSC
modetest -M vc4 -s 53:720x576i -w 53:'TV mode':4 # PAL
Let me know what you think,
Maxime
To: David Airlie <[email protected]>
To: Daniel Vetter <[email protected]>
To: Maarten Lankhorst <[email protected]>
To: Maxime Ripard <[email protected]>
To: Thomas Zimmermann <[email protected]>
To: Emma Anholt <[email protected]>
To: Jani Nikula <[email protected]>
To: Joonas Lahtinen <[email protected]>
To: Rodrigo Vivi <[email protected]>
To: Tvrtko Ursulin <[email protected]>
To: Ben Skeggs <[email protected]>
To: Karol Herbst <[email protected]>
To: Lyude Paul <[email protected]>
To: Chen-Yu Tsai <[email protected]>
To: Jernej Skrabec <[email protected]>
To: Samuel Holland <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Mateusz Kwiatkowski <[email protected]>
Cc: "Noralf Trønnes" <[email protected]>
Cc: Dave Stevenson <[email protected]>
Cc: Dom Cobley <[email protected]>
Cc: Phil Elwell <[email protected]>
Cc: <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: Hans de Goede <[email protected]>
Signed-off-by: Maxime Ripard <[email protected]>
---
Changes in v6:
- Add and convert to a new get_modes helper to create the PAL and NTSC modes in
the proper order, with the right preferred mode flag, depending on the driver
capabilities and defaults.
- Support PAL60
- Renamed tests to be consistent with DRM tests naming convention
- Simplified a bit the named mode parsing code
- Add a tv_mode_specified field
- Return 0 in get_modes implementations instead of error codes
- Link to v5:
https://lore.kernel.org/r/[email protected]
Changes in v5:
- Dropped TV Standard documentation removal
- Switched the TV Mode documentation from CSV to actual documentation
- Switched to kunit assertions where possible
- Switched to KUNIT_ASSERT_NOT_NULL instead of KUNIT_ASSERT_PTR_NE(..., NULL)
- Shuffled a bit the introduction of drm_client_modeset_connector_get_modes
between patches
- Renamed tv_mode_names to legacy_tv_mode_names
- Removed the count variable in sun4i_tv_comp_get_modes
- Rebased on top of current drm-misc-next
- Link to v4:
https://lore.kernel.org/r/[email protected]
Changes in v4:
- Removed the unused TV Standard property documentation
- Added the TV Mode property documentation to kms-properties.csv
- Fixed the documentation of drm_mode_create_tv_properties()
- Removed DRM_MODE_TV_MODE_NONE
- Reworded the line length check comment in drm_mode_analog_tv tests
- Switched to HZ_PER_KHZ in drm_mode_analog_tv tests
- Reworked drm_mode_analog_tv to fill our mode using the previously computed
timings
- Added the command-line option documentation to modedb.rst
- Improved the Kunit helpers cleanup
- Moved the subconnector documentation renaming to the proper patch
- Added the various review tags
- Removed the count variable in vc4_vec_connector_get_modes
- Rebased on drm-misc-next-2022-09-23 and fixed a merge conflict
- Folded all the named mode parsing improvements in a single patch
- Link to v3:
https://lore.kernel.org/r/[email protected]
Changes in v3:
- Applied some of the fixes to vc4 and sun4i
- Renamed the old TV mode property to legacy_mode
- Fixed a bunch of bisection errors
- Removed most of the redundant TV modes
- Added a new None TV mode to not fall back on NTSC by mistake
- Fixed the mode generation function to match better what is expected
- Added some logging to the mode generation function
- Split the improvements to the named mode parsing logic into separate patches
- Added more checks to the TV atomic_check helper
- Link to v2:
https://lore.kernel.org/dri-devel/[email protected]/
Changes in v2:
- 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
- Link to v1:
https://lore.kernel.org/dri-devel/[email protected]/
---
Mateusz Kwiatkowski (2):
drm/vc4: vec: Check for VEC output constraints
drm/vc4: vec: Add support for more analog TV standards
Maxime Ripard (21):
drm/tests: Add Kunit Helpers
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/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/probe-helper: Provide a TV get_modes helper
drm/atomic-helper: Add a TV properties reset helper
drm/atomic-helper: Add an analog TV atomic_check implementation
drm/vc4: vec: Use TV Reset implementation
drm/vc4: vec: Convert to the new TV mode property
drm/sun4i: tv: Convert to the new TV mode property
Documentation/fb/modedb.rst | 2 +
Documentation/gpu/drm-kms.rst | 6 +
drivers/gpu/drm/drm_atomic_state_helper.c | 124 +++++
drivers/gpu/drm/drm_atomic_uapi.c | 4 +
drivers/gpu/drm/drm_client_modeset.c | 4 +
drivers/gpu/drm/drm_connector.c | 173 ++++++-
drivers/gpu/drm/drm_modes.c | 639 +++++++++++++++++++++++-
drivers/gpu/drm/drm_probe_helper.c | 97 ++++
drivers/gpu/drm/gud/gud_connector.c | 10 +-
drivers/gpu/drm/i2c/ch7006_drv.c | 6 +-
drivers/gpu/drm/i915/display/intel_tv.c | 5 +-
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | 6 +-
drivers/gpu/drm/sun4i/sun4i_tv.c | 141 ++----
drivers/gpu/drm/tests/Makefile | 2 +
drivers/gpu/drm/tests/drm_client_modeset_test.c | 229 +++++++++
drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 67 +++
drivers/gpu/drm/tests/drm_kunit_helpers.c | 61 +++
drivers/gpu/drm/tests/drm_kunit_helpers.h | 9 +
drivers/gpu/drm/tests/drm_modes_test.c | 144 ++++++
drivers/gpu/drm/vc4/vc4_vec.c | 337 +++++++++++--
include/drm/drm_atomic_state_helper.h | 4 +
include/drm/drm_connector.h | 89 +++-
include/drm/drm_mode_config.h | 12 +-
include/drm/drm_modes.h | 17 +
include/drm/drm_probe_helper.h | 1 +
25 files changed, 1985 insertions(+), 204 deletions(-)
---
base-commit: 3f94c7492f45365557b597d888241ddc59f347e1
change-id: 20220728-rpi-analog-tv-properties-0914dfcee460
Best regards,
--
Maxime Ripard <[email protected]>