From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A386B7B for ; Wed, 26 Oct 2022 15:34:17 +0000 (UTC) Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.nyi.internal (Postfix) with ESMTP id C058358034E; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Wed, 26 Oct 2022 11:34:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=S I8wnwDx5kD31zoPF47dWJp6IGw5uZ8FvH5bxyZBt6ORtRrgWmnIMwWNS7l3Zbl25 jY3WgSqKYsAOxR7+mf2Ir2nsq3PosXmhEX6407tBFOKUhkI+nj3iJ8C5VXAyWUgV U7J8inJqYQYN1jW3pBDMK2iDaqnUGYhe3HoEyxB3WPqKmU8hr3rWg1eLzotVQkaa iLrLpdGODSbW+a5H4hBCkalSz10+//KG2s2hrU1vQzwSYKirgSAx8kPCGXF+fusJ kvYzJvKmc+MzarZjwFgCWypWjzM9Lrlb0lBDd3ERNflddX/HnhoT/xcP76aKbuUO 8KIbsyFaJC+FR8tQrcVaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=F lCxJ96xPnFyhOHGQQRmLQE792CaizBsC4A1dU79IIrvG+EK9Ics8jDI3a4Ez7/J2 hLXS2BpbKrQhcYT4pl50N00xM1TPXw1M6uba7EKjnP+uXCt31i2TFA2qixZLYzLL +xpuL0r3dYuh3P3V7fp8y9alyBMR5Kq+0l7E8fSHSq9lNCMbfO38by6ExfczNbnJ VX/PhxjbT0M4V1lJecdY/lZwxETjMmbcnJSb5fWqyTYXrqqbGkeAw7SpBh+GTYE4 VvMJzDLntGZTUJOiYT4rsK0/3GkMgeR04tlxv+mHQVOzoPPUeUhWJZWAQNbfmhem TmVIqmzh/PrxW8KU8iUiA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrtddvgdeludcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepmhgrgihi mhgvsegtvghrnhhordhtvggthhenucggtffrrghtthgvrhhnpeeltdekveelgfelveelfe duheelvdegudffgefhudehgeevjefhhefhhefgvdeuvdenucevlhhushhtvghrufhiiigv pedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtg hh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) From: maxime@cerno.tech Date: Wed, 26 Oct 2022 17:33:41 +0200 Subject: [PATCH v6 22/23] drm/vc4: vec: Add support for more analog TV standards Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v6-22-e7792734108f@cerno.tech> References: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> To: Karol Herbst , Emma Anholt , Ben Skeggs , Chen-Yu Tsai , Rodrigo Vivi , Maarten Lankhorst , Jani Nikula , Daniel Vetter , Thomas Zimmermann , Tvrtko Ursulin , Samuel Holland , Jernej Skrabec , David Airlie , Maxime Ripard , Joonas Lahtinen , Lyude Paul Cc: linux-sunxi@lists.linux.dev, Maxime Ripard , intel-gfx@lists.freedesktop.org, Phil Elwell , linux-arm-kernel@lists.infradead.org, nouveau@lists.freedesktop.org, Hans de Goede , Dom Cobley , Mateusz Kwiatkowski , dri-devel@lists.freedesktop.org, Dave Stevenson , linux-kernel@vger.kernel.org, Noralf Trønnes , Geert Uytterhoeven X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=8856; i=maxime@cerno.tech; h=from:subject:message-id; bh=wziPM3IaAF1FVTo4f54fr6Jfyy5eRta4gkEGakfYOhk=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMmRwe7v3FztUk6cWWbLZ8Z8/MSuzw+Xl79gyd7h1JAx9ZOh 1oprHaUsDGJcDLJiiiwxwuZL4k7Net3JxjcPZg4rE8gQBi5OAZiIdgnDP/PgtxFy61n+vZW92Hs/tO 4Vj5OGfGDcAw979VVT/epKtjIy/D51ZeeeC/YWO97+Wr156/w6823/F255+/5P8FytrJi4K0wA X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D From: Mateusz Kwiatkowski 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. - 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. Also added some comments explaining color subcarrier frequency registers. Acked-by: Noralf Trønnes Signed-off-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- 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 1dda451c8def..d82aef168075 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; @@ -643,9 +743,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; -- b4 0.11.0-dev-99e3a From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id ED638C38A2D for ; Wed, 26 Oct 2022 15:36:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 62F1C10E55C; Wed, 26 Oct 2022 15:34:41 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6CA6E10E543; Wed, 26 Oct 2022 15:34:17 +0000 (UTC) Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.nyi.internal (Postfix) with ESMTP id C058358034E; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Wed, 26 Oct 2022 11:34:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=S I8wnwDx5kD31zoPF47dWJp6IGw5uZ8FvH5bxyZBt6ORtRrgWmnIMwWNS7l3Zbl25 jY3WgSqKYsAOxR7+mf2Ir2nsq3PosXmhEX6407tBFOKUhkI+nj3iJ8C5VXAyWUgV U7J8inJqYQYN1jW3pBDMK2iDaqnUGYhe3HoEyxB3WPqKmU8hr3rWg1eLzotVQkaa iLrLpdGODSbW+a5H4hBCkalSz10+//KG2s2hrU1vQzwSYKirgSAx8kPCGXF+fusJ kvYzJvKmc+MzarZjwFgCWypWjzM9Lrlb0lBDd3ERNflddX/HnhoT/xcP76aKbuUO 8KIbsyFaJC+FR8tQrcVaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=F lCxJ96xPnFyhOHGQQRmLQE792CaizBsC4A1dU79IIrvG+EK9Ics8jDI3a4Ez7/J2 hLXS2BpbKrQhcYT4pl50N00xM1TPXw1M6uba7EKjnP+uXCt31i2TFA2qixZLYzLL +xpuL0r3dYuh3P3V7fp8y9alyBMR5Kq+0l7E8fSHSq9lNCMbfO38by6ExfczNbnJ VX/PhxjbT0M4V1lJecdY/lZwxETjMmbcnJSb5fWqyTYXrqqbGkeAw7SpBh+GTYE4 VvMJzDLntGZTUJOiYT4rsK0/3GkMgeR04tlxv+mHQVOzoPPUeUhWJZWAQNbfmhem TmVIqmzh/PrxW8KU8iUiA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrtddvgdeludcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepmhgrgihi mhgvsegtvghrnhhordhtvggthhenucggtffrrghtthgvrhhnpeeltdekveelgfelveelfe duheelvdegudffgefhudehgeevjefhhefhhefgvdeuvdenucevlhhushhtvghrufhiiigv pedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtg hh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) From: maxime@cerno.tech Date: Wed, 26 Oct 2022 17:33:41 +0200 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v6-22-e7792734108f@cerno.tech> References: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> To: Karol Herbst , Emma Anholt , Ben Skeggs , Chen-Yu Tsai , Rodrigo Vivi , Maarten Lankhorst , Jani Nikula , Daniel Vetter , Thomas Zimmermann , Tvrtko Ursulin , Samuel Holland , Jernej Skrabec , David Airlie , Maxime Ripard , Joonas Lahtinen , Lyude Paul X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=8856; i=maxime@cerno.tech; h=from:subject:message-id; bh=wziPM3IaAF1FVTo4f54fr6Jfyy5eRta4gkEGakfYOhk=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMmRwe7v3FztUk6cWWbLZ8Z8/MSuzw+Xl79gyd7h1JAx9ZOh 1oprHaUsDGJcDLJiiiwxwuZL4k7Net3JxjcPZg4rE8gQBi5OAZiIdgnDP/PgtxFy61n+vZW92Hs/tO 4Vj5OGfGDcAw979VVT/epKtjIy/D51ZeeeC/YWO97+Wr156/w6823/F255+/5P8FytrJi4K0wA X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Subject: [Nouveau] [PATCH v6 22/23] drm/vc4: vec: Add support for more analog TV standards X-BeenThere: nouveau@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Nouveau development list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dom Cobley , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-sunxi@lists.linux.dev, Hans de Goede , Noralf Trønnes , Geert Uytterhoeven , Maxime Ripard , Mateusz Kwiatkowski , Phil Elwell , linux-arm-kernel@lists.infradead.org Errors-To: nouveau-bounces@lists.freedesktop.org Sender: "Nouveau" From: Mateusz Kwiatkowski 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. - 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. Also added some comments explaining color subcarrier frequency registers. Acked-by: Noralf Trønnes Signed-off-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- 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 1dda451c8def..d82aef168075 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; @@ -643,9 +743,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; -- b4 0.11.0-dev-99e3a From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D6285C433FE for ; Wed, 26 Oct 2022 15:36:31 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 17E0710E559; Wed, 26 Oct 2022 15:34:51 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6CA6E10E543; Wed, 26 Oct 2022 15:34:17 +0000 (UTC) Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.nyi.internal (Postfix) with ESMTP id C058358034E; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Wed, 26 Oct 2022 11:34:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=S I8wnwDx5kD31zoPF47dWJp6IGw5uZ8FvH5bxyZBt6ORtRrgWmnIMwWNS7l3Zbl25 jY3WgSqKYsAOxR7+mf2Ir2nsq3PosXmhEX6407tBFOKUhkI+nj3iJ8C5VXAyWUgV U7J8inJqYQYN1jW3pBDMK2iDaqnUGYhe3HoEyxB3WPqKmU8hr3rWg1eLzotVQkaa iLrLpdGODSbW+a5H4hBCkalSz10+//KG2s2hrU1vQzwSYKirgSAx8kPCGXF+fusJ kvYzJvKmc+MzarZjwFgCWypWjzM9Lrlb0lBDd3ERNflddX/HnhoT/xcP76aKbuUO 8KIbsyFaJC+FR8tQrcVaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=F lCxJ96xPnFyhOHGQQRmLQE792CaizBsC4A1dU79IIrvG+EK9Ics8jDI3a4Ez7/J2 hLXS2BpbKrQhcYT4pl50N00xM1TPXw1M6uba7EKjnP+uXCt31i2TFA2qixZLYzLL +xpuL0r3dYuh3P3V7fp8y9alyBMR5Kq+0l7E8fSHSq9lNCMbfO38by6ExfczNbnJ VX/PhxjbT0M4V1lJecdY/lZwxETjMmbcnJSb5fWqyTYXrqqbGkeAw7SpBh+GTYE4 VvMJzDLntGZTUJOiYT4rsK0/3GkMgeR04tlxv+mHQVOzoPPUeUhWJZWAQNbfmhem TmVIqmzh/PrxW8KU8iUiA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrtddvgdeludcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepmhgrgihi mhgvsegtvghrnhhordhtvggthhenucggtffrrghtthgvrhhnpeeltdekveelgfelveelfe duheelvdegudffgefhudehgeevjefhhefhhefgvdeuvdenucevlhhushhtvghrufhiiigv pedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtg hh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) From: maxime@cerno.tech Date: Wed, 26 Oct 2022 17:33:41 +0200 Subject: [PATCH v6 22/23] drm/vc4: vec: Add support for more analog TV standards MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v6-22-e7792734108f@cerno.tech> References: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> To: Karol Herbst , Emma Anholt , Ben Skeggs , Chen-Yu Tsai , Rodrigo Vivi , Maarten Lankhorst , Jani Nikula , Daniel Vetter , Thomas Zimmermann , Tvrtko Ursulin , Samuel Holland , Jernej Skrabec , David Airlie , Maxime Ripard , Joonas Lahtinen , Lyude Paul X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=8856; i=maxime@cerno.tech; h=from:subject:message-id; bh=wziPM3IaAF1FVTo4f54fr6Jfyy5eRta4gkEGakfYOhk=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMmRwe7v3FztUk6cWWbLZ8Z8/MSuzw+Xl79gyd7h1JAx9ZOh 1oprHaUsDGJcDLJiiiwxwuZL4k7Net3JxjcPZg4rE8gQBi5OAZiIdgnDP/PgtxFy61n+vZW92Hs/tO 4Vj5OGfGDcAw979VVT/epKtjIy/D51ZeeeC/YWO97+Wr156/w6823/F255+/5P8FytrJi4K0wA X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dom Cobley , Dave Stevenson , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-sunxi@lists.linux.dev, Hans de Goede , Noralf Trønnes , Geert Uytterhoeven , Maxime Ripard , Mateusz Kwiatkowski , Phil Elwell , linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Mateusz Kwiatkowski 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. - 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. Also added some comments explaining color subcarrier frequency registers. Acked-by: Noralf Trønnes Signed-off-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- 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 1dda451c8def..d82aef168075 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; @@ -643,9 +743,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; -- b4 0.11.0-dev-99e3a From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C5DAEC433FE for ; Wed, 26 Oct 2022 15:36:45 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C50C610E366; Wed, 26 Oct 2022 15:35:29 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6CA6E10E543; Wed, 26 Oct 2022 15:34:17 +0000 (UTC) Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.nyi.internal (Postfix) with ESMTP id C058358034E; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Wed, 26 Oct 2022 11:34:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=S I8wnwDx5kD31zoPF47dWJp6IGw5uZ8FvH5bxyZBt6ORtRrgWmnIMwWNS7l3Zbl25 jY3WgSqKYsAOxR7+mf2Ir2nsq3PosXmhEX6407tBFOKUhkI+nj3iJ8C5VXAyWUgV U7J8inJqYQYN1jW3pBDMK2iDaqnUGYhe3HoEyxB3WPqKmU8hr3rWg1eLzotVQkaa iLrLpdGODSbW+a5H4hBCkalSz10+//KG2s2hrU1vQzwSYKirgSAx8kPCGXF+fusJ kvYzJvKmc+MzarZjwFgCWypWjzM9Lrlb0lBDd3ERNflddX/HnhoT/xcP76aKbuUO 8KIbsyFaJC+FR8tQrcVaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=F lCxJ96xPnFyhOHGQQRmLQE792CaizBsC4A1dU79IIrvG+EK9Ics8jDI3a4Ez7/J2 hLXS2BpbKrQhcYT4pl50N00xM1TPXw1M6uba7EKjnP+uXCt31i2TFA2qixZLYzLL +xpuL0r3dYuh3P3V7fp8y9alyBMR5Kq+0l7E8fSHSq9lNCMbfO38by6ExfczNbnJ VX/PhxjbT0M4V1lJecdY/lZwxETjMmbcnJSb5fWqyTYXrqqbGkeAw7SpBh+GTYE4 VvMJzDLntGZTUJOiYT4rsK0/3GkMgeR04tlxv+mHQVOzoPPUeUhWJZWAQNbfmhem TmVIqmzh/PrxW8KU8iUiA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrtddvgdeludcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepmhgrgihi mhgvsegtvghrnhhordhtvggthhenucggtffrrghtthgvrhhnpeeltdekveelgfelveelfe duheelvdegudffgefhudehgeevjefhhefhhefgvdeuvdenucevlhhushhtvghrufhiiigv pedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtg hh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) From: maxime@cerno.tech Date: Wed, 26 Oct 2022 17:33:41 +0200 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v6-22-e7792734108f@cerno.tech> References: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> To: Karol Herbst , Emma Anholt , Ben Skeggs , Chen-Yu Tsai , Rodrigo Vivi , Maarten Lankhorst , Jani Nikula , Daniel Vetter , Thomas Zimmermann , Tvrtko Ursulin , Samuel Holland , Jernej Skrabec , David Airlie , Maxime Ripard , Joonas Lahtinen , Lyude Paul X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=8856; i=maxime@cerno.tech; h=from:subject:message-id; bh=wziPM3IaAF1FVTo4f54fr6Jfyy5eRta4gkEGakfYOhk=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMmRwe7v3FztUk6cWWbLZ8Z8/MSuzw+Xl79gyd7h1JAx9ZOh 1oprHaUsDGJcDLJiiiwxwuZL4k7Net3JxjcPZg4rE8gQBi5OAZiIdgnDP/PgtxFy61n+vZW92Hs/tO 4Vj5OGfGDcAw979VVT/epKtjIy/D51ZeeeC/YWO97+Wr156/w6823/F255+/5P8FytrJi4K0wA X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Subject: [Intel-gfx] [PATCH v6 22/23] drm/vc4: vec: Add support for more analog TV standards X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dom Cobley , Dave Stevenson , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-sunxi@lists.linux.dev, Hans de Goede , Noralf Trønnes , Geert Uytterhoeven , Maxime Ripard , Mateusz Kwiatkowski , Phil Elwell , linux-arm-kernel@lists.infradead.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" From: Mateusz Kwiatkowski 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. - 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. Also added some comments explaining color subcarrier frequency registers. Acked-by: Noralf Trønnes Signed-off-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- 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 1dda451c8def..d82aef168075 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; @@ -643,9 +743,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; -- b4 0.11.0-dev-99e3a From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6A596C433FE for ; Wed, 26 Oct 2022 15:51:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=C5MbOLz0FOehwBbTXRKjzxGQfKLim3ZzouIpfpoOZXE=; b=yOdTszMocHJ2kw nhhTCOjyE7aeCQEOizwMqHVssNp+lkPpyV2gDat1gcat30C2r8yMkvSqUnygQR3dtx0Qr471Z1CX8 rH7wujN5E0QDfbGAzp9mvne0GQ+voWf4LPkBicOGCzlOBJ0doP7WuWog6qLKpbr9dxsLtDqAYZfOB mMLmsqvoAz71qVw2jTVaIXKfUZzs91dGm0C9CbHBZ0owwPliZfnlj74FSkRaKh18ohlTwLdw8+PQb Ji0vFU+njl71YMoN3pJEfDrQ8MgbHk6teaqt9vckuwH0BYwrh0odIlFcVTj5KRBebar8yFXLcJQKq AhE9yYgtcF/fnAguEZ0A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1onifC-009zvl-Uu; Wed, 26 Oct 2022 15:49:58 +0000 Received: from new4-smtp.messagingengine.com ([66.111.4.230]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oniQ5-009uEg-J5 for linux-arm-kernel@lists.infradead.org; Wed, 26 Oct 2022 15:34:20 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.nyi.internal (Postfix) with ESMTP id C058358034E; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Wed, 26 Oct 2022 11:34:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=S I8wnwDx5kD31zoPF47dWJp6IGw5uZ8FvH5bxyZBt6ORtRrgWmnIMwWNS7l3Zbl25 jY3WgSqKYsAOxR7+mf2Ir2nsq3PosXmhEX6407tBFOKUhkI+nj3iJ8C5VXAyWUgV U7J8inJqYQYN1jW3pBDMK2iDaqnUGYhe3HoEyxB3WPqKmU8hr3rWg1eLzotVQkaa iLrLpdGODSbW+a5H4hBCkalSz10+//KG2s2hrU1vQzwSYKirgSAx8kPCGXF+fusJ kvYzJvKmc+MzarZjwFgCWypWjzM9Lrlb0lBDd3ERNflddX/HnhoT/xcP76aKbuUO 8KIbsyFaJC+FR8tQrcVaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1666798456; x= 1666805656; bh=LzTPAa92BhQMzOTXJn8qXdt5AoqxQNWwjIipeEayeg8=; b=F lCxJ96xPnFyhOHGQQRmLQE792CaizBsC4A1dU79IIrvG+EK9Ics8jDI3a4Ez7/J2 hLXS2BpbKrQhcYT4pl50N00xM1TPXw1M6uba7EKjnP+uXCt31i2TFA2qixZLYzLL +xpuL0r3dYuh3P3V7fp8y9alyBMR5Kq+0l7E8fSHSq9lNCMbfO38by6ExfczNbnJ VX/PhxjbT0M4V1lJecdY/lZwxETjMmbcnJSb5fWqyTYXrqqbGkeAw7SpBh+GTYE4 VvMJzDLntGZTUJOiYT4rsK0/3GkMgeR04tlxv+mHQVOzoPPUeUhWJZWAQNbfmhem TmVIqmzh/PrxW8KU8iUiA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrtddvgdeludcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepmhgrgihi mhgvsegtvghrnhhordhtvggthhenucggtffrrghtthgvrhhnpeeltdekveelgfelveelfe duheelvdegudffgefhudehgeevjefhhefhhefgvdeuvdenucevlhhushhtvghrufhiiigv pedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtg hh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 26 Oct 2022 11:34:16 -0400 (EDT) From: maxime@cerno.tech Date: Wed, 26 Oct 2022 17:33:41 +0200 Subject: [PATCH v6 22/23] drm/vc4: vec: Add support for more analog TV standards MIME-Version: 1.0 Message-Id: <20220728-rpi-analog-tv-properties-v6-22-e7792734108f@cerno.tech> References: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v6-0-e7792734108f@cerno.tech> To: Karol Herbst , Emma Anholt , Ben Skeggs , Chen-Yu Tsai , Rodrigo Vivi , Maarten Lankhorst , Jani Nikula , Daniel Vetter , Thomas Zimmermann , Tvrtko Ursulin , Samuel Holland , Jernej Skrabec , David Airlie , Maxime Ripard , Joonas Lahtinen , Lyude Paul Cc: linux-sunxi@lists.linux.dev, Maxime Ripard , intel-gfx@lists.freedesktop.org, Phil Elwell , linux-arm-kernel@lists.infradead.org, nouveau@lists.freedesktop.org, Hans de Goede , Dom Cobley , Mateusz Kwiatkowski , dri-devel@lists.freedesktop.org, Dave Stevenson , linux-kernel@vger.kernel.org, Noralf Trønnes , Geert Uytterhoeven X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=8856; i=maxime@cerno.tech; h=from:subject:message-id; bh=wziPM3IaAF1FVTo4f54fr6Jfyy5eRta4gkEGakfYOhk=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMmRwe7v3FztUk6cWWbLZ8Z8/MSuzw+Xl79gyd7h1JAx9ZOh 1oprHaUsDGJcDLJiiiwxwuZL4k7Net3JxjcPZg4rE8gQBi5OAZiIdgnDP/PgtxFy61n+vZW92Hs/tO 4Vj5OGfGDcAw979VVT/epKtjIy/D51ZeeeC/YWO97+Wr156/w6823/F255+/5P8FytrJi4K0wA X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221026_083417_792826_B181C87A X-CRM114-Status: GOOD ( 23.21 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogTWF0ZXVzeiBLd2lhdGtvd3NraSA8a2Z5YXRlaytwdWJsaWNnaXRAZ21haWwuY29tPgoK QWRkIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgY29tcG9zaXRlIG91dHB1dCBtb2RlcyAoYWxs IG9mIHRoZW0gYXJlCnNvbWV3aGF0IG1vcmUgb2JzY3VyZSB0aGFuIHRoZSBwcmV2aW91c2x5IGRl ZmluZWQgb25lcyk6CgotIE5UU0NfNDQzIC0gTlRTQy1zdHlsZSBzaWduYWwgd2l0aCB0aGUgY2hy b21hIHN1YmNhcnJpZXIgc2hpZnRlZCB0bwogIDQuNDMzNjE4NzUgTUh6ICh0aGUgUEFMIHN1YmNh cnJpZXIgZnJlcXVlbmN5KS4gTmV2ZXIgdXNlZCBmb3IKICBicm9hZGNhc3RpbmcsIGJ1dCBzb21l dGltZXMgdXNlZCBhcyBhIGhhY2sgdG8gcGxheSBOVFNDIGNvbnRlbnQgaW4gUEFMCiAgcmVnaW9u cyAoZS5nLiBvbiBWQ1JzKS4KLSBQQUxfTiAtIFBBTCB3aXRoIGFsdGVybmF0aXZlIGNocm9tYSBz dWJjYXJyaWVyIGZyZXF1ZW5jeSwKICAzLjU4MjA1NjI1IE1Iei4gVXNlZCBhcyBhIGJyb2FkY2Fz dCBzdGFuZGFyZCBpbiBBcmdlbnRpbmEsIFBhcmFndWF5CiAgYW5kIFVydWd1YXkgdG8gZml0IDU3 Nmk1MCB3aXRoIGNvbG91ciBpbiA2IE1IeiBjaGFubmVsIHJhc3Rlci4KLSBQQUw2MCAtIDQ4MGk2 MCBzaWduYWwgd2l0aCBQQUwtc3R5bGUgY29sb3IgYXQgbm9ybWFsIEV1cm9wZWFuIFBBTAogIGZy ZXF1ZW5jeS4gQW5vdGhlciBub24tc3RhbmRhcmQsIG5vbi1icm9hZGNhc3QgbW9kZSwgdXNlZCBp biBzaW1pbGFyCiAgY29udGV4dHMgYXMgTlRTQ180NDMuIFNvbWUgZGlzcGxheXMgc3VwcG9ydCBv bmUgYnV0IG5vdCB0aGUgb3RoZXIuCi0gU0VDQU0gLSBGcmVuY2ggZnJlcXVlbmN5LW1vZHVsYXRl ZCBhbmFsb2cgY29sb3Igc3RhbmRhcmQ7IGFsc28gaGF2ZQogIGJlZW4gYnJvYWRjYXN0IGluIEVh c3Rlcm4gRXVyb3BlIGFuZCB2YXJpb3VzIHBhcnRzIG9mIEFmcmljYSBhbmQgQXNpYS4KICBVc2Vz IHRoZSBzYW1lIDU3Nmk1MCB0aW1pbmdzIGFzIFBBTC4KCkFsc28gYWRkZWQgc29tZSBjb21tZW50 cyBleHBsYWluaW5nIGNvbG9yIHN1YmNhcnJpZXIgZnJlcXVlbmN5CnJlZ2lzdGVycy4KCkFja2Vk LWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KU2lnbmVkLW9mZi1ieTog TWF0ZXVzeiBLd2lhdGtvd3NraSA8a2Z5YXRlaytwdWJsaWNnaXRAZ21haWwuY29tPgpTaWduZWQt b2ZmLWJ5OiBNYXhpbWUgUmlwYXJkIDxtYXhpbWVAY2Vybm8udGVjaD4KCi0tLQpDaGFuZ2VzIGlu IHY2OgotIFN1cHBvcnQgUEFMNjAgYWdhaW4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92 ZWMuYyB8IDExMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KIDEg ZmlsZSBjaGFuZ2VkLCAxMDcgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMuYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQv dmM0X3ZlYy5jCmluZGV4IDFkZGE0NTFjOGRlZi4uZDgyYWVmMTY4MDc1IDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3Zj NF92ZWMuYwpAQCAtNDYsNiArNDYsNyBAQAogI2RlZmluZSBWRUNfQ09ORklHMF9ZREVMKHgpCQko KHgpIDw8IDI2KQogI2RlZmluZSBWRUNfQ09ORklHMF9DREVMX01BU0sJCUdFTk1BU0soMjUsIDI0 KQogI2RlZmluZSBWRUNfQ09ORklHMF9DREVMKHgpCQkoKHgpIDw8IDI0KQorI2RlZmluZSBWRUNf Q09ORklHMF9TRUNBTV9TVEQJCUJJVCgyMSkKICNkZWZpbmUgVkVDX0NPTkZJRzBfUEJQUl9GSUwJ CUJJVCgxOCkKICNkZWZpbmUgVkVDX0NPTkZJRzBfQ0hST01BX0dBSU5fTUFTSwlHRU5NQVNLKDE3 LCAxNikKICNkZWZpbmUgVkVDX0NPTkZJRzBfQ0hST01BX0dBSU5fVU5JVFkJKDAgPDwgMTYpCkBA IC03Niw2ICs3NywyNyBAQAogI2RlZmluZSBWRUNfU09GVF9SRVNFVAkJCTB4MTBjCiAjZGVmaW5l IFZFQ19DTE1QMF9TVEFSVAkJCTB4MTQ0CiAjZGVmaW5lIFZFQ19DTE1QMF9FTkQJCQkweDE0OAor CisvKgorICogVGhlc2Ugc2V0IHRoZSBjb2xvciBzdWJjYXJyaWVyIGZyZXF1ZW5jeQorICogaWYg VkVDX0NPTkZJRzFfQ1VTVE9NX0ZSRVEgaXMgZW5hYmxlZC4KKyAqCisgKiBWRUNfRlJFUTFfMCBj b250YWlucyB0aGUgbW9zdCBzaWduaWZpY2FudCAxNi1iaXQgaGFsZi13b3JkLAorICogVkVDX0ZS RVEzXzIgY29udGFpbnMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDE2LWJpdCBoYWxmLXdvcmQuCisg KiAweDgwMDAwMDAwIHNlZW1zIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHBpeGVsIGNsb2NrCisg KiAod2hpY2ggaXRzZWxmIGlzIHRoZSBWRUMgY2xvY2sgZGl2aWRlZCBieSA4KS4KKyAqCisgKiBS ZWZlcmVuY2UgdmFsdWVzICh3aXRoIHRoZSBkZWZhdWx0IHBpeGVsIGNsb2NrIG9mIDEzLjUgTUh6 KToKKyAqCisgKiBOVFNDICAoMzU3OTU0NS5bNDVdIEh6KSAgICAgLSAweDIxRjA3QzFGCisgKiBQ QUwgICAoNDQzMzYxOC43NSBIeikgICAgICAgLSAweDJBMDk4QUNCCisgKiBQQUwtTSAoMzU3NTYx MS5bODg4MTExXSBIeikgLSAweDIxRTZFRkUzCisgKiBQQUwtTiAoMzU4MjA1Ni4yNSBIeikgICAg ICAgLSAweDIxRjY5NDQ2CisgKgorICogTk9URTogRm9yIFNFQ0FNLCBpdCBpcyB1c2VkIGFzIHRo ZSBEciBjZW50ZXIgZnJlcXVlbmN5LAorICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFZFQ19DT05G SUcxX0NVU1RPTV9GUkVRIGlzIGVuYWJsZWQgb3Igbm90OworICogdGhhdCBpcyBzcGVjaWZpZWQg YXMgNDQwNjI1MCBIeiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gMHgyOUM3MUM3Mi4KKyAqLwogI2Rl ZmluZSBWRUNfRlJFUTNfMgkJCTB4MTgwCiAjZGVmaW5lIFZFQ19GUkVRMV8wCQkJMHgxODQKIApA QCAtMTE4LDYgKzE0MCwxNCBAQAogCiAjZGVmaW5lIFZFQ19JTlRFUlJVUFRfQ09OVFJPTAkJMHgx OTAKICNkZWZpbmUgVkVDX0lOVEVSUlVQVF9TVEFUVVMJCTB4MTk0CisKKy8qCisgKiBEYiBjZW50 ZXIgZnJlcXVlbmN5IGZvciBTRUNBTTsgdGhlIGNsb2NrIGZvciB0aGlzIGlzIHRoZSBzYW1lIGFz IGZvcgorICogVkVDX0ZSRVEzXzIvVkVDX0ZSRVExXzAsIHdoaWNoIGlzIHVzZWQgZm9yIERyIGNl bnRlciBmcmVxdWVuY3kuCisgKgorICogVGhpcyBpcyBzcGVjaWZpZWQgYXMgNDI1MDAwMCBIeiwg d2hpY2ggY29ycmVzcG9uZHMgdG8gMHgyODRCREExMy4KKyAqIFRoYXQgaXMgYWxzbyB0aGUgZGVm YXVsdCB2YWx1ZSwgc28gbm8gbmVlZCB0byBzZXQgaXQgZXhwbGljaXRseS4KKyAqLwogI2RlZmlu ZSBWRUNfRkNXX1NFQ0FNX0IJCQkweDE5OAogI2RlZmluZSBWRUNfU0VDQU1fR0FJTl9WQUwJCTB4 MTljCiAKQEAgLTE5NywxMCArMjI3LDE1IEBAIGVudW0gdmM0X3ZlY190dl9tb2RlX2lkIHsKIAlW QzRfVkVDX1RWX01PREVfTlRTQ19KLAogCVZDNF9WRUNfVFZfTU9ERV9QQUwsCiAJVkM0X1ZFQ19U Vl9NT0RFX1BBTF9NLAorCVZDNF9WRUNfVFZfTU9ERV9OVFNDXzQ0MywKKwlWQzRfVkVDX1RWX01P REVfUEFMXzYwLAorCVZDNF9WRUNfVFZfTU9ERV9QQUxfTiwKKwlWQzRfVkVDX1RWX01PREVfU0VD QU0sCiB9OwogCiBzdHJ1Y3QgdmM0X3ZlY190dl9tb2RlIHsKIAl1bnNpZ25lZCBpbnQgbW9kZTsK Kwl1MTYgZXhwZWN0ZWRfaHRvdGFsOwogCXUzMiBjb25maWcwOwogCXUzMiBjb25maWcxOwogCXUz MiBjdXN0b21fZnJlcTsKQEAgLTIzNiwzNSArMjcxLDY4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg ZGVidWdmc19yZWczMiB2ZWNfcmVnc1tdID0gewogc3RhdGljIGNvbnN0IHN0cnVjdCB2YzRfdmVj X3R2X21vZGUgdmM0X3ZlY190dl9tb2Rlc1tdID0gewogCXsKIAkJLm1vZGUgPSBEUk1fTU9ERV9U Vl9NT0RFX05UU0MsCisJCS5leHBlY3RlZF9odG90YWwgPSA4NTgsCiAJCS5jb25maWcwID0gVkVD X0NPTkZJRzBfTlRTQ19TVEQgfCBWRUNfQ09ORklHMF9QREVOLAogCQkuY29uZmlnMSA9IFZFQ19D T05GSUcxX0NfQ1ZCU19DVkJTLAogCX0sCisJeworCQkubW9kZSA9IERSTV9NT0RFX1RWX01PREVf TlRTQ180NDMsCisJCS5leHBlY3RlZF9odG90YWwgPSA4NTgsCisJCS5jb25maWcwID0gVkVDX0NP TkZJRzBfTlRTQ19TVEQsCisJCS5jb25maWcxID0gVkVDX0NPTkZJRzFfQ19DVkJTX0NWQlMgfCBW RUNfQ09ORklHMV9DVVNUT01fRlJFUSwKKwkJLmN1c3RvbV9mcmVxID0gMHgyYTA5OGFjYiwKKwl9 LAogCXsKIAkJLm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX05UU0NfSiwKKwkJLmV4cGVjdGVkX2h0 b3RhbCA9IDg1OCwKIAkJLmNvbmZpZzAgPSBWRUNfQ09ORklHMF9OVFNDX1NURCwKIAkJLmNvbmZp ZzEgPSBWRUNfQ09ORklHMV9DX0NWQlNfQ1ZCUywKIAl9LAogCXsKIAkJLm1vZGUgPSBEUk1fTU9E RV9UVl9NT0RFX1BBTCwKKwkJLmV4cGVjdGVkX2h0b3RhbCA9IDg2NCwKIAkJLmNvbmZpZzAgPSBW RUNfQ09ORklHMF9QQUxfQkRHSElfU1RELAogCQkuY29uZmlnMSA9IFZFQ19DT05GSUcxX0NfQ1ZC U19DVkJTLAogCX0sCisJeworCQkvKiBQQUwtNjAgKi8KKwkJLm1vZGUgPSBEUk1fTU9ERV9UVl9N T0RFX1BBTCwKKwkJLmV4cGVjdGVkX2h0b3RhbCA9IDg1OCwKKwkJLmNvbmZpZzAgPSBWRUNfQ09O RklHMF9QQUxfTV9TVEQsCisJCS5jb25maWcxID0gVkVDX0NPTkZJRzFfQ19DVkJTX0NWQlMgfCBW RUNfQ09ORklHMV9DVVNUT01fRlJFUSwKKwkJLmN1c3RvbV9mcmVxID0gMHgyYTA5OGFjYiwKKwl9 LAogCXsKIAkJLm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTF9NLAorCQkuZXhwZWN0ZWRfaHRv dGFsID0gODU4LAogCQkuY29uZmlnMCA9IFZFQ19DT05GSUcwX1BBTF9NX1NURCwKIAkJLmNvbmZp ZzEgPSBWRUNfQ09ORklHMV9DX0NWQlNfQ1ZCUywKIAl9LAorCXsKKwkJLm1vZGUgPSBEUk1fTU9E RV9UVl9NT0RFX1BBTF9OLAorCQkuZXhwZWN0ZWRfaHRvdGFsID0gODY0LAorCQkuY29uZmlnMCA9 IFZFQ19DT05GSUcwX1BBTF9OX1NURCwKKwkJLmNvbmZpZzEgPSBWRUNfQ09ORklHMV9DX0NWQlNf Q1ZCUywKKwl9LAorCXsKKwkJLm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1NFQ0FNLAorCQkuZXhw ZWN0ZWRfaHRvdGFsID0gODY0LAorCQkuY29uZmlnMCA9IFZFQ19DT05GSUcwX1NFQ0FNX1NURCwK KwkJLmNvbmZpZzEgPSBWRUNfQ09ORklHMV9DX0NWQlNfQ1ZCUywKKwkJLmN1c3RvbV9mcmVxID0g MHgyOWM3MWM3MiwKKwl9LAogfTsKIAogc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgdmM0X3Zl Y190dl9tb2RlICoKLXZjNF92ZWNfdHZfbW9kZV9sb29rdXAodW5zaWduZWQgaW50IG1vZGUpCit2 YzRfdmVjX3R2X21vZGVfbG9va3VwKHVuc2lnbmVkIGludCBtb2RlLCB1MTYgaHRvdGFsKQogewog CXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmM0X3ZlY190 dl9tb2Rlcyk7IGkrKykgewogCQljb25zdCBzdHJ1Y3QgdmM0X3ZlY190dl9tb2RlICp0dl9tb2Rl ID0gJnZjNF92ZWNfdHZfbW9kZXNbaV07CiAKLQkJaWYgKHR2X21vZGUtPm1vZGUgPT0gbW9kZSkK KwkJaWYgKHR2X21vZGUtPm1vZGUgPT0gbW9kZSAmJgorCQkgICAgdHZfbW9kZS0+ZXhwZWN0ZWRf aHRvdGFsID09IGh0b3RhbCkKIAkJCXJldHVybiB0dl9tb2RlOwogCX0KIApAQCAtMjczLDkgKzM0 MSwxMyBAQCB2YzRfdmVjX3R2X21vZGVfbG9va3VwKHVuc2lnbmVkIGludCBtb2RlKQogCiBzdGF0 aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBsZWdhY3lfdHZfbW9kZV9uYW1lc1td ID0gewogCXsgVkM0X1ZFQ19UVl9NT0RFX05UU0MsICJOVFNDIiwgfSwKKwl7IFZDNF9WRUNfVFZf TU9ERV9OVFNDXzQ0MywgIk5UU0MtNDQzIiwgfSwKIAl7IFZDNF9WRUNfVFZfTU9ERV9OVFNDX0os ICJOVFNDLUoiLCB9LAogCXsgVkM0X1ZFQ19UVl9NT0RFX1BBTCwgIlBBTCIsIH0sCisJeyBWQzRf VkVDX1RWX01PREVfUEFMXzYwLCAiUEFMLTYwIiwgfSwKIAl7IFZDNF9WRUNfVFZfTU9ERV9QQUxf TSwgIlBBTC1NIiwgfSwKKwl7IFZDNF9WRUNfVFZfTU9ERV9QQUxfTiwgIlBBTC1OIiwgfSwKKwl7 IFZDNF9WRUNfVFZfTU9ERV9TRUNBTSwgIlNFQ0FNIiwgfSwKIH07CiAKIHN0YXRpYyBlbnVtIGRy bV9jb25uZWN0b3Jfc3RhdHVzCkBAIC0zMDYsMTEgKzM3OCwxNiBAQCB2YzRfdmVjX2Nvbm5lY3Rv cl9zZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJc3RhdGUt PnR2Lm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX05UU0M7CiAJCWJyZWFrOwogCisJY2FzZSBWQzRf VkVDX1RWX01PREVfTlRTQ180NDM6CisJCXN0YXRlLT50di5tb2RlID0gRFJNX01PREVfVFZfTU9E RV9OVFNDXzQ0MzsKKwkJYnJlYWs7CisKIAljYXNlIFZDNF9WRUNfVFZfTU9ERV9OVFNDX0o6CiAJ CXN0YXRlLT50di5tb2RlID0gRFJNX01PREVfVFZfTU9ERV9OVFNDX0o7CiAJCWJyZWFrOwogCiAJ Y2FzZSBWQzRfVkVDX1RWX01PREVfUEFMOgorCWNhc2UgVkM0X1ZFQ19UVl9NT0RFX1BBTF82MDoK IAkJc3RhdGUtPnR2Lm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTDsKIAkJYnJlYWs7CiAKQEAg LTMxOCw2ICszOTUsMTQgQEAgdmM0X3ZlY19jb25uZWN0b3Jfc2V0X3Byb3BlcnR5KHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCXN0YXRlLT50di5tb2RlID0gRFJNX01PREVfVFZf TU9ERV9QQUxfTTsKIAkJYnJlYWs7CiAKKwljYXNlIFZDNF9WRUNfVFZfTU9ERV9QQUxfTjoKKwkJ c3RhdGUtPnR2Lm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTF9OOworCQlicmVhazsKKworCWNh c2UgVkM0X1ZFQ19UVl9NT0RFX1NFQ0FNOgorCQlzdGF0ZS0+dHYubW9kZSA9IERSTV9NT0RFX1RW X01PREVfU0VDQU07CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJ fQpAQCAtMzQxLDYgKzQyNiwxMCBAQCB2YzRfdmVjX2Nvbm5lY3Rvcl9nZXRfcHJvcGVydHkoc3Ry dWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJKnZhbCA9IFZDNF9WRUNfVFZfTU9ERV9O VFNDOwogCQlicmVhazsKIAorCWNhc2UgRFJNX01PREVfVFZfTU9ERV9OVFNDXzQ0MzoKKwkJKnZh bCA9IFZDNF9WRUNfVFZfTU9ERV9OVFNDXzQ0MzsKKwkJYnJlYWs7CisKIAljYXNlIERSTV9NT0RF X1RWX01PREVfTlRTQ19KOgogCQkqdmFsID0gVkM0X1ZFQ19UVl9NT0RFX05UU0NfSjsKIAkJYnJl YWs7CkBAIC0zNTMsNiArNDQyLDE0IEBAIHZjNF92ZWNfY29ubmVjdG9yX2dldF9wcm9wZXJ0eShz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkqdmFsID0gVkM0X1ZFQ19UVl9NT0RF X1BBTF9NOwogCQlicmVhazsKIAorCWNhc2UgRFJNX01PREVfVFZfTU9ERV9QQUxfTjoKKwkJKnZh bCA9IFZDNF9WRUNfVFZfTU9ERV9QQUxfTjsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9NT0RFX1RW X01PREVfU0VDQU06CisJCSp2YWwgPSBWQzRfVkVDX1RWX01PREVfU0VDQU07CisJCWJyZWFrOwor CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDQ4LDEzICs1NDUsMTYgQEAg c3RhdGljIHZvaWQgdmM0X3ZlY19lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVu Y29kZXIsCiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZ2ZWMtPmNvbm5lY3Rv cjsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSA9CiAJCWRybV9hdG9t aWNfZ2V0X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5lY3Rvcik7CisJc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUgPQorCQkmZW5jb2Rlci0+Y3J0Yy0+c3RhdGUt PmFkanVzdGVkX21vZGU7CiAJY29uc3Qgc3RydWN0IHZjNF92ZWNfdHZfbW9kZSAqdHZfbW9kZTsK IAlpbnQgaWR4LCByZXQ7CiAKIAlpZiAoIWRybV9kZXZfZW50ZXIoZHJtLCAmaWR4KSkKIAkJcmV0 dXJuOwogCi0JdHZfbW9kZSA9IHZjNF92ZWNfdHZfbW9kZV9sb29rdXAoY29ubl9zdGF0ZS0+dHYu bW9kZSk7CisJdHZfbW9kZSA9IHZjNF92ZWNfdHZfbW9kZV9sb29rdXAoY29ubl9zdGF0ZS0+dHYu bW9kZSwKKwkJCQkJIGFkanVzdGVkX21vZGUtPmh0b3RhbCk7CiAJaWYgKCF0dl9tb2RlKQogCQln b3RvIGVycl9kZXZfZXhpdDsKIApAQCAtNjQzLDkgKzc0MywxMiBAQCBzdGF0aWMgaW50IHZjNF92 ZWNfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAq ZGF0YSkKIAogCXJldCA9IGRybV9tb2RlX2NyZWF0ZV90dl9wcm9wZXJ0aWVzKGRybSwKIAkJCQkJ ICAgIEJJVChEUk1fTU9ERV9UVl9NT0RFX05UU0MpIHwKKwkJCQkJICAgIEJJVChEUk1fTU9ERV9U Vl9NT0RFX05UU0NfNDQzKSB8CiAJCQkJCSAgICBCSVQoRFJNX01PREVfVFZfTU9ERV9OVFNDX0op IHwKIAkJCQkJICAgIEJJVChEUk1fTU9ERV9UVl9NT0RFX1BBTCkgfAotCQkJCQkgICAgQklUKERS TV9NT0RFX1RWX01PREVfUEFMX00pKTsKKwkJCQkJICAgIEJJVChEUk1fTU9ERV9UVl9NT0RFX1BB TF9NKSB8CisJCQkJCSAgICBCSVQoRFJNX01PREVfVFZfTU9ERV9QQUxfTikgfAorCQkJCQkgICAg QklUKERSTV9NT0RFX1RWX01PREVfU0VDQU0pKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0Owog CgotLSAKYjQgMC4xMS4wLWRldi05OWUzYQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=