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 E853D20E3 for ; Thu, 10 Nov 2022 11:08:02 +0000 (UTC) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.nyi.internal (Postfix) with ESMTP id 237B958024D; Thu, 10 Nov 2022 06:08:02 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Thu, 10 Nov 2022 06:08:02 -0500 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=fm2; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=H RITDP3mZsT3jaCwXE1ING1pMgd0xQpeTVLk/j03gFQ+RFDX0/xZrPybeq0B4dFfr TK7soEYRd6f1B4cEZt+bHG+/oPsS/gQeTDFN4isMAdUmkunAr7/bXUwYPfeLJUXy XF9HOMnGIG/TIJKaJmq5OMD0ASzk7fZLNvEKQIT5LgSIKJjscJEPqElIl6/gan1u i6cBnVzkVE6B1m7EbFsvk7TwJq8S/fR5JA3YTiDNY+stQ8/XWAaKirbBrP+s2lOP OluqPy7hYKT/+LetBZsiKaBAjS7MZAB4YXWbsZJMdRtVm2hT1iimKpzAnhheFda3 2DhOgv3eRCtdyQX5mgVHg== 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=fm1; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=v vrOVY9vuk7vhXP0omGPMxCZxJww6BVZ+1rn4/V/jSRpIkqijsFvt+TQZKrjizZTv i09aFir/il8mAx037EietfOUkjIewwxuyk3QeGdG0zzuJKY3o4qtl2BPudUQqGQv atLXYJYBP0OKBOXlhF5jjupZYxS3UuqCzWnQEVPeYEw1QKlST9uy6Goq7RCFfQJ/ /v8KxPp0+sBeyehtp8KHR4nqYGUjdmYSY2VgIbqxtJPb0RxPV7MmQbX+YApJPG9V tNWIzt9wxKSTgi9eIV9p4PzM6osGwDWvGbecnO4ab2hncQxmnO81a+3S6345Cvir Q903m36Ma0fRqRJu2bCRg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:08:01 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:34 +0100 Subject: [PATCH v8 22/24] drm/vc4: vec: Convert to the new TV mode property 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-v8-22-09ce1466967c@cerno.tech> References: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> To: Maarten Lankhorst , Chen-Yu Tsai , Maxime Ripard , Jernej Skrabec , Karol Herbst , Jani Nikula , Daniel Vetter , Lyude Paul , Samuel Holland , Joonas Lahtinen , Thomas Zimmermann , Emma Anholt , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Ben Skeggs Cc: nouveau@lists.freedesktop.org, Noralf Trønnes , Dom Cobley , intel-gfx@lists.freedesktop.org, Phil Elwell , linux-sunxi@lists.linux.dev, Mateusz Kwiatkowski , Hans de Goede , linux-kernel@vger.kernel.org, Maxime Ripard , Dave Stevenson , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, Geert Uytterhoeven X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=9940; i=maxime@cerno.tech; h=from:subject:message-id; bh=8dwEnMAR6eSuVmdxx4UCplriWsdk527kJh8yu44yejo=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1P7J6oVF/zf57nc9whbvZDK5/z0P/MPhF7yjTd5ref+ 61ByRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACYSuIWRYfUBl6W1H1SWz6rfd/196a k9l65Yzma5V5fitH+Vyk8/XUtGhhtbV3c/rkn77cA0496duc8v/L7kZHZpLecny0PTDojWq7MBAA== X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Now that the core can deal fine with analog TV modes, let's convert the vc4 VEC driver to leverage those new features. We've added some backward compatibility to support the old TV mode property and translate it into the new TV norm property. We're also making use of the new analog TV atomic_check helper to make sure we trigger a modeset whenever the TV mode is updated. Acked-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Lookup the tv mode in atomic_check to make sure it's supported Changes in v6: - Use new get_modes helper Changes in v5: - Renamed tv_mode_names into legacy_tv_mode_names Changes in v4: - Removed the count variable in .get_modes --- drivers/gpu/drm/vc4/vc4_vec.c | 186 ++++++++++++++++++++++++++++++------------ 1 file changed, 132 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c index bfa8a58dba30..a828fc6fb776 100644 --- a/drivers/gpu/drm/vc4/vc4_vec.c +++ b/drivers/gpu/drm/vc4/vc4_vec.c @@ -172,6 +172,8 @@ struct vc4_vec { struct clk *clock; + struct drm_property *legacy_tv_mode_property; + struct debugfs_regset32 regset; }; @@ -184,6 +186,12 @@ encoder_to_vc4_vec(struct drm_encoder *encoder) return container_of(encoder, struct vc4_vec, encoder.base); } +static inline struct vc4_vec * +connector_to_vc4_vec(struct drm_connector *connector) +{ + return container_of(connector, struct vc4_vec, connector); +} + enum vc4_vec_tv_mode_id { VC4_VEC_TV_MODE_NTSC, VC4_VEC_TV_MODE_NTSC_J, @@ -192,7 +200,7 @@ enum vc4_vec_tv_mode_id { }; struct vc4_vec_tv_mode { - const struct drm_display_mode *mode; + unsigned int mode; u32 config0; u32 config1; u32 custom_freq; @@ -225,43 +233,51 @@ static const struct debugfs_reg32 vec_regs[] = { VC4_REG32(VEC_DAC_MISC), }; -static const struct drm_display_mode ntsc_mode = { - DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, - 480, 480 + 7, 480 + 7 + 6, 525, 0, - DRM_MODE_FLAG_INTERLACE) -}; - -static const struct drm_display_mode pal_mode = { - DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, - 576, 576 + 4, 576 + 4 + 6, 625, 0, - DRM_MODE_FLAG_INTERLACE) -}; - static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { - [VC4_VEC_TV_MODE_NTSC] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC, .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_NTSC_J] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC_J, .config0 = VEC_CONFIG0_NTSC_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL] = { - .mode = &pal_mode, + { + .mode = DRM_MODE_TV_MODE_PAL, .config0 = VEC_CONFIG0_PAL_BDGHI_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL_M] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_PAL_M, .config0 = VEC_CONFIG0_PAL_M_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, }; +static inline const struct vc4_vec_tv_mode * +vc4_vec_tv_mode_lookup(unsigned int mode) +{ + 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) + return tv_mode; + } + + return NULL; +} + +static const struct drm_prop_enum_list legacy_tv_mode_names[] = { + { VC4_VEC_TV_MODE_NTSC, "NTSC", }, + { VC4_VEC_TV_MODE_NTSC_J, "NTSC-J", }, + { VC4_VEC_TV_MODE_PAL, "PAL", }, + { VC4_VEC_TV_MODE_PAL_M, "PAL-M", }, +}; + static enum drm_connector_status vc4_vec_connector_detect(struct drm_connector *connector, bool force) { @@ -274,21 +290,74 @@ static void vc4_vec_connector_reset(struct drm_connector *connector) drm_atomic_helper_connector_tv_reset(connector); } -static int vc4_vec_connector_get_modes(struct drm_connector *connector) +static int +vc4_vec_connector_set_property(struct drm_connector *connector, + struct drm_connector_state *state, + struct drm_property *property, + uint64_t val) { - struct drm_connector_state *state = connector->state; - struct drm_display_mode *mode; - - mode = drm_mode_duplicate(connector->dev, - vc4_vec_tv_modes[state->tv.legacy_mode].mode); - if (!mode) { - DRM_ERROR("Failed to create a new display mode\n"); - return -ENOMEM; + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (val) { + case VC4_VEC_TV_MODE_NTSC: + state->tv.mode = DRM_MODE_TV_MODE_NTSC; + break; + + case VC4_VEC_TV_MODE_NTSC_J: + state->tv.mode = DRM_MODE_TV_MODE_NTSC_J; + break; + + case VC4_VEC_TV_MODE_PAL: + state->tv.mode = DRM_MODE_TV_MODE_PAL; + break; + + case VC4_VEC_TV_MODE_PAL_M: + state->tv.mode = DRM_MODE_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; } - drm_mode_probed_add(connector, mode); + return 0; +} + +static int +vc4_vec_connector_get_property(struct drm_connector *connector, + const struct drm_connector_state *state, + struct drm_property *property, + uint64_t *val) +{ + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (state->tv.mode) { + case DRM_MODE_TV_MODE_NTSC: + *val = VC4_VEC_TV_MODE_NTSC; + break; + + case DRM_MODE_TV_MODE_NTSC_J: + *val = VC4_VEC_TV_MODE_NTSC_J; + break; + + case DRM_MODE_TV_MODE_PAL: + *val = VC4_VEC_TV_MODE_PAL; + break; + + case DRM_MODE_TV_MODE_PAL_M: + *val = VC4_VEC_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; + } - return 1; + return 0; } static const struct drm_connector_funcs vc4_vec_connector_funcs = { @@ -297,15 +366,19 @@ static const struct drm_connector_funcs vc4_vec_connector_funcs = { .reset = vc4_vec_connector_reset, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + .atomic_get_property = vc4_vec_connector_get_property, + .atomic_set_property = vc4_vec_connector_set_property, }; static const struct drm_connector_helper_funcs vc4_vec_connector_helper_funcs = { - .get_modes = vc4_vec_connector_get_modes, + .atomic_check = drm_atomic_helper_connector_tv_check, + .get_modes = drm_connector_helper_tv_get_modes, }; static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) { struct drm_connector *connector = &vec->connector; + struct drm_property *prop; int ret; connector->interlace_allowed = true; @@ -318,8 +391,17 @@ static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) drm_connector_helper_add(connector, &vc4_vec_connector_helper_funcs); drm_object_attach_property(&connector->base, - dev->mode_config.legacy_tv_mode_property, - VC4_VEC_TV_MODE_NTSC); + dev->mode_config.tv_mode_property, + DRM_MODE_TV_MODE_NTSC); + + prop = drm_property_create_enum(dev, 0, "mode", + legacy_tv_mode_names, + ARRAY_SIZE(legacy_tv_mode_names)); + if (!prop) + return -ENOMEM; + vec->legacy_tv_mode_property = prop; + + drm_object_attach_property(&connector->base, prop, VC4_VEC_TV_MODE_NTSC); drm_connector_attach_encoder(connector, &vec->encoder.base); @@ -366,13 +448,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); - const struct vc4_vec_tv_mode *tv_mode = - &vc4_vec_tv_modes[conn_state->tv.legacy_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); + if (!tv_mode) + goto err_dev_exit; + ret = pm_runtime_get_sync(&vec->pdev->dev); if (ret < 0) { DRM_ERROR("Failed to retain power domain: %d\n", ret); @@ -454,12 +539,10 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, struct drm_connector_state *conn_state) { const struct drm_display_mode *mode = &crtc_state->adjusted_mode; - const struct vc4_vec_tv_mode *vec_mode; + const struct vc4_vec_tv_mode *tv_mode; - vec_mode = &vc4_vec_tv_modes[conn_state->tv.legacy_mode]; - - if (conn_state->crtc && - !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) + tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode, mode->htotal); + if (!tv_mode) return -EINVAL; if (mode->crtc_hdisplay % 4) @@ -556,13 +639,6 @@ static const struct of_device_id vc4_vec_dt_match[] = { { /* sentinel */ }, }; -static const char * const tv_mode_names[] = { - [VC4_VEC_TV_MODE_NTSC] = "NTSC", - [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", - [VC4_VEC_TV_MODE_PAL] = "PAL", - [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", -}; - static int vc4_vec_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); @@ -570,9 +646,11 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data) struct vc4_vec *vec; int ret; - ret = drm_mode_create_tv_properties_legacy(drm, - ARRAY_SIZE(tv_mode_names), - tv_mode_names); + ret = drm_mode_create_tv_properties(drm, + BIT(DRM_MODE_TV_MODE_NTSC) | + BIT(DRM_MODE_TV_MODE_NTSC_J) | + BIT(DRM_MODE_TV_MODE_PAL) | + BIT(DRM_MODE_TV_MODE_PAL_M)); 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 65AF7C433FE for ; Thu, 10 Nov 2022 11:10:07 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8018010E70E; Thu, 10 Nov 2022 11:08:12 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id B501510E6FF; Thu, 10 Nov 2022 11:08:02 +0000 (UTC) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.nyi.internal (Postfix) with ESMTP id 237B958024D; Thu, 10 Nov 2022 06:08:02 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Thu, 10 Nov 2022 06:08:02 -0500 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=fm2; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=H RITDP3mZsT3jaCwXE1ING1pMgd0xQpeTVLk/j03gFQ+RFDX0/xZrPybeq0B4dFfr TK7soEYRd6f1B4cEZt+bHG+/oPsS/gQeTDFN4isMAdUmkunAr7/bXUwYPfeLJUXy XF9HOMnGIG/TIJKaJmq5OMD0ASzk7fZLNvEKQIT5LgSIKJjscJEPqElIl6/gan1u i6cBnVzkVE6B1m7EbFsvk7TwJq8S/fR5JA3YTiDNY+stQ8/XWAaKirbBrP+s2lOP OluqPy7hYKT/+LetBZsiKaBAjS7MZAB4YXWbsZJMdRtVm2hT1iimKpzAnhheFda3 2DhOgv3eRCtdyQX5mgVHg== 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=fm1; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=v vrOVY9vuk7vhXP0omGPMxCZxJww6BVZ+1rn4/V/jSRpIkqijsFvt+TQZKrjizZTv i09aFir/il8mAx037EietfOUkjIewwxuyk3QeGdG0zzuJKY3o4qtl2BPudUQqGQv atLXYJYBP0OKBOXlhF5jjupZYxS3UuqCzWnQEVPeYEw1QKlST9uy6Goq7RCFfQJ/ /v8KxPp0+sBeyehtp8KHR4nqYGUjdmYSY2VgIbqxtJPb0RxPV7MmQbX+YApJPG9V tNWIzt9wxKSTgi9eIV9p4PzM6osGwDWvGbecnO4ab2hncQxmnO81a+3S6345Cvir Q903m36Ma0fRqRJu2bCRg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:08:01 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:34 +0100 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v8-22-09ce1466967c@cerno.tech> References: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> To: Maarten Lankhorst , Chen-Yu Tsai , Maxime Ripard , Jernej Skrabec , Karol Herbst , Jani Nikula , Daniel Vetter , Lyude Paul , Samuel Holland , Joonas Lahtinen , Thomas Zimmermann , Emma Anholt , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Ben Skeggs X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=9940; i=maxime@cerno.tech; h=from:subject:message-id; bh=8dwEnMAR6eSuVmdxx4UCplriWsdk527kJh8yu44yejo=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1P7J6oVF/zf57nc9whbvZDK5/z0P/MPhF7yjTd5ref+ 61ByRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACYSuIWRYfUBl6W1H1SWz6rfd/196a k9l65Yzma5V5fitH+Vyk8/XUtGhhtbV3c/rkn77cA0496duc8v/L7kZHZpLecny0PTDojWq7MBAA== X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Subject: [Nouveau] [PATCH v8 22/24] drm/vc4: vec: Convert to the new TV mode property 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, Phil Elwell , Hans de Goede , Noralf Trønnes , Geert Uytterhoeven , Maxime Ripard , Mateusz Kwiatkowski , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: nouveau-bounces@lists.freedesktop.org Sender: "Nouveau" Now that the core can deal fine with analog TV modes, let's convert the vc4 VEC driver to leverage those new features. We've added some backward compatibility to support the old TV mode property and translate it into the new TV norm property. We're also making use of the new analog TV atomic_check helper to make sure we trigger a modeset whenever the TV mode is updated. Acked-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Lookup the tv mode in atomic_check to make sure it's supported Changes in v6: - Use new get_modes helper Changes in v5: - Renamed tv_mode_names into legacy_tv_mode_names Changes in v4: - Removed the count variable in .get_modes --- drivers/gpu/drm/vc4/vc4_vec.c | 186 ++++++++++++++++++++++++++++++------------ 1 file changed, 132 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c index bfa8a58dba30..a828fc6fb776 100644 --- a/drivers/gpu/drm/vc4/vc4_vec.c +++ b/drivers/gpu/drm/vc4/vc4_vec.c @@ -172,6 +172,8 @@ struct vc4_vec { struct clk *clock; + struct drm_property *legacy_tv_mode_property; + struct debugfs_regset32 regset; }; @@ -184,6 +186,12 @@ encoder_to_vc4_vec(struct drm_encoder *encoder) return container_of(encoder, struct vc4_vec, encoder.base); } +static inline struct vc4_vec * +connector_to_vc4_vec(struct drm_connector *connector) +{ + return container_of(connector, struct vc4_vec, connector); +} + enum vc4_vec_tv_mode_id { VC4_VEC_TV_MODE_NTSC, VC4_VEC_TV_MODE_NTSC_J, @@ -192,7 +200,7 @@ enum vc4_vec_tv_mode_id { }; struct vc4_vec_tv_mode { - const struct drm_display_mode *mode; + unsigned int mode; u32 config0; u32 config1; u32 custom_freq; @@ -225,43 +233,51 @@ static const struct debugfs_reg32 vec_regs[] = { VC4_REG32(VEC_DAC_MISC), }; -static const struct drm_display_mode ntsc_mode = { - DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, - 480, 480 + 7, 480 + 7 + 6, 525, 0, - DRM_MODE_FLAG_INTERLACE) -}; - -static const struct drm_display_mode pal_mode = { - DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, - 576, 576 + 4, 576 + 4 + 6, 625, 0, - DRM_MODE_FLAG_INTERLACE) -}; - static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { - [VC4_VEC_TV_MODE_NTSC] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC, .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_NTSC_J] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC_J, .config0 = VEC_CONFIG0_NTSC_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL] = { - .mode = &pal_mode, + { + .mode = DRM_MODE_TV_MODE_PAL, .config0 = VEC_CONFIG0_PAL_BDGHI_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL_M] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_PAL_M, .config0 = VEC_CONFIG0_PAL_M_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, }; +static inline const struct vc4_vec_tv_mode * +vc4_vec_tv_mode_lookup(unsigned int mode) +{ + 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) + return tv_mode; + } + + return NULL; +} + +static const struct drm_prop_enum_list legacy_tv_mode_names[] = { + { VC4_VEC_TV_MODE_NTSC, "NTSC", }, + { VC4_VEC_TV_MODE_NTSC_J, "NTSC-J", }, + { VC4_VEC_TV_MODE_PAL, "PAL", }, + { VC4_VEC_TV_MODE_PAL_M, "PAL-M", }, +}; + static enum drm_connector_status vc4_vec_connector_detect(struct drm_connector *connector, bool force) { @@ -274,21 +290,74 @@ static void vc4_vec_connector_reset(struct drm_connector *connector) drm_atomic_helper_connector_tv_reset(connector); } -static int vc4_vec_connector_get_modes(struct drm_connector *connector) +static int +vc4_vec_connector_set_property(struct drm_connector *connector, + struct drm_connector_state *state, + struct drm_property *property, + uint64_t val) { - struct drm_connector_state *state = connector->state; - struct drm_display_mode *mode; - - mode = drm_mode_duplicate(connector->dev, - vc4_vec_tv_modes[state->tv.legacy_mode].mode); - if (!mode) { - DRM_ERROR("Failed to create a new display mode\n"); - return -ENOMEM; + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (val) { + case VC4_VEC_TV_MODE_NTSC: + state->tv.mode = DRM_MODE_TV_MODE_NTSC; + break; + + case VC4_VEC_TV_MODE_NTSC_J: + state->tv.mode = DRM_MODE_TV_MODE_NTSC_J; + break; + + case VC4_VEC_TV_MODE_PAL: + state->tv.mode = DRM_MODE_TV_MODE_PAL; + break; + + case VC4_VEC_TV_MODE_PAL_M: + state->tv.mode = DRM_MODE_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; } - drm_mode_probed_add(connector, mode); + return 0; +} + +static int +vc4_vec_connector_get_property(struct drm_connector *connector, + const struct drm_connector_state *state, + struct drm_property *property, + uint64_t *val) +{ + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (state->tv.mode) { + case DRM_MODE_TV_MODE_NTSC: + *val = VC4_VEC_TV_MODE_NTSC; + break; + + case DRM_MODE_TV_MODE_NTSC_J: + *val = VC4_VEC_TV_MODE_NTSC_J; + break; + + case DRM_MODE_TV_MODE_PAL: + *val = VC4_VEC_TV_MODE_PAL; + break; + + case DRM_MODE_TV_MODE_PAL_M: + *val = VC4_VEC_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; + } - return 1; + return 0; } static const struct drm_connector_funcs vc4_vec_connector_funcs = { @@ -297,15 +366,19 @@ static const struct drm_connector_funcs vc4_vec_connector_funcs = { .reset = vc4_vec_connector_reset, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + .atomic_get_property = vc4_vec_connector_get_property, + .atomic_set_property = vc4_vec_connector_set_property, }; static const struct drm_connector_helper_funcs vc4_vec_connector_helper_funcs = { - .get_modes = vc4_vec_connector_get_modes, + .atomic_check = drm_atomic_helper_connector_tv_check, + .get_modes = drm_connector_helper_tv_get_modes, }; static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) { struct drm_connector *connector = &vec->connector; + struct drm_property *prop; int ret; connector->interlace_allowed = true; @@ -318,8 +391,17 @@ static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) drm_connector_helper_add(connector, &vc4_vec_connector_helper_funcs); drm_object_attach_property(&connector->base, - dev->mode_config.legacy_tv_mode_property, - VC4_VEC_TV_MODE_NTSC); + dev->mode_config.tv_mode_property, + DRM_MODE_TV_MODE_NTSC); + + prop = drm_property_create_enum(dev, 0, "mode", + legacy_tv_mode_names, + ARRAY_SIZE(legacy_tv_mode_names)); + if (!prop) + return -ENOMEM; + vec->legacy_tv_mode_property = prop; + + drm_object_attach_property(&connector->base, prop, VC4_VEC_TV_MODE_NTSC); drm_connector_attach_encoder(connector, &vec->encoder.base); @@ -366,13 +448,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); - const struct vc4_vec_tv_mode *tv_mode = - &vc4_vec_tv_modes[conn_state->tv.legacy_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); + if (!tv_mode) + goto err_dev_exit; + ret = pm_runtime_get_sync(&vec->pdev->dev); if (ret < 0) { DRM_ERROR("Failed to retain power domain: %d\n", ret); @@ -454,12 +539,10 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, struct drm_connector_state *conn_state) { const struct drm_display_mode *mode = &crtc_state->adjusted_mode; - const struct vc4_vec_tv_mode *vec_mode; + const struct vc4_vec_tv_mode *tv_mode; - vec_mode = &vc4_vec_tv_modes[conn_state->tv.legacy_mode]; - - if (conn_state->crtc && - !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) + tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode, mode->htotal); + if (!tv_mode) return -EINVAL; if (mode->crtc_hdisplay % 4) @@ -556,13 +639,6 @@ static const struct of_device_id vc4_vec_dt_match[] = { { /* sentinel */ }, }; -static const char * const tv_mode_names[] = { - [VC4_VEC_TV_MODE_NTSC] = "NTSC", - [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", - [VC4_VEC_TV_MODE_PAL] = "PAL", - [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", -}; - static int vc4_vec_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); @@ -570,9 +646,11 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data) struct vc4_vec *vec; int ret; - ret = drm_mode_create_tv_properties_legacy(drm, - ARRAY_SIZE(tv_mode_names), - tv_mode_names); + ret = drm_mode_create_tv_properties(drm, + BIT(DRM_MODE_TV_MODE_NTSC) | + BIT(DRM_MODE_TV_MODE_NTSC_J) | + BIT(DRM_MODE_TV_MODE_PAL) | + BIT(DRM_MODE_TV_MODE_PAL_M)); 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 D6E6AC43219 for ; Thu, 10 Nov 2022 11:10:30 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id EC2DF10E724; Thu, 10 Nov 2022 11:08:17 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id B501510E6FF; Thu, 10 Nov 2022 11:08:02 +0000 (UTC) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.nyi.internal (Postfix) with ESMTP id 237B958024D; Thu, 10 Nov 2022 06:08:02 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Thu, 10 Nov 2022 06:08:02 -0500 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=fm2; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=H RITDP3mZsT3jaCwXE1ING1pMgd0xQpeTVLk/j03gFQ+RFDX0/xZrPybeq0B4dFfr TK7soEYRd6f1B4cEZt+bHG+/oPsS/gQeTDFN4isMAdUmkunAr7/bXUwYPfeLJUXy XF9HOMnGIG/TIJKaJmq5OMD0ASzk7fZLNvEKQIT5LgSIKJjscJEPqElIl6/gan1u i6cBnVzkVE6B1m7EbFsvk7TwJq8S/fR5JA3YTiDNY+stQ8/XWAaKirbBrP+s2lOP OluqPy7hYKT/+LetBZsiKaBAjS7MZAB4YXWbsZJMdRtVm2hT1iimKpzAnhheFda3 2DhOgv3eRCtdyQX5mgVHg== 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=fm1; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=v vrOVY9vuk7vhXP0omGPMxCZxJww6BVZ+1rn4/V/jSRpIkqijsFvt+TQZKrjizZTv i09aFir/il8mAx037EietfOUkjIewwxuyk3QeGdG0zzuJKY3o4qtl2BPudUQqGQv atLXYJYBP0OKBOXlhF5jjupZYxS3UuqCzWnQEVPeYEw1QKlST9uy6Goq7RCFfQJ/ /v8KxPp0+sBeyehtp8KHR4nqYGUjdmYSY2VgIbqxtJPb0RxPV7MmQbX+YApJPG9V tNWIzt9wxKSTgi9eIV9p4PzM6osGwDWvGbecnO4ab2hncQxmnO81a+3S6345Cvir Q903m36Ma0fRqRJu2bCRg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:08:01 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:34 +0100 Subject: [PATCH v8 22/24] drm/vc4: vec: Convert to the new TV mode property MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v8-22-09ce1466967c@cerno.tech> References: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> To: Maarten Lankhorst , Chen-Yu Tsai , Maxime Ripard , Jernej Skrabec , Karol Herbst , Jani Nikula , Daniel Vetter , Lyude Paul , Samuel Holland , Joonas Lahtinen , Thomas Zimmermann , Emma Anholt , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Ben Skeggs X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=9940; i=maxime@cerno.tech; h=from:subject:message-id; bh=8dwEnMAR6eSuVmdxx4UCplriWsdk527kJh8yu44yejo=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1P7J6oVF/zf57nc9whbvZDK5/z0P/MPhF7yjTd5ref+ 61ByRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACYSuIWRYfUBl6W1H1SWz6rfd/196a k9l65Yzma5V5fitH+Vyk8/XUtGhhtbV3c/rkn77cA0496duc8v/L7kZHZpLecny0PTDojWq7MBAA== 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, Phil Elwell , Hans de Goede , Noralf Trønnes , Geert Uytterhoeven , Maxime Ripard , Mateusz Kwiatkowski , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Now that the core can deal fine with analog TV modes, let's convert the vc4 VEC driver to leverage those new features. We've added some backward compatibility to support the old TV mode property and translate it into the new TV norm property. We're also making use of the new analog TV atomic_check helper to make sure we trigger a modeset whenever the TV mode is updated. Acked-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Lookup the tv mode in atomic_check to make sure it's supported Changes in v6: - Use new get_modes helper Changes in v5: - Renamed tv_mode_names into legacy_tv_mode_names Changes in v4: - Removed the count variable in .get_modes --- drivers/gpu/drm/vc4/vc4_vec.c | 186 ++++++++++++++++++++++++++++++------------ 1 file changed, 132 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c index bfa8a58dba30..a828fc6fb776 100644 --- a/drivers/gpu/drm/vc4/vc4_vec.c +++ b/drivers/gpu/drm/vc4/vc4_vec.c @@ -172,6 +172,8 @@ struct vc4_vec { struct clk *clock; + struct drm_property *legacy_tv_mode_property; + struct debugfs_regset32 regset; }; @@ -184,6 +186,12 @@ encoder_to_vc4_vec(struct drm_encoder *encoder) return container_of(encoder, struct vc4_vec, encoder.base); } +static inline struct vc4_vec * +connector_to_vc4_vec(struct drm_connector *connector) +{ + return container_of(connector, struct vc4_vec, connector); +} + enum vc4_vec_tv_mode_id { VC4_VEC_TV_MODE_NTSC, VC4_VEC_TV_MODE_NTSC_J, @@ -192,7 +200,7 @@ enum vc4_vec_tv_mode_id { }; struct vc4_vec_tv_mode { - const struct drm_display_mode *mode; + unsigned int mode; u32 config0; u32 config1; u32 custom_freq; @@ -225,43 +233,51 @@ static const struct debugfs_reg32 vec_regs[] = { VC4_REG32(VEC_DAC_MISC), }; -static const struct drm_display_mode ntsc_mode = { - DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, - 480, 480 + 7, 480 + 7 + 6, 525, 0, - DRM_MODE_FLAG_INTERLACE) -}; - -static const struct drm_display_mode pal_mode = { - DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, - 576, 576 + 4, 576 + 4 + 6, 625, 0, - DRM_MODE_FLAG_INTERLACE) -}; - static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { - [VC4_VEC_TV_MODE_NTSC] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC, .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_NTSC_J] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC_J, .config0 = VEC_CONFIG0_NTSC_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL] = { - .mode = &pal_mode, + { + .mode = DRM_MODE_TV_MODE_PAL, .config0 = VEC_CONFIG0_PAL_BDGHI_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL_M] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_PAL_M, .config0 = VEC_CONFIG0_PAL_M_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, }; +static inline const struct vc4_vec_tv_mode * +vc4_vec_tv_mode_lookup(unsigned int mode) +{ + 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) + return tv_mode; + } + + return NULL; +} + +static const struct drm_prop_enum_list legacy_tv_mode_names[] = { + { VC4_VEC_TV_MODE_NTSC, "NTSC", }, + { VC4_VEC_TV_MODE_NTSC_J, "NTSC-J", }, + { VC4_VEC_TV_MODE_PAL, "PAL", }, + { VC4_VEC_TV_MODE_PAL_M, "PAL-M", }, +}; + static enum drm_connector_status vc4_vec_connector_detect(struct drm_connector *connector, bool force) { @@ -274,21 +290,74 @@ static void vc4_vec_connector_reset(struct drm_connector *connector) drm_atomic_helper_connector_tv_reset(connector); } -static int vc4_vec_connector_get_modes(struct drm_connector *connector) +static int +vc4_vec_connector_set_property(struct drm_connector *connector, + struct drm_connector_state *state, + struct drm_property *property, + uint64_t val) { - struct drm_connector_state *state = connector->state; - struct drm_display_mode *mode; - - mode = drm_mode_duplicate(connector->dev, - vc4_vec_tv_modes[state->tv.legacy_mode].mode); - if (!mode) { - DRM_ERROR("Failed to create a new display mode\n"); - return -ENOMEM; + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (val) { + case VC4_VEC_TV_MODE_NTSC: + state->tv.mode = DRM_MODE_TV_MODE_NTSC; + break; + + case VC4_VEC_TV_MODE_NTSC_J: + state->tv.mode = DRM_MODE_TV_MODE_NTSC_J; + break; + + case VC4_VEC_TV_MODE_PAL: + state->tv.mode = DRM_MODE_TV_MODE_PAL; + break; + + case VC4_VEC_TV_MODE_PAL_M: + state->tv.mode = DRM_MODE_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; } - drm_mode_probed_add(connector, mode); + return 0; +} + +static int +vc4_vec_connector_get_property(struct drm_connector *connector, + const struct drm_connector_state *state, + struct drm_property *property, + uint64_t *val) +{ + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (state->tv.mode) { + case DRM_MODE_TV_MODE_NTSC: + *val = VC4_VEC_TV_MODE_NTSC; + break; + + case DRM_MODE_TV_MODE_NTSC_J: + *val = VC4_VEC_TV_MODE_NTSC_J; + break; + + case DRM_MODE_TV_MODE_PAL: + *val = VC4_VEC_TV_MODE_PAL; + break; + + case DRM_MODE_TV_MODE_PAL_M: + *val = VC4_VEC_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; + } - return 1; + return 0; } static const struct drm_connector_funcs vc4_vec_connector_funcs = { @@ -297,15 +366,19 @@ static const struct drm_connector_funcs vc4_vec_connector_funcs = { .reset = vc4_vec_connector_reset, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + .atomic_get_property = vc4_vec_connector_get_property, + .atomic_set_property = vc4_vec_connector_set_property, }; static const struct drm_connector_helper_funcs vc4_vec_connector_helper_funcs = { - .get_modes = vc4_vec_connector_get_modes, + .atomic_check = drm_atomic_helper_connector_tv_check, + .get_modes = drm_connector_helper_tv_get_modes, }; static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) { struct drm_connector *connector = &vec->connector; + struct drm_property *prop; int ret; connector->interlace_allowed = true; @@ -318,8 +391,17 @@ static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) drm_connector_helper_add(connector, &vc4_vec_connector_helper_funcs); drm_object_attach_property(&connector->base, - dev->mode_config.legacy_tv_mode_property, - VC4_VEC_TV_MODE_NTSC); + dev->mode_config.tv_mode_property, + DRM_MODE_TV_MODE_NTSC); + + prop = drm_property_create_enum(dev, 0, "mode", + legacy_tv_mode_names, + ARRAY_SIZE(legacy_tv_mode_names)); + if (!prop) + return -ENOMEM; + vec->legacy_tv_mode_property = prop; + + drm_object_attach_property(&connector->base, prop, VC4_VEC_TV_MODE_NTSC); drm_connector_attach_encoder(connector, &vec->encoder.base); @@ -366,13 +448,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); - const struct vc4_vec_tv_mode *tv_mode = - &vc4_vec_tv_modes[conn_state->tv.legacy_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); + if (!tv_mode) + goto err_dev_exit; + ret = pm_runtime_get_sync(&vec->pdev->dev); if (ret < 0) { DRM_ERROR("Failed to retain power domain: %d\n", ret); @@ -454,12 +539,10 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, struct drm_connector_state *conn_state) { const struct drm_display_mode *mode = &crtc_state->adjusted_mode; - const struct vc4_vec_tv_mode *vec_mode; + const struct vc4_vec_tv_mode *tv_mode; - vec_mode = &vc4_vec_tv_modes[conn_state->tv.legacy_mode]; - - if (conn_state->crtc && - !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) + tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode, mode->htotal); + if (!tv_mode) return -EINVAL; if (mode->crtc_hdisplay % 4) @@ -556,13 +639,6 @@ static const struct of_device_id vc4_vec_dt_match[] = { { /* sentinel */ }, }; -static const char * const tv_mode_names[] = { - [VC4_VEC_TV_MODE_NTSC] = "NTSC", - [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", - [VC4_VEC_TV_MODE_PAL] = "PAL", - [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", -}; - static int vc4_vec_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); @@ -570,9 +646,11 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data) struct vc4_vec *vec; int ret; - ret = drm_mode_create_tv_properties_legacy(drm, - ARRAY_SIZE(tv_mode_names), - tv_mode_names); + ret = drm_mode_create_tv_properties(drm, + BIT(DRM_MODE_TV_MODE_NTSC) | + BIT(DRM_MODE_TV_MODE_NTSC_J) | + BIT(DRM_MODE_TV_MODE_PAL) | + BIT(DRM_MODE_TV_MODE_PAL_M)); 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 AE961C43217 for ; Thu, 10 Nov 2022 11:10:35 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C789810E748; Thu, 10 Nov 2022 11:08:20 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id B501510E6FF; Thu, 10 Nov 2022 11:08:02 +0000 (UTC) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.nyi.internal (Postfix) with ESMTP id 237B958024D; Thu, 10 Nov 2022 06:08:02 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Thu, 10 Nov 2022 06:08:02 -0500 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=fm2; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=H RITDP3mZsT3jaCwXE1ING1pMgd0xQpeTVLk/j03gFQ+RFDX0/xZrPybeq0B4dFfr TK7soEYRd6f1B4cEZt+bHG+/oPsS/gQeTDFN4isMAdUmkunAr7/bXUwYPfeLJUXy XF9HOMnGIG/TIJKaJmq5OMD0ASzk7fZLNvEKQIT5LgSIKJjscJEPqElIl6/gan1u i6cBnVzkVE6B1m7EbFsvk7TwJq8S/fR5JA3YTiDNY+stQ8/XWAaKirbBrP+s2lOP OluqPy7hYKT/+LetBZsiKaBAjS7MZAB4YXWbsZJMdRtVm2hT1iimKpzAnhheFda3 2DhOgv3eRCtdyQX5mgVHg== 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=fm1; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=v vrOVY9vuk7vhXP0omGPMxCZxJww6BVZ+1rn4/V/jSRpIkqijsFvt+TQZKrjizZTv i09aFir/il8mAx037EietfOUkjIewwxuyk3QeGdG0zzuJKY3o4qtl2BPudUQqGQv atLXYJYBP0OKBOXlhF5jjupZYxS3UuqCzWnQEVPeYEw1QKlST9uy6Goq7RCFfQJ/ /v8KxPp0+sBeyehtp8KHR4nqYGUjdmYSY2VgIbqxtJPb0RxPV7MmQbX+YApJPG9V tNWIzt9wxKSTgi9eIV9p4PzM6osGwDWvGbecnO4ab2hncQxmnO81a+3S6345Cvir Q903m36Ma0fRqRJu2bCRg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:08:01 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:34 +0100 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v8-22-09ce1466967c@cerno.tech> References: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> To: Maarten Lankhorst , Chen-Yu Tsai , Maxime Ripard , Jernej Skrabec , Karol Herbst , Jani Nikula , Daniel Vetter , Lyude Paul , Samuel Holland , Joonas Lahtinen , Thomas Zimmermann , Emma Anholt , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Ben Skeggs X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=9940; i=maxime@cerno.tech; h=from:subject:message-id; bh=8dwEnMAR6eSuVmdxx4UCplriWsdk527kJh8yu44yejo=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1P7J6oVF/zf57nc9whbvZDK5/z0P/MPhF7yjTd5ref+ 61ByRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACYSuIWRYfUBl6W1H1SWz6rfd/196a k9l65Yzma5V5fitH+Vyk8/XUtGhhtbV3c/rkn77cA0496duc8v/L7kZHZpLecny0PTDojWq7MBAA== X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Subject: [Intel-gfx] [PATCH v8 22/24] drm/vc4: vec: Convert to the new TV mode property 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, Phil Elwell , Hans de Goede , Noralf Trønnes , Geert Uytterhoeven , Maxime Ripard , Mateusz Kwiatkowski , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Now that the core can deal fine with analog TV modes, let's convert the vc4 VEC driver to leverage those new features. We've added some backward compatibility to support the old TV mode property and translate it into the new TV norm property. We're also making use of the new analog TV atomic_check helper to make sure we trigger a modeset whenever the TV mode is updated. Acked-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Lookup the tv mode in atomic_check to make sure it's supported Changes in v6: - Use new get_modes helper Changes in v5: - Renamed tv_mode_names into legacy_tv_mode_names Changes in v4: - Removed the count variable in .get_modes --- drivers/gpu/drm/vc4/vc4_vec.c | 186 ++++++++++++++++++++++++++++++------------ 1 file changed, 132 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c index bfa8a58dba30..a828fc6fb776 100644 --- a/drivers/gpu/drm/vc4/vc4_vec.c +++ b/drivers/gpu/drm/vc4/vc4_vec.c @@ -172,6 +172,8 @@ struct vc4_vec { struct clk *clock; + struct drm_property *legacy_tv_mode_property; + struct debugfs_regset32 regset; }; @@ -184,6 +186,12 @@ encoder_to_vc4_vec(struct drm_encoder *encoder) return container_of(encoder, struct vc4_vec, encoder.base); } +static inline struct vc4_vec * +connector_to_vc4_vec(struct drm_connector *connector) +{ + return container_of(connector, struct vc4_vec, connector); +} + enum vc4_vec_tv_mode_id { VC4_VEC_TV_MODE_NTSC, VC4_VEC_TV_MODE_NTSC_J, @@ -192,7 +200,7 @@ enum vc4_vec_tv_mode_id { }; struct vc4_vec_tv_mode { - const struct drm_display_mode *mode; + unsigned int mode; u32 config0; u32 config1; u32 custom_freq; @@ -225,43 +233,51 @@ static const struct debugfs_reg32 vec_regs[] = { VC4_REG32(VEC_DAC_MISC), }; -static const struct drm_display_mode ntsc_mode = { - DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, - 480, 480 + 7, 480 + 7 + 6, 525, 0, - DRM_MODE_FLAG_INTERLACE) -}; - -static const struct drm_display_mode pal_mode = { - DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500, - 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, - 576, 576 + 4, 576 + 4 + 6, 625, 0, - DRM_MODE_FLAG_INTERLACE) -}; - static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { - [VC4_VEC_TV_MODE_NTSC] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC, .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_NTSC_J] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_NTSC_J, .config0 = VEC_CONFIG0_NTSC_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL] = { - .mode = &pal_mode, + { + .mode = DRM_MODE_TV_MODE_PAL, .config0 = VEC_CONFIG0_PAL_BDGHI_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, - [VC4_VEC_TV_MODE_PAL_M] = { - .mode = &ntsc_mode, + { + .mode = DRM_MODE_TV_MODE_PAL_M, .config0 = VEC_CONFIG0_PAL_M_STD, .config1 = VEC_CONFIG1_C_CVBS_CVBS, }, }; +static inline const struct vc4_vec_tv_mode * +vc4_vec_tv_mode_lookup(unsigned int mode) +{ + 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) + return tv_mode; + } + + return NULL; +} + +static const struct drm_prop_enum_list legacy_tv_mode_names[] = { + { VC4_VEC_TV_MODE_NTSC, "NTSC", }, + { VC4_VEC_TV_MODE_NTSC_J, "NTSC-J", }, + { VC4_VEC_TV_MODE_PAL, "PAL", }, + { VC4_VEC_TV_MODE_PAL_M, "PAL-M", }, +}; + static enum drm_connector_status vc4_vec_connector_detect(struct drm_connector *connector, bool force) { @@ -274,21 +290,74 @@ static void vc4_vec_connector_reset(struct drm_connector *connector) drm_atomic_helper_connector_tv_reset(connector); } -static int vc4_vec_connector_get_modes(struct drm_connector *connector) +static int +vc4_vec_connector_set_property(struct drm_connector *connector, + struct drm_connector_state *state, + struct drm_property *property, + uint64_t val) { - struct drm_connector_state *state = connector->state; - struct drm_display_mode *mode; - - mode = drm_mode_duplicate(connector->dev, - vc4_vec_tv_modes[state->tv.legacy_mode].mode); - if (!mode) { - DRM_ERROR("Failed to create a new display mode\n"); - return -ENOMEM; + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (val) { + case VC4_VEC_TV_MODE_NTSC: + state->tv.mode = DRM_MODE_TV_MODE_NTSC; + break; + + case VC4_VEC_TV_MODE_NTSC_J: + state->tv.mode = DRM_MODE_TV_MODE_NTSC_J; + break; + + case VC4_VEC_TV_MODE_PAL: + state->tv.mode = DRM_MODE_TV_MODE_PAL; + break; + + case VC4_VEC_TV_MODE_PAL_M: + state->tv.mode = DRM_MODE_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; } - drm_mode_probed_add(connector, mode); + return 0; +} + +static int +vc4_vec_connector_get_property(struct drm_connector *connector, + const struct drm_connector_state *state, + struct drm_property *property, + uint64_t *val) +{ + struct vc4_vec *vec = connector_to_vc4_vec(connector); + + if (property != vec->legacy_tv_mode_property) + return -EINVAL; + + switch (state->tv.mode) { + case DRM_MODE_TV_MODE_NTSC: + *val = VC4_VEC_TV_MODE_NTSC; + break; + + case DRM_MODE_TV_MODE_NTSC_J: + *val = VC4_VEC_TV_MODE_NTSC_J; + break; + + case DRM_MODE_TV_MODE_PAL: + *val = VC4_VEC_TV_MODE_PAL; + break; + + case DRM_MODE_TV_MODE_PAL_M: + *val = VC4_VEC_TV_MODE_PAL_M; + break; + + default: + return -EINVAL; + } - return 1; + return 0; } static const struct drm_connector_funcs vc4_vec_connector_funcs = { @@ -297,15 +366,19 @@ static const struct drm_connector_funcs vc4_vec_connector_funcs = { .reset = vc4_vec_connector_reset, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + .atomic_get_property = vc4_vec_connector_get_property, + .atomic_set_property = vc4_vec_connector_set_property, }; static const struct drm_connector_helper_funcs vc4_vec_connector_helper_funcs = { - .get_modes = vc4_vec_connector_get_modes, + .atomic_check = drm_atomic_helper_connector_tv_check, + .get_modes = drm_connector_helper_tv_get_modes, }; static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) { struct drm_connector *connector = &vec->connector; + struct drm_property *prop; int ret; connector->interlace_allowed = true; @@ -318,8 +391,17 @@ static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) drm_connector_helper_add(connector, &vc4_vec_connector_helper_funcs); drm_object_attach_property(&connector->base, - dev->mode_config.legacy_tv_mode_property, - VC4_VEC_TV_MODE_NTSC); + dev->mode_config.tv_mode_property, + DRM_MODE_TV_MODE_NTSC); + + prop = drm_property_create_enum(dev, 0, "mode", + legacy_tv_mode_names, + ARRAY_SIZE(legacy_tv_mode_names)); + if (!prop) + return -ENOMEM; + vec->legacy_tv_mode_property = prop; + + drm_object_attach_property(&connector->base, prop, VC4_VEC_TV_MODE_NTSC); drm_connector_attach_encoder(connector, &vec->encoder.base); @@ -366,13 +448,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); - const struct vc4_vec_tv_mode *tv_mode = - &vc4_vec_tv_modes[conn_state->tv.legacy_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); + if (!tv_mode) + goto err_dev_exit; + ret = pm_runtime_get_sync(&vec->pdev->dev); if (ret < 0) { DRM_ERROR("Failed to retain power domain: %d\n", ret); @@ -454,12 +539,10 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, struct drm_connector_state *conn_state) { const struct drm_display_mode *mode = &crtc_state->adjusted_mode; - const struct vc4_vec_tv_mode *vec_mode; + const struct vc4_vec_tv_mode *tv_mode; - vec_mode = &vc4_vec_tv_modes[conn_state->tv.legacy_mode]; - - if (conn_state->crtc && - !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) + tv_mode = vc4_vec_tv_mode_lookup(conn_state->tv.mode, mode->htotal); + if (!tv_mode) return -EINVAL; if (mode->crtc_hdisplay % 4) @@ -556,13 +639,6 @@ static const struct of_device_id vc4_vec_dt_match[] = { { /* sentinel */ }, }; -static const char * const tv_mode_names[] = { - [VC4_VEC_TV_MODE_NTSC] = "NTSC", - [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", - [VC4_VEC_TV_MODE_PAL] = "PAL", - [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", -}; - static int vc4_vec_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); @@ -570,9 +646,11 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data) struct vc4_vec *vec; int ret; - ret = drm_mode_create_tv_properties_legacy(drm, - ARRAY_SIZE(tv_mode_names), - tv_mode_names); + ret = drm_mode_create_tv_properties(drm, + BIT(DRM_MODE_TV_MODE_NTSC) | + BIT(DRM_MODE_TV_MODE_NTSC_J) | + BIT(DRM_MODE_TV_MODE_PAL) | + BIT(DRM_MODE_TV_MODE_PAL_M)); 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 EC7B5C433FE for ; Thu, 10 Nov 2022 11:26:48 +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=+q/+yb/YjK94tU/2PRffezf+ze7RxzkfrzqlMPQR2gk=; b=uoEC1g7QfELtSc 1dH38esmzXataja6QYAKhGM2tXsAgy5/SCOUrAy0JWd2QS8vnp2QvgxhtDWd8tIThLXDCucjPijRu MeG6jwDCFqRiV/L44fAKT5RWDSEHkHCQx2CJWfRXl4GH9HtoHaKS6IShYrp/dhrJ3PZrv2ydkqMHM aOc3dY1bbKBfj1Y5V8U8dAgv2VcF+qCG+K5vBQSRS6GXEOqlDCKgPeTha0D5h9pBjGo+xVJeSS4rw 45V+bmLg57dcLJbr789GMvG0vRPoWHAMmxm2ltAWM4lOFcV+cuoqYd2dnrB/D6dVyJWl1MXKgrpm1 fU/EI+OR1/yYMW+Frv3A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ot5gT-005L2N-HW; Thu, 10 Nov 2022 11:25:26 +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 1ot5Pe-005DwE-PK for linux-arm-kernel@lists.infradead.org; Thu, 10 Nov 2022 11:08:05 +0000 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.nyi.internal (Postfix) with ESMTP id 237B958024D; Thu, 10 Nov 2022 06:08:02 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Thu, 10 Nov 2022 06:08:02 -0500 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=fm2; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=H RITDP3mZsT3jaCwXE1ING1pMgd0xQpeTVLk/j03gFQ+RFDX0/xZrPybeq0B4dFfr TK7soEYRd6f1B4cEZt+bHG+/oPsS/gQeTDFN4isMAdUmkunAr7/bXUwYPfeLJUXy XF9HOMnGIG/TIJKaJmq5OMD0ASzk7fZLNvEKQIT5LgSIKJjscJEPqElIl6/gan1u i6cBnVzkVE6B1m7EbFsvk7TwJq8S/fR5JA3YTiDNY+stQ8/XWAaKirbBrP+s2lOP OluqPy7hYKT/+LetBZsiKaBAjS7MZAB4YXWbsZJMdRtVm2hT1iimKpzAnhheFda3 2DhOgv3eRCtdyQX5mgVHg== 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=fm1; t=1668078482; x= 1668085682; bh=8wrnSplflNxoDXeWFZCqnTOFgcIawLwQW9QWmB/dHdE=; b=v vrOVY9vuk7vhXP0omGPMxCZxJww6BVZ+1rn4/V/jSRpIkqijsFvt+TQZKrjizZTv i09aFir/il8mAx037EietfOUkjIewwxuyk3QeGdG0zzuJKY3o4qtl2BPudUQqGQv atLXYJYBP0OKBOXlhF5jjupZYxS3UuqCzWnQEVPeYEw1QKlST9uy6Goq7RCFfQJ/ /v8KxPp0+sBeyehtp8KHR4nqYGUjdmYSY2VgIbqxtJPb0RxPV7MmQbX+YApJPG9V tNWIzt9wxKSTgi9eIV9p4PzM6osGwDWvGbecnO4ab2hncQxmnO81a+3S6345Cvir Q903m36Ma0fRqRJu2bCRg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:08:01 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:34 +0100 Subject: [PATCH v8 22/24] drm/vc4: vec: Convert to the new TV mode property MIME-Version: 1.0 Message-Id: <20220728-rpi-analog-tv-properties-v8-22-09ce1466967c@cerno.tech> References: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> In-Reply-To: <20220728-rpi-analog-tv-properties-v8-0-09ce1466967c@cerno.tech> To: Maarten Lankhorst , Chen-Yu Tsai , Maxime Ripard , Jernej Skrabec , Karol Herbst , Jani Nikula , Daniel Vetter , Lyude Paul , Samuel Holland , Joonas Lahtinen , Thomas Zimmermann , Emma Anholt , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Ben Skeggs Cc: nouveau@lists.freedesktop.org, Noralf Trønnes , Dom Cobley , intel-gfx@lists.freedesktop.org, Phil Elwell , linux-sunxi@lists.linux.dev, Mateusz Kwiatkowski , Hans de Goede , linux-kernel@vger.kernel.org, Maxime Ripard , Dave Stevenson , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, Geert Uytterhoeven X-Mailer: b4 0.11.0-dev-99e3a X-Developer-Signature: v=1; a=openpgp-sha256; l=9940; i=maxime@cerno.tech; h=from:subject:message-id; bh=8dwEnMAR6eSuVmdxx4UCplriWsdk527kJh8yu44yejo=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1P7J6oVF/zf57nc9whbvZDK5/z0P/MPhF7yjTd5ref+ 61ByRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACYSuIWRYfUBl6W1H1SWz6rfd/196a k9l65Yzma5V5fitH+Vyk8/XUtGhhtbV3c/rkn77cA0496duc8v/L7kZHZpLecny0PTDojWq7MBAA== 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-20221110_030802_997401_E652FF13 X-CRM114-Status: GOOD ( 22.88 ) 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 Tm93IHRoYXQgdGhlIGNvcmUgY2FuIGRlYWwgZmluZSB3aXRoIGFuYWxvZyBUViBtb2RlcywgbGV0 J3MgY29udmVydCB0aGUgdmM0ClZFQyBkcml2ZXIgdG8gbGV2ZXJhZ2UgdGhvc2UgbmV3IGZlYXR1 cmVzLgoKV2UndmUgYWRkZWQgc29tZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIHN1cHBvcnQg dGhlIG9sZCBUViBtb2RlIHByb3BlcnR5CmFuZCB0cmFuc2xhdGUgaXQgaW50byB0aGUgbmV3IFRW IG5vcm0gcHJvcGVydHkuIFdlJ3JlIGFsc28gbWFraW5nIHVzZSBvZgp0aGUgbmV3IGFuYWxvZyBU ViBhdG9taWNfY2hlY2sgaGVscGVyIHRvIG1ha2Ugc3VyZSB3ZSB0cmlnZ2VyIGEgbW9kZXNldAp3 aGVuZXZlciB0aGUgVFYgbW9kZSBpcyB1cGRhdGVkLgoKQWNrZWQtYnk6IE5vcmFsZiBUcsO4bm5l cyA8bm9yYWxmQHRyb25uZXMub3JnPgpUZXN0ZWQtYnk6IE1hdGV1c3ogS3dpYXRrb3dza2kgPGtm eWF0ZWsrcHVibGljZ2l0QGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8 bWF4aW1lQGNlcm5vLnRlY2g+CgotLS0KQ2hhbmdlcyBpbiB2NzoKLSBMb29rdXAgdGhlIHR2IG1v ZGUgaW4gYXRvbWljX2NoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIHN1cHBvcnRlZAoKQ2hhbmdlcyBp biB2NjoKLSBVc2UgbmV3IGdldF9tb2RlcyBoZWxwZXIKCkNoYW5nZXMgaW4gdjU6Ci0gUmVuYW1l ZCB0dl9tb2RlX25hbWVzIGludG8gbGVnYWN5X3R2X21vZGVfbmFtZXMKCkNoYW5nZXMgaW4gdjQ6 Ci0gUmVtb3ZlZCB0aGUgY291bnQgdmFyaWFibGUgaW4gLmdldF9tb2RlcwotLS0KIGRyaXZlcnMv Z3B1L2RybS92YzQvdmM0X3ZlYy5jIHwgMTg2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDEzMiBpbnNlcnRpb25zKCspLCA1NCBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMuYyBiL2Ry aXZlcnMvZ3B1L2RybS92YzQvdmM0X3ZlYy5jCmluZGV4IGJmYThhNThkYmEzMC4uYTgyOGZjNmZi Nzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMuYworKysgYi9kcml2 ZXJzL2dwdS9kcm0vdmM0L3ZjNF92ZWMuYwpAQCAtMTcyLDYgKzE3Miw4IEBAIHN0cnVjdCB2YzRf dmVjIHsKIAogCXN0cnVjdCBjbGsgKmNsb2NrOwogCisJc3RydWN0IGRybV9wcm9wZXJ0eSAqbGVn YWN5X3R2X21vZGVfcHJvcGVydHk7CisKIAlzdHJ1Y3QgZGVidWdmc19yZWdzZXQzMiByZWdzZXQ7 CiB9OwogCkBAIC0xODQsNiArMTg2LDEyIEBAIGVuY29kZXJfdG9fdmM0X3ZlYyhzdHJ1Y3QgZHJt X2VuY29kZXIgKmVuY29kZXIpCiAJcmV0dXJuIGNvbnRhaW5lcl9vZihlbmNvZGVyLCBzdHJ1Y3Qg dmM0X3ZlYywgZW5jb2Rlci5iYXNlKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdmM0X3Zl YyAqCitjb25uZWN0b3JfdG9fdmM0X3ZlYyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y KQoreworCXJldHVybiBjb250YWluZXJfb2YoY29ubmVjdG9yLCBzdHJ1Y3QgdmM0X3ZlYywgY29u bmVjdG9yKTsKK30KKwogZW51bSB2YzRfdmVjX3R2X21vZGVfaWQgewogCVZDNF9WRUNfVFZfTU9E RV9OVFNDLAogCVZDNF9WRUNfVFZfTU9ERV9OVFNDX0osCkBAIC0xOTIsNyArMjAwLDcgQEAgZW51 bSB2YzRfdmVjX3R2X21vZGVfaWQgewogfTsKIAogc3RydWN0IHZjNF92ZWNfdHZfbW9kZSB7Ci0J Y29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJdW5zaWduZWQgaW50IG1vZGU7 CiAJdTMyIGNvbmZpZzA7CiAJdTMyIGNvbmZpZzE7CiAJdTMyIGN1c3RvbV9mcmVxOwpAQCAtMjI1 LDQzICsyMzMsNTEgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z2ZzX3JlZzMyIHZlY19yZWdz W10gPSB7CiAJVkM0X1JFRzMyKFZFQ19EQUNfTUlTQyksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgbnRzY19tb2RlID0gewotCURSTV9NT0RFKCI3MjB4NDgwIiwg RFJNX01PREVfVFlQRV9EUklWRVIsIDEzNTAwLAotCQkgNzIwLCA3MjAgKyAxNCwgNzIwICsgMTQg KyA2NCwgNzIwICsgMTQgKyA2NCArIDYwLCAwLAotCQkgNDgwLCA0ODAgKyA3LCA0ODAgKyA3ICsg NiwgNTI1LCAwLAotCQkgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCi19OwotCi1zdGF0aWMgY29u c3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgcGFsX21vZGUgPSB7Ci0JRFJNX01PREUoIjcyMHg1 NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTM1MDAsCi0JCSA3MjAsIDcyMCArIDIwLCA3MjAg KyAyMCArIDY0LCA3MjAgKyAyMCArIDY0ICsgNjAsIDAsCi0JCSA1NzYsIDU3NiArIDQsIDU3NiAr IDQgKyA2LCA2MjUsIDAsCi0JCSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKLX07Ci0KIHN0YXRp YyBjb25zdCBzdHJ1Y3QgdmM0X3ZlY190dl9tb2RlIHZjNF92ZWNfdHZfbW9kZXNbXSA9IHsKLQlb VkM0X1ZFQ19UVl9NT0RFX05UU0NdID0gewotCQkubW9kZSA9ICZudHNjX21vZGUsCisJeworCQku bW9kZSA9IERSTV9NT0RFX1RWX01PREVfTlRTQywKIAkJLmNvbmZpZzAgPSBWRUNfQ09ORklHMF9O VFNDX1NURCB8IFZFQ19DT05GSUcwX1BERU4sCiAJCS5jb25maWcxID0gVkVDX0NPTkZJRzFfQ19D VkJTX0NWQlMsCiAJfSwKLQlbVkM0X1ZFQ19UVl9NT0RFX05UU0NfSl0gPSB7Ci0JCS5tb2RlID0g Jm50c2NfbW9kZSwKKwl7CisJCS5tb2RlID0gRFJNX01PREVfVFZfTU9ERV9OVFNDX0osCiAJCS5j b25maWcwID0gVkVDX0NPTkZJRzBfTlRTQ19TVEQsCiAJCS5jb25maWcxID0gVkVDX0NPTkZJRzFf Q19DVkJTX0NWQlMsCiAJfSwKLQlbVkM0X1ZFQ19UVl9NT0RFX1BBTF0gPSB7Ci0JCS5tb2RlID0g JnBhbF9tb2RlLAorCXsKKwkJLm1vZGUgPSBEUk1fTU9ERV9UVl9NT0RFX1BBTCwKIAkJLmNvbmZp ZzAgPSBWRUNfQ09ORklHMF9QQUxfQkRHSElfU1RELAogCQkuY29uZmlnMSA9IFZFQ19DT05GSUcx X0NfQ1ZCU19DVkJTLAogCX0sCi0JW1ZDNF9WRUNfVFZfTU9ERV9QQUxfTV0gPSB7Ci0JCS5tb2Rl ID0gJm50c2NfbW9kZSwKKwl7CisJCS5tb2RlID0gRFJNX01PREVfVFZfTU9ERV9QQUxfTSwKIAkJ LmNvbmZpZzAgPSBWRUNfQ09ORklHMF9QQUxfTV9TVEQsCiAJCS5jb25maWcxID0gVkVDX0NPTkZJ RzFfQ19DVkJTX0NWQlMsCiAJfSwKIH07CiAKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHZj NF92ZWNfdHZfbW9kZSAqCit2YzRfdmVjX3R2X21vZGVfbG9va3VwKHVuc2lnbmVkIGludCBtb2Rl KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmM0 X3ZlY190dl9tb2Rlcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmM0X3ZlY190dl9tb2RlICp0 dl9tb2RlID0gJnZjNF92ZWNfdHZfbW9kZXNbaV07CisKKwkJaWYgKHR2X21vZGUtPm1vZGUgPT0g bW9kZSkKKwkJCXJldHVybiB0dl9tb2RlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBsZWdhY3lfdHZfbW9kZV9uYW1lc1td ID0geworCXsgVkM0X1ZFQ19UVl9NT0RFX05UU0MsICJOVFNDIiwgfSwKKwl7IFZDNF9WRUNfVFZf TU9ERV9OVFNDX0osICJOVFNDLUoiLCB9LAorCXsgVkM0X1ZFQ19UVl9NT0RFX1BBTCwgIlBBTCIs IH0sCisJeyBWQzRfVkVDX1RWX01PREVfUEFMX00sICJQQUwtTSIsIH0sCit9OworCiBzdGF0aWMg ZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwogdmM0X3ZlY19jb25uZWN0b3JfZGV0ZWN0KHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2UpCiB7CkBAIC0yNzQsMjEgKzI5 MCw3NCBAQCBzdGF0aWMgdm9pZCB2YzRfdmVjX2Nvbm5lY3Rvcl9yZXNldChzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yKQogCWRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl90dl9yZXNl dChjb25uZWN0b3IpOwogfQogCi1zdGF0aWMgaW50IHZjNF92ZWNfY29ubmVjdG9yX2dldF9tb2Rl cyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQorc3RhdGljIGludAordmM0X3ZlY19j b25uZWN0b3Jfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJ CQkgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKnN0YXRlLAorCQkJICAgICAgIHN0 cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJICAgICAgIHVpbnQ2NF90IHZhbCkKIHsK LQlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqc3RhdGUgPSBjb25uZWN0b3ItPnN0YXRlOwot CXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwotCi0JbW9kZSA9IGRybV9tb2RlX2R1cGxp Y2F0ZShjb25uZWN0b3ItPmRldiwKLQkJCQkgIHZjNF92ZWNfdHZfbW9kZXNbc3RhdGUtPnR2Lmxl Z2FjeV9tb2RlXS5tb2RlKTsKLQlpZiAoIW1vZGUpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8g Y3JlYXRlIGEgbmV3IGRpc3BsYXkgbW9kZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCXN0cnVj dCB2YzRfdmVjICp2ZWMgPSBjb25uZWN0b3JfdG9fdmM0X3ZlYyhjb25uZWN0b3IpOworCisJaWYg KHByb3BlcnR5ICE9IHZlYy0+bGVnYWN5X3R2X21vZGVfcHJvcGVydHkpCisJCXJldHVybiAtRUlO VkFMOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIFZDNF9WRUNfVFZfTU9ERV9OVFNDOgorCQlz dGF0ZS0+dHYubW9kZSA9IERSTV9NT0RFX1RWX01PREVfTlRTQzsKKwkJYnJlYWs7CisKKwljYXNl IFZDNF9WRUNfVFZfTU9ERV9OVFNDX0o6CisJCXN0YXRlLT50di5tb2RlID0gRFJNX01PREVfVFZf TU9ERV9OVFNDX0o7CisJCWJyZWFrOworCisJY2FzZSBWQzRfVkVDX1RWX01PREVfUEFMOgorCQlz dGF0ZS0+dHYubW9kZSA9IERSTV9NT0RFX1RWX01PREVfUEFMOworCQlicmVhazsKKworCWNhc2Ug VkM0X1ZFQ19UVl9NT0RFX1BBTF9NOgorCQlzdGF0ZS0+dHYubW9kZSA9IERSTV9NT0RFX1RWX01P REVfUEFMX007CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQog Ci0JZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50Cit2YzRfdmVjX2Nvbm5lY3Rvcl9nZXRfcHJvcGVydHkoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rv cl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHks CisJCQkgICAgICAgdWludDY0X3QgKnZhbCkKK3sKKwlzdHJ1Y3QgdmM0X3ZlYyAqdmVjID0gY29u bmVjdG9yX3RvX3ZjNF92ZWMoY29ubmVjdG9yKTsKKworCWlmIChwcm9wZXJ0eSAhPSB2ZWMtPmxl Z2FjeV90dl9tb2RlX3Byb3BlcnR5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoc3Rh dGUtPnR2Lm1vZGUpIHsKKwljYXNlIERSTV9NT0RFX1RWX01PREVfTlRTQzoKKwkJKnZhbCA9IFZD NF9WRUNfVFZfTU9ERV9OVFNDOworCQlicmVhazsKKworCWNhc2UgRFJNX01PREVfVFZfTU9ERV9O VFNDX0o6CisJCSp2YWwgPSBWQzRfVkVDX1RWX01PREVfTlRTQ19KOworCQlicmVhazsKKworCWNh c2UgRFJNX01PREVfVFZfTU9ERV9QQUw6CisJCSp2YWwgPSBWQzRfVkVDX1RWX01PREVfUEFMOwor CQlicmVhazsKKworCWNhc2UgRFJNX01PREVfVFZfTU9ERV9QQUxfTToKKwkJKnZhbCA9IFZDNF9W RUNfVFZfTU9ERV9QQUxfTTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZB TDsKKwl9CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fY29ubmVjdG9yX2Z1bmNzIHZjNF92ZWNfY29ubmVjdG9yX2Z1bmNzID0gewpAQCAtMjk3 LDE1ICszNjYsMTkgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIHZj NF92ZWNfY29ubmVjdG9yX2Z1bmNzID0gewogCS5yZXNldCA9IHZjNF92ZWNfY29ubmVjdG9yX3Jl c2V0LAogCS5hdG9taWNfZHVwbGljYXRlX3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVj dG9yX2R1cGxpY2F0ZV9zdGF0ZSwKIAkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWlj X2hlbHBlcl9jb25uZWN0b3JfZGVzdHJveV9zdGF0ZSwKKwkuYXRvbWljX2dldF9wcm9wZXJ0eSA9 IHZjNF92ZWNfY29ubmVjdG9yX2dldF9wcm9wZXJ0eSwKKwkuYXRvbWljX3NldF9wcm9wZXJ0eSA9 IHZjNF92ZWNfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgdmM0X3ZlY19jb25uZWN0b3JfaGVscGVyX2Z1 bmNzID0gewotCS5nZXRfbW9kZXMgPSB2YzRfdmVjX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCisJLmF0 b21pY19jaGVjayA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl90dl9jaGVjaywKKwkuZ2V0 X21vZGVzID0gZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfdHZfZ2V0X21vZGVzLAogfTsKIAogc3RhdGlj IGludCB2YzRfdmVjX2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVj dCB2YzRfdmVjICp2ZWMpCiB7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZ2 ZWMtPmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOwogCWludCByZXQ7CiAK IAljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gdHJ1ZTsKQEAgLTMxOCw4ICszOTEsMTcg QEAgc3RhdGljIGludCB2YzRfdmVjX2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsIHN0cnVjdCB2YzRfdmVjICp2ZWMpCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5l Y3RvciwgJnZjNF92ZWNfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CiAKIAlkcm1fb2JqZWN0X2F0 dGFjaF9wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLAotCQkJCSAgIGRldi0+bW9kZV9jb25maWcu bGVnYWN5X3R2X21vZGVfcHJvcGVydHksCi0JCQkJICAgVkM0X1ZFQ19UVl9NT0RFX05UU0MpOwor CQkJCSAgIGRldi0+bW9kZV9jb25maWcudHZfbW9kZV9wcm9wZXJ0eSwKKwkJCQkgICBEUk1fTU9E RV9UVl9NT0RFX05UU0MpOworCisJcHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkZXYs IDAsICJtb2RlIiwKKwkJCQkJbGVnYWN5X3R2X21vZGVfbmFtZXMsCisJCQkJCUFSUkFZX1NJWkUo bGVnYWN5X3R2X21vZGVfbmFtZXMpKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5PTUVNOwor CXZlYy0+bGVnYWN5X3R2X21vZGVfcHJvcGVydHkgPSBwcm9wOworCisJZHJtX29iamVjdF9hdHRh Y2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwgcHJvcCwgVkM0X1ZFQ19UVl9NT0RFX05UU0Mp OwogCiAJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsICZ2ZWMtPmVuY29k ZXIuYmFzZSk7CiAKQEAgLTM2NiwxMyArNDQ4LDE2IEBAIHN0YXRpYyB2b2lkIHZjNF92ZWNfZW5j b2Rlcl9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCXN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IgPSAmdmVjLT5jb25uZWN0b3I7CiAJc3RydWN0IGRybV9jb25uZWN0 b3Jfc3RhdGUgKmNvbm5fc3RhdGUgPQogCQlkcm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9yX3N0 YXRlKHN0YXRlLCBjb25uZWN0b3IpOwotCWNvbnN0IHN0cnVjdCB2YzRfdmVjX3R2X21vZGUgKnR2 X21vZGUgPQotCQkmdmM0X3ZlY190dl9tb2Rlc1tjb25uX3N0YXRlLT50di5sZWdhY3lfbW9kZV07 CisJY29uc3Qgc3RydWN0IHZjNF92ZWNfdHZfbW9kZSAqdHZfbW9kZTsKIAlpbnQgaWR4LCByZXQ7 CiAKIAlpZiAoIWRybV9kZXZfZW50ZXIoZHJtLCAmaWR4KSkKIAkJcmV0dXJuOwogCisJdHZfbW9k ZSA9IHZjNF92ZWNfdHZfbW9kZV9sb29rdXAoY29ubl9zdGF0ZS0+dHYubW9kZSk7CisJaWYgKCF0 dl9tb2RlKQorCQlnb3RvIGVycl9kZXZfZXhpdDsKKwogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5 bmMoJnZlYy0+cGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlEUk1fRVJST1IoIkZhaWxl ZCB0byByZXRhaW4gcG93ZXIgZG9tYWluOiAlZFxuIiwgcmV0KTsKQEAgLTQ1NCwxMiArNTM5LDEw IEBAIHN0YXRpYyBpbnQgdmM0X3ZlY19lbmNvZGVyX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIsCiAJCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpjb25uX3N0 YXRlKQogewogCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJmNydGNfc3Rh dGUtPmFkanVzdGVkX21vZGU7Ci0JY29uc3Qgc3RydWN0IHZjNF92ZWNfdHZfbW9kZSAqdmVjX21v ZGU7CisJY29uc3Qgc3RydWN0IHZjNF92ZWNfdHZfbW9kZSAqdHZfbW9kZTsKIAotCXZlY19tb2Rl ID0gJnZjNF92ZWNfdHZfbW9kZXNbY29ubl9zdGF0ZS0+dHYubGVnYWN5X21vZGVdOwotCi0JaWYg KGNvbm5fc3RhdGUtPmNydGMgJiYKLQkgICAgIWRybV9tb2RlX2VxdWFsKHZlY19tb2RlLT5tb2Rl LCAmY3J0Y19zdGF0ZS0+YWRqdXN0ZWRfbW9kZSkpCisJdHZfbW9kZSA9IHZjNF92ZWNfdHZfbW9k ZV9sb29rdXAoY29ubl9zdGF0ZS0+dHYubW9kZSwgbW9kZS0+aHRvdGFsKTsKKwlpZiAoIXR2X21v ZGUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG1vZGUtPmNydGNfaGRpc3BsYXkgJSA0KQpA QCAtNTU2LDEzICs2MzksNiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2YzRf dmVjX2R0X21hdGNoW10gPSB7CiAJeyAvKiBzZW50aW5lbCAqLyB9LAogfTsKIAotc3RhdGljIGNv bnN0IGNoYXIgKiBjb25zdCB0dl9tb2RlX25hbWVzW10gPSB7Ci0JW1ZDNF9WRUNfVFZfTU9ERV9O VFNDXSA9ICJOVFNDIiwKLQlbVkM0X1ZFQ19UVl9NT0RFX05UU0NfSl0gPSAiTlRTQy1KIiwKLQlb VkM0X1ZFQ19UVl9NT0RFX1BBTF0gPSAiUEFMIiwKLQlbVkM0X1ZFQ19UVl9NT0RFX1BBTF9NXSA9 ICJQQUwtTSIsCi19OwotCiBzdGF0aWMgaW50IHZjNF92ZWNfYmluZChzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CkBAIC01NzAsOSArNjQ2 LDExIEBAIHN0YXRpYyBpbnQgdmM0X3ZlY19iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogCXN0cnVjdCB2YzRfdmVjICp2ZWM7CiAJaW50 IHJldDsKIAotCXJldCA9IGRybV9tb2RlX2NyZWF0ZV90dl9wcm9wZXJ0aWVzX2xlZ2FjeShkcm0s Ci0JCQkJCQkgICBBUlJBWV9TSVpFKHR2X21vZGVfbmFtZXMpLAotCQkJCQkJICAgdHZfbW9kZV9u YW1lcyk7CisJcmV0ID0gZHJtX21vZGVfY3JlYXRlX3R2X3Byb3BlcnRpZXMoZHJtLAorCQkJCQkg ICAgQklUKERSTV9NT0RFX1RWX01PREVfTlRTQykgfAorCQkJCQkgICAgQklUKERSTV9NT0RFX1RW X01PREVfTlRTQ19KKSB8CisJCQkJCSAgICBCSVQoRFJNX01PREVfVFZfTU9ERV9QQUwpIHwKKwkJ CQkJICAgIEJJVChEUk1fTU9ERV9UVl9NT0RFX1BBTF9NKSk7CiAJaWYgKHJldCkKIAkJcmV0dXJu IHJldDsKIAoKLS0gCmI0IDAuMTEuMC1kZXYtOTllM2EKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cmxp bnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK