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 NTSC should be 640x480i, not 720. It will probably work on most TV's, but NTSC by the spec is 640x480i. On Mon, Nov 7, 2022 at 3:16 PM Maxime Ripard wrote: > 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 > To: Daniel Vetter > To: Maarten Lankhorst > To: Maxime Ripard > To: Thomas Zimmermann > To: Emma Anholt > To: Jani Nikula > To: Joonas Lahtinen > To: Rodrigo Vivi > To: Tvrtko Ursulin > To: Ben Skeggs > To: Karol Herbst > To: Lyude Paul > To: Chen-Yu Tsai > To: Jernej Skrabec > To: Samuel Holland > Cc: Geert Uytterhoeven > Cc: Mateusz Kwiatkowski > Cc: "Noralf Trønnes" > Cc: Dave Stevenson > Cc: Dom Cobley > Cc: Phil Elwell > Cc: > Cc: linux-kernel@vger.kernel.org > Cc: intel-gfx@lists.freedesktop.org > Cc: nouveau@lists.freedesktop.org > Cc: linux-arm-kernel@lists.infradead.org > Cc: linux-sunxi@lists.linux.dev > Cc: Hans de Goede > Signed-off-by: Maxime Ripard > > --- > Changes in v7: > - Switch to another implementation of get_modes from Noralf > - Made more checks in VEC's atomic_check > - Fixed typo in a commit log > - Checked for tv_mode_specified in > drm_mode_parse_command_line_for_connector > - Rebased on drm-misc-next-2022-11-03 > - Link to v6: > https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech > > 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/20220728-rpi-analog-tv-properties-v5-0-d841cc64fe4b@cerno.tech > > 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/20220728-rpi-analog-tv-properties-v4-0-60d38873f782@cerno.tech > > 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/20220728-rpi-analog-tv-properties-v2-0-f733a0ed9f90@cerno.tech > > 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/20220728-rpi-analog-tv-properties-v2-0-459522d653a7@cerno.tech/ > > 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/20220728-rpi-analog-tv-properties-v1-0-3d53ae722097@cerno.tech/ > > --- > Mateusz Kwiatkowski (2): > drm/vc4: vec: Check for VEC output constraints > drm/vc4: vec: Add support for more analog TV standards > > Maxime Ripard (20): > 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/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 > > Noralf Trønnes (1): > drm/probe-helper: Provide a TV get_modes helper > > 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 | 3 + > 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_connector_test.c | 90 ++++ > 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 | 342 +++++++++++-- > 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 + > 26 files changed, 2081 insertions(+), 204 deletions(-) > --- > base-commit: 3b536e43463ed91b7bf9acec1eb4da0bc677dc43 > change-id: 20220728-rpi-analog-tv-properties-0914dfcee460 > > Best regards, > -- > Maxime Ripard >