From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EECC617C2 for ; Wed, 9 Nov 2022 01:15:35 +0000 (UTC) Received: by mail-lf1-f45.google.com with SMTP id bp15so23523735lfb.13 for ; Tue, 08 Nov 2022 17:15:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:from:to:cc:subject:date:message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=XUBBpQozEdBuQ0zsHuSXWF4TWAx9W3OnUGYJokkDuYV4lach0WM4PGXb0EwyT5L7sB 0IvMbPi77mhWWIEMVMiQl3DOUVOD3SI0qeeO7FZX04JLnjfQBgE8/ebyQG6P6/SK4Iuj hqoZH49CUDSsX2aiE1J9AkKkRwUn5rcFBkq1S9daRTnJRyuYfVo9G375nxycJMwyfSqT tn7BTK/gY/QAK/+3DTvGm1EpbzUWD8RUImqYHaUAGX0ftqRPEic3jQeuDVYScZR1fUhw goSlzucdm1su49Pb5kfpmjzBjtmoAXJ9pIPEmBXRkcQcXACOFyApyqOzHlklwDOntQeu 0WgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=cUD6iEMPCTlopCcj50KaFtz+Z9vUCgFdiA8IRg43lJ/7S/mudFf6rrjHbr959VYEz0 VxArnQAlVau6z/hOPelGFzFooTL873hDyypDFKjiA0ZOb8u4PLBqvzq+niij6jNSQvWd HvKHYiDuixdjzn0b7RqpKHkCU/pG79MJYFFZ5XmllWrulouzhFYPPYCndDSr4Nv8Bz2P xF5zcJSDNWH6yslZr2TQKamgeSLDu7jGIElznBzZkVNT29BYa25R56EjWbIgVeO1ESWO E4ZaPwlFXkSkuZGdOHNpwVs9e0ZfvxIpISfRWs4y4LrCMf861FS6kZv2kLcSBAg1KHWR T+kQ== X-Gm-Message-State: ACrzQf2IeEjfdkx3PXOju89WT6RK/MYTuIeWkPPgSzX78MKzbDhKTYHU q7tBKapeBPEfSPOaQJeXkCw= X-Google-Smtp-Source: AMsMyM5gsa/vdAgzO/kkpckLTcNSoVeI+I/Xoy+6rY87PedyNNi/6R72haNMVjP0+QEniBIM+iDWJg== X-Received: by 2002:a05:6512:6d0:b0:4a4:45c3:8d8a with SMTP id u16-20020a05651206d000b004a445c38d8amr21884475lff.329.1667956533757; Tue, 08 Nov 2022 17:15:33 -0800 (PST) Received: from ?IPV6:2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7? ([2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7]) by smtp.googlemail.com with ESMTPSA id z1-20020a2e8841000000b0027709abbc5csm1932062ljj.98.2022.11.08.17.15.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Nov 2022 17:15:33 -0800 (PST) From: Mateusz Kwiatkowski X-Google-Original-From: Mateusz Kwiatkowski Message-ID: Date: Wed, 9 Nov 2022 02:15:29 +0100 Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Reply-To: kfyatek+publicgit@gmail.com Subject: Re: [PATCH v7 22/23] drm/vc4: vec: Add support for more analog TV standards Content-Language: pl To: Maxime Ripard , Jani Nikula , Joonas Lahtinen , Tvrtko Ursulin , Ben Skeggs , Rodrigo Vivi , Maxime Ripard , Samuel Holland , Jernej Skrabec , Maarten Lankhorst , Emma Anholt , Karol Herbst , Daniel Vetter , Chen-Yu Tsai , Lyude Paul , Thomas Zimmermann , David Airlie Cc: Phil Elwell , Hans de Goede , linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Dave Stevenson , linux-arm-kernel@lists.infradead.org, Dom Cobley , dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, nouveau@lists.freedesktop.org, =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= References: <20220728-rpi-analog-tv-properties-v7-0-7072a478c6b3@cerno.tech> <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi Maxime, I ran your v7 patchset on my Pi with Xorg, and the mode switching, as well as the preferred mode handling, all work really well now! I just noted that the downstream version of the vc4 driver still has inaccurate field delays in vc4_crtc.c, which causes vertical lines to appear jagged (like here: https://user-images.githubusercontent.com/4499762/112738569-385c3280-8f64-11eb-83c4-d671537af209.png). This has been fixed downstream in https://github.com/raspberrypi/linux/pull/4241/commits/bc093f27bf2613ec93524fdc19e922dd7dd3d800, but I guess that should be upstreamed separately...? Anyway, it's unrelated to the changes made in this patchset, so... I'm not sure if I'm qualified or allowed to do these, but just in case: Tested-by: Mateusz Kwiatkowski (that pretty much applies to parts 19-22 in general, I can respond to those messages as well if you wish) Best regards, Mateusz Kwiatkowski W dniu 7.11.2022 o 15:16, Maxime Ripard pisze: > 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 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; > > */pre> 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 5230DC4332F for ; Wed, 9 Nov 2022 01:15:40 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1B9E610E55C; Wed, 9 Nov 2022 01:15:39 +0000 (UTC) Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by gabe.freedesktop.org (Postfix) with ESMTPS id C129D10E05F; Wed, 9 Nov 2022 01:15:35 +0000 (UTC) Received: by mail-lf1-x12a.google.com with SMTP id r12so23604574lfp.1; Tue, 08 Nov 2022 17:15:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:from:to:cc:subject:date:message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=XUBBpQozEdBuQ0zsHuSXWF4TWAx9W3OnUGYJokkDuYV4lach0WM4PGXb0EwyT5L7sB 0IvMbPi77mhWWIEMVMiQl3DOUVOD3SI0qeeO7FZX04JLnjfQBgE8/ebyQG6P6/SK4Iuj hqoZH49CUDSsX2aiE1J9AkKkRwUn5rcFBkq1S9daRTnJRyuYfVo9G375nxycJMwyfSqT tn7BTK/gY/QAK/+3DTvGm1EpbzUWD8RUImqYHaUAGX0ftqRPEic3jQeuDVYScZR1fUhw goSlzucdm1su49Pb5kfpmjzBjtmoAXJ9pIPEmBXRkcQcXACOFyApyqOzHlklwDOntQeu 0WgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=ANI62DYI2rYEPNnE0x3P80ZrvHOKfVQ7uxI8QM1p+JCnjCGB1h8kbDSH5CNb7SPybk kTwNSuLfus8J6Wr38ZoeGZHgQAGMZ88YIwjfhIrpeAid6zTX954EENqNbIvGozl8E3MW Q5uvNzZHrlyEJ52UhJU8Z2NOpox4OYTfPa+Bt20lGpgmIW580Ou203U/BoSiIT54I3bb nVGN4QZn+2opUYbv9dS9jNEZCiG6KfBo1cDzryfm6IsatsuivKR8Jsk5zirpy3ZkfQk5 QOqQFEcNphOyxxgCKzY6eFpi9vd8clQcXo+EalLi77GBsh6S5dRueibmh1m4gdPB82r+ inMg== X-Gm-Message-State: ACrzQf3vImL3+1VcSBQP7H3FNjdv2Ax6AWmNv6Eg8fQy8b7dUZ/ktbwO PNpjBCrcyAa7MzGewVfUFrg= X-Google-Smtp-Source: AMsMyM5gsa/vdAgzO/kkpckLTcNSoVeI+I/Xoy+6rY87PedyNNi/6R72haNMVjP0+QEniBIM+iDWJg== X-Received: by 2002:a05:6512:6d0:b0:4a4:45c3:8d8a with SMTP id u16-20020a05651206d000b004a445c38d8amr21884475lff.329.1667956533757; Tue, 08 Nov 2022 17:15:33 -0800 (PST) Received: from ?IPV6:2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7? ([2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7]) by smtp.googlemail.com with ESMTPSA id z1-20020a2e8841000000b0027709abbc5csm1932062ljj.98.2022.11.08.17.15.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Nov 2022 17:15:33 -0800 (PST) From: Mateusz Kwiatkowski X-Google-Original-From: Mateusz Kwiatkowski Message-ID: Date: Wed, 9 Nov 2022 02:15:29 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: pl To: Maxime Ripard , Jani Nikula , Joonas Lahtinen , Tvrtko Ursulin , Ben Skeggs , Rodrigo Vivi , Maxime Ripard , Samuel Holland , Jernej Skrabec , Maarten Lankhorst , Emma Anholt , Karol Herbst , Daniel Vetter , Chen-Yu Tsai , Lyude Paul , Thomas Zimmermann , David Airlie References: <20220728-rpi-analog-tv-properties-v7-0-7072a478c6b3@cerno.tech> <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: Re: [Nouveau] [PATCH v7 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: , Reply-To: kfyatek+publicgit@gmail.com 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 , =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= , Geert Uytterhoeven , Phil Elwell , linux-arm-kernel@lists.infradead.org Errors-To: nouveau-bounces@lists.freedesktop.org Sender: "Nouveau" Hi Maxime, I ran your v7 patchset on my Pi with Xorg, and the mode switching, as well as the preferred mode handling, all work really well now! I just noted that the downstream version of the vc4 driver still has inaccurate field delays in vc4_crtc.c, which causes vertical lines to appear jagged (like here: https://user-images.githubusercontent.com/4499762/112738569-385c3280-8f64-11eb-83c4-d671537af209.png). This has been fixed downstream in https://github.com/raspberrypi/linux/pull/4241/commits/bc093f27bf2613ec93524fdc19e922dd7dd3d800, but I guess that should be upstreamed separately...? Anyway, it's unrelated to the changes made in this patchset, so... I'm not sure if I'm qualified or allowed to do these, but just in case: Tested-by: Mateusz Kwiatkowski (that pretty much applies to parts 19-22 in general, I can respond to those messages as well if you wish) Best regards, Mateusz Kwiatkowski W dniu 7.11.2022 o 15:16, Maxime Ripard pisze: > 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 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; > > */pre> 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 C0DE9C4332F for ; Wed, 9 Nov 2022 01:15:46 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E3E7410E55F; Wed, 9 Nov 2022 01:15:39 +0000 (UTC) Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by gabe.freedesktop.org (Postfix) with ESMTPS id C129D10E05F; Wed, 9 Nov 2022 01:15:35 +0000 (UTC) Received: by mail-lf1-x12a.google.com with SMTP id r12so23604574lfp.1; Tue, 08 Nov 2022 17:15:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:from:to:cc:subject:date:message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=XUBBpQozEdBuQ0zsHuSXWF4TWAx9W3OnUGYJokkDuYV4lach0WM4PGXb0EwyT5L7sB 0IvMbPi77mhWWIEMVMiQl3DOUVOD3SI0qeeO7FZX04JLnjfQBgE8/ebyQG6P6/SK4Iuj hqoZH49CUDSsX2aiE1J9AkKkRwUn5rcFBkq1S9daRTnJRyuYfVo9G375nxycJMwyfSqT tn7BTK/gY/QAK/+3DTvGm1EpbzUWD8RUImqYHaUAGX0ftqRPEic3jQeuDVYScZR1fUhw goSlzucdm1su49Pb5kfpmjzBjtmoAXJ9pIPEmBXRkcQcXACOFyApyqOzHlklwDOntQeu 0WgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=ANI62DYI2rYEPNnE0x3P80ZrvHOKfVQ7uxI8QM1p+JCnjCGB1h8kbDSH5CNb7SPybk kTwNSuLfus8J6Wr38ZoeGZHgQAGMZ88YIwjfhIrpeAid6zTX954EENqNbIvGozl8E3MW Q5uvNzZHrlyEJ52UhJU8Z2NOpox4OYTfPa+Bt20lGpgmIW580Ou203U/BoSiIT54I3bb nVGN4QZn+2opUYbv9dS9jNEZCiG6KfBo1cDzryfm6IsatsuivKR8Jsk5zirpy3ZkfQk5 QOqQFEcNphOyxxgCKzY6eFpi9vd8clQcXo+EalLi77GBsh6S5dRueibmh1m4gdPB82r+ inMg== X-Gm-Message-State: ACrzQf3vImL3+1VcSBQP7H3FNjdv2Ax6AWmNv6Eg8fQy8b7dUZ/ktbwO PNpjBCrcyAa7MzGewVfUFrg= X-Google-Smtp-Source: AMsMyM5gsa/vdAgzO/kkpckLTcNSoVeI+I/Xoy+6rY87PedyNNi/6R72haNMVjP0+QEniBIM+iDWJg== X-Received: by 2002:a05:6512:6d0:b0:4a4:45c3:8d8a with SMTP id u16-20020a05651206d000b004a445c38d8amr21884475lff.329.1667956533757; Tue, 08 Nov 2022 17:15:33 -0800 (PST) Received: from ?IPV6:2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7? ([2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7]) by smtp.googlemail.com with ESMTPSA id z1-20020a2e8841000000b0027709abbc5csm1932062ljj.98.2022.11.08.17.15.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Nov 2022 17:15:33 -0800 (PST) From: Mateusz Kwiatkowski X-Google-Original-From: Mateusz Kwiatkowski Message-ID: Date: Wed, 9 Nov 2022 02:15:29 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH v7 22/23] drm/vc4: vec: Add support for more analog TV standards Content-Language: pl To: Maxime Ripard , Jani Nikula , Joonas Lahtinen , Tvrtko Ursulin , Ben Skeggs , Rodrigo Vivi , Maxime Ripard , Samuel Holland , Jernej Skrabec , Maarten Lankhorst , Emma Anholt , Karol Herbst , Daniel Vetter , Chen-Yu Tsai , Lyude Paul , Thomas Zimmermann , David Airlie References: <20220728-rpi-analog-tv-properties-v7-0-7072a478c6b3@cerno.tech> <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: , Reply-To: kfyatek+publicgit@gmail.com 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 , =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= , Geert Uytterhoeven , Phil Elwell , linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi Maxime, I ran your v7 patchset on my Pi with Xorg, and the mode switching, as well as the preferred mode handling, all work really well now! I just noted that the downstream version of the vc4 driver still has inaccurate field delays in vc4_crtc.c, which causes vertical lines to appear jagged (like here: https://user-images.githubusercontent.com/4499762/112738569-385c3280-8f64-11eb-83c4-d671537af209.png). This has been fixed downstream in https://github.com/raspberrypi/linux/pull/4241/commits/bc093f27bf2613ec93524fdc19e922dd7dd3d800, but I guess that should be upstreamed separately...? Anyway, it's unrelated to the changes made in this patchset, so... I'm not sure if I'm qualified or allowed to do these, but just in case: Tested-by: Mateusz Kwiatkowski (that pretty much applies to parts 19-22 in general, I can respond to those messages as well if you wish) Best regards, Mateusz Kwiatkowski W dniu 7.11.2022 o 15:16, Maxime Ripard pisze: > 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 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; > > */pre> 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 E0FEAC4332F for ; Wed, 9 Nov 2022 01:15:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7C0DE10E560; Wed, 9 Nov 2022 01:15:40 +0000 (UTC) Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by gabe.freedesktop.org (Postfix) with ESMTPS id C129D10E05F; Wed, 9 Nov 2022 01:15:35 +0000 (UTC) Received: by mail-lf1-x12a.google.com with SMTP id r12so23604574lfp.1; Tue, 08 Nov 2022 17:15:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:from:to:cc:subject:date:message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=XUBBpQozEdBuQ0zsHuSXWF4TWAx9W3OnUGYJokkDuYV4lach0WM4PGXb0EwyT5L7sB 0IvMbPi77mhWWIEMVMiQl3DOUVOD3SI0qeeO7FZX04JLnjfQBgE8/ebyQG6P6/SK4Iuj hqoZH49CUDSsX2aiE1J9AkKkRwUn5rcFBkq1S9daRTnJRyuYfVo9G375nxycJMwyfSqT tn7BTK/gY/QAK/+3DTvGm1EpbzUWD8RUImqYHaUAGX0ftqRPEic3jQeuDVYScZR1fUhw goSlzucdm1su49Pb5kfpmjzBjtmoAXJ9pIPEmBXRkcQcXACOFyApyqOzHlklwDOntQeu 0WgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=ANI62DYI2rYEPNnE0x3P80ZrvHOKfVQ7uxI8QM1p+JCnjCGB1h8kbDSH5CNb7SPybk kTwNSuLfus8J6Wr38ZoeGZHgQAGMZ88YIwjfhIrpeAid6zTX954EENqNbIvGozl8E3MW Q5uvNzZHrlyEJ52UhJU8Z2NOpox4OYTfPa+Bt20lGpgmIW580Ou203U/BoSiIT54I3bb nVGN4QZn+2opUYbv9dS9jNEZCiG6KfBo1cDzryfm6IsatsuivKR8Jsk5zirpy3ZkfQk5 QOqQFEcNphOyxxgCKzY6eFpi9vd8clQcXo+EalLi77GBsh6S5dRueibmh1m4gdPB82r+ inMg== X-Gm-Message-State: ACrzQf3vImL3+1VcSBQP7H3FNjdv2Ax6AWmNv6Eg8fQy8b7dUZ/ktbwO PNpjBCrcyAa7MzGewVfUFrg= X-Google-Smtp-Source: AMsMyM5gsa/vdAgzO/kkpckLTcNSoVeI+I/Xoy+6rY87PedyNNi/6R72haNMVjP0+QEniBIM+iDWJg== X-Received: by 2002:a05:6512:6d0:b0:4a4:45c3:8d8a with SMTP id u16-20020a05651206d000b004a445c38d8amr21884475lff.329.1667956533757; Tue, 08 Nov 2022 17:15:33 -0800 (PST) Received: from ?IPV6:2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7? ([2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7]) by smtp.googlemail.com with ESMTPSA id z1-20020a2e8841000000b0027709abbc5csm1932062ljj.98.2022.11.08.17.15.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Nov 2022 17:15:33 -0800 (PST) From: Mateusz Kwiatkowski X-Google-Original-From: Mateusz Kwiatkowski Message-ID: Date: Wed, 9 Nov 2022 02:15:29 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: pl To: Maxime Ripard , Jani Nikula , Joonas Lahtinen , Tvrtko Ursulin , Ben Skeggs , Rodrigo Vivi , Maxime Ripard , Samuel Holland , Jernej Skrabec , Maarten Lankhorst , Emma Anholt , Karol Herbst , Daniel Vetter , Chen-Yu Tsai , Lyude Paul , Thomas Zimmermann , David Airlie References: <20220728-rpi-analog-tv-properties-v7-0-7072a478c6b3@cerno.tech> <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: Re: [Intel-gfx] [PATCH v7 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: , Reply-To: kfyatek+publicgit@gmail.com 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 , =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= , Geert Uytterhoeven , Phil Elwell , linux-arm-kernel@lists.infradead.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Hi Maxime, I ran your v7 patchset on my Pi with Xorg, and the mode switching, as well as the preferred mode handling, all work really well now! I just noted that the downstream version of the vc4 driver still has inaccurate field delays in vc4_crtc.c, which causes vertical lines to appear jagged (like here: https://user-images.githubusercontent.com/4499762/112738569-385c3280-8f64-11eb-83c4-d671537af209.png). This has been fixed downstream in https://github.com/raspberrypi/linux/pull/4241/commits/bc093f27bf2613ec93524fdc19e922dd7dd3d800, but I guess that should be upstreamed separately...? Anyway, it's unrelated to the changes made in this patchset, so... I'm not sure if I'm qualified or allowed to do these, but just in case: Tested-by: Mateusz Kwiatkowski (that pretty much applies to parts 19-22 in general, I can respond to those messages as well if you wish) Best regards, Mateusz Kwiatkowski W dniu 7.11.2022 o 15:16, Maxime Ripard pisze: > 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 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; > > */pre> 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 A6AA1C4332F for ; Wed, 9 Nov 2022 01:16:52 +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:Reply-To:List-Subscribe:List-Help: List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To:References:Cc:To: Subject:MIME-Version:Date:Message-ID:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=RLxt8IpnkZXECY5iESroC6KoEkXMedqWQy/KwUk6wuw=; b=Muvif8O4l7Y+Xz SKkd2mX388pIpooGBS3W6a5YiSk8F4uqC8TnrYytqmTVXfxFDNpLqa5xAsJ1VBUjPfIV7ZiG6CSd1 5LaHg6gYcNxyytHBeVHH0lBYsKXzBE42XBlUSGTNpwl7ienGYKkrlSJ9wmgzYXamJi6M6KsBRZl9F UqJ+KEtYZP7KKQ1HiO4bqqRkqffHC82oOVdb+PPvlJmDoCZHAG+/vmzpWlgNCk216r0gOE7SVZLGE D5LRh9eSIAPECn/uKobXUahGYhHMzvDFVJvMXex+OQk2uM+qlAy+6O9tR59M7I23wGyTcKSRzlaZL xRjfNvctFgor1VxwPhGg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1osZgs-009YCs-LD; Wed, 09 Nov 2022 01:15:42 +0000 Received: from mail-lf1-x132.google.com ([2a00:1450:4864:20::132]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1osZgp-009YC8-IR for linux-arm-kernel@lists.infradead.org; Wed, 09 Nov 2022 01:15:41 +0000 Received: by mail-lf1-x132.google.com with SMTP id g7so23607003lfv.5 for ; Tue, 08 Nov 2022 17:15:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:from:to:cc:subject:date:message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=XUBBpQozEdBuQ0zsHuSXWF4TWAx9W3OnUGYJokkDuYV4lach0WM4PGXb0EwyT5L7sB 0IvMbPi77mhWWIEMVMiQl3DOUVOD3SI0qeeO7FZX04JLnjfQBgE8/ebyQG6P6/SK4Iuj hqoZH49CUDSsX2aiE1J9AkKkRwUn5rcFBkq1S9daRTnJRyuYfVo9G375nxycJMwyfSqT tn7BTK/gY/QAK/+3DTvGm1EpbzUWD8RUImqYHaUAGX0ftqRPEic3jQeuDVYScZR1fUhw goSlzucdm1su49Pb5kfpmjzBjtmoAXJ9pIPEmBXRkcQcXACOFyApyqOzHlklwDOntQeu 0WgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=OMVBfmBNvFKVHAfPkhy9AnS3r5KARraBGspiM7WR3cY=; b=g0WNNU6PmExy70VT5gzx1qRcV+NI3ITITEyLL4utk1qtU3MJDeW+XPMqilJSIMv0zy tCEibn3Ag1QzWyySGjl3886Hdj4+9vQzRpVOXDZMpNagK+r9SChtG/4hdlbIVcEE9FE8 0eEhQAzIJ4sfs1ux8TWK2K+I0N7QmySt+ArCc5GhKRiI3ttiZ9zfser686RK6bto8pUS 74nuKMuaCq8ZNQ249c8FKR67VOk0AUYg2TBTWqN0vZIh3Acnfsv2eGlyWZ5OG9keap2x L2kgEillGHO1c4KzK6Nf8kMA4tTobBXz7dwcZS90tf4medk47VtCh6bxVgebyeKVKYX7 LK3g== X-Gm-Message-State: ACrzQf0Q4n9xbNVSXdOApNE4CKPlDBOinCt+66voBVFxPr083qJT6adz CPQnkNYkqqEyp+J0poLXle0= X-Google-Smtp-Source: AMsMyM5gsa/vdAgzO/kkpckLTcNSoVeI+I/Xoy+6rY87PedyNNi/6R72haNMVjP0+QEniBIM+iDWJg== X-Received: by 2002:a05:6512:6d0:b0:4a4:45c3:8d8a with SMTP id u16-20020a05651206d000b004a445c38d8amr21884475lff.329.1667956533757; Tue, 08 Nov 2022 17:15:33 -0800 (PST) Received: from ?IPV6:2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7? ([2a02:a31a:a240:1700:c55e:6e7d:cf12:d8b7]) by smtp.googlemail.com with ESMTPSA id z1-20020a2e8841000000b0027709abbc5csm1932062ljj.98.2022.11.08.17.15.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Nov 2022 17:15:33 -0800 (PST) From: Mateusz Kwiatkowski X-Google-Original-From: Mateusz Kwiatkowski Message-ID: Date: Wed, 9 Nov 2022 02:15:29 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH v7 22/23] drm/vc4: vec: Add support for more analog TV standards Content-Language: pl To: Maxime Ripard , Jani Nikula , Joonas Lahtinen , Tvrtko Ursulin , Ben Skeggs , Rodrigo Vivi , Maxime Ripard , Samuel Holland , Jernej Skrabec , Maarten Lankhorst , Emma Anholt , Karol Herbst , Daniel Vetter , Chen-Yu Tsai , Lyude Paul , Thomas Zimmermann , David Airlie Cc: Phil Elwell , Hans de Goede , linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Dave Stevenson , linux-arm-kernel@lists.infradead.org, Dom Cobley , dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, nouveau@lists.freedesktop.org, =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= References: <20220728-rpi-analog-tv-properties-v7-0-7072a478c6b3@cerno.tech> <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v7-22-7072a478c6b3@cerno.tech> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221108_171539_665524_E358A1E3 X-CRM114-Status: GOOD ( 39.28 ) 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: , Reply-To: kfyatek+publicgit@gmail.com 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 SGkgTWF4aW1lLAoKSSByYW4geW91ciB2NyBwYXRjaHNldCBvbiBteSBQaSB3aXRoIFhvcmcsIGFu ZCB0aGUgbW9kZSBzd2l0Y2hpbmcsIGFzIHdlbGwgYXMKdGhlIHByZWZlcnJlZCBtb2RlIGhhbmRs aW5nLCBhbGwgd29yayByZWFsbHkgd2VsbCBub3chCgpJIGp1c3Qgbm90ZWQgdGhhdCB0aGUgZG93 bnN0cmVhbSB2ZXJzaW9uIG9mIHRoZSB2YzQgZHJpdmVyIHN0aWxsIGhhcyBpbmFjY3VyYXRlCmZp ZWxkIGRlbGF5cyBpbiB2YzRfY3J0Yy5jLCB3aGljaCBjYXVzZXMgdmVydGljYWwgbGluZXMgdG8g YXBwZWFyIGphZ2dlZCAobGlrZQpoZXJlOiBodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJj b250ZW50LmNvbS80NDk5NzYyLzExMjczODU2OS0zODVjMzI4MC04ZjY0LTExZWItODNjNC1kNjcx NTM3YWYyMDkucG5nKS4KVGhpcyBoYXMgYmVlbiBmaXhlZCBkb3duc3RyZWFtIGluCmh0dHBzOi8v Z2l0aHViLmNvbS9yYXNwYmVycnlwaS9saW51eC9wdWxsLzQyNDEvY29tbWl0cy9iYzA5M2YyN2Jm MjYxM2VjOTM1MjRmZGMxOWU5MjJkZDdkZDNkODAwLApidXQgSSBndWVzcyB0aGF0IHNob3VsZCBi ZSB1cHN0cmVhbWVkIHNlcGFyYXRlbHkuLi4/CgpBbnl3YXksIGl0J3MgdW5yZWxhdGVkIHRvIHRo ZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyBwYXRjaHNldCwgc28uLi4gSSdtIG5vdCBzdXJlCmlmIEkn bSBxdWFsaWZpZWQgb3IgYWxsb3dlZCB0byBkbyB0aGVzZSwgYnV0IGp1c3QgaW4gY2FzZToKClRl c3RlZC1ieTogTWF0ZXVzeiBLd2lhdGtvd3NraSA8a2Z5YXRlaytwdWJsaWNnaXRAZ21haWwuY29t PgoKKHRoYXQgcHJldHR5IG11Y2ggYXBwbGllcyB0byBwYXJ0cyAxOS0yMiBpbiBnZW5lcmFsLCBJ IGNhbiByZXNwb25kIHRvIHRob3NlCm1lc3NhZ2VzIGFzIHdlbGwgaWYgeW91IHdpc2gpCgpCZXN0 IHJlZ2FyZHMsCk1hdGV1c3ogS3dpYXRrb3dza2kKClcgZG5pdSA3LjExLjIwMjIgbyAxNToxNiwg TWF4aW1lIFJpcGFyZCBwaXN6ZToKPiBGcm9tOiBNYXRldXN6IEt3aWF0a293c2tpIDxrZnlhdGVr K3B1YmxpY2dpdEBnbWFpbC5jb20+Cj4KPiBBZGQgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBj b21wb3NpdGUgb3V0cHV0IG1vZGVzIChhbGwgb2YgdGhlbSBhcmUKPiBzb21ld2hhdCBtb3JlIG9i c2N1cmUgdGhhbiB0aGUgcHJldmlvdXNseSBkZWZpbmVkIG9uZXMpOgo+Cj4gLSBOVFNDXzQ0MyAt IE5UU0Mtc3R5bGUgc2lnbmFsIHdpdGggdGhlIGNocm9tYSBzdWJjYXJyaWVyIHNoaWZ0ZWQgdG8K PiAgIDQuNDMzNjE4NzUgTUh6ICh0aGUgUEFMIHN1YmNhcnJpZXIgZnJlcXVlbmN5KS4gTmV2ZXIg dXNlZCBmb3IKPiAgIGJyb2FkY2FzdGluZywgYnV0IHNvbWV0aW1lcyB1c2VkIGFzIGEgaGFjayB0 byBwbGF5IE5UU0MgY29udGVudCBpbiBQQUwKPiAgIHJlZ2lvbnMgKGUuZy4gb24gVkNScykuCj4g LSBQQUxfTiAtIFBBTCB3aXRoIGFsdGVybmF0aXZlIGNocm9tYSBzdWJjYXJyaWVyIGZyZXF1ZW5j eSwKPiAgIDMuNTgyMDU2MjUgTUh6LiBVc2VkIGFzIGEgYnJvYWRjYXN0IHN0YW5kYXJkIGluIEFy Z2VudGluYSwgUGFyYWd1YXkKPiAgIGFuZCBVcnVndWF5IHRvIGZpdCA1NzZpNTAgd2l0aCBjb2xv dXIgaW4gNiBNSHogY2hhbm5lbCByYXN0ZXIuCj4gLSBQQUw2MCAtIDQ4MGk2MCBzaWduYWwgd2l0 aCBQQUwtc3R5bGUgY29sb3IgYXQgbm9ybWFsIEV1cm9wZWFuIFBBTAo+ICAgZnJlcXVlbmN5LiBB bm90aGVyIG5vbi1zdGFuZGFyZCwgbm9uLWJyb2FkY2FzdCBtb2RlLCB1c2VkIGluIHNpbWlsYXIK PiAgIGNvbnRleHRzIGFzIE5UU0NfNDQzLiBTb21lIGRpc3BsYXlzIHN1cHBvcnQgb25lIGJ1dCBu b3QgdGhlIG90aGVyLgo+IC0gU0VDQU0gLSBGcmVuY2ggZnJlcXVlbmN5LW1vZHVsYXRlZCBhbmFs b2cgY29sb3Igc3RhbmRhcmQ7IGFsc28gaGF2ZQo+ICAgYmVlbiBicm9hZGNhc3QgaW4gRWFzdGVy biBFdXJvcGUgYW5kIHZhcmlvdXMgcGFydHMgb2YgQWZyaWNhIGFuZCBBc2lhLgo+ICAgVXNlcyB0 aGUgc2FtZSA1NzZpNTAgdGltaW5ncyBhcyBQQUwuCj4KPiBBbHNvIGFkZGVkIHNvbWUgY29tbWVu dHMgZXhwbGFpbmluZyBjb2xvciBzdWJjYXJyaWVyIGZyZXF1ZW5jeQo+IHJlZ2lzdGVycy4KPgo+ IEFja2VkLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KPiBTaWduZWQt b2ZmLWJ5OiBNYXRldXN6IEt3aWF0a293c2tpIDxrZnlhdGVrK3B1YmxpY2dpdEBnbWFpbC5jb20+ Cj4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8bWF4aW1lQGNlcm5vLnRlY2g+Cj4KPiAt LS0KPiBDaGFuZ2VzIGluIHY2Ogo+IC0gU3VwcG9ydCBQQUw2MCBhZ2Fpbgo+IC0tLQo+ICBkcml2 ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMuYyB8IDExMSArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrLS0KPiAgMSBmaWxlIGNoYW5nZWQsIDEwNyBpbnNlcnRpb25zKCspLCA0 IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X3Zl Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdmVjLmMKPiBpbmRleCBhODI4ZmM2ZmI3NzYu LmQyM2RiYWQzY2JmNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMu Ywo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X3ZlYy5jCj4gQEAgLTQ2LDYgKzQ2LDcg QEAKPiAgI2RlZmluZSBWRUNfQ09ORklHMF9ZREVMKHgpCQkoKHgpIDw8IDI2KQo+ICAjZGVmaW5l IFZFQ19DT05GSUcwX0NERUxfTUFTSwkJR0VOTUFTSygyNSwgMjQpCj4gICNkZWZpbmUgVkVDX0NP TkZJRzBfQ0RFTCh4KQkJKCh4KSA8PCAyNCkKPiArI2RlZmluZSBWRUNfQ09ORklHMF9TRUNBTV9T VEQJCUJJVCgyMSkKPiAgI2RlZmluZSBWRUNfQ09ORklHMF9QQlBSX0ZJTAkJQklUKDE4KQo+ICAj ZGVmaW5lIFZFQ19DT05GSUcwX0NIUk9NQV9HQUlOX01BU0sJR0VOTUFTSygxNywgMTYpCj4gICNk ZWZpbmUgVkVDX0NPTkZJRzBfQ0hST01BX0dBSU5fVU5JVFkJKDAgPDwgMTYpCj4gQEAgLTc2LDYg Kzc3LDI3IEBACj4gICNkZWZpbmUgVkVDX1NPRlRfUkVTRVQJCQkweDEwYwo+ICAjZGVmaW5lIFZF Q19DTE1QMF9TVEFSVAkJCTB4MTQ0Cj4gICNkZWZpbmUgVkVDX0NMTVAwX0VORAkJCTB4MTQ4Cj4g Kwo+ICsvKgo+ICsgKiBUaGVzZSBzZXQgdGhlIGNvbG9yIHN1YmNhcnJpZXIgZnJlcXVlbmN5Cj4g KyAqIGlmIFZFQ19DT05GSUcxX0NVU1RPTV9GUkVRIGlzIGVuYWJsZWQuCj4gKyAqCj4gKyAqIFZF Q19GUkVRMV8wIGNvbnRhaW5zIHRoZSBtb3N0IHNpZ25pZmljYW50IDE2LWJpdCBoYWxmLXdvcmQs Cj4gKyAqIFZFQ19GUkVRM18yIGNvbnRhaW5zIHRoZSBsZWFzdCBzaWduaWZpY2FudCAxNi1iaXQg aGFsZi13b3JkLgo+ICsgKiAweDgwMDAwMDAwIHNlZW1zIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhl IHBpeGVsIGNsb2NrCj4gKyAqICh3aGljaCBpdHNlbGYgaXMgdGhlIFZFQyBjbG9jayBkaXZpZGVk IGJ5IDgpLgo+ICsgKgo+ICsgKiBSZWZlcmVuY2UgdmFsdWVzICh3aXRoIHRoZSBkZWZhdWx0IHBp eGVsIGNsb2NrIG9mIDEzLjUgTUh6KToKPiArICoKPiArICogTlRTQyAgKDM1Nzk1NDUuWzQ1XSBI eikgICAgIC0gMHgyMUYwN0MxRgo+ICsgKiBQQUwgICAoNDQzMzYxOC43NSBIeikgICAgICAgLSAw eDJBMDk4QUNCCj4gKyAqIFBBTC1NICgzNTc1NjExLls4ODgxMTFdIEh6KSAtIDB4MjFFNkVGRTMK PiArICogUEFMLU4gKDM1ODIwNTYuMjUgSHopICAgICAgIC0gMHgyMUY2OTQ0Ngo+ICsgKgo+ICsg KiBOT1RFOiBGb3IgU0VDQU0sIGl0IGlzIHVzZWQgYXMgdGhlIERyIGNlbnRlciBmcmVxdWVuY3ks Cj4gKyAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBWRUNfQ09ORklHMV9DVVNUT01fRlJFUSBpcyBl bmFibGVkIG9yIG5vdDsKPiArICogdGhhdCBpcyBzcGVjaWZpZWQgYXMgNDQwNjI1MCBIeiwgd2hp Y2ggY29ycmVzcG9uZHMgdG8gMHgyOUM3MUM3Mi4KPiArICovCj4gICNkZWZpbmUgVkVDX0ZSRVEz XzIJCQkweDE4MAo+ICAjZGVmaW5lIFZFQ19GUkVRMV8wCQkJMHgxODQKPiAgCj4gQEAgLTExOCw2 ICsxNDAsMTQgQEAKPiAgCj4gICNkZWZpbmUgVkVDX0lOVEVSUlVQVF9DT05UUk9MCQkweDE5MAo+ ICAjZGVmaW5lIFZFQ19JTlRFUlJVUFRfU1RBVFVTCQkweDE5NAo+ICsKPiArLyoKPiArICogRGIg Y2VudGVyIGZyZXF1ZW5jeSBmb3IgU0VDQU07IHRoZSBjbG9jayBmb3IgdGhpcyBpcyB0aGUgc2Ft ZSBhcyBmb3IKPiArICogVkVDX0ZSRVEzXzIvVkVDX0ZSRVExXzAsIHdoaWNoIGlzIHVzZWQgZm9y IERyIGNlbnRlciBmcmVxdWVuY3kuCj4gKyAqCj4gKyAqIFRoaXMgaXMgc3BlY2lmaWVkIGFzIDQy NTAwMDAgSHosIHdoaWNoIGNvcnJlc3BvbmRzIHRvIDB4Mjg0QkRBMTMuCj4gKyAqIFRoYXQgaXMg YWxzbyB0aGUgZGVmYXVsdCB2YWx1ZSwgc28gbm8gbmVlZCB0byBzZXQgaXQgZXhwbGljaXRseS4K PiArICovCj4gICNkZWZpbmUgVkVDX0ZDV19TRUNBTV9CCQkJMHgxOTgKPiAgI2RlZmluZSBWRUNf U0VDQU1fR0FJTl9WQUwJCTB4MTljCj4gIAo+IEBAIC0xOTcsMTAgKzIyNywxNSBAQCBlbnVtIHZj NF92ZWNfdHZfbW9kZV9pZCB7Cj4gIAlWQzRfVkVDX1RWX01PREVfTlRTQ19KLAo+ICAJVkM0X1ZF Q19UVl9NT0RFX1BBTCwKPiAgCVZDNF9WRUNfVFZfTU9ERV9QQUxfTSwKPiArCVZDNF9WRUNfVFZf TU9ERV9OVFNDXzQ0MywKPiArCVZDNF9WRUNfVFZfTU9ERV9QQUxfNjAsCj4gKwlWQzRfVkVDX1RW X01PREVfUEFMX04sCj4gKwlWQzRfVkVDX1RWX01PREVfU0VDQU0sCj4gIH07Cj4gIAo+ICBzdHJ1 Y3QgdmM0X3ZlY190dl9tb2RlIHsKPiAgCXVuc2lnbmVkIGludCBtb2RlOwo+ICsJdTE2IGV4cGVj dGVkX2h0b3RhbDsKPiAgCXUzMiBjb25maWcwOwo+ICAJdTMyIGNvbmZpZzE7Cj4gIAl1MzIgY3Vz dG9tX2ZyZXE7Cj4gQEAgLTIzNiwzNSArMjcxLDY4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVi dWdmc19yZWczMiB2ZWNfcmVnc1tdID0gewo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IHZjNF92ZWNf dHZfbW9kZSB2YzRfdmVjX3R2X21vZGVzW10gPSB7Cj4gIAl7Cj4gIAkJLm1vZGUgPSBEUk1fTU9E RV9UVl9NT0RFX05UU0MsCj4gKwkJLmV4cGVjdGVkX2h0b3RhbCA9IDg1OCwKPiAgCQkuY29uZmln MCA9IFZFQ19DT05GSUcwX05UU0NfU1REIHwgVkVDX0NPTkZJRzBfUERFTiwKPiAgCQkuY29uZmln MSA9IFZFQ19DT05GSUcxX0NfQ1ZCU19DVkJTLAo+ICAJfSwKPiArCXsKPiArCQkubW9kZSA9IERS TV9NT0RFX1RWX01PREVfTlRTQ180NDMsCj4gKwkJLmV4cGVjdGVkX2h0b3RhbCA9IDg1OCwKPiAr CQkuY29uZmlnMCA9IFZFQ19DT05GSUcwX05UU0NfU1RELAo+ICsJCS5jb25maWcxID0gVkVDX0NP TkZJRzFfQ19DVkJTX0NWQlMgfCBWRUNfQ09ORklHMV9DVVNUT01fRlJFUSwKPiArCQkuY3VzdG9t X2ZyZXEgPSAweDJhMDk4YWNiLAo+ICsJfSwKPiAgCXsKPiAgCQkubW9kZSA9IERSTV9NT0RFX1RW X01PREVfTlRTQ19KLAo+ICsJCS5leHBlY3RlZF9odG90YWwgPSA4NTgsCj4gIAkJLmNvbmZpZzAg PSBWRUNfQ09ORklHMF9OVFNDX1NURCwKPiAgCQkuY29uZmlnMSA9IFZFQ19DT05GSUcxX0NfQ1ZC U19DVkJTLAo+ICAJfSwKPiAgCXsKPiAgCQkubW9kZSA9IERSTV9NT0RFX1RWX01PREVfUEFMLAo+ ICsJCS5leHBlY3RlZF9odG90YWwgPSA4NjQsCj4gIAkJLmNvbmZpZzAgPSBWRUNfQ09ORklHMF9Q QUxfQkRHSElfU1RELAo+ICAJCS5jb25maWcxID0gVkVDX0NPTkZJRzFfQ19DVkJTX0NWQlMsCj4g IAl9LAo+ICsJewo+ICsJCS8qIFBBTC02MCAqLwo+ICsJCS5tb2RlID0gRFJNX01PREVfVFZfTU9E RV9QQUwsCj4gKwkJLmV4cGVjdGVkX2h0b3RhbCA9IDg1OCwKPiArCQkuY29uZmlnMCA9IFZFQ19D T05GSUcwX1BBTF9NX1NURCwKPiArCQkuY29uZmlnMSA9IFZFQ19DT05GSUcxX0NfQ1ZCU19DVkJT IHwgVkVDX0NPTkZJRzFfQ1VTVE9NX0ZSRVEsCj4gKwkJLmN1c3RvbV9mcmVxID0gMHgyYTA5OGFj YiwKPiArCX0sCj4gIAl7Cj4gIAkJLm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTF9NLAo+ICsJ CS5leHBlY3RlZF9odG90YWwgPSA4NTgsCj4gIAkJLmNvbmZpZzAgPSBWRUNfQ09ORklHMF9QQUxf TV9TVEQsCj4gIAkJLmNvbmZpZzEgPSBWRUNfQ09ORklHMV9DX0NWQlNfQ1ZCUywKPiAgCX0sCj4g Kwl7Cj4gKwkJLm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTF9OLAo+ICsJCS5leHBlY3RlZF9o dG90YWwgPSA4NjQsCj4gKwkJLmNvbmZpZzAgPSBWRUNfQ09ORklHMF9QQUxfTl9TVEQsCj4gKwkJ LmNvbmZpZzEgPSBWRUNfQ09ORklHMV9DX0NWQlNfQ1ZCUywKPiArCX0sCj4gKwl7Cj4gKwkJLm1v ZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1NFQ0FNLAo+ICsJCS5leHBlY3RlZF9odG90YWwgPSA4NjQs Cj4gKwkJLmNvbmZpZzAgPSBWRUNfQ09ORklHMF9TRUNBTV9TVEQsCj4gKwkJLmNvbmZpZzEgPSBW RUNfQ09ORklHMV9DX0NWQlNfQ1ZCUywKPiArCQkuY3VzdG9tX2ZyZXEgPSAweDI5YzcxYzcyLAo+ ICsJfSwKPiAgfTsKPiAgCj4gIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHZjNF92ZWNfdHZf bW9kZSAqCj4gLXZjNF92ZWNfdHZfbW9kZV9sb29rdXAodW5zaWduZWQgaW50IG1vZGUpCj4gK3Zj NF92ZWNfdHZfbW9kZV9sb29rdXAodW5zaWduZWQgaW50IG1vZGUsIHUxNiBodG90YWwpCj4gIHsK PiAgCXVuc2lnbmVkIGludCBpOwo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZj NF92ZWNfdHZfbW9kZXMpOyBpKyspIHsKPiAgCQljb25zdCBzdHJ1Y3QgdmM0X3ZlY190dl9tb2Rl ICp0dl9tb2RlID0gJnZjNF92ZWNfdHZfbW9kZXNbaV07Cj4gIAo+IC0JCWlmICh0dl9tb2RlLT5t b2RlID09IG1vZGUpCj4gKwkJaWYgKHR2X21vZGUtPm1vZGUgPT0gbW9kZSAmJgo+ICsJCSAgICB0 dl9tb2RlLT5leHBlY3RlZF9odG90YWwgPT0gaHRvdGFsKQo+ICAJCQlyZXR1cm4gdHZfbW9kZTsK PiAgCX0KPiAgCj4gQEAgLTI3Myw5ICszNDEsMTMgQEAgdmM0X3ZlY190dl9tb2RlX2xvb2t1cCh1 bnNpZ25lZCBpbnQgbW9kZSkKPiAgCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3Byb3BfZW51 bV9saXN0IGxlZ2FjeV90dl9tb2RlX25hbWVzW10gPSB7Cj4gIAl7IFZDNF9WRUNfVFZfTU9ERV9O VFNDLCAiTlRTQyIsIH0sCj4gKwl7IFZDNF9WRUNfVFZfTU9ERV9OVFNDXzQ0MywgIk5UU0MtNDQz IiwgfSwKPiAgCXsgVkM0X1ZFQ19UVl9NT0RFX05UU0NfSiwgIk5UU0MtSiIsIH0sCj4gIAl7IFZD NF9WRUNfVFZfTU9ERV9QQUwsICJQQUwiLCB9LAo+ICsJeyBWQzRfVkVDX1RWX01PREVfUEFMXzYw LCAiUEFMLTYwIiwgfSwKPiAgCXsgVkM0X1ZFQ19UVl9NT0RFX1BBTF9NLCAiUEFMLU0iLCB9LAo+ ICsJeyBWQzRfVkVDX1RWX01PREVfUEFMX04sICJQQUwtTiIsIH0sCj4gKwl7IFZDNF9WRUNfVFZf TU9ERV9TRUNBTSwgIlNFQ0FNIiwgfSwKPiAgfTsKPiAgCj4gIHN0YXRpYyBlbnVtIGRybV9jb25u ZWN0b3Jfc3RhdHVzCj4gQEAgLTMwNiwxMSArMzc4LDE2IEBAIHZjNF92ZWNfY29ubmVjdG9yX3Nl dF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ICAJCXN0YXRlLT50 di5tb2RlID0gRFJNX01PREVfVFZfTU9ERV9OVFNDOwo+ICAJCWJyZWFrOwo+ICAKPiArCWNhc2Ug VkM0X1ZFQ19UVl9NT0RFX05UU0NfNDQzOgo+ICsJCXN0YXRlLT50di5tb2RlID0gRFJNX01PREVf VFZfTU9ERV9OVFNDXzQ0MzsKPiArCQlicmVhazsKPiArCj4gIAljYXNlIFZDNF9WRUNfVFZfTU9E RV9OVFNDX0o6Cj4gIAkJc3RhdGUtPnR2Lm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX05UU0NfSjsK PiAgCQlicmVhazsKPiAgCj4gIAljYXNlIFZDNF9WRUNfVFZfTU9ERV9QQUw6Cj4gKwljYXNlIFZD NF9WRUNfVFZfTU9ERV9QQUxfNjA6Cj4gIAkJc3RhdGUtPnR2Lm1vZGUgPSBEUk1fTU9ERV9UVl9N T0RFX1BBTDsKPiAgCQlicmVhazsKPiAgCj4gQEAgLTMxOCw2ICszOTUsMTQgQEAgdmM0X3ZlY19j b25uZWN0b3Jfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4g IAkJc3RhdGUtPnR2Lm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTF9NOwo+ICAJCWJyZWFrOwo+ ICAKPiArCWNhc2UgVkM0X1ZFQ19UVl9NT0RFX1BBTF9OOgo+ICsJCXN0YXRlLT50di5tb2RlID0g RFJNX01PREVfVFZfTU9ERV9QQUxfTjsKPiArCQlicmVhazsKPiArCj4gKwljYXNlIFZDNF9WRUNf VFZfTU9ERV9TRUNBTToKPiArCQlzdGF0ZS0+dHYubW9kZSA9IERSTV9NT0RFX1RWX01PREVfU0VD QU07Cj4gKwkJYnJlYWs7Cj4gKwo+ICAJZGVmYXVsdDoKPiAgCQlyZXR1cm4gLUVJTlZBTDsKPiAg CX0KPiBAQCAtMzQxLDYgKzQyNiwxMCBAQCB2YzRfdmVjX2Nvbm5lY3Rvcl9nZXRfcHJvcGVydHko c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiAgCQkqdmFsID0gVkM0X1ZFQ19UVl9N T0RFX05UU0M7Cj4gIAkJYnJlYWs7Cj4gIAo+ICsJY2FzZSBEUk1fTU9ERV9UVl9NT0RFX05UU0Nf NDQzOgo+ICsJCSp2YWwgPSBWQzRfVkVDX1RWX01PREVfTlRTQ180NDM7Cj4gKwkJYnJlYWs7Cj4g Kwo+ICAJY2FzZSBEUk1fTU9ERV9UVl9NT0RFX05UU0NfSjoKPiAgCQkqdmFsID0gVkM0X1ZFQ19U Vl9NT0RFX05UU0NfSjsKPiAgCQlicmVhazsKPiBAQCAtMzUzLDYgKzQ0MiwxNCBAQCB2YzRfdmVj X2Nvbm5lY3Rvcl9nZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwK PiAgCQkqdmFsID0gVkM0X1ZFQ19UVl9NT0RFX1BBTF9NOwo+ICAJCWJyZWFrOwo+ICAKPiArCWNh c2UgRFJNX01PREVfVFZfTU9ERV9QQUxfTjoKPiArCQkqdmFsID0gVkM0X1ZFQ19UVl9NT0RFX1BB TF9OOwo+ICsJCWJyZWFrOwo+ICsKPiArCWNhc2UgRFJNX01PREVfVFZfTU9ERV9TRUNBTToKPiAr CQkqdmFsID0gVkM0X1ZFQ19UVl9NT0RFX1NFQ0FNOwo+ICsJCWJyZWFrOwo+ICsKPiAgCWRlZmF1 bHQ6Cj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAl9Cj4gQEAgLTQ0OCwxMyArNTQ1LDE2IEBAIHN0 YXRpYyB2b2lkIHZjNF92ZWNfZW5jb2Rlcl9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyLAo+ICAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZ2ZWMtPmNvbm5lY3Rv cjsKPiAgCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpjb25uX3N0YXRlID0KPiAgCQlkcm1f YXRvbWljX2dldF9uZXdfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ICsJc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUgPQo+ICsJCSZlbmNvZGVyLT5jcnRj LT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZTsKPiAgCWNvbnN0IHN0cnVjdCB2YzRfdmVjX3R2X21vZGUg KnR2X21vZGU7Cj4gIAlpbnQgaWR4LCByZXQ7Cj4gIAo+ICAJaWYgKCFkcm1fZGV2X2VudGVyKGRy bSwgJmlkeCkpCj4gIAkJcmV0dXJuOwo+ICAKPiAtCXR2X21vZGUgPSB2YzRfdmVjX3R2X21vZGVf bG9va3VwKGNvbm5fc3RhdGUtPnR2Lm1vZGUpOwo+ICsJdHZfbW9kZSA9IHZjNF92ZWNfdHZfbW9k ZV9sb29rdXAoY29ubl9zdGF0ZS0+dHYubW9kZSwKPiArCQkJCQkgYWRqdXN0ZWRfbW9kZS0+aHRv dGFsKTsKPiAgCWlmICghdHZfbW9kZSkKPiAgCQlnb3RvIGVycl9kZXZfZXhpdDsKPiAgCj4gQEAg LTY0OCw5ICs3NDgsMTIgQEAgc3RhdGljIGludCB2YzRfdmVjX2JpbmQoc3RydWN0IGRldmljZSAq ZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCj4gIAo+ICAJcmV0ID0gZHJt X21vZGVfY3JlYXRlX3R2X3Byb3BlcnRpZXMoZHJtLAo+ICAJCQkJCSAgICBCSVQoRFJNX01PREVf VFZfTU9ERV9OVFNDKSB8Cj4gKwkJCQkJICAgIEJJVChEUk1fTU9ERV9UVl9NT0RFX05UU0NfNDQz KSB8Cj4gIAkJCQkJICAgIEJJVChEUk1fTU9ERV9UVl9NT0RFX05UU0NfSikgfAo+ICAJCQkJCSAg ICBCSVQoRFJNX01PREVfVFZfTU9ERV9QQUwpIHwKPiAtCQkJCQkgICAgQklUKERSTV9NT0RFX1RW X01PREVfUEFMX00pKTsKPiArCQkJCQkgICAgQklUKERSTV9NT0RFX1RWX01PREVfUEFMX00pIHwK PiArCQkJCQkgICAgQklUKERSTV9NT0RFX1RWX01PREVfUEFMX04pIHwKPiArCQkJCQkgICAgQklU KERSTV9NT0RFX1RWX01PREVfU0VDQU0pKTsKPiAgCWlmIChyZXQpCj4gIAkJcmV0dXJuIHJldDsK PiAgCj4KKi9wcmU+CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtYXJtLWtlcm5lbAo=