* Re: [PATCH v10 01/19] drm/tests: client: Mention that we can't use MODULE_ macros [not found] ` <20220728-rpi-analog-tv-properties-v10-1-256dad125326@cerno.tech> @ 2022-11-17 11:54 ` Noralf Trønnes 0 siblings, 0 replies; 10+ messages in thread From: Noralf Trønnes @ 2022-11-17 11:54 UTC (permalink / raw) To: Maxime Ripard, Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter Cc: Dave Stevenson, Hans de Goede, nouveau, intel-gfx, dri-devel, Mateusz Kwiatkowski, linux-kernel, linux-arm-kernel, linux-sunxi, Dom Cobley, Phil Elwell, Geert Uytterhoeven, Noralf Trønnes Den 17.11.2022 10.28, skrev Maxime Ripard: > That file is included directly, so we can't use any MODULE macro. Let's > leave a comment to avoid any future mistake. > > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > --- Reviewed-by: Noralf Trønnes <noralf@tronnes.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <20220728-rpi-analog-tv-properties-v10-5-256dad125326@cerno.tech>]
* Re: [PATCH v10 05/19] drm/connector: Add TV standard property [not found] ` <20220728-rpi-analog-tv-properties-v10-5-256dad125326@cerno.tech> @ 2022-11-17 14:35 ` Mauro Carvalho Chehab 2022-11-17 14:53 ` Maxime Ripard 2022-11-24 13:33 ` Noralf Trønnes 1 sibling, 1 reply; 10+ messages in thread From: Mauro Carvalho Chehab @ 2022-11-17 14:35 UTC (permalink / raw) To: Maxime Ripard Cc: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter, Dom Cobley, Dave Stevenson, Phil Elwell, nouveau, intel-gfx, linux-kernel, dri-devel, Mateusz Kwiatkowski, Hans de Goede, Noralf Trønnes, Geert Uytterhoeven, linux-sunxi, linux-arm-kernel On Thu, 17 Nov 2022 10:28:48 +0100 Maxime Ripard <maxime@cerno.tech> wrote: > The TV mode property has been around for a while now to select and get the > current TV mode output on an analog TV connector. > > Despite that property name being generic, its content isn't and has been > driver-specific which makes it hard to build any generic behaviour on top > of it, both in kernel and user-space. > > Let's create a new enum tv norm property, that can contain any of the > analog TV standards currently supported by kernel drivers. Each driver can > then pass in a bitmask of the modes it supports, and the property > creation function will filter out the modes not supported. > > We'll then be able to phase out the older tv mode property. > > Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > > --- > Changes in v10: > - Fix checkpatch warning > > Changes in v5: > - Create an analog TV properties documentation section, and document TV > Mode there instead of the csv file > > Changes in v4: > - Add property documentation to kms-properties.csv > - Fix documentation > --- > Documentation/gpu/drm-kms.rst | 6 ++ > drivers/gpu/drm/drm_atomic_uapi.c | 4 ++ > drivers/gpu/drm/drm_connector.c | 122 +++++++++++++++++++++++++++++++++++++- > include/drm/drm_connector.h | 64 ++++++++++++++++++++ > include/drm/drm_mode_config.h | 8 +++ > 5 files changed, 203 insertions(+), 1 deletion(-) > > diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-kms.rst > index b4377a545425..321f2f582c64 100644 > --- a/Documentation/gpu/drm-kms.rst > +++ b/Documentation/gpu/drm-kms.rst > @@ -520,6 +520,12 @@ HDMI Specific Connector Properties > .. kernel-doc:: drivers/gpu/drm/drm_connector.c > :doc: HDMI connector properties > > +Analog TV Specific Connector Properties > +---------------------------------- > + > +.. kernel-doc:: drivers/gpu/drm/drm_connector.c > + :doc: Analog TV Connector Properties > + > Standard CRTC Properties > ------------------------ > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index 7f2b9a07fbdf..d867e7f9f2cd 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -700,6 +700,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, > state->tv.margins.bottom = val; > } else if (property == config->legacy_tv_mode_property) { > state->tv.legacy_mode = val; > + } else if (property == config->tv_mode_property) { > + state->tv.mode = val; > } else if (property == config->tv_brightness_property) { > state->tv.brightness = val; > } else if (property == config->tv_contrast_property) { > @@ -810,6 +812,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > *val = state->tv.margins.bottom; > } else if (property == config->legacy_tv_mode_property) { > *val = state->tv.legacy_mode; > + } else if (property == config->tv_mode_property) { > + *val = state->tv.mode; > } else if (property == config->tv_brightness_property) { > *val = state->tv.brightness; > } else if (property == config->tv_contrast_property) { > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index 06e737ed15f5..07d449736956 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -984,6 +984,17 @@ static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = { > DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name, > drm_dvi_i_subconnector_enum_list) > > +static const struct drm_prop_enum_list drm_tv_mode_enum_list[] = { > + { DRM_MODE_TV_MODE_NTSC, "NTSC" }, > + { DRM_MODE_TV_MODE_NTSC_443, "NTSC-443" }, > + { DRM_MODE_TV_MODE_NTSC_J, "NTSC-J" }, > + { DRM_MODE_TV_MODE_PAL, "PAL" }, > + { DRM_MODE_TV_MODE_PAL_M, "PAL-M" }, > + { DRM_MODE_TV_MODE_PAL_N, "PAL-N" }, > + { DRM_MODE_TV_MODE_SECAM, "SECAM" }, > +}; Nack. It sounds a very bad idea to have standards as generic as NTSC, PAL, SECAM. If you take a look at the CCIR/ITU-R specs that define video standards, you'll see that the standard has actually two components: 1. the composite color TV signal: PAL, NTSC, SECAM, defined in ITU-R BT1700[1] 2. and the conventional analogue TV (the "monochromatic" part), as defined in ITU-R BT.1701[2], which is, basically, a letter from A to N (with some country-specific variants, like Nc). Two of those standards (M and J) are used on Countries with a power grid of 60Hz, as they have a frame rate of either 30fps or 29.997fps. [1] https://www.itu.int/rec/R-REC-BT.1700-0-200502-I/en [2] https://www.itu.int/rec/R-REC-BT.1701-1-200508-I/en The actual combination is defined within Country-specific laws, which selects a conventional analogue signal with a composite color one. So, for instance, US uses NTSC/M (because it uses a 60Hz power grid). There is a 50Hz variant, called NTSC/443 (not used on any Country, but present on some European VCR equipments capable of recording at 25fps, using NTSC). Btw, some VCR equipments in US may also have PAL/60 with has the same timings as NTSC, but uses PAL instead. What happens is that, in Europe, different PAL standards got used, but: - most TV sets and their chipsets were developed to auto-detect and support the differences between different systems PAL/B, PAL/G, PAL/D,... - several of those standards have a difference only at the audio sub-carriers. So, they look identical for the video decoding part. - standards may have a different inter-channel space (it can vary from 5 to 8 MHz) to minimize cross-signal interference. --- Anyway, I strongly suggest to either: 1. align the standards there to what we defined in V4L2. See: https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/vidioc-enumstd.html#v4l2-std-id and: https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/standard.html You can probably start with a subset of those, e. g. with: - PAL/I, PAL/BG, PAL/DK, PAL/M, PAL/N, PAL/Nc, PAL/60 - NTSC/M, NTSC/M Japan, NTSC/M Korea, NTSC/443 - SECAM/BG, SECAM/DK, SECAM/I, SECAM/L, SECAM/LP Btw, for decoders, this should actually be a bitmask, as most decoding chipsets can auto-detect among several different video standards. 2. split into two different properties: - the "monochromatic" one: A to N, M_Japan, M_Korea, Nc, 60 and 443; - the composite signal encoding: NTSC, PAL, SECAM. If I were to design V4L2 again back the days where commercial digital TV were not present, I would probably have opted to have two different properties. Regards, Mauro > +DRM_ENUM_NAME_FN(drm_get_tv_mode_name, drm_tv_mode_enum_list) > + > static const struct drm_prop_enum_list drm_tv_select_enum_list[] = { > { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ > { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ > @@ -1552,6 +1563,71 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); > * infoframe values is done through drm_hdmi_avi_infoframe_content_type(). > */ > > +/* > + * TODO: Document the properties: > + * - left margin > + * - right margin > + * - top margin > + * - bottom margin > + * - brightness > + * - contrast > + * - flicker reduction > + * - hue > + * - mode > + * - overscan > + * - saturation > + * - select subconnector > + * - subconnector > + */ > +/** > + * DOC: Analog TV Connector Properties > + * > + * TV Mode: > + * Indicates the TV Mode used on an analog TV connector. The value > + * of this property can be one of the following: > + * > + * NTSC: > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding. > + * > + * NTSC-443: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding, but with a color subcarrier > + * frequency of 4.43MHz > + * > + * NTSC-J: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding, but with a black level equal to > + * the blanking level. > + * > + * PAL: > + * > + * TV Mode is CCIR System B (aka 625-lines) together with > + * the PAL Color Encoding. > + * > + * PAL-M: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the PAL Color Encoding. > + * > + * PAL-N: > + * > + * TV Mode is CCIR System N together with the PAL Color > + * Encoding, a color subcarrier frequency of 3.58MHz, the > + * SECAM color space, and narrower channels than other PAL > + * variants. > + * > + * SECAM: > + * > + * TV Mode is CCIR System B (aka 625-lines) together with > + * the SECAM Color Encoding. > + * > + * Drivers can set up this property by calling > + * drm_mode_create_tv_properties(). > + */ > + > /** > * drm_connector_attach_content_type_property - attach content-type property > * @connector: connector to attach content type property on. > @@ -1649,6 +1725,10 @@ EXPORT_SYMBOL(drm_mode_create_tv_margin_properties); > * responsible for allocating a list of format names and passing them to > * this routine. > * > + * NOTE: This functions registers the deprecated "mode" connector > + * property to select the analog TV mode (ie, NTSC, PAL, etc.). New > + * drivers must use drm_mode_create_tv_properties() instead. > + * > * Returns: > * 0 on success or a negative error code on failure. > */ > @@ -1690,7 +1770,6 @@ int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > if (drm_mode_create_tv_margin_properties(dev)) > goto nomem; > > - > if (num_modes) { > dev->mode_config.legacy_tv_mode_property = > drm_property_create(dev, DRM_MODE_PROP_ENUM, > @@ -1739,6 +1818,47 @@ int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > } > EXPORT_SYMBOL(drm_mode_create_tv_properties_legacy); > > +/** > + * drm_mode_create_tv_properties - create TV specific connector properties > + * @dev: DRM device > + * @supported_tv_modes: Bitmask of TV modes supported (See DRM_MODE_TV_MODE_*) > + > + * Called by a driver's TV initialization routine, this function creates > + * the TV specific connector properties for a given device. > + * > + * Returns: > + * 0 on success or a negative error code on failure. > + */ > +int drm_mode_create_tv_properties(struct drm_device *dev, > + unsigned int supported_tv_modes) > +{ > + struct drm_prop_enum_list tv_mode_list[DRM_MODE_TV_MODE_MAX]; > + struct drm_property *tv_mode; > + unsigned int i, len = 0; > + > + if (dev->mode_config.tv_mode_property) > + return 0; > + > + for (i = 0; i < DRM_MODE_TV_MODE_MAX; i++) { > + if (!(supported_tv_modes & BIT(i))) > + continue; > + > + tv_mode_list[len].type = i; > + tv_mode_list[len].name = drm_get_tv_mode_name(i); > + len++; > + } > + > + tv_mode = drm_property_create_enum(dev, 0, "TV mode", > + tv_mode_list, len); > + if (!tv_mode) > + return -ENOMEM; > + > + dev->mode_config.tv_mode_property = tv_mode; > + > + return drm_mode_create_tv_properties_legacy(dev, 0, NULL); > +} > +EXPORT_SYMBOL(drm_mode_create_tv_properties); > + > /** > * drm_mode_create_scaling_mode_property - create scaling mode property > * @dev: DRM device > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index 15cb58117a94..4927dcb2573f 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -143,6 +143,65 @@ enum subpixel_order { > > }; > > +/** > + * enum drm_connector_tv_mode - Analog TV output mode > + * > + * This enum is used to indicate the TV output mode used on an analog TV > + * connector. > + * > + * WARNING: The values of this enum is uABI since they're exposed in the > + * "TV mode" connector property. > + */ > +enum drm_connector_tv_mode { > + /** > + * @DRM_MODE_TV_MODE_NTSC: CCIR System M (aka 525-lines) > + * together with the NTSC Color Encoding. > + */ > + DRM_MODE_TV_MODE_NTSC, > + > + /** > + * @DRM_MODE_TV_MODE_NTSC_443: Variant of > + * @DRM_MODE_TV_MODE_NTSC. Uses a color subcarrier frequency > + * of 4.43 MHz. > + */ > + DRM_MODE_TV_MODE_NTSC_443, > + > + /** > + * @DRM_MODE_TV_MODE_NTSC_J: Variant of @DRM_MODE_TV_MODE_NTSC > + * used in Japan. Uses a black level equals to the blanking > + * level. > + */ > + DRM_MODE_TV_MODE_NTSC_J, > + > + /** > + * @DRM_MODE_TV_MODE_PAL: CCIR System B together with the PAL > + * color system. > + */ > + DRM_MODE_TV_MODE_PAL, > + > + /** > + * @DRM_MODE_TV_MODE_PAL_M: CCIR System M (aka 525-lines) > + * together with the PAL color encoding > + */ > + DRM_MODE_TV_MODE_PAL_M, > + > + /** > + * @DRM_MODE_TV_MODE_PAL_N: CCIR System N together with the PAL > + * color encoding. It uses 625 lines, but has a color subcarrier > + * frequency of 3.58MHz, the SECAM color space, and narrower > + * channels compared to most of the other PAL variants. > + */ > + DRM_MODE_TV_MODE_PAL_N, > + > + /** > + * @DRM_MODE_TV_MODE_SECAM: CCIR System B together with the > + * SECAM color system. > + */ > + DRM_MODE_TV_MODE_SECAM, > + > + DRM_MODE_TV_MODE_MAX, > +}; > + > /** > * struct drm_scrambling: sink's scrambling support. > */ > @@ -696,6 +755,7 @@ struct drm_connector_tv_margins { > * @subconnector: detected subconnector > * @margins: TV margins > * @legacy_mode: Legacy TV mode, driver specific value > + * @mode: TV mode > * @brightness: brightness in percent > * @contrast: contrast in percent > * @flicker_reduction: flicker reduction in percent > @@ -708,6 +768,7 @@ struct drm_tv_connector_state { > enum drm_mode_subconnector subconnector; > struct drm_connector_tv_margins margins; > unsigned int legacy_mode; > + unsigned int mode; > unsigned int brightness; > unsigned int contrast; > unsigned int flicker_reduction; > @@ -1804,6 +1865,7 @@ const char *drm_get_subpixel_order_name(enum subpixel_order order); > const char *drm_get_dpms_name(int val); > const char *drm_get_dvi_i_subconnector_name(int val); > const char *drm_get_dvi_i_select_name(int val); > +const char *drm_get_tv_mode_name(int val); > const char *drm_get_tv_subconnector_name(int val); > const char *drm_get_tv_select_name(int val); > const char *drm_get_dp_subconnector_name(int val); > @@ -1817,6 +1879,8 @@ int drm_mode_create_tv_margin_properties(struct drm_device *dev); > int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > unsigned int num_modes, > const char * const modes[]); > +int drm_mode_create_tv_properties(struct drm_device *dev, > + unsigned int supported_tv_modes); > void drm_connector_attach_tv_margin_properties(struct drm_connector *conn); > int drm_mode_create_scaling_mode_property(struct drm_device *dev); > int drm_connector_attach_content_type_property(struct drm_connector *dev); > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h > index c47b29e80108..e5b053001d22 100644 > --- a/include/drm/drm_mode_config.h > +++ b/include/drm/drm_mode_config.h > @@ -716,9 +716,17 @@ struct drm_mode_config { > /** > * @legacy_tv_mode_property: Optional TV property to select > * the output TV mode. > + * > + * Superseded by @tv_mode_property > */ > struct drm_property *legacy_tv_mode_property; > > + /** > + * @tv_mode_property: Optional TV property to select the TV > + * standard output on the connector. > + */ > + struct drm_property *tv_mode_property; > + > /** > * @tv_left_margin_property: Optional TV property to set the left > * margin (expressed in pixels). > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v10 05/19] drm/connector: Add TV standard property 2022-11-17 14:35 ` [PATCH v10 05/19] drm/connector: Add TV standard property Mauro Carvalho Chehab @ 2022-11-17 14:53 ` Maxime Ripard 0 siblings, 0 replies; 10+ messages in thread From: Maxime Ripard @ 2022-11-17 14:53 UTC (permalink / raw) To: Mauro Carvalho Chehab Cc: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter, Dom Cobley, Dave Stevenson, Phil Elwell, nouveau, intel-gfx, linux-kernel, dri-devel, Mateusz Kwiatkowski, Hans de Goede, Noralf Trønnes, Geert Uytterhoeven, linux-sunxi, linux-arm-kernel [-- Attachment #1: Type: text/plain, Size: 6546 bytes --] On Thu, Nov 17, 2022 at 03:35:57PM +0100, Mauro Carvalho Chehab wrote: > On Thu, 17 Nov 2022 10:28:48 +0100 > Maxime Ripard <maxime@cerno.tech> wrote: > > > The TV mode property has been around for a while now to select and get the > > current TV mode output on an analog TV connector. > > > > Despite that property name being generic, its content isn't and has been > > driver-specific which makes it hard to build any generic behaviour on top > > of it, both in kernel and user-space. > > > > Let's create a new enum tv norm property, that can contain any of the > > analog TV standards currently supported by kernel drivers. Each driver can > > then pass in a bitmask of the modes it supports, and the property > > creation function will filter out the modes not supported. > > > > We'll then be able to phase out the older tv mode property. > > > > Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > > > > --- > > Changes in v10: > > - Fix checkpatch warning > > > > Changes in v5: > > - Create an analog TV properties documentation section, and document TV > > Mode there instead of the csv file > > > > Changes in v4: > > - Add property documentation to kms-properties.csv > > - Fix documentation > > --- > > Documentation/gpu/drm-kms.rst | 6 ++ > > drivers/gpu/drm/drm_atomic_uapi.c | 4 ++ > > drivers/gpu/drm/drm_connector.c | 122 +++++++++++++++++++++++++++++++++++++- > > include/drm/drm_connector.h | 64 ++++++++++++++++++++ > > include/drm/drm_mode_config.h | 8 +++ > > 5 files changed, 203 insertions(+), 1 deletion(-) > > > > diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-kms.rst > > index b4377a545425..321f2f582c64 100644 > > --- a/Documentation/gpu/drm-kms.rst > > +++ b/Documentation/gpu/drm-kms.rst > > @@ -520,6 +520,12 @@ HDMI Specific Connector Properties > > .. kernel-doc:: drivers/gpu/drm/drm_connector.c > > :doc: HDMI connector properties > > > > +Analog TV Specific Connector Properties > > +---------------------------------- > > + > > +.. kernel-doc:: drivers/gpu/drm/drm_connector.c > > + :doc: Analog TV Connector Properties > > + > > Standard CRTC Properties > > ------------------------ > > > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > > index 7f2b9a07fbdf..d867e7f9f2cd 100644 > > --- a/drivers/gpu/drm/drm_atomic_uapi.c > > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > > @@ -700,6 +700,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, > > state->tv.margins.bottom = val; > > } else if (property == config->legacy_tv_mode_property) { > > state->tv.legacy_mode = val; > > + } else if (property == config->tv_mode_property) { > > + state->tv.mode = val; > > } else if (property == config->tv_brightness_property) { > > state->tv.brightness = val; > > } else if (property == config->tv_contrast_property) { > > @@ -810,6 +812,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > > *val = state->tv.margins.bottom; > > } else if (property == config->legacy_tv_mode_property) { > > *val = state->tv.legacy_mode; > > + } else if (property == config->tv_mode_property) { > > + *val = state->tv.mode; > > } else if (property == config->tv_brightness_property) { > > *val = state->tv.brightness; > > } else if (property == config->tv_contrast_property) { > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > > index 06e737ed15f5..07d449736956 100644 > > --- a/drivers/gpu/drm/drm_connector.c > > +++ b/drivers/gpu/drm/drm_connector.c > > @@ -984,6 +984,17 @@ static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = { > > DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name, > > drm_dvi_i_subconnector_enum_list) > > > > +static const struct drm_prop_enum_list drm_tv_mode_enum_list[] = { > > + { DRM_MODE_TV_MODE_NTSC, "NTSC" }, > > + { DRM_MODE_TV_MODE_NTSC_443, "NTSC-443" }, > > + { DRM_MODE_TV_MODE_NTSC_J, "NTSC-J" }, > > + { DRM_MODE_TV_MODE_PAL, "PAL" }, > > + { DRM_MODE_TV_MODE_PAL_M, "PAL-M" }, > > + { DRM_MODE_TV_MODE_PAL_N, "PAL-N" }, > > + { DRM_MODE_TV_MODE_SECAM, "SECAM" }, > > +}; > > Nack. It sounds a very bad idea to have standards as generic as > NTSC, PAL, SECAM. > > If you take a look at the CCIR/ITU-R specs that define video standards, > you'll see that the standard has actually two components: > > 1. the composite color TV signal: PAL, NTSC, SECAM, defined in ITU-R BT1700[1] > > 2. and the conventional analogue TV (the "monochromatic" part), > as defined in ITU-R BT.1701[2], which is, basically, a letter from A to N > (with some country-specific variants, like Nc). Two of those standards > (M and J) are used on Countries with a power grid of 60Hz, as they have > a frame rate of either 30fps or 29.997fps. > > [1] https://www.itu.int/rec/R-REC-BT.1700-0-200502-I/en > [2] https://www.itu.int/rec/R-REC-BT.1701-1-200508-I/en > > The actual combination is defined within Country-specific laws, which > selects a conventional analogue signal with a composite color one. > > So, for instance, US uses NTSC/M (because it uses a 60Hz power grid). > There is a 50Hz variant, called NTSC/443 (not used on any Country, but > present on some European VCR equipments capable of recording at 25fps, > using NTSC). > > Btw, some VCR equipments in US may also have PAL/60 with has the > same timings as NTSC, but uses PAL instead. > > What happens is that, in Europe, different PAL standards got used, but: > > - most TV sets and their chipsets were developed to auto-detect and > support the differences between different systems PAL/B, PAL/G, PAL/D,... > - several of those standards have a difference only at the audio > sub-carriers. So, they look identical for the video decoding part. > - standards may have a different inter-channel space (it can vary from > 5 to 8 MHz) to minimize cross-signal interference. We've had that discussion already, at v3: https://lore.kernel.org/dri-devel/20220728-rpi-analog-tv-properties-v2-9-459522d653a7@cerno.tech/ AFAICS, we can easily add the extra standards to the properties list if and when needed. So unless you can come up with some practical issues that can't be addressed by the current design without a major rework, I don't intend to change that. Maxime [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v10 05/19] drm/connector: Add TV standard property [not found] ` <20220728-rpi-analog-tv-properties-v10-5-256dad125326@cerno.tech> 2022-11-17 14:35 ` [PATCH v10 05/19] drm/connector: Add TV standard property Mauro Carvalho Chehab @ 2022-11-24 13:33 ` Noralf Trønnes 1 sibling, 0 replies; 10+ messages in thread From: Noralf Trønnes @ 2022-11-24 13:33 UTC (permalink / raw) To: Maxime Ripard, Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter Cc: Dave Stevenson, Hans de Goede, nouveau, intel-gfx, dri-devel, Mateusz Kwiatkowski, linux-kernel, linux-arm-kernel, linux-sunxi, Dom Cobley, Phil Elwell, Geert Uytterhoeven, Noralf Trønnes Den 17.11.2022 10.28, skrev Maxime Ripard: > The TV mode property has been around for a while now to select and get the > current TV mode output on an analog TV connector. > > Despite that property name being generic, its content isn't and has been > driver-specific which makes it hard to build any generic behaviour on top > of it, both in kernel and user-space. > > Let's create a new enum tv norm property, that can contain any of the > analog TV standards currently supported by kernel drivers. Each driver can > then pass in a bitmask of the modes it supports, and the property > creation function will filter out the modes not supported. > > We'll then be able to phase out the older tv mode property. > > Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > > --- > Changes in v10: > - Fix checkpatch warning > > Changes in v5: > - Create an analog TV properties documentation section, and document TV > Mode there instead of the csv file > > Changes in v4: > - Add property documentation to kms-properties.csv > - Fix documentation > --- > Documentation/gpu/drm-kms.rst | 6 ++ > drivers/gpu/drm/drm_atomic_uapi.c | 4 ++ > drivers/gpu/drm/drm_connector.c | 122 +++++++++++++++++++++++++++++++++++++- > include/drm/drm_connector.h | 64 ++++++++++++++++++++ > include/drm/drm_mode_config.h | 8 +++ > 5 files changed, 203 insertions(+), 1 deletion(-) > > diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-kms.rst > index b4377a545425..321f2f582c64 100644 > --- a/Documentation/gpu/drm-kms.rst > +++ b/Documentation/gpu/drm-kms.rst > @@ -520,6 +520,12 @@ HDMI Specific Connector Properties > .. kernel-doc:: drivers/gpu/drm/drm_connector.c > :doc: HDMI connector properties > > +Analog TV Specific Connector Properties > +---------------------------------- > + > +.. kernel-doc:: drivers/gpu/drm/drm_connector.c > + :doc: Analog TV Connector Properties > + > Standard CRTC Properties > ------------------------ > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index 7f2b9a07fbdf..d867e7f9f2cd 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -700,6 +700,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, > state->tv.margins.bottom = val; > } else if (property == config->legacy_tv_mode_property) { > state->tv.legacy_mode = val; > + } else if (property == config->tv_mode_property) { > + state->tv.mode = val; > } else if (property == config->tv_brightness_property) { > state->tv.brightness = val; > } else if (property == config->tv_contrast_property) { > @@ -810,6 +812,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > *val = state->tv.margins.bottom; > } else if (property == config->legacy_tv_mode_property) { > *val = state->tv.legacy_mode; > + } else if (property == config->tv_mode_property) { > + *val = state->tv.mode; > } else if (property == config->tv_brightness_property) { > *val = state->tv.brightness; > } else if (property == config->tv_contrast_property) { > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index 06e737ed15f5..07d449736956 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -984,6 +984,17 @@ static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = { > DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name, > drm_dvi_i_subconnector_enum_list) > > +static const struct drm_prop_enum_list drm_tv_mode_enum_list[] = { > + { DRM_MODE_TV_MODE_NTSC, "NTSC" }, > + { DRM_MODE_TV_MODE_NTSC_443, "NTSC-443" }, > + { DRM_MODE_TV_MODE_NTSC_J, "NTSC-J" }, > + { DRM_MODE_TV_MODE_PAL, "PAL" }, > + { DRM_MODE_TV_MODE_PAL_M, "PAL-M" }, > + { DRM_MODE_TV_MODE_PAL_N, "PAL-N" }, > + { DRM_MODE_TV_MODE_SECAM, "SECAM" }, > +}; > +DRM_ENUM_NAME_FN(drm_get_tv_mode_name, drm_tv_mode_enum_list) > + This patch looks good but since I'm no TV standards expert I can't say if the content of this list is a good choice for reflecting the world of TV standards. Acked-by: Noralf Trønnes <noralf@tronnes.org> > static const struct drm_prop_enum_list drm_tv_select_enum_list[] = { > { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ > { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ > @@ -1552,6 +1563,71 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); > * infoframe values is done through drm_hdmi_avi_infoframe_content_type(). > */ > > +/* > + * TODO: Document the properties: > + * - left margin > + * - right margin > + * - top margin > + * - bottom margin > + * - brightness > + * - contrast > + * - flicker reduction > + * - hue > + * - mode > + * - overscan > + * - saturation > + * - select subconnector > + * - subconnector > + */ > +/** > + * DOC: Analog TV Connector Properties > + * > + * TV Mode: > + * Indicates the TV Mode used on an analog TV connector. The value > + * of this property can be one of the following: > + * > + * NTSC: > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding. > + * > + * NTSC-443: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding, but with a color subcarrier > + * frequency of 4.43MHz > + * > + * NTSC-J: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the NTSC Color Encoding, but with a black level equal to > + * the blanking level. > + * > + * PAL: > + * > + * TV Mode is CCIR System B (aka 625-lines) together with > + * the PAL Color Encoding. > + * > + * PAL-M: > + * > + * TV Mode is CCIR System M (aka 525-lines) together with > + * the PAL Color Encoding. > + * > + * PAL-N: > + * > + * TV Mode is CCIR System N together with the PAL Color > + * Encoding, a color subcarrier frequency of 3.58MHz, the > + * SECAM color space, and narrower channels than other PAL > + * variants. > + * > + * SECAM: > + * > + * TV Mode is CCIR System B (aka 625-lines) together with > + * the SECAM Color Encoding. > + * > + * Drivers can set up this property by calling > + * drm_mode_create_tv_properties(). > + */ > + > /** > * drm_connector_attach_content_type_property - attach content-type property > * @connector: connector to attach content type property on. > @@ -1649,6 +1725,10 @@ EXPORT_SYMBOL(drm_mode_create_tv_margin_properties); > * responsible for allocating a list of format names and passing them to > * this routine. > * > + * NOTE: This functions registers the deprecated "mode" connector > + * property to select the analog TV mode (ie, NTSC, PAL, etc.). New > + * drivers must use drm_mode_create_tv_properties() instead. > + * > * Returns: > * 0 on success or a negative error code on failure. > */ > @@ -1690,7 +1770,6 @@ int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > if (drm_mode_create_tv_margin_properties(dev)) > goto nomem; > > - > if (num_modes) { > dev->mode_config.legacy_tv_mode_property = > drm_property_create(dev, DRM_MODE_PROP_ENUM, > @@ -1739,6 +1818,47 @@ int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > } > EXPORT_SYMBOL(drm_mode_create_tv_properties_legacy); > > +/** > + * drm_mode_create_tv_properties - create TV specific connector properties > + * @dev: DRM device > + * @supported_tv_modes: Bitmask of TV modes supported (See DRM_MODE_TV_MODE_*) > + > + * Called by a driver's TV initialization routine, this function creates > + * the TV specific connector properties for a given device. > + * > + * Returns: > + * 0 on success or a negative error code on failure. > + */ > +int drm_mode_create_tv_properties(struct drm_device *dev, > + unsigned int supported_tv_modes) > +{ > + struct drm_prop_enum_list tv_mode_list[DRM_MODE_TV_MODE_MAX]; > + struct drm_property *tv_mode; > + unsigned int i, len = 0; > + > + if (dev->mode_config.tv_mode_property) > + return 0; > + > + for (i = 0; i < DRM_MODE_TV_MODE_MAX; i++) { > + if (!(supported_tv_modes & BIT(i))) > + continue; > + > + tv_mode_list[len].type = i; > + tv_mode_list[len].name = drm_get_tv_mode_name(i); > + len++; > + } > + > + tv_mode = drm_property_create_enum(dev, 0, "TV mode", > + tv_mode_list, len); > + if (!tv_mode) > + return -ENOMEM; > + > + dev->mode_config.tv_mode_property = tv_mode; > + > + return drm_mode_create_tv_properties_legacy(dev, 0, NULL); > +} > +EXPORT_SYMBOL(drm_mode_create_tv_properties); > + > /** > * drm_mode_create_scaling_mode_property - create scaling mode property > * @dev: DRM device > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index 15cb58117a94..4927dcb2573f 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -143,6 +143,65 @@ enum subpixel_order { > > }; > > +/** > + * enum drm_connector_tv_mode - Analog TV output mode > + * > + * This enum is used to indicate the TV output mode used on an analog TV > + * connector. > + * > + * WARNING: The values of this enum is uABI since they're exposed in the > + * "TV mode" connector property. > + */ > +enum drm_connector_tv_mode { > + /** > + * @DRM_MODE_TV_MODE_NTSC: CCIR System M (aka 525-lines) > + * together with the NTSC Color Encoding. > + */ > + DRM_MODE_TV_MODE_NTSC, > + > + /** > + * @DRM_MODE_TV_MODE_NTSC_443: Variant of > + * @DRM_MODE_TV_MODE_NTSC. Uses a color subcarrier frequency > + * of 4.43 MHz. > + */ > + DRM_MODE_TV_MODE_NTSC_443, > + > + /** > + * @DRM_MODE_TV_MODE_NTSC_J: Variant of @DRM_MODE_TV_MODE_NTSC > + * used in Japan. Uses a black level equals to the blanking > + * level. > + */ > + DRM_MODE_TV_MODE_NTSC_J, > + > + /** > + * @DRM_MODE_TV_MODE_PAL: CCIR System B together with the PAL > + * color system. > + */ > + DRM_MODE_TV_MODE_PAL, > + > + /** > + * @DRM_MODE_TV_MODE_PAL_M: CCIR System M (aka 525-lines) > + * together with the PAL color encoding > + */ > + DRM_MODE_TV_MODE_PAL_M, > + > + /** > + * @DRM_MODE_TV_MODE_PAL_N: CCIR System N together with the PAL > + * color encoding. It uses 625 lines, but has a color subcarrier > + * frequency of 3.58MHz, the SECAM color space, and narrower > + * channels compared to most of the other PAL variants. > + */ > + DRM_MODE_TV_MODE_PAL_N, > + > + /** > + * @DRM_MODE_TV_MODE_SECAM: CCIR System B together with the > + * SECAM color system. > + */ > + DRM_MODE_TV_MODE_SECAM, > + > + DRM_MODE_TV_MODE_MAX, > +}; > + > /** > * struct drm_scrambling: sink's scrambling support. > */ > @@ -696,6 +755,7 @@ struct drm_connector_tv_margins { > * @subconnector: detected subconnector > * @margins: TV margins > * @legacy_mode: Legacy TV mode, driver specific value > + * @mode: TV mode > * @brightness: brightness in percent > * @contrast: contrast in percent > * @flicker_reduction: flicker reduction in percent > @@ -708,6 +768,7 @@ struct drm_tv_connector_state { > enum drm_mode_subconnector subconnector; > struct drm_connector_tv_margins margins; > unsigned int legacy_mode; > + unsigned int mode; > unsigned int brightness; > unsigned int contrast; > unsigned int flicker_reduction; > @@ -1804,6 +1865,7 @@ const char *drm_get_subpixel_order_name(enum subpixel_order order); > const char *drm_get_dpms_name(int val); > const char *drm_get_dvi_i_subconnector_name(int val); > const char *drm_get_dvi_i_select_name(int val); > +const char *drm_get_tv_mode_name(int val); > const char *drm_get_tv_subconnector_name(int val); > const char *drm_get_tv_select_name(int val); > const char *drm_get_dp_subconnector_name(int val); > @@ -1817,6 +1879,8 @@ int drm_mode_create_tv_margin_properties(struct drm_device *dev); > int drm_mode_create_tv_properties_legacy(struct drm_device *dev, > unsigned int num_modes, > const char * const modes[]); > +int drm_mode_create_tv_properties(struct drm_device *dev, > + unsigned int supported_tv_modes); > void drm_connector_attach_tv_margin_properties(struct drm_connector *conn); > int drm_mode_create_scaling_mode_property(struct drm_device *dev); > int drm_connector_attach_content_type_property(struct drm_connector *dev); > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h > index c47b29e80108..e5b053001d22 100644 > --- a/include/drm/drm_mode_config.h > +++ b/include/drm/drm_mode_config.h > @@ -716,9 +716,17 @@ struct drm_mode_config { > /** > * @legacy_tv_mode_property: Optional TV property to select > * the output TV mode. > + * > + * Superseded by @tv_mode_property > */ > struct drm_property *legacy_tv_mode_property; > > + /** > + * @tv_mode_property: Optional TV property to select the TV > + * standard output on the connector. > + */ > + struct drm_property *tv_mode_property; > + > /** > * @tv_left_margin_property: Optional TV property to set the left > * margin (expressed in pixels). > ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <20220728-rpi-analog-tv-properties-v10-18-256dad125326@cerno.tech>]
* Re: [PATCH v10 18/19] drm/vc4: vec: Add support for more analog TV standards [not found] ` <20220728-rpi-analog-tv-properties-v10-18-256dad125326@cerno.tech> @ 2022-11-17 15:49 ` Mauro Carvalho Chehab 2022-11-17 17:14 ` Maxime Ripard 2022-11-21 20:30 ` Mateusz Kwiatkowski 0 siblings, 2 replies; 10+ messages in thread From: Mauro Carvalho Chehab @ 2022-11-17 15:49 UTC (permalink / raw) To: Maxime Ripard Cc: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter, Dom Cobley, Dave Stevenson, Phil Elwell, nouveau, intel-gfx, linux-kernel, dri-devel, Mateusz Kwiatkowski, Hans de Goede, Noralf Trønnes, Geert Uytterhoeven, linux-sunxi, linux-arm-kernel On Thu, 17 Nov 2022 10:29:01 +0100 Maxime Ripard <maxime@cerno.tech> wrote: > From: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > > Add support for the following composite output modes (all of them are > somewhat more obscure than the previously defined ones): > > - NTSC_443 - NTSC-style signal with the chroma subcarrier shifted to > 4.43361875 MHz (the PAL subcarrier frequency). Never used for > broadcasting, but sometimes used as a hack to play NTSC content in PAL > regions (e.g. on VCRs). > - PAL_N - PAL with alternative chroma subcarrier frequency, > 3.58205625 MHz. Used as a broadcast standard in Argentina, Paraguay > and Uruguay to fit 576i50 with colour in 6 MHz channel raster. That's not right. Argentina uses a different standard than Paraguay and Uruguai. See, there are two variants of PAL/N. The original one and PAL/N' - also called PAL/NC or PAL/CN (Combination N). Some of the timings are different on /NC variant. As far as I'm aware, PAL/Nc is used in Argentina, while PAL/N is used in Paraguai and Uruguai, but I may be wrong on that, as it has been a long time since had to touch on this. > - PAL60 - 480i60 signal with PAL-style color at normal European PAL > frequency. Another non-standard, non-broadcast mode, used in similar > contexts as NTSC_443. Some displays support one but not the other. > - SECAM - French frequency-modulated analog color standard; also have > been broadcast in Eastern Europe and various parts of Africa and Asia. > Uses the same 576i50 timings as PAL. This is also wrong. just like PAL, there are several variants of SECAM, one used in France, and a different one in France overseas and on previous France colonies in Africa and Asia. Eastern Europe also used different variants of SECAM. > > Also added some comments explaining color subcarrier frequency > registers. > > Acked-by: Noralf Trønnes <noralf@tronnes.org> > Signed-off-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > > --- > Changes in v6: > - Support PAL60 again > --- > drivers/gpu/drm/vc4/vc4_vec.c | 111 ++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 107 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c > index a828fc6fb776..d23dbad3cbf6 100644 > --- a/drivers/gpu/drm/vc4/vc4_vec.c > +++ b/drivers/gpu/drm/vc4/vc4_vec.c > @@ -46,6 +46,7 @@ > #define VEC_CONFIG0_YDEL(x) ((x) << 26) > #define VEC_CONFIG0_CDEL_MASK GENMASK(25, 24) > #define VEC_CONFIG0_CDEL(x) ((x) << 24) > +#define VEC_CONFIG0_SECAM_STD BIT(21) > #define VEC_CONFIG0_PBPR_FIL BIT(18) > #define VEC_CONFIG0_CHROMA_GAIN_MASK GENMASK(17, 16) > #define VEC_CONFIG0_CHROMA_GAIN_UNITY (0 << 16) > @@ -76,6 +77,27 @@ > #define VEC_SOFT_RESET 0x10c > #define VEC_CLMP0_START 0x144 > #define VEC_CLMP0_END 0x148 > + > +/* > + * These set the color subcarrier frequency > + * if VEC_CONFIG1_CUSTOM_FREQ is enabled. > + * > + * VEC_FREQ1_0 contains the most significant 16-bit half-word, > + * VEC_FREQ3_2 contains the least significant 16-bit half-word. > + * 0x80000000 seems to be equivalent to the pixel clock > + * (which itself is the VEC clock divided by 8). > + * > + * Reference values (with the default pixel clock of 13.5 MHz): > + * > + * NTSC (3579545.[45] Hz) - 0x21F07C1F > + * PAL (4433618.75 Hz) - 0x2A098ACB > + * PAL-M (3575611.[888111] Hz) - 0x21E6EFE3 > + * PAL-N (3582056.25 Hz) - 0x21F69446 > + * > + * NOTE: For SECAM, it is used as the Dr center frequency, > + * regardless of whether VEC_CONFIG1_CUSTOM_FREQ is enabled or not; > + * that is specified as 4406250 Hz, which corresponds to 0x29C71C72. > + */ > #define VEC_FREQ3_2 0x180 > #define VEC_FREQ1_0 0x184 > > @@ -118,6 +140,14 @@ > > #define VEC_INTERRUPT_CONTROL 0x190 > #define VEC_INTERRUPT_STATUS 0x194 > + > +/* > + * Db center frequency for SECAM; the clock for this is the same as for > + * VEC_FREQ3_2/VEC_FREQ1_0, which is used for Dr center frequency. > + * > + * This is specified as 4250000 Hz, which corresponds to 0x284BDA13. > + * That is also the default value, so no need to set it explicitly. > + */ > #define VEC_FCW_SECAM_B 0x198 > #define VEC_SECAM_GAIN_VAL 0x19c > > @@ -197,10 +227,15 @@ enum vc4_vec_tv_mode_id { > VC4_VEC_TV_MODE_NTSC_J, > VC4_VEC_TV_MODE_PAL, > VC4_VEC_TV_MODE_PAL_M, > + VC4_VEC_TV_MODE_NTSC_443, > + VC4_VEC_TV_MODE_PAL_60, > + VC4_VEC_TV_MODE_PAL_N, > + VC4_VEC_TV_MODE_SECAM, > }; > > struct vc4_vec_tv_mode { > unsigned int mode; > + u16 expected_htotal; > u32 config0; > u32 config1; > u32 custom_freq; > @@ -236,35 +271,68 @@ static const struct debugfs_reg32 vec_regs[] = { > static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { > { > .mode = DRM_MODE_TV_MODE_NTSC, > + .expected_htotal = 858, > .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, > .config1 = VEC_CONFIG1_C_CVBS_CVBS, > }, > + { > + .mode = DRM_MODE_TV_MODE_NTSC_443, > + .expected_htotal = 858, > + .config0 = VEC_CONFIG0_NTSC_STD, > + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, > + .custom_freq = 0x2a098acb, > + }, > { > .mode = DRM_MODE_TV_MODE_NTSC_J, > + .expected_htotal = 858, > .config0 = VEC_CONFIG0_NTSC_STD, > .config1 = VEC_CONFIG1_C_CVBS_CVBS, > }, > { > .mode = DRM_MODE_TV_MODE_PAL, > + .expected_htotal = 864, > .config0 = VEC_CONFIG0_PAL_BDGHI_STD, > .config1 = VEC_CONFIG1_C_CVBS_CVBS, > }, > + { > + /* PAL-60 */ > + .mode = DRM_MODE_TV_MODE_PAL, > + .expected_htotal = 858, > + .config0 = VEC_CONFIG0_PAL_M_STD, > + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, > + .custom_freq = 0x2a098acb, > + }, > { > .mode = DRM_MODE_TV_MODE_PAL_M, > + .expected_htotal = 858, > .config0 = VEC_CONFIG0_PAL_M_STD, > .config1 = VEC_CONFIG1_C_CVBS_CVBS, > }, > + { > + .mode = DRM_MODE_TV_MODE_PAL_N, > + .expected_htotal = 864, > + .config0 = VEC_CONFIG0_PAL_N_STD, > + .config1 = VEC_CONFIG1_C_CVBS_CVBS, > + }, > + { > + .mode = DRM_MODE_TV_MODE_SECAM, > + .expected_htotal = 864, > + .config0 = VEC_CONFIG0_SECAM_STD, > + .config1 = VEC_CONFIG1_C_CVBS_CVBS, > + .custom_freq = 0x29c71c72, > + }, > }; > > static inline const struct vc4_vec_tv_mode * > -vc4_vec_tv_mode_lookup(unsigned int mode) > +vc4_vec_tv_mode_lookup(unsigned int mode, u16 htotal) > { > unsigned int i; > > for (i = 0; i < ARRAY_SIZE(vc4_vec_tv_modes); i++) { > const struct vc4_vec_tv_mode *tv_mode = &vc4_vec_tv_modes[i]; > > - if (tv_mode->mode == mode) > + if (tv_mode->mode == mode && > + tv_mode->expected_htotal == htotal) > return tv_mode; > } > > @@ -273,9 +341,13 @@ vc4_vec_tv_mode_lookup(unsigned int mode) > > static const struct drm_prop_enum_list legacy_tv_mode_names[] = { > { VC4_VEC_TV_MODE_NTSC, "NTSC", }, > + { VC4_VEC_TV_MODE_NTSC_443, "NTSC-443", }, > { VC4_VEC_TV_MODE_NTSC_J, "NTSC-J", }, > { VC4_VEC_TV_MODE_PAL, "PAL", }, > + { VC4_VEC_TV_MODE_PAL_60, "PAL-60", }, > { VC4_VEC_TV_MODE_PAL_M, "PAL-M", }, > + { VC4_VEC_TV_MODE_PAL_N, "PAL-N", }, > + { VC4_VEC_TV_MODE_SECAM, "SECAM", }, > }; > > static enum drm_connector_status > @@ -306,11 +378,16 @@ vc4_vec_connector_set_property(struct drm_connector *connector, > state->tv.mode = DRM_MODE_TV_MODE_NTSC; > break; > > + case VC4_VEC_TV_MODE_NTSC_443: > + state->tv.mode = DRM_MODE_TV_MODE_NTSC_443; > + break; > + > case VC4_VEC_TV_MODE_NTSC_J: > state->tv.mode = DRM_MODE_TV_MODE_NTSC_J; > break; > > case VC4_VEC_TV_MODE_PAL: > + case VC4_VEC_TV_MODE_PAL_60: > state->tv.mode = DRM_MODE_TV_MODE_PAL; > break; > > @@ -318,6 +395,14 @@ vc4_vec_connector_set_property(struct drm_connector *connector, > state->tv.mode = DRM_MODE_TV_MODE_PAL_M; > break; > > + case VC4_VEC_TV_MODE_PAL_N: > + state->tv.mode = DRM_MODE_TV_MODE_PAL_N; > + break; > + > + case VC4_VEC_TV_MODE_SECAM: > + state->tv.mode = DRM_MODE_TV_MODE_SECAM; > + break; > + > default: > return -EINVAL; > } > @@ -341,6 +426,10 @@ vc4_vec_connector_get_property(struct drm_connector *connector, > *val = VC4_VEC_TV_MODE_NTSC; > break; > > + case DRM_MODE_TV_MODE_NTSC_443: > + *val = VC4_VEC_TV_MODE_NTSC_443; > + break; > + > case DRM_MODE_TV_MODE_NTSC_J: > *val = VC4_VEC_TV_MODE_NTSC_J; > break; > @@ -353,6 +442,14 @@ vc4_vec_connector_get_property(struct drm_connector *connector, > *val = VC4_VEC_TV_MODE_PAL_M; > break; > > + case DRM_MODE_TV_MODE_PAL_N: > + *val = VC4_VEC_TV_MODE_PAL_N; > + break; > + > + case DRM_MODE_TV_MODE_SECAM: > + *val = VC4_VEC_TV_MODE_SECAM; > + break; > + > default: > return -EINVAL; > } > @@ -448,13 +545,16 @@ static void vc4_vec_encoder_enable(struct drm_encoder *encoder, > struct drm_connector *connector = &vec->connector; > struct drm_connector_state *conn_state = > drm_atomic_get_new_connector_state(state, connector); > + struct drm_display_mode *adjusted_mode = > + &encoder->crtc->state->adjusted_mode; > const struct vc4_vec_tv_mode *tv_mode; > int idx, ret; > > if (!drm_dev_enter(drm, &idx)) > return; > > - tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode); > + tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode, > + adjusted_mode->htotal); > if (!tv_mode) > goto err_dev_exit; > > @@ -648,9 +748,12 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data) > > ret = drm_mode_create_tv_properties(drm, > BIT(DRM_MODE_TV_MODE_NTSC) | > + BIT(DRM_MODE_TV_MODE_NTSC_443) | > BIT(DRM_MODE_TV_MODE_NTSC_J) | > BIT(DRM_MODE_TV_MODE_PAL) | > - BIT(DRM_MODE_TV_MODE_PAL_M)); > + BIT(DRM_MODE_TV_MODE_PAL_M) | > + BIT(DRM_MODE_TV_MODE_PAL_N) | > + BIT(DRM_MODE_TV_MODE_SECAM)); > if (ret) > return ret; > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v10 18/19] drm/vc4: vec: Add support for more analog TV standards 2022-11-17 15:49 ` [PATCH v10 18/19] drm/vc4: vec: Add support for more analog TV standards Mauro Carvalho Chehab @ 2022-11-17 17:14 ` Maxime Ripard 2022-11-21 20:30 ` Mateusz Kwiatkowski 1 sibling, 0 replies; 10+ messages in thread From: Maxime Ripard @ 2022-11-17 17:14 UTC (permalink / raw) To: Mauro Carvalho Chehab Cc: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter, Dom Cobley, Dave Stevenson, Phil Elwell, nouveau, intel-gfx, linux-kernel, dri-devel, Mateusz Kwiatkowski, Hans de Goede, Noralf Trønnes, Geert Uytterhoeven, linux-sunxi, linux-arm-kernel [-- Attachment #1: Type: text/plain, Size: 2222 bytes --] On Thu, Nov 17, 2022 at 04:49:28PM +0100, Mauro Carvalho Chehab wrote: > On Thu, 17 Nov 2022 10:29:01 +0100 > Maxime Ripard <maxime@cerno.tech> wrote: > > > From: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > > > > Add support for the following composite output modes (all of them are > > somewhat more obscure than the previously defined ones): > > > > - NTSC_443 - NTSC-style signal with the chroma subcarrier shifted to > > 4.43361875 MHz (the PAL subcarrier frequency). Never used for > > broadcasting, but sometimes used as a hack to play NTSC content in PAL > > regions (e.g. on VCRs). > > > - PAL_N - PAL with alternative chroma subcarrier frequency, > > 3.58205625 MHz. Used as a broadcast standard in Argentina, Paraguay > > and Uruguay to fit 576i50 with colour in 6 MHz channel raster. > > That's not right. Argentina uses a different standard than Paraguay and > Uruguai. > > See, there are two variants of PAL/N. The original one and PAL/N' - also > called PAL/NC or PAL/CN (Combination N). Some of the timings are > different on /NC variant. > > As far as I'm aware, PAL/Nc is used in Argentina, while > PAL/N is used in Paraguai and Uruguai, but I may be wrong on that, > as it has been a long time since had to touch on this. > > > - PAL60 - 480i60 signal with PAL-style color at normal European PAL > > frequency. Another non-standard, non-broadcast mode, used in similar > > contexts as NTSC_443. Some displays support one but not the other. > > > - SECAM - French frequency-modulated analog color standard; also have > > been broadcast in Eastern Europe and various parts of Africa and Asia. > > Uses the same 576i50 timings as PAL. > > This is also wrong. just like PAL, there are several variants of SECAM, > one used in France, and a different one in France overseas and on > previous France colonies in Africa and Asia. Eastern Europe also used > different variants of SECAM. And that's fine? Everything I did is supposed to be easy to extend if and when needed, so if someone has some interest in providing support for more standards, they are very welcome to do so. I won't do it in this series though. Maxime [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v10 18/19] drm/vc4: vec: Add support for more analog TV standards 2022-11-17 15:49 ` [PATCH v10 18/19] drm/vc4: vec: Add support for more analog TV standards Mauro Carvalho Chehab 2022-11-17 17:14 ` Maxime Ripard @ 2022-11-21 20:30 ` Mateusz Kwiatkowski 1 sibling, 0 replies; 10+ messages in thread From: Mateusz Kwiatkowski @ 2022-11-21 20:30 UTC (permalink / raw) To: Mauro Carvalho Chehab, Maxime Ripard Cc: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter, Dom Cobley, Dave Stevenson, Phil Elwell, nouveau, intel-gfx, linux-kernel, dri-devel, Hans de Goede, Noralf Trønnes, Geert Uytterhoeven, linux-sunxi, linux-arm-kernel Hi Mauro, As the author of the original version of this commit, and also a person who argued quite a bit on these descriptions and decisions, let me chip in a bit. W dniu 17.11.2022 o 16:49, Mauro Carvalho Chehab pisze: > On Thu, 17 Nov 2022 10:29:01 +0100 > Maxime Ripard <maxime@cerno.tech> wrote: > >> From: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> >> >> Add support for the following composite output modes (all of them are >> somewhat more obscure than the previously defined ones): >> >> - NTSC_443 - NTSC-style signal with the chroma subcarrier shifted to >> 4.43361875 MHz (the PAL subcarrier frequency). Never used for >> broadcasting, but sometimes used as a hack to play NTSC content in PAL >> regions (e.g. on VCRs). > >> - PAL_N - PAL with alternative chroma subcarrier frequency, >> 3.58205625 MHz. Used as a broadcast standard in Argentina, Paraguay >> and Uruguay to fit 576i50 with colour in 6 MHz channel raster. > > That's not right. Argentina uses a different standard than Paraguay and > Uruguai. > > See, there are two variants of PAL/N. The original one and PAL/N' - also > called PAL/NC or PAL/CN (Combination N). Some of the timings are > different on /NC variant. > > As far as I'm aware, PAL/Nc is used in Argentina, while > PAL/N is used in Paraguai and Uruguai, but I may be wrong on that, > as it has been a long time since had to touch on this. If you say so - maybe that's true. But I tried to find any differences between PAL-N and PAL-Nc many times and haven't found anything concrete. The only authoritative source where System N and "Combination N/PAL" seem to be mentioned as separate entities is BT.1701 <https://www.itu.int/rec/R-REC-BT.1701-1-200508-I/en>. However: a) the differences are very subtle (with "combination N/PAL" being just a tad stricter than what's mentioned for System N) b) "Combination N/PAL" can be understood as just "System N combined with PAL color", as opposed to "raw", black&white System N. This intepretation is also what the user calling themselves "Alcahemist" suggests here: https://en.wikipedia.org/wiki/Talk:PAL#PAL-N_versus_PAL-Nc This is of course far from an authoritative source. If you have a definitive source for PAL-N and PAL-Nc being different, or concrete information on what is different between them specifically, then so be it. But I tried and haven't found anything conclusive. >> - PAL60 - 480i60 signal with PAL-style color at normal European PAL >> frequency. Another non-standard, non-broadcast mode, used in similar >> contexts as NTSC_443. Some displays support one but not the other. > >> - SECAM - French frequency-modulated analog color standard; also have >> been broadcast in Eastern Europe and various parts of Africa and Asia. >> Uses the same 576i50 timings as PAL. > > This is also wrong. just like PAL, there are several variants of SECAM, > one used in France, and a different one in France overseas and on > previous France colonies in Africa and Asia. Eastern Europe also used > different variants of SECAM. This is true. However, those differed only in RF modulation. For example, French SECAM-L used positive video modulation and AM sound, while Eastern European SECAM-D/K used negative video modulation and FM sound. But the baseband composite signals were identical. There were several other variants of SECAM, like early SECAM/V vs. SECAM/H ("Field identification" vs. "Line identification") which moved the color identification signals from VBI to HBI. But that's a change that all SECAM regions, including both France and Eastern Europe did in the 1980s to acommodate for teletext. Again, authoritative sources are scarce, but see e.g. https://web.archive.org/web/20160303232903/http://www.pembers.freeserve.co.uk/World-TV-Standards/Colour-Standards.html (search for "Synchronisation of SECAM colour transmissions" on the page). There's also MESECAM, but that only applies to encoding on VHS and Betamax tapes, not the signals themselves. There was also SECAM-M for 525-line (480i) signals, but I haven't found any conclusive evidence that it was ever used for broadcast anywhere So yeah, SECAM can be a bit confusing, but AFAIK there's only one standard if we're talking about the composite video layer. -- Some *really* old (like, 1960s old) versions of CCIR documents also listed more substantial differences between various 625-line systems, including the number of active lines varying from 571 to 589. But all revisions from 1974 onward list the modern value of 575 active lines for all the variants, making them differ only in RF modulation details. Which is beyond the scope of what the "TV mode" property is supposed to do. >> Also added some comments explaining color subcarrier frequency >> registers. >> >> Acked-by: Noralf Trønnes <noralf@tronnes.org> >> Signed-off-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> >> Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> >> Signed-off-by: Maxime Ripard <maxime@cerno.tech> >> >> --- >> Changes in v6: >> - Support PAL60 again >> --- >> drivers/gpu/drm/vc4/vc4_vec.c | 111 ++++++++++++++++++++++++++++++++++++++++-- >> 1 file changed, 107 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c >> index a828fc6fb776..d23dbad3cbf6 100644 >> --- a/drivers/gpu/drm/vc4/vc4_vec.c >> +++ b/drivers/gpu/drm/vc4/vc4_vec.c >> @@ -46,6 +46,7 @@ >> #define VEC_CONFIG0_YDEL(x) ((x) << 26) >> #define VEC_CONFIG0_CDEL_MASK GENMASK(25, 24) >> #define VEC_CONFIG0_CDEL(x) ((x) << 24) >> +#define VEC_CONFIG0_SECAM_STD BIT(21) >> #define VEC_CONFIG0_PBPR_FIL BIT(18) >> #define VEC_CONFIG0_CHROMA_GAIN_MASK GENMASK(17, 16) >> #define VEC_CONFIG0_CHROMA_GAIN_UNITY (0 << 16) >> @@ -76,6 +77,27 @@ >> #define VEC_SOFT_RESET 0x10c >> #define VEC_CLMP0_START 0x144 >> #define VEC_CLMP0_END 0x148 >> + >> +/* >> + * These set the color subcarrier frequency >> + * if VEC_CONFIG1_CUSTOM_FREQ is enabled. >> + * >> + * VEC_FREQ1_0 contains the most significant 16-bit half-word, >> + * VEC_FREQ3_2 contains the least significant 16-bit half-word. >> + * 0x80000000 seems to be equivalent to the pixel clock >> + * (which itself is the VEC clock divided by 8). >> + * >> + * Reference values (with the default pixel clock of 13.5 MHz): >> + * >> + * NTSC (3579545.[45] Hz) - 0x21F07C1F >> + * PAL (4433618.75 Hz) - 0x2A098ACB >> + * PAL-M (3575611.[888111] Hz) - 0x21E6EFE3 >> + * PAL-N (3582056.25 Hz) - 0x21F69446 >> + * >> + * NOTE: For SECAM, it is used as the Dr center frequency, >> + * regardless of whether VEC_CONFIG1_CUSTOM_FREQ is enabled or not; >> + * that is specified as 4406250 Hz, which corresponds to 0x29C71C72. >> + */ >> #define VEC_FREQ3_2 0x180 >> #define VEC_FREQ1_0 0x184 >> >> @@ -118,6 +140,14 @@ >> >> #define VEC_INTERRUPT_CONTROL 0x190 >> #define VEC_INTERRUPT_STATUS 0x194 >> + >> +/* >> + * Db center frequency for SECAM; the clock for this is the same as for >> + * VEC_FREQ3_2/VEC_FREQ1_0, which is used for Dr center frequency. >> + * >> + * This is specified as 4250000 Hz, which corresponds to 0x284BDA13. >> + * That is also the default value, so no need to set it explicitly. >> + */ >> #define VEC_FCW_SECAM_B 0x198 >> #define VEC_SECAM_GAIN_VAL 0x19c >> >> @@ -197,10 +227,15 @@ enum vc4_vec_tv_mode_id { >> VC4_VEC_TV_MODE_NTSC_J, >> VC4_VEC_TV_MODE_PAL, >> VC4_VEC_TV_MODE_PAL_M, >> + VC4_VEC_TV_MODE_NTSC_443, >> + VC4_VEC_TV_MODE_PAL_60, >> + VC4_VEC_TV_MODE_PAL_N, >> + VC4_VEC_TV_MODE_SECAM, >> }; >> >> struct vc4_vec_tv_mode { >> unsigned int mode; >> + u16 expected_htotal; >> u32 config0; >> u32 config1; >> u32 custom_freq; >> @@ -236,35 +271,68 @@ static const struct debugfs_reg32 vec_regs[] = { >> static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { >> { >> .mode = DRM_MODE_TV_MODE_NTSC, >> + .expected_htotal = 858, >> .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, >> .config1 = VEC_CONFIG1_C_CVBS_CVBS, >> }, >> + { >> + .mode = DRM_MODE_TV_MODE_NTSC_443, >> + .expected_htotal = 858, >> + .config0 = VEC_CONFIG0_NTSC_STD, >> + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, >> + .custom_freq = 0x2a098acb, >> + }, >> { >> .mode = DRM_MODE_TV_MODE_NTSC_J, >> + .expected_htotal = 858, >> .config0 = VEC_CONFIG0_NTSC_STD, >> .config1 = VEC_CONFIG1_C_CVBS_CVBS, >> }, >> { >> .mode = DRM_MODE_TV_MODE_PAL, >> + .expected_htotal = 864, >> .config0 = VEC_CONFIG0_PAL_BDGHI_STD, >> .config1 = VEC_CONFIG1_C_CVBS_CVBS, >> }, >> + { >> + /* PAL-60 */ >> + .mode = DRM_MODE_TV_MODE_PAL, >> + .expected_htotal = 858, >> + .config0 = VEC_CONFIG0_PAL_M_STD, >> + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, >> + .custom_freq = 0x2a098acb, >> + }, >> { >> .mode = DRM_MODE_TV_MODE_PAL_M, >> + .expected_htotal = 858, >> .config0 = VEC_CONFIG0_PAL_M_STD, >> .config1 = VEC_CONFIG1_C_CVBS_CVBS, >> }, >> + { >> + .mode = DRM_MODE_TV_MODE_PAL_N, >> + .expected_htotal = 864, >> + .config0 = VEC_CONFIG0_PAL_N_STD, >> + .config1 = VEC_CONFIG1_C_CVBS_CVBS, >> + }, >> + { >> + .mode = DRM_MODE_TV_MODE_SECAM, >> + .expected_htotal = 864, >> + .config0 = VEC_CONFIG0_SECAM_STD, >> + .config1 = VEC_CONFIG1_C_CVBS_CVBS, >> + .custom_freq = 0x29c71c72, >> + }, >> }; >> >> static inline const struct vc4_vec_tv_mode * >> -vc4_vec_tv_mode_lookup(unsigned int mode) >> +vc4_vec_tv_mode_lookup(unsigned int mode, u16 htotal) >> { >> unsigned int i; >> >> for (i = 0; i < ARRAY_SIZE(vc4_vec_tv_modes); i++) { >> const struct vc4_vec_tv_mode *tv_mode = &vc4_vec_tv_modes[i]; >> >> - if (tv_mode->mode == mode) >> + if (tv_mode->mode == mode && >> + tv_mode->expected_htotal == htotal) >> return tv_mode; >> } >> >> @@ -273,9 +341,13 @@ vc4_vec_tv_mode_lookup(unsigned int mode) >> >> static const struct drm_prop_enum_list legacy_tv_mode_names[] = { >> { VC4_VEC_TV_MODE_NTSC, "NTSC", }, >> + { VC4_VEC_TV_MODE_NTSC_443, "NTSC-443", }, >> { VC4_VEC_TV_MODE_NTSC_J, "NTSC-J", }, >> { VC4_VEC_TV_MODE_PAL, "PAL", }, >> + { VC4_VEC_TV_MODE_PAL_60, "PAL-60", }, >> { VC4_VEC_TV_MODE_PAL_M, "PAL-M", }, >> + { VC4_VEC_TV_MODE_PAL_N, "PAL-N", }, >> + { VC4_VEC_TV_MODE_SECAM, "SECAM", }, >> }; >> >> static enum drm_connector_status >> @@ -306,11 +378,16 @@ vc4_vec_connector_set_property(struct drm_connector *connector, >> state->tv.mode = DRM_MODE_TV_MODE_NTSC; >> break; >> >> + case VC4_VEC_TV_MODE_NTSC_443: >> + state->tv.mode = DRM_MODE_TV_MODE_NTSC_443; >> + break; >> + >> case VC4_VEC_TV_MODE_NTSC_J: >> state->tv.mode = DRM_MODE_TV_MODE_NTSC_J; >> break; >> >> case VC4_VEC_TV_MODE_PAL: >> + case VC4_VEC_TV_MODE_PAL_60: >> state->tv.mode = DRM_MODE_TV_MODE_PAL; >> break; >> >> @@ -318,6 +395,14 @@ vc4_vec_connector_set_property(struct drm_connector *connector, >> state->tv.mode = DRM_MODE_TV_MODE_PAL_M; >> break; >> >> + case VC4_VEC_TV_MODE_PAL_N: >> + state->tv.mode = DRM_MODE_TV_MODE_PAL_N; >> + break; >> + >> + case VC4_VEC_TV_MODE_SECAM: >> + state->tv.mode = DRM_MODE_TV_MODE_SECAM; >> + break; >> + >> default: >> return -EINVAL; >> } >> @@ -341,6 +426,10 @@ vc4_vec_connector_get_property(struct drm_connector *connector, >> *val = VC4_VEC_TV_MODE_NTSC; >> break; >> >> + case DRM_MODE_TV_MODE_NTSC_443: >> + *val = VC4_VEC_TV_MODE_NTSC_443; >> + break; >> + >> case DRM_MODE_TV_MODE_NTSC_J: >> *val = VC4_VEC_TV_MODE_NTSC_J; >> break; >> @@ -353,6 +442,14 @@ vc4_vec_connector_get_property(struct drm_connector *connector, >> *val = VC4_VEC_TV_MODE_PAL_M; >> break; >> >> + case DRM_MODE_TV_MODE_PAL_N: >> + *val = VC4_VEC_TV_MODE_PAL_N; >> + break; >> + >> + case DRM_MODE_TV_MODE_SECAM: >> + *val = VC4_VEC_TV_MODE_SECAM; >> + break; >> + >> default: >> return -EINVAL; >> } >> @@ -448,13 +545,16 @@ static void vc4_vec_encoder_enable(struct drm_encoder *encoder, >> struct drm_connector *connector = &vec->connector; >> struct drm_connector_state *conn_state = >> drm_atomic_get_new_connector_state(state, connector); >> + struct drm_display_mode *adjusted_mode = >> + &encoder->crtc->state->adjusted_mode; >> const struct vc4_vec_tv_mode *tv_mode; >> int idx, ret; >> >> if (!drm_dev_enter(drm, &idx)) >> return; >> >> - tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode); >> + tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode, >> + adjusted_mode->htotal); >> if (!tv_mode) >> goto err_dev_exit; >> >> @@ -648,9 +748,12 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data) >> >> ret = drm_mode_create_tv_properties(drm, >> BIT(DRM_MODE_TV_MODE_NTSC) | >> + BIT(DRM_MODE_TV_MODE_NTSC_443) | >> BIT(DRM_MODE_TV_MODE_NTSC_J) | >> BIT(DRM_MODE_TV_MODE_PAL) | >> - BIT(DRM_MODE_TV_MODE_PAL_M)); >> + BIT(DRM_MODE_TV_MODE_PAL_M) | >> + BIT(DRM_MODE_TV_MODE_PAL_N) | >> + BIT(DRM_MODE_TV_MODE_SECAM)); >> if (ret) >> return ret; >> >> Best regards, Mateusz Kwiatkowski ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v10 00/19] drm: Analog TV Improvements [not found] <20220728-rpi-analog-tv-properties-v10-0-256dad125326@cerno.tech> ` (2 preceding siblings ...) [not found] ` <20220728-rpi-analog-tv-properties-v10-18-256dad125326@cerno.tech> @ 2022-11-21 14:51 ` Daniel Vetter 2022-11-24 11:49 ` Maxime Ripard [not found] ` <20220728-rpi-analog-tv-properties-v10-6-256dad125326@cerno.tech> 4 siblings, 1 reply; 10+ messages in thread From: Daniel Vetter @ 2022-11-21 14:51 UTC (permalink / raw) To: Maxime Ripard Cc: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter, Dave Stevenson, Hans de Goede, nouveau, intel-gfx, Noralf Trønnes, dri-devel, Mateusz Kwiatkowski, linux-kernel, linux-arm-kernel, linux-sunxi, Dom Cobley, Phil Elwell, Geert Uytterhoeven On Thu, Nov 17, 2022 at 10:28:43AM +0100, 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 Maxime asked me to drop an Ack-in-principle on this, and I'm not sure I have any useful input here with my utter lack of understanding for TV things (I never even had one in my entire life, that's how much I don't care). But it seems to check all the design boxes around solving annoying uapi/kms-config issues properly, so Acked-in-principle-or-something-like-that-by: Daniel Vetter <daniel.vetter@ffwll.ch> Cheers, Daniel > > To: David Airlie <airlied@linux.ie> > To: Daniel Vetter <daniel@ffwll.ch> > To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > To: Maxime Ripard <mripard@kernel.org> > To: Thomas Zimmermann <tzimmermann@suse.de> > To: Emma Anholt <emma@anholt.net> > To: Jani Nikula <jani.nikula@linux.intel.com> > To: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > To: Rodrigo Vivi <rodrigo.vivi@intel.com> > To: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> > To: Ben Skeggs <bskeggs@redhat.com> > To: Karol Herbst <kherbst@redhat.com> > To: Lyude Paul <lyude@redhat.com> > To: Chen-Yu Tsai <wens@csie.org> > To: Jernej Skrabec <jernej.skrabec@gmail.com> > To: Samuel Holland <samuel@sholland.org> > Cc: Geert Uytterhoeven <geert@linux-m68k.org> > Cc: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > Cc: "Noralf Trønnes" <noralf@tronnes.org> > Cc: Dave Stevenson <dave.stevenson@raspberrypi.com> > Cc: Dom Cobley <dom@raspberrypi.com> > Cc: Phil Elwell <phil@raspberrypi.com> > Cc: <dri-devel@lists.freedesktop.org> > 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 <hdegoede@redhat.com> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > > --- > Changes in v10: > - Rebase on top of drm-misc-next-2022-11-17 > - Fix checkpatch issues > - Add missing MODULE_* macros > - Link to v9: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v9-0-24b168e5bcd5@cerno.tech > > Changes in v9: > - Rename some tests, switch to kunit_test_suite and parameterized tests where > relevant > - Document the valid named modes > - Link to v8: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech > > Changes in v8: > - Changed slightly the helper API to pass in the features > - Removed unused tv_mode_support function > - Removed mode name match in _pick_cmdline_mode > - Added unit tests to the get_modes helper > - Collected Noralf and Mateusz tags > - Rebased on drm-misc-next-2022-11-10 > - Link to v7: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v7-0-7072a478c6b3@cerno.tech > > 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 (16): > drm/tests: client: Mention that we can't use MODULE_ macros > 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/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/client: Remove match on mode name > 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 | 5 + > 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 | 544 +++++++++++++++++++++++- > drivers/gpu/drm/drm_probe_helper.c | 82 ++++ > drivers/gpu/drm/gud/gud_connector.c | 10 +- > drivers/gpu/drm/i2c/ch7006_drv.c | 8 +- > drivers/gpu/drm/i915/display/intel_tv.c | 4 +- > 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 | 91 +++- > drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 68 +++ > drivers/gpu/drm/tests/drm_connector_test.c | 76 ++++ > drivers/gpu/drm/tests/drm_modes_test.c | 145 +++++++ > drivers/gpu/drm/tests/drm_probe_helper_test.c | 205 +++++++++ > drivers/gpu/drm/vc4/vc4_vec.c | 342 ++++++++++++--- > include/drm/drm_atomic_state_helper.h | 4 + > include/drm/drm_connector.h | 82 +++- > include/drm/drm_mode_config.h | 12 +- > include/drm/drm_modes.h | 17 + > include/drm/drm_probe_helper.h | 1 + > 25 files changed, 1959 insertions(+), 198 deletions(-) > --- > base-commit: 9a47d2357cc30d13054bb0598f74fd61f2c9fc51 > change-id: 20220728-rpi-analog-tv-properties-0914dfcee460 > > Best regards, > -- > Maxime Ripard <maxime@cerno.tech> -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v10 00/19] drm: Analog TV Improvements 2022-11-21 14:51 ` [PATCH v10 00/19] drm: Analog TV Improvements Daniel Vetter @ 2022-11-24 11:49 ` Maxime Ripard 0 siblings, 0 replies; 10+ messages in thread From: Maxime Ripard @ 2022-11-24 11:49 UTC (permalink / raw) To: Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Dave Stevenson, Hans de Goede, nouveau, intel-gfx, Noralf Trønnes, dri-devel, Mateusz Kwiatkowski, linux-kernel, linux-arm-kernel, linux-sunxi, Dom Cobley, Phil Elwell, Geert Uytterhoeven [-- Attachment #1: Type: text/plain, Size: 3299 bytes --] On Mon, Nov 21, 2022 at 03:51:26PM +0100, Daniel Vetter wrote: > On Thu, Nov 17, 2022 at 10:28:43AM +0100, 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 > > Maxime asked me to drop an Ack-in-principle on this, and I'm not sure I > have any useful input here with my utter lack of understanding for TV > things (I never even had one in my entire life, that's how much I don't > care). But it seems to check all the design boxes around solving annoying > uapi/kms-config issues properly, so > > Acked-in-principle-or-something-like-that-by: Daniel Vetter <daniel.vetter@ffwll.ch> Thanks! I jumped the gun a bit too fast and forgot to amend the TV property commit message before pushing it out. For the record though, that property is usable through xrandr, xorg.conf or any equivalent compositor mechanism Maxime [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <20220728-rpi-analog-tv-properties-v10-6-256dad125326@cerno.tech>]
* Re: [PATCH v10 06/19] drm/modes: Add a function to generate analog display modes [not found] ` <20220728-rpi-analog-tv-properties-v10-6-256dad125326@cerno.tech> @ 2022-11-24 13:39 ` Noralf Trønnes 0 siblings, 0 replies; 10+ messages in thread From: Noralf Trønnes @ 2022-11-24 13:39 UTC (permalink / raw) To: Maxime Ripard, Samuel Holland, Jernej Skrabec, Maarten Lankhorst, Rodrigo Vivi, Joonas Lahtinen, Maxime Ripard, Ben Skeggs, Chen-Yu Tsai, David Airlie, Jani Nikula, Tvrtko Ursulin, Emma Anholt, Karol Herbst, Lyude Paul, Thomas Zimmermann, Daniel Vetter Cc: Dave Stevenson, Hans de Goede, nouveau, intel-gfx, dri-devel, Mateusz Kwiatkowski, linux-kernel, linux-arm-kernel, linux-sunxi, Dom Cobley, Phil Elwell, Geert Uytterhoeven, Noralf Trønnes Den 17.11.2022 10.28, skrev Maxime Ripard: > Multiple drivers (meson, vc4, sun4i) define analog TV 525-lines and > 625-lines modes in their drivers. > > Since those modes are fairly standard, and that we'll need to use them > in more places in the future, it makes sense to move their definition > into the core framework. > > However, analog display usually have fairly loose timings requirements, > the only discrete parameters being the total number of lines and pixel > clock frequency. Thus, we created a function that will create a display > mode from the standard, the pixel frequency and the active area. > > Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > > --- I'm no domain expert so apart from the timing details which I can't comment on, it looks fine. I personally advocated for a much simpler solution for these NTSC and PAL modes, but AIUI this is part of a grander plan to support devices with other timings. Acked-by: Noralf Trønnes <noralf@tronnes.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-11-24 13:39 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20220728-rpi-analog-tv-properties-v10-0-256dad125326@cerno.tech>
[not found] ` <20220728-rpi-analog-tv-properties-v10-1-256dad125326@cerno.tech>
2022-11-17 11:54 ` [PATCH v10 01/19] drm/tests: client: Mention that we can't use MODULE_ macros Noralf Trønnes
[not found] ` <20220728-rpi-analog-tv-properties-v10-5-256dad125326@cerno.tech>
2022-11-17 14:35 ` [PATCH v10 05/19] drm/connector: Add TV standard property Mauro Carvalho Chehab
2022-11-17 14:53 ` Maxime Ripard
2022-11-24 13:33 ` Noralf Trønnes
[not found] ` <20220728-rpi-analog-tv-properties-v10-18-256dad125326@cerno.tech>
2022-11-17 15:49 ` [PATCH v10 18/19] drm/vc4: vec: Add support for more analog TV standards Mauro Carvalho Chehab
2022-11-17 17:14 ` Maxime Ripard
2022-11-21 20:30 ` Mateusz Kwiatkowski
2022-11-21 14:51 ` [PATCH v10 00/19] drm: Analog TV Improvements Daniel Vetter
2022-11-24 11:49 ` Maxime Ripard
[not found] ` <20220728-rpi-analog-tv-properties-v10-6-256dad125326@cerno.tech>
2022-11-24 13:39 ` [PATCH v10 06/19] drm/modes: Add a function to generate analog display modes Noralf Trønnes
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®