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.129.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 5EB2317738 for ; Mon, 15 Jan 2024 14:37:27 +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="XwGmrLGj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329446; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=XwGmrLGjtMdtm6iCBx3gWn5/VFWLejBa6sRLy0HoiharliiDNApE9Rv5sCsE9ZYLo2O2k9 z+4gM3o0bLAzcIPd6NAOp9d37+XemQBr1x1Q2Dv6MBKCIAFwL4nQqBEvMn06Ntu/OAgtRv OsxKG0cr559Ss/EkreXdRk1BWPPWJrg= 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-649-xyeabbwCOy2m0xfcYnyraw-1; Mon, 15 Jan 2024 09:37:24 -0500 X-MC-Unique: xyeabbwCOy2m0xfcYnyraw-1 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-40e478693bcso36723395e9.1 for ; Mon, 15 Jan 2024 06:37:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329443; x=1705934243; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=vMotuy3pUI9VO3PhMLYNm489LP6vXh70A78TZIH9/2ndgjQqeNWCvc6YhBQ8Hd4yLh wsoWWp+UYuGu9PvR136ky3BZyWs8Rh2vYRC3+9SaODg8msG/10DxbEHWu57sjzsqwop/ zf7lEHjzvNyAPprvQl5RdFJ3agj9k9zGh6G3RiHrV6FeXRDpWHXA7FvvEPFWOAX6Nt1+ mqglhp1IN8VfXeQIgAX953XnCmdnk1vSheMEta+0sjTbhrx3s5T1nZiRDQsYFu3t6vI6 Cd+Uy7YKx9lBmeg8XvqkuKIvDndXFBD19x8NmuQXd5UtrmeGP0TqkHii6lwVw2F6pEll 5mlw== X-Gm-Message-State: AOJu0Yxe0LxBpsUisb7A5UK/QJEExUHtIH+M8kCPCsI19GrH7Jm37p29 i5G4RferWC601mop9sgw/yVbSlis7utIMp6VvC1UYjG2ayoliF4BDWkFJ5vAPNGv7zNXsEC4UNt Q/kgc0oviV8Fvnd6ZaUwWFkkyCEzc X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847848wmn.165.1705329443289; Mon, 15 Jan 2024 06:37:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IFUzdT5xU1sVf6BlLsAbm0wMLME7RDvKcEkYs4WH7QaXA5cIHhvh7BgfvcwqcTW3CkeFNoBnA== X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847837wmn.165.1705329442768; Mon, 15 Jan 2024 06:37:22 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id f18-20020a05600c155200b0040d87100733sm16221215wmg.39.2024.01.15.06.37.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:37:22 -0800 (PST) Date: Mon, 15 Jan 2024 15:37:20 +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: <20240115143720.GA160656@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> <20240115143308.GA159345@toolbox> 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: <20240115143308.GA159345@toolbox> On Mon, Jan 15, 2024 at 03:33:08PM +0100, Sebastian Wick wrote: > 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? Forgot to mention: user-space still has no control over RGB vs YCbCr on the cable, so is this only affecting RGB? If not, how does it affect YCbCr? > > > * 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 9AB04C3DA79 for ; Mon, 15 Jan 2024 14:37:47 +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=uOX5mzX9WiL4Hua9ZsSfdcekqjGCbR1upL6p/chD0eE=; b=ddstXR4BtTG2QB ppYiezK83oKXQ+2CQz6BxbEARFre0Er/+BVb2q+NZCtu6RMfIkG97kWSJdKX6lS+Q2zaergfZ0Pne ahGOemdkn/bf6WMpFx7RW9EdZfKblEbyRuXyoYd61hvpZ+CSqz3pmBqsM9Q8Uv5qFUezCecRA1Y35 yte6VALU8khUAajWmkPvQUo+tyk8quKaLJui7hXRV++OkeaT8IJLnCxQqaAT0R+EYkWeZI+rrAy/7 MF829F4SfrOuNHD8258vVQiBhh7RzhYuCXsIfjSXXVH5L1wyLZBlXoUvLGfMgbbOB5j51WLnNflUC IQsmOv2CzPcc+pqphI/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPO5k-009F9G-0C; Mon, 15 Jan 2024 14:37:32 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rPO5f-009F80-0O for linux-rockchip@lists.infradead.org; Mon, 15 Jan 2024 14:37:31 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329446; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=XwGmrLGjtMdtm6iCBx3gWn5/VFWLejBa6sRLy0HoiharliiDNApE9Rv5sCsE9ZYLo2O2k9 z+4gM3o0bLAzcIPd6NAOp9d37+XemQBr1x1Q2Dv6MBKCIAFwL4nQqBEvMn06Ntu/OAgtRv OsxKG0cr559Ss/EkreXdRk1BWPPWJrg= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-649--RsawDBNM3yrvRdcjvN5MQ-1; Mon, 15 Jan 2024 09:37:24 -0500 X-MC-Unique: -RsawDBNM3yrvRdcjvN5MQ-1 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-40e478693bcso36723465e9.1 for ; Mon, 15 Jan 2024 06:37:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329443; x=1705934243; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=LWL6oGdR06no3vaLa1/S3UVS3ktUpeDxx/DNqYl7zn9j4feYsUCYc3GmtezuqWvjcp NpiONCg7w2p9PeC/t1+NXQF9M9TtRhWOALxRvHqYqk+5k7FNOpg/NrUAgD1GQ47DiB3W +Gf7bs7BwjLGUa9tXmNZc4gzg92/Nwh++uSFPz+m4KyupYihBHb+9nnU0leeEt9bdSj6 W5wmZaNkZv+7/cqYpAKMKSAUO6q1HJ6Oye4yYoAIqetm6NOSSVKih9n87caDYdWet3/h HhwKacWF6Q6rPy//jVYuTPanh8xL0sCfD+HF0kkqYeGJrnG3fsfiMkQOiDuUynXMC6My 6XwA== X-Gm-Message-State: AOJu0YwSbakAjKuRrkuQRFxYFGCLhmIN5kaRMu53+tyX39QIwTy2NAdn j2wasSxfaqXjLZIVddttk4aFl1qQnm8BX1i+EZ/idKzyj7q3jqOEzj8iKenaRKnEK5UhqwxutSK ZSudF4vO4EpHfFdz4nf6bdyHLAapYhnuacT7eRop0 X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847843wmn.165.1705329443286; Mon, 15 Jan 2024 06:37:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IFUzdT5xU1sVf6BlLsAbm0wMLME7RDvKcEkYs4WH7QaXA5cIHhvh7BgfvcwqcTW3CkeFNoBnA== X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847837wmn.165.1705329442768; Mon, 15 Jan 2024 06:37:22 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id f18-20020a05600c155200b0040d87100733sm16221215wmg.39.2024.01.15.06.37.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:37:22 -0800 (PST) Date: Mon, 15 Jan 2024 15:37:20 +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: <20240115143720.GA160656@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> <20240115143308.GA159345@toolbox> MIME-Version: 1.0 In-Reply-To: <20240115143308.GA159345@toolbox> 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_063727_396701_4F704939 X-CRM114-Status: GOOD ( 47.47 ) 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 T24gTW9uLCBKYW4gMTUsIDIwMjQgYXQgMDM6MzM6MDhQTSArMDEwMCwgU2ViYXN0aWFuIFdpY2sg d3JvdGU6Cj4gT24gVGh1LCBEZWMgMDcsIDIwMjMgYXQgMDQ6NDk6MzFQTSArMDEwMCwgTWF4aW1l IFJpcGFyZCB3cm90ZToKPiA+IFRoZSBpOTE1IGRyaXZlciBoYXMgYSBwcm9wZXJ0eSB0byBmb3Jj ZSB0aGUgUkdCIHJhbmdlIG9mIGFuIEhETUkgb3V0cHV0Lgo+ID4gVGhlIHZjNCBkcml2ZXIgdGhl biBpbXBsZW1lbnRlZCB0aGUgc2FtZSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lCj4gPiBzZW1hbnRp Y3MuIEtXaW4gaGFzIHN1cHBvcnQgZm9yIGl0LCBhbmQgYSBQUiBmb3IgbXV0dGVyIGlzIGFsc28g dGhlcmUgdG8KPiA+IHN1cHBvcnQgaXQuCj4gPiAKPiA+IEJvdGggZHJpdmVycyBpbXBsZW1lbnRp bmcgdGhlIHNhbWUgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MsCj4gPiBwbHVzIHRo ZSB1c2Vyc3BhY2UgaGF2aW5nIHN1cHBvcnQgZm9yIGl0LCBpcyBwcm9vZiBlbm91Z2ggdGhhdCBp dCdzCj4gPiBwcmV0dHkgbXVjaCBhIGRlLWZhY3RvIHN0YW5kYXJkIG5vdyBhbmQgd2UgY2FuIHBy b3ZpZGUgaGVscGVycyBmb3IgaXQuCj4gPiAKPiA+IExldCdzIHBsdW1iIGl0IGludG8gdGhlIG5l d2x5IGNyZWF0ZWQgSERNSSBjb25uZWN0b3IuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IE1heGlt ZSBSaXBhcmQgPG1yaXBhcmRAa2VybmVsLm9yZz4KPiA+IC0tLQo+ID4gIERvY3VtZW50YXRpb24v Z3B1L2ttcy1wcm9wZXJ0aWVzLmNzdiAgICAgICAgICAgICAgIHwgICAxIC0KPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2F0b21pYy5jICAgICAgICAgICAgICAgICAgICAgICB8ICAgNSArCj4gPiAg ZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfc3RhdGVfaGVscGVyLmMgICAgICAgICAgfCAgMTcg Kwo+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYyAgICAgICAgICAgICAgICAg IHwgICA0ICsKPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5jICAgICAgICAgICAg ICAgICAgICB8ICA3NiArKysrKwo+ID4gIGRyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZSAg ICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICAuLi4vZ3B1L2RybS90ZXN0cy9kcm1fYXRv bWljX3N0YXRlX2hlbHBlcl90ZXN0LmMgICB8IDM3NiArKysrKysrKysrKysrKysrKysrKysKPiA+ ICBkcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2Nvbm5lY3Rvcl90ZXN0LmMgICAgICAgICB8IDEx NyArKysrKystCj4gPiAgZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlkLmggICAg ICAgICAgICAgfCAxMDYgKysrKysrCj4gPiAgaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oICAg ICAgICAgICAgICAgICAgICAgICAgfCAgMzYgKysKPiA+ICAxMCBmaWxlcyBjaGFuZ2VkLCA3Mzcg aW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdiBiL0RvY3VtZW50YXRpb24vZ3B1L2ttcy1w cm9wZXJ0aWVzLmNzdgo+ID4gaW5kZXggMGY5NTkwODM0ODI5Li5jYWVmMTRjNTMyZDQgMTAwNjQ0 Cj4gPiAtLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YKPiA+ICsrKyBi L0RvY3VtZW50YXRpb24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdgo+ID4gQEAgLTE3LDcgKzE3LDYg QEAgT3duZXIgTW9kdWxlL0RyaXZlcnMsR3JvdXAsUHJvcGVydHkgTmFtZSxUeXBlLFByb3BlcnR5 IFZhbHVlcyxPYmplY3QgYXR0YWNoZWQsRGUKPiA+ICAsVmlydHVhbCBHUFUs4oCcc3VnZ2VzdGVk IFjigJ0sUkFOR0UsIk1pbj0wLCBNYXg9MHhmZmZmZmZmZiIsQ29ubmVjdG9yLHByb3BlcnR5IHRv IHN1Z2dlc3QgYW4gWCBvZmZzZXQgZm9yIGEgY29ubmVjdG9yCj4gPiAgLCzigJxzdWdnZXN0ZWQg WeKAnSxSQU5HRSwiTWluPTAsIE1heD0weGZmZmZmZmZmIixDb25uZWN0b3IscHJvcGVydHkgdG8g c3VnZ2VzdCBhbiBZIG9mZnNldCBmb3IgYSBjb25uZWN0b3IKPiA+ICAsT3B0aW9uYWwsIiIiYXNw ZWN0IHJhdGlvIiIiLEVOVU0sInsgIiJOb25lIiIsICIiNDozIiIsICIiMTY6OSIiIH0iLENvbm5l Y3RvcixUREIKPiA+IC1pOTE1LEdlbmVyaWMsIiIiQnJvYWRjYXN0IFJHQiIiIixFTlVNLCJ7ICIi QXV0b21hdGljIiIsICIiRnVsbCIiLCAiIkxpbWl0ZWQgMTY6MjM1IiIgfSIsQ29ubmVjdG9yLCJX aGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIExpbWl0ZWQgMTY6MjM1IGFuZCBDVE0gaXMgc2V0 LCB0aGUgaGFyZHdhcmUgd2lsbCBiZSBwcm9ncmFtbWVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUg bXVsdGlwbGljYXRpb24gb2YgQ1RNIGJ5IHRoZSBsaW1pdGVkIHJhbmdlIG1hdHJpeCB0byBlbnN1 cmUgdGhlIHBpeGVscyBub3JtYWxseSBpbiB0aGUgcmFuZ2UgMC4uMS4wIGFyZSByZW1hcHBlZCB0 byB0aGUgcmFuZ2UgMTYvMjU1Li4yMzUvMjU1LiIKPiA+ICAsLOKAnGF1ZGlv4oCdLEVOVU0sInsg IiJmb3JjZS1kdmkiIiwgIiJvZmYiIiwgIiJhdXRvIiIsICIib24iIiB9IixDb25uZWN0b3IsVEJE Cj4gPiAgLFNEVk8tVFYs4oCcbW9kZeKAnSxFTlVNLCJ7ICIiTlRTQ19NIiIsICIiTlRTQ19KIiIs ICIiTlRTQ180NDMiIiwgIiJQQUxfQiIiIH0gZXRjLiIsQ29ubmVjdG9yLFRCRAo+ID4gICwsIiIi bGVmdF9tYXJnaW4iIiIsUkFOR0UsIk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50IixDb25uZWN0 b3IsVEJECj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyBiL2Ry aXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljLmMKPiA+IGluZGV4IGMzMWZjMGI0OGMzMS4uMTQ2NWE3 ZjA5YTBiIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+ID4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+ID4gQEAgLTExNDIsNiArMTE0Miwx MSBAQCBzdGF0aWMgdm9pZCBkcm1fYXRvbWljX2Nvbm5lY3Rvcl9wcmludF9zdGF0ZShzdHJ1Y3Qg ZHJtX3ByaW50ZXIgKnAsCj4gPiAgCWRybV9wcmludGYocCwgIlx0bWF4X3JlcXVlc3RlZF9icGM9 JWRcbiIsIHN0YXRlLT5tYXhfcmVxdWVzdGVkX2JwYyk7Cj4gPiAgCWRybV9wcmludGYocCwgIlx0 Y29sb3JzcGFjZT0lc1xuIiwgZHJtX2dldF9jb2xvcnNwYWNlX25hbWUoc3RhdGUtPmNvbG9yc3Bh Y2UpKTsKPiA+ICAKPiA+ICsJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01P REVfQ09OTkVDVE9SX0hETUlBIHx8Cj4gPiArCSAgICBjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBl ID09IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQikKPiA+ICsJCWRybV9wcmludGYocCwgIlx0YnJv YWRjYXN0X3JnYj0lc1xuIiwKPiA+ICsJCQkgICBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2Fk Y2FzdF9yZ2JfbmFtZShzdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiKSk7Cj4gPiArCj4gPiAgCWlm IChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9XUklURUJB Q0spCj4gPiAgCQlpZiAoc3RhdGUtPndyaXRlYmFja19qb2IgJiYgc3RhdGUtPndyaXRlYmFja19q b2ItPmZiKQo+ID4gIAkJCWRybV9wcmludGYocCwgIlx0ZmI9JWRcbiIsIHN0YXRlLT53cml0ZWJh Y2tfam9iLT5mYi0+YmFzZS5pZCk7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2Ry bV9hdG9taWNfc3RhdGVfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0 ZV9oZWxwZXIuYwo+ID4gaW5kZXggZTY5YzBjYzFjNmRhLi4xMGQ5ODYyMGEzNTggMTAwNjQ0Cj4g PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIuYwo+ID4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfc3RhdGVfaGVscGVyLmMKPiA+IEBAIC01ODMs NiArNTgzLDcgQEAgRVhQT1JUX1NZTUJPTChkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfdHZf cmVzZXQpOwo+ID4gIHZvaWQgX19kcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9yZXNl dChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gIAkJCQkJICAgICAgc3RydWN0 IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19zdGF0ZSkKPiA+ICB7Cj4gPiArCW5ld19zdGF0ZS0+ aGRtaS5icm9hZGNhc3RfcmdiID0gRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPOwo+ID4gIH0K PiA+ICBFWFBPUlRfU1lNQk9MKF9fZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVz ZXQpOwo+ID4gIAo+ID4gQEAgLTY1MCw2ICs2NTEsMjIgQEAgRVhQT1JUX1NZTUJPTChkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfdHZfY2hlY2spOwo+ID4gIGludCBkcm1fYXRvbWljX2hlbHBl cl9jb25uZWN0b3JfaGRtaV9jaGVjayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ ID4gIAkJCQkJICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQo+ID4gIHsKPiA+ICsJ c3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9zdGF0ZSA9Cj4gPiArCQlkcm1fYXRvbWlj X2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ID4gKwlzdHJ1Y3Qg ZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0YXRlID0KPiA+ICsJCWRybV9hdG9taWNfZ2V0X25l d19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5lY3Rvcik7Cj4gPiArCj4gPiArCWlmIChvbGRf c3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiAhPSBuZXdfc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3Jn Yikgewo+ID4gKwkJc3RydWN0IGRybV9jcnRjICpjcnRjID0gbmV3X3N0YXRlLT5jcnRjOwo+ID4g KwkJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ID4gKwo+ID4gKwkJY3J0Y19z dGF0ZSA9IGRybV9hdG9taWNfZ2V0X2NydGNfc3RhdGUoc3RhdGUsIGNydGMpOwo+ID4gKwkJaWYg KElTX0VSUihjcnRjX3N0YXRlKSkKPiA+ICsJCQlyZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsK PiA+ICsKPiA+ICsJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7Cj4gPiArCX0KPiA+ ICsKPiA+ICAJcmV0dXJuIDA7Cj4gPiAgfQo+ID4gIEVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19o ZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2spOwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljX3VhcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGku Ywo+ID4gaW5kZXggYWVlNGE2NWQ0OTU5Li4zZWI0ZjRiYzhiNzEgMTAwNjQ0Cj4gPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gQEAgLTgxOCw2ICs4MTgsOCBAQCBzdGF0aWMgaW50IGRy bV9hdG9taWNfY29ubmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yLAo+ID4gIAkJc3RhdGUtPm1heF9yZXF1ZXN0ZWRfYnBjID0gdmFsOwo+ID4gIAl9IGVs c2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5fc3dfc3RhdGVfcHJv cGVydHkpIHsKPiA+ICAJCXN0YXRlLT5wcml2YWN5X3NjcmVlbl9zd19zdGF0ZSA9IHZhbDsKPiA+ ICsJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVy dHkpIHsKPiA+ICsJCXN0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2IgPSB2YWw7Cj4gPiAgCX0gZWxz ZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9wcm9wZXJ0eSkgewo+ID4gIAkJcmV0 dXJuIGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19zZXRfcHJvcGVydHkoY29ubmVjdG9yLAo+ID4g IAkJCQlzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiBAQCAtOTAxLDYgKzkwMyw4IEBAIGRybV9h dG9taWNfY29ubmVjdG9yX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLAo+ID4gIAkJKnZhbCA9IHN0YXRlLT5tYXhfcmVxdWVzdGVkX2JwYzsKPiA+ICAJfSBlbHNl IGlmIChwcm9wZXJ0eSA9PSBjb25uZWN0b3ItPnByaXZhY3lfc2NyZWVuX3N3X3N0YXRlX3Byb3Bl cnR5KSB7Cj4gPiAgCQkqdmFsID0gc3RhdGUtPnByaXZhY3lfc2NyZWVuX3N3X3N0YXRlOwo+ID4g Kwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0 eSkgewo+ID4gKwkJKnZhbCA9IHN0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2I7Cj4gPiAgCX0gZWxz ZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX2dldF9wcm9wZXJ0eSkgewo+ID4gIAkJcmV0 dXJuIGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19nZXRfcHJvcGVydHkoY29ubmVjdG9yLAo+ID4g IAkJCQlzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2RybV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiA+ IGluZGV4IGQ5OTYxY2NlODI0NS4uOTI5YjBhOTExZjYyIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2RybV9jb25uZWN0b3IuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9j b25uZWN0b3IuYwo+ID4gQEAgLTExODMsNiArMTE4MywyOSBAQCBzdGF0aWMgY29uc3QgdTMyIGRw X2NvbG9yc3BhY2VzID0KPiA+ICAJQklUKERSTV9NT0RFX0NPTE9SSU1FVFJZX0JUMjAyMF9DWUND KSB8Cj4gPiAgCUJJVChEUk1fTU9ERV9DT0xPUklNRVRSWV9CVDIwMjBfWUNDKTsKPiA+ICAKPiA+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBicm9hZGNhc3RfcmdiX25h bWVzW10gPSB7Cj4gPiArCXsgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPLCAiQXV0b21hdGlj IiB9LAo+ID4gKwl7IERSTV9IRE1JX0JST0FEQ0FTVF9SR0JfRlVMTCwgIkZ1bGwiIH0sCj4gPiAr CXsgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVELCAiTGltaXRlZCAxNjoyMzUiIH0sCj4g PiArfTsKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRj YXN0X3JnYl9uYW1lIC0gUmV0dXJuIGEgc3RyaW5nIGZvciBIRE1JIGNvbm5lY3RvciBSR0IgYnJv YWRjYXN0IHNlbGVjdGlvbgo+ID4gKyAqIEBicm9hZGNhc3RfcmdiOiBCcm9hZGNhc3QgUkdCIHNl bGVjdGlvbiB0byBjb21wdXRlIG5hbWUgb2YKPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6IHRoZSBu YW1lIG9mIHRoZSBCcm9hZGNhc3QgUkdCIHNlbGVjdGlvbiwgb3IgTlVMTCBpZiB0aGUgdHlwZQo+ ID4gKyAqIGlzIG5vdCB2YWxpZC4KPiA+ICsgKi8KPiA+ICtjb25zdCBjaGFyICoKPiA+ICtkcm1f aGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZShlbnVtIGRybV9oZG1pX2Jyb2Fk Y2FzdF9yZ2IgYnJvYWRjYXN0X3JnYikKPiA+ICt7Cj4gPiArCWlmIChicm9hZGNhc3RfcmdiID4g RFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVEKQo+ID4gKwkJcmV0dXJuIE5VTEw7Cj4gPiAr Cj4gPiArCXJldHVybiBicm9hZGNhc3RfcmdiX25hbWVzW2Jyb2FkY2FzdF9yZ2JdLm5hbWU7Cj4g PiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3Rf cmdiX25hbWUpOwo+ID4gKwo+ID4gIC8qKgo+ID4gICAqIERPQzogc3RhbmRhcmQgY29ubmVjdG9y IHByb3BlcnRpZXMKPiA+ICAgKgo+ID4gQEAgLTE2NTUsNiArMTY3OCwyNiBAQCBFWFBPUlRfU1lN Qk9MKGRybV9jb25uZWN0b3JfYXR0YWNoX2RwX3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSk7Cj4gPiAg LyoqCj4gPiAgICogRE9DOiBIRE1JIGNvbm5lY3RvciBwcm9wZXJ0aWVzCj4gPiAgICoKPiA+ICsg KiBCcm9hZGNhc3QgUkdCCj4gPiArICogICAgICBJbmRpY2F0ZXMgdGhlIFJHQiBRdWFudGl6YXRp b24gUmFuZ2UgKEZ1bGwgdnMgTGltaXRlZCkgdXNlZC4KPiA+ICsgKiAgICAgIEluZm9mcmFtZXMg d2lsbCBiZSBnZW5lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoYXQgdmFsdWUuCj4gPiArICoKPiA+ICsg KiAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxv d2luZzoKPiA+ICsgKgo+ID4gKyAqICAgICAgQXV0b21hdGljOgo+ID4gKyAqICAgICAgICAgICAg ICBSR0IgUmFuZ2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgbW9kZQo+ ID4gKyAqICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIEhETUkgc3BlY2lmaWNhdGlvbnMu Cj4gPiArICoKPiA+ICsgKiAgICAgIEZ1bGw6Cj4gPiArICogICAgICAgICAgICAgIEZ1bGwgUkdC IFJhbmdlIGlzIGZvcmNlZC4KPiA+ICsgKgo+ID4gKyAqICAgICAgTGltaXRlZCAxNjoyMzU6Cj4g PiArICogICAgICAgICAgICAgIExpbWl0ZWQgUkdCIFJhbmdlIGlzIGZvcmNlZC4gVW5saWtlIHRo ZSBuYW1lIHN1Z2dlc3RzLAo+ID4gKyAqICAgICAgICAgICAgICB0aGlzIHdvcmtzIGZvciBhbnkg bnVtYmVyIG9mIGJpdHMtcGVyLWNvbXBvbmVudC4KPiA+ICsgKgo+ID4gKyAqICAgICAgRHJpdmVy cyBjYW4gc2V0IHVwIHRoaXMgcHJvcGVydHkgYnkgY2FsbGluZwo+ID4gKyAqICAgICAgZHJtX2Nv bm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSgpLgo+ID4gKyAqCj4gCj4gVGhp cyBpcyBhIGdvb2QgdGltZSB0byBkb2N1bWVudCB0aGlzIGluIG1vcmUgZGV0YWlsLiBUaGVyZSBt aWdodCBiZSB0d28KPiBkaWZmZXJlbnQgdGhpbmdzIGJlaW5nIGFmZmVjdGVkOgo+IAo+IDEuIFRo ZSBzaWduYWxsaW5nIChJbmZvRnJhbWUvU0RQLy4uLikKPiAyLiBUaGUgY29sb3IgcGlwZWxpbmUg cHJvY2Vzc2luZwo+IAo+IEFsbCB2YWx1ZXMgb2YgQnJvYWRjYXN0IFJHQiBhbHdheXMgYWZmZWN0 IHRoZSBjb2xvciBwaXBlbGluZSBwcm9jZXNzaW5nCj4gc3VjaCB0aGF0IGEgZnVsbC1yYW5nZSBp bnB1dCB0byB0aGUgQ1JUQyBpcyBjb252ZXJ0ZWQgdG8gZWl0aGVyIGZ1bGwtIG9yCj4gbGltaXRl ZC1yYW5nZSwgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIG1vbml0b3IgaXMgc3VwcG9zZWQgdG8gYWNj ZXB0Lgo+IAo+IFdoZW4gYXV0b21hdGljIGlzIHNlbGVjdGVkLCBkb2VzIHRoYXQgbWVhbiB0aGF0 IHRoZXJlIGlzIG5vIHNpZ25hbGxpbmcsCj4gb3IgdGhhdCB0aGUgc2lnbmFsbGluZyBtYXRjaGVz IHdoYXQgdGhlIG1vbml0b3IgaXMgc3VwcG9zZWQgdG8gYWNjZXB0Cj4gYWNjb3JkaW5nIHRvIHRo ZSBzcGVjPyBBbHNvLCBpcyB0aGlzIHJlYWxseSBIRE1JIHNwZWNpZmljPwo+IAo+IFdoZW4gZnVs bCBvciBsaW1pdGVkIGlzIHNlbGVjdGVkIGFuZCB0aGUgbW9uaXRvciBkb2Vzbid0IHN1cHBvcnQg dGhlCj4gc2lnbmFsbGluZywgd2hhdCBoYXBwZW5zPwoKRm9yZ290IHRvIG1lbnRpb246IHVzZXIt c3BhY2Ugc3RpbGwgaGFzIG5vIGNvbnRyb2wgb3ZlciBSR0IgdnMgWUNiQ3Igb24KdGhlIGNhYmxl LCBzbyBpcyB0aGlzIG9ubHkgYWZmZWN0aW5nIFJHQj8gSWYgbm90LCBob3cgZG9lcyBpdCBhZmZl Y3QKWUNiQ3I/Cgo+IAo+ID4gICAqIGNvbnRlbnQgdHlwZSAoSERNSSBzcGVjaWZpYyk6Cj4gPiAg ICoJSW5kaWNhdGVzIGNvbnRlbnQgdHlwZSBzZXR0aW5nIHRvIGJlIHVzZWQgaW4gSERNSSBpbmZv ZnJhbWVzIHRvIGluZGljYXRlCj4gPiAgICoJY29udGVudCB0eXBlIGZvciB0aGUgZXh0ZXJuYWwg ZGV2aWNlLCBzbyB0aGF0IGl0IGFkanVzdHMgaXRzIGRpc3BsYXkKPiA+IEBAIC0yNTE3LDYgKzI1 NjAsMzkgQEAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX2hkcl9vdXRwdXRfbWV0YWRhdGFfcHJv cGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4KPiA+ICB9Cj4gPiAgRVhQT1JUX1NZTUJP TChkcm1fY29ubmVjdG9yX2F0dGFjaF9oZHJfb3V0cHV0X21ldGFkYXRhX3Byb3BlcnR5KTsKPiA+ ICAKPiA+ICsvKioKPiA+ICsgKiBkcm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3By b3BlcnR5IC0gYXR0YWNoICJCcm9hZGNhc3QgUkdCIiBwcm9wZXJ0eQo+ID4gKyAqIEBjb25uZWN0 b3I6IGNvbm5lY3RvciB0byBhdHRhY2ggdGhlIHByb3BlcnR5IG9uLgo+ID4gKyAqCj4gPiArICog VGhpcyBpcyB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciBmb3JjaW5nIHRoZSBSR0IgcmFuZ2Ugb24g YSBjb25uZWN0b3IKPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6Cj4gPiArICogWmVybyBvbiBzdWNj ZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgo+ID4gKyAqLwo+ID4gK2ludCBkcm1fY29u bmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVj dG9yLT5kZXY7Cj4gPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gPiArCj4gPiArCXBy b3AgPSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7Cj4gPiArCWlmICghcHJvcCkg ewo+ID4gKwkJcHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkZXYsIERSTV9NT0RFX1BS T1BfRU5VTSwKPiA+ICsJCQkJCQkiQnJvYWRjYXN0IFJHQiIsCj4gPiArCQkJCQkJYnJvYWRjYXN0 X3JnYl9uYW1lcywKPiA+ICsJCQkJCQlBUlJBWV9TSVpFKGJyb2FkY2FzdF9yZ2JfbmFtZXMpKTsK PiA+ICsJCWlmICghcHJvcCkKPiA+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsKPiA+ICsJCWNv bm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSA9IHByb3A7Cj4gPiArCX0KPiA+ICsKPiA+ ICsJZHJtX29iamVjdF9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwgcHJvcCwKPiA+ ICsJCQkJICAgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPKTsKPiA+ICsKPiA+ICsJcmV0dXJu IDA7Cj4gPiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRj YXN0X3JnYl9wcm9wZXJ0eSk7Cj4gPiArCj4gPiAgLyoqCj4gPiAgICogZHJtX2Nvbm5lY3Rvcl9h dHRhY2hfY29sb3JzcGFjZV9wcm9wZXJ0eSAtIGF0dGFjaCAiQ29sb3JzcGFjZSIgcHJvcGVydHkK PiA+ICAgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gYXR0YWNoIHRoZSBwcm9wZXJ0eSBvbi4K PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvTWFrZWZpbGUgYi9kcml2ZXJz L2dwdS9kcm0vdGVzdHMvTWFrZWZpbGUKPiA+IGluZGV4IGQ2MTgzYjNkNzY4OC4uYjI5ZGRmZDkw NTk2IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL01ha2VmaWxlCj4gPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvTWFrZWZpbGUKPiA+IEBAIC00LDYgKzQsNyBAQCBv YmotJChDT05GSUdfRFJNX0tVTklUX1RFU1RfSEVMUEVSUykgKz0gXAo+ID4gIAlkcm1fa3VuaXRf aGVscGVycy5vCj4gPiAgCj4gPiAgb2JqLSQoQ09ORklHX0RSTV9LVU5JVF9URVNUKSArPSBcCj4g PiArCWRybV9hdG9taWNfc3RhdGVfaGVscGVyX3Rlc3QubyBcCj4gPiAgCWRybV9idWRkeV90ZXN0 Lm8gXAo+ID4gIAlkcm1fY21kbGluZV9wYXJzZXJfdGVzdC5vIFwKPiA+ICAJZHJtX2Nvbm5lY3Rv cl90ZXN0Lm8gXAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fYXRv bWljX3N0YXRlX2hlbHBlcl90ZXN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2F0b21p Y19zdGF0ZV9oZWxwZXJfdGVzdC5jCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXgg MDAwMDAwMDAwMDAwLi4yMWU2Zjc5NmVlMTMKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fYXRvbWljX3N0YXRlX2hlbHBlcl90ZXN0LmMKPiA+IEBA IC0wLDAgKzEsMzc2IEBACj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAK PiA+ICsKPiA+ICsvKgo+ID4gKyAqIEt1bml0IHRlc3QgZm9yIGRybV9hdG9taWNfc3RhdGVfaGVs cGVyIGZ1bmN0aW9ucwo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21p Yy5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIuaD4KPiA+ICsj aW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfdWFwaS5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2Ry di5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2VkaWQuaD4KPiA+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9jb25uZWN0b3IuaD4KPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9mb3VyY2MuaD4KPiA+ICsjaW5j bHVkZSA8ZHJtL2RybV9rdW5pdF9oZWxwZXJzLmg+Cj4gPiArI2luY2x1ZGUgPGRybS9kcm1fbWFu YWdlZC5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzZXRfaGVscGVyX3Z0YWJsZXMuaD4K PiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiA+ICsKPiA+ICsjaW5jbHVk ZSA8ZHJtL2RybV9wcmludC5oPgo+ID4gKyNpbmNsdWRlICIuLi9kcm1fY3J0Y19pbnRlcm5hbC5o Igo+ID4gKwo+ID4gKyNpbmNsdWRlIDxrdW5pdC90ZXN0Lmg+Cj4gPiArCj4gPiArI2luY2x1ZGUg ImRybV9rdW5pdF9lZGlkLmgiCj4gPiArCj4gPiArc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX3ByaXYgewo+ID4gKwlzdHJ1Y3QgZHJtX2RldmljZSBkcm07Cj4gPiArCXN0 cnVjdCBkcm1fcGxhbmUgKnBsYW5lOwo+ID4gKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Cj4gPiAr CXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwo+ID4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBj b25uZWN0b3I7Cj4gPiArCj4gPiArCWNvbnN0IGNoYXIgKmN1cnJlbnRfZWRpZDsKPiA+ICsJc2l6 ZV90IGN1cnJlbnRfZWRpZF9sZW47Cj4gPiArfTsKPiA+ICsKPiA+ICsjZGVmaW5lIGNvbm5lY3Rv cl90b19wcml2KGMpIFwKPiA+ICsJY29udGFpbmVyX29mX2NvbnN0KGMsIHN0cnVjdCBkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2LCBjb25uZWN0b3IpCj4gPiArCj4gPiArc3Rh dGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaW5kX3ByZWZlcnJlZF9tb2RlKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2RldmljZSAq ZHJtID0gY29ubmVjdG9yLT5kZXY7Cj4gPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl LCAqcHJlZmVycmVkOwo+ID4gKwo+ID4gKwltdXRleF9sb2NrKCZkcm0tPm1vZGVfY29uZmlnLm11 dGV4KTsKPiA+ICsJcHJlZmVycmVkID0gbGlzdF9maXJzdF9lbnRyeSgmY29ubmVjdG9yLT5tb2Rl cywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsIGhlYWQpOwo+ID4gKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KG1vZGUsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKQo+ID4gKwkJaWYgKG1vZGUtPnR5cGUg JiBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCkKPiA+ICsJCQlwcmVmZXJyZWQgPSBtb2RlOwo+ID4g KwltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ID4gKwo+ID4gKwlyZXR1 cm4gcHJlZmVycmVkOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGxpZ2h0X3VwX2Nvbm5l Y3RvcihzdHJ1Y3Qga3VuaXQgKnRlc3QsCj4gPiArCQkJICAgICAgc3RydWN0IGRybV9kZXZpY2Ug KmRybSwKPiA+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCj4gPiArCQkJICAgICAg c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ICsJCQkgICAgICBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiA+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX21vZGVzZXRfYWNx dWlyZV9jdHggKmN0eCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0 ZTsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGU7Cj4gPiArCXN0 cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ ICsJc3RhdGUgPSBkcm1fa3VuaXRfaGVscGVyX2F0b21pY19zdGF0ZV9hbGxvYyh0ZXN0LCBkcm0s IGN0eCk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgc3RhdGUpOwo+ ID4gKwo+ID4gKwljb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVjdG9yX3N0YXRlKHN0 YXRlLCBjb25uZWN0b3IpOwo+ID4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3Qs IGNvbm5fc3RhdGUpOwo+ID4gKwo+ID4gKwlyZXQgPSBkcm1fYXRvbWljX3NldF9jcnRjX2Zvcl9j b25uZWN0b3IoY29ubl9zdGF0ZSwgY3J0Yyk7Cj4gPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCBy ZXQsIDApOwo+ID4gKwo+ID4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY3J0Y19zdGF0 ZShzdGF0ZSwgY3J0Yyk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwg Y3J0Y19zdGF0ZSk7Cj4gPiArCj4gPiArCXJldCA9IGRybV9hdG9taWNfc2V0X21vZGVfZm9yX2Ny dGMoY3J0Y19zdGF0ZSwgbW9kZSk7Cj4gPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCByZXQsIDAp Owo+ID4gKwo+ID4gKwljcnRjX3N0YXRlLT5lbmFibGUgPSB0cnVlOwo+ID4gKwljcnRjX3N0YXRl LT5hY3RpdmUgPSB0cnVlOwo+ID4gKwo+ID4gKwlyZXQgPSBkcm1fYXRvbWljX2NvbW1pdChzdGF0 ZSk7Cj4gPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ID4gKwo+ID4gKwlyZXR1 cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBzZXRfY29ubmVjdG9yX2VkaWQoc3Ry dWN0IGt1bml0ICp0ZXN0LCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gKwkJ CSAgICAgIGNvbnN0IGNoYXIgKmVkaWQsIHNpemVfdCBlZGlkX2xlbikKPiA+ICt7Cj4gPiArCXN0 cnVjdCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2ICpwcml2ID0KPiA+ICsJ CWNvbm5lY3Rvcl90b19wcml2KGNvbm5lY3Rvcik7Cj4gPiArCXN0cnVjdCBkcm1fZGV2aWNlICpk cm0gPSBjb25uZWN0b3ItPmRldjsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJcHJpdi0+Y3Vy cmVudF9lZGlkID0gZWRpZDsKPiA+ICsJcHJpdi0+Y3VycmVudF9lZGlkX2xlbiA9IGVkaWRfbGVu Owo+ID4gKwo+ID4gKwltdXRleF9sb2NrKCZkcm0tPm1vZGVfY29uZmlnLm11dGV4KTsKPiA+ICsJ cmV0ID0gY29ubmVjdG9yLT5mdW5jcy0+ZmlsbF9tb2Rlcyhjb25uZWN0b3IsIDQwOTYsIDQwOTYp Owo+ID4gKwltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ID4gKwlLVU5J VF9BU1NFUlRfR1QodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgZHVtbXlfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gK3sKPiA+ICsJc3RydWN0IGRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKnByaXYgPQo+ID4gKwkJY29ubmVjdG9yX3RvX3ByaXYo Y29ubmVjdG9yKTsKPiA+ICsJY29uc3Qgc3RydWN0IGRybV9lZGlkICplZGlkOwo+ID4gKwl1bnNp Z25lZCBpbnQgbnVtX21vZGVzOwo+ID4gKwo+ID4gKwllZGlkID0gZHJtX2VkaWRfYWxsb2MocHJp di0+Y3VycmVudF9lZGlkLCBwcml2LT5jdXJyZW50X2VkaWRfbGVuKTsKPiA+ICsJaWYgKCFlZGlk KQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCj4gPiArCWRybV9lZGlkX2Nvbm5lY3Rvcl91 cGRhdGUoY29ubmVjdG9yLCBlZGlkKTsKPiA+ICsJbnVtX21vZGVzID0gZHJtX2VkaWRfY29ubmVj dG9yX2FkZF9tb2Rlcyhjb25uZWN0b3IpOwo+ID4gKwo+ID4gKwlkcm1fZWRpZF9mcmVlKGVkaWQp Owo+ID4gKwo+ID4gKwlyZXR1cm4gbnVtX21vZGVzOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGR1bW15X2Nvbm5lY3Rvcl9o ZWxwZXJfZnVuY3MgPSB7Cj4gPiArCS5hdG9taWNfY2hlY2sJPSBkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfaGRtaV9jaGVjaywKPiA+ICsJLmdldF9tb2Rlcwk9IGR1bW15X2Nvbm5lY3Rvcl9n ZXRfbW9kZXMsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBkdW1teV9oZG1pX2Nvbm5l Y3Rvcl9yZXNldChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gK3sKPiA+ICsJ ZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0KGNvbm5lY3Rvcik7Cj4gPiArCV9fZHJt X2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXQoY29ubmVjdG9yLCBjb25uZWN0b3It PnN0YXRlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVj dG9yX2Z1bmNzIGR1bW15X2Nvbm5lY3Rvcl9mdW5jcyA9IHsKPiA+ICsJLmF0b21pY19kZXN0cm95 X3N0YXRlCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gPiAr CS5hdG9taWNfZHVwbGljYXRlX3N0YXRlCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1 cGxpY2F0ZV9zdGF0ZSwKPiA+ICsJLmZpbGxfbW9kZXMJCT0gZHJtX2hlbHBlcl9wcm9iZV9zaW5n bGVfY29ubmVjdG9yX21vZGVzLAo+ID4gKwkucmVzZXQJCQk9IGR1bW15X2hkbWlfY29ubmVjdG9y X3Jlc2V0LAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljCj4gPiArc3RydWN0IGRybV9hdG9taWNf aGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKgo+ID4gK2RybV9hdG9taWNfaGVscGVyX2Nvbm5l Y3Rvcl9oZG1pX2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KQo+ID4gK3sKPiA+ICsJc3RydWN0IGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKnByaXY7Cj4gPiArCXN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uOwo+ID4gKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuYzsKPiA+ICsJ c3RydWN0IGRybV9kZXZpY2UgKmRybTsKPiA+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ID4gKwlp bnQgcmV0Owo+ID4gKwo+ID4gKwlkZXYgPSBkcm1fa3VuaXRfaGVscGVyX2FsbG9jX2RldmljZSh0 ZXN0KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBkZXYpOwo+ID4g Kwo+ID4gKwlwcml2ID0gZHJtX2t1bml0X2hlbHBlcl9hbGxvY19kcm1fZGV2aWNlKHRlc3QsIGRl diwKPiA+ICsJCQkJCQkgc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3By aXYsIGRybSwKPiA+ICsJCQkJCQkgRFJJVkVSX01PREVTRVQgfCBEUklWRVJfQVRPTUlDKTsKPiA+ ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBwcml2KTsKPiA+ICsJdGVzdC0+ cHJpdiA9IHByaXY7Cj4gPiArCj4gPiArCWRybSA9ICZwcml2LT5kcm07Cj4gPiArCXByaXYtPnBs YW5lID0gZHJtX2t1bml0X2hlbHBlcl9jcmVhdGVfcHJpbWFyeV9wbGFuZSh0ZXN0LCBkcm0sCj4g PiArCQkJCQkJCSAgICBOVUxMLAo+ID4gKwkJCQkJCQkgICAgTlVMTCwKPiA+ICsJCQkJCQkJICAg IE5VTEwsIDAsCj4gPiArCQkJCQkJCSAgICBOVUxMKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9F UlJfT1JfTlVMTCh0ZXN0LCBwcml2LT5wbGFuZSk7Cj4gPiArCj4gPiArCXByaXYtPmNydGMgPSBk cm1fa3VuaXRfaGVscGVyX2NyZWF0ZV9jcnRjKHRlc3QsIGRybSwKPiA+ICsJCQkJCQkgIHByaXYt PnBsYW5lLCBOVUxMLAo+ID4gKwkJCQkJCSAgTlVMTCwKPiA+ICsJCQkJCQkgIE5VTEwpOwo+ID4g KwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHByaXYtPmNydGMpOwo+ID4gKwo+ ID4gKwllbmMgPSAmcHJpdi0+ZW5jb2RlcjsKPiA+ICsJcmV0ID0gZHJtbV9lbmNvZGVyX2luaXQo ZHJtLCBlbmMsIE5VTEwsIERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7Cj4gPiArCUtVTklU X0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ID4gKwo+ID4gKwllbmMtPnBvc3NpYmxlX2NydGNz ID0gZHJtX2NydGNfbWFzayhwcml2LT5jcnRjKTsKPiA+ICsKPiA+ICsJY29ubiA9ICZwcml2LT5j b25uZWN0b3I7Cj4gPiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdChkcm0sIGNvbm4s Cj4gPiArCQkJCSAgICAgICAmZHVtbXlfY29ubmVjdG9yX2Z1bmNzLAo+ID4gKwkJCQkgICAgICAg RFJNX01PREVfQ09OTkVDVE9SX0hETUlBLAo+ID4gKwkJCQkgICAgICAgTlVMTCk7Cj4gPiArCUtV TklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ID4gKwo+ID4gKwlkcm1fY29ubmVjdG9yX2hl bHBlcl9hZGQoY29ubiwgJmR1bW15X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwo+ID4gKwlkcm1f Y29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm4sIGVuYyk7Cj4gPiArCj4gPiArCWRybV9tb2Rl X2NvbmZpZ19yZXNldChkcm0pOwo+ID4gKwo+ID4gKwlyZXQgPSBzZXRfY29ubmVjdG9yX2VkaWQo dGVzdCwgY29ubiwKPiA+ICsJCQkJIHRlc3RfZWRpZF9oZG1pXzEwODBwX3JnYl9tYXhfMjAwbWh6 LAo+ID4gKwkJCQkgQVJSQVlfU0laRSh0ZXN0X2VkaWRfaGRtaV8xMDgwcF9yZ2JfbWF4XzIwMG1o eikpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJcmV0 dXJuIHByaXY7Cj4gPiArfQo+ID4gKwo+ID4gKy8qCj4gPiArICogVGVzdCB0aGF0IGlmIHdlIGNo YW5nZSB0aGUgUkdCIHF1YW50aXphdGlvbiBwcm9wZXJ0eSB0byBhIGRpZmZlcmVudAo+ID4gKyAq IHZhbHVlLCB3ZSB0cmlnZ2VyIGEgbW9kZSBjaGFuZ2Ugb24gdGhlIGNvbm5lY3RvcidzIENSVEMs IHdoaWNoIHdpbGwKPiA+ICsgKiBpbiB0dXJuIGRpc2FibGUvZW5hYmxlIHRoZSBjb25uZWN0b3Iu Cj4gPiArICovCj4gPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0X3JnYl9j cnRjX21vZGVfY2hhbmdlZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlzdHJ1Y3Qg ZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiA+ICsJc3RydWN0 IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHg7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9y X3N0YXRlICpvbGRfY29ubl9zdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUg Km5ld19jb25uX3N0YXRlOwo+ID4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7 Cj4gPiArCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKnByZWZlcnJlZDsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47 Cj4gPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkcm07Cj4gPiArCXN0cnVjdCBkcm1fY3J0YyAqY3J0 YzsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJcHJpdiA9IGRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX2luaXQodGVzdCk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0 LCBwcml2KTsKPiA+ICsKPiA+ICsJY3R4ID0gZHJtX2t1bml0X2hlbHBlcl9hY3F1aXJlX2N0eF9h bGxvYyh0ZXN0KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjdHgp Owo+ID4gKwo+ID4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiA+ICsJcHJlZmVycmVkID0g ZmluZF9wcmVmZXJyZWRfbW9kZShjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRl c3QsIHByZWZlcnJlZCk7Cj4gPiArCj4gPiArCWRybSA9ICZwcml2LT5kcm07Cj4gPiArCWNydGMg PSBwcml2LT5jcnRjOwo+ID4gKwlyZXQgPSBsaWdodF91cF9jb25uZWN0b3IodGVzdCwgZHJtLCBj cnRjLCBjb25uLCBwcmVmZXJyZWQsIGN0eCk7Cj4gPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCBy ZXQsIDApOwo+ID4gKwo+ID4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRl X2FsbG9jKHRlc3QsIGRybSwgY3R4KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVM TCh0ZXN0LCBzdGF0ZSk7Cj4gPiArCj4gPiArCW5ld19jb25uX3N0YXRlID0gZHJtX2F0b21pY19n ZXRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9F UlJfT1JfTlVMTCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gPiArCj4gPiArCW9sZF9jb25uX3N0 YXRlID0gZHJtX2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4g PiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ ID4gKwo+ID4gKwluZXdfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiID0gRFJNX0hETUlf QlJPQURDQVNUX1JHQl9GVUxMOwo+ID4gKwo+ID4gKwlLVU5JVF9BU1NFUlRfTkUodGVzdCwKPiA+ ICsJCQlvbGRfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiLAo+ID4gKwkJCW5ld19jb25u X3N0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2IpOwo+ID4gKwo+ID4gKwlyZXQgPSBkcm1fYXRvbWlj X2NoZWNrX29ubHkoc3RhdGUpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsK PiA+ICsKPiA+ICsJbmV3X2Nvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9y X3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0 ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCBuZXdfY29u bl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiLCBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0ZVTEwp Owo+ID4gKwo+ID4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X2NydGNfc3RhdGUo c3RhdGUsIGNydGMpOwo+ID4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIGNy dGNfc3RhdGUpOwo+ID4gKwlLVU5JVF9FWFBFQ1RfVFJVRSh0ZXN0LCBjcnRjX3N0YXRlLT5tb2Rl X2NoYW5nZWQpOwo+ID4gK30KPiA+ICsKPiA+ICsvKgo+ID4gKyAqIFRlc3QgdGhhdCBpZiB3ZSBz ZXQgdGhlIFJHQiBxdWFudGl6YXRpb24gcHJvcGVydHkgdG8gdGhlIHNhbWUgdmFsdWUsCj4gPiAr ICogd2UgZG9uJ3QgdHJpZ2dlciBhIG1vZGUgY2hhbmdlIG9uIHRoZSBjb25uZWN0b3IncyBDUlRD IGFuZCBsZWF2ZSB0aGUKPiA+ICsgKiBjb25uZWN0b3IgdW5hZmZlY3RlZC4KPiA+ICsgKi8KPiA+ ICtzdGF0aWMgdm9pZCBkcm1fdGVzdF9jaGVja19icm9hZGNhc3RfcmdiX2NydGNfbW9kZV9ub3Rf Y2hhbmdlZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2F0b21p Y19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiA+ICsJc3RydWN0IGRybV9tb2Rl c2V0X2FjcXVpcmVfY3R4ICpjdHg7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpv bGRfY29ubl9zdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25u X3N0YXRlOwo+ID4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gPiArCXN0 cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9kaXNwbGF5X21v ZGUgKnByZWZlcnJlZDsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47Cj4gPiArCXN0 cnVjdCBkcm1fZGV2aWNlICpkcm07Cj4gPiArCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKPiA+ICsJ aW50IHJldDsKPiA+ICsKPiA+ICsJcHJpdiA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9o ZG1pX2luaXQodGVzdCk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcml2KTsK PiA+ICsKPiA+ICsJY3R4ID0gZHJtX2t1bml0X2hlbHBlcl9hY3F1aXJlX2N0eF9hbGxvYyh0ZXN0 KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjdHgpOwo+ID4gKwo+ ID4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiA+ICsJcHJlZmVycmVkID0gZmluZF9wcmVm ZXJyZWRfbW9kZShjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHByZWZl cnJlZCk7Cj4gPiArCj4gPiArCWRybSA9ICZwcml2LT5kcm07Cj4gPiArCWNydGMgPSBwcml2LT5j cnRjOwo+ID4gKwlyZXQgPSBsaWdodF91cF9jb25uZWN0b3IodGVzdCwgZHJtLCBjcnRjLCBjb25u LCBwcmVmZXJyZWQsIGN0eCk7Cj4gPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ ID4gKwo+ID4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRlX2FsbG9jKHRl c3QsIGRybSwgY3R4KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBz dGF0ZSk7Cj4gPiArCj4gPiArCW5ld19jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVj dG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVM TCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gPiArCj4gPiArCW9sZF9jb25uX3N0YXRlID0gZHJt X2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gPiArCUtVTklU X0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ID4gKwo+ID4g KwluZXdfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiID0gb2xkX2Nvbm5fc3RhdGUtPmhk bWkuYnJvYWRjYXN0X3JnYjsKPiA+ICsKPiA+ICsJcmV0ID0gZHJtX2F0b21pY19jaGVja19vbmx5 KHN0YXRlKTsKPiA+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4gPiArCj4gPiAr CW9sZF9jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0 ZSwgY29ubik7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nv bm5fc3RhdGUpOwo+ID4gKwo+ID4gKwluZXdfY29ubl9zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25l d19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ID4gKwlLVU5JVF9BU1NFUlRfTk9UX0VS Ul9PUl9OVUxMKHRlc3QsIG5ld19jb25uX3N0YXRlKTsKPiA+ICsKPiA+ICsJS1VOSVRfRVhQRUNU X0VRKHRlc3QsCj4gPiArCQkJb2xkX2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiwKPiA+ ICsJCQluZXdfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiKTsKPiA+ICsKPiA+ICsJY3J0 Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLCBjcnRjKTsKPiA+ ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjcnRjX3N0YXRlKTsKPiA+ICsJ S1VOSVRfRVhQRUNUX0ZBTFNFKHRlc3QsIGNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCk7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfaGRtaV9jaGVja190ZXN0c1tdID0gewo+ID4gKwlLVU5JVF9DQVNFKGRybV90ZXN0 X2NoZWNrX2Jyb2FkY2FzdF9yZ2JfY3J0Y19tb2RlX2NoYW5nZWQpLAo+ID4gKwlLVU5JVF9DQVNF KGRybV90ZXN0X2NoZWNrX2Jyb2FkY2FzdF9yZ2JfY3J0Y19tb2RlX25vdF9jaGFuZ2VkKSwKPiA+ ICsJeyB9Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRybV9h dG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2NoZWNrX3Rlc3Rfc3VpdGUgPSB7Cj4gPiArCS5u YW1lCQk9ICJkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9jaGVjayIsCj4gPiArCS50 ZXN0X2Nhc2VzCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2tfdGVzdHMs Cj4gPiArfTsKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIFRlc3QgdGhhdCB0aGUgdmFsdWUgb2YgdGhl IEJyb2FkY2FzdCBSR0IgcHJvcGVydHkgb3V0IG9mIHJlc2V0IGlzIHNldAo+ID4gKyAqIHRvIGF1 dG8uCj4gPiArICovCj4gPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0X3Jn Yl92YWx1ZShzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2F0b21p Y19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiA+ICsJc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGU7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25u Owo+ID4gKwo+ID4gKwlwcml2ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfaW5p dCh0ZXN0KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHByaXYpOwo+ID4gKwo+ ID4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiA+ICsJY29ubl9zdGF0ZSA9IGNvbm4tPnN0 YXRlOwo+ID4gKwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNh c3RfcmdiLCBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE8pOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlf cmVzZXRfdGVzdHNbXSA9IHsKPiA+ICsJS1VOSVRfQ0FTRShkcm1fdGVzdF9jaGVja19icm9hZGNh c3RfcmdiX3ZhbHVlKSwKPiA+ICsJeyB9Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0 IGt1bml0X3N1aXRlIGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0X3Rlc3Rf c3VpdGUgPSB7Cj4gPiArCS5uYW1lCQk9ICJkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRt aV9yZXNldCIsCj4gPiArCS50ZXN0X2Nhc2VzIAk9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rv cl9oZG1pX3Jlc2V0X3Rlc3RzLAo+ID4gK307Cj4gPiArCj4gPiAra3VuaXRfdGVzdF9zdWl0ZXMo Cj4gPiArCSZkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9jaGVja190ZXN0X3N1aXRl LAo+ID4gKwkmZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXRfdGVzdF9zdWl0 ZSwKPiA+ICspOwo+ID4gKwo+ID4gK01PRFVMRV9BVVRIT1IoIk1heGltZSBSaXBhcmQgPG1yaXBh cmRAa2VybmVsLm9yZz4iKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jIGIvZHJpdmVy cy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4gPiBpbmRleCA4ZjA3MGNhY2Fi M2IuLjQxZDMzZGVhMzBhZiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9k cm1fY29ubmVjdG9yX3Rlc3QuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9j b25uZWN0b3JfdGVzdC5jCj4gPiBAQCAtMTIsNiArMTIsOCBAQAo+ID4gIAo+ID4gICNpbmNsdWRl IDxrdW5pdC90ZXN0Lmg+Cj4gPiAgCj4gPiArI2luY2x1ZGUgIi4uL2RybV9jcnRjX2ludGVybmFs LmgiCj4gPiArCj4gPiAgc3RydWN0IGRybV9jb25uZWN0b3JfaW5pdF9wcml2IHsKPiA+ICAJc3Ry dWN0IGRybV9kZXZpY2UgZHJtOwo+ID4gIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7 Cj4gPiBAQCAtMzU3LDEwICszNTksMTIzIEBAIHN0YXRpYyBzdHJ1Y3Qga3VuaXRfc3VpdGUgZHJt X2dldF90dl9tb2RlX2Zyb21fbmFtZV90ZXN0X3N1aXRlID0gewo+ID4gIAkudGVzdF9jYXNlcyA9 IGRybV9nZXRfdHZfbW9kZV9mcm9tX25hbWVfdGVzdHMsCj4gPiAgfTsKPiA+ICAKPiA+ICtzdHJ1 Y3QgZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdGVzdCB7Cj4gPiAr CXVuc2lnbmVkIGludCBraW5kOwo+ID4gKwljb25zdCBjaGFyICpleHBlY3RlZF9uYW1lOwo+ID4g K307Cj4gPiArCj4gPiArI2RlZmluZSBCUk9BRENBU1RfUkdCX1RFU1QoX2tpbmQsIF9uYW1lKQlc Cj4gPiArCXsJCQkJCVwKPiA+ICsJCS5raW5kID0gX2tpbmQsCQkJXAo+ID4gKwkJLmV4cGVjdGVk X25hbWUgPSBfbmFtZSwJCVwKPiA+ICsJfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIGRybV90ZXN0 X2RybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lKHN0cnVjdCBrdW5pdCAq dGVzdCkKPiA+ICt7Cj4gPiArCWNvbnN0IHN0cnVjdCBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jy b2FkY2FzdF9yZ2JfbmFtZV90ZXN0ICpwYXJhbXMgPQo+ID4gKwkJdGVzdC0+cGFyYW1fdmFsdWU7 Cj4gPiArCj4gPiArCUtVTklUX0VYUEVDVF9TVFJFUSh0ZXN0LAo+ID4gKwkJCSAgIGRybV9oZG1p X2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lKHBhcmFtcy0+a2luZCksCj4gPiArCQkJ ICAgcGFyYW1zLT5leHBlY3RlZF9uYW1lKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0 Cj4gPiArc3RydWN0IGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3Rl c3QKPiA+ICtkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV92YWxpZF90 ZXN0c1tdID0gewo+ID4gKwlCUk9BRENBU1RfUkdCX1RFU1QoRFJNX0hETUlfQlJPQURDQVNUX1JH Ql9BVVRPLCAiQXV0b21hdGljIiksCj4gPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1fSERNSV9C Uk9BRENBU1RfUkdCX0ZVTEwsICJGdWxsIiksCj4gPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1f SERNSV9CUk9BRENBU1RfUkdCX0xJTUlURUQsICJMaW1pdGVkIDE2OjIzNSIpLAo+ID4gK307Cj4g PiArCj4gPiArc3RhdGljIHZvaWQKPiA+ICtkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2Fz dF9yZ2JfbmFtZV92YWxpZF9kZXNjKGNvbnN0IHN0cnVjdCBkcm1faGRtaV9jb25uZWN0b3JfZ2V0 X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0ICp0LAo+ID4gKwkJCQkJCSAgICAgY2hhciAqZGVzYykK PiA+ICt7Cj4gPiArCXNwcmludGYoZGVzYywgIiVzIiwgdC0+ZXhwZWN0ZWRfbmFtZSk7Cj4gPiAr fQo+ID4gKwo+ID4gK0tVTklUX0FSUkFZX1BBUkFNKGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJv YWRjYXN0X3JnYl9uYW1lX3ZhbGlkLAo+ID4gKwkJICBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jy b2FkY2FzdF9yZ2JfbmFtZV92YWxpZF90ZXN0cywKPiA+ICsJCSAgZHJtX2hkbWlfY29ubmVjdG9y X2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWRfZGVzYyk7Cj4gPiArCj4gPiArc3RhdGljIHZv aWQgZHJtX3Rlc3RfZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfaW52 YWxpZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlLVU5JVF9FWFBFQ1RfTlVMTCh0 ZXN0LCBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZSgzKSk7Cj4gPiAr fTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2hkbWlfY29ubmVjdG9y X2dldF9icm9hZGNhc3RfcmdiX25hbWVfdGVzdHNbXSA9IHsKPiA+ICsJS1VOSVRfQ0FTRV9QQVJB TShkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZSwKPiA+ ICsJCQkgZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWRfZ2Vu X3BhcmFtcyksCj4gPiArCUtVTklUX0NBU0UoZHJtX3Rlc3RfZHJtX2hkbWlfY29ubmVjdG9yX2dl dF9icm9hZGNhc3RfcmdiX25hbWVfaW52YWxpZCksCj4gPiArCXsgfQo+ID4gK307Cj4gPiArCj4g PiArc3RhdGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2Fk Y2FzdF9yZ2JfbmFtZV90ZXN0X3N1aXRlID0gewo+ID4gKwkubmFtZSA9ICJkcm1faGRtaV9jb25u ZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZSIsCj4gPiArCS50ZXN0X2Nhc2VzID0gZHJtX2hk bWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdGVzdHMsCj4gPiArfTsKPiA+ICsK PiA+ICtzdGF0aWMgdm9pZCBkcm1fdGVzdF9kcm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNhc3Rf cmdiX3Byb3BlcnR5KHN0cnVjdCBrdW5pdCAqdGVzdCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yX2luaXRfcHJpdiAqcHJpdiA9IHRlc3QtPnByaXY7Cj4gPiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3IgPSAmcHJpdi0+Y29ubmVjdG9yOwo+ID4gKwlzdHJ1Y3QgZHJt X3Byb3BlcnR5ICpwcm9wOwo+ID4gKwlpbnQgcmV0Owo+ID4gKwo+ID4gKwlyZXQgPSBkcm1tX2Nv bm5lY3Rvcl9pbml0KCZwcml2LT5kcm0sIGNvbm5lY3RvciwKPiA+ICsJCQkJICAmZHVtbXlfZnVu Y3MsCj4gPiArCQkJCSAgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBLAo+ID4gKwkJCQkgICZwcml2 LT5kZGMpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJ cmV0ID0gZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eShjb25uZWN0 b3IpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJcHJv cCA9IGNvbm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKPiA+ICsJS1VOSVRfQVNTRVJU X05PVF9OVUxMKHRlc3QsIHByb3ApOwo+ID4gKwlLVU5JVF9FWFBFQ1RfTk9UX05VTEwodGVzdCwg ZHJtX21vZGVfb2JqX2ZpbmRfcHJvcF9pZCgmY29ubmVjdG9yLT5iYXNlLCBwcm9wLT5iYXNlLmlk KSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIGRybV90ZXN0X2RybV9jb25uZWN0b3Jf YXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHlfaGRtaV9jb25uZWN0b3Ioc3RydWN0IGt1bml0 ICp0ZXN0KQo+ID4gK3sKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3JfaW5pdF9wcml2ICpwcml2 ID0gdGVzdC0+cHJpdjsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZw cml2LT5jb25uZWN0b3I7Cj4gPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gPiArCWlu dCByZXQ7Cj4gPiArCj4gPiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdCgmcHJpdi0+ ZHJtLCBjb25uZWN0b3IsCj4gPiArCQkJCSAgICAgICAmZHVtbXlfZnVuY3MsCj4gPiArCQkJCSAg ICAgICBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEsCj4gPiArCQkJCSAgICAgICAmcHJpdi0+ZGRj KTsKPiA+ICsJS1VOSVRfRVhQRUNUX0VRKHRlc3QsIHJldCwgMCk7Cj4gPiArCj4gPiArCXJldCA9 IGRybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoY29ubmVjdG9yKTsK PiA+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4gPiArCj4gPiArCXByb3AgPSBj b25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1Rf TlVMTCh0ZXN0LCBwcm9wKTsKPiA+ICsJS1VOSVRfRVhQRUNUX05PVF9OVUxMKHRlc3QsIGRybV9t b2RlX29ial9maW5kX3Byb3BfaWQoJmNvbm5lY3Rvci0+YmFzZSwgcHJvcC0+YmFzZS5pZCkpOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2Nvbm5lY3Rvcl9h dHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eV90ZXN0c1tdID0gewo+ID4gKwlLVU5JVF9DQVNF KGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkpLAo+ ID4gKwlLVU5JVF9DQVNFKGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9y Z2JfcHJvcGVydHlfaGRtaV9jb25uZWN0b3IpLAo+ID4gKwl7IH0KPiA+ICt9Owo+ID4gKwo+ID4g K3N0YXRpYyBzdHJ1Y3Qga3VuaXRfc3VpdGUgZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0 X3JnYl9wcm9wZXJ0eV90ZXN0X3N1aXRlID0gewo+ID4gKwkubmFtZSA9ICJkcm1fY29ubmVjdG9y X2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5IiwKPiA+ICsJLmluaXQgPSBkcm1fdGVzdF9j b25uZWN0b3JfaW5pdCwKPiA+ICsJLnRlc3RfY2FzZXMgPSBkcm1fY29ubmVjdG9yX2F0dGFjaF9i cm9hZGNhc3RfcmdiX3Byb3BlcnR5X3Rlc3RzLAo+ID4gK307Cj4gPiArCj4gPiAga3VuaXRfdGVz dF9zdWl0ZXMoCj4gPiAgCSZkcm1tX2Nvbm5lY3Rvcl9oZG1pX2luaXRfdGVzdF9zdWl0ZSwKPiA+ ICAJJmRybW1fY29ubmVjdG9yX2luaXRfdGVzdF9zdWl0ZSwKPiA+IC0JJmRybV9nZXRfdHZfbW9k ZV9mcm9tX25hbWVfdGVzdF9zdWl0ZQo+ID4gKwkmZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRj YXN0X3JnYl9wcm9wZXJ0eV90ZXN0X3N1aXRlLAo+ID4gKwkmZHJtX2dldF90dl9tb2RlX2Zyb21f bmFtZV90ZXN0X3N1aXRlLAo+ID4gKwkmZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3Rf cmdiX25hbWVfdGVzdF9zdWl0ZQo+ID4gICk7Cj4gPiAgCj4gPiAgTU9EVUxFX0FVVEhPUigiTWF4 aW1lIFJpcGFyZCA8bWF4aW1lQGNlcm5vLnRlY2g+Iik7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlkLmggYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMv ZHJtX2t1bml0X2VkaWQuaAo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAw MDAwMDAwMC4uMmJiYTMxNmRlMDY0Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vdGVzdHMvZHJtX2t1bml0X2VkaWQuaAo+ID4gQEAgLTAsMCArMSwxMDYgQEAKPiA+ ICsjaWZuZGVmIERSTV9LVU5JVF9FRElEX0hfCj4gPiArI2RlZmluZSBEUk1fS1VOSVRfRURJRF9I Xwo+ID4gKwo+ID4gKy8qCj4gPiArICogZWRpZC1kZWNvZGUgKGhleCk6Cj4gPiArICoKPiA+ICsg KiAwMCBmZiBmZiBmZiBmZiBmZiBmZiAwMCAzMSBkOCAyYSAwMCAwMCAwMCAwMCAwMAo+ID4gKyAq IDAwIDIxIDAxIDAzIDgxIGEwIDVhIDc4IDAyIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4gPiArICog MDAgMDAgMDAgMjAgMDAgMDAgMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEKPiA+ICsgKiAw MSAwMSAwMSAwMSAwMSAwMSAwMiAzYSA4MCAxOCA3MSAzOCAyZCA0MCA1OCAyYwo+ID4gKyAqIDQ1 IDAwIDQwIDg0IDYzIDAwIDAwIDFlIDAwIDAwIDAwIGZjIDAwIDU0IDY1IDczCj4gPiArICogNzQg MjAgNDUgNDQgNDkgNDQgMGEgMjAgMjAgMjAgMDAgMDAgMDAgZmQgMDAgMzIKPiA+ICsgKiA0NiAx ZSA0NiAwZiAwMCAwYSAyMCAyMCAyMCAyMCAyMCAyMCAwMCAwMCAwMCAxMAo+ID4gKyAqIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAxIDkyCj4gPiArICoKPiA+ICsg KiAwMiAwMyAxYiA4MSBlMyAwNSAwMCAyMCA0MSAxMCBlMiAwMCA0YSA2ZCAwMyAwYwo+ID4gKyAq IDAwIDEyIDM0IDAwIDI4IDIwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4gPiArICog MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKPiA+ICsgKiAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ID4gKyAqIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4gPiArICogMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKPiA+ICsgKiAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ID4gKyAqIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGQwCj4gPiArICoKPiA+ICsg KiAtLS0tLS0tLS0tLS0tLS0tCj4gPiArICoKPiA+ICsgKiBCbG9jayAwLCBCYXNlIEVESUQ6Cj4g PiArICogICBFRElEIFN0cnVjdHVyZSBWZXJzaW9uICYgUmV2aXNpb246IDEuMwo+ID4gKyAqICAg VmVuZG9yICYgUHJvZHVjdCBJZGVudGlmaWNhdGlvbjoKPiA+ICsgKiAgICAgTWFudWZhY3R1cmVy OiBMTlgKPiA+ICsgKiAgICAgTW9kZWw6IDQyCj4gPiArICogICAgIE1hZGUgaW46IDIwMjMKPiA+ ICsgKiAgIEJhc2ljIERpc3BsYXkgUGFyYW1ldGVycyAmIEZlYXR1cmVzOgo+ID4gKyAqICAgICBE aWdpdGFsIGRpc3BsYXkKPiA+ICsgKiAgICAgREZQIDEueCBjb21wYXRpYmxlIFRNRFMKPiA+ICsg KiAgICAgTWF4aW11bSBpbWFnZSBzaXplOiAxNjAgY20geCA5MCBjbQo+ID4gKyAqICAgICBHYW1t YTogMi4yMAo+ID4gKyAqICAgICBNb25vY2hyb21lIG9yIGdyYXlzY2FsZSBkaXNwbGF5Cj4gPiAr ICogICAgIEZpcnN0IGRldGFpbGVkIHRpbWluZyBpcyB0aGUgcHJlZmVycmVkIHRpbWluZwo+ID4g KyAqICAgQ29sb3IgQ2hhcmFjdGVyaXN0aWNzOgo+ID4gKyAqICAgICBSZWQgIDogMC4wMDAwLCAw LjAwMDAKPiA+ICsgKiAgICAgR3JlZW46IDAuMDAwMCwgMC4wMDAwCj4gPiArICogICAgIEJsdWUg OiAwLjAwMDAsIDAuMDAwMAo+ID4gKyAqICAgICBXaGl0ZTogMC4wMDAwLCAwLjAwMDAKPiA+ICsg KiAgIEVzdGFibGlzaGVkIFRpbWluZ3MgSSAmIElJOgo+ID4gKyAqICAgICBETVQgMHgwNDogICA2 NDB4NDgwICAgIDU5Ljk0MDQ3NiBIeiAgIDQ6MyAgICAgMzEuNDY5IGtIeiAgICAgMjUuMTc1MDAw IE1Iego+ID4gKyAqICAgU3RhbmRhcmQgVGltaW5nczogbm9uZQo+ID4gKyAqICAgRGV0YWlsZWQg VGltaW5nIERlc2NyaXB0b3JzOgo+ID4gKyAqICAgICBEVEQgMTogIDE5MjB4MTA4MCAgIDYwLjAw MDAwMCBIeiAgMTY6OSAgICAgNjcuNTAwIGtIeiAgICAxNDguNTAwMDAwIE1IeiAoMTYwMCBtbSB4 IDkwMCBtbSkKPiA+ICsgKiAgICAgICAgICAgICAgICAgIEhmcm9udCAgIDg4IEhzeW5jICA0NCBI YmFjayAgMTQ4IEhwb2wgUAo+ID4gKyAqICAgICAgICAgICAgICAgICAgVmZyb250ICAgIDQgVnN5 bmMgICA1IFZiYWNrICAgMzYgVnBvbCBQCj4gPiArICogICAgIERpc3BsYXkgUHJvZHVjdCBOYW1l OiAnVGVzdCBFRElEJwo+ID4gKyAqICAgICBEaXNwbGF5IFJhbmdlIExpbWl0czoKPiA+ICsgKiAg ICAgICBNb25pdG9yIHJhbmdlcyAoR1RGKTogNTAtNzAgSHogViwgMzAtNzAga0h6IEgsIG1heCBk b3RjbG9jayAxNTAgTUh6Cj4gPiArICogICAgIER1bW15IERlc2NyaXB0b3I6Cj4gPiArICogICBF eHRlbnNpb24gYmxvY2tzOiAxCj4gPiArICogQ2hlY2tzdW06IDB4OTIKPiA+ICsgKgo+ID4gKyAq IC0tLS0tLS0tLS0tLS0tLS0KPiA+ICsgKgo+ID4gKyAqIEJsb2NrIDEsIENUQS04NjEgRXh0ZW5z aW9uIEJsb2NrOgo+ID4gKyAqICAgUmV2aXNpb246IDMKPiA+ICsgKiAgIFVuZGVyc2NhbnMgSVQg VmlkZW8gRm9ybWF0cyBieSBkZWZhdWx0Cj4gPiArICogICBOYXRpdmUgZGV0YWlsZWQgbW9kZXM6 IDEKPiA+ICsgKiAgIENvbG9yaW1ldHJ5IERhdGEgQmxvY2s6Cj4gPiArICogICAgIHNSR0IKPiA+ ICsgKiAgIFZpZGVvIERhdGEgQmxvY2s6Cj4gPiArICogICAgIFZJQyAgMTY6ICAxOTIweDEwODAg ICA2MC4wMDAwMDAgSHogIDE2OjkgICAgIDY3LjUwMCBrSHogICAgMTQ4LjUwMDAwMCBNSHoKPiA+ ICsgKiAgIFZpZGVvIENhcGFiaWxpdHkgRGF0YSBCbG9jazoKPiA+ICsgKiAgICAgWUNiQ3IgcXVh bnRpemF0aW9uOiBObyBEYXRhCj4gPiArICogICAgIFJHQiBxdWFudGl6YXRpb246IFNlbGVjdGFi bGUgKHZpYSBBVkkgUSkKPiA+ICsgKiAgICAgUFQgc2NhbiBiZWhhdmlvcjogTm8gRGF0YQo+ID4g KyAqICAgICBJVCBzY2FuIGJlaGF2aW9yOiBBbHdheXMgVW5kZXJzY2FubmVkCj4gPiArICogICAg IENFIHNjYW4gYmVoYXZpb3I6IEFsd2F5cyBVbmRlcnNjYW5uZWQKPiA+ICsgKiAgIFZlbmRvci1T cGVjaWZpYyBEYXRhIEJsb2NrIChIRE1JKSwgT1VJIDAwLTBDLTAzOgo+ID4gKyAqICAgICBTb3Vy Y2UgcGh5c2ljYWwgYWRkcmVzczogMS4yLjMuNAo+ID4gKyAqICAgICBNYXhpbXVtIFRNRFMgY2xv Y2s6IDIwMCBNSHoKPiA+ICsgKiAgICAgRXh0ZW5kZWQgSERNSSB2aWRlbyBkZXRhaWxzOgo+ID4g KyAqIENoZWNrc3VtOiAweGQwICBVbnVzZWQgc3BhY2UgaW4gRXh0ZW5zaW9uIEJsb2NrOiAxMDAg Ynl0ZXMKPiA+ICsgKi8KPiA+ICtjb25zdCB1bnNpZ25lZCBjaGFyIHRlc3RfZWRpZF9oZG1pXzEw ODBwX3JnYl9tYXhfMjAwbWh6W10gPSB7Cj4gPiArICAweDAwLCAweGZmLCAweGZmLCAweGZmLCAw eGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMxLCAweGQ4LCAweDJhLCAweDAwLAo+ID4gKyAgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHgwMywgMHg4MSwgMHhhMCwg MHg1YSwgMHg3OCwKPiA+ICsgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsCj4gPiArICAweDAwLCAweDAwLCAweDAx LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAo+ ID4gKyAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYSwgMHg4 MCwgMHgxOCwgMHg3MSwgMHgzOCwKPiA+ICsgIDB4MmQsIDB4NDAsIDB4NTgsIDB4MmMsIDB4NDUs IDB4MDAsIDB4NDAsIDB4ODQsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MWUsCj4gPiArICAweDAwLCAw eDAwLCAweDAwLCAweGZjLCAweDAwLCAweDU0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDQ1 LCAweDQ0LAo+ID4gKyAgMHg0OSwgMHg0NCwgMHgwYSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwg MHgwMCwgMHgwMCwgMHhmZCwgMHgwMCwgMHgzMiwKPiA+ICsgIDB4NDYsIDB4MDAsIDB4MDAsIDB4 YzQsIDB4MDAsIDB4MGEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCj4gPiAr ICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMSwgMHg0MSwgMHgwMiwgMHgwMywgMHgxYiwgMHg4MSwKPiA+ICsgIDB4ZTMsIDB4MDUs IDB4MDAsIDB4MjAsIDB4NDEsIDB4MTAsIDB4ZTIsIDB4MDAsIDB4NGEsIDB4NmQsIDB4MDMsIDB4 MGMsCj4gPiArICAweDAwLCAweDEyLCAweDM0LCAweDAwLCAweDI4LCAweDIwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKPiA+ICsgIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsCj4gPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwK PiA+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwKPiA+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gPiArICAweDAwLCAweDAwLCAweDAwLCAw eGQwCj4gPiArfTsKPiA+ICsKPiA+ICsjZW5kaWYgLy8gRFJNX0tVTklUX0VESURfSF8KPiA+IGRp ZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmggYi9pbmNsdWRlL2RybS9kcm1f Y29ubmVjdG9yLmgKPiA+IGluZGV4IDAwMGEyYTE1NjYxOS4uMzg2N2E0YzAxYjc4IDEwMDY0NAo+ ID4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCj4gPiArKysgYi9pbmNsdWRlL2Ry bS9kcm1fY29ubmVjdG9yLmgKPiA+IEBAIC0zNjgsNiArMzY4LDMwIEBAIGVudW0gZHJtX3BhbmVs X29yaWVudGF0aW9uIHsKPiA+ICAJRFJNX01PREVfUEFORUxfT1JJRU5UQVRJT05fUklHSFRfVVAs Cj4gPiAgfTsKPiA+ICAKPiA+ICsvKioKPiA+ICsgKiBlbnVtIGRybV9oZG1pX2Jyb2FkY2FzdF9y Z2IgLSBCcm9hZGNhc3QgUkdCIFNlbGVjdGlvbiBmb3IgYW4gSERNSSBAZHJtX2Nvbm5lY3Rvcgo+ ID4gKyAqLwo+ID4gK2VudW0gZHJtX2hkbWlfYnJvYWRjYXN0X3JnYiB7Cj4gPiArCS8qKgo+ID4g KwkgKiBARFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPOiBUaGUgUkdCIHJhbmdlIGlzIHNlbGVj dGVkCj4gPiArCSAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIG1vZGUuCj4gPiArCSAqLwo+ ID4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE8sCj4gPiArCj4gPiArCS8qKgo+ID4gKwkg KiBARFJNX0hETUlfQlJPQURDQVNUX1JHQl9GVUxMOiBGdWxsIHJhbmdlIFJHQiBpcyBmb3JjZWQu Cj4gPiArCSAqLwo+ID4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdCX0ZVTEwsCj4gPiArCj4gPiAr CS8qKgo+ID4gKwkgKiBARFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVEOiBMaW1pdGVkIHJh bmdlIFJHQiBpcyBmb3JjZWQuCj4gPiArCSAqLwo+ID4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdC X0xJTUlURUQsCj4gPiArfTsKPiA+ICsKPiA+ICtjb25zdCBjaGFyICoKPiA+ICtkcm1faGRtaV9j b25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZShlbnVtIGRybV9oZG1pX2Jyb2FkY2FzdF9y Z2IgYnJvYWRjYXN0X3JnYik7Cj4gPiArCj4gPiAgLyoqCj4gPiAgICogc3RydWN0IGRybV9tb25p dG9yX3JhbmdlX2luZm8gLSBQYW5lbCdzIE1vbml0b3IgcmFuZ2UgaW4gRURJRCBmb3IKPiA+ICAg KiAmZHJtX2Rpc3BsYXlfaW5mbwo+ID4gQEAgLTEwMzcsNiArMTA2MSwxMSBAQCBzdHJ1Y3QgZHJt X2Nvbm5lY3Rvcl9zdGF0ZSB7Cj4gPiAgCSAqIEBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3Jf aGRtaV9jaGVjaygpLgo+ID4gIAkgKi8KPiA+ICAJc3RydWN0IHsKPiA+ICsJCS8qKgo+ID4gKwkJ ICogQGJyb2FkY2FzdF9yZ2I6IENvbm5lY3RvciBwcm9wZXJ0eSB0byBwYXNzIHRoZQo+ID4gKwkJ ICogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdmFsdWUuCj4gPiArCQkgKi8KPiA+ICsJCWVudW0g ZHJtX2hkbWlfYnJvYWRjYXN0X3JnYiBicm9hZGNhc3RfcmdiOwo+ID4gIAl9IGhkbWk7Cj4gPiAg fTsKPiA+ICAKPiA+IEBAIC0xNzA2LDYgKzE3MzUsMTIgQEAgc3RydWN0IGRybV9jb25uZWN0b3Ig ewo+ID4gIAkgKi8KPiA+ICAJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJpdmFjeV9zY3JlZW5faHdf c3RhdGVfcHJvcGVydHk7Cj4gPiAgCj4gPiArCS8qKgo+ID4gKwkgKiBAYnJvYWRjYXN0X3JnYl9w cm9wZXJ0eTogQ29ubmVjdG9yIHByb3BlcnR5IHRvIHNldCB0aGUKPiA+ICsJICogQnJvYWRjYXN0 IFJHQiBzZWxlY3Rpb24gdG8gb3V0cHV0IHdpdGguCj4gPiArCSAqLwo+ID4gKwlzdHJ1Y3QgZHJt X3Byb3BlcnR5ICpicm9hZGNhc3RfcmdiX3Byb3BlcnR5Owo+ID4gKwo+ID4gICNkZWZpbmUgRFJN X0NPTk5FQ1RPUl9QT0xMX0hQRCAoMSA8PCAwKQo+ID4gICNkZWZpbmUgRFJNX0NPTk5FQ1RPUl9Q T0xMX0NPTk5FQ1QgKDEgPDwgMSkKPiA+ICAjZGVmaW5lIERSTV9DT05ORUNUT1JfUE9MTF9ESVND T05ORUNUICgxIDw8IDIpCj4gPiBAQCAtMjAyNiw2ICsyMDYxLDcgQEAgaW50IGRybV9jb25uZWN0 b3JfYXR0YWNoX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yLAo+ID4gIAkJCQkJICAgICAgIHUzMiBzY2FsaW5nX21vZGVfbWFzayk7Cj4gPiAgaW50 IGRybV9jb25uZWN0b3JfYXR0YWNoX3Zycl9jYXBhYmxlX3Byb3BlcnR5KAo+ID4gIAkJc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gPiAraW50IGRybV9jb25uZWN0b3JfYXR0YWNo X2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7 Cj4gPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX2NvbG9yc3BhY2VfcHJvcGVydHkoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNo X2hkcl9vdXRwdXRfbWV0YWRhdGFfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3Rvcik7Cj4gPiAgYm9vbCBkcm1fY29ubmVjdG9yX2F0b21pY19oZHJfbWV0YWRhdGFfZXF1YWwo c3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9zdGF0ZSwKPiA+IAo+ID4gLS0gCj4gPiAy LjQzLjAKPiA+IAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtcm9ja2NoaXAK 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 64FE0C3DA79 for ; Mon, 15 Jan 2024 14:38:07 +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=di6wffK16zLqphCnAmQFcb5klZ14NLkP/RdUJm3Mbyk=; b=e8hF9zCjEI2vMZ P7topEBv351Y5uV6d20d3NQ00caeJqUbwJNsLGZiqz2w5YOzv68y12Mrli3ObZM2uWZX6dUPP8x5k s9qJPLoQ5bNhCf6tr+ng8h2QKyy1+lv+3TJWTQnSja3KBrwXtdNqvLoDNsDHpjyi/KvpnkOemhUvE Byo2FgxuombmEBL8PVkVnw36b/mrRPv3WgRCMaZ50DQZTBc3xFcX040LzCyhYqfuOoAEXfU1MeM3Z kJD1dFIqlww9tJkZEM1AKokR/k3x374OjHTHyxAMf7MQ1x9LnO3YDETiny4UXurjAiHeSGM5w5dsy aHBuYcIab2gerxXbDmBQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rPO5k-009F9O-1T; Mon, 15 Jan 2024 14:37:32 +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 1rPO5f-009F81-0r for linux-arm-kernel@lists.infradead.org; Mon, 15 Jan 2024 14:37:31 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329446; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=XwGmrLGjtMdtm6iCBx3gWn5/VFWLejBa6sRLy0HoiharliiDNApE9Rv5sCsE9ZYLo2O2k9 z+4gM3o0bLAzcIPd6NAOp9d37+XemQBr1x1Q2Dv6MBKCIAFwL4nQqBEvMn06Ntu/OAgtRv OsxKG0cr559Ss/EkreXdRk1BWPPWJrg= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-492-eAvGRORQNFWakz87wXyFsw-1; Mon, 15 Jan 2024 09:37:24 -0500 X-MC-Unique: eAvGRORQNFWakz87wXyFsw-1 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-40e478693bcso36723415e9.1 for ; Mon, 15 Jan 2024 06:37:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329443; x=1705934243; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=ZQYCfzfmOlm4Bw4Dm68NxJ7tHWD6Dcvp7UC8hSSNReAlRKMPybS/NPErHa8XsWf+gm bEzMlzUyguOZi9lubPdyYg9OOh8pNi5IeVk689YzbRIAmDHtnTMChA59cHkqTUo1LMAs 5nBwuOKkMr5NtTiJ6OV5LzSpa4IhSALm5LwSa7ZnXLTAZoeemmhbrCMNz46eWA0aj2U7 Ks5zEKMthS0NnfttrRKwje1qAORQOgouMZ159G/KSkF2qCbJeCRDabW9u6SfCKHn4bKX tRanYWOHhqwAMKPT8RF3CyRhRPcm6nVSpUoVjMhZf7g6nUjxAk24xUlRqGCLBFmQEkB5 qgBA== X-Gm-Message-State: AOJu0YyM4JnsW1pujweKGjZZrOuBLeVa6CqNizoTnNluTPG4Qtg0+FYy g7oSsxVbL5VSU1GoA2hVa5NX1UQUkIAMttwxbsFKS9xGMfC7VFJ/e4BqHv48rZLkImfDKK5sGwW Da5bNkL37siFE/q/BRKBwV+Bklh+LQyhx+AwBvnq7Y8A= X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847850wmn.165.1705329443290; Mon, 15 Jan 2024 06:37:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IFUzdT5xU1sVf6BlLsAbm0wMLME7RDvKcEkYs4WH7QaXA5cIHhvh7BgfvcwqcTW3CkeFNoBnA== X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847837wmn.165.1705329442768; Mon, 15 Jan 2024 06:37:22 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id f18-20020a05600c155200b0040d87100733sm16221215wmg.39.2024.01.15.06.37.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:37:22 -0800 (PST) Date: Mon, 15 Jan 2024 15:37:20 +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: <20240115143720.GA160656@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> <20240115143308.GA159345@toolbox> MIME-Version: 1.0 In-Reply-To: <20240115143308.GA159345@toolbox> 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_063727_519513_DCB6A322 X-CRM114-Status: GOOD ( 48.78 ) 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 T24gTW9uLCBKYW4gMTUsIDIwMjQgYXQgMDM6MzM6MDhQTSArMDEwMCwgU2ViYXN0aWFuIFdpY2sg d3JvdGU6Cj4gT24gVGh1LCBEZWMgMDcsIDIwMjMgYXQgMDQ6NDk6MzFQTSArMDEwMCwgTWF4aW1l IFJpcGFyZCB3cm90ZToKPiA+IFRoZSBpOTE1IGRyaXZlciBoYXMgYSBwcm9wZXJ0eSB0byBmb3Jj ZSB0aGUgUkdCIHJhbmdlIG9mIGFuIEhETUkgb3V0cHV0Lgo+ID4gVGhlIHZjNCBkcml2ZXIgdGhl biBpbXBsZW1lbnRlZCB0aGUgc2FtZSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lCj4gPiBzZW1hbnRp Y3MuIEtXaW4gaGFzIHN1cHBvcnQgZm9yIGl0LCBhbmQgYSBQUiBmb3IgbXV0dGVyIGlzIGFsc28g dGhlcmUgdG8KPiA+IHN1cHBvcnQgaXQuCj4gPiAKPiA+IEJvdGggZHJpdmVycyBpbXBsZW1lbnRp bmcgdGhlIHNhbWUgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MsCj4gPiBwbHVzIHRo ZSB1c2Vyc3BhY2UgaGF2aW5nIHN1cHBvcnQgZm9yIGl0LCBpcyBwcm9vZiBlbm91Z2ggdGhhdCBp dCdzCj4gPiBwcmV0dHkgbXVjaCBhIGRlLWZhY3RvIHN0YW5kYXJkIG5vdyBhbmQgd2UgY2FuIHBy b3ZpZGUgaGVscGVycyBmb3IgaXQuCj4gPiAKPiA+IExldCdzIHBsdW1iIGl0IGludG8gdGhlIG5l d2x5IGNyZWF0ZWQgSERNSSBjb25uZWN0b3IuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IE1heGlt ZSBSaXBhcmQgPG1yaXBhcmRAa2VybmVsLm9yZz4KPiA+IC0tLQo+ID4gIERvY3VtZW50YXRpb24v Z3B1L2ttcy1wcm9wZXJ0aWVzLmNzdiAgICAgICAgICAgICAgIHwgICAxIC0KPiA+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2F0b21pYy5jICAgICAgICAgICAgICAgICAgICAgICB8ICAgNSArCj4gPiAg ZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfc3RhdGVfaGVscGVyLmMgICAgICAgICAgfCAgMTcg Kwo+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGkuYyAgICAgICAgICAgICAgICAg IHwgICA0ICsKPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2Nvbm5lY3Rvci5jICAgICAgICAgICAg ICAgICAgICB8ICA3NiArKysrKwo+ID4gIGRyaXZlcnMvZ3B1L2RybS90ZXN0cy9NYWtlZmlsZSAg ICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICAuLi4vZ3B1L2RybS90ZXN0cy9kcm1fYXRv bWljX3N0YXRlX2hlbHBlcl90ZXN0LmMgICB8IDM3NiArKysrKysrKysrKysrKysrKysrKysKPiA+ ICBkcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2Nvbm5lY3Rvcl90ZXN0LmMgICAgICAgICB8IDEx NyArKysrKystCj4gPiAgZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlkLmggICAg ICAgICAgICAgfCAxMDYgKysrKysrCj4gPiAgaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oICAg ICAgICAgICAgICAgICAgICAgICAgfCAgMzYgKysKPiA+ICAxMCBmaWxlcyBjaGFuZ2VkLCA3Mzcg aW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdiBiL0RvY3VtZW50YXRpb24vZ3B1L2ttcy1w cm9wZXJ0aWVzLmNzdgo+ID4gaW5kZXggMGY5NTkwODM0ODI5Li5jYWVmMTRjNTMyZDQgMTAwNjQ0 Cj4gPiAtLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YKPiA+ICsrKyBi L0RvY3VtZW50YXRpb24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdgo+ID4gQEAgLTE3LDcgKzE3LDYg QEAgT3duZXIgTW9kdWxlL0RyaXZlcnMsR3JvdXAsUHJvcGVydHkgTmFtZSxUeXBlLFByb3BlcnR5 IFZhbHVlcyxPYmplY3QgYXR0YWNoZWQsRGUKPiA+ICAsVmlydHVhbCBHUFUs4oCcc3VnZ2VzdGVk IFjigJ0sUkFOR0UsIk1pbj0wLCBNYXg9MHhmZmZmZmZmZiIsQ29ubmVjdG9yLHByb3BlcnR5IHRv IHN1Z2dlc3QgYW4gWCBvZmZzZXQgZm9yIGEgY29ubmVjdG9yCj4gPiAgLCzigJxzdWdnZXN0ZWQg WeKAnSxSQU5HRSwiTWluPTAsIE1heD0weGZmZmZmZmZmIixDb25uZWN0b3IscHJvcGVydHkgdG8g c3VnZ2VzdCBhbiBZIG9mZnNldCBmb3IgYSBjb25uZWN0b3IKPiA+ICAsT3B0aW9uYWwsIiIiYXNw ZWN0IHJhdGlvIiIiLEVOVU0sInsgIiJOb25lIiIsICIiNDozIiIsICIiMTY6OSIiIH0iLENvbm5l Y3RvcixUREIKPiA+IC1pOTE1LEdlbmVyaWMsIiIiQnJvYWRjYXN0IFJHQiIiIixFTlVNLCJ7ICIi QXV0b21hdGljIiIsICIiRnVsbCIiLCAiIkxpbWl0ZWQgMTY6MjM1IiIgfSIsQ29ubmVjdG9yLCJX aGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIExpbWl0ZWQgMTY6MjM1IGFuZCBDVE0gaXMgc2V0 LCB0aGUgaGFyZHdhcmUgd2lsbCBiZSBwcm9ncmFtbWVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUg bXVsdGlwbGljYXRpb24gb2YgQ1RNIGJ5IHRoZSBsaW1pdGVkIHJhbmdlIG1hdHJpeCB0byBlbnN1 cmUgdGhlIHBpeGVscyBub3JtYWxseSBpbiB0aGUgcmFuZ2UgMC4uMS4wIGFyZSByZW1hcHBlZCB0 byB0aGUgcmFuZ2UgMTYvMjU1Li4yMzUvMjU1LiIKPiA+ICAsLOKAnGF1ZGlv4oCdLEVOVU0sInsg IiJmb3JjZS1kdmkiIiwgIiJvZmYiIiwgIiJhdXRvIiIsICIib24iIiB9IixDb25uZWN0b3IsVEJE Cj4gPiAgLFNEVk8tVFYs4oCcbW9kZeKAnSxFTlVNLCJ7ICIiTlRTQ19NIiIsICIiTlRTQ19KIiIs ICIiTlRTQ180NDMiIiwgIiJQQUxfQiIiIH0gZXRjLiIsQ29ubmVjdG9yLFRCRAo+ID4gICwsIiIi bGVmdF9tYXJnaW4iIiIsUkFOR0UsIk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50IixDb25uZWN0 b3IsVEJECj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyBiL2Ry aXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljLmMKPiA+IGluZGV4IGMzMWZjMGI0OGMzMS4uMTQ2NWE3 ZjA5YTBiIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+ID4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+ID4gQEAgLTExNDIsNiArMTE0Miwx MSBAQCBzdGF0aWMgdm9pZCBkcm1fYXRvbWljX2Nvbm5lY3Rvcl9wcmludF9zdGF0ZShzdHJ1Y3Qg ZHJtX3ByaW50ZXIgKnAsCj4gPiAgCWRybV9wcmludGYocCwgIlx0bWF4X3JlcXVlc3RlZF9icGM9 JWRcbiIsIHN0YXRlLT5tYXhfcmVxdWVzdGVkX2JwYyk7Cj4gPiAgCWRybV9wcmludGYocCwgIlx0 Y29sb3JzcGFjZT0lc1xuIiwgZHJtX2dldF9jb2xvcnNwYWNlX25hbWUoc3RhdGUtPmNvbG9yc3Bh Y2UpKTsKPiA+ICAKPiA+ICsJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01P REVfQ09OTkVDVE9SX0hETUlBIHx8Cj4gPiArCSAgICBjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBl ID09IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQikKPiA+ICsJCWRybV9wcmludGYocCwgIlx0YnJv YWRjYXN0X3JnYj0lc1xuIiwKPiA+ICsJCQkgICBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2Fk Y2FzdF9yZ2JfbmFtZShzdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiKSk7Cj4gPiArCj4gPiAgCWlm IChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9XUklURUJB Q0spCj4gPiAgCQlpZiAoc3RhdGUtPndyaXRlYmFja19qb2IgJiYgc3RhdGUtPndyaXRlYmFja19q b2ItPmZiKQo+ID4gIAkJCWRybV9wcmludGYocCwgIlx0ZmI9JWRcbiIsIHN0YXRlLT53cml0ZWJh Y2tfam9iLT5mYi0+YmFzZS5pZCk7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2Ry bV9hdG9taWNfc3RhdGVfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0 ZV9oZWxwZXIuYwo+ID4gaW5kZXggZTY5YzBjYzFjNmRhLi4xMGQ5ODYyMGEzNTggMTAwNjQ0Cj4g PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIuYwo+ID4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfc3RhdGVfaGVscGVyLmMKPiA+IEBAIC01ODMs NiArNTgzLDcgQEAgRVhQT1JUX1NZTUJPTChkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfdHZf cmVzZXQpOwo+ID4gIHZvaWQgX19kcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9yZXNl dChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gIAkJCQkJICAgICAgc3RydWN0 IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19zdGF0ZSkKPiA+ICB7Cj4gPiArCW5ld19zdGF0ZS0+ aGRtaS5icm9hZGNhc3RfcmdiID0gRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPOwo+ID4gIH0K PiA+ICBFWFBPUlRfU1lNQk9MKF9fZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVz ZXQpOwo+ID4gIAo+ID4gQEAgLTY1MCw2ICs2NTEsMjIgQEAgRVhQT1JUX1NZTUJPTChkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfdHZfY2hlY2spOwo+ID4gIGludCBkcm1fYXRvbWljX2hlbHBl cl9jb25uZWN0b3JfaGRtaV9jaGVjayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ ID4gIAkJCQkJICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQo+ID4gIHsKPiA+ICsJ c3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9zdGF0ZSA9Cj4gPiArCQlkcm1fYXRvbWlj X2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ID4gKwlzdHJ1Y3Qg ZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0YXRlID0KPiA+ICsJCWRybV9hdG9taWNfZ2V0X25l d19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5lY3Rvcik7Cj4gPiArCj4gPiArCWlmIChvbGRf c3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiAhPSBuZXdfc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3Jn Yikgewo+ID4gKwkJc3RydWN0IGRybV9jcnRjICpjcnRjID0gbmV3X3N0YXRlLT5jcnRjOwo+ID4g KwkJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ID4gKwo+ID4gKwkJY3J0Y19z dGF0ZSA9IGRybV9hdG9taWNfZ2V0X2NydGNfc3RhdGUoc3RhdGUsIGNydGMpOwo+ID4gKwkJaWYg KElTX0VSUihjcnRjX3N0YXRlKSkKPiA+ICsJCQlyZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsK PiA+ICsKPiA+ICsJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7Cj4gPiArCX0KPiA+ ICsKPiA+ICAJcmV0dXJuIDA7Cj4gPiAgfQo+ID4gIEVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19o ZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2spOwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljX3VhcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX3VhcGku Ywo+ID4gaW5kZXggYWVlNGE2NWQ0OTU5Li4zZWI0ZjRiYzhiNzEgMTAwNjQ0Cj4gPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY191YXBpLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fYXRvbWljX3VhcGkuYwo+ID4gQEAgLTgxOCw2ICs4MTgsOCBAQCBzdGF0aWMgaW50IGRy bV9hdG9taWNfY29ubmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yLAo+ID4gIAkJc3RhdGUtPm1heF9yZXF1ZXN0ZWRfYnBjID0gdmFsOwo+ID4gIAl9IGVs c2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rvci0+cHJpdmFjeV9zY3JlZW5fc3dfc3RhdGVfcHJv cGVydHkpIHsKPiA+ICAJCXN0YXRlLT5wcml2YWN5X3NjcmVlbl9zd19zdGF0ZSA9IHZhbDsKPiA+ ICsJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVy dHkpIHsKPiA+ICsJCXN0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2IgPSB2YWw7Cj4gPiAgCX0gZWxz ZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX3NldF9wcm9wZXJ0eSkgewo+ID4gIAkJcmV0 dXJuIGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19zZXRfcHJvcGVydHkoY29ubmVjdG9yLAo+ID4g IAkJCQlzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiBAQCAtOTAxLDYgKzkwMyw4IEBAIGRybV9h dG9taWNfY29ubmVjdG9yX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLAo+ID4gIAkJKnZhbCA9IHN0YXRlLT5tYXhfcmVxdWVzdGVkX2JwYzsKPiA+ICAJfSBlbHNl IGlmIChwcm9wZXJ0eSA9PSBjb25uZWN0b3ItPnByaXZhY3lfc2NyZWVuX3N3X3N0YXRlX3Byb3Bl cnR5KSB7Cj4gPiAgCQkqdmFsID0gc3RhdGUtPnByaXZhY3lfc2NyZWVuX3N3X3N0YXRlOwo+ID4g Kwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0 eSkgewo+ID4gKwkJKnZhbCA9IHN0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2I7Cj4gPiAgCX0gZWxz ZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+YXRvbWljX2dldF9wcm9wZXJ0eSkgewo+ID4gIAkJcmV0 dXJuIGNvbm5lY3Rvci0+ZnVuY3MtPmF0b21pY19nZXRfcHJvcGVydHkoY29ubmVjdG9yLAo+ID4g IAkJCQlzdGF0ZSwgcHJvcGVydHksIHZhbCk7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2RybV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMKPiA+ IGluZGV4IGQ5OTYxY2NlODI0NS4uOTI5YjBhOTExZjYyIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2RybV9jb25uZWN0b3IuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9j b25uZWN0b3IuYwo+ID4gQEAgLTExODMsNiArMTE4MywyOSBAQCBzdGF0aWMgY29uc3QgdTMyIGRw X2NvbG9yc3BhY2VzID0KPiA+ICAJQklUKERSTV9NT0RFX0NPTE9SSU1FVFJZX0JUMjAyMF9DWUND KSB8Cj4gPiAgCUJJVChEUk1fTU9ERV9DT0xPUklNRVRSWV9CVDIwMjBfWUNDKTsKPiA+ICAKPiA+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBicm9hZGNhc3RfcmdiX25h bWVzW10gPSB7Cj4gPiArCXsgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPLCAiQXV0b21hdGlj IiB9LAo+ID4gKwl7IERSTV9IRE1JX0JST0FEQ0FTVF9SR0JfRlVMTCwgIkZ1bGwiIH0sCj4gPiAr CXsgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVELCAiTGltaXRlZCAxNjoyMzUiIH0sCj4g PiArfTsKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRj YXN0X3JnYl9uYW1lIC0gUmV0dXJuIGEgc3RyaW5nIGZvciBIRE1JIGNvbm5lY3RvciBSR0IgYnJv YWRjYXN0IHNlbGVjdGlvbgo+ID4gKyAqIEBicm9hZGNhc3RfcmdiOiBCcm9hZGNhc3QgUkdCIHNl bGVjdGlvbiB0byBjb21wdXRlIG5hbWUgb2YKPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6IHRoZSBu YW1lIG9mIHRoZSBCcm9hZGNhc3QgUkdCIHNlbGVjdGlvbiwgb3IgTlVMTCBpZiB0aGUgdHlwZQo+ ID4gKyAqIGlzIG5vdCB2YWxpZC4KPiA+ICsgKi8KPiA+ICtjb25zdCBjaGFyICoKPiA+ICtkcm1f aGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZShlbnVtIGRybV9oZG1pX2Jyb2Fk Y2FzdF9yZ2IgYnJvYWRjYXN0X3JnYikKPiA+ICt7Cj4gPiArCWlmIChicm9hZGNhc3RfcmdiID4g RFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVEKQo+ID4gKwkJcmV0dXJuIE5VTEw7Cj4gPiAr Cj4gPiArCXJldHVybiBicm9hZGNhc3RfcmdiX25hbWVzW2Jyb2FkY2FzdF9yZ2JdLm5hbWU7Cj4g PiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3Rf cmdiX25hbWUpOwo+ID4gKwo+ID4gIC8qKgo+ID4gICAqIERPQzogc3RhbmRhcmQgY29ubmVjdG9y IHByb3BlcnRpZXMKPiA+ICAgKgo+ID4gQEAgLTE2NTUsNiArMTY3OCwyNiBAQCBFWFBPUlRfU1lN Qk9MKGRybV9jb25uZWN0b3JfYXR0YWNoX2RwX3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSk7Cj4gPiAg LyoqCj4gPiAgICogRE9DOiBIRE1JIGNvbm5lY3RvciBwcm9wZXJ0aWVzCj4gPiAgICoKPiA+ICsg KiBCcm9hZGNhc3QgUkdCCj4gPiArICogICAgICBJbmRpY2F0ZXMgdGhlIFJHQiBRdWFudGl6YXRp b24gUmFuZ2UgKEZ1bGwgdnMgTGltaXRlZCkgdXNlZC4KPiA+ICsgKiAgICAgIEluZm9mcmFtZXMg d2lsbCBiZSBnZW5lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoYXQgdmFsdWUuCj4gPiArICoKPiA+ICsg KiAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxv d2luZzoKPiA+ICsgKgo+ID4gKyAqICAgICAgQXV0b21hdGljOgo+ID4gKyAqICAgICAgICAgICAg ICBSR0IgUmFuZ2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgbW9kZQo+ ID4gKyAqICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIEhETUkgc3BlY2lmaWNhdGlvbnMu Cj4gPiArICoKPiA+ICsgKiAgICAgIEZ1bGw6Cj4gPiArICogICAgICAgICAgICAgIEZ1bGwgUkdC IFJhbmdlIGlzIGZvcmNlZC4KPiA+ICsgKgo+ID4gKyAqICAgICAgTGltaXRlZCAxNjoyMzU6Cj4g PiArICogICAgICAgICAgICAgIExpbWl0ZWQgUkdCIFJhbmdlIGlzIGZvcmNlZC4gVW5saWtlIHRo ZSBuYW1lIHN1Z2dlc3RzLAo+ID4gKyAqICAgICAgICAgICAgICB0aGlzIHdvcmtzIGZvciBhbnkg bnVtYmVyIG9mIGJpdHMtcGVyLWNvbXBvbmVudC4KPiA+ICsgKgo+ID4gKyAqICAgICAgRHJpdmVy cyBjYW4gc2V0IHVwIHRoaXMgcHJvcGVydHkgYnkgY2FsbGluZwo+ID4gKyAqICAgICAgZHJtX2Nv bm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSgpLgo+ID4gKyAqCj4gCj4gVGhp cyBpcyBhIGdvb2QgdGltZSB0byBkb2N1bWVudCB0aGlzIGluIG1vcmUgZGV0YWlsLiBUaGVyZSBt aWdodCBiZSB0d28KPiBkaWZmZXJlbnQgdGhpbmdzIGJlaW5nIGFmZmVjdGVkOgo+IAo+IDEuIFRo ZSBzaWduYWxsaW5nIChJbmZvRnJhbWUvU0RQLy4uLikKPiAyLiBUaGUgY29sb3IgcGlwZWxpbmUg cHJvY2Vzc2luZwo+IAo+IEFsbCB2YWx1ZXMgb2YgQnJvYWRjYXN0IFJHQiBhbHdheXMgYWZmZWN0 IHRoZSBjb2xvciBwaXBlbGluZSBwcm9jZXNzaW5nCj4gc3VjaCB0aGF0IGEgZnVsbC1yYW5nZSBp bnB1dCB0byB0aGUgQ1JUQyBpcyBjb252ZXJ0ZWQgdG8gZWl0aGVyIGZ1bGwtIG9yCj4gbGltaXRl ZC1yYW5nZSwgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIG1vbml0b3IgaXMgc3VwcG9zZWQgdG8gYWNj ZXB0Lgo+IAo+IFdoZW4gYXV0b21hdGljIGlzIHNlbGVjdGVkLCBkb2VzIHRoYXQgbWVhbiB0aGF0 IHRoZXJlIGlzIG5vIHNpZ25hbGxpbmcsCj4gb3IgdGhhdCB0aGUgc2lnbmFsbGluZyBtYXRjaGVz IHdoYXQgdGhlIG1vbml0b3IgaXMgc3VwcG9zZWQgdG8gYWNjZXB0Cj4gYWNjb3JkaW5nIHRvIHRo ZSBzcGVjPyBBbHNvLCBpcyB0aGlzIHJlYWxseSBIRE1JIHNwZWNpZmljPwo+IAo+IFdoZW4gZnVs bCBvciBsaW1pdGVkIGlzIHNlbGVjdGVkIGFuZCB0aGUgbW9uaXRvciBkb2Vzbid0IHN1cHBvcnQg dGhlCj4gc2lnbmFsbGluZywgd2hhdCBoYXBwZW5zPwoKRm9yZ290IHRvIG1lbnRpb246IHVzZXIt c3BhY2Ugc3RpbGwgaGFzIG5vIGNvbnRyb2wgb3ZlciBSR0IgdnMgWUNiQ3Igb24KdGhlIGNhYmxl LCBzbyBpcyB0aGlzIG9ubHkgYWZmZWN0aW5nIFJHQj8gSWYgbm90LCBob3cgZG9lcyBpdCBhZmZl Y3QKWUNiQ3I/Cgo+IAo+ID4gICAqIGNvbnRlbnQgdHlwZSAoSERNSSBzcGVjaWZpYyk6Cj4gPiAg ICoJSW5kaWNhdGVzIGNvbnRlbnQgdHlwZSBzZXR0aW5nIHRvIGJlIHVzZWQgaW4gSERNSSBpbmZv ZnJhbWVzIHRvIGluZGljYXRlCj4gPiAgICoJY29udGVudCB0eXBlIGZvciB0aGUgZXh0ZXJuYWwg ZGV2aWNlLCBzbyB0aGF0IGl0IGFkanVzdHMgaXRzIGRpc3BsYXkKPiA+IEBAIC0yNTE3LDYgKzI1 NjAsMzkgQEAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX2hkcl9vdXRwdXRfbWV0YWRhdGFfcHJv cGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4KPiA+ICB9Cj4gPiAgRVhQT1JUX1NZTUJP TChkcm1fY29ubmVjdG9yX2F0dGFjaF9oZHJfb3V0cHV0X21ldGFkYXRhX3Byb3BlcnR5KTsKPiA+ ICAKPiA+ICsvKioKPiA+ICsgKiBkcm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3By b3BlcnR5IC0gYXR0YWNoICJCcm9hZGNhc3QgUkdCIiBwcm9wZXJ0eQo+ID4gKyAqIEBjb25uZWN0 b3I6IGNvbm5lY3RvciB0byBhdHRhY2ggdGhlIHByb3BlcnR5IG9uLgo+ID4gKyAqCj4gPiArICog VGhpcyBpcyB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciBmb3JjaW5nIHRoZSBSR0IgcmFuZ2Ugb24g YSBjb25uZWN0b3IKPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6Cj4gPiArICogWmVybyBvbiBzdWNj ZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgo+ID4gKyAqLwo+ID4gK2ludCBkcm1fY29u bmVjdG9yX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVj dG9yLT5kZXY7Cj4gPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gPiArCj4gPiArCXBy b3AgPSBjb25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7Cj4gPiArCWlmICghcHJvcCkg ewo+ID4gKwkJcHJvcCA9IGRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkZXYsIERSTV9NT0RFX1BS T1BfRU5VTSwKPiA+ICsJCQkJCQkiQnJvYWRjYXN0IFJHQiIsCj4gPiArCQkJCQkJYnJvYWRjYXN0 X3JnYl9uYW1lcywKPiA+ICsJCQkJCQlBUlJBWV9TSVpFKGJyb2FkY2FzdF9yZ2JfbmFtZXMpKTsK PiA+ICsJCWlmICghcHJvcCkKPiA+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsKPiA+ICsJCWNv bm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0eSA9IHByb3A7Cj4gPiArCX0KPiA+ICsKPiA+ ICsJZHJtX29iamVjdF9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwgcHJvcCwKPiA+ ICsJCQkJICAgRFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPKTsKPiA+ICsKPiA+ICsJcmV0dXJu IDA7Cj4gPiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRj YXN0X3JnYl9wcm9wZXJ0eSk7Cj4gPiArCj4gPiAgLyoqCj4gPiAgICogZHJtX2Nvbm5lY3Rvcl9h dHRhY2hfY29sb3JzcGFjZV9wcm9wZXJ0eSAtIGF0dGFjaCAiQ29sb3JzcGFjZSIgcHJvcGVydHkK PiA+ICAgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gYXR0YWNoIHRoZSBwcm9wZXJ0eSBvbi4K PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvTWFrZWZpbGUgYi9kcml2ZXJz L2dwdS9kcm0vdGVzdHMvTWFrZWZpbGUKPiA+IGluZGV4IGQ2MTgzYjNkNzY4OC4uYjI5ZGRmZDkw NTk2IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL01ha2VmaWxlCj4gPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvTWFrZWZpbGUKPiA+IEBAIC00LDYgKzQsNyBAQCBv YmotJChDT05GSUdfRFJNX0tVTklUX1RFU1RfSEVMUEVSUykgKz0gXAo+ID4gIAlkcm1fa3VuaXRf aGVscGVycy5vCj4gPiAgCj4gPiAgb2JqLSQoQ09ORklHX0RSTV9LVU5JVF9URVNUKSArPSBcCj4g PiArCWRybV9hdG9taWNfc3RhdGVfaGVscGVyX3Rlc3QubyBcCj4gPiAgCWRybV9idWRkeV90ZXN0 Lm8gXAo+ID4gIAlkcm1fY21kbGluZV9wYXJzZXJfdGVzdC5vIFwKPiA+ICAJZHJtX2Nvbm5lY3Rv cl90ZXN0Lm8gXAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fYXRv bWljX3N0YXRlX2hlbHBlcl90ZXN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMvZHJtX2F0b21p Y19zdGF0ZV9oZWxwZXJfdGVzdC5jCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXgg MDAwMDAwMDAwMDAwLi4yMWU2Zjc5NmVlMTMKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS90ZXN0cy9kcm1fYXRvbWljX3N0YXRlX2hlbHBlcl90ZXN0LmMKPiA+IEBA IC0wLDAgKzEsMzc2IEBACj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAK PiA+ICsKPiA+ICsvKgo+ID4gKyAqIEt1bml0IHRlc3QgZm9yIGRybV9hdG9taWNfc3RhdGVfaGVs cGVyIGZ1bmN0aW9ucwo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21p Yy5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19zdGF0ZV9oZWxwZXIuaD4KPiA+ICsj aW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfdWFwaS5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2Ry di5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2VkaWQuaD4KPiA+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9jb25uZWN0b3IuaD4KPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9mb3VyY2MuaD4KPiA+ICsjaW5j bHVkZSA8ZHJtL2RybV9rdW5pdF9oZWxwZXJzLmg+Cj4gPiArI2luY2x1ZGUgPGRybS9kcm1fbWFu YWdlZC5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzZXRfaGVscGVyX3Z0YWJsZXMuaD4K PiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiA+ICsKPiA+ICsjaW5jbHVk ZSA8ZHJtL2RybV9wcmludC5oPgo+ID4gKyNpbmNsdWRlICIuLi9kcm1fY3J0Y19pbnRlcm5hbC5o Igo+ID4gKwo+ID4gKyNpbmNsdWRlIDxrdW5pdC90ZXN0Lmg+Cj4gPiArCj4gPiArI2luY2x1ZGUg ImRybV9rdW5pdF9lZGlkLmgiCj4gPiArCj4gPiArc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX3ByaXYgewo+ID4gKwlzdHJ1Y3QgZHJtX2RldmljZSBkcm07Cj4gPiArCXN0 cnVjdCBkcm1fcGxhbmUgKnBsYW5lOwo+ID4gKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Cj4gPiAr CXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwo+ID4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBj b25uZWN0b3I7Cj4gPiArCj4gPiArCWNvbnN0IGNoYXIgKmN1cnJlbnRfZWRpZDsKPiA+ICsJc2l6 ZV90IGN1cnJlbnRfZWRpZF9sZW47Cj4gPiArfTsKPiA+ICsKPiA+ICsjZGVmaW5lIGNvbm5lY3Rv cl90b19wcml2KGMpIFwKPiA+ICsJY29udGFpbmVyX29mX2NvbnN0KGMsIHN0cnVjdCBkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2LCBjb25uZWN0b3IpCj4gPiArCj4gPiArc3Rh dGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaW5kX3ByZWZlcnJlZF9tb2RlKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2RldmljZSAq ZHJtID0gY29ubmVjdG9yLT5kZXY7Cj4gPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl LCAqcHJlZmVycmVkOwo+ID4gKwo+ID4gKwltdXRleF9sb2NrKCZkcm0tPm1vZGVfY29uZmlnLm11 dGV4KTsKPiA+ICsJcHJlZmVycmVkID0gbGlzdF9maXJzdF9lbnRyeSgmY29ubmVjdG9yLT5tb2Rl cywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsIGhlYWQpOwo+ID4gKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KG1vZGUsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKQo+ID4gKwkJaWYgKG1vZGUtPnR5cGUg JiBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCkKPiA+ICsJCQlwcmVmZXJyZWQgPSBtb2RlOwo+ID4g KwltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ID4gKwo+ID4gKwlyZXR1 cm4gcHJlZmVycmVkOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGxpZ2h0X3VwX2Nvbm5l Y3RvcihzdHJ1Y3Qga3VuaXQgKnRlc3QsCj4gPiArCQkJICAgICAgc3RydWN0IGRybV9kZXZpY2Ug KmRybSwKPiA+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCj4gPiArCQkJICAgICAg c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ICsJCQkgICAgICBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiA+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX21vZGVzZXRfYWNx dWlyZV9jdHggKmN0eCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0 ZTsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGU7Cj4gPiArCXN0 cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ ICsJc3RhdGUgPSBkcm1fa3VuaXRfaGVscGVyX2F0b21pY19zdGF0ZV9hbGxvYyh0ZXN0LCBkcm0s IGN0eCk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgc3RhdGUpOwo+ ID4gKwo+ID4gKwljb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVjdG9yX3N0YXRlKHN0 YXRlLCBjb25uZWN0b3IpOwo+ID4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3Qs IGNvbm5fc3RhdGUpOwo+ID4gKwo+ID4gKwlyZXQgPSBkcm1fYXRvbWljX3NldF9jcnRjX2Zvcl9j b25uZWN0b3IoY29ubl9zdGF0ZSwgY3J0Yyk7Cj4gPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCBy ZXQsIDApOwo+ID4gKwo+ID4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY3J0Y19zdGF0 ZShzdGF0ZSwgY3J0Yyk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwg Y3J0Y19zdGF0ZSk7Cj4gPiArCj4gPiArCXJldCA9IGRybV9hdG9taWNfc2V0X21vZGVfZm9yX2Ny dGMoY3J0Y19zdGF0ZSwgbW9kZSk7Cj4gPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCByZXQsIDAp Owo+ID4gKwo+ID4gKwljcnRjX3N0YXRlLT5lbmFibGUgPSB0cnVlOwo+ID4gKwljcnRjX3N0YXRl LT5hY3RpdmUgPSB0cnVlOwo+ID4gKwo+ID4gKwlyZXQgPSBkcm1fYXRvbWljX2NvbW1pdChzdGF0 ZSk7Cj4gPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ID4gKwo+ID4gKwlyZXR1 cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBzZXRfY29ubmVjdG9yX2VkaWQoc3Ry dWN0IGt1bml0ICp0ZXN0LCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gKwkJ CSAgICAgIGNvbnN0IGNoYXIgKmVkaWQsIHNpemVfdCBlZGlkX2xlbikKPiA+ICt7Cj4gPiArCXN0 cnVjdCBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9wcml2ICpwcml2ID0KPiA+ICsJ CWNvbm5lY3Rvcl90b19wcml2KGNvbm5lY3Rvcik7Cj4gPiArCXN0cnVjdCBkcm1fZGV2aWNlICpk cm0gPSBjb25uZWN0b3ItPmRldjsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJcHJpdi0+Y3Vy cmVudF9lZGlkID0gZWRpZDsKPiA+ICsJcHJpdi0+Y3VycmVudF9lZGlkX2xlbiA9IGVkaWRfbGVu Owo+ID4gKwo+ID4gKwltdXRleF9sb2NrKCZkcm0tPm1vZGVfY29uZmlnLm11dGV4KTsKPiA+ICsJ cmV0ID0gY29ubmVjdG9yLT5mdW5jcy0+ZmlsbF9tb2Rlcyhjb25uZWN0b3IsIDQwOTYsIDQwOTYp Owo+ID4gKwltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25maWcubXV0ZXgpOwo+ID4gKwlLVU5J VF9BU1NFUlRfR1QodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgZHVtbXlfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gK3sKPiA+ICsJc3RydWN0IGRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKnByaXYgPQo+ID4gKwkJY29ubmVjdG9yX3RvX3ByaXYo Y29ubmVjdG9yKTsKPiA+ICsJY29uc3Qgc3RydWN0IGRybV9lZGlkICplZGlkOwo+ID4gKwl1bnNp Z25lZCBpbnQgbnVtX21vZGVzOwo+ID4gKwo+ID4gKwllZGlkID0gZHJtX2VkaWRfYWxsb2MocHJp di0+Y3VycmVudF9lZGlkLCBwcml2LT5jdXJyZW50X2VkaWRfbGVuKTsKPiA+ICsJaWYgKCFlZGlk KQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCj4gPiArCWRybV9lZGlkX2Nvbm5lY3Rvcl91 cGRhdGUoY29ubmVjdG9yLCBlZGlkKTsKPiA+ICsJbnVtX21vZGVzID0gZHJtX2VkaWRfY29ubmVj dG9yX2FkZF9tb2Rlcyhjb25uZWN0b3IpOwo+ID4gKwo+ID4gKwlkcm1fZWRpZF9mcmVlKGVkaWQp Owo+ID4gKwo+ID4gKwlyZXR1cm4gbnVtX21vZGVzOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGR1bW15X2Nvbm5lY3Rvcl9o ZWxwZXJfZnVuY3MgPSB7Cj4gPiArCS5hdG9taWNfY2hlY2sJPSBkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfaGRtaV9jaGVjaywKPiA+ICsJLmdldF9tb2Rlcwk9IGR1bW15X2Nvbm5lY3Rvcl9n ZXRfbW9kZXMsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBkdW1teV9oZG1pX2Nvbm5l Y3Rvcl9yZXNldChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4gK3sKPiA+ICsJ ZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0KGNvbm5lY3Rvcik7Cj4gPiArCV9fZHJt X2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXQoY29ubmVjdG9yLCBjb25uZWN0b3It PnN0YXRlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVj dG9yX2Z1bmNzIGR1bW15X2Nvbm5lY3Rvcl9mdW5jcyA9IHsKPiA+ICsJLmF0b21pY19kZXN0cm95 X3N0YXRlCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gPiAr CS5hdG9taWNfZHVwbGljYXRlX3N0YXRlCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1 cGxpY2F0ZV9zdGF0ZSwKPiA+ICsJLmZpbGxfbW9kZXMJCT0gZHJtX2hlbHBlcl9wcm9iZV9zaW5n bGVfY29ubmVjdG9yX21vZGVzLAo+ID4gKwkucmVzZXQJCQk9IGR1bW15X2hkbWlfY29ubmVjdG9y X3Jlc2V0LAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljCj4gPiArc3RydWN0IGRybV9hdG9taWNf aGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKgo+ID4gK2RybV9hdG9taWNfaGVscGVyX2Nvbm5l Y3Rvcl9oZG1pX2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KQo+ID4gK3sKPiA+ICsJc3RydWN0IGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3ByaXYgKnByaXY7Cj4gPiArCXN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uOwo+ID4gKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuYzsKPiA+ICsJ c3RydWN0IGRybV9kZXZpY2UgKmRybTsKPiA+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ID4gKwlp bnQgcmV0Owo+ID4gKwo+ID4gKwlkZXYgPSBkcm1fa3VuaXRfaGVscGVyX2FsbG9jX2RldmljZSh0 ZXN0KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBkZXYpOwo+ID4g Kwo+ID4gKwlwcml2ID0gZHJtX2t1bml0X2hlbHBlcl9hbGxvY19kcm1fZGV2aWNlKHRlc3QsIGRl diwKPiA+ICsJCQkJCQkgc3RydWN0IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3By aXYsIGRybSwKPiA+ICsJCQkJCQkgRFJJVkVSX01PREVTRVQgfCBEUklWRVJfQVRPTUlDKTsKPiA+ ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBwcml2KTsKPiA+ICsJdGVzdC0+ cHJpdiA9IHByaXY7Cj4gPiArCj4gPiArCWRybSA9ICZwcml2LT5kcm07Cj4gPiArCXByaXYtPnBs YW5lID0gZHJtX2t1bml0X2hlbHBlcl9jcmVhdGVfcHJpbWFyeV9wbGFuZSh0ZXN0LCBkcm0sCj4g PiArCQkJCQkJCSAgICBOVUxMLAo+ID4gKwkJCQkJCQkgICAgTlVMTCwKPiA+ICsJCQkJCQkJICAg IE5VTEwsIDAsCj4gPiArCQkJCQkJCSAgICBOVUxMKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9F UlJfT1JfTlVMTCh0ZXN0LCBwcml2LT5wbGFuZSk7Cj4gPiArCj4gPiArCXByaXYtPmNydGMgPSBk cm1fa3VuaXRfaGVscGVyX2NyZWF0ZV9jcnRjKHRlc3QsIGRybSwKPiA+ICsJCQkJCQkgIHByaXYt PnBsYW5lLCBOVUxMLAo+ID4gKwkJCQkJCSAgTlVMTCwKPiA+ICsJCQkJCQkgIE5VTEwpOwo+ID4g KwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHByaXYtPmNydGMpOwo+ID4gKwo+ ID4gKwllbmMgPSAmcHJpdi0+ZW5jb2RlcjsKPiA+ICsJcmV0ID0gZHJtbV9lbmNvZGVyX2luaXQo ZHJtLCBlbmMsIE5VTEwsIERSTV9NT0RFX0VOQ09ERVJfVE1EUywgTlVMTCk7Cj4gPiArCUtVTklU X0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ID4gKwo+ID4gKwllbmMtPnBvc3NpYmxlX2NydGNz ID0gZHJtX2NydGNfbWFzayhwcml2LT5jcnRjKTsKPiA+ICsKPiA+ICsJY29ubiA9ICZwcml2LT5j b25uZWN0b3I7Cj4gPiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdChkcm0sIGNvbm4s Cj4gPiArCQkJCSAgICAgICAmZHVtbXlfY29ubmVjdG9yX2Z1bmNzLAo+ID4gKwkJCQkgICAgICAg RFJNX01PREVfQ09OTkVDVE9SX0hETUlBLAo+ID4gKwkJCQkgICAgICAgTlVMTCk7Cj4gPiArCUtV TklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ID4gKwo+ID4gKwlkcm1fY29ubmVjdG9yX2hl bHBlcl9hZGQoY29ubiwgJmR1bW15X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwo+ID4gKwlkcm1f Y29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm4sIGVuYyk7Cj4gPiArCj4gPiArCWRybV9tb2Rl X2NvbmZpZ19yZXNldChkcm0pOwo+ID4gKwo+ID4gKwlyZXQgPSBzZXRfY29ubmVjdG9yX2VkaWQo dGVzdCwgY29ubiwKPiA+ICsJCQkJIHRlc3RfZWRpZF9oZG1pXzEwODBwX3JnYl9tYXhfMjAwbWh6 LAo+ID4gKwkJCQkgQVJSQVlfU0laRSh0ZXN0X2VkaWRfaGRtaV8xMDgwcF9yZ2JfbWF4XzIwMG1o eikpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJcmV0 dXJuIHByaXY7Cj4gPiArfQo+ID4gKwo+ID4gKy8qCj4gPiArICogVGVzdCB0aGF0IGlmIHdlIGNo YW5nZSB0aGUgUkdCIHF1YW50aXphdGlvbiBwcm9wZXJ0eSB0byBhIGRpZmZlcmVudAo+ID4gKyAq IHZhbHVlLCB3ZSB0cmlnZ2VyIGEgbW9kZSBjaGFuZ2Ugb24gdGhlIGNvbm5lY3RvcidzIENSVEMs IHdoaWNoIHdpbGwKPiA+ICsgKiBpbiB0dXJuIGRpc2FibGUvZW5hYmxlIHRoZSBjb25uZWN0b3Iu Cj4gPiArICovCj4gPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0X3JnYl9j cnRjX21vZGVfY2hhbmdlZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlzdHJ1Y3Qg ZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiA+ICsJc3RydWN0 IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHg7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9y X3N0YXRlICpvbGRfY29ubl9zdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUg Km5ld19jb25uX3N0YXRlOwo+ID4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7 Cj4gPiArCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKnByZWZlcnJlZDsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47 Cj4gPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkcm07Cj4gPiArCXN0cnVjdCBkcm1fY3J0YyAqY3J0 YzsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJcHJpdiA9IGRybV9hdG9taWNfaGVscGVyX2Nv bm5lY3Rvcl9oZG1pX2luaXQodGVzdCk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0 LCBwcml2KTsKPiA+ICsKPiA+ICsJY3R4ID0gZHJtX2t1bml0X2hlbHBlcl9hY3F1aXJlX2N0eF9h bGxvYyh0ZXN0KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjdHgp Owo+ID4gKwo+ID4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiA+ICsJcHJlZmVycmVkID0g ZmluZF9wcmVmZXJyZWRfbW9kZShjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRl c3QsIHByZWZlcnJlZCk7Cj4gPiArCj4gPiArCWRybSA9ICZwcml2LT5kcm07Cj4gPiArCWNydGMg PSBwcml2LT5jcnRjOwo+ID4gKwlyZXQgPSBsaWdodF91cF9jb25uZWN0b3IodGVzdCwgZHJtLCBj cnRjLCBjb25uLCBwcmVmZXJyZWQsIGN0eCk7Cj4gPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCBy ZXQsIDApOwo+ID4gKwo+ID4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRl X2FsbG9jKHRlc3QsIGRybSwgY3R4KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVM TCh0ZXN0LCBzdGF0ZSk7Cj4gPiArCj4gPiArCW5ld19jb25uX3N0YXRlID0gZHJtX2F0b21pY19n ZXRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9F UlJfT1JfTlVMTCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gPiArCj4gPiArCW9sZF9jb25uX3N0 YXRlID0gZHJtX2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4g PiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ ID4gKwo+ID4gKwluZXdfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiID0gRFJNX0hETUlf QlJPQURDQVNUX1JHQl9GVUxMOwo+ID4gKwo+ID4gKwlLVU5JVF9BU1NFUlRfTkUodGVzdCwKPiA+ ICsJCQlvbGRfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiLAo+ID4gKwkJCW5ld19jb25u X3N0YXRlLT5oZG1pLmJyb2FkY2FzdF9yZ2IpOwo+ID4gKwo+ID4gKwlyZXQgPSBkcm1fYXRvbWlj X2NoZWNrX29ubHkoc3RhdGUpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsK PiA+ICsKPiA+ICsJbmV3X2Nvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9y X3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0 ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gPiArCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCBuZXdfY29u bl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiLCBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0ZVTEwp Owo+ID4gKwo+ID4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X2NydGNfc3RhdGUo c3RhdGUsIGNydGMpOwo+ID4gKwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIGNy dGNfc3RhdGUpOwo+ID4gKwlLVU5JVF9FWFBFQ1RfVFJVRSh0ZXN0LCBjcnRjX3N0YXRlLT5tb2Rl X2NoYW5nZWQpOwo+ID4gK30KPiA+ICsKPiA+ICsvKgo+ID4gKyAqIFRlc3QgdGhhdCBpZiB3ZSBz ZXQgdGhlIFJHQiBxdWFudGl6YXRpb24gcHJvcGVydHkgdG8gdGhlIHNhbWUgdmFsdWUsCj4gPiAr ICogd2UgZG9uJ3QgdHJpZ2dlciBhIG1vZGUgY2hhbmdlIG9uIHRoZSBjb25uZWN0b3IncyBDUlRD IGFuZCBsZWF2ZSB0aGUKPiA+ICsgKiBjb25uZWN0b3IgdW5hZmZlY3RlZC4KPiA+ICsgKi8KPiA+ ICtzdGF0aWMgdm9pZCBkcm1fdGVzdF9jaGVja19icm9hZGNhc3RfcmdiX2NydGNfbW9kZV9ub3Rf Y2hhbmdlZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2F0b21p Y19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiA+ICsJc3RydWN0IGRybV9tb2Rl c2V0X2FjcXVpcmVfY3R4ICpjdHg7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpv bGRfY29ubl9zdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25u X3N0YXRlOwo+ID4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gPiArCXN0 cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPiA+ICsJc3RydWN0IGRybV9kaXNwbGF5X21v ZGUgKnByZWZlcnJlZDsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47Cj4gPiArCXN0 cnVjdCBkcm1fZGV2aWNlICpkcm07Cj4gPiArCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKPiA+ICsJ aW50IHJldDsKPiA+ICsKPiA+ICsJcHJpdiA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9o ZG1pX2luaXQodGVzdCk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBwcml2KTsK PiA+ICsKPiA+ICsJY3R4ID0gZHJtX2t1bml0X2hlbHBlcl9hY3F1aXJlX2N0eF9hbGxvYyh0ZXN0 KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjdHgpOwo+ID4gKwo+ ID4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiA+ICsJcHJlZmVycmVkID0gZmluZF9wcmVm ZXJyZWRfbW9kZShjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHByZWZl cnJlZCk7Cj4gPiArCj4gPiArCWRybSA9ICZwcml2LT5kcm07Cj4gPiArCWNydGMgPSBwcml2LT5j cnRjOwo+ID4gKwlyZXQgPSBsaWdodF91cF9jb25uZWN0b3IodGVzdCwgZHJtLCBjcnRjLCBjb25u LCBwcmVmZXJyZWQsIGN0eCk7Cj4gPiArCUtVTklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+ ID4gKwo+ID4gKwlzdGF0ZSA9IGRybV9rdW5pdF9oZWxwZXJfYXRvbWljX3N0YXRlX2FsbG9jKHRl c3QsIGRybSwgY3R4KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBz dGF0ZSk7Cj4gPiArCj4gPiArCW5ld19jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVj dG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVM TCh0ZXN0LCBuZXdfY29ubl9zdGF0ZSk7Cj4gPiArCj4gPiArCW9sZF9jb25uX3N0YXRlID0gZHJt X2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gPiArCUtVTklU X0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nvbm5fc3RhdGUpOwo+ID4gKwo+ID4g KwluZXdfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiID0gb2xkX2Nvbm5fc3RhdGUtPmhk bWkuYnJvYWRjYXN0X3JnYjsKPiA+ICsKPiA+ICsJcmV0ID0gZHJtX2F0b21pY19jaGVja19vbmx5 KHN0YXRlKTsKPiA+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4gPiArCj4gPiAr CW9sZF9jb25uX3N0YXRlID0gZHJtX2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0 ZSwgY29ubik7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgb2xkX2Nv bm5fc3RhdGUpOwo+ID4gKwo+ID4gKwluZXdfY29ubl9zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25l d19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ID4gKwlLVU5JVF9BU1NFUlRfTk9UX0VS Ul9PUl9OVUxMKHRlc3QsIG5ld19jb25uX3N0YXRlKTsKPiA+ICsKPiA+ICsJS1VOSVRfRVhQRUNU X0VRKHRlc3QsCj4gPiArCQkJb2xkX2Nvbm5fc3RhdGUtPmhkbWkuYnJvYWRjYXN0X3JnYiwKPiA+ ICsJCQluZXdfY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNhc3RfcmdiKTsKPiA+ICsKPiA+ICsJY3J0 Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLCBjcnRjKTsKPiA+ ICsJS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBjcnRjX3N0YXRlKTsKPiA+ICsJ S1VOSVRfRVhQRUNUX0ZBTFNFKHRlc3QsIGNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCk7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2FzZSBkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfaGRtaV9jaGVja190ZXN0c1tdID0gewo+ID4gKwlLVU5JVF9DQVNFKGRybV90ZXN0 X2NoZWNrX2Jyb2FkY2FzdF9yZ2JfY3J0Y19tb2RlX2NoYW5nZWQpLAo+ID4gKwlLVU5JVF9DQVNF KGRybV90ZXN0X2NoZWNrX2Jyb2FkY2FzdF9yZ2JfY3J0Y19tb2RlX25vdF9jaGFuZ2VkKSwKPiA+ ICsJeyB9Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRybV9h dG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX2NoZWNrX3Rlc3Rfc3VpdGUgPSB7Cj4gPiArCS5u YW1lCQk9ICJkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9jaGVjayIsCj4gPiArCS50 ZXN0X2Nhc2VzCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfY2hlY2tfdGVzdHMs Cj4gPiArfTsKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIFRlc3QgdGhhdCB0aGUgdmFsdWUgb2YgdGhl IEJyb2FkY2FzdCBSR0IgcHJvcGVydHkgb3V0IG9mIHJlc2V0IGlzIHNldAo+ID4gKyAqIHRvIGF1 dG8uCj4gPiArICovCj4gPiArc3RhdGljIHZvaWQgZHJtX3Rlc3RfY2hlY2tfYnJvYWRjYXN0X3Jn Yl92YWx1ZShzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2F0b21p Y19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcHJpdiAqcHJpdjsKPiA+ICsJc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGU7Cj4gPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25u Owo+ID4gKwo+ID4gKwlwcml2ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfaW5p dCh0ZXN0KTsKPiA+ICsJS1VOSVRfQVNTRVJUX05PVF9OVUxMKHRlc3QsIHByaXYpOwo+ID4gKwo+ ID4gKwljb25uID0gJnByaXYtPmNvbm5lY3RvcjsKPiA+ICsJY29ubl9zdGF0ZSA9IGNvbm4tPnN0 YXRlOwo+ID4gKwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgY29ubl9zdGF0ZS0+aGRtaS5icm9hZGNh c3RfcmdiLCBEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE8pOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlf cmVzZXRfdGVzdHNbXSA9IHsKPiA+ICsJS1VOSVRfQ0FTRShkcm1fdGVzdF9jaGVja19icm9hZGNh c3RfcmdiX3ZhbHVlKSwKPiA+ICsJeyB9Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0 IGt1bml0X3N1aXRlIGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9oZG1pX3Jlc2V0X3Rlc3Rf c3VpdGUgPSB7Cj4gPiArCS5uYW1lCQk9ICJkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRt aV9yZXNldCIsCj4gPiArCS50ZXN0X2Nhc2VzIAk9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rv cl9oZG1pX3Jlc2V0X3Rlc3RzLAo+ID4gK307Cj4gPiArCj4gPiAra3VuaXRfdGVzdF9zdWl0ZXMo Cj4gPiArCSZkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfaGRtaV9jaGVja190ZXN0X3N1aXRl LAo+ID4gKwkmZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2hkbWlfcmVzZXRfdGVzdF9zdWl0 ZSwKPiA+ICspOwo+ID4gKwo+ID4gK01PRFVMRV9BVVRIT1IoIk1heGltZSBSaXBhcmQgPG1yaXBh cmRAa2VybmVsLm9yZz4iKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jIGIvZHJpdmVy cy9ncHUvZHJtL3Rlc3RzL2RybV9jb25uZWN0b3JfdGVzdC5jCj4gPiBpbmRleCA4ZjA3MGNhY2Fi M2IuLjQxZDMzZGVhMzBhZiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZXN0cy9k cm1fY29ubmVjdG9yX3Rlc3QuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Rlc3RzL2RybV9j b25uZWN0b3JfdGVzdC5jCj4gPiBAQCAtMTIsNiArMTIsOCBAQAo+ID4gIAo+ID4gICNpbmNsdWRl IDxrdW5pdC90ZXN0Lmg+Cj4gPiAgCj4gPiArI2luY2x1ZGUgIi4uL2RybV9jcnRjX2ludGVybmFs LmgiCj4gPiArCj4gPiAgc3RydWN0IGRybV9jb25uZWN0b3JfaW5pdF9wcml2IHsKPiA+ICAJc3Ry dWN0IGRybV9kZXZpY2UgZHJtOwo+ID4gIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7 Cj4gPiBAQCAtMzU3LDEwICszNTksMTIzIEBAIHN0YXRpYyBzdHJ1Y3Qga3VuaXRfc3VpdGUgZHJt X2dldF90dl9tb2RlX2Zyb21fbmFtZV90ZXN0X3N1aXRlID0gewo+ID4gIAkudGVzdF9jYXNlcyA9 IGRybV9nZXRfdHZfbW9kZV9mcm9tX25hbWVfdGVzdHMsCj4gPiAgfTsKPiA+ICAKPiA+ICtzdHJ1 Y3QgZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdGVzdCB7Cj4gPiAr CXVuc2lnbmVkIGludCBraW5kOwo+ID4gKwljb25zdCBjaGFyICpleHBlY3RlZF9uYW1lOwo+ID4g K307Cj4gPiArCj4gPiArI2RlZmluZSBCUk9BRENBU1RfUkdCX1RFU1QoX2tpbmQsIF9uYW1lKQlc Cj4gPiArCXsJCQkJCVwKPiA+ICsJCS5raW5kID0gX2tpbmQsCQkJXAo+ID4gKwkJLmV4cGVjdGVk X25hbWUgPSBfbmFtZSwJCVwKPiA+ICsJfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIGRybV90ZXN0 X2RybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lKHN0cnVjdCBrdW5pdCAq dGVzdCkKPiA+ICt7Cj4gPiArCWNvbnN0IHN0cnVjdCBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jy b2FkY2FzdF9yZ2JfbmFtZV90ZXN0ICpwYXJhbXMgPQo+ID4gKwkJdGVzdC0+cGFyYW1fdmFsdWU7 Cj4gPiArCj4gPiArCUtVTklUX0VYUEVDVF9TVFJFUSh0ZXN0LAo+ID4gKwkJCSAgIGRybV9oZG1p X2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lKHBhcmFtcy0+a2luZCksCj4gPiArCQkJ ICAgcGFyYW1zLT5leHBlY3RlZF9uYW1lKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0 Cj4gPiArc3RydWN0IGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJvYWRjYXN0X3JnYl9uYW1lX3Rl c3QKPiA+ICtkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZV92YWxpZF90 ZXN0c1tdID0gewo+ID4gKwlCUk9BRENBU1RfUkdCX1RFU1QoRFJNX0hETUlfQlJPQURDQVNUX1JH Ql9BVVRPLCAiQXV0b21hdGljIiksCj4gPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1fSERNSV9C Uk9BRENBU1RfUkdCX0ZVTEwsICJGdWxsIiksCj4gPiArCUJST0FEQ0FTVF9SR0JfVEVTVChEUk1f SERNSV9CUk9BRENBU1RfUkdCX0xJTUlURUQsICJMaW1pdGVkIDE2OjIzNSIpLAo+ID4gK307Cj4g PiArCj4gPiArc3RhdGljIHZvaWQKPiA+ICtkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2Fz dF9yZ2JfbmFtZV92YWxpZF9kZXNjKGNvbnN0IHN0cnVjdCBkcm1faGRtaV9jb25uZWN0b3JfZ2V0 X2Jyb2FkY2FzdF9yZ2JfbmFtZV90ZXN0ICp0LAo+ID4gKwkJCQkJCSAgICAgY2hhciAqZGVzYykK PiA+ICt7Cj4gPiArCXNwcmludGYoZGVzYywgIiVzIiwgdC0+ZXhwZWN0ZWRfbmFtZSk7Cj4gPiAr fQo+ID4gKwo+ID4gK0tVTklUX0FSUkFZX1BBUkFNKGRybV9oZG1pX2Nvbm5lY3Rvcl9nZXRfYnJv YWRjYXN0X3JnYl9uYW1lX3ZhbGlkLAo+ID4gKwkJICBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jy b2FkY2FzdF9yZ2JfbmFtZV92YWxpZF90ZXN0cywKPiA+ICsJCSAgZHJtX2hkbWlfY29ubmVjdG9y X2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWRfZGVzYyk7Cj4gPiArCj4gPiArc3RhdGljIHZv aWQgZHJtX3Rlc3RfZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfaW52 YWxpZChzdHJ1Y3Qga3VuaXQgKnRlc3QpCj4gPiArewo+ID4gKwlLVU5JVF9FWFBFQ1RfTlVMTCh0 ZXN0LCBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZSgzKSk7Cj4gPiAr fTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2hkbWlfY29ubmVjdG9y X2dldF9icm9hZGNhc3RfcmdiX25hbWVfdGVzdHNbXSA9IHsKPiA+ICsJS1VOSVRfQ0FTRV9QQVJB TShkcm1fdGVzdF9kcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZSwKPiA+ ICsJCQkgZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdmFsaWRfZ2Vu X3BhcmFtcyksCj4gPiArCUtVTklUX0NBU0UoZHJtX3Rlc3RfZHJtX2hkbWlfY29ubmVjdG9yX2dl dF9icm9hZGNhc3RfcmdiX25hbWVfaW52YWxpZCksCj4gPiArCXsgfQo+ID4gK307Cj4gPiArCj4g PiArc3RhdGljIHN0cnVjdCBrdW5pdF9zdWl0ZSBkcm1faGRtaV9jb25uZWN0b3JfZ2V0X2Jyb2Fk Y2FzdF9yZ2JfbmFtZV90ZXN0X3N1aXRlID0gewo+ID4gKwkubmFtZSA9ICJkcm1faGRtaV9jb25u ZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZSIsCj4gPiArCS50ZXN0X2Nhc2VzID0gZHJtX2hk bWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3RfcmdiX25hbWVfdGVzdHMsCj4gPiArfTsKPiA+ICsK PiA+ICtzdGF0aWMgdm9pZCBkcm1fdGVzdF9kcm1fY29ubmVjdG9yX2F0dGFjaF9icm9hZGNhc3Rf cmdiX3Byb3BlcnR5KHN0cnVjdCBrdW5pdCAqdGVzdCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yX2luaXRfcHJpdiAqcHJpdiA9IHRlc3QtPnByaXY7Cj4gPiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3IgPSAmcHJpdi0+Y29ubmVjdG9yOwo+ID4gKwlzdHJ1Y3QgZHJt X3Byb3BlcnR5ICpwcm9wOwo+ID4gKwlpbnQgcmV0Owo+ID4gKwo+ID4gKwlyZXQgPSBkcm1tX2Nv bm5lY3Rvcl9pbml0KCZwcml2LT5kcm0sIGNvbm5lY3RvciwKPiA+ICsJCQkJICAmZHVtbXlfZnVu Y3MsCj4gPiArCQkJCSAgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBLAo+ID4gKwkJCQkgICZwcml2 LT5kZGMpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJ cmV0ID0gZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eShjb25uZWN0 b3IpOwo+ID4gKwlLVU5JVF9BU1NFUlRfRVEodGVzdCwgcmV0LCAwKTsKPiA+ICsKPiA+ICsJcHJv cCA9IGNvbm5lY3Rvci0+YnJvYWRjYXN0X3JnYl9wcm9wZXJ0eTsKPiA+ICsJS1VOSVRfQVNTRVJU X05PVF9OVUxMKHRlc3QsIHByb3ApOwo+ID4gKwlLVU5JVF9FWFBFQ1RfTk9UX05VTEwodGVzdCwg ZHJtX21vZGVfb2JqX2ZpbmRfcHJvcF9pZCgmY29ubmVjdG9yLT5iYXNlLCBwcm9wLT5iYXNlLmlk KSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIGRybV90ZXN0X2RybV9jb25uZWN0b3Jf YXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHlfaGRtaV9jb25uZWN0b3Ioc3RydWN0IGt1bml0 ICp0ZXN0KQo+ID4gK3sKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3JfaW5pdF9wcml2ICpwcml2 ID0gdGVzdC0+cHJpdjsKPiA+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZw cml2LT5jb25uZWN0b3I7Cj4gPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gPiArCWlu dCByZXQ7Cj4gPiArCj4gPiArCXJldCA9IGRybW1fY29ubmVjdG9yX2hkbWlfaW5pdCgmcHJpdi0+ ZHJtLCBjb25uZWN0b3IsCj4gPiArCQkJCSAgICAgICAmZHVtbXlfZnVuY3MsCj4gPiArCQkJCSAg ICAgICBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEsCj4gPiArCQkJCSAgICAgICAmcHJpdi0+ZGRj KTsKPiA+ICsJS1VOSVRfRVhQRUNUX0VRKHRlc3QsIHJldCwgMCk7Cj4gPiArCj4gPiArCXJldCA9 IGRybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoY29ubmVjdG9yKTsK PiA+ICsJS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4gPiArCj4gPiArCXByb3AgPSBj b25uZWN0b3ItPmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7Cj4gPiArCUtVTklUX0FTU0VSVF9OT1Rf TlVMTCh0ZXN0LCBwcm9wKTsKPiA+ICsJS1VOSVRfRVhQRUNUX05PVF9OVUxMKHRlc3QsIGRybV9t b2RlX29ial9maW5kX3Byb3BfaWQoJmNvbm5lY3Rvci0+YmFzZSwgcHJvcC0+YmFzZS5pZCkpOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGt1bml0X2Nhc2UgZHJtX2Nvbm5lY3Rvcl9h dHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eV90ZXN0c1tdID0gewo+ID4gKwlLVU5JVF9DQVNF KGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkpLAo+ ID4gKwlLVU5JVF9DQVNFKGRybV90ZXN0X2RybV9jb25uZWN0b3JfYXR0YWNoX2Jyb2FkY2FzdF9y Z2JfcHJvcGVydHlfaGRtaV9jb25uZWN0b3IpLAo+ID4gKwl7IH0KPiA+ICt9Owo+ID4gKwo+ID4g K3N0YXRpYyBzdHJ1Y3Qga3VuaXRfc3VpdGUgZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRjYXN0 X3JnYl9wcm9wZXJ0eV90ZXN0X3N1aXRlID0gewo+ID4gKwkubmFtZSA9ICJkcm1fY29ubmVjdG9y X2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5IiwKPiA+ICsJLmluaXQgPSBkcm1fdGVzdF9j b25uZWN0b3JfaW5pdCwKPiA+ICsJLnRlc3RfY2FzZXMgPSBkcm1fY29ubmVjdG9yX2F0dGFjaF9i cm9hZGNhc3RfcmdiX3Byb3BlcnR5X3Rlc3RzLAo+ID4gK307Cj4gPiArCj4gPiAga3VuaXRfdGVz dF9zdWl0ZXMoCj4gPiAgCSZkcm1tX2Nvbm5lY3Rvcl9oZG1pX2luaXRfdGVzdF9zdWl0ZSwKPiA+ ICAJJmRybW1fY29ubmVjdG9yX2luaXRfdGVzdF9zdWl0ZSwKPiA+IC0JJmRybV9nZXRfdHZfbW9k ZV9mcm9tX25hbWVfdGVzdF9zdWl0ZQo+ID4gKwkmZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfYnJvYWRj YXN0X3JnYl9wcm9wZXJ0eV90ZXN0X3N1aXRlLAo+ID4gKwkmZHJtX2dldF90dl9tb2RlX2Zyb21f bmFtZV90ZXN0X3N1aXRlLAo+ID4gKwkmZHJtX2hkbWlfY29ubmVjdG9yX2dldF9icm9hZGNhc3Rf cmdiX25hbWVfdGVzdF9zdWl0ZQo+ID4gICk7Cj4gPiAgCj4gPiAgTU9EVUxFX0FVVEhPUigiTWF4 aW1lIFJpcGFyZCA8bWF4aW1lQGNlcm5vLnRlY2g+Iik7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL3Rlc3RzL2RybV9rdW5pdF9lZGlkLmggYi9kcml2ZXJzL2dwdS9kcm0vdGVzdHMv ZHJtX2t1bml0X2VkaWQuaAo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAw MDAwMDAwMC4uMmJiYTMxNmRlMDY0Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vdGVzdHMvZHJtX2t1bml0X2VkaWQuaAo+ID4gQEAgLTAsMCArMSwxMDYgQEAKPiA+ ICsjaWZuZGVmIERSTV9LVU5JVF9FRElEX0hfCj4gPiArI2RlZmluZSBEUk1fS1VOSVRfRURJRF9I Xwo+ID4gKwo+ID4gKy8qCj4gPiArICogZWRpZC1kZWNvZGUgKGhleCk6Cj4gPiArICoKPiA+ICsg KiAwMCBmZiBmZiBmZiBmZiBmZiBmZiAwMCAzMSBkOCAyYSAwMCAwMCAwMCAwMCAwMAo+ID4gKyAq IDAwIDIxIDAxIDAzIDgxIGEwIDVhIDc4IDAyIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4gPiArICog MDAgMDAgMDAgMjAgMDAgMDAgMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEKPiA+ICsgKiAw MSAwMSAwMSAwMSAwMSAwMSAwMiAzYSA4MCAxOCA3MSAzOCAyZCA0MCA1OCAyYwo+ID4gKyAqIDQ1 IDAwIDQwIDg0IDYzIDAwIDAwIDFlIDAwIDAwIDAwIGZjIDAwIDU0IDY1IDczCj4gPiArICogNzQg MjAgNDUgNDQgNDkgNDQgMGEgMjAgMjAgMjAgMDAgMDAgMDAgZmQgMDAgMzIKPiA+ICsgKiA0NiAx ZSA0NiAwZiAwMCAwYSAyMCAyMCAyMCAyMCAyMCAyMCAwMCAwMCAwMCAxMAo+ID4gKyAqIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAxIDkyCj4gPiArICoKPiA+ICsg KiAwMiAwMyAxYiA4MSBlMyAwNSAwMCAyMCA0MSAxMCBlMiAwMCA0YSA2ZCAwMyAwYwo+ID4gKyAq IDAwIDEyIDM0IDAwIDI4IDIwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4gPiArICog MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKPiA+ICsgKiAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ID4gKyAqIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4gPiArICogMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKPiA+ICsgKiAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ID4gKyAqIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGQwCj4gPiArICoKPiA+ICsg KiAtLS0tLS0tLS0tLS0tLS0tCj4gPiArICoKPiA+ICsgKiBCbG9jayAwLCBCYXNlIEVESUQ6Cj4g PiArICogICBFRElEIFN0cnVjdHVyZSBWZXJzaW9uICYgUmV2aXNpb246IDEuMwo+ID4gKyAqICAg VmVuZG9yICYgUHJvZHVjdCBJZGVudGlmaWNhdGlvbjoKPiA+ICsgKiAgICAgTWFudWZhY3R1cmVy OiBMTlgKPiA+ICsgKiAgICAgTW9kZWw6IDQyCj4gPiArICogICAgIE1hZGUgaW46IDIwMjMKPiA+ ICsgKiAgIEJhc2ljIERpc3BsYXkgUGFyYW1ldGVycyAmIEZlYXR1cmVzOgo+ID4gKyAqICAgICBE aWdpdGFsIGRpc3BsYXkKPiA+ICsgKiAgICAgREZQIDEueCBjb21wYXRpYmxlIFRNRFMKPiA+ICsg KiAgICAgTWF4aW11bSBpbWFnZSBzaXplOiAxNjAgY20geCA5MCBjbQo+ID4gKyAqICAgICBHYW1t YTogMi4yMAo+ID4gKyAqICAgICBNb25vY2hyb21lIG9yIGdyYXlzY2FsZSBkaXNwbGF5Cj4gPiAr ICogICAgIEZpcnN0IGRldGFpbGVkIHRpbWluZyBpcyB0aGUgcHJlZmVycmVkIHRpbWluZwo+ID4g KyAqICAgQ29sb3IgQ2hhcmFjdGVyaXN0aWNzOgo+ID4gKyAqICAgICBSZWQgIDogMC4wMDAwLCAw LjAwMDAKPiA+ICsgKiAgICAgR3JlZW46IDAuMDAwMCwgMC4wMDAwCj4gPiArICogICAgIEJsdWUg OiAwLjAwMDAsIDAuMDAwMAo+ID4gKyAqICAgICBXaGl0ZTogMC4wMDAwLCAwLjAwMDAKPiA+ICsg KiAgIEVzdGFibGlzaGVkIFRpbWluZ3MgSSAmIElJOgo+ID4gKyAqICAgICBETVQgMHgwNDogICA2 NDB4NDgwICAgIDU5Ljk0MDQ3NiBIeiAgIDQ6MyAgICAgMzEuNDY5IGtIeiAgICAgMjUuMTc1MDAw IE1Iego+ID4gKyAqICAgU3RhbmRhcmQgVGltaW5nczogbm9uZQo+ID4gKyAqICAgRGV0YWlsZWQg VGltaW5nIERlc2NyaXB0b3JzOgo+ID4gKyAqICAgICBEVEQgMTogIDE5MjB4MTA4MCAgIDYwLjAw MDAwMCBIeiAgMTY6OSAgICAgNjcuNTAwIGtIeiAgICAxNDguNTAwMDAwIE1IeiAoMTYwMCBtbSB4 IDkwMCBtbSkKPiA+ICsgKiAgICAgICAgICAgICAgICAgIEhmcm9udCAgIDg4IEhzeW5jICA0NCBI YmFjayAgMTQ4IEhwb2wgUAo+ID4gKyAqICAgICAgICAgICAgICAgICAgVmZyb250ICAgIDQgVnN5 bmMgICA1IFZiYWNrICAgMzYgVnBvbCBQCj4gPiArICogICAgIERpc3BsYXkgUHJvZHVjdCBOYW1l OiAnVGVzdCBFRElEJwo+ID4gKyAqICAgICBEaXNwbGF5IFJhbmdlIExpbWl0czoKPiA+ICsgKiAg ICAgICBNb25pdG9yIHJhbmdlcyAoR1RGKTogNTAtNzAgSHogViwgMzAtNzAga0h6IEgsIG1heCBk b3RjbG9jayAxNTAgTUh6Cj4gPiArICogICAgIER1bW15IERlc2NyaXB0b3I6Cj4gPiArICogICBF eHRlbnNpb24gYmxvY2tzOiAxCj4gPiArICogQ2hlY2tzdW06IDB4OTIKPiA+ICsgKgo+ID4gKyAq IC0tLS0tLS0tLS0tLS0tLS0KPiA+ICsgKgo+ID4gKyAqIEJsb2NrIDEsIENUQS04NjEgRXh0ZW5z aW9uIEJsb2NrOgo+ID4gKyAqICAgUmV2aXNpb246IDMKPiA+ICsgKiAgIFVuZGVyc2NhbnMgSVQg VmlkZW8gRm9ybWF0cyBieSBkZWZhdWx0Cj4gPiArICogICBOYXRpdmUgZGV0YWlsZWQgbW9kZXM6 IDEKPiA+ICsgKiAgIENvbG9yaW1ldHJ5IERhdGEgQmxvY2s6Cj4gPiArICogICAgIHNSR0IKPiA+ ICsgKiAgIFZpZGVvIERhdGEgQmxvY2s6Cj4gPiArICogICAgIFZJQyAgMTY6ICAxOTIweDEwODAg ICA2MC4wMDAwMDAgSHogIDE2OjkgICAgIDY3LjUwMCBrSHogICAgMTQ4LjUwMDAwMCBNSHoKPiA+ ICsgKiAgIFZpZGVvIENhcGFiaWxpdHkgRGF0YSBCbG9jazoKPiA+ICsgKiAgICAgWUNiQ3IgcXVh bnRpemF0aW9uOiBObyBEYXRhCj4gPiArICogICAgIFJHQiBxdWFudGl6YXRpb246IFNlbGVjdGFi bGUgKHZpYSBBVkkgUSkKPiA+ICsgKiAgICAgUFQgc2NhbiBiZWhhdmlvcjogTm8gRGF0YQo+ID4g KyAqICAgICBJVCBzY2FuIGJlaGF2aW9yOiBBbHdheXMgVW5kZXJzY2FubmVkCj4gPiArICogICAg IENFIHNjYW4gYmVoYXZpb3I6IEFsd2F5cyBVbmRlcnNjYW5uZWQKPiA+ICsgKiAgIFZlbmRvci1T cGVjaWZpYyBEYXRhIEJsb2NrIChIRE1JKSwgT1VJIDAwLTBDLTAzOgo+ID4gKyAqICAgICBTb3Vy Y2UgcGh5c2ljYWwgYWRkcmVzczogMS4yLjMuNAo+ID4gKyAqICAgICBNYXhpbXVtIFRNRFMgY2xv Y2s6IDIwMCBNSHoKPiA+ICsgKiAgICAgRXh0ZW5kZWQgSERNSSB2aWRlbyBkZXRhaWxzOgo+ID4g KyAqIENoZWNrc3VtOiAweGQwICBVbnVzZWQgc3BhY2UgaW4gRXh0ZW5zaW9uIEJsb2NrOiAxMDAg Ynl0ZXMKPiA+ICsgKi8KPiA+ICtjb25zdCB1bnNpZ25lZCBjaGFyIHRlc3RfZWRpZF9oZG1pXzEw ODBwX3JnYl9tYXhfMjAwbWh6W10gPSB7Cj4gPiArICAweDAwLCAweGZmLCAweGZmLCAweGZmLCAw eGZmLCAweGZmLCAweGZmLCAweDAwLCAweDMxLCAweGQ4LCAweDJhLCAweDAwLAo+ID4gKyAgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHgwMywgMHg4MSwgMHhhMCwg MHg1YSwgMHg3OCwKPiA+ICsgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsCj4gPiArICAweDAwLCAweDAwLCAweDAx LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAo+ ID4gKyAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYSwgMHg4 MCwgMHgxOCwgMHg3MSwgMHgzOCwKPiA+ICsgIDB4MmQsIDB4NDAsIDB4NTgsIDB4MmMsIDB4NDUs IDB4MDAsIDB4NDAsIDB4ODQsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MWUsCj4gPiArICAweDAwLCAw eDAwLCAweDAwLCAweGZjLCAweDAwLCAweDU0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDQ1 LCAweDQ0LAo+ID4gKyAgMHg0OSwgMHg0NCwgMHgwYSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwg MHgwMCwgMHgwMCwgMHhmZCwgMHgwMCwgMHgzMiwKPiA+ICsgIDB4NDYsIDB4MDAsIDB4MDAsIDB4 YzQsIDB4MDAsIDB4MGEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCj4gPiAr ICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMSwgMHg0MSwgMHgwMiwgMHgwMywgMHgxYiwgMHg4MSwKPiA+ICsgIDB4ZTMsIDB4MDUs IDB4MDAsIDB4MjAsIDB4NDEsIDB4MTAsIDB4ZTIsIDB4MDAsIDB4NGEsIDB4NmQsIDB4MDMsIDB4 MGMsCj4gPiArICAweDAwLCAweDEyLCAweDM0LCAweDAwLCAweDI4LCAweDIwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKPiA+ICsgIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsCj4gPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwK PiA+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4 MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gPiArICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAo+ID4gKyAgMHgwMCwg MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgw MCwgMHgwMCwKPiA+ICsgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4gPiArICAweDAwLCAweDAwLCAweDAwLCAw eGQwCj4gPiArfTsKPiA+ICsKPiA+ICsjZW5kaWYgLy8gRFJNX0tVTklUX0VESURfSF8KPiA+IGRp ZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmggYi9pbmNsdWRlL2RybS9kcm1f Y29ubmVjdG9yLmgKPiA+IGluZGV4IDAwMGEyYTE1NjYxOS4uMzg2N2E0YzAxYjc4IDEwMDY0NAo+ ID4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oCj4gPiArKysgYi9pbmNsdWRlL2Ry bS9kcm1fY29ubmVjdG9yLmgKPiA+IEBAIC0zNjgsNiArMzY4LDMwIEBAIGVudW0gZHJtX3BhbmVs X29yaWVudGF0aW9uIHsKPiA+ICAJRFJNX01PREVfUEFORUxfT1JJRU5UQVRJT05fUklHSFRfVVAs Cj4gPiAgfTsKPiA+ICAKPiA+ICsvKioKPiA+ICsgKiBlbnVtIGRybV9oZG1pX2Jyb2FkY2FzdF9y Z2IgLSBCcm9hZGNhc3QgUkdCIFNlbGVjdGlvbiBmb3IgYW4gSERNSSBAZHJtX2Nvbm5lY3Rvcgo+ ID4gKyAqLwo+ID4gK2VudW0gZHJtX2hkbWlfYnJvYWRjYXN0X3JnYiB7Cj4gPiArCS8qKgo+ID4g KwkgKiBARFJNX0hETUlfQlJPQURDQVNUX1JHQl9BVVRPOiBUaGUgUkdCIHJhbmdlIGlzIHNlbGVj dGVkCj4gPiArCSAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIG1vZGUuCj4gPiArCSAqLwo+ ID4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdCX0FVVE8sCj4gPiArCj4gPiArCS8qKgo+ID4gKwkg KiBARFJNX0hETUlfQlJPQURDQVNUX1JHQl9GVUxMOiBGdWxsIHJhbmdlIFJHQiBpcyBmb3JjZWQu Cj4gPiArCSAqLwo+ID4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdCX0ZVTEwsCj4gPiArCj4gPiAr CS8qKgo+ID4gKwkgKiBARFJNX0hETUlfQlJPQURDQVNUX1JHQl9MSU1JVEVEOiBMaW1pdGVkIHJh bmdlIFJHQiBpcyBmb3JjZWQuCj4gPiArCSAqLwo+ID4gKwlEUk1fSERNSV9CUk9BRENBU1RfUkdC X0xJTUlURUQsCj4gPiArfTsKPiA+ICsKPiA+ICtjb25zdCBjaGFyICoKPiA+ICtkcm1faGRtaV9j b25uZWN0b3JfZ2V0X2Jyb2FkY2FzdF9yZ2JfbmFtZShlbnVtIGRybV9oZG1pX2Jyb2FkY2FzdF9y Z2IgYnJvYWRjYXN0X3JnYik7Cj4gPiArCj4gPiAgLyoqCj4gPiAgICogc3RydWN0IGRybV9tb25p dG9yX3JhbmdlX2luZm8gLSBQYW5lbCdzIE1vbml0b3IgcmFuZ2UgaW4gRURJRCBmb3IKPiA+ICAg KiAmZHJtX2Rpc3BsYXlfaW5mbwo+ID4gQEAgLTEwMzcsNiArMTA2MSwxMSBAQCBzdHJ1Y3QgZHJt X2Nvbm5lY3Rvcl9zdGF0ZSB7Cj4gPiAgCSAqIEBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3Jf aGRtaV9jaGVjaygpLgo+ID4gIAkgKi8KPiA+ICAJc3RydWN0IHsKPiA+ICsJCS8qKgo+ID4gKwkJ ICogQGJyb2FkY2FzdF9yZ2I6IENvbm5lY3RvciBwcm9wZXJ0eSB0byBwYXNzIHRoZQo+ID4gKwkJ ICogQnJvYWRjYXN0IFJHQiBzZWxlY3Rpb24gdmFsdWUuCj4gPiArCQkgKi8KPiA+ICsJCWVudW0g ZHJtX2hkbWlfYnJvYWRjYXN0X3JnYiBicm9hZGNhc3RfcmdiOwo+ID4gIAl9IGhkbWk7Cj4gPiAg fTsKPiA+ICAKPiA+IEBAIC0xNzA2LDYgKzE3MzUsMTIgQEAgc3RydWN0IGRybV9jb25uZWN0b3Ig ewo+ID4gIAkgKi8KPiA+ICAJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJpdmFjeV9zY3JlZW5faHdf c3RhdGVfcHJvcGVydHk7Cj4gPiAgCj4gPiArCS8qKgo+ID4gKwkgKiBAYnJvYWRjYXN0X3JnYl9w cm9wZXJ0eTogQ29ubmVjdG9yIHByb3BlcnR5IHRvIHNldCB0aGUKPiA+ICsJICogQnJvYWRjYXN0 IFJHQiBzZWxlY3Rpb24gdG8gb3V0cHV0IHdpdGguCj4gPiArCSAqLwo+ID4gKwlzdHJ1Y3QgZHJt X3Byb3BlcnR5ICpicm9hZGNhc3RfcmdiX3Byb3BlcnR5Owo+ID4gKwo+ID4gICNkZWZpbmUgRFJN X0NPTk5FQ1RPUl9QT0xMX0hQRCAoMSA8PCAwKQo+ID4gICNkZWZpbmUgRFJNX0NPTk5FQ1RPUl9Q T0xMX0NPTk5FQ1QgKDEgPDwgMSkKPiA+ICAjZGVmaW5lIERSTV9DT05ORUNUT1JfUE9MTF9ESVND T05ORUNUICgxIDw8IDIpCj4gPiBAQCAtMjAyNiw2ICsyMDYxLDcgQEAgaW50IGRybV9jb25uZWN0 b3JfYXR0YWNoX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yLAo+ID4gIAkJCQkJICAgICAgIHUzMiBzY2FsaW5nX21vZGVfbWFzayk7Cj4gPiAgaW50 IGRybV9jb25uZWN0b3JfYXR0YWNoX3Zycl9jYXBhYmxlX3Byb3BlcnR5KAo+ID4gIAkJc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gPiAraW50IGRybV9jb25uZWN0b3JfYXR0YWNo X2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7 Cj4gPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX2NvbG9yc3BhY2VfcHJvcGVydHkoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gPiAgaW50IGRybV9jb25uZWN0b3JfYXR0YWNo X2hkcl9vdXRwdXRfbWV0YWRhdGFfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3Rvcik7Cj4gPiAgYm9vbCBkcm1fY29ubmVjdG9yX2F0b21pY19oZHJfbWV0YWRhdGFfZXF1YWwo c3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9zdGF0ZSwKPiA+IAo+ID4gLS0gCj4gPiAy LjQzLjAKPiA+IAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK 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 AFE36C3DA79 for ; Mon, 15 Jan 2024 14:37:28 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2229510E2D6; Mon, 15 Jan 2024 14:37:28 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id DCB1110E2B5 for ; Mon, 15 Jan 2024 14:37:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705329446; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=XwGmrLGjtMdtm6iCBx3gWn5/VFWLejBa6sRLy0HoiharliiDNApE9Rv5sCsE9ZYLo2O2k9 z+4gM3o0bLAzcIPd6NAOp9d37+XemQBr1x1Q2Dv6MBKCIAFwL4nQqBEvMn06Ntu/OAgtRv OsxKG0cr559Ss/EkreXdRk1BWPPWJrg= 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-341-1SYgMTFjOFGjRo6ceIbC-A-1; Mon, 15 Jan 2024 09:37:24 -0500 X-MC-Unique: 1SYgMTFjOFGjRo6ceIbC-A-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40e479a51e4so36580905e9.0 for ; Mon, 15 Jan 2024 06:37:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705329443; x=1705934243; 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=0P/Ry/bifyODG3jc/xwN6z3VN2lZfa5MZ71QVlNDmM8=; b=Gx5hKzqyiUgBLlkJt2LovQZSIkgbfKWzOhVJdV/HXfbCVaw8pQbjIQAtk7Cd85u/Dm 7rHJyKBuvGYQ1f5+4NBYhV95y3KvVCj8nf6A3KROoev5uzxIXCJqzpSKGM0G+cNr5afD MyjNANSetpxhDEuMTB49TcfjjHxIXRFWaIz3zhIRi5xdv+5GCybNNYucFXgvdqd6KTi2 zf1AnkjXXYZHw3kqWLQRKKTiHclb3DRWVt53Yk+ANeT58jJo62xZ51KdM/1Pg1WOsbYp GtotbkHrWESofzrTiEjn+tCoBtPewjYigotrrGSvqzMbUYdS8dtDnijNqKdq5g0weIeP ZM9A== X-Gm-Message-State: AOJu0Yx43z4AZoESXH5NUwOCLsZfcfFiiNVUcY6BJhzqChdT7DMGGkiG qrJnTWo9ni3hmyUaYzDAdpYeq6HUGJQ7ujqHkFU8pKoo3geTYY1ExLwgPF2RuAI/zEyK588EtqB Dph4nQeD/EA4OqJ9comm5XAgskcWT2h6FI0Pn X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847851wmn.165.1705329443290; Mon, 15 Jan 2024 06:37:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IFUzdT5xU1sVf6BlLsAbm0wMLME7RDvKcEkYs4WH7QaXA5cIHhvh7BgfvcwqcTW3CkeFNoBnA== X-Received: by 2002:a05:600c:4446:b0:40e:7852:9947 with SMTP id v6-20020a05600c444600b0040e78529947mr847837wmn.165.1705329442768; Mon, 15 Jan 2024 06:37:22 -0800 (PST) Received: from toolbox ([2001:9e8:8996:a800:5fa3:a411:5e47:8fe5]) by smtp.gmail.com with ESMTPSA id f18-20020a05600c155200b0040d87100733sm16221215wmg.39.2024.01.15.06.37.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 06:37:22 -0800 (PST) Date: Mon, 15 Jan 2024 15:37:20 +0100 From: Sebastian Wick To: Maxime Ripard Subject: Re: [PATCH v5 08/44] drm/connector: hdmi: Add Broadcast RGB property Message-ID: <20240115143720.GA160656@toolbox> References: <20231207-kms-hdmi-connector-state-v5-0-6538e19d634d@kernel.org> <20231207-kms-hdmi-connector-state-v5-8-6538e19d634d@kernel.org> <20240115143308.GA159345@toolbox> MIME-Version: 1.0 In-Reply-To: <20240115143308.GA159345@toolbox> 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 Mon, Jan 15, 2024 at 03:33:08PM +0100, Sebastian Wick wrote: > 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? Forgot to mention: user-space still has no control over RGB vs YCbCr on the cable, so is this only affecting RGB? If not, how does it affect YCbCr? > > > * 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 > >