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 9099D20E3 for ; Thu, 10 Nov 2022 11:07:45 +0000 (UTC) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.nyi.internal (Postfix) with ESMTP id A9A5C58024D; Thu, 10 Nov 2022 06:07:44 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 10 Nov 2022 06:07:44 -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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=Q 1WIvJzTv/Evedu35VXikSBfrGzqE6K1+VDyId6rBRfsaxgXIARWwaER3PzSBLakv GiJIujHUdCpl8D2nO6PgRL+dvHxk2gRZv7YgyTFUrFKQLIqoxQi6NHcEiGhr0lo1 uaZnntiDp+ISj8Ce6sSbCIMvUCBQegl3NzYPRTejDG6CQ5iNcj0uXpzz0+TjXUuE 0XPlxcax2qEdcn9jPO1os0lXXaaq7JqYwWmkSazrUmpLIgoeBtPFvUdeQ6+riPdV n0DTLeYpWLkk5JzsKOr7osbK9WnZsgCcJJ/Jpwjs2oehj23bNiWzeWcCknOapPip uD7rDBarmEYrcprn6F3/A== 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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=A utY68O1VlNwWbxdsOIOcRRVAMyoW7YwOdU/zpH3cRooJpG4sTiN4Gunw+/KsJjgz ZkZDXP71o1b9gW0OBTsfnB8zHgIpUNdMHtZrcVsUkFzdNO3OyIN++g+F2/+DEIl4 QmrnmJgFOFcOZG8r1tZ6JgtuKo8m7FbXg45xX5lQu1a7AJq/E0gjhlnJjeFGup+j AfNx1x6ChxDbQHDW9EYFDVmuXqcOxd8hEE4tEYY0grf/dvpOVtJzdilfdD4cZaqq az5qEhF2r+duCY9eykhtURm8XN5F4ypJ+UpWgqOkS/3rlHnVEL2Z51b4FcZ0x6y/ 7hUBiR2/nVAjS45mEaJ4w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:07:43 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:25 +0100 Subject: [PATCH v8 13/24] drm/modes: Introduce the tv_mode property as a command-line option 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-13-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=8531; i=maxime@cerno.tech; h=from:subject:message-id; bh=M0ZXKPJ6XHY9Q8AdsR2d+2p94jc3047RTqCtvO8XAso=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1O74t7fy2wKyjq35kLAmm9m7jdWqZ+Z0xLfZNLStPOC UY5LRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACayNYuR4Vy+5PSieNsb5h/mZftv5f TxPfC3+tm03BTfN9P7i34I9TL8U8jbYTfFWqrMjsew5dipMi7pur23q29ZnH9QceBqEH89CwA= X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Our new tv mode option allows to specify the TV mode from a property. However, it can still be useful, for example to avoid any boot time artifact, to set that property directly from the kernel command line. Let's add some code to allow it, and some unit tests to exercise that code. Reviewed-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Add Noralf Reviewed-by Changes in v6: - Add a tv_mode_specified field Changes in v4: - Add Documentation of the command-line option to modedb.rst --- Documentation/fb/modedb.rst | 2 + drivers/gpu/drm/drm_modes.c | 37 ++++++++++++-- drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 67 +++++++++++++++++++++++++ include/drm/drm_connector.h | 12 +++++ 4 files changed, 115 insertions(+), 3 deletions(-) diff --git a/Documentation/fb/modedb.rst b/Documentation/fb/modedb.rst index 4d2411e32ebb..5d6361a77f3c 100644 --- a/Documentation/fb/modedb.rst +++ b/Documentation/fb/modedb.rst @@ -65,6 +65,8 @@ Valid options are:: - reflect_y (boolean): Perform an axial symmetry on the Y axis - rotate (integer): Rotate the initial framebuffer by x degrees. Valid values are 0, 90, 180 and 270. + - tv_mode: Analog TV mode. One of "NTSC", "NTSC-443", "NTSC-J", "PAL", + "PAL-M", "PAL-N", or "SECAM". - panel_orientation, one of "normal", "upside_down", "left_side_up", or "right_side_up". For KMS drivers only, this sets the "panel orientation" property on the kms connector as hint for kms users. diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index c826f9583a1d..dc037f7ceb37 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -2133,6 +2133,30 @@ static int drm_mode_parse_panel_orientation(const char *delim, return 0; } +static int drm_mode_parse_tv_mode(const char *delim, + struct drm_cmdline_mode *mode) +{ + const char *value; + int ret; + + if (*delim != '=') + return -EINVAL; + + value = delim + 1; + delim = strchr(value, ','); + if (!delim) + delim = value + strlen(value); + + ret = drm_get_tv_mode_from_name(value, delim - value); + if (ret < 0) + return ret; + + mode->tv_mode_specified = true; + mode->tv_mode = ret; + + return 0; +} + static int drm_mode_parse_cmdline_options(const char *str, bool freestanding, const struct drm_connector *connector, @@ -2202,6 +2226,9 @@ static int drm_mode_parse_cmdline_options(const char *str, } else if (!strncmp(option, "panel_orientation", delim - option)) { if (drm_mode_parse_panel_orientation(delim, mode)) return -EINVAL; + } else if (!strncmp(option, "tv_mode", delim - option)) { + if (drm_mode_parse_tv_mode(delim, mode)) + return -EINVAL; } else { return -EINVAL; } @@ -2230,20 +2257,22 @@ struct drm_named_mode { unsigned int xres; unsigned int yres; unsigned int flags; + unsigned int tv_mode; }; -#define NAMED_MODE(_name, _pclk, _x, _y, _flags) \ +#define NAMED_MODE(_name, _pclk, _x, _y, _flags, _mode) \ { \ .name = _name, \ .pixel_clock_khz = _pclk, \ .xres = _x, \ .yres = _y, \ .flags = _flags, \ + .tv_mode = _mode, \ } static const struct drm_named_mode drm_named_modes[] = { - NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE), - NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE), + NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_NTSC), + NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_PAL), }; static int drm_mode_parse_cmdline_named_mode(const char *name, @@ -2288,6 +2317,8 @@ static int drm_mode_parse_cmdline_named_mode(const char *name, cmdline_mode->xres = mode->xres; cmdline_mode->yres = mode->yres; cmdline_mode->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); + cmdline_mode->tv_mode = mode->tv_mode; + cmdline_mode->tv_mode_specified = true; cmdline_mode->specified = true; return 1; diff --git a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c index 34790e7a3760..3e711b83b823 100644 --- a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c +++ b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c @@ -927,6 +927,14 @@ static const struct drm_cmdline_invalid_test drm_cmdline_invalid_tests[] = { .name = "invalid_option", .cmdline = "720x480,test=42", }, + { + .name = "invalid_tv_option", + .cmdline = "720x480i,tv_mode=invalid", + }, + { + .name = "truncated_tv_option", + .cmdline = "720x480i,tv_mode=NTS", + }, }; static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, @@ -937,6 +945,64 @@ static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, KUNIT_ARRAY_PARAM(drm_cmdline_invalid, drm_cmdline_invalid_tests, drm_cmdline_invalid_desc); +struct drm_cmdline_tv_option_test { + const char *name; + const char *cmdline; + struct drm_display_mode *(*mode_fn)(struct drm_device *dev); + enum drm_connector_tv_mode tv_mode; +}; + +static void drm_test_cmdline_tv_options(struct kunit *test) +{ + const struct drm_cmdline_tv_option_test *params = test->param_value; + const struct drm_display_mode *expected_mode = params->mode_fn(NULL); + struct drm_cmdline_mode mode = { }; + + KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline, + &no_connector, &mode)); + KUNIT_EXPECT_TRUE(test, mode.specified); + KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay); + KUNIT_EXPECT_EQ(test, mode.yres, expected_mode->vdisplay); + KUNIT_EXPECT_EQ(test, mode.tv_mode, params->tv_mode); + + KUNIT_EXPECT_FALSE(test, mode.refresh_specified); + + KUNIT_EXPECT_FALSE(test, mode.bpp_specified); + + KUNIT_EXPECT_FALSE(test, mode.rb); + KUNIT_EXPECT_FALSE(test, mode.cvt); + KUNIT_EXPECT_EQ(test, mode.interlace, !!(expected_mode->flags & DRM_MODE_FLAG_INTERLACE)); + KUNIT_EXPECT_FALSE(test, mode.margins); + KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED); +} + +#define TV_OPT_TEST(_opt, _cmdline, _mode_fn) \ + { \ + .name = #_opt, \ + .cmdline = _cmdline, \ + .mode_fn = _mode_fn, \ + .tv_mode = DRM_MODE_TV_MODE_ ## _opt, \ + } + +static const struct drm_cmdline_tv_option_test drm_cmdline_tv_option_tests[] = { + TV_OPT_TEST(NTSC, "720x480i,tv_mode=NTSC", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_443, "720x480i,tv_mode=NTSC-443", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_J, "720x480i,tv_mode=NTSC-J", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL, "720x576i,tv_mode=PAL", drm_mode_analog_pal_576i), + TV_OPT_TEST(PAL_M, "720x480i,tv_mode=PAL-M", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL_N, "720x576i,tv_mode=PAL-N", drm_mode_analog_pal_576i), + TV_OPT_TEST(SECAM, "720x576i,tv_mode=SECAM", drm_mode_analog_pal_576i), +}; + +static void drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test *t, + char *desc) +{ + sprintf(desc, "%s", t->name); +} +KUNIT_ARRAY_PARAM(drm_cmdline_tv_option, + drm_cmdline_tv_option_tests, + drm_cmdline_tv_option_desc); + static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_force_d_only), KUNIT_CASE(drm_test_cmdline_force_D_only_dvi), @@ -977,6 +1043,7 @@ static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_freestanding_force_e_and_options), KUNIT_CASE(drm_test_cmdline_panel_orientation), KUNIT_CASE_PARAM(drm_test_cmdline_invalid, drm_cmdline_invalid_gen_params), + KUNIT_CASE_PARAM(drm_test_cmdline_tv_options, drm_cmdline_tv_option_gen_params), {} }; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index c856f4871697..ffca0a857d53 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1368,6 +1368,18 @@ struct drm_cmdline_mode { * @tv_margins: TV margins to apply to the mode. */ struct drm_connector_tv_margins tv_margins; + + /** + * @tv_mode: TV mode standard. See DRM_MODE_TV_MODE_*. + */ + enum drm_connector_tv_mode tv_mode; + + /** + * @tv_mode_specified: + * + * Did the mode have a preferred TV mode? + */ + bool tv_mode_specified; }; /** -- 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 4EB1EC43217 for ; Thu, 10 Nov 2022 11:09:29 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 553E010E6F5; Thu, 10 Nov 2022 11:07:55 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4842110E6F0; Thu, 10 Nov 2022 11:07:45 +0000 (UTC) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.nyi.internal (Postfix) with ESMTP id A9A5C58024D; Thu, 10 Nov 2022 06:07:44 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 10 Nov 2022 06:07:44 -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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=Q 1WIvJzTv/Evedu35VXikSBfrGzqE6K1+VDyId6rBRfsaxgXIARWwaER3PzSBLakv GiJIujHUdCpl8D2nO6PgRL+dvHxk2gRZv7YgyTFUrFKQLIqoxQi6NHcEiGhr0lo1 uaZnntiDp+ISj8Ce6sSbCIMvUCBQegl3NzYPRTejDG6CQ5iNcj0uXpzz0+TjXUuE 0XPlxcax2qEdcn9jPO1os0lXXaaq7JqYwWmkSazrUmpLIgoeBtPFvUdeQ6+riPdV n0DTLeYpWLkk5JzsKOr7osbK9WnZsgCcJJ/Jpwjs2oehj23bNiWzeWcCknOapPip uD7rDBarmEYrcprn6F3/A== 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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=A utY68O1VlNwWbxdsOIOcRRVAMyoW7YwOdU/zpH3cRooJpG4sTiN4Gunw+/KsJjgz ZkZDXP71o1b9gW0OBTsfnB8zHgIpUNdMHtZrcVsUkFzdNO3OyIN++g+F2/+DEIl4 QmrnmJgFOFcOZG8r1tZ6JgtuKo8m7FbXg45xX5lQu1a7AJq/E0gjhlnJjeFGup+j AfNx1x6ChxDbQHDW9EYFDVmuXqcOxd8hEE4tEYY0grf/dvpOVtJzdilfdD4cZaqq az5qEhF2r+duCY9eykhtURm8XN5F4ypJ+UpWgqOkS/3rlHnVEL2Z51b4FcZ0x6y/ 7hUBiR2/nVAjS45mEaJ4w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:07:43 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:25 +0100 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v8-13-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=8531; i=maxime@cerno.tech; h=from:subject:message-id; bh=M0ZXKPJ6XHY9Q8AdsR2d+2p94jc3047RTqCtvO8XAso=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1O74t7fy2wKyjq35kLAmm9m7jdWqZ+Z0xLfZNLStPOC UY5LRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACayNYuR4Vy+5PSieNsb5h/mZftv5f TxPfC3+tm03BTfN9P7i34I9TL8U8jbYTfFWqrMjsew5dipMi7pur23q29ZnH9QceBqEH89CwA= X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Subject: [Nouveau] [PATCH v8 13/24] drm/modes: Introduce the tv_mode property as a command-line option 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" Our new tv mode option allows to specify the TV mode from a property. However, it can still be useful, for example to avoid any boot time artifact, to set that property directly from the kernel command line. Let's add some code to allow it, and some unit tests to exercise that code. Reviewed-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Add Noralf Reviewed-by Changes in v6: - Add a tv_mode_specified field Changes in v4: - Add Documentation of the command-line option to modedb.rst --- Documentation/fb/modedb.rst | 2 + drivers/gpu/drm/drm_modes.c | 37 ++++++++++++-- drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 67 +++++++++++++++++++++++++ include/drm/drm_connector.h | 12 +++++ 4 files changed, 115 insertions(+), 3 deletions(-) diff --git a/Documentation/fb/modedb.rst b/Documentation/fb/modedb.rst index 4d2411e32ebb..5d6361a77f3c 100644 --- a/Documentation/fb/modedb.rst +++ b/Documentation/fb/modedb.rst @@ -65,6 +65,8 @@ Valid options are:: - reflect_y (boolean): Perform an axial symmetry on the Y axis - rotate (integer): Rotate the initial framebuffer by x degrees. Valid values are 0, 90, 180 and 270. + - tv_mode: Analog TV mode. One of "NTSC", "NTSC-443", "NTSC-J", "PAL", + "PAL-M", "PAL-N", or "SECAM". - panel_orientation, one of "normal", "upside_down", "left_side_up", or "right_side_up". For KMS drivers only, this sets the "panel orientation" property on the kms connector as hint for kms users. diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index c826f9583a1d..dc037f7ceb37 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -2133,6 +2133,30 @@ static int drm_mode_parse_panel_orientation(const char *delim, return 0; } +static int drm_mode_parse_tv_mode(const char *delim, + struct drm_cmdline_mode *mode) +{ + const char *value; + int ret; + + if (*delim != '=') + return -EINVAL; + + value = delim + 1; + delim = strchr(value, ','); + if (!delim) + delim = value + strlen(value); + + ret = drm_get_tv_mode_from_name(value, delim - value); + if (ret < 0) + return ret; + + mode->tv_mode_specified = true; + mode->tv_mode = ret; + + return 0; +} + static int drm_mode_parse_cmdline_options(const char *str, bool freestanding, const struct drm_connector *connector, @@ -2202,6 +2226,9 @@ static int drm_mode_parse_cmdline_options(const char *str, } else if (!strncmp(option, "panel_orientation", delim - option)) { if (drm_mode_parse_panel_orientation(delim, mode)) return -EINVAL; + } else if (!strncmp(option, "tv_mode", delim - option)) { + if (drm_mode_parse_tv_mode(delim, mode)) + return -EINVAL; } else { return -EINVAL; } @@ -2230,20 +2257,22 @@ struct drm_named_mode { unsigned int xres; unsigned int yres; unsigned int flags; + unsigned int tv_mode; }; -#define NAMED_MODE(_name, _pclk, _x, _y, _flags) \ +#define NAMED_MODE(_name, _pclk, _x, _y, _flags, _mode) \ { \ .name = _name, \ .pixel_clock_khz = _pclk, \ .xres = _x, \ .yres = _y, \ .flags = _flags, \ + .tv_mode = _mode, \ } static const struct drm_named_mode drm_named_modes[] = { - NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE), - NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE), + NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_NTSC), + NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_PAL), }; static int drm_mode_parse_cmdline_named_mode(const char *name, @@ -2288,6 +2317,8 @@ static int drm_mode_parse_cmdline_named_mode(const char *name, cmdline_mode->xres = mode->xres; cmdline_mode->yres = mode->yres; cmdline_mode->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); + cmdline_mode->tv_mode = mode->tv_mode; + cmdline_mode->tv_mode_specified = true; cmdline_mode->specified = true; return 1; diff --git a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c index 34790e7a3760..3e711b83b823 100644 --- a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c +++ b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c @@ -927,6 +927,14 @@ static const struct drm_cmdline_invalid_test drm_cmdline_invalid_tests[] = { .name = "invalid_option", .cmdline = "720x480,test=42", }, + { + .name = "invalid_tv_option", + .cmdline = "720x480i,tv_mode=invalid", + }, + { + .name = "truncated_tv_option", + .cmdline = "720x480i,tv_mode=NTS", + }, }; static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, @@ -937,6 +945,64 @@ static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, KUNIT_ARRAY_PARAM(drm_cmdline_invalid, drm_cmdline_invalid_tests, drm_cmdline_invalid_desc); +struct drm_cmdline_tv_option_test { + const char *name; + const char *cmdline; + struct drm_display_mode *(*mode_fn)(struct drm_device *dev); + enum drm_connector_tv_mode tv_mode; +}; + +static void drm_test_cmdline_tv_options(struct kunit *test) +{ + const struct drm_cmdline_tv_option_test *params = test->param_value; + const struct drm_display_mode *expected_mode = params->mode_fn(NULL); + struct drm_cmdline_mode mode = { }; + + KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline, + &no_connector, &mode)); + KUNIT_EXPECT_TRUE(test, mode.specified); + KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay); + KUNIT_EXPECT_EQ(test, mode.yres, expected_mode->vdisplay); + KUNIT_EXPECT_EQ(test, mode.tv_mode, params->tv_mode); + + KUNIT_EXPECT_FALSE(test, mode.refresh_specified); + + KUNIT_EXPECT_FALSE(test, mode.bpp_specified); + + KUNIT_EXPECT_FALSE(test, mode.rb); + KUNIT_EXPECT_FALSE(test, mode.cvt); + KUNIT_EXPECT_EQ(test, mode.interlace, !!(expected_mode->flags & DRM_MODE_FLAG_INTERLACE)); + KUNIT_EXPECT_FALSE(test, mode.margins); + KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED); +} + +#define TV_OPT_TEST(_opt, _cmdline, _mode_fn) \ + { \ + .name = #_opt, \ + .cmdline = _cmdline, \ + .mode_fn = _mode_fn, \ + .tv_mode = DRM_MODE_TV_MODE_ ## _opt, \ + } + +static const struct drm_cmdline_tv_option_test drm_cmdline_tv_option_tests[] = { + TV_OPT_TEST(NTSC, "720x480i,tv_mode=NTSC", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_443, "720x480i,tv_mode=NTSC-443", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_J, "720x480i,tv_mode=NTSC-J", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL, "720x576i,tv_mode=PAL", drm_mode_analog_pal_576i), + TV_OPT_TEST(PAL_M, "720x480i,tv_mode=PAL-M", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL_N, "720x576i,tv_mode=PAL-N", drm_mode_analog_pal_576i), + TV_OPT_TEST(SECAM, "720x576i,tv_mode=SECAM", drm_mode_analog_pal_576i), +}; + +static void drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test *t, + char *desc) +{ + sprintf(desc, "%s", t->name); +} +KUNIT_ARRAY_PARAM(drm_cmdline_tv_option, + drm_cmdline_tv_option_tests, + drm_cmdline_tv_option_desc); + static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_force_d_only), KUNIT_CASE(drm_test_cmdline_force_D_only_dvi), @@ -977,6 +1043,7 @@ static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_freestanding_force_e_and_options), KUNIT_CASE(drm_test_cmdline_panel_orientation), KUNIT_CASE_PARAM(drm_test_cmdline_invalid, drm_cmdline_invalid_gen_params), + KUNIT_CASE_PARAM(drm_test_cmdline_tv_options, drm_cmdline_tv_option_gen_params), {} }; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index c856f4871697..ffca0a857d53 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1368,6 +1368,18 @@ struct drm_cmdline_mode { * @tv_margins: TV margins to apply to the mode. */ struct drm_connector_tv_margins tv_margins; + + /** + * @tv_mode: TV mode standard. See DRM_MODE_TV_MODE_*. + */ + enum drm_connector_tv_mode tv_mode; + + /** + * @tv_mode_specified: + * + * Did the mode have a preferred TV mode? + */ + bool tv_mode_specified; }; /** -- 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 24CA0C4332F for ; Thu, 10 Nov 2022 11:09:59 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 30BC210E70C; Thu, 10 Nov 2022 11:08:10 +0000 (UTC) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4842110E6F0; Thu, 10 Nov 2022 11:07:45 +0000 (UTC) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.nyi.internal (Postfix) with ESMTP id A9A5C58024D; Thu, 10 Nov 2022 06:07:44 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 10 Nov 2022 06:07:44 -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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=Q 1WIvJzTv/Evedu35VXikSBfrGzqE6K1+VDyId6rBRfsaxgXIARWwaER3PzSBLakv GiJIujHUdCpl8D2nO6PgRL+dvHxk2gRZv7YgyTFUrFKQLIqoxQi6NHcEiGhr0lo1 uaZnntiDp+ISj8Ce6sSbCIMvUCBQegl3NzYPRTejDG6CQ5iNcj0uXpzz0+TjXUuE 0XPlxcax2qEdcn9jPO1os0lXXaaq7JqYwWmkSazrUmpLIgoeBtPFvUdeQ6+riPdV n0DTLeYpWLkk5JzsKOr7osbK9WnZsgCcJJ/Jpwjs2oehj23bNiWzeWcCknOapPip uD7rDBarmEYrcprn6F3/A== 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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=A utY68O1VlNwWbxdsOIOcRRVAMyoW7YwOdU/zpH3cRooJpG4sTiN4Gunw+/KsJjgz ZkZDXP71o1b9gW0OBTsfnB8zHgIpUNdMHtZrcVsUkFzdNO3OyIN++g+F2/+DEIl4 QmrnmJgFOFcOZG8r1tZ6JgtuKo8m7FbXg45xX5lQu1a7AJq/E0gjhlnJjeFGup+j AfNx1x6ChxDbQHDW9EYFDVmuXqcOxd8hEE4tEYY0grf/dvpOVtJzdilfdD4cZaqq az5qEhF2r+duCY9eykhtURm8XN5F4ypJ+UpWgqOkS/3rlHnVEL2Z51b4FcZ0x6y/ 7hUBiR2/nVAjS45mEaJ4w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:07:43 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:25 +0100 Subject: [PATCH v8 13/24] drm/modes: Introduce the tv_mode property as a command-line option MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v8-13-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=8531; i=maxime@cerno.tech; h=from:subject:message-id; bh=M0ZXKPJ6XHY9Q8AdsR2d+2p94jc3047RTqCtvO8XAso=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1O74t7fy2wKyjq35kLAmm9m7jdWqZ+Z0xLfZNLStPOC UY5LRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACayNYuR4Vy+5PSieNsb5h/mZftv5f TxPfC3+tm03BTfN9P7i34I9TL8U8jbYTfFWqrMjsew5dipMi7pur23q29ZnH9QceBqEH89CwA= 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" Our new tv mode option allows to specify the TV mode from a property. However, it can still be useful, for example to avoid any boot time artifact, to set that property directly from the kernel command line. Let's add some code to allow it, and some unit tests to exercise that code. Reviewed-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Add Noralf Reviewed-by Changes in v6: - Add a tv_mode_specified field Changes in v4: - Add Documentation of the command-line option to modedb.rst --- Documentation/fb/modedb.rst | 2 + drivers/gpu/drm/drm_modes.c | 37 ++++++++++++-- drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 67 +++++++++++++++++++++++++ include/drm/drm_connector.h | 12 +++++ 4 files changed, 115 insertions(+), 3 deletions(-) diff --git a/Documentation/fb/modedb.rst b/Documentation/fb/modedb.rst index 4d2411e32ebb..5d6361a77f3c 100644 --- a/Documentation/fb/modedb.rst +++ b/Documentation/fb/modedb.rst @@ -65,6 +65,8 @@ Valid options are:: - reflect_y (boolean): Perform an axial symmetry on the Y axis - rotate (integer): Rotate the initial framebuffer by x degrees. Valid values are 0, 90, 180 and 270. + - tv_mode: Analog TV mode. One of "NTSC", "NTSC-443", "NTSC-J", "PAL", + "PAL-M", "PAL-N", or "SECAM". - panel_orientation, one of "normal", "upside_down", "left_side_up", or "right_side_up". For KMS drivers only, this sets the "panel orientation" property on the kms connector as hint for kms users. diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index c826f9583a1d..dc037f7ceb37 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -2133,6 +2133,30 @@ static int drm_mode_parse_panel_orientation(const char *delim, return 0; } +static int drm_mode_parse_tv_mode(const char *delim, + struct drm_cmdline_mode *mode) +{ + const char *value; + int ret; + + if (*delim != '=') + return -EINVAL; + + value = delim + 1; + delim = strchr(value, ','); + if (!delim) + delim = value + strlen(value); + + ret = drm_get_tv_mode_from_name(value, delim - value); + if (ret < 0) + return ret; + + mode->tv_mode_specified = true; + mode->tv_mode = ret; + + return 0; +} + static int drm_mode_parse_cmdline_options(const char *str, bool freestanding, const struct drm_connector *connector, @@ -2202,6 +2226,9 @@ static int drm_mode_parse_cmdline_options(const char *str, } else if (!strncmp(option, "panel_orientation", delim - option)) { if (drm_mode_parse_panel_orientation(delim, mode)) return -EINVAL; + } else if (!strncmp(option, "tv_mode", delim - option)) { + if (drm_mode_parse_tv_mode(delim, mode)) + return -EINVAL; } else { return -EINVAL; } @@ -2230,20 +2257,22 @@ struct drm_named_mode { unsigned int xres; unsigned int yres; unsigned int flags; + unsigned int tv_mode; }; -#define NAMED_MODE(_name, _pclk, _x, _y, _flags) \ +#define NAMED_MODE(_name, _pclk, _x, _y, _flags, _mode) \ { \ .name = _name, \ .pixel_clock_khz = _pclk, \ .xres = _x, \ .yres = _y, \ .flags = _flags, \ + .tv_mode = _mode, \ } static const struct drm_named_mode drm_named_modes[] = { - NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE), - NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE), + NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_NTSC), + NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_PAL), }; static int drm_mode_parse_cmdline_named_mode(const char *name, @@ -2288,6 +2317,8 @@ static int drm_mode_parse_cmdline_named_mode(const char *name, cmdline_mode->xres = mode->xres; cmdline_mode->yres = mode->yres; cmdline_mode->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); + cmdline_mode->tv_mode = mode->tv_mode; + cmdline_mode->tv_mode_specified = true; cmdline_mode->specified = true; return 1; diff --git a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c index 34790e7a3760..3e711b83b823 100644 --- a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c +++ b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c @@ -927,6 +927,14 @@ static const struct drm_cmdline_invalid_test drm_cmdline_invalid_tests[] = { .name = "invalid_option", .cmdline = "720x480,test=42", }, + { + .name = "invalid_tv_option", + .cmdline = "720x480i,tv_mode=invalid", + }, + { + .name = "truncated_tv_option", + .cmdline = "720x480i,tv_mode=NTS", + }, }; static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, @@ -937,6 +945,64 @@ static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, KUNIT_ARRAY_PARAM(drm_cmdline_invalid, drm_cmdline_invalid_tests, drm_cmdline_invalid_desc); +struct drm_cmdline_tv_option_test { + const char *name; + const char *cmdline; + struct drm_display_mode *(*mode_fn)(struct drm_device *dev); + enum drm_connector_tv_mode tv_mode; +}; + +static void drm_test_cmdline_tv_options(struct kunit *test) +{ + const struct drm_cmdline_tv_option_test *params = test->param_value; + const struct drm_display_mode *expected_mode = params->mode_fn(NULL); + struct drm_cmdline_mode mode = { }; + + KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline, + &no_connector, &mode)); + KUNIT_EXPECT_TRUE(test, mode.specified); + KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay); + KUNIT_EXPECT_EQ(test, mode.yres, expected_mode->vdisplay); + KUNIT_EXPECT_EQ(test, mode.tv_mode, params->tv_mode); + + KUNIT_EXPECT_FALSE(test, mode.refresh_specified); + + KUNIT_EXPECT_FALSE(test, mode.bpp_specified); + + KUNIT_EXPECT_FALSE(test, mode.rb); + KUNIT_EXPECT_FALSE(test, mode.cvt); + KUNIT_EXPECT_EQ(test, mode.interlace, !!(expected_mode->flags & DRM_MODE_FLAG_INTERLACE)); + KUNIT_EXPECT_FALSE(test, mode.margins); + KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED); +} + +#define TV_OPT_TEST(_opt, _cmdline, _mode_fn) \ + { \ + .name = #_opt, \ + .cmdline = _cmdline, \ + .mode_fn = _mode_fn, \ + .tv_mode = DRM_MODE_TV_MODE_ ## _opt, \ + } + +static const struct drm_cmdline_tv_option_test drm_cmdline_tv_option_tests[] = { + TV_OPT_TEST(NTSC, "720x480i,tv_mode=NTSC", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_443, "720x480i,tv_mode=NTSC-443", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_J, "720x480i,tv_mode=NTSC-J", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL, "720x576i,tv_mode=PAL", drm_mode_analog_pal_576i), + TV_OPT_TEST(PAL_M, "720x480i,tv_mode=PAL-M", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL_N, "720x576i,tv_mode=PAL-N", drm_mode_analog_pal_576i), + TV_OPT_TEST(SECAM, "720x576i,tv_mode=SECAM", drm_mode_analog_pal_576i), +}; + +static void drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test *t, + char *desc) +{ + sprintf(desc, "%s", t->name); +} +KUNIT_ARRAY_PARAM(drm_cmdline_tv_option, + drm_cmdline_tv_option_tests, + drm_cmdline_tv_option_desc); + static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_force_d_only), KUNIT_CASE(drm_test_cmdline_force_D_only_dvi), @@ -977,6 +1043,7 @@ static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_freestanding_force_e_and_options), KUNIT_CASE(drm_test_cmdline_panel_orientation), KUNIT_CASE_PARAM(drm_test_cmdline_invalid, drm_cmdline_invalid_gen_params), + KUNIT_CASE_PARAM(drm_test_cmdline_tv_options, drm_cmdline_tv_option_gen_params), {} }; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index c856f4871697..ffca0a857d53 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1368,6 +1368,18 @@ struct drm_cmdline_mode { * @tv_margins: TV margins to apply to the mode. */ struct drm_connector_tv_margins tv_margins; + + /** + * @tv_mode: TV mode standard. See DRM_MODE_TV_MODE_*. + */ + enum drm_connector_tv_mode tv_mode; + + /** + * @tv_mode_specified: + * + * Did the mode have a preferred TV mode? + */ + bool tv_mode_specified; }; /** -- 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 F04F9C433FE for ; Thu, 10 Nov 2022 11:10:36 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 134F110E720; 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 4842110E6F0; Thu, 10 Nov 2022 11:07:45 +0000 (UTC) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.nyi.internal (Postfix) with ESMTP id A9A5C58024D; Thu, 10 Nov 2022 06:07:44 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 10 Nov 2022 06:07:44 -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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=Q 1WIvJzTv/Evedu35VXikSBfrGzqE6K1+VDyId6rBRfsaxgXIARWwaER3PzSBLakv GiJIujHUdCpl8D2nO6PgRL+dvHxk2gRZv7YgyTFUrFKQLIqoxQi6NHcEiGhr0lo1 uaZnntiDp+ISj8Ce6sSbCIMvUCBQegl3NzYPRTejDG6CQ5iNcj0uXpzz0+TjXUuE 0XPlxcax2qEdcn9jPO1os0lXXaaq7JqYwWmkSazrUmpLIgoeBtPFvUdeQ6+riPdV n0DTLeYpWLkk5JzsKOr7osbK9WnZsgCcJJ/Jpwjs2oehj23bNiWzeWcCknOapPip uD7rDBarmEYrcprn6F3/A== 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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=A utY68O1VlNwWbxdsOIOcRRVAMyoW7YwOdU/zpH3cRooJpG4sTiN4Gunw+/KsJjgz ZkZDXP71o1b9gW0OBTsfnB8zHgIpUNdMHtZrcVsUkFzdNO3OyIN++g+F2/+DEIl4 QmrnmJgFOFcOZG8r1tZ6JgtuKo8m7FbXg45xX5lQu1a7AJq/E0gjhlnJjeFGup+j AfNx1x6ChxDbQHDW9EYFDVmuXqcOxd8hEE4tEYY0grf/dvpOVtJzdilfdD4cZaqq az5qEhF2r+duCY9eykhtURm8XN5F4ypJ+UpWgqOkS/3rlHnVEL2Z51b4FcZ0x6y/ 7hUBiR2/nVAjS45mEaJ4w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:07:43 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:25 +0100 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: <20220728-rpi-analog-tv-properties-v8-13-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=8531; i=maxime@cerno.tech; h=from:subject:message-id; bh=M0ZXKPJ6XHY9Q8AdsR2d+2p94jc3047RTqCtvO8XAso=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1O74t7fy2wKyjq35kLAmm9m7jdWqZ+Z0xLfZNLStPOC UY5LRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACayNYuR4Vy+5PSieNsb5h/mZftv5f TxPfC3+tm03BTfN9P7i34I9TL8U8jbYTfFWqrMjsew5dipMi7pur23q29ZnH9QceBqEH89CwA= X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Subject: [Intel-gfx] [PATCH v8 13/24] drm/modes: Introduce the tv_mode property as a command-line option 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" Our new tv mode option allows to specify the TV mode from a property. However, it can still be useful, for example to avoid any boot time artifact, to set that property directly from the kernel command line. Let's add some code to allow it, and some unit tests to exercise that code. Reviewed-by: Noralf Trønnes Tested-by: Mateusz Kwiatkowski Signed-off-by: Maxime Ripard --- Changes in v7: - Add Noralf Reviewed-by Changes in v6: - Add a tv_mode_specified field Changes in v4: - Add Documentation of the command-line option to modedb.rst --- Documentation/fb/modedb.rst | 2 + drivers/gpu/drm/drm_modes.c | 37 ++++++++++++-- drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 67 +++++++++++++++++++++++++ include/drm/drm_connector.h | 12 +++++ 4 files changed, 115 insertions(+), 3 deletions(-) diff --git a/Documentation/fb/modedb.rst b/Documentation/fb/modedb.rst index 4d2411e32ebb..5d6361a77f3c 100644 --- a/Documentation/fb/modedb.rst +++ b/Documentation/fb/modedb.rst @@ -65,6 +65,8 @@ Valid options are:: - reflect_y (boolean): Perform an axial symmetry on the Y axis - rotate (integer): Rotate the initial framebuffer by x degrees. Valid values are 0, 90, 180 and 270. + - tv_mode: Analog TV mode. One of "NTSC", "NTSC-443", "NTSC-J", "PAL", + "PAL-M", "PAL-N", or "SECAM". - panel_orientation, one of "normal", "upside_down", "left_side_up", or "right_side_up". For KMS drivers only, this sets the "panel orientation" property on the kms connector as hint for kms users. diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index c826f9583a1d..dc037f7ceb37 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -2133,6 +2133,30 @@ static int drm_mode_parse_panel_orientation(const char *delim, return 0; } +static int drm_mode_parse_tv_mode(const char *delim, + struct drm_cmdline_mode *mode) +{ + const char *value; + int ret; + + if (*delim != '=') + return -EINVAL; + + value = delim + 1; + delim = strchr(value, ','); + if (!delim) + delim = value + strlen(value); + + ret = drm_get_tv_mode_from_name(value, delim - value); + if (ret < 0) + return ret; + + mode->tv_mode_specified = true; + mode->tv_mode = ret; + + return 0; +} + static int drm_mode_parse_cmdline_options(const char *str, bool freestanding, const struct drm_connector *connector, @@ -2202,6 +2226,9 @@ static int drm_mode_parse_cmdline_options(const char *str, } else if (!strncmp(option, "panel_orientation", delim - option)) { if (drm_mode_parse_panel_orientation(delim, mode)) return -EINVAL; + } else if (!strncmp(option, "tv_mode", delim - option)) { + if (drm_mode_parse_tv_mode(delim, mode)) + return -EINVAL; } else { return -EINVAL; } @@ -2230,20 +2257,22 @@ struct drm_named_mode { unsigned int xres; unsigned int yres; unsigned int flags; + unsigned int tv_mode; }; -#define NAMED_MODE(_name, _pclk, _x, _y, _flags) \ +#define NAMED_MODE(_name, _pclk, _x, _y, _flags, _mode) \ { \ .name = _name, \ .pixel_clock_khz = _pclk, \ .xres = _x, \ .yres = _y, \ .flags = _flags, \ + .tv_mode = _mode, \ } static const struct drm_named_mode drm_named_modes[] = { - NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE), - NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE), + NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_NTSC), + NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE, DRM_MODE_TV_MODE_PAL), }; static int drm_mode_parse_cmdline_named_mode(const char *name, @@ -2288,6 +2317,8 @@ static int drm_mode_parse_cmdline_named_mode(const char *name, cmdline_mode->xres = mode->xres; cmdline_mode->yres = mode->yres; cmdline_mode->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); + cmdline_mode->tv_mode = mode->tv_mode; + cmdline_mode->tv_mode_specified = true; cmdline_mode->specified = true; return 1; diff --git a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c index 34790e7a3760..3e711b83b823 100644 --- a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c +++ b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c @@ -927,6 +927,14 @@ static const struct drm_cmdline_invalid_test drm_cmdline_invalid_tests[] = { .name = "invalid_option", .cmdline = "720x480,test=42", }, + { + .name = "invalid_tv_option", + .cmdline = "720x480i,tv_mode=invalid", + }, + { + .name = "truncated_tv_option", + .cmdline = "720x480i,tv_mode=NTS", + }, }; static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, @@ -937,6 +945,64 @@ static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t, KUNIT_ARRAY_PARAM(drm_cmdline_invalid, drm_cmdline_invalid_tests, drm_cmdline_invalid_desc); +struct drm_cmdline_tv_option_test { + const char *name; + const char *cmdline; + struct drm_display_mode *(*mode_fn)(struct drm_device *dev); + enum drm_connector_tv_mode tv_mode; +}; + +static void drm_test_cmdline_tv_options(struct kunit *test) +{ + const struct drm_cmdline_tv_option_test *params = test->param_value; + const struct drm_display_mode *expected_mode = params->mode_fn(NULL); + struct drm_cmdline_mode mode = { }; + + KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline, + &no_connector, &mode)); + KUNIT_EXPECT_TRUE(test, mode.specified); + KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay); + KUNIT_EXPECT_EQ(test, mode.yres, expected_mode->vdisplay); + KUNIT_EXPECT_EQ(test, mode.tv_mode, params->tv_mode); + + KUNIT_EXPECT_FALSE(test, mode.refresh_specified); + + KUNIT_EXPECT_FALSE(test, mode.bpp_specified); + + KUNIT_EXPECT_FALSE(test, mode.rb); + KUNIT_EXPECT_FALSE(test, mode.cvt); + KUNIT_EXPECT_EQ(test, mode.interlace, !!(expected_mode->flags & DRM_MODE_FLAG_INTERLACE)); + KUNIT_EXPECT_FALSE(test, mode.margins); + KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED); +} + +#define TV_OPT_TEST(_opt, _cmdline, _mode_fn) \ + { \ + .name = #_opt, \ + .cmdline = _cmdline, \ + .mode_fn = _mode_fn, \ + .tv_mode = DRM_MODE_TV_MODE_ ## _opt, \ + } + +static const struct drm_cmdline_tv_option_test drm_cmdline_tv_option_tests[] = { + TV_OPT_TEST(NTSC, "720x480i,tv_mode=NTSC", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_443, "720x480i,tv_mode=NTSC-443", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(NTSC_J, "720x480i,tv_mode=NTSC-J", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL, "720x576i,tv_mode=PAL", drm_mode_analog_pal_576i), + TV_OPT_TEST(PAL_M, "720x480i,tv_mode=PAL-M", drm_mode_analog_ntsc_480i), + TV_OPT_TEST(PAL_N, "720x576i,tv_mode=PAL-N", drm_mode_analog_pal_576i), + TV_OPT_TEST(SECAM, "720x576i,tv_mode=SECAM", drm_mode_analog_pal_576i), +}; + +static void drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test *t, + char *desc) +{ + sprintf(desc, "%s", t->name); +} +KUNIT_ARRAY_PARAM(drm_cmdline_tv_option, + drm_cmdline_tv_option_tests, + drm_cmdline_tv_option_desc); + static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_force_d_only), KUNIT_CASE(drm_test_cmdline_force_D_only_dvi), @@ -977,6 +1043,7 @@ static struct kunit_case drm_cmdline_parser_tests[] = { KUNIT_CASE(drm_test_cmdline_freestanding_force_e_and_options), KUNIT_CASE(drm_test_cmdline_panel_orientation), KUNIT_CASE_PARAM(drm_test_cmdline_invalid, drm_cmdline_invalid_gen_params), + KUNIT_CASE_PARAM(drm_test_cmdline_tv_options, drm_cmdline_tv_option_gen_params), {} }; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index c856f4871697..ffca0a857d53 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1368,6 +1368,18 @@ struct drm_cmdline_mode { * @tv_margins: TV margins to apply to the mode. */ struct drm_connector_tv_margins tv_margins; + + /** + * @tv_mode: TV mode standard. See DRM_MODE_TV_MODE_*. + */ + enum drm_connector_tv_mode tv_mode; + + /** + * @tv_mode_specified: + * + * Did the mode have a preferred TV mode? + */ + bool tv_mode_specified; }; /** -- 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 17084C433FE for ; Thu, 10 Nov 2022 11:15: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: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=FtmCDWbgiqqm1KG6j9A3eVjkj97ybecTB5fgXk6GQtU=; b=Kn6HLif/2z2bJZ 7t7dHmVRLI6/yY5DixJY3ueNuzF/Y50ei2cjXLsaYx6zajSQ2vCK2XnWEaGsTKVddcVUX7Qu8o3qA am+qWD0SN2zhExwhoXIQgwIlTUGCAHX0TzlJwvQigGzWT9Uj0KjPbSAQBiZuWMPYUiABb2Qx3PwdM RG7JmhrQ5kmOBjLCYEv0eUdnOnArte/FHjlsXWco0kfXnqYO7idULcjF+VBS00iDiCcpMBirQarqb hq/+K5sdbWWRelMWzsRzWdRU7JAM00TYFM9AuAbVLAKaf3fDiqqMxSsFbdJcIf5P+magZ2GnKuQOi pDYbAOarqLyFC+fHjjBQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ot5Vt-005Gya-2q; Thu, 10 Nov 2022 11:14:29 +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 1ot5PN-005Dol-8z for linux-arm-kernel@lists.infradead.org; Thu, 10 Nov 2022 11:07:47 +0000 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.nyi.internal (Postfix) with ESMTP id A9A5C58024D; Thu, 10 Nov 2022 06:07:44 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 10 Nov 2022 06:07:44 -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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=Q 1WIvJzTv/Evedu35VXikSBfrGzqE6K1+VDyId6rBRfsaxgXIARWwaER3PzSBLakv GiJIujHUdCpl8D2nO6PgRL+dvHxk2gRZv7YgyTFUrFKQLIqoxQi6NHcEiGhr0lo1 uaZnntiDp+ISj8Ce6sSbCIMvUCBQegl3NzYPRTejDG6CQ5iNcj0uXpzz0+TjXUuE 0XPlxcax2qEdcn9jPO1os0lXXaaq7JqYwWmkSazrUmpLIgoeBtPFvUdeQ6+riPdV n0DTLeYpWLkk5JzsKOr7osbK9WnZsgCcJJ/Jpwjs2oehj23bNiWzeWcCknOapPip uD7rDBarmEYrcprn6F3/A== 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=1668078464; x= 1668085664; bh=Y8fQ4DfNHNohSdEY/sHG7S1znmk0NILKdDDp29dklqU=; b=A utY68O1VlNwWbxdsOIOcRRVAMyoW7YwOdU/zpH3cRooJpG4sTiN4Gunw+/KsJjgz ZkZDXP71o1b9gW0OBTsfnB8zHgIpUNdMHtZrcVsUkFzdNO3OyIN++g+F2/+DEIl4 QmrnmJgFOFcOZG8r1tZ6JgtuKo8m7FbXg45xX5lQu1a7AJq/E0gjhlnJjeFGup+j AfNx1x6ChxDbQHDW9EYFDVmuXqcOxd8hEE4tEYY0grf/dvpOVtJzdilfdD4cZaqq az5qEhF2r+duCY9eykhtURm8XN5F4ypJ+UpWgqOkS/3rlHnVEL2Z51b4FcZ0x6y/ 7hUBiR2/nVAjS45mEaJ4w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeeggddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhfffuggfgtgfkfhgjvfevofesthekredtredtjeenucfhrhhomhepofgrgihi mhgvucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrg htthgvrhhnpedvgfevjefhtdetveevhfelieeuueetgfdvgeevkeegudejffegfffgtedt leelhfenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 10 Nov 2022 06:07:43 -0500 (EST) From: Maxime Ripard Date: Thu, 10 Nov 2022 12:07:25 +0100 Subject: [PATCH v8 13/24] drm/modes: Introduce the tv_mode property as a command-line option MIME-Version: 1.0 Message-Id: <20220728-rpi-analog-tv-properties-v8-13-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=8531; i=maxime@cerno.tech; h=from:subject:message-id; bh=M0ZXKPJ6XHY9Q8AdsR2d+2p94jc3047RTqCtvO8XAso=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMk5t1O74t7fy2wKyjq35kLAmm9m7jdWqZ+Z0xLfZNLStPOC UY5LRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACayNYuR4Vy+5PSieNsb5h/mZftv5f TxPfC3+tm03BTfN9P7i34I9TL8U8jbYTfFWqrMjsew5dipMi7pur23q29ZnH9QceBqEH89CwA= 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_030745_491541_413B4DB7 X-CRM114-Status: GOOD ( 20.31 ) 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 T3VyIG5ldyB0diBtb2RlIG9wdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgVFYgbW9kZSBmcm9t IGEgcHJvcGVydHkuCkhvd2V2ZXIsIGl0IGNhbiBzdGlsbCBiZSB1c2VmdWwsIGZvciBleGFtcGxl IHRvIGF2b2lkIGFueSBib290IHRpbWUKYXJ0aWZhY3QsIHRvIHNldCB0aGF0IHByb3BlcnR5IGRp cmVjdGx5IGZyb20gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCgpMZXQncyBhZGQgc29tZSBjb2Rl IHRvIGFsbG93IGl0LCBhbmQgc29tZSB1bml0IHRlc3RzIHRvIGV4ZXJjaXNlIHRoYXQgY29kZS4K ClJldmlld2VkLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KVGVzdGVk LWJ5OiBNYXRldXN6IEt3aWF0a293c2tpIDxrZnlhdGVrK3B1YmxpY2dpdEBnbWFpbC5jb20+ClNp Z25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1heGltZUBjZXJuby50ZWNoPgoKLS0tCkNoYW5n ZXMgaW4gdjc6Ci0gQWRkIE5vcmFsZiBSZXZpZXdlZC1ieQoKQ2hhbmdlcyBpbiB2NjoKLSBBZGQg YSB0dl9tb2RlX3NwZWNpZmllZCBmaWVsZAoKQ2hhbmdlcyBpbiB2NDoKLSBBZGQgRG9jdW1lbnRh dGlvbiBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbiB0byBtb2RlZGIucnN0Ci0tLQogRG9jdW1l bnRhdGlvbi9mYi9tb2RlZGIucnN0ICAgICAgICAgICAgICAgICAgICAgfCAgMiArCiBkcml2ZXJz L2dwdS9kcm0vZHJtX21vZGVzLmMgICAgICAgICAgICAgICAgICAgICB8IDM3ICsrKysrKysrKysr Ky0tCiBkcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2NtZGxpbmVfcGFyc2VyX3Rlc3QuYyB8IDY3 ICsrKysrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvZHJtL2RybV9jb25uZWN0b3IuaCAg ICAgICAgICAgICAgICAgICAgIHwgMTIgKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMTE1IGluc2Vy dGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9t b2RlZGIucnN0IGIvRG9jdW1lbnRhdGlvbi9mYi9tb2RlZGIucnN0CmluZGV4IDRkMjQxMWUzMmVi Yi4uNWQ2MzYxYTc3ZjNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZiL21vZGVkYi5yc3QK KysrIGIvRG9jdW1lbnRhdGlvbi9mYi9tb2RlZGIucnN0CkBAIC02NSw2ICs2NSw4IEBAIFZhbGlk IG9wdGlvbnMgYXJlOjoKICAgLSByZWZsZWN0X3kgKGJvb2xlYW4pOiBQZXJmb3JtIGFuIGF4aWFs IHN5bW1ldHJ5IG9uIHRoZSBZIGF4aXMKICAgLSByb3RhdGUgKGludGVnZXIpOiBSb3RhdGUgdGhl IGluaXRpYWwgZnJhbWVidWZmZXIgYnkgeAogICAgIGRlZ3JlZXMuIFZhbGlkIHZhbHVlcyBhcmUg MCwgOTAsIDE4MCBhbmQgMjcwLgorICAtIHR2X21vZGU6IEFuYWxvZyBUViBtb2RlLiBPbmUgb2Yg Ik5UU0MiLCAiTlRTQy00NDMiLCAiTlRTQy1KIiwgIlBBTCIsCisgICAgIlBBTC1NIiwgIlBBTC1O Iiwgb3IgIlNFQ0FNIi4KICAgLSBwYW5lbF9vcmllbnRhdGlvbiwgb25lIG9mICJub3JtYWwiLCAi dXBzaWRlX2Rvd24iLCAibGVmdF9zaWRlX3VwIiwgb3IKICAgICAicmlnaHRfc2lkZV91cCIuIEZv ciBLTVMgZHJpdmVycyBvbmx5LCB0aGlzIHNldHMgdGhlICJwYW5lbCBvcmllbnRhdGlvbiIKICAg ICBwcm9wZXJ0eSBvbiB0aGUga21zIGNvbm5lY3RvciBhcyBoaW50IGZvciBrbXMgdXNlcnMuCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMgYi9kcml2ZXJzL2dwdS9kcm0v ZHJtX21vZGVzLmMKaW5kZXggYzgyNmY5NTgzYTFkLi5kYzAzN2Y3Y2ViMzcgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21v ZGVzLmMKQEAgLTIxMzMsNiArMjEzMywzMCBAQCBzdGF0aWMgaW50IGRybV9tb2RlX3BhcnNlX3Bh bmVsX29yaWVudGF0aW9uKGNvbnN0IGNoYXIgKmRlbGltLAogCXJldHVybiAwOwogfQogCitzdGF0 aWMgaW50IGRybV9tb2RlX3BhcnNlX3R2X21vZGUoY29uc3QgY2hhciAqZGVsaW0sCisJCQkJICBz dHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSAqbW9kZSkKK3sKKwljb25zdCBjaGFyICp2YWx1ZTsKKwlp bnQgcmV0OworCisJaWYgKCpkZWxpbSAhPSAnPScpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFs dWUgPSBkZWxpbSArIDE7CisJZGVsaW0gPSBzdHJjaHIodmFsdWUsICcsJyk7CisJaWYgKCFkZWxp bSkKKwkJZGVsaW0gPSB2YWx1ZSArIHN0cmxlbih2YWx1ZSk7CisKKwlyZXQgPSBkcm1fZ2V0X3R2 X21vZGVfZnJvbV9uYW1lKHZhbHVlLCBkZWxpbSAtIHZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJ cmV0dXJuIHJldDsKKworCW1vZGUtPnR2X21vZGVfc3BlY2lmaWVkID0gdHJ1ZTsKKwltb2RlLT50 dl9tb2RlID0gcmV0OworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHJtX21vZGVfcGFy c2VfY21kbGluZV9vcHRpb25zKGNvbnN0IGNoYXIgKnN0ciwKIAkJCQkJICBib29sIGZyZWVzdGFu ZGluZywKIAkJCQkJICBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLApAQCAt MjIwMiw2ICsyMjI2LDkgQEAgc3RhdGljIGludCBkcm1fbW9kZV9wYXJzZV9jbWRsaW5lX29wdGlv bnMoY29uc3QgY2hhciAqc3RyLAogCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdGlvbiwgInBhbmVs X29yaWVudGF0aW9uIiwgZGVsaW0gLSBvcHRpb24pKSB7CiAJCQlpZiAoZHJtX21vZGVfcGFyc2Vf cGFuZWxfb3JpZW50YXRpb24oZGVsaW0sIG1vZGUpKQogCQkJCXJldHVybiAtRUlOVkFMOworCQl9 IGVsc2UgaWYgKCFzdHJuY21wKG9wdGlvbiwgInR2X21vZGUiLCBkZWxpbSAtIG9wdGlvbikpIHsK KwkJCWlmIChkcm1fbW9kZV9wYXJzZV90dl9tb2RlKGRlbGltLCBtb2RlKSkKKwkJCQlyZXR1cm4g LUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yMjMwLDIw ICsyMjU3LDIyIEBAIHN0cnVjdCBkcm1fbmFtZWRfbW9kZSB7CiAJdW5zaWduZWQgaW50IHhyZXM7 CiAJdW5zaWduZWQgaW50IHlyZXM7CiAJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGlu dCB0dl9tb2RlOwogfTsKIAotI2RlZmluZSBOQU1FRF9NT0RFKF9uYW1lLCBfcGNsaywgX3gsIF95 LCBfZmxhZ3MpCVwKKyNkZWZpbmUgTkFNRURfTU9ERShfbmFtZSwgX3BjbGssIF94LCBfeSwgX2Zs YWdzLCBfbW9kZSkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gX25hbWUsCQkJCVwKIAkJLnBpeGVs X2Nsb2NrX2toeiA9IF9wY2xrLAkJXAogCQkueHJlcyA9IF94LAkJCQlcCiAJCS55cmVzID0gX3ks CQkJCVwKIAkJLmZsYWdzID0gX2ZsYWdzLAkJCVwKKwkJLnR2X21vZGUgPSBfbW9kZSwJCQlcCiAJ fQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9uYW1lZF9tb2RlIGRybV9uYW1lZF9tb2Rlc1td ID0gewotCU5BTUVEX01PREUoIk5UU0MiLCAxMzUwMCwgNzIwLCA0ODAsIERSTV9NT0RFX0ZMQUdf SU5URVJMQUNFKSwKLQlOQU1FRF9NT0RFKCJQQUwiLCAxMzUwMCwgNzIwLCA1NzYsIERSTV9NT0RF X0ZMQUdfSU5URVJMQUNFKSwKKwlOQU1FRF9NT0RFKCJOVFNDIiwgMTM1MDAsIDcyMCwgNDgwLCBE Uk1fTU9ERV9GTEFHX0lOVEVSTEFDRSwgRFJNX01PREVfVFZfTU9ERV9OVFNDKSwKKwlOQU1FRF9N T0RFKCJQQUwiLCAxMzUwMCwgNzIwLCA1NzYsIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFLCBEUk1f TU9ERV9UVl9NT0RFX1BBTCksCiB9OwogCiBzdGF0aWMgaW50IGRybV9tb2RlX3BhcnNlX2NtZGxp bmVfbmFtZWRfbW9kZShjb25zdCBjaGFyICpuYW1lLApAQCAtMjI4OCw2ICsyMzE3LDggQEAgc3Rh dGljIGludCBkcm1fbW9kZV9wYXJzZV9jbWRsaW5lX25hbWVkX21vZGUoY29uc3QgY2hhciAqbmFt ZSwKIAkJY21kbGluZV9tb2RlLT54cmVzID0gbW9kZS0+eHJlczsKIAkJY21kbGluZV9tb2RlLT55 cmVzID0gbW9kZS0+eXJlczsKIAkJY21kbGluZV9tb2RlLT5pbnRlcmxhY2UgPSAhIShtb2RlLT5m bGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKTsKKwkJY21kbGluZV9tb2RlLT50dl9tb2Rl ID0gbW9kZS0+dHZfbW9kZTsKKwkJY21kbGluZV9tb2RlLT50dl9tb2RlX3NwZWNpZmllZCA9IHRy dWU7CiAJCWNtZGxpbmVfbW9kZS0+c3BlY2lmaWVkID0gdHJ1ZTsKIAogCQlyZXR1cm4gMTsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fY21kbGluZV9wYXJzZXJfdGVzdC5j IGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jbWRsaW5lX3BhcnNlcl90ZXN0LmMKaW5kZXgg MzQ3OTBlN2EzNzYwLi4zZTcxMWI4M2I4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90 ZXN0cy9kcm1fY21kbGluZV9wYXJzZXJfdGVzdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0 cy9kcm1fY21kbGluZV9wYXJzZXJfdGVzdC5jCkBAIC05MjcsNiArOTI3LDE0IEBAIHN0YXRpYyBj b25zdCBzdHJ1Y3QgZHJtX2NtZGxpbmVfaW52YWxpZF90ZXN0IGRybV9jbWRsaW5lX2ludmFsaWRf dGVzdHNbXSA9IHsKIAkJLm5hbWUgPSAiaW52YWxpZF9vcHRpb24iLAogCQkuY21kbGluZSA9ICI3 MjB4NDgwLHRlc3Q9NDIiLAogCX0sCisJeworCQkubmFtZSA9ICJpbnZhbGlkX3R2X29wdGlvbiIs CisJCS5jbWRsaW5lID0gIjcyMHg0ODBpLHR2X21vZGU9aW52YWxpZCIsCisJfSwKKwl7CisJCS5u YW1lID0gInRydW5jYXRlZF90dl9vcHRpb24iLAorCQkuY21kbGluZSA9ICI3MjB4NDgwaSx0dl9t b2RlPU5UUyIsCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIGRybV9jbWRsaW5lX2ludmFsaWRfZGVz Yyhjb25zdCBzdHJ1Y3QgZHJtX2NtZGxpbmVfaW52YWxpZF90ZXN0ICp0LApAQCAtOTM3LDYgKzk0 NSw2NCBAQCBzdGF0aWMgdm9pZCBkcm1fY21kbGluZV9pbnZhbGlkX2Rlc2MoY29uc3Qgc3RydWN0 IGRybV9jbWRsaW5lX2ludmFsaWRfdGVzdCAqdCwKIAogS1VOSVRfQVJSQVlfUEFSQU0oZHJtX2Nt ZGxpbmVfaW52YWxpZCwgZHJtX2NtZGxpbmVfaW52YWxpZF90ZXN0cywgZHJtX2NtZGxpbmVfaW52 YWxpZF9kZXNjKTsKIAorc3RydWN0IGRybV9jbWRsaW5lX3R2X29wdGlvbl90ZXN0IHsKKwljb25z dCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmNtZGxpbmU7CisJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKigqbW9kZV9mbikoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJZW51bSBkcm1fY29u bmVjdG9yX3R2X21vZGUgdHZfbW9kZTsKK307CisKK3N0YXRpYyB2b2lkIGRybV90ZXN0X2NtZGxp bmVfdHZfb3B0aW9ucyhzdHJ1Y3Qga3VuaXQgKnRlc3QpCit7CisJY29uc3Qgc3RydWN0IGRybV9j bWRsaW5lX3R2X29wdGlvbl90ZXN0ICpwYXJhbXMgPSB0ZXN0LT5wYXJhbV92YWx1ZTsKKwljb25z dCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZXhwZWN0ZWRfbW9kZSA9IHBhcmFtcy0+bW9kZV9m bihOVUxMKTsKKwlzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSBtb2RlID0geyB9OworCisJS1VOSVRf RVhQRUNUX1RSVUUodGVzdCwgZHJtX21vZGVfcGFyc2VfY29tbWFuZF9saW5lX2Zvcl9jb25uZWN0 b3IocGFyYW1zLT5jbWRsaW5lLAorCQkJCQkJCQkJICAmbm9fY29ubmVjdG9yLCAmbW9kZSkpOwor CUtVTklUX0VYUEVDVF9UUlVFKHRlc3QsIG1vZGUuc3BlY2lmaWVkKTsKKwlLVU5JVF9FWFBFQ1Rf RVEodGVzdCwgbW9kZS54cmVzLCBleHBlY3RlZF9tb2RlLT5oZGlzcGxheSk7CisJS1VOSVRfRVhQ RUNUX0VRKHRlc3QsIG1vZGUueXJlcywgZXhwZWN0ZWRfbW9kZS0+dmRpc3BsYXkpOworCUtVTklU X0VYUEVDVF9FUSh0ZXN0LCBtb2RlLnR2X21vZGUsIHBhcmFtcy0+dHZfbW9kZSk7CisKKwlLVU5J VF9FWFBFQ1RfRkFMU0UodGVzdCwgbW9kZS5yZWZyZXNoX3NwZWNpZmllZCk7CisKKwlLVU5JVF9F WFBFQ1RfRkFMU0UodGVzdCwgbW9kZS5icHBfc3BlY2lmaWVkKTsKKworCUtVTklUX0VYUEVDVF9G QUxTRSh0ZXN0LCBtb2RlLnJiKTsKKwlLVU5JVF9FWFBFQ1RfRkFMU0UodGVzdCwgbW9kZS5jdnQp OworCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCBtb2RlLmludGVybGFjZSwgISEoZXhwZWN0ZWRfbW9k ZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkpOworCUtVTklUX0VYUEVDVF9GQUxT RSh0ZXN0LCBtb2RlLm1hcmdpbnMpOworCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCBtb2RlLmZvcmNl LCBEUk1fRk9SQ0VfVU5TUEVDSUZJRUQpOworfQorCisjZGVmaW5lIFRWX09QVF9URVNUKF9vcHQs IF9jbWRsaW5lLCBfbW9kZV9mbikJCVwKKwl7CQkJCQkJXAorCQkubmFtZSA9ICNfb3B0LAkJCQlc CisJCS5jbWRsaW5lID0gX2NtZGxpbmUsCQkJXAorCQkubW9kZV9mbiA9IF9tb2RlX2ZuLAkJCVwK KwkJLnR2X21vZGUgPSBEUk1fTU9ERV9UVl9NT0RFXyAjIyBfb3B0LAlcCisJfQorCitzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9jbWRsaW5lX3R2X29wdGlvbl90ZXN0IGRybV9jbWRsaW5lX3R2X29w dGlvbl90ZXN0c1tdID0geworCVRWX09QVF9URVNUKE5UU0MsICI3MjB4NDgwaSx0dl9tb2RlPU5U U0MiLCBkcm1fbW9kZV9hbmFsb2dfbnRzY180ODBpKSwKKwlUVl9PUFRfVEVTVChOVFNDXzQ0Mywg IjcyMHg0ODBpLHR2X21vZGU9TlRTQy00NDMiLCBkcm1fbW9kZV9hbmFsb2dfbnRzY180ODBpKSwK KwlUVl9PUFRfVEVTVChOVFNDX0osICI3MjB4NDgwaSx0dl9tb2RlPU5UU0MtSiIsIGRybV9tb2Rl X2FuYWxvZ19udHNjXzQ4MGkpLAorCVRWX09QVF9URVNUKFBBTCwgIjcyMHg1NzZpLHR2X21vZGU9 UEFMIiwgZHJtX21vZGVfYW5hbG9nX3BhbF81NzZpKSwKKwlUVl9PUFRfVEVTVChQQUxfTSwgIjcy MHg0ODBpLHR2X21vZGU9UEFMLU0iLCBkcm1fbW9kZV9hbmFsb2dfbnRzY180ODBpKSwKKwlUVl9P UFRfVEVTVChQQUxfTiwgIjcyMHg1NzZpLHR2X21vZGU9UEFMLU4iLCBkcm1fbW9kZV9hbmFsb2df cGFsXzU3NmkpLAorCVRWX09QVF9URVNUKFNFQ0FNLCAiNzIweDU3NmksdHZfbW9kZT1TRUNBTSIs IGRybV9tb2RlX2FuYWxvZ19wYWxfNTc2aSksCit9OworCitzdGF0aWMgdm9pZCBkcm1fY21kbGlu ZV90dl9vcHRpb25fZGVzYyhjb25zdCBzdHJ1Y3QgZHJtX2NtZGxpbmVfdHZfb3B0aW9uX3Rlc3Qg KnQsCisJCQkJICAgICAgIGNoYXIgKmRlc2MpCit7CisJc3ByaW50ZihkZXNjLCAiJXMiLCB0LT5u YW1lKTsKK30KK0tVTklUX0FSUkFZX1BBUkFNKGRybV9jbWRsaW5lX3R2X29wdGlvbiwKKwkJICBk cm1fY21kbGluZV90dl9vcHRpb25fdGVzdHMsCisJCSAgZHJtX2NtZGxpbmVfdHZfb3B0aW9uX2Rl c2MpOworCiBzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2NtZGxpbmVfcGFyc2VyX3Rlc3Rz W10gPSB7CiAJS1VOSVRfQ0FTRShkcm1fdGVzdF9jbWRsaW5lX2ZvcmNlX2Rfb25seSksCiAJS1VO SVRfQ0FTRShkcm1fdGVzdF9jbWRsaW5lX2ZvcmNlX0Rfb25seV9kdmkpLApAQCAtOTc3LDYgKzEw NDMsNyBAQCBzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2NtZGxpbmVfcGFyc2VyX3Rlc3Rz W10gPSB7CiAJS1VOSVRfQ0FTRShkcm1fdGVzdF9jbWRsaW5lX2ZyZWVzdGFuZGluZ19mb3JjZV9l X2FuZF9vcHRpb25zKSwKIAlLVU5JVF9DQVNFKGRybV90ZXN0X2NtZGxpbmVfcGFuZWxfb3JpZW50 YXRpb24pLAogCUtVTklUX0NBU0VfUEFSQU0oZHJtX3Rlc3RfY21kbGluZV9pbnZhbGlkLCBkcm1f Y21kbGluZV9pbnZhbGlkX2dlbl9wYXJhbXMpLAorCUtVTklUX0NBU0VfUEFSQU0oZHJtX3Rlc3Rf Y21kbGluZV90dl9vcHRpb25zLCBkcm1fY21kbGluZV90dl9vcHRpb25fZ2VuX3BhcmFtcyksCiAJ e30KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0b3IuaCBiL2luY2x1 ZGUvZHJtL2RybV9jb25uZWN0b3IuaAppbmRleCBjODU2ZjQ4NzE2OTcuLmZmY2EwYTg1N2Q1MyAx MDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCisrKyBiL2luY2x1ZGUvZHJt L2RybV9jb25uZWN0b3IuaApAQCAtMTM2OCw2ICsxMzY4LDE4IEBAIHN0cnVjdCBkcm1fY21kbGlu ZV9tb2RlIHsKIAkgKiBAdHZfbWFyZ2luczogVFYgbWFyZ2lucyB0byBhcHBseSB0byB0aGUgbW9k ZS4KIAkgKi8KIAlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl90dl9tYXJnaW5zIHR2X21hcmdpbnM7CisK KwkvKioKKwkgKiBAdHZfbW9kZTogVFYgbW9kZSBzdGFuZGFyZC4gU2VlIERSTV9NT0RFX1RWX01P REVfKi4KKwkgKi8KKwllbnVtIGRybV9jb25uZWN0b3JfdHZfbW9kZSB0dl9tb2RlOworCisJLyoq CisJICogQHR2X21vZGVfc3BlY2lmaWVkOgorCSAqCisJICogRGlkIHRoZSBtb2RlIGhhdmUgYSBw cmVmZXJyZWQgVFYgbW9kZT8KKwkgKi8KKwlib29sIHR2X21vZGVfc3BlY2lmaWVkOwogfTsKIAog LyoqCgotLSAKYjQgMC4xMS4wLWRldi05OWUzYQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=