From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 24C251759C for ; Mon, 15 Jan 2024 14:33:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="MuUx/7hH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329194; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=MuUx/7hHrgA/8HcAnH2xuh+MtMvhDmKd92+qOl7Iw7KpG49uNw05Rq91spIppbBXbUDKSG vEbKfAT1T1bGHrJV/6vygM+KXKCn5Wg+zsNG9hABdamt+Q3pwwKGRJIiXXLvPGqf/K2Z2Z GI64f23MKFoJnvcHJNY55c+P8mtc3lw= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-436-T3HaujCsOw-pwf_FFsSmoQ-1; Mon, 15 Jan 2024 09:33:12 -0500 X-MC-Unique: T3HaujCsOw-pwf_FFsSmoQ-1 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-40e5769e2deso39981355e9.2 for ; Mon, 15 Jan 2024 06:33:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329191; x=1705933991; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=Kev98Br/ErRdlQ5MgEqJpOzPHTG52gzfuy8/Vielf5lgYzxWPRdffynkWmt7EnxBcT QzxH4BXyuTa3Urw5uH9JBWVc+hPsxf2K8Wig/Jbtae8IKODv8SjvI8Jfis4E9AtvP08i x0f7p3RtV28agdsiJ86ATkVmn4J4Xqym85akH4VyoNBap6g6IQLG8CBN/a5oUvZlMWj4 LaMPds0oEc0bnqWas42P4O7Og31gGxIHcJCf8unXhm64nmFRb6ykdC67sIlz2FSqmh7d FEROxzCfW0V5jrcvDGdiP83qoXT+C3WA7U2GXyNSOnE4xsarCVJGytRB4MdZRXAnclJR +RmQ== X-Gm-Message-State: AOJu0YxIRGaIxIEr1DV5XC+MataAKvAp6jPKXHe/jTpGBeDJOHtj2T82 C2Kro1Vrl7doDn18w7entxShUDRzsLXobAWx3zVBwjQEO88Rk7getdN37jr0SYqR72R8/BliBPM ks7nPmAyyeNrGwNNX7GeaPQwV/FTP X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035180wma.230.1705329191023; Mon, 15 Jan 2024 06:33:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IGnFpNvbECPYnHXUb6ozmA7yyk68z6lU24Rulo6C/Itudf1qtyIV6rA40/SMTmfGJac297SBQ== X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035169wma.230.1705329190506; Mon, 15 Jan 2024 06:33:10 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id o8-20020a05600c4fc800b0040e549c77a1sm20056078wmq.32.2024.01.15.06.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:33:10 -0800 (PST) Date: Mon, 15 Jan 2024 15:33:08 +0100 From: Sebastian Wick To: Maxime Ripard Cc: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Daniel Vetter , Emma Anholt , Jonathan Corbet , Sandy Huang , Heiko =?iso-8859-1?Q?St=FCbner?= , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Hans Verkuil , linux-rockchip@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Subject: Re: [PATCH v5 08/44] drm/connector: hdmi: Add Broadcast RGB property Message-ID: <20240115143308.GA159345@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> On Thu, Dec 07, 2023 at 04:49:31PM +0100, Maxime Ripard wrote: > The i915 driver has a property to force the RGB range of an HDMI output. > The vc4 driver then implemented the same property with the same > semantics. KWin has support for it, and a PR for mutter is also there to > support it. > > Both drivers implementing the same property with the same semantics, > plus the userspace having support for it, is proof enough that it's > pretty much a de-facto standard now and we can provide helpers for it. > > Let's plumb it into the newly created HDMI connector. > > Signed-off-by: Maxime Ripard > --- > Documentation/gpu/kms-properties.csv | 1 - > drivers/gpu/drm/drm_atomic.c | 5 + > drivers/gpu/drm/drm_atomic_state_helper.c | 17 + > drivers/gpu/drm/drm_atomic_uapi.c | 4 + > drivers/gpu/drm/drm_connector.c | 76 +++++ > drivers/gpu/drm/tests/Makefile | 1 + > .../gpu/drm/tests/drm_atomic_state_helper_test.c | 376 +++++++++++++++++++++ > drivers/gpu/drm/tests/drm_connector_test.c | 117 ++++++- > drivers/gpu/drm/tests/drm_kunit_edid.h | 106 ++++++ > include/drm/drm_connector.h | 36 ++ > 10 files changed, 737 insertions(+), 2 deletions(-) > > diff --git a/Documentation/gpu/kms-properties.csv b/Documentation/gpu/kms-properties.csv > index 0f9590834829..caef14c532d4 100644 > --- a/Documentation/gpu/kms-properties.csv > +++ b/Documentation/gpu/kms-properties.csv > @@ -17,7 +17,6 @@ Owner Module/Drivers,Group,Property Name,Type,Property Values,Object attached,De > ,Virtual GPU,“suggested X”,RANGE,"Min=0, Max=0xffffffff",Connector,property to suggest an X offset for a connector > ,,“suggested Y”,RANGE,"Min=0, Max=0xffffffff",Connector,property to suggest an Y offset for a connector > ,Optional,"""aspect ratio""",ENUM,"{ ""None"", ""4:3"", ""16:9"" }",Connector,TDB > -i915,Generic,"""Broadcast RGB""",ENUM,"{ ""Automatic"", ""Full"", ""Limited 16:235"" }",Connector,"When this property is set to Limited 16:235 and CTM is set, the hardware will be programmed with the result of the multiplication of CTM by the limited range matrix to ensure the pixels normally in the range 0..1.0 are remapped to the range 16/255..235/255." > ,,“audio”,ENUM,"{ ""force-dvi"", ""off"", ""auto"", ""on"" }",Connector,TBD > ,SDVO-TV,“mode”,ENUM,"{ ""NTSC_M"", ""NTSC_J"", ""NTSC_443"", ""PAL_B"" } etc.",Connector,TBD > ,,"""left_margin""",RANGE,"Min=0, Max= SDVO dependent",Connector,TBD > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index c31fc0b48c31..1465a7f09a0b 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -1142,6 +1142,11 @@ static void drm_atomic_connector_print_state(struct drm_printer *p, > drm_printf(p, "\tmax_requested_bpc=%d\n", state->max_requested_bpc); > drm_printf(p, "\tcolorspace=%s\n", drm_get_colorspace_name(state->colorspace)); > > + if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || > + connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) > + drm_printf(p, "\tbroadcast_rgb=%s\n", > + drm_hdmi_connector_get_broadcast_rgb_name(state->hdmi.broadcast_rgb)); > + > if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK) > if (state->writeback_job && state->writeback_job->fb) > drm_printf(p, "\tfb=%d\n", state->writeback_job->fb->base.id); > diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c > index e69c0cc1c6da..10d98620a358 100644 > --- a/drivers/gpu/drm/drm_atomic_state_helper.c > +++ b/drivers/gpu/drm/drm_atomic_state_helper.c > @@ -583,6 +583,7 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_tv_reset); > void __drm_atomic_helper_connector_hdmi_reset(struct drm_connector *connector, > struct drm_connector_state *new_state) > { > + new_state->hdmi.broadcast_rgb = DRM_HDMI_BROADCAST_RGB_AUTO; > } > EXPORT_SYMBOL(__drm_atomic_helper_connector_hdmi_reset); > > @@ -650,6 +651,22 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_tv_check); > int drm_atomic_helper_connector_hdmi_check(struct drm_connector *connector, > struct drm_atomic_state *state) > { > + struct drm_connector_state *old_state = > + drm_atomic_get_old_connector_state(state, connector); > + struct drm_connector_state *new_state = > + drm_atomic_get_new_connector_state(state, connector); > + > + if (old_state->hdmi.broadcast_rgb != new_state->hdmi.broadcast_rgb) { > + struct drm_crtc *crtc = new_state->crtc; > + struct drm_crtc_state *crtc_state; > + > + crtc_state = drm_atomic_get_crtc_state(state, crtc); > + if (IS_ERR(crtc_state)) > + return PTR_ERR(crtc_state); > + > + crtc_state->mode_changed = true; > + } > + > return 0; > } > EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_check); > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index aee4a65d4959..3eb4f4bc8b71 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -818,6 +818,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, > state->max_requested_bpc = val; > } else if (property == connector->privacy_screen_sw_state_property) { > state->privacy_screen_sw_state = val; > + } else if (property == connector->broadcast_rgb_property) { > + state->hdmi.broadcast_rgb = val; > } else if (connector->funcs->atomic_set_property) { > return connector->funcs->atomic_set_property(connector, > state, property, val); > @@ -901,6 +903,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > *val = state->max_requested_bpc; > } else if (property == connector->privacy_screen_sw_state_property) { > *val = state->privacy_screen_sw_state; > + } else if (property == connector->broadcast_rgb_property) { > + *val = state->hdmi.broadcast_rgb; > } else if (connector->funcs->atomic_get_property) { > return connector->funcs->atomic_get_property(connector, > state, property, val); > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index d9961cce8245..929b0a911f62 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -1183,6 +1183,29 @@ static const u32 dp_colorspaces = > BIT(DRM_MODE_COLORIMETRY_BT2020_CYCC) | > BIT(DRM_MODE_COLORIMETRY_BT2020_YCC); > > +static const struct drm_prop_enum_list broadcast_rgb_names[] = { > + { DRM_HDMI_BROADCAST_RGB_AUTO, "Automatic" }, > + { DRM_HDMI_BROADCAST_RGB_FULL, "Full" }, > + { DRM_HDMI_BROADCAST_RGB_LIMITED, "Limited 16:235" }, > +}; > + > +/* > + * drm_hdmi_connector_get_broadcast_rgb_name - Return a string for HDMI connector RGB broadcast selection > + * @broadcast_rgb: Broadcast RGB selection to compute name of > + * > + * Returns: the name of the Broadcast RGB selection, or NULL if the type > + * is not valid. > + */ > +const char * > +drm_hdmi_connector_get_broadcast_rgb_name(enum drm_hdmi_broadcast_rgb broadcast_rgb) > +{ > + if (broadcast_rgb > DRM_HDMI_BROADCAST_RGB_LIMITED) > + return NULL; > + > + return broadcast_rgb_names[broadcast_rgb].name; > +} > +EXPORT_SYMBOL(drm_hdmi_connector_get_broadcast_rgb_name); > + > /** > * DOC: standard connector properties > * > @@ -1655,6 +1678,26 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); > /** > * DOC: HDMI connector properties > * > + * Broadcast RGB > + * Indicates the RGB Quantization Range (Full vs Limited) used. > + * Infoframes will be generated according to that value. > + * > + * The value of this property can be one of the following: > + * > + * Automatic: > + * RGB Range is selected automatically based on the mode > + * according to the HDMI specifications. > + * > + * Full: > + * Full RGB Range is forced. > + * > + * Limited 16:235: > + * Limited RGB Range is forced. Unlike the name suggests, > + * this works for any number of bits-per-component. > + * > + * Drivers can set up this property by calling > + * drm_connector_attach_broadcast_rgb_property(). > + * This is a good time to document this in more detail. There might be two different things being affected: 1. The signalling (InfoFrame/SDP/...) 2. The color pipeline processing All values of Broadcast RGB always affect the color pipeline processing such that a full-range input to the CRTC is converted to either full- or limited-range, depending on what the monitor is supposed to accept. When automatic is selected, does that mean that there is no signalling, or that the signalling matches what the monitor is supposed to accept according to the spec? Also, is this really HDMI specific? When full or limited is selected and the monitor doesn't support the signalling, what happens? > * content type (HDMI specific): > * Indicates content type setting to be used in HDMI infoframes to indicate > * content type for the external device, so that it adjusts its display > @@ -2517,6 +2560,39 @@ int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *conn > } > EXPORT_SYMBOL(drm_connector_attach_hdr_output_metadata_property); > > +/** > + * drm_connector_attach_broadcast_rgb_property - attach "Broadcast RGB" property > + * @connector: connector to attach the property on. > + * > + * This is used to add support for forcing the RGB range on a connector > + * > + * Returns: > + * Zero on success, negative errno on failure. > + */ > +int drm_connector_attach_broadcast_rgb_property(struct drm_connector *connector) > +{ > + struct drm_device *dev = connector->dev; > + struct drm_property *prop; > + > + prop = connector->broadcast_rgb_property; > + if (!prop) { > + prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, > + "Broadcast RGB", > + broadcast_rgb_names, > + ARRAY_SIZE(broadcast_rgb_names)); > + if (!prop) > + return -EINVAL; > + > + connector->broadcast_rgb_property = prop; > + } > + > + drm_object_attach_property(&connector->base, prop, > + DRM_HDMI_BROADCAST_RGB_AUTO); > + > + return 0; > +} > +EXPORT_SYMBOL(drm_connector_attach_broadcast_rgb_property); > + > /** > * drm_connector_attach_colorspace_property - attach "Colorspace" property > * @connector: connector to attach the property on. > diff --git a/drivers/gpu/drm/tests/Makefile b/drivers/gpu/drm/tests/Makefile > index d6183b3d7688..b29ddfd90596 100644 > --- a/drivers/gpu/drm/tests/Makefile > +++ b/drivers/gpu/drm/tests/Makefile > @@ -4,6 +4,7 @@ obj-$(CONFIG_DRM_KUNIT_TEST_HELPERS) += \ > drm_kunit_helpers.o > > obj-$(CONFIG_DRM_KUNIT_TEST) += \ > + drm_atomic_state_helper_test.o \ > drm_buddy_test.o \ > drm_cmdline_parser_test.o \ > drm_connector_test.o \ > diff --git a/drivers/gpu/drm/tests/drm_atomic_state_helper_test.c b/drivers/gpu/drm/tests/drm_atomic_state_helper_test.c > new file mode 100644 > index 000000000000..21e6f796ee13 > --- /dev/null > +++ b/drivers/gpu/drm/tests/drm_atomic_state_helper_test.c > @@ -0,0 +1,376 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +/* > + * Kunit test for drm_atomic_state_helper functions > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include "../drm_crtc_internal.h" > + > +#include > + > +#include "drm_kunit_edid.h" > + > +struct drm_atomic_helper_connector_hdmi_priv { > + struct drm_device drm; > + struct drm_plane *plane; > + struct drm_crtc *crtc; > + struct drm_encoder encoder; > + struct drm_connector connector; > + > + const char *current_edid; > + size_t current_edid_len; > +}; > + > +#define connector_to_priv(c) \ > + container_of_const(c, struct drm_atomic_helper_connector_hdmi_priv, connector) > + > +static struct drm_display_mode *find_preferred_mode(struct drm_connector *connector) > +{ > + struct drm_device *drm = connector->dev; > + struct drm_display_mode *mode, *preferred; > + > + mutex_lock(&drm->mode_config.mutex); > + preferred = list_first_entry(&connector->modes, struct drm_display_mode, head); > + list_for_each_entry(mode, &connector->modes, head) > + if (mode->type & DRM_MODE_TYPE_PREFERRED) > + preferred = mode; > + mutex_unlock(&drm->mode_config.mutex); > + > + return preferred; > +} > + > +static int light_up_connector(struct kunit *test, > + struct drm_device *drm, > + struct drm_crtc *crtc, > + struct drm_connector *connector, > + struct drm_display_mode *mode, > + struct drm_modeset_acquire_ctx *ctx) > +{ > + struct drm_atomic_state *state; > + struct drm_connector_state *conn_state; > + struct drm_crtc_state *crtc_state; > + int ret; > + > + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); > + > + conn_state = drm_atomic_get_connector_state(state, connector); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); > + > + ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); > + KUNIT_EXPECT_EQ(test, ret, 0); > + > + crtc_state = drm_atomic_get_crtc_state(state, crtc); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); > + > + ret = drm_atomic_set_mode_for_crtc(crtc_state, mode); > + KUNIT_EXPECT_EQ(test, ret, 0); > + > + crtc_state->enable = true; > + crtc_state->active = true; > + > + ret = drm_atomic_commit(state); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + return 0; > +} > + > +static int set_connector_edid(struct kunit *test, struct drm_connector *connector, > + const char *edid, size_t edid_len) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv = > + connector_to_priv(connector); > + struct drm_device *drm = connector->dev; > + int ret; > + > + priv->current_edid = edid; > + priv->current_edid_len = edid_len; > + > + mutex_lock(&drm->mode_config.mutex); > + ret = connector->funcs->fill_modes(connector, 4096, 4096); > + mutex_unlock(&drm->mode_config.mutex); > + KUNIT_ASSERT_GT(test, ret, 0); > + > + return 0; > +} > + > +static int dummy_connector_get_modes(struct drm_connector *connector) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv = > + connector_to_priv(connector); > + const struct drm_edid *edid; > + unsigned int num_modes; > + > + edid = drm_edid_alloc(priv->current_edid, priv->current_edid_len); > + if (!edid) > + return -EINVAL; > + > + drm_edid_connector_update(connector, edid); > + num_modes = drm_edid_connector_add_modes(connector); > + > + drm_edid_free(edid); > + > + return num_modes; > +} > + > +static const struct drm_connector_helper_funcs dummy_connector_helper_funcs = { > + .atomic_check = drm_atomic_helper_connector_hdmi_check, > + .get_modes = dummy_connector_get_modes, > +}; > + > +static void dummy_hdmi_connector_reset(struct drm_connector *connector) > +{ > + drm_atomic_helper_connector_reset(connector); > + __drm_atomic_helper_connector_hdmi_reset(connector, connector->state); > +} > + > +static const struct drm_connector_funcs dummy_connector_funcs = { > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > + .fill_modes = drm_helper_probe_single_connector_modes, > + .reset = dummy_hdmi_connector_reset, > +}; > + > +static > +struct drm_atomic_helper_connector_hdmi_priv * > +drm_atomic_helper_connector_hdmi_init(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_connector *conn; > + struct drm_encoder *enc; > + struct drm_device *drm; > + struct device *dev; > + int ret; > + > + dev = drm_kunit_helper_alloc_device(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev); > + > + priv = drm_kunit_helper_alloc_drm_device(test, dev, > + struct drm_atomic_helper_connector_hdmi_priv, drm, > + DRIVER_MODESET | DRIVER_ATOMIC); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv); > + test->priv = priv; > + > + drm = &priv->drm; > + priv->plane = drm_kunit_helper_create_primary_plane(test, drm, > + NULL, > + NULL, > + NULL, 0, > + NULL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->plane); > + > + priv->crtc = drm_kunit_helper_create_crtc(test, drm, > + priv->plane, NULL, > + NULL, > + NULL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->crtc); > + > + enc = &priv->encoder; > + ret = drmm_encoder_init(drm, enc, NULL, DRM_MODE_ENCODER_TMDS, NULL); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + enc->possible_crtcs = drm_crtc_mask(priv->crtc); > + > + conn = &priv->connector; > + ret = drmm_connector_hdmi_init(drm, conn, > + &dummy_connector_funcs, > + DRM_MODE_CONNECTOR_HDMIA, > + NULL); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + drm_connector_helper_add(conn, &dummy_connector_helper_funcs); > + drm_connector_attach_encoder(conn, enc); > + > + drm_mode_config_reset(drm); > + > + ret = set_connector_edid(test, conn, > + test_edid_hdmi_1080p_rgb_max_200mhz, > + ARRAY_SIZE(test_edid_hdmi_1080p_rgb_max_200mhz)); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + return priv; > +} > + > +/* > + * Test that if we change the RGB quantization property to a different > + * value, we trigger a mode change on the connector's CRTC, which will > + * in turn disable/enable the connector. > + */ > +static void drm_test_check_broadcast_rgb_crtc_mode_changed(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_modeset_acquire_ctx *ctx; > + struct drm_connector_state *old_conn_state; > + struct drm_connector_state *new_conn_state; > + struct drm_crtc_state *crtc_state; > + struct drm_atomic_state *state; > + struct drm_display_mode *preferred; > + struct drm_connector *conn; > + struct drm_device *drm; > + struct drm_crtc *crtc; > + int ret; > + > + priv = drm_atomic_helper_connector_hdmi_init(test); > + KUNIT_ASSERT_NOT_NULL(test, priv); > + > + ctx = drm_kunit_helper_acquire_ctx_alloc(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); > + > + conn = &priv->connector; > + preferred = find_preferred_mode(conn); > + KUNIT_ASSERT_NOT_NULL(test, preferred); > + > + drm = &priv->drm; > + crtc = priv->crtc; > + ret = light_up_connector(test, drm, crtc, conn, preferred, ctx); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); > + > + new_conn_state = drm_atomic_get_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + > + old_conn_state = drm_atomic_get_old_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); > + > + new_conn_state->hdmi.broadcast_rgb = DRM_HDMI_BROADCAST_RGB_FULL; > + > + KUNIT_ASSERT_NE(test, > + old_conn_state->hdmi.broadcast_rgb, > + new_conn_state->hdmi.broadcast_rgb); > + > + ret = drm_atomic_check_only(state); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + new_conn_state = drm_atomic_get_new_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + KUNIT_EXPECT_EQ(test, new_conn_state->hdmi.broadcast_rgb, DRM_HDMI_BROADCAST_RGB_FULL); > + > + crtc_state = drm_atomic_get_new_crtc_state(state, crtc); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); > + KUNIT_EXPECT_TRUE(test, crtc_state->mode_changed); > +} > + > +/* > + * Test that if we set the RGB quantization property to the same value, > + * we don't trigger a mode change on the connector's CRTC and leave the > + * connector unaffected. > + */ > +static void drm_test_check_broadcast_rgb_crtc_mode_not_changed(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_modeset_acquire_ctx *ctx; > + struct drm_connector_state *old_conn_state; > + struct drm_connector_state *new_conn_state; > + struct drm_crtc_state *crtc_state; > + struct drm_atomic_state *state; > + struct drm_display_mode *preferred; > + struct drm_connector *conn; > + struct drm_device *drm; > + struct drm_crtc *crtc; > + int ret; > + > + priv = drm_atomic_helper_connector_hdmi_init(test); > + KUNIT_ASSERT_NOT_NULL(test, priv); > + > + ctx = drm_kunit_helper_acquire_ctx_alloc(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); > + > + conn = &priv->connector; > + preferred = find_preferred_mode(conn); > + KUNIT_ASSERT_NOT_NULL(test, preferred); > + > + drm = &priv->drm; > + crtc = priv->crtc; > + ret = light_up_connector(test, drm, crtc, conn, preferred, ctx); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); > + > + new_conn_state = drm_atomic_get_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + > + old_conn_state = drm_atomic_get_old_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); > + > + new_conn_state->hdmi.broadcast_rgb = old_conn_state->hdmi.broadcast_rgb; > + > + ret = drm_atomic_check_only(state); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + old_conn_state = drm_atomic_get_old_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); > + > + new_conn_state = drm_atomic_get_new_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + > + KUNIT_EXPECT_EQ(test, > + old_conn_state->hdmi.broadcast_rgb, > + new_conn_state->hdmi.broadcast_rgb); > + > + crtc_state = drm_atomic_get_new_crtc_state(state, crtc); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); > + KUNIT_EXPECT_FALSE(test, crtc_state->mode_changed); > +} > + > +static struct kunit_case drm_atomic_helper_connector_hdmi_check_tests[] = { > + KUNIT_CASE(drm_test_check_broadcast_rgb_crtc_mode_changed), > + KUNIT_CASE(drm_test_check_broadcast_rgb_crtc_mode_not_changed), > + { } > +}; > + > +static struct kunit_suite drm_atomic_helper_connector_hdmi_check_test_suite = { > + .name = "drm_atomic_helper_connector_hdmi_check", > + .test_cases = drm_atomic_helper_connector_hdmi_check_tests, > +}; > + > +/* > + * Test that the value of the Broadcast RGB property out of reset is set > + * to auto. > + */ > +static void drm_test_check_broadcast_rgb_value(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_connector_state *conn_state; > + struct drm_connector *conn; > + > + priv = drm_atomic_helper_connector_hdmi_init(test); > + KUNIT_ASSERT_NOT_NULL(test, priv); > + > + conn = &priv->connector; > + conn_state = conn->state; > + KUNIT_EXPECT_EQ(test, conn_state->hdmi.broadcast_rgb, DRM_HDMI_BROADCAST_RGB_AUTO); > +} > + > +static struct kunit_case drm_atomic_helper_connector_hdmi_reset_tests[] = { > + KUNIT_CASE(drm_test_check_broadcast_rgb_value), > + { } > +}; > + > +static struct kunit_suite drm_atomic_helper_connector_hdmi_reset_test_suite = { > + .name = "drm_atomic_helper_connector_hdmi_reset", > + .test_cases = drm_atomic_helper_connector_hdmi_reset_tests, > +}; > + > +kunit_test_suites( > + &drm_atomic_helper_connector_hdmi_check_test_suite, > + &drm_atomic_helper_connector_hdmi_reset_test_suite, > +); > + > +MODULE_AUTHOR("Maxime Ripard "); > +MODULE_LICENSE("GPL"); > diff --git a/drivers/gpu/drm/tests/drm_connector_test.c b/drivers/gpu/drm/tests/drm_connector_test.c > index 8f070cacab3b..41d33dea30af 100644 > --- a/drivers/gpu/drm/tests/drm_connector_test.c > +++ b/drivers/gpu/drm/tests/drm_connector_test.c > @@ -12,6 +12,8 @@ > > #include > > +#include "../drm_crtc_internal.h" > + > struct drm_connector_init_priv { > struct drm_device drm; > struct drm_connector connector; > @@ -357,10 +359,123 @@ static struct kunit_suite drm_get_tv_mode_from_name_test_suite = { > .test_cases = drm_get_tv_mode_from_name_tests, > }; > > +struct drm_hdmi_connector_get_broadcast_rgb_name_test { > + unsigned int kind; > + const char *expected_name; > +}; > + > +#define BROADCAST_RGB_TEST(_kind, _name) \ > + { \ > + .kind = _kind, \ > + .expected_name = _name, \ > + } > + > +static void drm_test_drm_hdmi_connector_get_broadcast_rgb_name(struct kunit *test) > +{ > + const struct drm_hdmi_connector_get_broadcast_rgb_name_test *params = > + test->param_value; > + > + KUNIT_EXPECT_STREQ(test, > + drm_hdmi_connector_get_broadcast_rgb_name(params->kind), > + params->expected_name); > +} > + > +static const > +struct drm_hdmi_connector_get_broadcast_rgb_name_test > +drm_hdmi_connector_get_broadcast_rgb_name_valid_tests[] = { > + BROADCAST_RGB_TEST(DRM_HDMI_BROADCAST_RGB_AUTO, "Automatic"), > + BROADCAST_RGB_TEST(DRM_HDMI_BROADCAST_RGB_FULL, "Full"), > + BROADCAST_RGB_TEST(DRM_HDMI_BROADCAST_RGB_LIMITED, "Limited 16:235"), > +}; > + > +static void > +drm_hdmi_connector_get_broadcast_rgb_name_valid_desc(const struct drm_hdmi_connector_get_broadcast_rgb_name_test *t, > + char *desc) > +{ > + sprintf(desc, "%s", t->expected_name); > +} > + > +KUNIT_ARRAY_PARAM(drm_hdmi_connector_get_broadcast_rgb_name_valid, > + drm_hdmi_connector_get_broadcast_rgb_name_valid_tests, > + drm_hdmi_connector_get_broadcast_rgb_name_valid_desc); > + > +static void drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid(struct kunit *test) > +{ > + KUNIT_EXPECT_NULL(test, drm_hdmi_connector_get_broadcast_rgb_name(3)); > +}; > + > +static struct kunit_case drm_hdmi_connector_get_broadcast_rgb_name_tests[] = { > + KUNIT_CASE_PARAM(drm_test_drm_hdmi_connector_get_broadcast_rgb_name, > + drm_hdmi_connector_get_broadcast_rgb_name_valid_gen_params), > + KUNIT_CASE(drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid), > + { } > +}; > + > +static struct kunit_suite drm_hdmi_connector_get_broadcast_rgb_name_test_suite = { > + .name = "drm_hdmi_connector_get_broadcast_rgb_name", > + .test_cases = drm_hdmi_connector_get_broadcast_rgb_name_tests, > +}; > + > +static void drm_test_drm_connector_attach_broadcast_rgb_property(struct kunit *test) > +{ > + struct drm_connector_init_priv *priv = test->priv; > + struct drm_connector *connector = &priv->connector; > + struct drm_property *prop; > + int ret; > + > + ret = drmm_connector_init(&priv->drm, connector, > + &dummy_funcs, > + DRM_MODE_CONNECTOR_HDMIA, > + &priv->ddc); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + ret = drm_connector_attach_broadcast_rgb_property(connector); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + prop = connector->broadcast_rgb_property; > + KUNIT_ASSERT_NOT_NULL(test, prop); > + KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id)); > +} > + > +static void drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector(struct kunit *test) > +{ > + struct drm_connector_init_priv *priv = test->priv; > + struct drm_connector *connector = &priv->connector; > + struct drm_property *prop; > + int ret; > + > + ret = drmm_connector_hdmi_init(&priv->drm, connector, > + &dummy_funcs, > + DRM_MODE_CONNECTOR_HDMIA, > + &priv->ddc); > + KUNIT_EXPECT_EQ(test, ret, 0); > + > + ret = drm_connector_attach_broadcast_rgb_property(connector); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + prop = connector->broadcast_rgb_property; > + KUNIT_ASSERT_NOT_NULL(test, prop); > + KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id)); > +} > + > +static struct kunit_case drm_connector_attach_broadcast_rgb_property_tests[] = { > + KUNIT_CASE(drm_test_drm_connector_attach_broadcast_rgb_property), > + KUNIT_CASE(drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector), > + { } > +}; > + > +static struct kunit_suite drm_connector_attach_broadcast_rgb_property_test_suite = { > + .name = "drm_connector_attach_broadcast_rgb_property", > + .init = drm_test_connector_init, > + .test_cases = drm_connector_attach_broadcast_rgb_property_tests, > +}; > + > kunit_test_suites( > &drmm_connector_hdmi_init_test_suite, > &drmm_connector_init_test_suite, > - &drm_get_tv_mode_from_name_test_suite > + &drm_connector_attach_broadcast_rgb_property_test_suite, > + &drm_get_tv_mode_from_name_test_suite, > + &drm_hdmi_connector_get_broadcast_rgb_name_test_suite > ); > > MODULE_AUTHOR("Maxime Ripard "); > diff --git a/drivers/gpu/drm/tests/drm_kunit_edid.h b/drivers/gpu/drm/tests/drm_kunit_edid.h > new file mode 100644 > index 000000000000..2bba316de064 > --- /dev/null > +++ b/drivers/gpu/drm/tests/drm_kunit_edid.h > @@ -0,0 +1,106 @@ > +#ifndef DRM_KUNIT_EDID_H_ > +#define DRM_KUNIT_EDID_H_ > + > +/* > + * edid-decode (hex): > + * > + * 00 ff ff ff ff ff ff 00 31 d8 2a 00 00 00 00 00 > + * 00 21 01 03 81 a0 5a 78 02 00 00 00 00 00 00 00 > + * 00 00 00 20 00 00 01 01 01 01 01 01 01 01 01 01 > + * 01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c > + * 45 00 40 84 63 00 00 1e 00 00 00 fc 00 54 65 73 > + * 74 20 45 44 49 44 0a 20 20 20 00 00 00 fd 00 32 > + * 46 1e 46 0f 00 0a 20 20 20 20 20 20 00 00 00 10 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 92 > + * > + * 02 03 1b 81 e3 05 00 20 41 10 e2 00 4a 6d 03 0c > + * 00 12 34 00 28 20 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d0 > + * > + * ---------------- > + * > + * Block 0, Base EDID: > + * EDID Structure Version & Revision: 1.3 > + * Vendor & Product Identification: > + * Manufacturer: LNX > + * Model: 42 > + * Made in: 2023 > + * Basic Display Parameters & Features: > + * Digital display > + * DFP 1.x compatible TMDS > + * Maximum image size: 160 cm x 90 cm > + * Gamma: 2.20 > + * Monochrome or grayscale display > + * First detailed timing is the preferred timing > + * Color Characteristics: > + * Red : 0.0000, 0.0000 > + * Green: 0.0000, 0.0000 > + * Blue : 0.0000, 0.0000 > + * White: 0.0000, 0.0000 > + * Established Timings I & II: > + * DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175000 MHz > + * Standard Timings: none > + * Detailed Timing Descriptors: > + * DTD 1: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz (1600 mm x 900 mm) > + * Hfront 88 Hsync 44 Hback 148 Hpol P > + * Vfront 4 Vsync 5 Vback 36 Vpol P > + * Display Product Name: 'Test EDID' > + * Display Range Limits: > + * Monitor ranges (GTF): 50-70 Hz V, 30-70 kHz H, max dotclock 150 MHz > + * Dummy Descriptor: > + * Extension blocks: 1 > + * Checksum: 0x92 > + * > + * ---------------- > + * > + * Block 1, CTA-861 Extension Block: > + * Revision: 3 > + * Underscans IT Video Formats by default > + * Native detailed modes: 1 > + * Colorimetry Data Block: > + * sRGB > + * Video Data Block: > + * VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz > + * Video Capability Data Block: > + * YCbCr quantization: No Data > + * RGB quantization: Selectable (via AVI Q) > + * PT scan behavior: No Data > + * IT scan behavior: Always Underscanned > + * CE scan behavior: Always Underscanned > + * Vendor-Specific Data Block (HDMI), OUI 00-0C-03: > + * Source physical address: 1.2.3.4 > + * Maximum TMDS clock: 200 MHz > + * Extended HDMI video details: > + * Checksum: 0xd0 Unused space in Extension Block: 100 bytes > + */ > +const unsigned char test_edid_hdmi_1080p_rgb_max_200mhz[] = { > + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x31, 0xd8, 0x2a, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x03, 0x81, 0xa0, 0x5a, 0x78, > + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, > + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, > + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, > + 0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, > + 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x44, > + 0x49, 0x44, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x32, > + 0x46, 0x00, 0x00, 0xc4, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x02, 0x03, 0x1b, 0x81, > + 0xe3, 0x05, 0x00, 0x20, 0x41, 0x10, 0xe2, 0x00, 0x4a, 0x6d, 0x03, 0x0c, > + 0x00, 0x12, 0x34, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0xd0 > +}; > + > +#endif // DRM_KUNIT_EDID_H_ > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index 000a2a156619..3867a4c01b78 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -368,6 +368,30 @@ enum drm_panel_orientation { > DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, > }; > > +/** > + * enum drm_hdmi_broadcast_rgb - Broadcast RGB Selection for an HDMI @drm_connector > + */ > +enum drm_hdmi_broadcast_rgb { > + /** > + * @DRM_HDMI_BROADCAST_RGB_AUTO: The RGB range is selected > + * automatically based on the mode. > + */ > + DRM_HDMI_BROADCAST_RGB_AUTO, > + > + /** > + * @DRM_HDMI_BROADCAST_RGB_FULL: Full range RGB is forced. > + */ > + DRM_HDMI_BROADCAST_RGB_FULL, > + > + /** > + * @DRM_HDMI_BROADCAST_RGB_LIMITED: Limited range RGB is forced. > + */ > + DRM_HDMI_BROADCAST_RGB_LIMITED, > +}; > + > +const char * > +drm_hdmi_connector_get_broadcast_rgb_name(enum drm_hdmi_broadcast_rgb broadcast_rgb); > + > /** > * struct drm_monitor_range_info - Panel's Monitor range in EDID for > * &drm_display_info > @@ -1037,6 +1061,11 @@ struct drm_connector_state { > * @drm_atomic_helper_connector_hdmi_check(). > */ > struct { > + /** > + * @broadcast_rgb: Connector property to pass the > + * Broadcast RGB selection value. > + */ > + enum drm_hdmi_broadcast_rgb broadcast_rgb; > } hdmi; > }; > > @@ -1706,6 +1735,12 @@ struct drm_connector { > */ > struct drm_property *privacy_screen_hw_state_property; > > + /** > + * @broadcast_rgb_property: Connector property to set the > + * Broadcast RGB selection to output with. > + */ > + struct drm_property *broadcast_rgb_property; > + > #define DRM_CONNECTOR_POLL_HPD (1 << 0) > #define DRM_CONNECTOR_POLL_CONNECT (1 << 1) > #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) > @@ -2026,6 +2061,7 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, > u32 scaling_mode_mask); > int drm_connector_attach_vrr_capable_property( > struct drm_connector *connector); > +int drm_connector_attach_broadcast_rgb_property(struct drm_connector *connector); > int drm_connector_attach_colorspace_property(struct drm_connector *connector); > int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *connector); > bool drm_connector_atomic_hdr_metadata_equal(struct drm_connector_state *old_state, > > -- > 2.43.0 > 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 F3506C3DA79 for ; Mon, 15 Jan 2024 14:35:28 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=MQDB8sfAIlf/nwuqIGz8+Sfyvm82f/NJAjn6HSC/7bg=; b=PTxSs8HSwYdzLD C77aOOH8UpLoyq95esKCRRgoKKWI9KpZCMmQkGs7H8/euVYk+GVQ80gjd9126JT+Zq5pXPcQso6T1 p8x/Fo/PKFofsiZcJtMuZP4MalseMUVGxWtkONHhrkG5PN1RiYYZtFFN0QoavwiQ/wrOeCrhnpWxA Z/njdp8QoZzxE/p8g9/7Fx00GSm/UKcmrXMFih56Y3Fs1SCSSchgYqCcq6i4jvTXW7fCQflIMkfnV vWgI1XCxlkNTNQLtzp19GEFyj3JQ54YxpjgP8bt/nQxTM95l96J2d8uWptXC+kHVoo8je2ScpoUm/ bTe3SWyEq7temldNgWxA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPO3T-009EcD-09; Mon, 15 Jan 2024 14:35:11 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rPO3L-009EXd-0p for linux-rockchip@lists.infradead.org; Mon, 15 Jan 2024 14:35:09 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329301; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=CsM4p8V5o0QsFCQhRaYOoaBnbr7dyXz5aaaG5evy3dIP18Fjrt0jE0E/PmOFELDEouu8F/ EBNFT5Np0miMcWiWupQ6rxCnDVyHRJbL+fs1HTQrKNwh//7tV6vmHjVXqOHBUJKHUIkC+Z 3p39dr2B0ClsScg0iYSkvIFKl5CG/rw= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-684-ovV9345kOZyY6iqoVupm9A-1; Mon, 15 Jan 2024 09:33:12 -0500 X-MC-Unique: ovV9345kOZyY6iqoVupm9A-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40e6f3c5730so14664035e9.1 for ; Mon, 15 Jan 2024 06:33:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329191; x=1705933991; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=JQHyBbmC9CTAsyYmkGhFncCjl4t3ln50rRLBXMTCnkok1GkySa8whys3UeYS8UKR3f yg6u+Rd/+0cBTF+LX2YvdIszQeRq6m84mkvq/oLjOqvwZJZbqH2Gs8aewKbZxc7dImdB ec8B/1yoLmpSLHdyBaBVB4BPX1JwFbyKFdTLQG7nBgthqDB/FZT/9n/qerB7IXrBxwSC Svlsx79p82UoPUOO1GcPE6Po3BUTl2tyoFzwMWuSReZSjBE9h1oRw2AEfCMePHeQ418Z e3+8AUAL2KAUAaHH6+Mqx0gFkmhqxjYjkb+NfYLzd/muaqAwWaYgwGTONnnIvl1yhqx5 rG3Q== X-Gm-Message-State: AOJu0Yx8X1iD8+/r4eID0gAnY7wp4TXnd1HAIzlRjNBoin0XcIqzw3QS xRRb82eys6XJJRyGB0rQsykZG0JbNWvBDQpNbRcRU06OKRo+q9FsHK4V4BkpPHCQCXF6z81NO99 C2xnTOQiVJ6na/b2oOdOxyvzAl9VfgiLoQhBAhW6Q X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035185wma.230.1705329191024; Mon, 15 Jan 2024 06:33:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IGnFpNvbECPYnHXUb6ozmA7yyk68z6lU24Rulo6C/Itudf1qtyIV6rA40/SMTmfGJac297SBQ== X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035169wma.230.1705329190506; Mon, 15 Jan 2024 06:33:10 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id o8-20020a05600c4fc800b0040e549c77a1sm20056078wmq.32.2024.01.15.06.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:33:10 -0800 (PST) Date: Mon, 15 Jan 2024 15:33:08 +0100 From: Sebastian Wick To: Maxime Ripard Cc: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Daniel Vetter , Emma Anholt , Jonathan Corbet , Sandy Huang , Heiko =?iso-8859-1?Q?St=FCbner?= , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Hans Verkuil , linux-rockchip@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Subject: Re: [PATCH v5 08/44] drm/connector: hdmi: Add Broadcast RGB property Message-ID: <20240115143308.GA159345@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> MIME-Version: 1.0 In-Reply-To: <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240115_063503_450198_BA638DC8 X-CRM114-Status: GOOD ( 41.22 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org T24gVGh1LCBEZWMgMDcsIDIwMjMgYXQgMDQ6NDk6MzFQTSArMDEwMCwgTWF4aW1lIFJpcGFyZCB3 cm90ZToKPiBUaGUgaTkxNSBkcml2ZXIgaGFzIGEgcHJvcGVydHkgdG8gZm9yY2UgdGhlIFJHQiBy YW5nZSBvZiBhbiBIRE1JIG91dHB1dC4KPiBUaGUgdmM0IGRyaXZlciB0aGVuIGltcGxlbWVudGVk IHRoZSBzYW1lIHByb3BlcnR5IHdpdGggdGhlIHNhbWUKPiBzZW1hbnRpY3MuIEtXaW4gaGFzIHN1 cHBvcnQgZm9yIGl0LCBhbmQgYSBQUiBmb3IgbXV0dGVyIGlzIGFsc28gdGhlcmUgdG8KPiBzdXBw b3J0IGl0Lgo+IAo+IEJvdGggZHJpdmVycyBpbXBsZW1lbnRpbmcgdGhlIHNhbWUgcHJvcGVydHkg d2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MsCj4gcGx1cyB0aGUgdXNlcnNwYWNlIGhhdmluZyBzdXBw b3J0IGZvciBpdCwgaXMgcHJvb2YgZW5vdWdoIHRoYXQgaXQncwo+IHByZXR0eSBtdWNoIGEgZGUt ZmFjdG8gc3RhbmRhcmQgbm93IGFuZCB3ZSBjYW4gcHJvdmlkZSBoZWxwZXJzIGZvciBpdC4KPiAK PiBMZXQncyBwbHVtYiBpdCBpbnRvIHRoZSBuZXdseSBjcmVhdGVkIEhETUkgY29ubmVjdG9yLgo+ IAo+IFNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1yaXBhcmRAa2VybmVsLm9yZz4KPiAt LS0KPiAgRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2ICAgICAgICAgICAgICAg fCAgIDEgLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jICAgICAgICAgICAgICAgICAg ICAgICB8ICAgNSArCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3N0YXRlX2hlbHBlci5j ICAgICAgICAgIHwgIDE3ICsKPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jICAg ICAgICAgICAgICAgICAgfCAgIDQgKwo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5j ICAgICAgICAgICAgICAgICAgICB8ICA3NiArKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vdGVzdHMv TWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gIC4uLi9ncHUvZHJtL3Rlc3Rz L2RybV9hdG9taWNfc3RhdGVfaGVscGVyX3Rlc3QuYyAgIHwgMzc2ICsrKysrKysrKysrKysrKysr KysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2Nvbm5lY3Rvcl90ZXN0LmMgICAgICAg ICB8IDExNyArKysrKystCj4gIGRyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fa3VuaXRfZWRpZC5o ICAgICAgICAgICAgIHwgMTA2ICsrKysrKwo+ICBpbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmgg ICAgICAgICAgICAgICAgICAgICAgICB8ICAzNiArKwo+ICAxMCBmaWxlcyBjaGFuZ2VkLCA3Mzcg aW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRh dGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2IGIvRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3Bl cnRpZXMuY3N2Cj4gaW5kZXggMGY5NTkwODM0ODI5Li5jYWVmMTRjNTMyZDQgMTAwNjQ0Cj4gLS0t IGEvRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2Cj4gKysrIGIvRG9jdW1lbnRh dGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2Cj4gQEAgLTE3LDcgKzE3LDYgQEAgT3duZXIgTW9k dWxlL0RyaXZlcnMsR3JvdXAsUHJvcGVydHkgTmFtZSxUeXBlLFByb3BlcnR5IFZhbHVlcyxPYmpl Y3QgYXR0YWNoZWQsRGUKPiAgLFZpcnR1YWwgR1BVLOKAnHN1Z2dlc3RlZCBY4oCdLFJBTkdFLCJN aW49MCwgTWF4PTB4ZmZmZmZmZmYiLENvbm5lY3Rvcixwcm9wZXJ0eSB0byBzdWdnZXN0IGFuIFgg b2Zmc2V0IGZvciBhIGNvbm5lY3Rvcgo+ICAsLOKAnHN1Z2dlc3RlZCBZ4oCdLFJBTkdFLCJNaW49 MCwgTWF4PTB4ZmZmZmZmZmYiLENvbm5lY3Rvcixwcm9wZXJ0eSB0byBzdWdnZXN0IGFuIFkgb2Zm c2V0IGZvciBhIGNvbm5lY3Rvcgo+ICAsT3B0aW9uYWwsIiIiYXNwZWN0IHJhdGlvIiIiLEVOVU0s InsgIiJOb25lIiIsICIiNDozIiIsICIiMTY6OSIiIH0iLENvbm5lY3RvcixUREIKPiAtaTkxNSxH ZW5lcmljLCIiIkJyb2FkY2FzdCBSR0IiIiIsRU5VTSwieyAiIkF1dG9tYXRpYyIiLCAiIkZ1bGwi IiwgIiJMaW1pdGVkIDE2OjIzNSIiIH0iLENvbm5lY3RvciwiV2hlbiB0aGlzIHByb3BlcnR5IGlz IHNldCB0byBMaW1pdGVkIDE2OjIzNSBhbmQgQ1RNIGlzIHNldCwgdGhlIGhhcmR3YXJlIHdpbGwg YmUgcHJvZ3JhbW1lZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIG9mIENU TSBieSB0aGUgbGltaXRlZCByYW5nZSBtYXRyaXggdG8gZW5zdXJlIHRoZSBwaXhlbHMgbm9ybWFs bHkgaW4gdGhlIHJhbmdlIDAuLjEuMCBhcmUgcmVtYXBwZWQgdG8gdGhlIHJhbmdlIDE2LzI1NS4u MjM1LzI1NS4iCj4gICws4oCcYXVkaW/igJ0sRU5VTSwieyAiImZvcmNlLWR2aSIiLCAiIm9mZiIi LCAiImF1dG8iIiwgIiJvbiIiIH0iLENvbm5lY3RvcixUQkQKPiAgLFNEVk8tVFYs4oCcbW9kZeKA nSxFTlVNLCJ7ICIiTlRTQ19NIiIsICIiTlRTQ19KIiIsICIiTlRTQ180NDMiIiwgIiJQQUxfQiIi IH0gZXRjLiIsQ29ubmVjdG9yLFRCRAo+ICAsLCIiImxlZnRfbWFyZ2luIiIiLFJBTkdFLCJNaW49 MCwgTWF4PSBTRFZPIGRlcGVuZGVudCIsQ29ubmVjdG9yLFRCRAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+ IGluZGV4IGMzMWZjMGI0OGMzMS4uMTQ2NWE3ZjA5YTBiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9kcm1fYXRvbWljLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5j Cj4gQEAgLTExNDIsNiArMTE0MiwxMSBAQCBzdGF0aWMgdm9pZCBkcm1fYXRvbWljX2Nvbm5lY3Rv cl9wcmludF9zdGF0ZShzdHJ1Y3QgZHJtX3ByaW50ZXIgKnAsCj4gIAlkcm1fcHJpbnRmKHAsICJc dG1heF9yZXF1ZXN0ZWRfYnBjPSVkXG4iLCBzdGF0ZS0+bWF4X3JlcXVlc3RlZF9icGMpOwo+ICAJ ZHJtX3ByaW50ZihwLCAiXHRjb2xvcnNwYWNlPSVzXG4iLCBkcm1fZ2V0X2NvbG9yc3BhY2VfbmFt ZShzdGF0ZS0+Y29sb3JzcGFjZSkpOwo+ICAKPiArCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90 eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSB8fAo+ICsJICAgIGNvbm5lY3Rvci0+Y29u bmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlCKQo+ICsJCWRybV9wcmludGYo cCwgIlx0YnJvYWRjYXN0X3JnYj0lc1xuIiwKPiArCQkJICAgZHJtX2hkbWlfY29ubmVjdG9yX2dl dF9icm9hZGNhc3RfcmdiX25hbWUoc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYikpOwo+ICsKPiAg CWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9XUklU RUJBQ0spCj4gIAkJaWYgKHN0YXRlLT53cml0ZWJhY2tfam9iICYmIHN0YXRlLT53cml0ZWJhY2tf am9iLT5mYikKPiAgCQkJZHJtX3ByaW50ZihwLCAiXHRmYj0lZFxuIiwgc3RhdGUtPndyaXRlYmFj a19qb2ItPmZiLT5iYXNlLmlkKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9h dG9taWNfc3RhdGVfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0ZV9o ZWxwZXIuYwo+IGluZGV4IGU2OWMwY2MxYzZkYS4uMTBkOTg2MjBhMzU4IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3N0YXRlX2hlbHBlci5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9hdG9taWNfc3RhdGVfaGVscGVyLmMKPiBAQCAtNTgzLDYgKzU4Myw3IEBA IEVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3R2X3Jlc2V0KTsKPiAg dm9pZCBfX2RybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0KHN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3IsCj4gIAkJCQkJICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jf c3RhdGUgKm5ld19zdGF0ZSkKPiAgewo+ICsJbmV3X3N0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2Ig PSBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE87Cj4gIH0KPiAgRVhQT1JUX1NZTUJPTChfX2Ry bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0KTsKPiAgCj4gQEAgLTY1MCw2ICs2 NTEsMjIgQEAgRVhQT1JUX1NZTUJPTChkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfdHZfY2hl Y2spOwo+ICBpbnQgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2soc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiAgCQkJCQkgICBzdHJ1Y3QgZHJtX2F0b21pY19z dGF0ZSAqc3RhdGUpCj4gIHsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpvbGRfc3Rh dGUgPQo+ICsJCWRybV9hdG9taWNfZ2V0X29sZF9jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5l Y3Rvcik7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0YXRlID0KPiArCQlk cm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ICsK PiArCWlmIChvbGRfc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiAhPSBuZXdfc3RhdGUtPmhkbWku YnJvYWRjYXN0X3JnYikgewo+ICsJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IG5ld19zdGF0ZS0+ Y3J0YzsKPiArCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gKwo+ICsJCWNy dGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0YXRlLCBjcnRjKTsKPiArCQlp ZiAoSVNfRVJSKGNydGNfc3RhdGUpKQo+ICsJCQlyZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsK PiArCj4gKwkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKPiArCX0KPiArCj4gIAly ZXR1cm4gMDsKPiAgfQo+ICBFWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rv cl9oZG1pX2NoZWNrKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNf dWFwaS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCj4gaW5kZXggYWVlNGE2 NWQ0OTU5Li4zZWI0ZjRiYzhiNzEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9h dG9taWNfdWFwaS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCj4g QEAgLTgxOCw2ICs4MTgsOCBAQCBzdGF0aWMgaW50IGRybV9hdG9taWNfY29ubmVjdG9yX3NldF9w cm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ICAJCXN0YXRlLT5tYXhf cmVxdWVzdGVkX2JwYyA9IHZhbDsKPiAgCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVjdG9y LT5wcml2YWN5X3NjcmVlbl9zd19zdGF0ZV9wcm9wZXJ0eSkgewo+ICAJCXN0YXRlLT5wcml2YWN5 X3NjcmVlbl9zd19zdGF0ZSA9IHZhbDsKPiArCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVj dG9yLT5icm9hZGNhc3RfcmdiX3Byb3BlcnR5KSB7Cj4gKwkJc3RhdGUtPmhkbWkuYnJvYWRjYXN0 X3JnYiA9IHZhbDsKPiAgCX0gZWxzZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9w cm9wZXJ0eSkgewo+ICAJCXJldHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9taWNfc2V0X3Byb3Bl cnR5KGNvbm5lY3RvciwKPiAgCQkJCXN0YXRlLCBwcm9wZXJ0eSwgdmFsKTsKPiBAQCAtOTAxLDYg KzkwMyw4IEBAIGRybV9hdG9taWNfY29ubmVjdG9yX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yLAo+ICAJCSp2YWwgPSBzdGF0ZS0+bWF4X3JlcXVlc3RlZF9icGM7 Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5fc3df c3RhdGVfcHJvcGVydHkpIHsKPiAgCQkqdmFsID0gc3RhdGUtPnByaXZhY3lfc2NyZWVuX3N3X3N0 YXRlOwo+ICsJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2Jf cHJvcGVydHkpIHsKPiArCQkqdmFsID0gc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYjsKPiAgCX0g ZWxzZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX2dldF9wcm9wZXJ0eSkgewo+ICAJCXJl dHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9taWNfZ2V0X3Byb3BlcnR5KGNvbm5lY3RvciwKPiAg CQkJCXN0YXRlLCBwcm9wZXJ0eSwgdmFsKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2RybV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiBpbmRl eCBkOTk2MWNjZTgyNDUuLjkyOWIwYTkxMWY2MiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vZHJtX2Nvbm5lY3Rvci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jb25uZWN0b3Iu Ywo+IEBAIC0xMTgzLDYgKzExODMsMjkgQEAgc3RhdGljIGNvbnN0IHUzMiBkcF9jb2xvcnNwYWNl cyA9Cj4gIAlCSVQoRFJNX01PREVfQ09MT1JJTUVUUllfQlQyMDIwX0NZQ0MpIHwKPiAgCUJJVChE Uk1fTU9ERV9DT0xPUklNRVRSWV9CVDIwMjBfWUNDKTsKPiAgCj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgZHJtX3Byb3BfZW51bV9saXN0IGJyb2FkY2FzdF9yZ2JfbmFtZXNbXSA9IHsKPiArCXsgRFJN X0hETUlfQlJPQURDQVNUX1JHQl9BVVRPLCAiQXV0b21hdGljIiB9LAo+ICsJeyBEUk1fSERNSV9C Uk9BRENBU1RfUkdCX0ZVTEwsICJGdWxsIiB9LAo+ICsJeyBEUk1fSERNSV9CUk9BRENBU1RfUkdC X0xJTUlURUQsICJMaW1pdGVkIDE2OjIzNSIgfSwKPiArfTsKPiArCj4gKy8qCj4gKyAqIGRybV9o ZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lIC0gUmV0dXJuIGEgc3RyaW5nIGZv ciBIRE1JIGNvbm5lY3RvciBSR0IgYnJvYWRjYXN0IHNlbGVjdGlvbgo+ICsgKiBAYnJvYWRjYXN0 X3JnYjogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdG8gY29tcHV0ZSBuYW1lIG9mCj4gKyAqCj4g KyAqIFJldHVybnM6IHRoZSBuYW1lIG9mIHRoZSBCcm9hZGNhc3QgUkdCIHNlbGVjdGlvbiwgb3Ig TlVMTCBpZiB0aGUgdHlwZQo+ICsgKiBpcyBub3QgdmFsaWQuCj4gKyAqLwo+ICtjb25zdCBjaGFy ICoKPiArZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWUoZW51bSBkcm1f aGRtaV9icm9hZGNhc3RfcmdiIGJyb2FkY2FzdF9yZ2IpCj4gK3sKPiArCWlmIChicm9hZGNhc3Rf cmdiID4gRFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVEKQo+ICsJCXJldHVybiBOVUxMOwo+ ICsKPiArCXJldHVybiBicm9hZGNhc3RfcmdiX25hbWVzW2Jyb2FkY2FzdF9yZ2JdLm5hbWU7Cj4g K30KPiArRVhQT1JUX1NZTUJPTChkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2Jf bmFtZSk7Cj4gKwo+ICAvKioKPiAgICogRE9DOiBzdGFuZGFyZCBjb25uZWN0b3IgcHJvcGVydGll cwo+ICAgKgo+IEBAIC0xNjU1LDYgKzE2NzgsMjYgQEAgRVhQT1JUX1NZTUJPTChkcm1fY29ubmVj dG9yX2F0dGFjaF9kcF9zdWJjb25uZWN0b3JfcHJvcGVydHkpOwo+ICAvKioKPiAgICogRE9DOiBI RE1JIGNvbm5lY3RvciBwcm9wZXJ0aWVzCj4gICAqCj4gKyAqIEJyb2FkY2FzdCBSR0IKPiArICog ICAgICBJbmRpY2F0ZXMgdGhlIFJHQiBRdWFudGl6YXRpb24gUmFuZ2UgKEZ1bGwgdnMgTGltaXRl ZCkgdXNlZC4KPiArICogICAgICBJbmZvZnJhbWVzIHdpbGwgYmUgZ2VuZXJhdGVkIGFjY29yZGlu ZyB0byB0aGF0IHZhbHVlLgo+ICsgKgo+ICsgKiAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3Bl cnR5IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKPiArICoKPiArICogICAgICBBdXRvbWF0 aWM6Cj4gKyAqICAgICAgICAgICAgICBSR0IgUmFuZ2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxs eSBiYXNlZCBvbiB0aGUgbW9kZQo+ICsgKiAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBI RE1JIHNwZWNpZmljYXRpb25zLgo+ICsgKgo+ICsgKiAgICAgIEZ1bGw6Cj4gKyAqICAgICAgICAg ICAgICBGdWxsIFJHQiBSYW5nZSBpcyBmb3JjZWQuCj4gKyAqCj4gKyAqICAgICAgTGltaXRlZCAx NjoyMzU6Cj4gKyAqICAgICAgICAgICAgICBMaW1pdGVkIFJHQiBSYW5nZSBpcyBmb3JjZWQuIFVu bGlrZSB0aGUgbmFtZSBzdWdnZXN0cywKPiArICogICAgICAgICAgICAgIHRoaXMgd29ya3MgZm9y IGFueSBudW1iZXIgb2YgYml0cy1wZXItY29tcG9uZW50Lgo+ICsgKgo+ICsgKiAgICAgIERyaXZl cnMgY2FuIHNldCB1cCB0aGlzIHByb3BlcnR5IGJ5IGNhbGxpbmcKPiArICogICAgICBkcm1fY29u bmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5KCkuCj4gKyAqCgpUaGlzIGlzIGEg Z29vZCB0aW1lIHRvIGRvY3VtZW50IHRoaXMgaW4gbW9yZSBkZXRhaWwuIFRoZXJlIG1pZ2h0IGJl IHR3bwpkaWZmZXJlbnQgdGhpbmdzIGJlaW5nIGFmZmVjdGVkOgoKMS4gVGhlIHNpZ25hbGxpbmcg KEluZm9GcmFtZS9TRFAvLi4uKQoyLiBUaGUgY29sb3IgcGlwZWxpbmUgcHJvY2Vzc2luZwoKQWxs IHZhbHVlcyBvZiBCcm9hZGNhc3QgUkdCIGFsd2F5cyBhZmZlY3QgdGhlIGNvbG9yIHBpcGVsaW5l IHByb2Nlc3NpbmcKc3VjaCB0aGF0IGEgZnVsbC1yYW5nZSBpbnB1dCB0byB0aGUgQ1JUQyBpcyBj b252ZXJ0ZWQgdG8gZWl0aGVyIGZ1bGwtIG9yCmxpbWl0ZWQtcmFuZ2UsIGRlcGVuZGluZyBvbiB3 aGF0IHRoZSBtb25pdG9yIGlzIHN1cHBvc2VkIHRvIGFjY2VwdC4KCldoZW4gYXV0b21hdGljIGlz IHNlbGVjdGVkLCBkb2VzIHRoYXQgbWVhbiB0aGF0IHRoZXJlIGlzIG5vIHNpZ25hbGxpbmcsCm9y IHRoYXQgdGhlIHNpZ25hbGxpbmcgbWF0Y2hlcyB3aGF0IHRoZSBtb25pdG9yIGlzIHN1cHBvc2Vk IHRvIGFjY2VwdAphY2NvcmRpbmcgdG8gdGhlIHNwZWM/IEFsc28sIGlzIHRoaXMgcmVhbGx5IEhE TUkgc3BlY2lmaWM/CgpXaGVuIGZ1bGwgb3IgbGltaXRlZCBpcyBzZWxlY3RlZCBhbmQgdGhlIG1v bml0b3IgZG9lc24ndCBzdXBwb3J0IHRoZQpzaWduYWxsaW5nLCB3aGF0IGhhcHBlbnM/Cgo+ICAg KiBjb250ZW50IHR5cGUgKEhETUkgc3BlY2lmaWMpOgo+ICAgKglJbmRpY2F0ZXMgY29udGVudCB0 eXBlIHNldHRpbmcgdG8gYmUgdXNlZCBpbiBIRE1JIGluZm9mcmFtZXMgdG8gaW5kaWNhdGUKPiAg ICoJY29udGVudCB0eXBlIGZvciB0aGUgZXh0ZXJuYWwgZGV2aWNlLCBzbyB0aGF0IGl0IGFkanVz dHMgaXRzIGRpc3BsYXkKPiBAQCAtMjUxNyw2ICsyNTYwLDM5IEBAIGludCBkcm1fY29ubmVjdG9y X2F0dGFjaF9oZHJfb3V0cHV0X21ldGFkYXRhX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uCj4gIH0KPiAgRVhQT1JUX1NZTUJPTChkcm1fY29ubmVjdG9yX2F0dGFjaF9oZHJfb3V0 cHV0X21ldGFkYXRhX3Byb3BlcnR5KTsKPiAgCj4gKy8qKgo+ICsgKiBkcm1fY29ubmVjdG9yX2F0 dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5IC0gYXR0YWNoICJCcm9hZGNhc3QgUkdCIiBwcm9w ZXJ0eQo+ICsgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gYXR0YWNoIHRoZSBwcm9wZXJ0eSBv bi4KPiArICoKPiArICogVGhpcyBpcyB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciBmb3JjaW5nIHRo ZSBSR0IgcmFuZ2Ugb24gYSBjb25uZWN0b3IKPiArICoKPiArICogUmV0dXJuczoKPiArICogWmVy byBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgo+ICsgKi8KPiAraW50IGRy bV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5l Y3Rvci0+ZGV2Owo+ICsJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcDsKPiArCj4gKwlwcm9wID0g Y29ubmVjdG9yLT5icm9hZGNhc3RfcmdiX3Byb3BlcnR5Owo+ICsJaWYgKCFwcm9wKSB7Cj4gKwkJ cHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSwK PiArCQkJCQkJIkJyb2FkY2FzdCBSR0IiLAo+ICsJCQkJCQlicm9hZGNhc3RfcmdiX25hbWVzLAo+ ICsJCQkJCQlBUlJBWV9TSVpFKGJyb2FkY2FzdF9yZ2JfbmFtZXMpKTsKPiArCQlpZiAoIXByb3Ap Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCQljb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2Jf cHJvcGVydHkgPSBwcm9wOwo+ICsJfQo+ICsKPiArCWRybV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5 KCZjb25uZWN0b3ItPmJhc2UsIHByb3AsCj4gKwkJCQkgICBEUk1fSERNSV9CUk9BRENBU1RfUkdC X0FVVE8pOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2Nvbm5l Y3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSk7Cj4gKwo+ICAvKioKPiAgICogZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfY29sb3JzcGFjZV9wcm9wZXJ0eSAtIGF0dGFjaCAiQ29sb3JzcGFj ZSIgcHJvcGVydHkKPiAgICogQGNvbm5lY3RvcjogY29ubmVjdG9yIHRvIGF0dGFjaCB0aGUgcHJv cGVydHkgb24uCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZSBi L2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZQo+IGluZGV4IGQ2MTgzYjNkNzY4OC4uYjI5 ZGRmZDkwNTk2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZQo+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZQo+IEBAIC00LDYgKzQsNyBAQCBv YmotJChDT05GSUdfRFJNX0tVTklUX1RFU1RfSEVMUEVSUykgKz0gXAo+ICAJZHJtX2t1bml0X2hl bHBlcnMubwo+ICAKPiAgb2JqLSQoQ09ORklHX0RSTV9LVU5JVF9URVNUKSArPSBcCj4gKwlkcm1f YXRvbWljX3N0YXRlX2hlbHBlcl90ZXN0Lm8gXAo+ICAJZHJtX2J1ZGR5X3Rlc3QubyBcCj4gIAlk cm1fY21kbGluZV9wYXJzZXJfdGVzdC5vIFwKPiAgCWRybV9jb25uZWN0b3JfdGVzdC5vIFwKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9hdG9taWNfc3RhdGVfaGVscGVy X3Rlc3QuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fYXRvbWljX3N0YXRlX2hlbHBlcl90 ZXN0LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjFlNmY3 OTZlZTEzCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1f YXRvbWljX3N0YXRlX2hlbHBlcl90ZXN0LmMKPiBAQCAtMCwwICsxLDM3NiBAQAo+ICsvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsKPiArLyoKPiArICogS3VuaXQgdGVzdCBm b3IgZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIgZnVuY3Rpb25zCj4gKyAqLwo+ICsKPiArI2luY2x1 ZGUgPGRybS9kcm1fYXRvbWljLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19zdGF0ZV9o ZWxwZXIuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX3VhcGkuaD4KPiArI2luY2x1ZGUg PGRybS9kcm1fZHJ2Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2VkaWQuaD4KPiArI2luY2x1ZGUg PGRybS9kcm1fY29ubmVjdG9yLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2ZvdXJjYy5oPgo+ICsj aW5jbHVkZSA8ZHJtL2RybV9rdW5pdF9oZWxwZXJzLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX21h bmFnZWQuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oPgo+ ICsjaW5jbHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiArCj4gKyNpbmNsdWRlIDxkcm0v ZHJtX3ByaW50Lmg+Cj4gKyNpbmNsdWRlICIuLi9kcm1fY3J0Y19pbnRlcm5hbC5oIgo+ICsKPiAr I2luY2x1ZGUgPGt1bml0L3Rlc3QuaD4KPiArCj4gKyNpbmNsdWRlICJkcm1fa3VuaXRfZWRpZC5o Igo+ICsKPiArc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgewo+ ICsJc3RydWN0IGRybV9kZXZpY2UgZHJtOwo+ICsJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7Cj4g KwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Cj4gKwlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsK PiArCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKPiArCj4gKwljb25zdCBjaGFyICpj dXJyZW50X2VkaWQ7Cj4gKwlzaXplX3QgY3VycmVudF9lZGlkX2xlbjsKPiArfTsKPiArCj4gKyNk ZWZpbmUgY29ubmVjdG9yX3RvX3ByaXYoYykgXAo+ICsJY29udGFpbmVyX29mX2NvbnN0KGMsIHN0 cnVjdCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2LCBjb25uZWN0b3IpCj4g Kwo+ICtzdGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmZpbmRfcHJlZmVycmVkX21vZGUo c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJc3RydWN0IGRybV9kZXZp Y2UgKmRybSA9IGNvbm5lY3Rvci0+ZGV2Owo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGUsICpwcmVmZXJyZWQ7Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZHJtLT5tb2RlX2NvbmZpZy5tdXRl eCk7Cj4gKwlwcmVmZXJyZWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjb25uZWN0b3ItPm1vZGVzLCBz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSwgaGVhZCk7Cj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1v ZGUsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKQo+ICsJCWlmIChtb2RlLT50eXBlICYgRFJNX01P REVfVFlQRV9QUkVGRVJSRUQpCj4gKwkJCXByZWZlcnJlZCA9IG1vZGU7Cj4gKwltdXRleF91bmxv Y2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ICsKPiArCXJldHVybiBwcmVmZXJyZWQ7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgbGlnaHRfdXBfY29ubmVjdG9yKHN0cnVjdCBrdW5pdCAqdGVz dCwKPiArCQkJICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRybSwKPiArCQkJICAgICAgc3RydWN0 IGRybV9jcnRjICpjcnRjLAo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLAo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiArCQkJICAg ICAgc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpCj4gK3sKPiArCXN0cnVjdCBk cm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpj b25uX3N0YXRlOwo+ICsJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ICsJaW50 IHJldDsKPiArCj4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRlX2FsbG9j KHRlc3QsIGRybSwgY3R4KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwg c3RhdGUpOwo+ICsKPiArCWNvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jb25uZWN0b3Jfc3Rh dGUoc3RhdGUsIGNvbm5lY3Rvcik7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRl c3QsIGNvbm5fc3RhdGUpOwo+ICsKPiArCXJldCA9IGRybV9hdG9taWNfc2V0X2NydGNfZm9yX2Nv bm5lY3Rvcihjb25uX3N0YXRlLCBjcnRjKTsKPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCByZXQs IDApOwo+ICsKPiArCWNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0YXRl LCBjcnRjKTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgY3J0Y19zdGF0 ZSk7Cj4gKwo+ICsJcmV0ID0gZHJtX2F0b21pY19zZXRfbW9kZV9mb3JfY3J0YyhjcnRjX3N0YXRl LCBtb2RlKTsKPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCByZXQsIDApOwo+ICsKPiArCWNydGNf c3RhdGUtPmVuYWJsZSA9IHRydWU7Cj4gKwljcnRjX3N0YXRlLT5hY3RpdmUgPSB0cnVlOwo+ICsK PiArCXJldCA9IGRybV9hdG9taWNfY29tbWl0KHN0YXRlKTsKPiArCUtVTklUX0FTU0VSVF9FUSh0 ZXN0LCByZXQsIDApOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNl dF9jb25uZWN0b3JfZWRpZChzdHJ1Y3Qga3VuaXQgKnRlc3QsIHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsCj4gKwkJCSAgICAgIGNvbnN0IGNoYXIgKmVkaWQsIHNpemVfdCBlZGlkX2xl bikKPiArewo+ICsJc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYg KnByaXYgPQo+ICsJCWNvbm5lY3Rvcl90b19wcml2KGNvbm5lY3Rvcik7Cj4gKwlzdHJ1Y3QgZHJt X2RldmljZSAqZHJtID0gY29ubmVjdG9yLT5kZXY7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXByaXYt PmN1cnJlbnRfZWRpZCA9IGVkaWQ7Cj4gKwlwcml2LT5jdXJyZW50X2VkaWRfbGVuID0gZWRpZF9s ZW47Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZHJtLT5tb2RlX2NvbmZpZy5tdXRleCk7Cj4gKwlyZXQg PSBjb25uZWN0b3ItPmZ1bmNzLT5maWxsX21vZGVzKGNvbm5lY3RvciwgNDA5NiwgNDA5Nik7Cj4g KwltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ICsJS1VOSVRfQVNTRVJU X0dUKHRlc3QsIHJldCwgMCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZHVtbXlfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJp diAqcHJpdiA9Cj4gKwkJY29ubmVjdG9yX3RvX3ByaXYoY29ubmVjdG9yKTsKPiArCWNvbnN0IHN0 cnVjdCBkcm1fZWRpZCAqZWRpZDsKPiArCXVuc2lnbmVkIGludCBudW1fbW9kZXM7Cj4gKwo+ICsJ ZWRpZCA9IGRybV9lZGlkX2FsbG9jKHByaXYtPmN1cnJlbnRfZWRpZCwgcHJpdi0+Y3VycmVudF9l ZGlkX2xlbik7Cj4gKwlpZiAoIWVkaWQpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJZHJt X2VkaWRfY29ubmVjdG9yX3VwZGF0ZShjb25uZWN0b3IsIGVkaWQpOwo+ICsJbnVtX21vZGVzID0g ZHJtX2VkaWRfY29ubmVjdG9yX2FkZF9tb2Rlcyhjb25uZWN0b3IpOwo+ICsKPiArCWRybV9lZGlk X2ZyZWUoZWRpZCk7Cj4gKwo+ICsJcmV0dXJuIG51bV9tb2RlczsKPiArfQo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBkdW1teV9jb25uZWN0b3Jf aGVscGVyX2Z1bmNzID0gewo+ICsJLmF0b21pY19jaGVjawk9IGRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX2NoZWNrLAo+ICsJLmdldF9tb2Rlcwk9IGR1bW15X2Nvbm5lY3Rvcl9nZXRf bW9kZXMsCj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCBkdW1teV9oZG1pX2Nvbm5lY3Rvcl9yZXNl dChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlkcm1fYXRvbWljX2hl bHBlcl9jb25uZWN0b3JfcmVzZXQoY29ubmVjdG9yKTsKPiArCV9fZHJtX2F0b21pY19oZWxwZXJf Y29ubmVjdG9yX2hkbWlfcmVzZXQoY29ubmVjdG9yLCBjb25uZWN0b3ItPnN0YXRlKTsKPiArfQo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGR1bW15X2Nvbm5l Y3Rvcl9mdW5jcyA9IHsKPiArCS5hdG9taWNfZGVzdHJveV9zdGF0ZQk9IGRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlLAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUJ PSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsJLmZpbGxf bW9kZXMJCT0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAo+ICsJLnJl c2V0CQkJPSBkdW1teV9oZG1pX2Nvbm5lY3Rvcl9yZXNldCwKPiArfTsKPiArCj4gK3N0YXRpYwo+ ICtzdHJ1Y3QgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqCj4gK2RybV9h dG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KQo+ICt7 Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsK PiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uOwo+ICsJc3RydWN0IGRybV9lbmNvZGVyICpl bmM7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOwo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ ICsJaW50IHJldDsKPiArCj4gKwlkZXYgPSBkcm1fa3VuaXRfaGVscGVyX2FsbG9jX2RldmljZSh0 ZXN0KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgZGV2KTsKPiArCj4g Kwlwcml2ID0gZHJtX2t1bml0X2hlbHBlcl9hbGxvY19kcm1fZGV2aWNlKHRlc3QsIGRldiwKPiAr CQkJCQkJIHN0cnVjdCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2LCBkcm0s Cj4gKwkJCQkJCSBEUklWRVJfTU9ERVNFVCB8IERSSVZFUl9BVE9NSUMpOwo+ICsJS1VOSVRfQVNT RVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBwcml2KTsKPiArCXRlc3QtPnByaXYgPSBwcml2Owo+ ICsKPiArCWRybSA9ICZwcml2LT5kcm07Cj4gKwlwcml2LT5wbGFuZSA9IGRybV9rdW5pdF9oZWxw ZXJfY3JlYXRlX3ByaW1hcnlfcGxhbmUodGVzdCwgZHJtLAo+ICsJCQkJCQkJICAgIE5VTEwsCj4g KwkJCQkJCQkgICAgTlVMTCwKPiArCQkJCQkJCSAgICBOVUxMLCAwLAo+ICsJCQkJCQkJICAgIE5V TEwpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBwcml2LT5wbGFuZSk7 Cj4gKwo+ICsJcHJpdi0+Y3J0YyA9IGRybV9rdW5pdF9oZWxwZXJfY3JlYXRlX2NydGModGVzdCwg ZHJtLAo+ICsJCQkJCQkgIHByaXYtPnBsYW5lLCBOVUxMLAo+ICsJCQkJCQkgIE5VTEwsCj4gKwkJ CQkJCSAgTlVMTCk7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHByaXYt PmNydGMpOwo+ICsKPiArCWVuYyA9ICZwcml2LT5lbmNvZGVyOwo+ICsJcmV0ID0gZHJtbV9lbmNv ZGVyX2luaXQoZHJtLCBlbmMsIE5VTEwsIERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7Cj4g KwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiArCj4gKwllbmMtPnBvc3NpYmxlX2Ny dGNzID0gZHJtX2NydGNfbWFzayhwcml2LT5jcnRjKTsKPiArCj4gKwljb25uID0gJnByaXYtPmNv bm5lY3RvcjsKPiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdChkcm0sIGNvbm4sCj4g KwkJCQkgICAgICAgJmR1bW15X2Nvbm5lY3Rvcl9mdW5jcywKPiArCQkJCSAgICAgICBEUk1fTU9E RV9DT05ORUNUT1JfSERNSUEsCj4gKwkJCQkgICAgICAgTlVMTCk7Cj4gKwlLVU5JVF9BU1NFUlRf RVEodGVzdCwgcmV0LCAwKTsKPiArCj4gKwlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubiwg JmR1bW15X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwo+ICsJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hf ZW5jb2Rlcihjb25uLCBlbmMpOwo+ICsKPiArCWRybV9tb2RlX2NvbmZpZ19yZXNldChkcm0pOwo+ ICsKPiArCXJldCA9IHNldF9jb25uZWN0b3JfZWRpZCh0ZXN0LCBjb25uLAo+ICsJCQkJIHRlc3Rf ZWRpZF9oZG1pXzEwODBwX3JnYl9tYXhfMjAwbWh6LAo+ICsJCQkJIEFSUkFZX1NJWkUodGVzdF9l ZGlkX2hkbWlfMTA4MHBfcmdiX21heF8yMDBtaHopKTsKPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0 LCByZXQsIDApOwo+ICsKPiArCXJldHVybiBwcml2Owo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBUZXN0 IHRoYXQgaWYgd2UgY2hhbmdlIHRoZSBSR0IgcXVhbnRpemF0aW9uIHByb3BlcnR5IHRvIGEgZGlm ZmVyZW50Cj4gKyAqIHZhbHVlLCB3ZSB0cmlnZ2VyIGEgbW9kZSBjaGFuZ2Ugb24gdGhlIGNvbm5l Y3RvcidzIENSVEMsIHdoaWNoIHdpbGwKPiArICogaW4gdHVybiBkaXNhYmxlL2VuYWJsZSB0aGUg Y29ubmVjdG9yLgo+ICsgKi8KPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0 X3JnYl9jcnRjX21vZGVfY2hhbmdlZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gK3sKPiArCXN0cnVj dCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2ICpwcml2Owo+ICsJc3RydWN0 IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHg7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9z dGF0ZSAqb2xkX2Nvbm5fc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3 X2Nvbm5fc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gKwlz dHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqcHJlZmVycmVkOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47Cj4gKwlzdHJ1Y3Qg ZHJtX2RldmljZSAqZHJtOwo+ICsJc3RydWN0IGRybV9jcnRjICpjcnRjOwo+ICsJaW50IHJldDsK PiArCj4gKwlwcml2ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfaW5pdCh0ZXN0 KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcml2KTsKPiArCj4gKwljdHggPSBk cm1fa3VuaXRfaGVscGVyX2FjcXVpcmVfY3R4X2FsbG9jKHRlc3QpOwo+ICsJS1VOSVRfQVNTRVJU X05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjdHgpOwo+ICsKPiArCWNvbm4gPSAmcHJpdi0+Y29ubmVj dG9yOwo+ICsJcHJlZmVycmVkID0gZmluZF9wcmVmZXJyZWRfbW9kZShjb25uKTsKPiArCUtVTklU X0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcmVmZXJyZWQpOwo+ICsKPiArCWRybSA9ICZwcml2LT5k cm07Cj4gKwljcnRjID0gcHJpdi0+Y3J0YzsKPiArCXJldCA9IGxpZ2h0X3VwX2Nvbm5lY3Rvcih0 ZXN0LCBkcm0sIGNydGMsIGNvbm4sIHByZWZlcnJlZCwgY3R4KTsKPiArCUtVTklUX0FTU0VSVF9F USh0ZXN0LCByZXQsIDApOwo+ICsKPiArCXN0YXRlID0gZHJtX2t1bml0X2hlbHBlcl9hdG9taWNf c3RhdGVfYWxsb2ModGVzdCwgZHJtLCBjdHgpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1Jf TlVMTCh0ZXN0LCBzdGF0ZSk7Cj4gKwo+ICsJbmV3X2Nvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dl dF9jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJf T1JfTlVMTCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gKwo+ICsJb2xkX2Nvbm5fc3RhdGUgPSBk cm1fYXRvbWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiArCUtVTklU X0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ICsKPiArCW5l d19jb25uX3N0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2IgPSBEUk1fSERNSV9CUk9BRENBU1RfUkdC X0ZVTEw7Cj4gKwo+ICsJS1VOSVRfQVNTRVJUX05FKHRlc3QsCj4gKwkJCW9sZF9jb25uX3N0YXRl LT5oZG1pLmJyb2FkY2FzdF9yZ2IsCj4gKwkJCW5ld19jb25uX3N0YXRlLT5oZG1pLmJyb2FkY2Fz dF9yZ2IpOwo+ICsKPiArCXJldCA9IGRybV9hdG9taWNfY2hlY2tfb25seShzdGF0ZSk7Cj4gKwlL VU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiArCj4gKwluZXdfY29ubl9zdGF0ZSA9IGRy bV9hdG9taWNfZ2V0X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ICsJS1VOSVRf QVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gKwlLVU5JVF9F WFBFQ1RfRVEodGVzdCwgbmV3X2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiwgRFJNX0hE TUlfQlJPQURDQVNUX1JHQl9GVUxMKTsKPiArCj4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19n ZXRfbmV3X2NydGNfc3RhdGUoc3RhdGUsIGNydGMpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJf T1JfTlVMTCh0ZXN0LCBjcnRjX3N0YXRlKTsKPiArCUtVTklUX0VYUEVDVF9UUlVFKHRlc3QsIGNy dGNfc3RhdGUtPm1vZGVfY2hhbmdlZCk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFRlc3QgdGhhdCBp ZiB3ZSBzZXQgdGhlIFJHQiBxdWFudGl6YXRpb24gcHJvcGVydHkgdG8gdGhlIHNhbWUgdmFsdWUs Cj4gKyAqIHdlIGRvbid0IHRyaWdnZXIgYSBtb2RlIGNoYW5nZSBvbiB0aGUgY29ubmVjdG9yJ3Mg Q1JUQyBhbmQgbGVhdmUgdGhlCj4gKyAqIGNvbm5lY3RvciB1bmFmZmVjdGVkLgo+ICsgKi8KPiAr c3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0X3JnYl9jcnRjX21vZGVfbm90X2No YW5nZWQoc3RydWN0IGt1bml0ICp0ZXN0KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19oZWxw ZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiArCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1 aXJlX2N0eCAqY3R4Owo+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25uX3N0 YXRlOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0YXRlOwo+ICsJ c3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ICsJc3RydWN0IGRybV9hdG9taWNf c3RhdGUgKnN0YXRlOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnByZWZlcnJlZDsKPiAr CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uOwo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRybTsK PiArCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKPiArCWludCByZXQ7Cj4gKwo+ICsJcHJpdiA9IGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2luaXQodGVzdCk7Cj4gKwlLVU5JVF9BU1NF UlRfTk9UX05VTEwodGVzdCwgcHJpdik7Cj4gKwo+ICsJY3R4ID0gZHJtX2t1bml0X2hlbHBlcl9h Y3F1aXJlX2N0eF9hbGxvYyh0ZXN0KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwo dGVzdCwgY3R4KTsKPiArCj4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiArCXByZWZlcnJl ZCA9IGZpbmRfcHJlZmVycmVkX21vZGUoY29ubik7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX05VTEwo dGVzdCwgcHJlZmVycmVkKTsKPiArCj4gKwlkcm0gPSAmcHJpdi0+ZHJtOwo+ICsJY3J0YyA9IHBy aXYtPmNydGM7Cj4gKwlyZXQgPSBsaWdodF91cF9jb25uZWN0b3IodGVzdCwgZHJtLCBjcnRjLCBj b25uLCBwcmVmZXJyZWQsIGN0eCk7Cj4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsK PiArCj4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRlX2FsbG9jKHRlc3Qs IGRybSwgY3R4KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgc3RhdGUp Owo+ICsKPiArCW5ld19jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVjdG9yX3N0YXRl KHN0YXRlLCBjb25uKTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgbmV3 X2Nvbm5fc3RhdGUpOwo+ICsKPiArCW9sZF9jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfb2xk X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9P Ul9OVUxMKHRlc3QsIG9sZF9jb25uX3N0YXRlKTsKPiArCj4gKwluZXdfY29ubl9zdGF0ZS0+aGRt aS5icm9hZGNhc3RfcmdiID0gb2xkX2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYjsKPiAr Cj4gKwlyZXQgPSBkcm1fYXRvbWljX2NoZWNrX29ubHkoc3RhdGUpOwo+ICsJS1VOSVRfQVNTRVJU X0VRKHRlc3QsIHJldCwgMCk7Cj4gKwo+ICsJb2xkX2Nvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dl dF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiArCUtVTklUX0FTU0VSVF9OT1Rf RVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ICsKPiArCW5ld19jb25uX3N0YXRl ID0gZHJtX2F0b21pY19nZXRfbmV3X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gKwlL VU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIG5ld19jb25uX3N0YXRlKTsKPiArCj4g KwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwKPiArCQkJb2xkX2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRj YXN0X3JnYiwKPiArCQkJbmV3X2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYik7Cj4gKwo+ ICsJY3J0Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLCBjcnRj KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgY3J0Y19zdGF0ZSk7Cj4g KwlLVU5JVF9FWFBFQ1RfRkFMU0UodGVzdCwgY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkKTsKPiAr fQo+ICsKPiArc3RhdGljIHN0cnVjdCBrdW5pdF9jYXNlIGRybV9hdG9taWNfaGVscGVyX2Nvbm5l Y3Rvcl9oZG1pX2NoZWNrX3Rlc3RzW10gPSB7Cj4gKwlLVU5JVF9DQVNFKGRybV90ZXN0X2NoZWNr X2Jyb2FkY2FzdF9yZ2JfY3J0Y19tb2RlX2NoYW5nZWQpLAo+ICsJS1VOSVRfQ0FTRShkcm1fdGVz dF9jaGVja19icm9hZGNhc3RfcmdiX2NydGNfbW9kZV9ub3RfY2hhbmdlZCksCj4gKwl7IH0KPiAr fTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfc3VpdGUgZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX2hkbWlfY2hlY2tfdGVzdF9zdWl0ZSA9IHsKPiArCS5uYW1lCQk9ICJkcm1fYXRvbWlj X2hlbHBlcl9jb25uZWN0b3JfaGRtaV9jaGVjayIsCj4gKwkudGVzdF9jYXNlcwk9IGRybV9hdG9t aWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2NoZWNrX3Rlc3RzLAo+ICt9Owo+ICsKPiArLyoKPiAr ICogVGVzdCB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgQnJvYWRjYXN0IFJHQiBwcm9wZXJ0eSBvdXQg b2YgcmVzZXQgaXMgc2V0Cj4gKyAqIHRvIGF1dG8uCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCBkcm1f dGVzdF9jaGVja19icm9hZGNhc3RfcmdiX3ZhbHVlKHN0cnVjdCBrdW5pdCAqdGVzdCkKPiArewo+ ICsJc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKnByaXY7Cj4g KwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZTsKPiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uOwo+ICsKPiArCXByaXYgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0 b3JfaGRtaV9pbml0KHRlc3QpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHByaXYp Owo+ICsKPiArCWNvbm4gPSAmcHJpdi0+Y29ubmVjdG9yOwo+ICsJY29ubl9zdGF0ZSA9IGNvbm4t PnN0YXRlOwo+ICsJS1VOSVRfRVhQRUNUX0VRKHRlc3QsIGNvbm5fc3RhdGUtPmhkbWkuYnJvYWRj YXN0X3JnYiwgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPKTsKPiArfQo+ICsKPiArc3RhdGlj IHN0cnVjdCBrdW5pdF9jYXNlIGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0 X3Rlc3RzW10gPSB7Cj4gKwlLVU5JVF9DQVNFKGRybV90ZXN0X2NoZWNrX2Jyb2FkY2FzdF9yZ2Jf dmFsdWUpLAo+ICsJeyB9Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0X3Rlc3Rfc3VpdGUgPSB7Cj4gKwku bmFtZQkJPSAiZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXQiLAo+ICsJLnRl c3RfY2FzZXMgCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXRfdGVzdHMs Cj4gK307Cj4gKwo+ICtrdW5pdF90ZXN0X3N1aXRlcygKPiArCSZkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfaGRtaV9jaGVja190ZXN0X3N1aXRlLAo+ICsJJmRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX3Jlc2V0X3Rlc3Rfc3VpdGUsCj4gKyk7Cj4gKwo+ICtNT0RVTEVfQVVUSE9S KCJNYXhpbWUgUmlwYXJkIDxtcmlwYXJkQGtlcm5lbC5vcmc+Iik7Cj4gK01PRFVMRV9MSUNFTlNF KCJHUEwiKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0 b3JfdGVzdC5jIGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4g aW5kZXggOGYwNzBjYWNhYjNiLi40MWQzM2RlYTMwYWYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4gQEAgLTEyLDYgKzEyLDggQEAKPiAgCj4gICNp bmNsdWRlIDxrdW5pdC90ZXN0Lmg+Cj4gIAo+ICsjaW5jbHVkZSAiLi4vZHJtX2NydGNfaW50ZXJu YWwuaCIKPiArCj4gIHN0cnVjdCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdiB7Cj4gIAlzdHJ1Y3Qg ZHJtX2RldmljZSBkcm07Cj4gIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Cj4gQEAg LTM1NywxMCArMzU5LDEyMyBAQCBzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRybV9nZXRfdHZf bW9kZV9mcm9tX25hbWVfdGVzdF9zdWl0ZSA9IHsKPiAgCS50ZXN0X2Nhc2VzID0gZHJtX2dldF90 dl9tb2RlX2Zyb21fbmFtZV90ZXN0cywKPiAgfTsKPiAgCj4gK3N0cnVjdCBkcm1faGRtaV9jb25u ZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0IHsKPiArCXVuc2lnbmVkIGludCBraW5k Owo+ICsJY29uc3QgY2hhciAqZXhwZWN0ZWRfbmFtZTsKPiArfTsKPiArCj4gKyNkZWZpbmUgQlJP QURDQVNUX1JHQl9URVNUKF9raW5kLCBfbmFtZSkJXAo+ICsJewkJCQkJXAo+ICsJCS5raW5kID0g X2tpbmQsCQkJXAo+ICsJCS5leHBlY3RlZF9uYW1lID0gX25hbWUsCQlcCj4gKwl9Cj4gKwo+ICtz dGF0aWMgdm9pZCBkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2Jf bmFtZShzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBkcm1faGRtaV9j b25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0ICpwYXJhbXMgPQo+ICsJCXRlc3Qt PnBhcmFtX3ZhbHVlOwo+ICsKPiArCUtVTklUX0VYUEVDVF9TVFJFUSh0ZXN0LAo+ICsJCQkgICBk cm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZShwYXJhbXMtPmtpbmQpLAo+ ICsJCQkgICBwYXJhbXMtPmV4cGVjdGVkX25hbWUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3QK PiArc3RydWN0IGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3Rlc3QK PiArZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWRfdGVzdHNb XSA9IHsKPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE8s ICJBdXRvbWF0aWMiKSwKPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1fSERNSV9CUk9BRENBU1Rf UkdCX0ZVTEwsICJGdWxsIiksCj4gKwlCUk9BRENBU1RfUkdCX1RFU1QoRFJNX0hETUlfQlJPQURD QVNUX1JHQl9MSU1JVEVELCAiTGltaXRlZCAxNjoyMzUiKSwKPiArfTsKPiArCj4gK3N0YXRpYyB2 b2lkCj4gK2RybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3ZhbGlkX2Rl c2MoY29uc3Qgc3RydWN0IGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1l X3Rlc3QgKnQsCj4gKwkJCQkJCSAgICAgY2hhciAqZGVzYykKPiArewo+ICsJc3ByaW50ZihkZXNj LCAiJXMiLCB0LT5leHBlY3RlZF9uYW1lKTsKPiArfQo+ICsKPiArS1VOSVRfQVJSQVlfUEFSQU0o ZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWQsCj4gKwkJICBk cm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV92YWxpZF90ZXN0cywKPiAr CQkgIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3ZhbGlkX2Rlc2Mp Owo+ICsKPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9h ZGNhc3RfcmdiX25hbWVfaW52YWxpZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gK3sKPiArCUtVTklU X0VYUEVDVF9OVUxMKHRlc3QsIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9u YW1lKDMpKTsKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBkcm1faGRtaV9j b25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0c1tdID0gewo+ICsJS1VOSVRfQ0FT RV9QQVJBTShkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFt ZSwKPiArCQkJIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3ZhbGlk X2dlbl9wYXJhbXMpLAo+ICsJS1VOSVRfQ0FTRShkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3Jf Z2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV9pbnZhbGlkKSwKPiArCXsgfQo+ICt9Owo+ICsKPiArc3Rh dGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9y Z2JfbmFtZV90ZXN0X3N1aXRlID0gewo+ICsJLm5hbWUgPSAiZHJtX2hkbWlfY29ubmVjdG9yX2dl dF9icm9hZGNhc3RfcmdiX25hbWUiLAo+ICsJLnRlc3RfY2FzZXMgPSBkcm1faGRtaV9jb25uZWN0 b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0cywKPiArfTsKPiArCj4gK3N0YXRpYyB2b2lk IGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3Ry dWN0IGt1bml0ICp0ZXN0KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9pbml0X3ByaXYg KnByaXYgPSB0ZXN0LT5wcml2Owo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9 ICZwcml2LT5jb25uZWN0b3I7Cj4gKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOwo+ICsJaW50 IHJldDsKPiArCj4gKwlyZXQgPSBkcm1tX2Nvbm5lY3Rvcl9pbml0KCZwcml2LT5kcm0sIGNvbm5l Y3RvciwKPiArCQkJCSAgJmR1bW15X2Z1bmNzLAo+ICsJCQkJICBEUk1fTU9ERV9DT05ORUNUT1Jf SERNSUEsCj4gKwkJCQkgICZwcml2LT5kZGMpOwo+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJl dCwgMCk7Cj4gKwo+ICsJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9w cm9wZXJ0eShjb25uZWN0b3IpOwo+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4g Kwo+ICsJcHJvcCA9IGNvbm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKPiArCUtVTklU X0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcm9wKTsKPiArCUtVTklUX0VYUEVDVF9OT1RfTlVMTCh0 ZXN0LCBkcm1fbW9kZV9vYmpfZmluZF9wcm9wX2lkKCZjb25uZWN0b3ItPmJhc2UsIHByb3AtPmJh c2UuaWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfZHJtX2Nvbm5lY3Rvcl9h dHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eV9oZG1pX2Nvbm5lY3RvcihzdHJ1Y3Qga3VuaXQg KnRlc3QpCj4gK3sKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdiAqcHJpdiA9IHRl c3QtPnByaXY7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJnByaXYtPmNv bm5lY3RvcjsKPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gKwlpbnQgcmV0Owo+ICsK PiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdCgmcHJpdi0+ZHJtLCBjb25uZWN0b3Is Cj4gKwkJCQkgICAgICAgJmR1bW15X2Z1bmNzLAo+ICsJCQkJICAgICAgIERSTV9NT0RFX0NPTk5F Q1RPUl9IRE1JQSwKPiArCQkJCSAgICAgICAmcHJpdi0+ZGRjKTsKPiArCUtVTklUX0VYUEVDVF9F USh0ZXN0LCByZXQsIDApOwo+ICsKPiArCXJldCA9IGRybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2Fk Y2FzdF9yZ2JfcHJvcGVydHkoY29ubmVjdG9yKTsKPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCBy ZXQsIDApOwo+ICsKPiArCXByb3AgPSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7 Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX05VTEwodGVzdCwgcHJvcCk7Cj4gKwlLVU5JVF9FWFBFQ1Rf Tk9UX05VTEwodGVzdCwgZHJtX21vZGVfb2JqX2ZpbmRfcHJvcF9pZCgmY29ubmVjdG9yLT5iYXNl LCBwcm9wLT5iYXNlLmlkKSk7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBk cm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5X3Rlc3RzW10gPSB7Cj4g KwlLVU5JVF9DQVNFKGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2Jf cHJvcGVydHkpLAo+ICsJS1VOSVRfQ0FTRShkcm1fdGVzdF9kcm1fY29ubmVjdG9yX2F0dGFjaF9i cm9hZGNhc3RfcmdiX3Byb3BlcnR5X2hkbWlfY29ubmVjdG9yKSwKPiArCXsgfQo+ICt9Owo+ICsK PiArc3RhdGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBkcm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNh c3RfcmdiX3Byb3BlcnR5X3Rlc3Rfc3VpdGUgPSB7Cj4gKwkubmFtZSA9ICJkcm1fY29ubmVjdG9y X2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5IiwKPiArCS5pbml0ID0gZHJtX3Rlc3RfY29u bmVjdG9yX2luaXQsCj4gKwkudGVzdF9jYXNlcyA9IGRybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2Fk Y2FzdF9yZ2JfcHJvcGVydHlfdGVzdHMsCj4gK307Cj4gKwo+ICBrdW5pdF90ZXN0X3N1aXRlcygK PiAgCSZkcm1tX2Nvbm5lY3Rvcl9oZG1pX2luaXRfdGVzdF9zdWl0ZSwKPiAgCSZkcm1tX2Nvbm5l Y3Rvcl9pbml0X3Rlc3Rfc3VpdGUsCj4gLQkmZHJtX2dldF90dl9tb2RlX2Zyb21fbmFtZV90ZXN0 X3N1aXRlCj4gKwkmZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eV90 ZXN0X3N1aXRlLAo+ICsJJmRybV9nZXRfdHZfbW9kZV9mcm9tX25hbWVfdGVzdF9zdWl0ZSwKPiAr CSZkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0X3N1aXRlCj4g ICk7Cj4gIAo+ICBNT0RVTEVfQVVUSE9SKCJNYXhpbWUgUmlwYXJkIDxtYXhpbWVAY2Vybm8udGVj aD4iKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlk LmggYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2t1bml0X2VkaWQuaAo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4yYmJhMzE2ZGUwNjQKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlkLmgKPiBAQCAt MCwwICsxLDEwNiBAQAo+ICsjaWZuZGVmIERSTV9LVU5JVF9FRElEX0hfCj4gKyNkZWZpbmUgRFJN X0tVTklUX0VESURfSF8KPiArCj4gKy8qCj4gKyAqIGVkaWQtZGVjb2RlIChoZXgpOgo+ICsgKgo+ ICsgKiAwMCBmZiBmZiBmZiBmZiBmZiBmZiAwMCAzMSBkOCAyYSAwMCAwMCAwMCAwMCAwMAo+ICsg KiAwMCAyMSAwMSAwMyA4MSBhMCA1YSA3OCAwMiAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAw MCAwMCAwMCAyMCAwMCAwMCAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMQo+ICsgKiAwMSAw MSAwMSAwMSAwMSAwMSAwMiAzYSA4MCAxOCA3MSAzOCAyZCA0MCA1OCAyYwo+ICsgKiA0NSAwMCA0 MCA4NCA2MyAwMCAwMCAxZSAwMCAwMCAwMCBmYyAwMCA1NCA2NSA3Mwo+ICsgKiA3NCAyMCA0NSA0 NCA0OSA0NCAwYSAyMCAyMCAyMCAwMCAwMCAwMCBmZCAwMCAzMgo+ICsgKiA0NiAxZSA0NiAwZiAw MCAwYSAyMCAyMCAyMCAyMCAyMCAyMCAwMCAwMCAwMCAxMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMSA5Mgo+ICsgKgo+ICsgKiAwMiAwMyAxYiA4MSBl MyAwNSAwMCAyMCA0MSAxMCBlMiAwMCA0YSA2ZCAwMyAwYwo+ICsgKiAwMCAxMiAzNCAwMCAyOCAy MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCBkMAo+ICsgKgo+ICsgKiAtLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIEJs b2NrIDAsIEJhc2UgRURJRDoKPiArICogICBFRElEIFN0cnVjdHVyZSBWZXJzaW9uICYgUmV2aXNp b246IDEuMwo+ICsgKiAgIFZlbmRvciAmIFByb2R1Y3QgSWRlbnRpZmljYXRpb246Cj4gKyAqICAg ICBNYW51ZmFjdHVyZXI6IExOWAo+ICsgKiAgICAgTW9kZWw6IDQyCj4gKyAqICAgICBNYWRlIGlu OiAyMDIzCj4gKyAqICAgQmFzaWMgRGlzcGxheSBQYXJhbWV0ZXJzICYgRmVhdHVyZXM6Cj4gKyAq ICAgICBEaWdpdGFsIGRpc3BsYXkKPiArICogICAgIERGUCAxLnggY29tcGF0aWJsZSBUTURTCj4g KyAqICAgICBNYXhpbXVtIGltYWdlIHNpemU6IDE2MCBjbSB4IDkwIGNtCj4gKyAqICAgICBHYW1t YTogMi4yMAo+ICsgKiAgICAgTW9ub2Nocm9tZSBvciBncmF5c2NhbGUgZGlzcGxheQo+ICsgKiAg ICAgRmlyc3QgZGV0YWlsZWQgdGltaW5nIGlzIHRoZSBwcmVmZXJyZWQgdGltaW5nCj4gKyAqICAg Q29sb3IgQ2hhcmFjdGVyaXN0aWNzOgo+ICsgKiAgICAgUmVkICA6IDAuMDAwMCwgMC4wMDAwCj4g KyAqICAgICBHcmVlbjogMC4wMDAwLCAwLjAwMDAKPiArICogICAgIEJsdWUgOiAwLjAwMDAsIDAu MDAwMAo+ICsgKiAgICAgV2hpdGU6IDAuMDAwMCwgMC4wMDAwCj4gKyAqICAgRXN0YWJsaXNoZWQg VGltaW5ncyBJICYgSUk6Cj4gKyAqICAgICBETVQgMHgwNDogICA2NDB4NDgwICAgIDU5Ljk0MDQ3 NiBIeiAgIDQ6MyAgICAgMzEuNDY5IGtIeiAgICAgMjUuMTc1MDAwIE1Iego+ICsgKiAgIFN0YW5k YXJkIFRpbWluZ3M6IG5vbmUKPiArICogICBEZXRhaWxlZCBUaW1pbmcgRGVzY3JpcHRvcnM6Cj4g KyAqICAgICBEVEQgMTogIDE5MjB4MTA4MCAgIDYwLjAwMDAwMCBIeiAgMTY6OSAgICAgNjcuNTAw IGtIeiAgICAxNDguNTAwMDAwIE1IeiAoMTYwMCBtbSB4IDkwMCBtbSkKPiArICogICAgICAgICAg ICAgICAgICBIZnJvbnQgICA4OCBIc3luYyAgNDQgSGJhY2sgIDE0OCBIcG9sIFAKPiArICogICAg ICAgICAgICAgICAgICBWZnJvbnQgICAgNCBWc3luYyAgIDUgVmJhY2sgICAzNiBWcG9sIFAKPiAr ICogICAgIERpc3BsYXkgUHJvZHVjdCBOYW1lOiAnVGVzdCBFRElEJwo+ICsgKiAgICAgRGlzcGxh eSBSYW5nZSBMaW1pdHM6Cj4gKyAqICAgICAgIE1vbml0b3IgcmFuZ2VzIChHVEYpOiA1MC03MCBI eiBWLCAzMC03MCBrSHogSCwgbWF4IGRvdGNsb2NrIDE1MCBNSHoKPiArICogICAgIER1bW15IERl c2NyaXB0b3I6Cj4gKyAqICAgRXh0ZW5zaW9uIGJsb2NrczogMQo+ICsgKiBDaGVja3N1bTogMHg5 Mgo+ICsgKgo+ICsgKiAtLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIEJsb2NrIDEsIENUQS04 NjEgRXh0ZW5zaW9uIEJsb2NrOgo+ICsgKiAgIFJldmlzaW9uOiAzCj4gKyAqICAgVW5kZXJzY2Fu cyBJVCBWaWRlbyBGb3JtYXRzIGJ5IGRlZmF1bHQKPiArICogICBOYXRpdmUgZGV0YWlsZWQgbW9k ZXM6IDEKPiArICogICBDb2xvcmltZXRyeSBEYXRhIEJsb2NrOgo+ICsgKiAgICAgc1JHQgo+ICsg KiAgIFZpZGVvIERhdGEgQmxvY2s6Cj4gKyAqICAgICBWSUMgIDE2OiAgMTkyMHgxMDgwICAgNjAu MDAwMDAwIEh6ICAxNjo5ICAgICA2Ny41MDAga0h6ICAgIDE0OC41MDAwMDAgTUh6Cj4gKyAqICAg VmlkZW8gQ2FwYWJpbGl0eSBEYXRhIEJsb2NrOgo+ICsgKiAgICAgWUNiQ3IgcXVhbnRpemF0aW9u OiBObyBEYXRhCj4gKyAqICAgICBSR0IgcXVhbnRpemF0aW9uOiBTZWxlY3RhYmxlICh2aWEgQVZJ IFEpCj4gKyAqICAgICBQVCBzY2FuIGJlaGF2aW9yOiBObyBEYXRhCj4gKyAqICAgICBJVCBzY2Fu IGJlaGF2aW9yOiBBbHdheXMgVW5kZXJzY2FubmVkCj4gKyAqICAgICBDRSBzY2FuIGJlaGF2aW9y OiBBbHdheXMgVW5kZXJzY2FubmVkCj4gKyAqICAgVmVuZG9yLVNwZWNpZmljIERhdGEgQmxvY2sg KEhETUkpLCBPVUkgMDAtMEMtMDM6Cj4gKyAqICAgICBTb3VyY2UgcGh5c2ljYWwgYWRkcmVzczog MS4yLjMuNAo+ICsgKiAgICAgTWF4aW11bSBUTURTIGNsb2NrOiAyMDAgTUh6Cj4gKyAqICAgICBF eHRlbmRlZCBIRE1JIHZpZGVvIGRldGFpbHM6Cj4gKyAqIENoZWNrc3VtOiAweGQwICBVbnVzZWQg c3BhY2UgaW4gRXh0ZW5zaW9uIEJsb2NrOiAxMDAgYnl0ZXMKPiArICovCj4gK2NvbnN0IHVuc2ln bmVkIGNoYXIgdGVzdF9lZGlkX2hkbWlfMTA4MHBfcmdiX21heF8yMDBtaHpbXSA9IHsKPiArICAw eDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMxLCAweGQ4 LCAweDJhLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsIDB4 MDEsIDB4MDMsIDB4ODEsIDB4YTAsIDB4NWEsIDB4NzgsCj4gKyAgMHgwMiwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwKPiAr ICAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAw eDAxLCAweDAxLCAweDAxLAo+ICsgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEs IDB4MDIsIDB4M2EsIDB4ODAsIDB4MTgsIDB4NzEsIDB4MzgsCj4gKyAgMHgyZCwgMHg0MCwgMHg1 OCwgMHgyYywgMHg0NSwgMHgwMCwgMHg0MCwgMHg4NCwgMHg2MywgMHgwMCwgMHgwMCwgMHgxZSwK PiArICAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDAwLCAweDU0LCAweDY1LCAweDczLCAweDc0 LCAweDIwLCAweDQ1LCAweDQ0LAo+ICsgIDB4NDksIDB4NDQsIDB4MGEsIDB4MjAsIDB4MjAsIDB4 MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MzIsCj4gKyAgMHg0NiwgMHgwMCwg MHgwMCwgMHhjNCwgMHgwMCwgMHgwYSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgy MCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDEsIDB4NDEsIDB4MDIsIDB4MDMsIDB4MWIsIDB4ODEsCj4gKyAgMHhlMywgMHgw NSwgMHgwMCwgMHgyMCwgMHg0MSwgMHgxMCwgMHhlMiwgMHgwMCwgMHg0YSwgMHg2ZCwgMHgwMywg MHgwYywKPiArICAweDAwLCAweDEyLCAweDM0LCAweDAwLCAweDI4LCAweDIwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gKyAgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gKyAgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gKyAg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwgMHgwMCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweGQwCj4gK307Cj4gKwo+ICsj ZW5kaWYgLy8gRFJNX0tVTklUX0VESURfSF8KPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJt X2Nvbm5lY3Rvci5oIGIvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCj4gaW5kZXggMDAwYTJh MTU2NjE5Li4zODY3YTRjMDFiNzggMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2Nvbm5l Y3Rvci5oCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCj4gQEAgLTM2OCw2ICsz NjgsMzAgQEAgZW51bSBkcm1fcGFuZWxfb3JpZW50YXRpb24gewo+ICAJRFJNX01PREVfUEFORUxf T1JJRU5UQVRJT05fUklHSFRfVVAsCj4gIH07Cj4gIAo+ICsvKioKPiArICogZW51bSBkcm1faGRt aV9icm9hZGNhc3RfcmdiIC0gQnJvYWRjYXN0IFJHQiBTZWxlY3Rpb24gZm9yIGFuIEhETUkgQGRy bV9jb25uZWN0b3IKPiArICovCj4gK2VudW0gZHJtX2hkbWlfYnJvYWRjYXN0X3JnYiB7Cj4gKwkv KioKPiArCSAqIEBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE86IFRoZSBSR0IgcmFuZ2UgaXMg c2VsZWN0ZWQKPiArCSAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIG1vZGUuCj4gKwkgKi8K PiArCURSTV9IRE1JX0JST0FEQ0FTVF9SR0JfQVVUTywKPiArCj4gKwkvKioKPiArCSAqIEBEUk1f SERNSV9CUk9BRENBU1RfUkdCX0ZVTEw6IEZ1bGwgcmFuZ2UgUkdCIGlzIGZvcmNlZC4KPiArCSAq Lwo+ICsJRFJNX0hETUlfQlJPQURDQVNUX1JHQl9GVUxMLAo+ICsKPiArCS8qKgo+ICsJICogQERS TV9IRE1JX0JST0FEQ0FTVF9SR0JfTElNSVRFRDogTGltaXRlZCByYW5nZSBSR0IgaXMgZm9yY2Vk Lgo+ICsJICovCj4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdCX0xJTUlURUQsCj4gK307Cj4gKwo+ ICtjb25zdCBjaGFyICoKPiArZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25h bWUoZW51bSBkcm1faGRtaV9icm9hZGNhc3RfcmdiIGJyb2FkY2FzdF9yZ2IpOwo+ICsKPiAgLyoq Cj4gICAqIHN0cnVjdCBkcm1fbW9uaXRvcl9yYW5nZV9pbmZvIC0gUGFuZWwncyBNb25pdG9yIHJh bmdlIGluIEVESUQgZm9yCj4gICAqICZkcm1fZGlzcGxheV9pbmZvCj4gQEAgLTEwMzcsNiArMTA2 MSwxMSBAQCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSB7Cj4gIAkgKiBAZHJtX2F0b21pY19o ZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2soKS4KPiAgCSAqLwo+ICAJc3RydWN0IHsKPiArCQkv KioKPiArCQkgKiBAYnJvYWRjYXN0X3JnYjogQ29ubmVjdG9yIHByb3BlcnR5IHRvIHBhc3MgdGhl Cj4gKwkJICogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdmFsdWUuCj4gKwkJICovCj4gKwkJZW51 bSBkcm1faGRtaV9icm9hZGNhc3RfcmdiIGJyb2FkY2FzdF9yZ2I7Cj4gIAl9IGhkbWk7Cj4gIH07 Cj4gIAo+IEBAIC0xNzA2LDYgKzE3MzUsMTIgQEAgc3RydWN0IGRybV9jb25uZWN0b3Igewo+ICAJ ICovCj4gIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcml2YWN5X3NjcmVlbl9od19zdGF0ZV9wcm9w ZXJ0eTsKPiAgCj4gKwkvKioKPiArCSAqIEBicm9hZGNhc3RfcmdiX3Byb3BlcnR5OiBDb25uZWN0 b3IgcHJvcGVydHkgdG8gc2V0IHRoZQo+ICsJICogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdG8g b3V0cHV0IHdpdGguCj4gKwkgKi8KPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKmJyb2FkY2FzdF9y Z2JfcHJvcGVydHk7Cj4gKwo+ICAjZGVmaW5lIERSTV9DT05ORUNUT1JfUE9MTF9IUEQgKDEgPDwg MCkKPiAgI2RlZmluZSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVCAoMSA8PCAxKQo+ICAjZGVm aW5lIERSTV9DT05ORUNUT1JfUE9MTF9ESVNDT05ORUNUICgxIDw8IDIpCj4gQEAgLTIwMjYsNiAr MjA2MSw3IEBAIGludCBkcm1fY29ubmVjdG9yX2F0dGFjaF9zY2FsaW5nX21vZGVfcHJvcGVydHko c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiAgCQkJCQkgICAgICAgdTMyIHNjYWxp bmdfbW9kZV9tYXNrKTsKPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX3Zycl9jYXBhYmxlX3By b3BlcnR5KAo+ICAJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+ICtpbnQgZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yKTsKPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX2NvbG9yc3BhY2Vf cHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gIGludCBkcm1fY29u bmVjdG9yX2F0dGFjaF9oZHJfb3V0cHV0X21ldGFkYXRhX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IpOwo+ICBib29sIGRybV9jb25uZWN0b3JfYXRvbWljX2hkcl9tZXRh ZGF0YV9lcXVhbChzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX3N0YXRlLAo+IAo+IC0t IAo+IDIuNDMuMAo+IAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtcm9ja2NoaXAK 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 05D73C4707B for ; Mon, 15 Jan 2024 14:35:43 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=KeOKumfMNH7P2+eIJkzraBMqcoGP01OjATfb/VzVypg=; b=EGoi+XpHYJQdE+ 4q3Lpa/iGjAKVjMf3KZEBpnkRn7hIlQgl3fR2nYPRwWoAmkjPqooHdohOinpDpDUhCPFnO/7Vv4g4 hwYaKM7Kj83gIM5aVbGKpyklP+bIqipQs1Sh7WnAgPzD2HCkwxh1/yIkbHtMNdZ+EOry4ah3o5gEh g5PSe8e3FcsVOGYyttA1XOhX9LLe0HqXBhOutrQr2ZJuhfgdokXlhpRo2DHv6+iLWis/MSQtSpjXH e0Mew+5UnCzgSFittKUuH5uw810stLhJCl120iYk713VsT9uL43NIwJ8gsz6Ybkxz2IKVQ+ubmpFx q182mKleoMDD/BRcNy3Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPO3T-009EcH-1V; Mon, 15 Jan 2024 14:35:11 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rPO3L-009EXe-0i for linux-arm-kernel@lists.infradead.org; Mon, 15 Jan 2024 14:35:09 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329301; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=CsM4p8V5o0QsFCQhRaYOoaBnbr7dyXz5aaaG5evy3dIP18Fjrt0jE0E/PmOFELDEouu8F/ EBNFT5Np0miMcWiWupQ6rxCnDVyHRJbL+fs1HTQrKNwh//7tV6vmHjVXqOHBUJKHUIkC+Z 3p39dr2B0ClsScg0iYSkvIFKl5CG/rw= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-661-g632zJ8dN6aLEermLzIEJw-1; Mon, 15 Jan 2024 09:33:12 -0500 X-MC-Unique: g632zJ8dN6aLEermLzIEJw-1 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-40e6f3c5730so14664045e9.1 for ; Mon, 15 Jan 2024 06:33:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329191; x=1705933991; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=tTGa4tOa4Fgy18ogCWtaEz+6R2A0iyh0KPLQax/Y1FXWOpJkV1PDCMagrS8sG5PDFs LNUSSghKGSq2eFweILDDooU4Pyj6fL77E6034CpMBjAfthBi8jkQdMy4WGQr7TFzVyxQ MWsAf1ScCinF7j3xheiQ9n56WYRz+oVLWNdFO4YhGW4Lc5Pk5/T+F7PTOK9x3Mh1YK6I BCQBNefN6v+Ss9uLZFnEoOl1fVu/t/b2yHU5VGcnTyFXqxu36QcpI5UGZIHGfbk9iSaD Zm+Yf9Cue8tks0cTnRfk3/3HbdFTG+7E47SKGUPn7ThXQIICWXiDISLg7H3CBbik8yyr /3jg== X-Gm-Message-State: AOJu0YzQqaax31lNhf+5Hdwbn4Ym/+vB9K9d9/s9ZAhN48mwodOqyptJ D27VweJtMs1pycV0brJae2bXlhaVAyqwNu7Z2qlMsNw/Ekzby8J0qz5Bs7GpcP8jnmhWtO3Tmrz 32mXpYr3oyolkEbe6kDFcC5UsGRlQPUx2bqQ94Ea5wTw= X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035182wma.230.1705329191023; Mon, 15 Jan 2024 06:33:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IGnFpNvbECPYnHXUb6ozmA7yyk68z6lU24Rulo6C/Itudf1qtyIV6rA40/SMTmfGJac297SBQ== X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035169wma.230.1705329190506; Mon, 15 Jan 2024 06:33:10 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id o8-20020a05600c4fc800b0040e549c77a1sm20056078wmq.32.2024.01.15.06.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:33:10 -0800 (PST) Date: Mon, 15 Jan 2024 15:33:08 +0100 From: Sebastian Wick To: Maxime Ripard Cc: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Daniel Vetter , Emma Anholt , Jonathan Corbet , Sandy Huang , Heiko =?iso-8859-1?Q?St=FCbner?= , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Hans Verkuil , linux-rockchip@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Subject: Re: [PATCH v5 08/44] drm/connector: hdmi: Add Broadcast RGB property Message-ID: <20240115143308.GA159345@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> MIME-Version: 1.0 In-Reply-To: <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240115_063503_422567_BBD93CAA X-CRM114-Status: GOOD ( 42.63 ) 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 T24gVGh1LCBEZWMgMDcsIDIwMjMgYXQgMDQ6NDk6MzFQTSArMDEwMCwgTWF4aW1lIFJpcGFyZCB3 cm90ZToKPiBUaGUgaTkxNSBkcml2ZXIgaGFzIGEgcHJvcGVydHkgdG8gZm9yY2UgdGhlIFJHQiBy YW5nZSBvZiBhbiBIRE1JIG91dHB1dC4KPiBUaGUgdmM0IGRyaXZlciB0aGVuIGltcGxlbWVudGVk IHRoZSBzYW1lIHByb3BlcnR5IHdpdGggdGhlIHNhbWUKPiBzZW1hbnRpY3MuIEtXaW4gaGFzIHN1 cHBvcnQgZm9yIGl0LCBhbmQgYSBQUiBmb3IgbXV0dGVyIGlzIGFsc28gdGhlcmUgdG8KPiBzdXBw b3J0IGl0Lgo+IAo+IEJvdGggZHJpdmVycyBpbXBsZW1lbnRpbmcgdGhlIHNhbWUgcHJvcGVydHkg d2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MsCj4gcGx1cyB0aGUgdXNlcnNwYWNlIGhhdmluZyBzdXBw b3J0IGZvciBpdCwgaXMgcHJvb2YgZW5vdWdoIHRoYXQgaXQncwo+IHByZXR0eSBtdWNoIGEgZGUt ZmFjdG8gc3RhbmRhcmQgbm93IGFuZCB3ZSBjYW4gcHJvdmlkZSBoZWxwZXJzIGZvciBpdC4KPiAK PiBMZXQncyBwbHVtYiBpdCBpbnRvIHRoZSBuZXdseSBjcmVhdGVkIEhETUkgY29ubmVjdG9yLgo+ IAo+IFNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1yaXBhcmRAa2VybmVsLm9yZz4KPiAt LS0KPiAgRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2ICAgICAgICAgICAgICAg fCAgIDEgLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jICAgICAgICAgICAgICAgICAg ICAgICB8ICAgNSArCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3N0YXRlX2hlbHBlci5j ICAgICAgICAgIHwgIDE3ICsKPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jICAg ICAgICAgICAgICAgICAgfCAgIDQgKwo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5j ICAgICAgICAgICAgICAgICAgICB8ICA3NiArKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vdGVzdHMv TWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gIC4uLi9ncHUvZHJtL3Rlc3Rz L2RybV9hdG9taWNfc3RhdGVfaGVscGVyX3Rlc3QuYyAgIHwgMzc2ICsrKysrKysrKysrKysrKysr KysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2Nvbm5lY3Rvcl90ZXN0LmMgICAgICAg ICB8IDExNyArKysrKystCj4gIGRyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fa3VuaXRfZWRpZC5o ICAgICAgICAgICAgIHwgMTA2ICsrKysrKwo+ICBpbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmgg ICAgICAgICAgICAgICAgICAgICAgICB8ICAzNiArKwo+ICAxMCBmaWxlcyBjaGFuZ2VkLCA3Mzcg aW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRh dGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2IGIvRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3Bl cnRpZXMuY3N2Cj4gaW5kZXggMGY5NTkwODM0ODI5Li5jYWVmMTRjNTMyZDQgMTAwNjQ0Cj4gLS0t IGEvRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2Cj4gKysrIGIvRG9jdW1lbnRh dGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2Cj4gQEAgLTE3LDcgKzE3LDYgQEAgT3duZXIgTW9k dWxlL0RyaXZlcnMsR3JvdXAsUHJvcGVydHkgTmFtZSxUeXBlLFByb3BlcnR5IFZhbHVlcyxPYmpl Y3QgYXR0YWNoZWQsRGUKPiAgLFZpcnR1YWwgR1BVLOKAnHN1Z2dlc3RlZCBY4oCdLFJBTkdFLCJN aW49MCwgTWF4PTB4ZmZmZmZmZmYiLENvbm5lY3Rvcixwcm9wZXJ0eSB0byBzdWdnZXN0IGFuIFgg b2Zmc2V0IGZvciBhIGNvbm5lY3Rvcgo+ICAsLOKAnHN1Z2dlc3RlZCBZ4oCdLFJBTkdFLCJNaW49 MCwgTWF4PTB4ZmZmZmZmZmYiLENvbm5lY3Rvcixwcm9wZXJ0eSB0byBzdWdnZXN0IGFuIFkgb2Zm c2V0IGZvciBhIGNvbm5lY3Rvcgo+ICAsT3B0aW9uYWwsIiIiYXNwZWN0IHJhdGlvIiIiLEVOVU0s InsgIiJOb25lIiIsICIiNDozIiIsICIiMTY6OSIiIH0iLENvbm5lY3RvcixUREIKPiAtaTkxNSxH ZW5lcmljLCIiIkJyb2FkY2FzdCBSR0IiIiIsRU5VTSwieyAiIkF1dG9tYXRpYyIiLCAiIkZ1bGwi IiwgIiJMaW1pdGVkIDE2OjIzNSIiIH0iLENvbm5lY3RvciwiV2hlbiB0aGlzIHByb3BlcnR5IGlz IHNldCB0byBMaW1pdGVkIDE2OjIzNSBhbmQgQ1RNIGlzIHNldCwgdGhlIGhhcmR3YXJlIHdpbGwg YmUgcHJvZ3JhbW1lZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIG9mIENU TSBieSB0aGUgbGltaXRlZCByYW5nZSBtYXRyaXggdG8gZW5zdXJlIHRoZSBwaXhlbHMgbm9ybWFs bHkgaW4gdGhlIHJhbmdlIDAuLjEuMCBhcmUgcmVtYXBwZWQgdG8gdGhlIHJhbmdlIDE2LzI1NS4u MjM1LzI1NS4iCj4gICws4oCcYXVkaW/igJ0sRU5VTSwieyAiImZvcmNlLWR2aSIiLCAiIm9mZiIi LCAiImF1dG8iIiwgIiJvbiIiIH0iLENvbm5lY3RvcixUQkQKPiAgLFNEVk8tVFYs4oCcbW9kZeKA nSxFTlVNLCJ7ICIiTlRTQ19NIiIsICIiTlRTQ19KIiIsICIiTlRTQ180NDMiIiwgIiJQQUxfQiIi IH0gZXRjLiIsQ29ubmVjdG9yLFRCRAo+ICAsLCIiImxlZnRfbWFyZ2luIiIiLFJBTkdFLCJNaW49 MCwgTWF4PSBTRFZPIGRlcGVuZGVudCIsQ29ubmVjdG9yLFRCRAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+ IGluZGV4IGMzMWZjMGI0OGMzMS4uMTQ2NWE3ZjA5YTBiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9kcm1fYXRvbWljLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5j Cj4gQEAgLTExNDIsNiArMTE0MiwxMSBAQCBzdGF0aWMgdm9pZCBkcm1fYXRvbWljX2Nvbm5lY3Rv cl9wcmludF9zdGF0ZShzdHJ1Y3QgZHJtX3ByaW50ZXIgKnAsCj4gIAlkcm1fcHJpbnRmKHAsICJc dG1heF9yZXF1ZXN0ZWRfYnBjPSVkXG4iLCBzdGF0ZS0+bWF4X3JlcXVlc3RlZF9icGMpOwo+ICAJ ZHJtX3ByaW50ZihwLCAiXHRjb2xvcnNwYWNlPSVzXG4iLCBkcm1fZ2V0X2NvbG9yc3BhY2VfbmFt ZShzdGF0ZS0+Y29sb3JzcGFjZSkpOwo+ICAKPiArCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90 eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSB8fAo+ICsJICAgIGNvbm5lY3Rvci0+Y29u bmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlCKQo+ICsJCWRybV9wcmludGYo cCwgIlx0YnJvYWRjYXN0X3JnYj0lc1xuIiwKPiArCQkJICAgZHJtX2hkbWlfY29ubmVjdG9yX2dl dF9icm9hZGNhc3RfcmdiX25hbWUoc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYikpOwo+ICsKPiAg CWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9XUklU RUJBQ0spCj4gIAkJaWYgKHN0YXRlLT53cml0ZWJhY2tfam9iICYmIHN0YXRlLT53cml0ZWJhY2tf am9iLT5mYikKPiAgCQkJZHJtX3ByaW50ZihwLCAiXHRmYj0lZFxuIiwgc3RhdGUtPndyaXRlYmFj a19qb2ItPmZiLT5iYXNlLmlkKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9h dG9taWNfc3RhdGVfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0ZV9o ZWxwZXIuYwo+IGluZGV4IGU2OWMwY2MxYzZkYS4uMTBkOTg2MjBhMzU4IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3N0YXRlX2hlbHBlci5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9hdG9taWNfc3RhdGVfaGVscGVyLmMKPiBAQCAtNTgzLDYgKzU4Myw3IEBA IEVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3R2X3Jlc2V0KTsKPiAg dm9pZCBfX2RybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0KHN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3IsCj4gIAkJCQkJICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jf c3RhdGUgKm5ld19zdGF0ZSkKPiAgewo+ICsJbmV3X3N0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2Ig PSBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE87Cj4gIH0KPiAgRVhQT1JUX1NZTUJPTChfX2Ry bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0KTsKPiAgCj4gQEAgLTY1MCw2ICs2 NTEsMjIgQEAgRVhQT1JUX1NZTUJPTChkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfdHZfY2hl Y2spOwo+ICBpbnQgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2soc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiAgCQkJCQkgICBzdHJ1Y3QgZHJtX2F0b21pY19z dGF0ZSAqc3RhdGUpCj4gIHsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpvbGRfc3Rh dGUgPQo+ICsJCWRybV9hdG9taWNfZ2V0X29sZF9jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5l Y3Rvcik7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0YXRlID0KPiArCQlk cm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ICsK PiArCWlmIChvbGRfc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiAhPSBuZXdfc3RhdGUtPmhkbWku YnJvYWRjYXN0X3JnYikgewo+ICsJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IG5ld19zdGF0ZS0+ Y3J0YzsKPiArCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gKwo+ICsJCWNy dGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0YXRlLCBjcnRjKTsKPiArCQlp ZiAoSVNfRVJSKGNydGNfc3RhdGUpKQo+ICsJCQlyZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsK PiArCj4gKwkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKPiArCX0KPiArCj4gIAly ZXR1cm4gMDsKPiAgfQo+ICBFWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rv cl9oZG1pX2NoZWNrKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNf dWFwaS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCj4gaW5kZXggYWVlNGE2 NWQ0OTU5Li4zZWI0ZjRiYzhiNzEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9h dG9taWNfdWFwaS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfdWFwaS5jCj4g QEAgLTgxOCw2ICs4MTgsOCBAQCBzdGF0aWMgaW50IGRybV9hdG9taWNfY29ubmVjdG9yX3NldF9w cm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ICAJCXN0YXRlLT5tYXhf cmVxdWVzdGVkX2JwYyA9IHZhbDsKPiAgCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVjdG9y LT5wcml2YWN5X3NjcmVlbl9zd19zdGF0ZV9wcm9wZXJ0eSkgewo+ICAJCXN0YXRlLT5wcml2YWN5 X3NjcmVlbl9zd19zdGF0ZSA9IHZhbDsKPiArCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29ubmVj dG9yLT5icm9hZGNhc3RfcmdiX3Byb3BlcnR5KSB7Cj4gKwkJc3RhdGUtPmhkbWkuYnJvYWRjYXN0 X3JnYiA9IHZhbDsKPiAgCX0gZWxzZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9w cm9wZXJ0eSkgewo+ICAJCXJldHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9taWNfc2V0X3Byb3Bl cnR5KGNvbm5lY3RvciwKPiAgCQkJCXN0YXRlLCBwcm9wZXJ0eSwgdmFsKTsKPiBAQCAtOTAxLDYg KzkwMyw4IEBAIGRybV9hdG9taWNfY29ubmVjdG9yX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yLAo+ICAJCSp2YWwgPSBzdGF0ZS0+bWF4X3JlcXVlc3RlZF9icGM7 Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5fc3df c3RhdGVfcHJvcGVydHkpIHsKPiAgCQkqdmFsID0gc3RhdGUtPnByaXZhY3lfc2NyZWVuX3N3X3N0 YXRlOwo+ICsJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2Jf cHJvcGVydHkpIHsKPiArCQkqdmFsID0gc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYjsKPiAgCX0g ZWxzZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX2dldF9wcm9wZXJ0eSkgewo+ICAJCXJl dHVybiBjb25uZWN0b3ItPmZ1bmNzLT5hdG9taWNfZ2V0X3Byb3BlcnR5KGNvbm5lY3RvciwKPiAg CQkJCXN0YXRlLCBwcm9wZXJ0eSwgdmFsKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2RybV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiBpbmRl eCBkOTk2MWNjZTgyNDUuLjkyOWIwYTkxMWY2MiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vZHJtX2Nvbm5lY3Rvci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jb25uZWN0b3Iu Ywo+IEBAIC0xMTgzLDYgKzExODMsMjkgQEAgc3RhdGljIGNvbnN0IHUzMiBkcF9jb2xvcnNwYWNl cyA9Cj4gIAlCSVQoRFJNX01PREVfQ09MT1JJTUVUUllfQlQyMDIwX0NZQ0MpIHwKPiAgCUJJVChE Uk1fTU9ERV9DT0xPUklNRVRSWV9CVDIwMjBfWUNDKTsKPiAgCj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgZHJtX3Byb3BfZW51bV9saXN0IGJyb2FkY2FzdF9yZ2JfbmFtZXNbXSA9IHsKPiArCXsgRFJN X0hETUlfQlJPQURDQVNUX1JHQl9BVVRPLCAiQXV0b21hdGljIiB9LAo+ICsJeyBEUk1fSERNSV9C Uk9BRENBU1RfUkdCX0ZVTEwsICJGdWxsIiB9LAo+ICsJeyBEUk1fSERNSV9CUk9BRENBU1RfUkdC X0xJTUlURUQsICJMaW1pdGVkIDE2OjIzNSIgfSwKPiArfTsKPiArCj4gKy8qCj4gKyAqIGRybV9o ZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lIC0gUmV0dXJuIGEgc3RyaW5nIGZv ciBIRE1JIGNvbm5lY3RvciBSR0IgYnJvYWRjYXN0IHNlbGVjdGlvbgo+ICsgKiBAYnJvYWRjYXN0 X3JnYjogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdG8gY29tcHV0ZSBuYW1lIG9mCj4gKyAqCj4g KyAqIFJldHVybnM6IHRoZSBuYW1lIG9mIHRoZSBCcm9hZGNhc3QgUkdCIHNlbGVjdGlvbiwgb3Ig TlVMTCBpZiB0aGUgdHlwZQo+ICsgKiBpcyBub3QgdmFsaWQuCj4gKyAqLwo+ICtjb25zdCBjaGFy ICoKPiArZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWUoZW51bSBkcm1f aGRtaV9icm9hZGNhc3RfcmdiIGJyb2FkY2FzdF9yZ2IpCj4gK3sKPiArCWlmIChicm9hZGNhc3Rf cmdiID4gRFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVEKQo+ICsJCXJldHVybiBOVUxMOwo+ ICsKPiArCXJldHVybiBicm9hZGNhc3RfcmdiX25hbWVzW2Jyb2FkY2FzdF9yZ2JdLm5hbWU7Cj4g K30KPiArRVhQT1JUX1NZTUJPTChkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2Jf bmFtZSk7Cj4gKwo+ICAvKioKPiAgICogRE9DOiBzdGFuZGFyZCBjb25uZWN0b3IgcHJvcGVydGll cwo+ICAgKgo+IEBAIC0xNjU1LDYgKzE2NzgsMjYgQEAgRVhQT1JUX1NZTUJPTChkcm1fY29ubmVj dG9yX2F0dGFjaF9kcF9zdWJjb25uZWN0b3JfcHJvcGVydHkpOwo+ICAvKioKPiAgICogRE9DOiBI RE1JIGNvbm5lY3RvciBwcm9wZXJ0aWVzCj4gICAqCj4gKyAqIEJyb2FkY2FzdCBSR0IKPiArICog ICAgICBJbmRpY2F0ZXMgdGhlIFJHQiBRdWFudGl6YXRpb24gUmFuZ2UgKEZ1bGwgdnMgTGltaXRl ZCkgdXNlZC4KPiArICogICAgICBJbmZvZnJhbWVzIHdpbGwgYmUgZ2VuZXJhdGVkIGFjY29yZGlu ZyB0byB0aGF0IHZhbHVlLgo+ICsgKgo+ICsgKiAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3Bl cnR5IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKPiArICoKPiArICogICAgICBBdXRvbWF0 aWM6Cj4gKyAqICAgICAgICAgICAgICBSR0IgUmFuZ2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxs eSBiYXNlZCBvbiB0aGUgbW9kZQo+ICsgKiAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBI RE1JIHNwZWNpZmljYXRpb25zLgo+ICsgKgo+ICsgKiAgICAgIEZ1bGw6Cj4gKyAqICAgICAgICAg ICAgICBGdWxsIFJHQiBSYW5nZSBpcyBmb3JjZWQuCj4gKyAqCj4gKyAqICAgICAgTGltaXRlZCAx NjoyMzU6Cj4gKyAqICAgICAgICAgICAgICBMaW1pdGVkIFJHQiBSYW5nZSBpcyBmb3JjZWQuIFVu bGlrZSB0aGUgbmFtZSBzdWdnZXN0cywKPiArICogICAgICAgICAgICAgIHRoaXMgd29ya3MgZm9y IGFueSBudW1iZXIgb2YgYml0cy1wZXItY29tcG9uZW50Lgo+ICsgKgo+ICsgKiAgICAgIERyaXZl cnMgY2FuIHNldCB1cCB0aGlzIHByb3BlcnR5IGJ5IGNhbGxpbmcKPiArICogICAgICBkcm1fY29u bmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5KCkuCj4gKyAqCgpUaGlzIGlzIGEg Z29vZCB0aW1lIHRvIGRvY3VtZW50IHRoaXMgaW4gbW9yZSBkZXRhaWwuIFRoZXJlIG1pZ2h0IGJl IHR3bwpkaWZmZXJlbnQgdGhpbmdzIGJlaW5nIGFmZmVjdGVkOgoKMS4gVGhlIHNpZ25hbGxpbmcg KEluZm9GcmFtZS9TRFAvLi4uKQoyLiBUaGUgY29sb3IgcGlwZWxpbmUgcHJvY2Vzc2luZwoKQWxs IHZhbHVlcyBvZiBCcm9hZGNhc3QgUkdCIGFsd2F5cyBhZmZlY3QgdGhlIGNvbG9yIHBpcGVsaW5l IHByb2Nlc3NpbmcKc3VjaCB0aGF0IGEgZnVsbC1yYW5nZSBpbnB1dCB0byB0aGUgQ1JUQyBpcyBj b252ZXJ0ZWQgdG8gZWl0aGVyIGZ1bGwtIG9yCmxpbWl0ZWQtcmFuZ2UsIGRlcGVuZGluZyBvbiB3 aGF0IHRoZSBtb25pdG9yIGlzIHN1cHBvc2VkIHRvIGFjY2VwdC4KCldoZW4gYXV0b21hdGljIGlz IHNlbGVjdGVkLCBkb2VzIHRoYXQgbWVhbiB0aGF0IHRoZXJlIGlzIG5vIHNpZ25hbGxpbmcsCm9y IHRoYXQgdGhlIHNpZ25hbGxpbmcgbWF0Y2hlcyB3aGF0IHRoZSBtb25pdG9yIGlzIHN1cHBvc2Vk IHRvIGFjY2VwdAphY2NvcmRpbmcgdG8gdGhlIHNwZWM/IEFsc28sIGlzIHRoaXMgcmVhbGx5IEhE TUkgc3BlY2lmaWM/CgpXaGVuIGZ1bGwgb3IgbGltaXRlZCBpcyBzZWxlY3RlZCBhbmQgdGhlIG1v bml0b3IgZG9lc24ndCBzdXBwb3J0IHRoZQpzaWduYWxsaW5nLCB3aGF0IGhhcHBlbnM/Cgo+ICAg KiBjb250ZW50IHR5cGUgKEhETUkgc3BlY2lmaWMpOgo+ICAgKglJbmRpY2F0ZXMgY29udGVudCB0 eXBlIHNldHRpbmcgdG8gYmUgdXNlZCBpbiBIRE1JIGluZm9mcmFtZXMgdG8gaW5kaWNhdGUKPiAg ICoJY29udGVudCB0eXBlIGZvciB0aGUgZXh0ZXJuYWwgZGV2aWNlLCBzbyB0aGF0IGl0IGFkanVz dHMgaXRzIGRpc3BsYXkKPiBAQCAtMjUxNyw2ICsyNTYwLDM5IEBAIGludCBkcm1fY29ubmVjdG9y X2F0dGFjaF9oZHJfb3V0cHV0X21ldGFkYXRhX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uCj4gIH0KPiAgRVhQT1JUX1NZTUJPTChkcm1fY29ubmVjdG9yX2F0dGFjaF9oZHJfb3V0 cHV0X21ldGFkYXRhX3Byb3BlcnR5KTsKPiAgCj4gKy8qKgo+ICsgKiBkcm1fY29ubmVjdG9yX2F0 dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5IC0gYXR0YWNoICJCcm9hZGNhc3QgUkdCIiBwcm9w ZXJ0eQo+ICsgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gYXR0YWNoIHRoZSBwcm9wZXJ0eSBv bi4KPiArICoKPiArICogVGhpcyBpcyB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciBmb3JjaW5nIHRo ZSBSR0IgcmFuZ2Ugb24gYSBjb25uZWN0b3IKPiArICoKPiArICogUmV0dXJuczoKPiArICogWmVy byBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgo+ICsgKi8KPiAraW50IGRy bV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5l Y3Rvci0+ZGV2Owo+ICsJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcDsKPiArCj4gKwlwcm9wID0g Y29ubmVjdG9yLT5icm9hZGNhc3RfcmdiX3Byb3BlcnR5Owo+ICsJaWYgKCFwcm9wKSB7Cj4gKwkJ cHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSwK PiArCQkJCQkJIkJyb2FkY2FzdCBSR0IiLAo+ICsJCQkJCQlicm9hZGNhc3RfcmdiX25hbWVzLAo+ ICsJCQkJCQlBUlJBWV9TSVpFKGJyb2FkY2FzdF9yZ2JfbmFtZXMpKTsKPiArCQlpZiAoIXByb3Ap Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCQljb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2Jf cHJvcGVydHkgPSBwcm9wOwo+ICsJfQo+ICsKPiArCWRybV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5 KCZjb25uZWN0b3ItPmJhc2UsIHByb3AsCj4gKwkJCQkgICBEUk1fSERNSV9CUk9BRENBU1RfUkdC X0FVVE8pOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2Nvbm5l Y3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSk7Cj4gKwo+ICAvKioKPiAgICogZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfY29sb3JzcGFjZV9wcm9wZXJ0eSAtIGF0dGFjaCAiQ29sb3JzcGFj ZSIgcHJvcGVydHkKPiAgICogQGNvbm5lY3RvcjogY29ubmVjdG9yIHRvIGF0dGFjaCB0aGUgcHJv cGVydHkgb24uCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZSBi L2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZQo+IGluZGV4IGQ2MTgzYjNkNzY4OC4uYjI5 ZGRmZDkwNTk2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZQo+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZQo+IEBAIC00LDYgKzQsNyBAQCBv YmotJChDT05GSUdfRFJNX0tVTklUX1RFU1RfSEVMUEVSUykgKz0gXAo+ICAJZHJtX2t1bml0X2hl bHBlcnMubwo+ICAKPiAgb2JqLSQoQ09ORklHX0RSTV9LVU5JVF9URVNUKSArPSBcCj4gKwlkcm1f YXRvbWljX3N0YXRlX2hlbHBlcl90ZXN0Lm8gXAo+ICAJZHJtX2J1ZGR5X3Rlc3QubyBcCj4gIAlk cm1fY21kbGluZV9wYXJzZXJfdGVzdC5vIFwKPiAgCWRybV9jb25uZWN0b3JfdGVzdC5vIFwKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9hdG9taWNfc3RhdGVfaGVscGVy X3Rlc3QuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fYXRvbWljX3N0YXRlX2hlbHBlcl90 ZXN0LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjFlNmY3 OTZlZTEzCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1f YXRvbWljX3N0YXRlX2hlbHBlcl90ZXN0LmMKPiBAQCAtMCwwICsxLDM3NiBAQAo+ICsvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsKPiArLyoKPiArICogS3VuaXQgdGVzdCBm b3IgZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIgZnVuY3Rpb25zCj4gKyAqLwo+ICsKPiArI2luY2x1 ZGUgPGRybS9kcm1fYXRvbWljLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19zdGF0ZV9o ZWxwZXIuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX3VhcGkuaD4KPiArI2luY2x1ZGUg PGRybS9kcm1fZHJ2Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2VkaWQuaD4KPiArI2luY2x1ZGUg PGRybS9kcm1fY29ubmVjdG9yLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2ZvdXJjYy5oPgo+ICsj aW5jbHVkZSA8ZHJtL2RybV9rdW5pdF9oZWxwZXJzLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX21h bmFnZWQuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oPgo+ ICsjaW5jbHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiArCj4gKyNpbmNsdWRlIDxkcm0v ZHJtX3ByaW50Lmg+Cj4gKyNpbmNsdWRlICIuLi9kcm1fY3J0Y19pbnRlcm5hbC5oIgo+ICsKPiAr I2luY2x1ZGUgPGt1bml0L3Rlc3QuaD4KPiArCj4gKyNpbmNsdWRlICJkcm1fa3VuaXRfZWRpZC5o Igo+ICsKPiArc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgewo+ ICsJc3RydWN0IGRybV9kZXZpY2UgZHJtOwo+ICsJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7Cj4g KwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Cj4gKwlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsK PiArCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKPiArCj4gKwljb25zdCBjaGFyICpj dXJyZW50X2VkaWQ7Cj4gKwlzaXplX3QgY3VycmVudF9lZGlkX2xlbjsKPiArfTsKPiArCj4gKyNk ZWZpbmUgY29ubmVjdG9yX3RvX3ByaXYoYykgXAo+ICsJY29udGFpbmVyX29mX2NvbnN0KGMsIHN0 cnVjdCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2LCBjb25uZWN0b3IpCj4g Kwo+ICtzdGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmZpbmRfcHJlZmVycmVkX21vZGUo c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJc3RydWN0IGRybV9kZXZp Y2UgKmRybSA9IGNvbm5lY3Rvci0+ZGV2Owo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGUsICpwcmVmZXJyZWQ7Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZHJtLT5tb2RlX2NvbmZpZy5tdXRl eCk7Cj4gKwlwcmVmZXJyZWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjb25uZWN0b3ItPm1vZGVzLCBz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSwgaGVhZCk7Cj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1v ZGUsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKQo+ICsJCWlmIChtb2RlLT50eXBlICYgRFJNX01P REVfVFlQRV9QUkVGRVJSRUQpCj4gKwkJCXByZWZlcnJlZCA9IG1vZGU7Cj4gKwltdXRleF91bmxv Y2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ICsKPiArCXJldHVybiBwcmVmZXJyZWQ7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgbGlnaHRfdXBfY29ubmVjdG9yKHN0cnVjdCBrdW5pdCAqdGVz dCwKPiArCQkJICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRybSwKPiArCQkJICAgICAgc3RydWN0 IGRybV9jcnRjICpjcnRjLAo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLAo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiArCQkJICAg ICAgc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpCj4gK3sKPiArCXN0cnVjdCBk cm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpj b25uX3N0YXRlOwo+ICsJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ICsJaW50 IHJldDsKPiArCj4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRlX2FsbG9j KHRlc3QsIGRybSwgY3R4KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwg c3RhdGUpOwo+ICsKPiArCWNvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jb25uZWN0b3Jfc3Rh dGUoc3RhdGUsIGNvbm5lY3Rvcik7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRl c3QsIGNvbm5fc3RhdGUpOwo+ICsKPiArCXJldCA9IGRybV9hdG9taWNfc2V0X2NydGNfZm9yX2Nv bm5lY3Rvcihjb25uX3N0YXRlLCBjcnRjKTsKPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCByZXQs IDApOwo+ICsKPiArCWNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0YXRl LCBjcnRjKTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgY3J0Y19zdGF0 ZSk7Cj4gKwo+ICsJcmV0ID0gZHJtX2F0b21pY19zZXRfbW9kZV9mb3JfY3J0YyhjcnRjX3N0YXRl LCBtb2RlKTsKPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCByZXQsIDApOwo+ICsKPiArCWNydGNf c3RhdGUtPmVuYWJsZSA9IHRydWU7Cj4gKwljcnRjX3N0YXRlLT5hY3RpdmUgPSB0cnVlOwo+ICsK PiArCXJldCA9IGRybV9hdG9taWNfY29tbWl0KHN0YXRlKTsKPiArCUtVTklUX0FTU0VSVF9FUSh0 ZXN0LCByZXQsIDApOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNl dF9jb25uZWN0b3JfZWRpZChzdHJ1Y3Qga3VuaXQgKnRlc3QsIHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsCj4gKwkJCSAgICAgIGNvbnN0IGNoYXIgKmVkaWQsIHNpemVfdCBlZGlkX2xl bikKPiArewo+ICsJc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYg KnByaXYgPQo+ICsJCWNvbm5lY3Rvcl90b19wcml2KGNvbm5lY3Rvcik7Cj4gKwlzdHJ1Y3QgZHJt X2RldmljZSAqZHJtID0gY29ubmVjdG9yLT5kZXY7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXByaXYt PmN1cnJlbnRfZWRpZCA9IGVkaWQ7Cj4gKwlwcml2LT5jdXJyZW50X2VkaWRfbGVuID0gZWRpZF9s ZW47Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZHJtLT5tb2RlX2NvbmZpZy5tdXRleCk7Cj4gKwlyZXQg PSBjb25uZWN0b3ItPmZ1bmNzLT5maWxsX21vZGVzKGNvbm5lY3RvciwgNDA5NiwgNDA5Nik7Cj4g KwltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ICsJS1VOSVRfQVNTRVJU X0dUKHRlc3QsIHJldCwgMCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZHVtbXlfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJp diAqcHJpdiA9Cj4gKwkJY29ubmVjdG9yX3RvX3ByaXYoY29ubmVjdG9yKTsKPiArCWNvbnN0IHN0 cnVjdCBkcm1fZWRpZCAqZWRpZDsKPiArCXVuc2lnbmVkIGludCBudW1fbW9kZXM7Cj4gKwo+ICsJ ZWRpZCA9IGRybV9lZGlkX2FsbG9jKHByaXYtPmN1cnJlbnRfZWRpZCwgcHJpdi0+Y3VycmVudF9l ZGlkX2xlbik7Cj4gKwlpZiAoIWVkaWQpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJZHJt X2VkaWRfY29ubmVjdG9yX3VwZGF0ZShjb25uZWN0b3IsIGVkaWQpOwo+ICsJbnVtX21vZGVzID0g ZHJtX2VkaWRfY29ubmVjdG9yX2FkZF9tb2Rlcyhjb25uZWN0b3IpOwo+ICsKPiArCWRybV9lZGlk X2ZyZWUoZWRpZCk7Cj4gKwo+ICsJcmV0dXJuIG51bV9tb2RlczsKPiArfQo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBkdW1teV9jb25uZWN0b3Jf aGVscGVyX2Z1bmNzID0gewo+ICsJLmF0b21pY19jaGVjawk9IGRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX2NoZWNrLAo+ICsJLmdldF9tb2Rlcwk9IGR1bW15X2Nvbm5lY3Rvcl9nZXRf bW9kZXMsCj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCBkdW1teV9oZG1pX2Nvbm5lY3Rvcl9yZXNl dChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlkcm1fYXRvbWljX2hl bHBlcl9jb25uZWN0b3JfcmVzZXQoY29ubmVjdG9yKTsKPiArCV9fZHJtX2F0b21pY19oZWxwZXJf Y29ubmVjdG9yX2hkbWlfcmVzZXQoY29ubmVjdG9yLCBjb25uZWN0b3ItPnN0YXRlKTsKPiArfQo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGR1bW15X2Nvbm5l Y3Rvcl9mdW5jcyA9IHsKPiArCS5hdG9taWNfZGVzdHJveV9zdGF0ZQk9IGRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlLAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUJ PSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsJLmZpbGxf bW9kZXMJCT0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAo+ICsJLnJl c2V0CQkJPSBkdW1teV9oZG1pX2Nvbm5lY3Rvcl9yZXNldCwKPiArfTsKPiArCj4gK3N0YXRpYwo+ ICtzdHJ1Y3QgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqCj4gK2RybV9h dG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KQo+ICt7 Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsK PiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uOwo+ICsJc3RydWN0IGRybV9lbmNvZGVyICpl bmM7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOwo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ ICsJaW50IHJldDsKPiArCj4gKwlkZXYgPSBkcm1fa3VuaXRfaGVscGVyX2FsbG9jX2RldmljZSh0 ZXN0KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgZGV2KTsKPiArCj4g Kwlwcml2ID0gZHJtX2t1bml0X2hlbHBlcl9hbGxvY19kcm1fZGV2aWNlKHRlc3QsIGRldiwKPiAr CQkJCQkJIHN0cnVjdCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2LCBkcm0s Cj4gKwkJCQkJCSBEUklWRVJfTU9ERVNFVCB8IERSSVZFUl9BVE9NSUMpOwo+ICsJS1VOSVRfQVNT RVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBwcml2KTsKPiArCXRlc3QtPnByaXYgPSBwcml2Owo+ ICsKPiArCWRybSA9ICZwcml2LT5kcm07Cj4gKwlwcml2LT5wbGFuZSA9IGRybV9rdW5pdF9oZWxw ZXJfY3JlYXRlX3ByaW1hcnlfcGxhbmUodGVzdCwgZHJtLAo+ICsJCQkJCQkJICAgIE5VTEwsCj4g KwkJCQkJCQkgICAgTlVMTCwKPiArCQkJCQkJCSAgICBOVUxMLCAwLAo+ICsJCQkJCQkJICAgIE5V TEwpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBwcml2LT5wbGFuZSk7 Cj4gKwo+ICsJcHJpdi0+Y3J0YyA9IGRybV9rdW5pdF9oZWxwZXJfY3JlYXRlX2NydGModGVzdCwg ZHJtLAo+ICsJCQkJCQkgIHByaXYtPnBsYW5lLCBOVUxMLAo+ICsJCQkJCQkgIE5VTEwsCj4gKwkJ CQkJCSAgTlVMTCk7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHByaXYt PmNydGMpOwo+ICsKPiArCWVuYyA9ICZwcml2LT5lbmNvZGVyOwo+ICsJcmV0ID0gZHJtbV9lbmNv ZGVyX2luaXQoZHJtLCBlbmMsIE5VTEwsIERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7Cj4g KwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiArCj4gKwllbmMtPnBvc3NpYmxlX2Ny dGNzID0gZHJtX2NydGNfbWFzayhwcml2LT5jcnRjKTsKPiArCj4gKwljb25uID0gJnByaXYtPmNv bm5lY3RvcjsKPiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdChkcm0sIGNvbm4sCj4g KwkJCQkgICAgICAgJmR1bW15X2Nvbm5lY3Rvcl9mdW5jcywKPiArCQkJCSAgICAgICBEUk1fTU9E RV9DT05ORUNUT1JfSERNSUEsCj4gKwkJCQkgICAgICAgTlVMTCk7Cj4gKwlLVU5JVF9BU1NFUlRf RVEodGVzdCwgcmV0LCAwKTsKPiArCj4gKwlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubiwg JmR1bW15X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwo+ICsJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hf ZW5jb2Rlcihjb25uLCBlbmMpOwo+ICsKPiArCWRybV9tb2RlX2NvbmZpZ19yZXNldChkcm0pOwo+ ICsKPiArCXJldCA9IHNldF9jb25uZWN0b3JfZWRpZCh0ZXN0LCBjb25uLAo+ICsJCQkJIHRlc3Rf ZWRpZF9oZG1pXzEwODBwX3JnYl9tYXhfMjAwbWh6LAo+ICsJCQkJIEFSUkFZX1NJWkUodGVzdF9l ZGlkX2hkbWlfMTA4MHBfcmdiX21heF8yMDBtaHopKTsKPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0 LCByZXQsIDApOwo+ICsKPiArCXJldHVybiBwcml2Owo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBUZXN0 IHRoYXQgaWYgd2UgY2hhbmdlIHRoZSBSR0IgcXVhbnRpemF0aW9uIHByb3BlcnR5IHRvIGEgZGlm ZmVyZW50Cj4gKyAqIHZhbHVlLCB3ZSB0cmlnZ2VyIGEgbW9kZSBjaGFuZ2Ugb24gdGhlIGNvbm5l Y3RvcidzIENSVEMsIHdoaWNoIHdpbGwKPiArICogaW4gdHVybiBkaXNhYmxlL2VuYWJsZSB0aGUg Y29ubmVjdG9yLgo+ICsgKi8KPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0 X3JnYl9jcnRjX21vZGVfY2hhbmdlZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gK3sKPiArCXN0cnVj dCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2ICpwcml2Owo+ICsJc3RydWN0 IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHg7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9z dGF0ZSAqb2xkX2Nvbm5fc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3 X2Nvbm5fc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gKwlz dHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqcHJlZmVycmVkOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47Cj4gKwlzdHJ1Y3Qg ZHJtX2RldmljZSAqZHJtOwo+ICsJc3RydWN0IGRybV9jcnRjICpjcnRjOwo+ICsJaW50IHJldDsK PiArCj4gKwlwcml2ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfaW5pdCh0ZXN0 KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcml2KTsKPiArCj4gKwljdHggPSBk cm1fa3VuaXRfaGVscGVyX2FjcXVpcmVfY3R4X2FsbG9jKHRlc3QpOwo+ICsJS1VOSVRfQVNTRVJU X05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjdHgpOwo+ICsKPiArCWNvbm4gPSAmcHJpdi0+Y29ubmVj dG9yOwo+ICsJcHJlZmVycmVkID0gZmluZF9wcmVmZXJyZWRfbW9kZShjb25uKTsKPiArCUtVTklU X0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcmVmZXJyZWQpOwo+ICsKPiArCWRybSA9ICZwcml2LT5k cm07Cj4gKwljcnRjID0gcHJpdi0+Y3J0YzsKPiArCXJldCA9IGxpZ2h0X3VwX2Nvbm5lY3Rvcih0 ZXN0LCBkcm0sIGNydGMsIGNvbm4sIHByZWZlcnJlZCwgY3R4KTsKPiArCUtVTklUX0FTU0VSVF9F USh0ZXN0LCByZXQsIDApOwo+ICsKPiArCXN0YXRlID0gZHJtX2t1bml0X2hlbHBlcl9hdG9taWNf c3RhdGVfYWxsb2ModGVzdCwgZHJtLCBjdHgpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1Jf TlVMTCh0ZXN0LCBzdGF0ZSk7Cj4gKwo+ICsJbmV3X2Nvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dl dF9jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJf T1JfTlVMTCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gKwo+ICsJb2xkX2Nvbm5fc3RhdGUgPSBk cm1fYXRvbWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiArCUtVTklU X0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ICsKPiArCW5l d19jb25uX3N0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2IgPSBEUk1fSERNSV9CUk9BRENBU1RfUkdC X0ZVTEw7Cj4gKwo+ICsJS1VOSVRfQVNTRVJUX05FKHRlc3QsCj4gKwkJCW9sZF9jb25uX3N0YXRl LT5oZG1pLmJyb2FkY2FzdF9yZ2IsCj4gKwkJCW5ld19jb25uX3N0YXRlLT5oZG1pLmJyb2FkY2Fz dF9yZ2IpOwo+ICsKPiArCXJldCA9IGRybV9hdG9taWNfY2hlY2tfb25seShzdGF0ZSk7Cj4gKwlL VU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiArCj4gKwluZXdfY29ubl9zdGF0ZSA9IGRy bV9hdG9taWNfZ2V0X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ICsJS1VOSVRf QVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gKwlLVU5JVF9F WFBFQ1RfRVEodGVzdCwgbmV3X2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiwgRFJNX0hE TUlfQlJPQURDQVNUX1JHQl9GVUxMKTsKPiArCj4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19n ZXRfbmV3X2NydGNfc3RhdGUoc3RhdGUsIGNydGMpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJf T1JfTlVMTCh0ZXN0LCBjcnRjX3N0YXRlKTsKPiArCUtVTklUX0VYUEVDVF9UUlVFKHRlc3QsIGNy dGNfc3RhdGUtPm1vZGVfY2hhbmdlZCk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFRlc3QgdGhhdCBp ZiB3ZSBzZXQgdGhlIFJHQiBxdWFudGl6YXRpb24gcHJvcGVydHkgdG8gdGhlIHNhbWUgdmFsdWUs Cj4gKyAqIHdlIGRvbid0IHRyaWdnZXIgYSBtb2RlIGNoYW5nZSBvbiB0aGUgY29ubmVjdG9yJ3Mg Q1JUQyBhbmQgbGVhdmUgdGhlCj4gKyAqIGNvbm5lY3RvciB1bmFmZmVjdGVkLgo+ICsgKi8KPiAr c3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0X3JnYl9jcnRjX21vZGVfbm90X2No YW5nZWQoc3RydWN0IGt1bml0ICp0ZXN0KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19oZWxw ZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiArCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1 aXJlX2N0eCAqY3R4Owo+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25uX3N0 YXRlOwo+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0YXRlOwo+ICsJ c3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ICsJc3RydWN0IGRybV9hdG9taWNf c3RhdGUgKnN0YXRlOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnByZWZlcnJlZDsKPiAr CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uOwo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRybTsK PiArCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKPiArCWludCByZXQ7Cj4gKwo+ICsJcHJpdiA9IGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2luaXQodGVzdCk7Cj4gKwlLVU5JVF9BU1NF UlRfTk9UX05VTEwodGVzdCwgcHJpdik7Cj4gKwo+ICsJY3R4ID0gZHJtX2t1bml0X2hlbHBlcl9h Y3F1aXJlX2N0eF9hbGxvYyh0ZXN0KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwo dGVzdCwgY3R4KTsKPiArCj4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiArCXByZWZlcnJl ZCA9IGZpbmRfcHJlZmVycmVkX21vZGUoY29ubik7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX05VTEwo dGVzdCwgcHJlZmVycmVkKTsKPiArCj4gKwlkcm0gPSAmcHJpdi0+ZHJtOwo+ICsJY3J0YyA9IHBy aXYtPmNydGM7Cj4gKwlyZXQgPSBsaWdodF91cF9jb25uZWN0b3IodGVzdCwgZHJtLCBjcnRjLCBj b25uLCBwcmVmZXJyZWQsIGN0eCk7Cj4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsK PiArCj4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRlX2FsbG9jKHRlc3Qs IGRybSwgY3R4KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgc3RhdGUp Owo+ICsKPiArCW5ld19jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVjdG9yX3N0YXRl KHN0YXRlLCBjb25uKTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgbmV3 X2Nvbm5fc3RhdGUpOwo+ICsKPiArCW9sZF9jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfb2xk X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9P Ul9OVUxMKHRlc3QsIG9sZF9jb25uX3N0YXRlKTsKPiArCj4gKwluZXdfY29ubl9zdGF0ZS0+aGRt aS5icm9hZGNhc3RfcmdiID0gb2xkX2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYjsKPiAr Cj4gKwlyZXQgPSBkcm1fYXRvbWljX2NoZWNrX29ubHkoc3RhdGUpOwo+ICsJS1VOSVRfQVNTRVJU X0VRKHRlc3QsIHJldCwgMCk7Cj4gKwo+ICsJb2xkX2Nvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dl dF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiArCUtVTklUX0FTU0VSVF9OT1Rf RVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ICsKPiArCW5ld19jb25uX3N0YXRl ID0gZHJtX2F0b21pY19nZXRfbmV3X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gKwlL VU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIG5ld19jb25uX3N0YXRlKTsKPiArCj4g KwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwKPiArCQkJb2xkX2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRj YXN0X3JnYiwKPiArCQkJbmV3X2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYik7Cj4gKwo+ ICsJY3J0Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLCBjcnRj KTsKPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgY3J0Y19zdGF0ZSk7Cj4g KwlLVU5JVF9FWFBFQ1RfRkFMU0UodGVzdCwgY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkKTsKPiAr fQo+ICsKPiArc3RhdGljIHN0cnVjdCBrdW5pdF9jYXNlIGRybV9hdG9taWNfaGVscGVyX2Nvbm5l Y3Rvcl9oZG1pX2NoZWNrX3Rlc3RzW10gPSB7Cj4gKwlLVU5JVF9DQVNFKGRybV90ZXN0X2NoZWNr X2Jyb2FkY2FzdF9yZ2JfY3J0Y19tb2RlX2NoYW5nZWQpLAo+ICsJS1VOSVRfQ0FTRShkcm1fdGVz dF9jaGVja19icm9hZGNhc3RfcmdiX2NydGNfbW9kZV9ub3RfY2hhbmdlZCksCj4gKwl7IH0KPiAr fTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfc3VpdGUgZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX2hkbWlfY2hlY2tfdGVzdF9zdWl0ZSA9IHsKPiArCS5uYW1lCQk9ICJkcm1fYXRvbWlj X2hlbHBlcl9jb25uZWN0b3JfaGRtaV9jaGVjayIsCj4gKwkudGVzdF9jYXNlcwk9IGRybV9hdG9t aWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2NoZWNrX3Rlc3RzLAo+ICt9Owo+ICsKPiArLyoKPiAr ICogVGVzdCB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgQnJvYWRjYXN0IFJHQiBwcm9wZXJ0eSBvdXQg b2YgcmVzZXQgaXMgc2V0Cj4gKyAqIHRvIGF1dG8uCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCBkcm1f dGVzdF9jaGVja19icm9hZGNhc3RfcmdiX3ZhbHVlKHN0cnVjdCBrdW5pdCAqdGVzdCkKPiArewo+ ICsJc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKnByaXY7Cj4g KwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZTsKPiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uOwo+ICsKPiArCXByaXYgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0 b3JfaGRtaV9pbml0KHRlc3QpOwo+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHByaXYp Owo+ICsKPiArCWNvbm4gPSAmcHJpdi0+Y29ubmVjdG9yOwo+ICsJY29ubl9zdGF0ZSA9IGNvbm4t PnN0YXRlOwo+ICsJS1VOSVRfRVhQRUNUX0VRKHRlc3QsIGNvbm5fc3RhdGUtPmhkbWkuYnJvYWRj YXN0X3JnYiwgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPKTsKPiArfQo+ICsKPiArc3RhdGlj IHN0cnVjdCBrdW5pdF9jYXNlIGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0 X3Rlc3RzW10gPSB7Cj4gKwlLVU5JVF9DQVNFKGRybV90ZXN0X2NoZWNrX2Jyb2FkY2FzdF9yZ2Jf dmFsdWUpLAo+ICsJeyB9Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0X3Rlc3Rfc3VpdGUgPSB7Cj4gKwku bmFtZQkJPSAiZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXQiLAo+ICsJLnRl c3RfY2FzZXMgCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXRfdGVzdHMs Cj4gK307Cj4gKwo+ICtrdW5pdF90ZXN0X3N1aXRlcygKPiArCSZkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfaGRtaV9jaGVja190ZXN0X3N1aXRlLAo+ICsJJmRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX3Jlc2V0X3Rlc3Rfc3VpdGUsCj4gKyk7Cj4gKwo+ICtNT0RVTEVfQVVUSE9S KCJNYXhpbWUgUmlwYXJkIDxtcmlwYXJkQGtlcm5lbC5vcmc+Iik7Cj4gK01PRFVMRV9MSUNFTlNF KCJHUEwiKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0 b3JfdGVzdC5jIGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4g aW5kZXggOGYwNzBjYWNhYjNiLi40MWQzM2RlYTMwYWYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4gQEAgLTEyLDYgKzEyLDggQEAKPiAgCj4gICNp bmNsdWRlIDxrdW5pdC90ZXN0Lmg+Cj4gIAo+ICsjaW5jbHVkZSAiLi4vZHJtX2NydGNfaW50ZXJu YWwuaCIKPiArCj4gIHN0cnVjdCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdiB7Cj4gIAlzdHJ1Y3Qg ZHJtX2RldmljZSBkcm07Cj4gIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Cj4gQEAg LTM1NywxMCArMzU5LDEyMyBAQCBzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRybV9nZXRfdHZf bW9kZV9mcm9tX25hbWVfdGVzdF9zdWl0ZSA9IHsKPiAgCS50ZXN0X2Nhc2VzID0gZHJtX2dldF90 dl9tb2RlX2Zyb21fbmFtZV90ZXN0cywKPiAgfTsKPiAgCj4gK3N0cnVjdCBkcm1faGRtaV9jb25u ZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0IHsKPiArCXVuc2lnbmVkIGludCBraW5k Owo+ICsJY29uc3QgY2hhciAqZXhwZWN0ZWRfbmFtZTsKPiArfTsKPiArCj4gKyNkZWZpbmUgQlJP QURDQVNUX1JHQl9URVNUKF9raW5kLCBfbmFtZSkJXAo+ICsJewkJCQkJXAo+ICsJCS5raW5kID0g X2tpbmQsCQkJXAo+ICsJCS5leHBlY3RlZF9uYW1lID0gX25hbWUsCQlcCj4gKwl9Cj4gKwo+ICtz dGF0aWMgdm9pZCBkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2Jf bmFtZShzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBkcm1faGRtaV9j b25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0ICpwYXJhbXMgPQo+ICsJCXRlc3Qt PnBhcmFtX3ZhbHVlOwo+ICsKPiArCUtVTklUX0VYUEVDVF9TVFJFUSh0ZXN0LAo+ICsJCQkgICBk cm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZShwYXJhbXMtPmtpbmQpLAo+ ICsJCQkgICBwYXJhbXMtPmV4cGVjdGVkX25hbWUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3QK PiArc3RydWN0IGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3Rlc3QK PiArZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWRfdGVzdHNb XSA9IHsKPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE8s ICJBdXRvbWF0aWMiKSwKPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1fSERNSV9CUk9BRENBU1Rf UkdCX0ZVTEwsICJGdWxsIiksCj4gKwlCUk9BRENBU1RfUkdCX1RFU1QoRFJNX0hETUlfQlJPQURD QVNUX1JHQl9MSU1JVEVELCAiTGltaXRlZCAxNjoyMzUiKSwKPiArfTsKPiArCj4gK3N0YXRpYyB2 b2lkCj4gK2RybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3ZhbGlkX2Rl c2MoY29uc3Qgc3RydWN0IGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1l X3Rlc3QgKnQsCj4gKwkJCQkJCSAgICAgY2hhciAqZGVzYykKPiArewo+ICsJc3ByaW50ZihkZXNj LCAiJXMiLCB0LT5leHBlY3RlZF9uYW1lKTsKPiArfQo+ICsKPiArS1VOSVRfQVJSQVlfUEFSQU0o ZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWQsCj4gKwkJICBk cm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV92YWxpZF90ZXN0cywKPiAr CQkgIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3ZhbGlkX2Rlc2Mp Owo+ICsKPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9h ZGNhc3RfcmdiX25hbWVfaW52YWxpZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gK3sKPiArCUtVTklU X0VYUEVDVF9OVUxMKHRlc3QsIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9u YW1lKDMpKTsKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBkcm1faGRtaV9j b25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0c1tdID0gewo+ICsJS1VOSVRfQ0FT RV9QQVJBTShkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFt ZSwKPiArCQkJIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3ZhbGlk X2dlbl9wYXJhbXMpLAo+ICsJS1VOSVRfQ0FTRShkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3Jf Z2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV9pbnZhbGlkKSwKPiArCXsgfQo+ICt9Owo+ICsKPiArc3Rh dGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9y Z2JfbmFtZV90ZXN0X3N1aXRlID0gewo+ICsJLm5hbWUgPSAiZHJtX2hkbWlfY29ubmVjdG9yX2dl dF9icm9hZGNhc3RfcmdiX25hbWUiLAo+ICsJLnRlc3RfY2FzZXMgPSBkcm1faGRtaV9jb25uZWN0 b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0cywKPiArfTsKPiArCj4gK3N0YXRpYyB2b2lk IGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3Ry dWN0IGt1bml0ICp0ZXN0KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9pbml0X3ByaXYg KnByaXYgPSB0ZXN0LT5wcml2Owo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9 ICZwcml2LT5jb25uZWN0b3I7Cj4gKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOwo+ICsJaW50 IHJldDsKPiArCj4gKwlyZXQgPSBkcm1tX2Nvbm5lY3Rvcl9pbml0KCZwcml2LT5kcm0sIGNvbm5l Y3RvciwKPiArCQkJCSAgJmR1bW15X2Z1bmNzLAo+ICsJCQkJICBEUk1fTU9ERV9DT05ORUNUT1Jf SERNSUEsCj4gKwkJCQkgICZwcml2LT5kZGMpOwo+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJl dCwgMCk7Cj4gKwo+ICsJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9w cm9wZXJ0eShjb25uZWN0b3IpOwo+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4g Kwo+ICsJcHJvcCA9IGNvbm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKPiArCUtVTklU X0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcm9wKTsKPiArCUtVTklUX0VYUEVDVF9OT1RfTlVMTCh0 ZXN0LCBkcm1fbW9kZV9vYmpfZmluZF9wcm9wX2lkKCZjb25uZWN0b3ItPmJhc2UsIHByb3AtPmJh c2UuaWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfZHJtX2Nvbm5lY3Rvcl9h dHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eV9oZG1pX2Nvbm5lY3RvcihzdHJ1Y3Qga3VuaXQg KnRlc3QpCj4gK3sKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX2luaXRfcHJpdiAqcHJpdiA9IHRl c3QtPnByaXY7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJnByaXYtPmNv bm5lY3RvcjsKPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gKwlpbnQgcmV0Owo+ICsK PiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdCgmcHJpdi0+ZHJtLCBjb25uZWN0b3Is Cj4gKwkJCQkgICAgICAgJmR1bW15X2Z1bmNzLAo+ICsJCQkJICAgICAgIERSTV9NT0RFX0NPTk5F Q1RPUl9IRE1JQSwKPiArCQkJCSAgICAgICAmcHJpdi0+ZGRjKTsKPiArCUtVTklUX0VYUEVDVF9F USh0ZXN0LCByZXQsIDApOwo+ICsKPiArCXJldCA9IGRybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2Fk Y2FzdF9yZ2JfcHJvcGVydHkoY29ubmVjdG9yKTsKPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCBy ZXQsIDApOwo+ICsKPiArCXByb3AgPSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7 Cj4gKwlLVU5JVF9BU1NFUlRfTk9UX05VTEwodGVzdCwgcHJvcCk7Cj4gKwlLVU5JVF9FWFBFQ1Rf Tk9UX05VTEwodGVzdCwgZHJtX21vZGVfb2JqX2ZpbmRfcHJvcF9pZCgmY29ubmVjdG9yLT5iYXNl LCBwcm9wLT5iYXNlLmlkKSk7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBk cm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5X3Rlc3RzW10gPSB7Cj4g KwlLVU5JVF9DQVNFKGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2Jf cHJvcGVydHkpLAo+ICsJS1VOSVRfQ0FTRShkcm1fdGVzdF9kcm1fY29ubmVjdG9yX2F0dGFjaF9i cm9hZGNhc3RfcmdiX3Byb3BlcnR5X2hkbWlfY29ubmVjdG9yKSwKPiArCXsgfQo+ICt9Owo+ICsK PiArc3RhdGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBkcm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNh c3RfcmdiX3Byb3BlcnR5X3Rlc3Rfc3VpdGUgPSB7Cj4gKwkubmFtZSA9ICJkcm1fY29ubmVjdG9y X2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5IiwKPiArCS5pbml0ID0gZHJtX3Rlc3RfY29u bmVjdG9yX2luaXQsCj4gKwkudGVzdF9jYXNlcyA9IGRybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2Fk Y2FzdF9yZ2JfcHJvcGVydHlfdGVzdHMsCj4gK307Cj4gKwo+ICBrdW5pdF90ZXN0X3N1aXRlcygK PiAgCSZkcm1tX2Nvbm5lY3Rvcl9oZG1pX2luaXRfdGVzdF9zdWl0ZSwKPiAgCSZkcm1tX2Nvbm5l Y3Rvcl9pbml0X3Rlc3Rfc3VpdGUsCj4gLQkmZHJtX2dldF90dl9tb2RlX2Zyb21fbmFtZV90ZXN0 X3N1aXRlCj4gKwkmZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eV90 ZXN0X3N1aXRlLAo+ICsJJmRybV9nZXRfdHZfbW9kZV9mcm9tX25hbWVfdGVzdF9zdWl0ZSwKPiAr CSZkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0X3N1aXRlCj4g ICk7Cj4gIAo+ICBNT0RVTEVfQVVUSE9SKCJNYXhpbWUgUmlwYXJkIDxtYXhpbWVAY2Vybm8udGVj aD4iKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlk LmggYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2t1bml0X2VkaWQuaAo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4yYmJhMzE2ZGUwNjQKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlkLmgKPiBAQCAt MCwwICsxLDEwNiBAQAo+ICsjaWZuZGVmIERSTV9LVU5JVF9FRElEX0hfCj4gKyNkZWZpbmUgRFJN X0tVTklUX0VESURfSF8KPiArCj4gKy8qCj4gKyAqIGVkaWQtZGVjb2RlIChoZXgpOgo+ICsgKgo+ ICsgKiAwMCBmZiBmZiBmZiBmZiBmZiBmZiAwMCAzMSBkOCAyYSAwMCAwMCAwMCAwMCAwMAo+ICsg KiAwMCAyMSAwMSAwMyA4MSBhMCA1YSA3OCAwMiAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAw MCAwMCAwMCAyMCAwMCAwMCAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMQo+ICsgKiAwMSAw MSAwMSAwMSAwMSAwMSAwMiAzYSA4MCAxOCA3MSAzOCAyZCA0MCA1OCAyYwo+ICsgKiA0NSAwMCA0 MCA4NCA2MyAwMCAwMCAxZSAwMCAwMCAwMCBmYyAwMCA1NCA2NSA3Mwo+ICsgKiA3NCAyMCA0NSA0 NCA0OSA0NCAwYSAyMCAyMCAyMCAwMCAwMCAwMCBmZCAwMCAzMgo+ICsgKiA0NiAxZSA0NiAwZiAw MCAwYSAyMCAyMCAyMCAyMCAyMCAyMCAwMCAwMCAwMCAxMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMSA5Mgo+ICsgKgo+ICsgKiAwMiAwMyAxYiA4MSBl MyAwNSAwMCAyMCA0MSAxMCBlMiAwMCA0YSA2ZCAwMyAwYwo+ICsgKiAwMCAxMiAzNCAwMCAyOCAy MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMAo+ICsgKiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCBkMAo+ICsgKgo+ICsgKiAtLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIEJs b2NrIDAsIEJhc2UgRURJRDoKPiArICogICBFRElEIFN0cnVjdHVyZSBWZXJzaW9uICYgUmV2aXNp b246IDEuMwo+ICsgKiAgIFZlbmRvciAmIFByb2R1Y3QgSWRlbnRpZmljYXRpb246Cj4gKyAqICAg ICBNYW51ZmFjdHVyZXI6IExOWAo+ICsgKiAgICAgTW9kZWw6IDQyCj4gKyAqICAgICBNYWRlIGlu OiAyMDIzCj4gKyAqICAgQmFzaWMgRGlzcGxheSBQYXJhbWV0ZXJzICYgRmVhdHVyZXM6Cj4gKyAq ICAgICBEaWdpdGFsIGRpc3BsYXkKPiArICogICAgIERGUCAxLnggY29tcGF0aWJsZSBUTURTCj4g KyAqICAgICBNYXhpbXVtIGltYWdlIHNpemU6IDE2MCBjbSB4IDkwIGNtCj4gKyAqICAgICBHYW1t YTogMi4yMAo+ICsgKiAgICAgTW9ub2Nocm9tZSBvciBncmF5c2NhbGUgZGlzcGxheQo+ICsgKiAg ICAgRmlyc3QgZGV0YWlsZWQgdGltaW5nIGlzIHRoZSBwcmVmZXJyZWQgdGltaW5nCj4gKyAqICAg Q29sb3IgQ2hhcmFjdGVyaXN0aWNzOgo+ICsgKiAgICAgUmVkICA6IDAuMDAwMCwgMC4wMDAwCj4g KyAqICAgICBHcmVlbjogMC4wMDAwLCAwLjAwMDAKPiArICogICAgIEJsdWUgOiAwLjAwMDAsIDAu MDAwMAo+ICsgKiAgICAgV2hpdGU6IDAuMDAwMCwgMC4wMDAwCj4gKyAqICAgRXN0YWJsaXNoZWQg VGltaW5ncyBJICYgSUk6Cj4gKyAqICAgICBETVQgMHgwNDogICA2NDB4NDgwICAgIDU5Ljk0MDQ3 NiBIeiAgIDQ6MyAgICAgMzEuNDY5IGtIeiAgICAgMjUuMTc1MDAwIE1Iego+ICsgKiAgIFN0YW5k YXJkIFRpbWluZ3M6IG5vbmUKPiArICogICBEZXRhaWxlZCBUaW1pbmcgRGVzY3JpcHRvcnM6Cj4g KyAqICAgICBEVEQgMTogIDE5MjB4MTA4MCAgIDYwLjAwMDAwMCBIeiAgMTY6OSAgICAgNjcuNTAw IGtIeiAgICAxNDguNTAwMDAwIE1IeiAoMTYwMCBtbSB4IDkwMCBtbSkKPiArICogICAgICAgICAg ICAgICAgICBIZnJvbnQgICA4OCBIc3luYyAgNDQgSGJhY2sgIDE0OCBIcG9sIFAKPiArICogICAg ICAgICAgICAgICAgICBWZnJvbnQgICAgNCBWc3luYyAgIDUgVmJhY2sgICAzNiBWcG9sIFAKPiAr ICogICAgIERpc3BsYXkgUHJvZHVjdCBOYW1lOiAnVGVzdCBFRElEJwo+ICsgKiAgICAgRGlzcGxh eSBSYW5nZSBMaW1pdHM6Cj4gKyAqICAgICAgIE1vbml0b3IgcmFuZ2VzIChHVEYpOiA1MC03MCBI eiBWLCAzMC03MCBrSHogSCwgbWF4IGRvdGNsb2NrIDE1MCBNSHoKPiArICogICAgIER1bW15IERl c2NyaXB0b3I6Cj4gKyAqICAgRXh0ZW5zaW9uIGJsb2NrczogMQo+ICsgKiBDaGVja3N1bTogMHg5 Mgo+ICsgKgo+ICsgKiAtLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIEJsb2NrIDEsIENUQS04 NjEgRXh0ZW5zaW9uIEJsb2NrOgo+ICsgKiAgIFJldmlzaW9uOiAzCj4gKyAqICAgVW5kZXJzY2Fu cyBJVCBWaWRlbyBGb3JtYXRzIGJ5IGRlZmF1bHQKPiArICogICBOYXRpdmUgZGV0YWlsZWQgbW9k ZXM6IDEKPiArICogICBDb2xvcmltZXRyeSBEYXRhIEJsb2NrOgo+ICsgKiAgICAgc1JHQgo+ICsg KiAgIFZpZGVvIERhdGEgQmxvY2s6Cj4gKyAqICAgICBWSUMgIDE2OiAgMTkyMHgxMDgwICAgNjAu MDAwMDAwIEh6ICAxNjo5ICAgICA2Ny41MDAga0h6ICAgIDE0OC41MDAwMDAgTUh6Cj4gKyAqICAg VmlkZW8gQ2FwYWJpbGl0eSBEYXRhIEJsb2NrOgo+ICsgKiAgICAgWUNiQ3IgcXVhbnRpemF0aW9u OiBObyBEYXRhCj4gKyAqICAgICBSR0IgcXVhbnRpemF0aW9uOiBTZWxlY3RhYmxlICh2aWEgQVZJ IFEpCj4gKyAqICAgICBQVCBzY2FuIGJlaGF2aW9yOiBObyBEYXRhCj4gKyAqICAgICBJVCBzY2Fu IGJlaGF2aW9yOiBBbHdheXMgVW5kZXJzY2FubmVkCj4gKyAqICAgICBDRSBzY2FuIGJlaGF2aW9y OiBBbHdheXMgVW5kZXJzY2FubmVkCj4gKyAqICAgVmVuZG9yLVNwZWNpZmljIERhdGEgQmxvY2sg KEhETUkpLCBPVUkgMDAtMEMtMDM6Cj4gKyAqICAgICBTb3VyY2UgcGh5c2ljYWwgYWRkcmVzczog MS4yLjMuNAo+ICsgKiAgICAgTWF4aW11bSBUTURTIGNsb2NrOiAyMDAgTUh6Cj4gKyAqICAgICBF eHRlbmRlZCBIRE1JIHZpZGVvIGRldGFpbHM6Cj4gKyAqIENoZWNrc3VtOiAweGQwICBVbnVzZWQg c3BhY2UgaW4gRXh0ZW5zaW9uIEJsb2NrOiAxMDAgYnl0ZXMKPiArICovCj4gK2NvbnN0IHVuc2ln bmVkIGNoYXIgdGVzdF9lZGlkX2hkbWlfMTA4MHBfcmdiX21heF8yMDBtaHpbXSA9IHsKPiArICAw eDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMxLCAweGQ4 LCAweDJhLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsIDB4 MDEsIDB4MDMsIDB4ODEsIDB4YTAsIDB4NWEsIDB4NzgsCj4gKyAgMHgwMiwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwKPiAr ICAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAw eDAxLCAweDAxLCAweDAxLAo+ICsgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEs IDB4MDIsIDB4M2EsIDB4ODAsIDB4MTgsIDB4NzEsIDB4MzgsCj4gKyAgMHgyZCwgMHg0MCwgMHg1 OCwgMHgyYywgMHg0NSwgMHgwMCwgMHg0MCwgMHg4NCwgMHg2MywgMHgwMCwgMHgwMCwgMHgxZSwK PiArICAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDAwLCAweDU0LCAweDY1LCAweDczLCAweDc0 LCAweDIwLCAweDQ1LCAweDQ0LAo+ICsgIDB4NDksIDB4NDQsIDB4MGEsIDB4MjAsIDB4MjAsIDB4 MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MzIsCj4gKyAgMHg0NiwgMHgwMCwg MHgwMCwgMHhjNCwgMHgwMCwgMHgwYSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgy MCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDEsIDB4NDEsIDB4MDIsIDB4MDMsIDB4MWIsIDB4ODEsCj4gKyAgMHhlMywgMHgw NSwgMHgwMCwgMHgyMCwgMHg0MSwgMHgxMCwgMHhlMiwgMHgwMCwgMHg0YSwgMHg2ZCwgMHgwMywg MHgwYywKPiArICAweDAwLCAweDEyLCAweDM0LCAweDAwLCAweDI4LCAweDIwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gKyAgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gKyAgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gKyAg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwgMHgwMCwKPiArICAweDAwLCAweDAwLCAweDAwLCAweGQwCj4gK307Cj4gKwo+ICsj ZW5kaWYgLy8gRFJNX0tVTklUX0VESURfSF8KPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJt X2Nvbm5lY3Rvci5oIGIvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCj4gaW5kZXggMDAwYTJh MTU2NjE5Li4zODY3YTRjMDFiNzggMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2Nvbm5l Y3Rvci5oCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCj4gQEAgLTM2OCw2ICsz NjgsMzAgQEAgZW51bSBkcm1fcGFuZWxfb3JpZW50YXRpb24gewo+ICAJRFJNX01PREVfUEFORUxf T1JJRU5UQVRJT05fUklHSFRfVVAsCj4gIH07Cj4gIAo+ICsvKioKPiArICogZW51bSBkcm1faGRt aV9icm9hZGNhc3RfcmdiIC0gQnJvYWRjYXN0IFJHQiBTZWxlY3Rpb24gZm9yIGFuIEhETUkgQGRy bV9jb25uZWN0b3IKPiArICovCj4gK2VudW0gZHJtX2hkbWlfYnJvYWRjYXN0X3JnYiB7Cj4gKwkv KioKPiArCSAqIEBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE86IFRoZSBSR0IgcmFuZ2UgaXMg c2VsZWN0ZWQKPiArCSAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIG1vZGUuCj4gKwkgKi8K PiArCURSTV9IRE1JX0JST0FEQ0FTVF9SR0JfQVVUTywKPiArCj4gKwkvKioKPiArCSAqIEBEUk1f SERNSV9CUk9BRENBU1RfUkdCX0ZVTEw6IEZ1bGwgcmFuZ2UgUkdCIGlzIGZvcmNlZC4KPiArCSAq Lwo+ICsJRFJNX0hETUlfQlJPQURDQVNUX1JHQl9GVUxMLAo+ICsKPiArCS8qKgo+ICsJICogQERS TV9IRE1JX0JST0FEQ0FTVF9SR0JfTElNSVRFRDogTGltaXRlZCByYW5nZSBSR0IgaXMgZm9yY2Vk Lgo+ICsJICovCj4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdCX0xJTUlURUQsCj4gK307Cj4gKwo+ ICtjb25zdCBjaGFyICoKPiArZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25h bWUoZW51bSBkcm1faGRtaV9icm9hZGNhc3RfcmdiIGJyb2FkY2FzdF9yZ2IpOwo+ICsKPiAgLyoq Cj4gICAqIHN0cnVjdCBkcm1fbW9uaXRvcl9yYW5nZV9pbmZvIC0gUGFuZWwncyBNb25pdG9yIHJh bmdlIGluIEVESUQgZm9yCj4gICAqICZkcm1fZGlzcGxheV9pbmZvCj4gQEAgLTEwMzcsNiArMTA2 MSwxMSBAQCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSB7Cj4gIAkgKiBAZHJtX2F0b21pY19o ZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2soKS4KPiAgCSAqLwo+ICAJc3RydWN0IHsKPiArCQkv KioKPiArCQkgKiBAYnJvYWRjYXN0X3JnYjogQ29ubmVjdG9yIHByb3BlcnR5IHRvIHBhc3MgdGhl Cj4gKwkJICogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdmFsdWUuCj4gKwkJICovCj4gKwkJZW51 bSBkcm1faGRtaV9icm9hZGNhc3RfcmdiIGJyb2FkY2FzdF9yZ2I7Cj4gIAl9IGhkbWk7Cj4gIH07 Cj4gIAo+IEBAIC0xNzA2LDYgKzE3MzUsMTIgQEAgc3RydWN0IGRybV9jb25uZWN0b3Igewo+ICAJ ICovCj4gIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcml2YWN5X3NjcmVlbl9od19zdGF0ZV9wcm9w ZXJ0eTsKPiAgCj4gKwkvKioKPiArCSAqIEBicm9hZGNhc3RfcmdiX3Byb3BlcnR5OiBDb25uZWN0 b3IgcHJvcGVydHkgdG8gc2V0IHRoZQo+ICsJICogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdG8g b3V0cHV0IHdpdGguCj4gKwkgKi8KPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKmJyb2FkY2FzdF9y Z2JfcHJvcGVydHk7Cj4gKwo+ICAjZGVmaW5lIERSTV9DT05ORUNUT1JfUE9MTF9IUEQgKDEgPDwg MCkKPiAgI2RlZmluZSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVCAoMSA8PCAxKQo+ICAjZGVm aW5lIERSTV9DT05ORUNUT1JfUE9MTF9ESVNDT05ORUNUICgxIDw8IDIpCj4gQEAgLTIwMjYsNiAr MjA2MSw3IEBAIGludCBkcm1fY29ubmVjdG9yX2F0dGFjaF9zY2FsaW5nX21vZGVfcHJvcGVydHko c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiAgCQkJCQkgICAgICAgdTMyIHNjYWxp bmdfbW9kZV9tYXNrKTsKPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX3Zycl9jYXBhYmxlX3By b3BlcnR5KAo+ICAJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+ICtpbnQgZHJt X2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yKTsKPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX2NvbG9yc3BhY2Vf cHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gIGludCBkcm1fY29u bmVjdG9yX2F0dGFjaF9oZHJfb3V0cHV0X21ldGFkYXRhX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IpOwo+ICBib29sIGRybV9jb25uZWN0b3JfYXRvbWljX2hkcl9tZXRh ZGF0YV9lcXVhbChzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX3N0YXRlLAo+IAo+IC0t IAo+IDIuNDMuMAo+IAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK 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 82569C3DA79 for ; Mon, 15 Jan 2024 14:33:18 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E1A8910E2CE; Mon, 15 Jan 2024 14:33:17 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 044AA10E2CE for ; Mon, 15 Jan 2024 14:33:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329196; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=dle2jiIP2sXiEsy+QBbP1u/VmeetZ0CHb56l02ANn2bGoh3aiV0xrJ34PuIiighjw1bgR3 KEsMcp16+V/0mIl7MQqD2vZEPWJy8C2gpcPoUt3BvrkcXlSPk0iVdipVRgrtbq7UcnGOgx eIpXHqPW7JkD5do/2uSabIMb+e64L4I= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-640-1H0DBue_MAer9MU7FOi0yw-1; Mon, 15 Jan 2024 09:33:12 -0500 X-MC-Unique: 1H0DBue_MAer9MU7FOi0yw-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40e4576b7e6so61413195e9.0 for ; Mon, 15 Jan 2024 06:33:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329191; x=1705933991; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=28ByMKhxREBk/TWcgDByOFvaCc0zqNnOfSlV0PATldA=; b=N1XuoWJxNCR8BdvrW6KRVpGQbQecy+NFbNuNh0YyyXJ4tEN1P/egdClZY9+l7KYkVZ cp21eYf0ohrDpphcrpl5CcSKlkNcdvsEIsSeipM0m3lO523tcdZfN13MLu/iw3snBBo0 +tpFRZeLxX35PJMilAy78Ou+hGcQtfPSDyhj73dBT+pgEiIbDMkRdtAVcSNdIsDrT8Y+ EXa9oHxQczo8pG57J3SlW1QpMj9kyPekcKiBPY1XeycRbYaB08iC+euP+Xm3/lkOSWcv qVKlCGs8pGXUqwHglQ7c3Npyn0oma2/s5f1dKLySzTc5vUDYN1gk77yJX52HvYfRflfQ g5Ng== X-Gm-Message-State: AOJu0YzqyHLeQAYc+PlPpmrIgZRUyHrHBpHTeh5euHDyrJ1tNCVApfZB AQC1pHC+LJLhxFchwyfac52ak23RifUSplcKO8A7wF5zf+JliWevARcJeKhNnb4DiTvfGP7Lc18 rF/Pe5nBdZOZnGlWIuwch+27NxTDj7zUCC+e6 X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035179wma.230.1705329191023; Mon, 15 Jan 2024 06:33:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IGnFpNvbECPYnHXUb6ozmA7yyk68z6lU24Rulo6C/Itudf1qtyIV6rA40/SMTmfGJac297SBQ== X-Received: by 2002:a7b:cc81:0:b0:40e:3f90:3920 with SMTP id p1-20020a7bcc81000000b0040e3f903920mr2035169wma.230.1705329190506; Mon, 15 Jan 2024 06:33:10 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id o8-20020a05600c4fc800b0040e549c77a1sm20056078wmq.32.2024.01.15.06.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:33:10 -0800 (PST) Date: Mon, 15 Jan 2024 15:33:08 +0100 From: Sebastian Wick To: Maxime Ripard Subject: Re: [PATCH v5 08/44] drm/connector: hdmi: Add Broadcast RGB property Message-ID: <20240115143308.GA159345@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> MIME-Version: 1.0 In-Reply-To: <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Zimmermann , Emma Anholt , Jonathan Corbet , linux-kernel@vger.kernel.org, Samuel Holland , Sandy Huang , Jernej Skrabec , linux-doc@vger.kernel.org, Hans Verkuil , linux-rockchip@lists.infradead.org, Chen-Yu Tsai , dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, David Airlie , linux-sunxi@lists.linux.dev, linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Thu, Dec 07, 2023 at 04:49:31PM +0100, Maxime Ripard wrote: > The i915 driver has a property to force the RGB range of an HDMI output. > The vc4 driver then implemented the same property with the same > semantics. KWin has support for it, and a PR for mutter is also there to > support it. > > Both drivers implementing the same property with the same semantics, > plus the userspace having support for it, is proof enough that it's > pretty much a de-facto standard now and we can provide helpers for it. > > Let's plumb it into the newly created HDMI connector. > > Signed-off-by: Maxime Ripard > --- > Documentation/gpu/kms-properties.csv | 1 - > drivers/gpu/drm/drm_atomic.c | 5 + > drivers/gpu/drm/drm_atomic_state_helper.c | 17 + > drivers/gpu/drm/drm_atomic_uapi.c | 4 + > drivers/gpu/drm/drm_connector.c | 76 +++++ > drivers/gpu/drm/tests/Makefile | 1 + > .../gpu/drm/tests/drm_atomic_state_helper_test.c | 376 +++++++++++++++++++++ > drivers/gpu/drm/tests/drm_connector_test.c | 117 ++++++- > drivers/gpu/drm/tests/drm_kunit_edid.h | 106 ++++++ > include/drm/drm_connector.h | 36 ++ > 10 files changed, 737 insertions(+), 2 deletions(-) > > diff --git a/Documentation/gpu/kms-properties.csv b/Documentation/gpu/kms-properties.csv > index 0f9590834829..caef14c532d4 100644 > --- a/Documentation/gpu/kms-properties.csv > +++ b/Documentation/gpu/kms-properties.csv > @@ -17,7 +17,6 @@ Owner Module/Drivers,Group,Property Name,Type,Property Values,Object attached,De > ,Virtual GPU,“suggested X”,RANGE,"Min=0, Max=0xffffffff",Connector,property to suggest an X offset for a connector > ,,“suggested Y”,RANGE,"Min=0, Max=0xffffffff",Connector,property to suggest an Y offset for a connector > ,Optional,"""aspect ratio""",ENUM,"{ ""None"", ""4:3"", ""16:9"" }",Connector,TDB > -i915,Generic,"""Broadcast RGB""",ENUM,"{ ""Automatic"", ""Full"", ""Limited 16:235"" }",Connector,"When this property is set to Limited 16:235 and CTM is set, the hardware will be programmed with the result of the multiplication of CTM by the limited range matrix to ensure the pixels normally in the range 0..1.0 are remapped to the range 16/255..235/255." > ,,“audio”,ENUM,"{ ""force-dvi"", ""off"", ""auto"", ""on"" }",Connector,TBD > ,SDVO-TV,“mode”,ENUM,"{ ""NTSC_M"", ""NTSC_J"", ""NTSC_443"", ""PAL_B"" } etc.",Connector,TBD > ,,"""left_margin""",RANGE,"Min=0, Max= SDVO dependent",Connector,TBD > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index c31fc0b48c31..1465a7f09a0b 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -1142,6 +1142,11 @@ static void drm_atomic_connector_print_state(struct drm_printer *p, > drm_printf(p, "\tmax_requested_bpc=%d\n", state->max_requested_bpc); > drm_printf(p, "\tcolorspace=%s\n", drm_get_colorspace_name(state->colorspace)); > > + if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || > + connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) > + drm_printf(p, "\tbroadcast_rgb=%s\n", > + drm_hdmi_connector_get_broadcast_rgb_name(state->hdmi.broadcast_rgb)); > + > if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK) > if (state->writeback_job && state->writeback_job->fb) > drm_printf(p, "\tfb=%d\n", state->writeback_job->fb->base.id); > diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c > index e69c0cc1c6da..10d98620a358 100644 > --- a/drivers/gpu/drm/drm_atomic_state_helper.c > +++ b/drivers/gpu/drm/drm_atomic_state_helper.c > @@ -583,6 +583,7 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_tv_reset); > void __drm_atomic_helper_connector_hdmi_reset(struct drm_connector *connector, > struct drm_connector_state *new_state) > { > + new_state->hdmi.broadcast_rgb = DRM_HDMI_BROADCAST_RGB_AUTO; > } > EXPORT_SYMBOL(__drm_atomic_helper_connector_hdmi_reset); > > @@ -650,6 +651,22 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_tv_check); > int drm_atomic_helper_connector_hdmi_check(struct drm_connector *connector, > struct drm_atomic_state *state) > { > + struct drm_connector_state *old_state = > + drm_atomic_get_old_connector_state(state, connector); > + struct drm_connector_state *new_state = > + drm_atomic_get_new_connector_state(state, connector); > + > + if (old_state->hdmi.broadcast_rgb != new_state->hdmi.broadcast_rgb) { > + struct drm_crtc *crtc = new_state->crtc; > + struct drm_crtc_state *crtc_state; > + > + crtc_state = drm_atomic_get_crtc_state(state, crtc); > + if (IS_ERR(crtc_state)) > + return PTR_ERR(crtc_state); > + > + crtc_state->mode_changed = true; > + } > + > return 0; > } > EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_check); > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index aee4a65d4959..3eb4f4bc8b71 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -818,6 +818,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, > state->max_requested_bpc = val; > } else if (property == connector->privacy_screen_sw_state_property) { > state->privacy_screen_sw_state = val; > + } else if (property == connector->broadcast_rgb_property) { > + state->hdmi.broadcast_rgb = val; > } else if (connector->funcs->atomic_set_property) { > return connector->funcs->atomic_set_property(connector, > state, property, val); > @@ -901,6 +903,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > *val = state->max_requested_bpc; > } else if (property == connector->privacy_screen_sw_state_property) { > *val = state->privacy_screen_sw_state; > + } else if (property == connector->broadcast_rgb_property) { > + *val = state->hdmi.broadcast_rgb; > } else if (connector->funcs->atomic_get_property) { > return connector->funcs->atomic_get_property(connector, > state, property, val); > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index d9961cce8245..929b0a911f62 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -1183,6 +1183,29 @@ static const u32 dp_colorspaces = > BIT(DRM_MODE_COLORIMETRY_BT2020_CYCC) | > BIT(DRM_MODE_COLORIMETRY_BT2020_YCC); > > +static const struct drm_prop_enum_list broadcast_rgb_names[] = { > + { DRM_HDMI_BROADCAST_RGB_AUTO, "Automatic" }, > + { DRM_HDMI_BROADCAST_RGB_FULL, "Full" }, > + { DRM_HDMI_BROADCAST_RGB_LIMITED, "Limited 16:235" }, > +}; > + > +/* > + * drm_hdmi_connector_get_broadcast_rgb_name - Return a string for HDMI connector RGB broadcast selection > + * @broadcast_rgb: Broadcast RGB selection to compute name of > + * > + * Returns: the name of the Broadcast RGB selection, or NULL if the type > + * is not valid. > + */ > +const char * > +drm_hdmi_connector_get_broadcast_rgb_name(enum drm_hdmi_broadcast_rgb broadcast_rgb) > +{ > + if (broadcast_rgb > DRM_HDMI_BROADCAST_RGB_LIMITED) > + return NULL; > + > + return broadcast_rgb_names[broadcast_rgb].name; > +} > +EXPORT_SYMBOL(drm_hdmi_connector_get_broadcast_rgb_name); > + > /** > * DOC: standard connector properties > * > @@ -1655,6 +1678,26 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); > /** > * DOC: HDMI connector properties > * > + * Broadcast RGB > + * Indicates the RGB Quantization Range (Full vs Limited) used. > + * Infoframes will be generated according to that value. > + * > + * The value of this property can be one of the following: > + * > + * Automatic: > + * RGB Range is selected automatically based on the mode > + * according to the HDMI specifications. > + * > + * Full: > + * Full RGB Range is forced. > + * > + * Limited 16:235: > + * Limited RGB Range is forced. Unlike the name suggests, > + * this works for any number of bits-per-component. > + * > + * Drivers can set up this property by calling > + * drm_connector_attach_broadcast_rgb_property(). > + * This is a good time to document this in more detail. There might be two different things being affected: 1. The signalling (InfoFrame/SDP/...) 2. The color pipeline processing All values of Broadcast RGB always affect the color pipeline processing such that a full-range input to the CRTC is converted to either full- or limited-range, depending on what the monitor is supposed to accept. When automatic is selected, does that mean that there is no signalling, or that the signalling matches what the monitor is supposed to accept according to the spec? Also, is this really HDMI specific? When full or limited is selected and the monitor doesn't support the signalling, what happens? > * content type (HDMI specific): > * Indicates content type setting to be used in HDMI infoframes to indicate > * content type for the external device, so that it adjusts its display > @@ -2517,6 +2560,39 @@ int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *conn > } > EXPORT_SYMBOL(drm_connector_attach_hdr_output_metadata_property); > > +/** > + * drm_connector_attach_broadcast_rgb_property - attach "Broadcast RGB" property > + * @connector: connector to attach the property on. > + * > + * This is used to add support for forcing the RGB range on a connector > + * > + * Returns: > + * Zero on success, negative errno on failure. > + */ > +int drm_connector_attach_broadcast_rgb_property(struct drm_connector *connector) > +{ > + struct drm_device *dev = connector->dev; > + struct drm_property *prop; > + > + prop = connector->broadcast_rgb_property; > + if (!prop) { > + prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, > + "Broadcast RGB", > + broadcast_rgb_names, > + ARRAY_SIZE(broadcast_rgb_names)); > + if (!prop) > + return -EINVAL; > + > + connector->broadcast_rgb_property = prop; > + } > + > + drm_object_attach_property(&connector->base, prop, > + DRM_HDMI_BROADCAST_RGB_AUTO); > + > + return 0; > +} > +EXPORT_SYMBOL(drm_connector_attach_broadcast_rgb_property); > + > /** > * drm_connector_attach_colorspace_property - attach "Colorspace" property > * @connector: connector to attach the property on. > diff --git a/drivers/gpu/drm/tests/Makefile b/drivers/gpu/drm/tests/Makefile > index d6183b3d7688..b29ddfd90596 100644 > --- a/drivers/gpu/drm/tests/Makefile > +++ b/drivers/gpu/drm/tests/Makefile > @@ -4,6 +4,7 @@ obj-$(CONFIG_DRM_KUNIT_TEST_HELPERS) += \ > drm_kunit_helpers.o > > obj-$(CONFIG_DRM_KUNIT_TEST) += \ > + drm_atomic_state_helper_test.o \ > drm_buddy_test.o \ > drm_cmdline_parser_test.o \ > drm_connector_test.o \ > diff --git a/drivers/gpu/drm/tests/drm_atomic_state_helper_test.c b/drivers/gpu/drm/tests/drm_atomic_state_helper_test.c > new file mode 100644 > index 000000000000..21e6f796ee13 > --- /dev/null > +++ b/drivers/gpu/drm/tests/drm_atomic_state_helper_test.c > @@ -0,0 +1,376 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +/* > + * Kunit test for drm_atomic_state_helper functions > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include "../drm_crtc_internal.h" > + > +#include > + > +#include "drm_kunit_edid.h" > + > +struct drm_atomic_helper_connector_hdmi_priv { > + struct drm_device drm; > + struct drm_plane *plane; > + struct drm_crtc *crtc; > + struct drm_encoder encoder; > + struct drm_connector connector; > + > + const char *current_edid; > + size_t current_edid_len; > +}; > + > +#define connector_to_priv(c) \ > + container_of_const(c, struct drm_atomic_helper_connector_hdmi_priv, connector) > + > +static struct drm_display_mode *find_preferred_mode(struct drm_connector *connector) > +{ > + struct drm_device *drm = connector->dev; > + struct drm_display_mode *mode, *preferred; > + > + mutex_lock(&drm->mode_config.mutex); > + preferred = list_first_entry(&connector->modes, struct drm_display_mode, head); > + list_for_each_entry(mode, &connector->modes, head) > + if (mode->type & DRM_MODE_TYPE_PREFERRED) > + preferred = mode; > + mutex_unlock(&drm->mode_config.mutex); > + > + return preferred; > +} > + > +static int light_up_connector(struct kunit *test, > + struct drm_device *drm, > + struct drm_crtc *crtc, > + struct drm_connector *connector, > + struct drm_display_mode *mode, > + struct drm_modeset_acquire_ctx *ctx) > +{ > + struct drm_atomic_state *state; > + struct drm_connector_state *conn_state; > + struct drm_crtc_state *crtc_state; > + int ret; > + > + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); > + > + conn_state = drm_atomic_get_connector_state(state, connector); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); > + > + ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); > + KUNIT_EXPECT_EQ(test, ret, 0); > + > + crtc_state = drm_atomic_get_crtc_state(state, crtc); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); > + > + ret = drm_atomic_set_mode_for_crtc(crtc_state, mode); > + KUNIT_EXPECT_EQ(test, ret, 0); > + > + crtc_state->enable = true; > + crtc_state->active = true; > + > + ret = drm_atomic_commit(state); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + return 0; > +} > + > +static int set_connector_edid(struct kunit *test, struct drm_connector *connector, > + const char *edid, size_t edid_len) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv = > + connector_to_priv(connector); > + struct drm_device *drm = connector->dev; > + int ret; > + > + priv->current_edid = edid; > + priv->current_edid_len = edid_len; > + > + mutex_lock(&drm->mode_config.mutex); > + ret = connector->funcs->fill_modes(connector, 4096, 4096); > + mutex_unlock(&drm->mode_config.mutex); > + KUNIT_ASSERT_GT(test, ret, 0); > + > + return 0; > +} > + > +static int dummy_connector_get_modes(struct drm_connector *connector) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv = > + connector_to_priv(connector); > + const struct drm_edid *edid; > + unsigned int num_modes; > + > + edid = drm_edid_alloc(priv->current_edid, priv->current_edid_len); > + if (!edid) > + return -EINVAL; > + > + drm_edid_connector_update(connector, edid); > + num_modes = drm_edid_connector_add_modes(connector); > + > + drm_edid_free(edid); > + > + return num_modes; > +} > + > +static const struct drm_connector_helper_funcs dummy_connector_helper_funcs = { > + .atomic_check = drm_atomic_helper_connector_hdmi_check, > + .get_modes = dummy_connector_get_modes, > +}; > + > +static void dummy_hdmi_connector_reset(struct drm_connector *connector) > +{ > + drm_atomic_helper_connector_reset(connector); > + __drm_atomic_helper_connector_hdmi_reset(connector, connector->state); > +} > + > +static const struct drm_connector_funcs dummy_connector_funcs = { > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > + .fill_modes = drm_helper_probe_single_connector_modes, > + .reset = dummy_hdmi_connector_reset, > +}; > + > +static > +struct drm_atomic_helper_connector_hdmi_priv * > +drm_atomic_helper_connector_hdmi_init(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_connector *conn; > + struct drm_encoder *enc; > + struct drm_device *drm; > + struct device *dev; > + int ret; > + > + dev = drm_kunit_helper_alloc_device(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev); > + > + priv = drm_kunit_helper_alloc_drm_device(test, dev, > + struct drm_atomic_helper_connector_hdmi_priv, drm, > + DRIVER_MODESET | DRIVER_ATOMIC); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv); > + test->priv = priv; > + > + drm = &priv->drm; > + priv->plane = drm_kunit_helper_create_primary_plane(test, drm, > + NULL, > + NULL, > + NULL, 0, > + NULL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->plane); > + > + priv->crtc = drm_kunit_helper_create_crtc(test, drm, > + priv->plane, NULL, > + NULL, > + NULL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->crtc); > + > + enc = &priv->encoder; > + ret = drmm_encoder_init(drm, enc, NULL, DRM_MODE_ENCODER_TMDS, NULL); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + enc->possible_crtcs = drm_crtc_mask(priv->crtc); > + > + conn = &priv->connector; > + ret = drmm_connector_hdmi_init(drm, conn, > + &dummy_connector_funcs, > + DRM_MODE_CONNECTOR_HDMIA, > + NULL); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + drm_connector_helper_add(conn, &dummy_connector_helper_funcs); > + drm_connector_attach_encoder(conn, enc); > + > + drm_mode_config_reset(drm); > + > + ret = set_connector_edid(test, conn, > + test_edid_hdmi_1080p_rgb_max_200mhz, > + ARRAY_SIZE(test_edid_hdmi_1080p_rgb_max_200mhz)); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + return priv; > +} > + > +/* > + * Test that if we change the RGB quantization property to a different > + * value, we trigger a mode change on the connector's CRTC, which will > + * in turn disable/enable the connector. > + */ > +static void drm_test_check_broadcast_rgb_crtc_mode_changed(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_modeset_acquire_ctx *ctx; > + struct drm_connector_state *old_conn_state; > + struct drm_connector_state *new_conn_state; > + struct drm_crtc_state *crtc_state; > + struct drm_atomic_state *state; > + struct drm_display_mode *preferred; > + struct drm_connector *conn; > + struct drm_device *drm; > + struct drm_crtc *crtc; > + int ret; > + > + priv = drm_atomic_helper_connector_hdmi_init(test); > + KUNIT_ASSERT_NOT_NULL(test, priv); > + > + ctx = drm_kunit_helper_acquire_ctx_alloc(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); > + > + conn = &priv->connector; > + preferred = find_preferred_mode(conn); > + KUNIT_ASSERT_NOT_NULL(test, preferred); > + > + drm = &priv->drm; > + crtc = priv->crtc; > + ret = light_up_connector(test, drm, crtc, conn, preferred, ctx); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); > + > + new_conn_state = drm_atomic_get_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + > + old_conn_state = drm_atomic_get_old_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); > + > + new_conn_state->hdmi.broadcast_rgb = DRM_HDMI_BROADCAST_RGB_FULL; > + > + KUNIT_ASSERT_NE(test, > + old_conn_state->hdmi.broadcast_rgb, > + new_conn_state->hdmi.broadcast_rgb); > + > + ret = drm_atomic_check_only(state); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + new_conn_state = drm_atomic_get_new_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + KUNIT_EXPECT_EQ(test, new_conn_state->hdmi.broadcast_rgb, DRM_HDMI_BROADCAST_RGB_FULL); > + > + crtc_state = drm_atomic_get_new_crtc_state(state, crtc); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); > + KUNIT_EXPECT_TRUE(test, crtc_state->mode_changed); > +} > + > +/* > + * Test that if we set the RGB quantization property to the same value, > + * we don't trigger a mode change on the connector's CRTC and leave the > + * connector unaffected. > + */ > +static void drm_test_check_broadcast_rgb_crtc_mode_not_changed(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_modeset_acquire_ctx *ctx; > + struct drm_connector_state *old_conn_state; > + struct drm_connector_state *new_conn_state; > + struct drm_crtc_state *crtc_state; > + struct drm_atomic_state *state; > + struct drm_display_mode *preferred; > + struct drm_connector *conn; > + struct drm_device *drm; > + struct drm_crtc *crtc; > + int ret; > + > + priv = drm_atomic_helper_connector_hdmi_init(test); > + KUNIT_ASSERT_NOT_NULL(test, priv); > + > + ctx = drm_kunit_helper_acquire_ctx_alloc(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); > + > + conn = &priv->connector; > + preferred = find_preferred_mode(conn); > + KUNIT_ASSERT_NOT_NULL(test, preferred); > + > + drm = &priv->drm; > + crtc = priv->crtc; > + ret = light_up_connector(test, drm, crtc, conn, preferred, ctx); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); > + > + new_conn_state = drm_atomic_get_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + > + old_conn_state = drm_atomic_get_old_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); > + > + new_conn_state->hdmi.broadcast_rgb = old_conn_state->hdmi.broadcast_rgb; > + > + ret = drm_atomic_check_only(state); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + old_conn_state = drm_atomic_get_old_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); > + > + new_conn_state = drm_atomic_get_new_connector_state(state, conn); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); > + > + KUNIT_EXPECT_EQ(test, > + old_conn_state->hdmi.broadcast_rgb, > + new_conn_state->hdmi.broadcast_rgb); > + > + crtc_state = drm_atomic_get_new_crtc_state(state, crtc); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); > + KUNIT_EXPECT_FALSE(test, crtc_state->mode_changed); > +} > + > +static struct kunit_case drm_atomic_helper_connector_hdmi_check_tests[] = { > + KUNIT_CASE(drm_test_check_broadcast_rgb_crtc_mode_changed), > + KUNIT_CASE(drm_test_check_broadcast_rgb_crtc_mode_not_changed), > + { } > +}; > + > +static struct kunit_suite drm_atomic_helper_connector_hdmi_check_test_suite = { > + .name = "drm_atomic_helper_connector_hdmi_check", > + .test_cases = drm_atomic_helper_connector_hdmi_check_tests, > +}; > + > +/* > + * Test that the value of the Broadcast RGB property out of reset is set > + * to auto. > + */ > +static void drm_test_check_broadcast_rgb_value(struct kunit *test) > +{ > + struct drm_atomic_helper_connector_hdmi_priv *priv; > + struct drm_connector_state *conn_state; > + struct drm_connector *conn; > + > + priv = drm_atomic_helper_connector_hdmi_init(test); > + KUNIT_ASSERT_NOT_NULL(test, priv); > + > + conn = &priv->connector; > + conn_state = conn->state; > + KUNIT_EXPECT_EQ(test, conn_state->hdmi.broadcast_rgb, DRM_HDMI_BROADCAST_RGB_AUTO); > +} > + > +static struct kunit_case drm_atomic_helper_connector_hdmi_reset_tests[] = { > + KUNIT_CASE(drm_test_check_broadcast_rgb_value), > + { } > +}; > + > +static struct kunit_suite drm_atomic_helper_connector_hdmi_reset_test_suite = { > + .name = "drm_atomic_helper_connector_hdmi_reset", > + .test_cases = drm_atomic_helper_connector_hdmi_reset_tests, > +}; > + > +kunit_test_suites( > + &drm_atomic_helper_connector_hdmi_check_test_suite, > + &drm_atomic_helper_connector_hdmi_reset_test_suite, > +); > + > +MODULE_AUTHOR("Maxime Ripard "); > +MODULE_LICENSE("GPL"); > diff --git a/drivers/gpu/drm/tests/drm_connector_test.c b/drivers/gpu/drm/tests/drm_connector_test.c > index 8f070cacab3b..41d33dea30af 100644 > --- a/drivers/gpu/drm/tests/drm_connector_test.c > +++ b/drivers/gpu/drm/tests/drm_connector_test.c > @@ -12,6 +12,8 @@ > > #include > > +#include "../drm_crtc_internal.h" > + > struct drm_connector_init_priv { > struct drm_device drm; > struct drm_connector connector; > @@ -357,10 +359,123 @@ static struct kunit_suite drm_get_tv_mode_from_name_test_suite = { > .test_cases = drm_get_tv_mode_from_name_tests, > }; > > +struct drm_hdmi_connector_get_broadcast_rgb_name_test { > + unsigned int kind; > + const char *expected_name; > +}; > + > +#define BROADCAST_RGB_TEST(_kind, _name) \ > + { \ > + .kind = _kind, \ > + .expected_name = _name, \ > + } > + > +static void drm_test_drm_hdmi_connector_get_broadcast_rgb_name(struct kunit *test) > +{ > + const struct drm_hdmi_connector_get_broadcast_rgb_name_test *params = > + test->param_value; > + > + KUNIT_EXPECT_STREQ(test, > + drm_hdmi_connector_get_broadcast_rgb_name(params->kind), > + params->expected_name); > +} > + > +static const > +struct drm_hdmi_connector_get_broadcast_rgb_name_test > +drm_hdmi_connector_get_broadcast_rgb_name_valid_tests[] = { > + BROADCAST_RGB_TEST(DRM_HDMI_BROADCAST_RGB_AUTO, "Automatic"), > + BROADCAST_RGB_TEST(DRM_HDMI_BROADCAST_RGB_FULL, "Full"), > + BROADCAST_RGB_TEST(DRM_HDMI_BROADCAST_RGB_LIMITED, "Limited 16:235"), > +}; > + > +static void > +drm_hdmi_connector_get_broadcast_rgb_name_valid_desc(const struct drm_hdmi_connector_get_broadcast_rgb_name_test *t, > + char *desc) > +{ > + sprintf(desc, "%s", t->expected_name); > +} > + > +KUNIT_ARRAY_PARAM(drm_hdmi_connector_get_broadcast_rgb_name_valid, > + drm_hdmi_connector_get_broadcast_rgb_name_valid_tests, > + drm_hdmi_connector_get_broadcast_rgb_name_valid_desc); > + > +static void drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid(struct kunit *test) > +{ > + KUNIT_EXPECT_NULL(test, drm_hdmi_connector_get_broadcast_rgb_name(3)); > +}; > + > +static struct kunit_case drm_hdmi_connector_get_broadcast_rgb_name_tests[] = { > + KUNIT_CASE_PARAM(drm_test_drm_hdmi_connector_get_broadcast_rgb_name, > + drm_hdmi_connector_get_broadcast_rgb_name_valid_gen_params), > + KUNIT_CASE(drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid), > + { } > +}; > + > +static struct kunit_suite drm_hdmi_connector_get_broadcast_rgb_name_test_suite = { > + .name = "drm_hdmi_connector_get_broadcast_rgb_name", > + .test_cases = drm_hdmi_connector_get_broadcast_rgb_name_tests, > +}; > + > +static void drm_test_drm_connector_attach_broadcast_rgb_property(struct kunit *test) > +{ > + struct drm_connector_init_priv *priv = test->priv; > + struct drm_connector *connector = &priv->connector; > + struct drm_property *prop; > + int ret; > + > + ret = drmm_connector_init(&priv->drm, connector, > + &dummy_funcs, > + DRM_MODE_CONNECTOR_HDMIA, > + &priv->ddc); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + ret = drm_connector_attach_broadcast_rgb_property(connector); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + prop = connector->broadcast_rgb_property; > + KUNIT_ASSERT_NOT_NULL(test, prop); > + KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id)); > +} > + > +static void drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector(struct kunit *test) > +{ > + struct drm_connector_init_priv *priv = test->priv; > + struct drm_connector *connector = &priv->connector; > + struct drm_property *prop; > + int ret; > + > + ret = drmm_connector_hdmi_init(&priv->drm, connector, > + &dummy_funcs, > + DRM_MODE_CONNECTOR_HDMIA, > + &priv->ddc); > + KUNIT_EXPECT_EQ(test, ret, 0); > + > + ret = drm_connector_attach_broadcast_rgb_property(connector); > + KUNIT_ASSERT_EQ(test, ret, 0); > + > + prop = connector->broadcast_rgb_property; > + KUNIT_ASSERT_NOT_NULL(test, prop); > + KUNIT_EXPECT_NOT_NULL(test, drm_mode_obj_find_prop_id(&connector->base, prop->base.id)); > +} > + > +static struct kunit_case drm_connector_attach_broadcast_rgb_property_tests[] = { > + KUNIT_CASE(drm_test_drm_connector_attach_broadcast_rgb_property), > + KUNIT_CASE(drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector), > + { } > +}; > + > +static struct kunit_suite drm_connector_attach_broadcast_rgb_property_test_suite = { > + .name = "drm_connector_attach_broadcast_rgb_property", > + .init = drm_test_connector_init, > + .test_cases = drm_connector_attach_broadcast_rgb_property_tests, > +}; > + > kunit_test_suites( > &drmm_connector_hdmi_init_test_suite, > &drmm_connector_init_test_suite, > - &drm_get_tv_mode_from_name_test_suite > + &drm_connector_attach_broadcast_rgb_property_test_suite, > + &drm_get_tv_mode_from_name_test_suite, > + &drm_hdmi_connector_get_broadcast_rgb_name_test_suite > ); > > MODULE_AUTHOR("Maxime Ripard "); > diff --git a/drivers/gpu/drm/tests/drm_kunit_edid.h b/drivers/gpu/drm/tests/drm_kunit_edid.h > new file mode 100644 > index 000000000000..2bba316de064 > --- /dev/null > +++ b/drivers/gpu/drm/tests/drm_kunit_edid.h > @@ -0,0 +1,106 @@ > +#ifndef DRM_KUNIT_EDID_H_ > +#define DRM_KUNIT_EDID_H_ > + > +/* > + * edid-decode (hex): > + * > + * 00 ff ff ff ff ff ff 00 31 d8 2a 00 00 00 00 00 > + * 00 21 01 03 81 a0 5a 78 02 00 00 00 00 00 00 00 > + * 00 00 00 20 00 00 01 01 01 01 01 01 01 01 01 01 > + * 01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c > + * 45 00 40 84 63 00 00 1e 00 00 00 fc 00 54 65 73 > + * 74 20 45 44 49 44 0a 20 20 20 00 00 00 fd 00 32 > + * 46 1e 46 0f 00 0a 20 20 20 20 20 20 00 00 00 10 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 92 > + * > + * 02 03 1b 81 e3 05 00 20 41 10 e2 00 4a 6d 03 0c > + * 00 12 34 00 28 20 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d0 > + * > + * ---------------- > + * > + * Block 0, Base EDID: > + * EDID Structure Version & Revision: 1.3 > + * Vendor & Product Identification: > + * Manufacturer: LNX > + * Model: 42 > + * Made in: 2023 > + * Basic Display Parameters & Features: > + * Digital display > + * DFP 1.x compatible TMDS > + * Maximum image size: 160 cm x 90 cm > + * Gamma: 2.20 > + * Monochrome or grayscale display > + * First detailed timing is the preferred timing > + * Color Characteristics: > + * Red : 0.0000, 0.0000 > + * Green: 0.0000, 0.0000 > + * Blue : 0.0000, 0.0000 > + * White: 0.0000, 0.0000 > + * Established Timings I & II: > + * DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175000 MHz > + * Standard Timings: none > + * Detailed Timing Descriptors: > + * DTD 1: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz (1600 mm x 900 mm) > + * Hfront 88 Hsync 44 Hback 148 Hpol P > + * Vfront 4 Vsync 5 Vback 36 Vpol P > + * Display Product Name: 'Test EDID' > + * Display Range Limits: > + * Monitor ranges (GTF): 50-70 Hz V, 30-70 kHz H, max dotclock 150 MHz > + * Dummy Descriptor: > + * Extension blocks: 1 > + * Checksum: 0x92 > + * > + * ---------------- > + * > + * Block 1, CTA-861 Extension Block: > + * Revision: 3 > + * Underscans IT Video Formats by default > + * Native detailed modes: 1 > + * Colorimetry Data Block: > + * sRGB > + * Video Data Block: > + * VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz > + * Video Capability Data Block: > + * YCbCr quantization: No Data > + * RGB quantization: Selectable (via AVI Q) > + * PT scan behavior: No Data > + * IT scan behavior: Always Underscanned > + * CE scan behavior: Always Underscanned > + * Vendor-Specific Data Block (HDMI), OUI 00-0C-03: > + * Source physical address: 1.2.3.4 > + * Maximum TMDS clock: 200 MHz > + * Extended HDMI video details: > + * Checksum: 0xd0 Unused space in Extension Block: 100 bytes > + */ > +const unsigned char test_edid_hdmi_1080p_rgb_max_200mhz[] = { > + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x31, 0xd8, 0x2a, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x03, 0x81, 0xa0, 0x5a, 0x78, > + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, > + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, > + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, > + 0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, > + 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x44, > + 0x49, 0x44, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x32, > + 0x46, 0x00, 0x00, 0xc4, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x02, 0x03, 0x1b, 0x81, > + 0xe3, 0x05, 0x00, 0x20, 0x41, 0x10, 0xe2, 0x00, 0x4a, 0x6d, 0x03, 0x0c, > + 0x00, 0x12, 0x34, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0xd0 > +}; > + > +#endif // DRM_KUNIT_EDID_H_ > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index 000a2a156619..3867a4c01b78 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -368,6 +368,30 @@ enum drm_panel_orientation { > DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, > }; > > +/** > + * enum drm_hdmi_broadcast_rgb - Broadcast RGB Selection for an HDMI @drm_connector > + */ > +enum drm_hdmi_broadcast_rgb { > + /** > + * @DRM_HDMI_BROADCAST_RGB_AUTO: The RGB range is selected > + * automatically based on the mode. > + */ > + DRM_HDMI_BROADCAST_RGB_AUTO, > + > + /** > + * @DRM_HDMI_BROADCAST_RGB_FULL: Full range RGB is forced. > + */ > + DRM_HDMI_BROADCAST_RGB_FULL, > + > + /** > + * @DRM_HDMI_BROADCAST_RGB_LIMITED: Limited range RGB is forced. > + */ > + DRM_HDMI_BROADCAST_RGB_LIMITED, > +}; > + > +const char * > +drm_hdmi_connector_get_broadcast_rgb_name(enum drm_hdmi_broadcast_rgb broadcast_rgb); > + > /** > * struct drm_monitor_range_info - Panel's Monitor range in EDID for > * &drm_display_info > @@ -1037,6 +1061,11 @@ struct drm_connector_state { > * @drm_atomic_helper_connector_hdmi_check(). > */ > struct { > + /** > + * @broadcast_rgb: Connector property to pass the > + * Broadcast RGB selection value. > + */ > + enum drm_hdmi_broadcast_rgb broadcast_rgb; > } hdmi; > }; > > @@ -1706,6 +1735,12 @@ struct drm_connector { > */ > struct drm_property *privacy_screen_hw_state_property; > > + /** > + * @broadcast_rgb_property: Connector property to set the > + * Broadcast RGB selection to output with. > + */ > + struct drm_property *broadcast_rgb_property; > + > #define DRM_CONNECTOR_POLL_HPD (1 << 0) > #define DRM_CONNECTOR_POLL_CONNECT (1 << 1) > #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) > @@ -2026,6 +2061,7 @@ int drm_connector_attach_scaling_mode_property(struct drm_connector *connector, > u32 scaling_mode_mask); > int drm_connector_attach_vrr_capable_property( > struct drm_connector *connector); > +int drm_connector_attach_broadcast_rgb_property(struct drm_connector *connector); > int drm_connector_attach_colorspace_property(struct drm_connector *connector); > int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *connector); > bool drm_connector_atomic_hdr_metadata_equal(struct drm_connector_state *old_state, > > -- > 2.43.0 >