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 X-Spam-Level: X-Spam-Status: No, score=-13.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1EFDC47257 for ; Mon, 4 May 2020 15:54:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7C8072073B for ; Mon, 4 May 2020 15:54:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=tronnes.org header.i=@tronnes.org header.b="VaaxgGCY" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728967AbgEDPya (ORCPT ); Mon, 4 May 2020 11:54:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725941AbgEDPy3 (ORCPT ); Mon, 4 May 2020 11:54:29 -0400 Received: from smtp.domeneshop.no (smtp.domeneshop.no [IPv6:2a01:5b40:0:3005::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C007C061A0E for ; Mon, 4 May 2020 08:54:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tronnes.org ; s=ds201912; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: MIME-Version:Date:Message-ID:From:References:Cc:To:Subject:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=MKKVfCAscMMMoNdfpcY+wj0/D53ARrYKEKzF43Ea2+o=; b=VaaxgGCYcGwR0uFl3wh3Y//hX9 ZAPlNMVVREoE6C4n4cEagiL/m0Dt9DCWRyRVNwmYG36D7crjRC/Ok6lJ0m+7ChVOTxxy8bAM4qQvO rgbU1AkFxlHWFDW9C/clKQRl3OQkzmurLiWAen3oDBPG7tTDLyMs2GwwErsWWpOchkWrFK+uceoNS 95fBfiQSql+H6OPUJVseed7jZDvLEXVboWmTq5NGIm+JhzmpnAUwEHCyyVEGq+blo/ZpeAKsELZw7 1SfTW0+p4bj4zHKqbwNB1NNHqxhGFdOqfDm723avcFqOvPDAIR8NOPlerAJifuVBBGZ9sQn5QFjNQ RVTsLWSw==; Received: from 211.81-166-168.customer.lyse.net ([81.166.168.211]:59704 helo=[192.168.10.61]) by smtp.domeneshop.no with esmtpsa (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1jVdQG-0007HJ-IP; Mon, 04 May 2020 17:54:24 +0200 Subject: Re: [PATCH 02/10] drm: Add backlight helper To: Daniel Vetter Cc: dri-devel@lists.freedesktop.org, linux-usb@vger.kernel.org, Hans de Goede , Daniel Thompson References: <20200429124830.27475-1-noralf@tronnes.org> <20200429124830.27475-3-noralf@tronnes.org> <20200504120628.GK10381@phenom.ffwll.local> From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Message-ID: Date: Mon, 4 May 2020 17:54:23 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20200504120628.GK10381@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Den 04.05.2020 14.06, skrev Daniel Vetter: > On Wed, Apr 29, 2020 at 02:48:22PM +0200, Noralf Trønnes wrote: >> This adds a function that creates a backlight device for a connector. >> It does not deal with the KMS backlight ABI proposition[1] to add a >> connector property. It only takes the current best practise to standardise >> the creation of a backlight device for DRM drivers while we wait for the >> property. >> >> The brightness value is set using a connector state variable and an atomic >> commit. >> >> I have looked through some of the backlight users and this is what I've found: >> >> GNOME [2] >> --------- >> >> Brightness range: 0-100 >> Scale: Assumes perceptual >> >> Avoids setting the sysfs brightness value to zero if max_brightness >= 99. >> Can connect connector and backlight using the sysfs device. >> >> KDE [3] >> ------- >> >> Brightness range: 0-100 >> Scale: Assumes perceptual >> >> Weston [4] >> ---------- >> >> Brightness range: 0-255 >> Scale: Assumes perceptual >> >> Chromium OS [5] >> --------------- >> >> Brightness range: 0-100 >> Scale: Depends on the sysfs file 'scale' which is a recent addition (2019) >> >> xserver [6] >> ----------- >> >> Brightness range: 0-x (driver specific) (1 is minimum, 0 is OFF) >> Scale: Assumes perceptual >> >> The builtin modesetting driver[7] does not support Backlight, Intel[8] does. >> >> [1] https://lore.kernel.org/dri-devel/4b17ba08-39f3-57dd-5aad-d37d844b02c6@linux.intel.com/ >> [2] https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/blob/master/plugins/power/gsd-backlight.c >> [3] https://github.com/KDE/powerdevil/blob/master/daemon/backends/upower/backlighthelper.cpp >> [4] https://gitlab.freedesktop.org/wayland/weston/-/blob/master/libweston/backend-drm/drm.c >> [5] https://chromium.googlesource.com/chromiumos/platform2/+/refs/heads/master/power_manager/powerd/system/internal_backlight.cc >> [6] https://github.com/freedesktop/xorg-randrproto/blob/master/randrproto.txt >> [7] https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/hw/xfree86/drivers/modesetting/drmmode_display.c >> [8] https://gitlab.freedesktop.org/xorg/driver/xf86-video-intel/-/blob/master/src/backlight.c >> >> Cc: Hans de Goede >> Cc: Jani Nikula >> Cc: Martin Peres >> Cc: Daniel Thompson >> Signed-off-by: Noralf Trønnes >> --- >> Documentation/gpu/drm-kms-helpers.rst | 6 + >> drivers/gpu/drm/Kconfig | 7 ++ >> drivers/gpu/drm/Makefile | 1 + >> drivers/gpu/drm/drm_backlight_helper.c | 154 +++++++++++++++++++++++++ >> include/drm/drm_backlight_helper.h | 9 ++ >> include/drm/drm_connector.h | 10 ++ >> 6 files changed, 187 insertions(+) >> create mode 100644 drivers/gpu/drm/drm_backlight_helper.c >> create mode 100644 include/drm/drm_backlight_helper.h >> >> diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst >> index 9668a7fe2408..29a2f4b49fd2 100644 >> --- a/Documentation/gpu/drm-kms-helpers.rst >> +++ b/Documentation/gpu/drm-kms-helpers.rst >> @@ -411,3 +411,9 @@ SHMEM GEM Helper Reference >> >> .. kernel-doc:: drivers/gpu/drm/drm_gem_shmem_helper.c >> :export: >> + >> +Backlight Helper Reference >> +========================== >> + >> +.. kernel-doc:: drivers/gpu/drm/drm_backlight_helper.c >> + :export: >> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig >> index d0aa6cff2e02..f6e13e18c9ca 100644 >> --- a/drivers/gpu/drm/Kconfig >> +++ b/drivers/gpu/drm/Kconfig >> @@ -224,6 +224,13 @@ config DRM_GEM_SHMEM_HELPER >> help >> Choose this if you need the GEM shmem helper functions >> >> +config DRM_BACKLIGHT_HELPER >> + bool >> + depends on DRM >> + select BACKLIGHT_CLASS_DEVICE >> + help >> + Choose this if you need the backlight device helper functions >> + >> config DRM_VM >> bool >> depends on DRM && MMU >> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile >> index 6493088a0fdd..0d17662dde0a 100644 >> --- a/drivers/gpu/drm/Makefile >> +++ b/drivers/gpu/drm/Makefile >> @@ -52,6 +52,7 @@ drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o >> drm_kms_helper-$(CONFIG_DRM_KMS_CMA_HELPER) += drm_fb_cma_helper.o >> drm_kms_helper-$(CONFIG_DRM_DP_AUX_CHARDEV) += drm_dp_aux_dev.o >> drm_kms_helper-$(CONFIG_DRM_DP_CEC) += drm_dp_cec.o >> +drm_kms_helper-$(CONFIG_DRM_BACKLIGHT_HELPER) += drm_backlight_helper.o >> >> obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o >> obj-$(CONFIG_DRM_DEBUG_SELFTEST) += selftests/ >> diff --git a/drivers/gpu/drm/drm_backlight_helper.c b/drivers/gpu/drm/drm_backlight_helper.c >> new file mode 100644 >> index 000000000000..06e6a75d1d0a >> --- /dev/null >> +++ b/drivers/gpu/drm/drm_backlight_helper.c >> @@ -0,0 +1,154 @@ >> +// SPDX-License-Identifier: GPL-2.0 OR MIT >> +/* >> + * Copyright 2020 Noralf Trønnes >> + */ >> + >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> + >> +static int drm_backlight_update_status(struct backlight_device *bd) >> +{ >> + struct drm_connector *connector = bl_get_data(bd); >> + struct drm_connector_state *connector_state; >> + struct drm_device *dev = connector->dev; >> + struct drm_modeset_acquire_ctx ctx; >> + struct drm_atomic_state *state; >> + int ret; >> + >> + state = drm_atomic_state_alloc(dev); >> + if (!state) >> + return -ENOMEM; >> + >> + drm_modeset_acquire_init(&ctx, 0); >> + state->acquire_ctx = &ctx; >> +retry: >> + connector_state = drm_atomic_get_connector_state(state, connector); >> + if (IS_ERR(connector_state)) { >> + ret = PTR_ERR(connector_state); >> + goto out; >> + } >> + >> + connector_state->backlight_brightness = bd->props.brightness; >> + >> + ret = drm_atomic_commit(state); >> +out: >> + if (ret == -EDEADLK) { >> + drm_atomic_state_clear(state); >> + drm_modeset_backoff(&ctx); >> + goto retry; >> + } >> + >> + drm_atomic_state_put(state); >> + >> + drm_modeset_drop_locks(&ctx); >> + drm_modeset_acquire_fini(&ctx); >> + >> + return ret; >> +} > > Looking at this, I'm not sure this is generally useable outside of your > usb driver. Or stuff that does essentially the same. > > For real hw drivers I expect a similar relationship between the kms driver > and the backlight driver like for i2c, clocks, power domaines, ... i.e. > the kms driver calls into the backlight driver. This also means that kms > locks will be nesting outside of the locks of these subordinate > subsystems, and hence direct access through other userspace interfaces > (like we have for i2c too) needs to bypass atomic kms. Otherwise we have > deadlock potential. > > > With your stuff here we can potentially get a backlight locks -> kms locks > -> backlight locks scenario, and lockdep will be angry about this. So in > general this doesn't work (I think, locking is hard), and in this specific > case it only works because your usb driver shovels everything over to > another machine. Lockdep will still complain if you load this together > with some other kms driver that uses backlight normally. > > Aside: Locking is broken in the backlight code, we take the > bd->update_lock too late, after bd->props has already been handled > unsafely. But I guess that's a side effect of the sysfs interface being > racy by default. Or the backlight_enable/disable helpers should take > bd->ops_lock too. > > So two things: > - I think the actual update needs to be pushed to a work_struct, with no > flush_work, to avoid these locking loops completely. > - I think this is best left in your usb driver for now, until someone > comes up with maybe an spi forwarder or whatever where we might need > this again. > > Or, and this is probably much simpler, just have a simpler backlight > driver that's completely orthogonal to the kms side, with some hw lock to > organize updates. For that case just adding a drm_connector->backlight > pointer, as prep for Hans' work, would be great. I don't quite follow you here. This backlight device is for kms drivers that control the backlight brightness by themselves, by setting a pwm value or something on their hardware. The kms driver will not act as a proxy and forward the value to another backlight driver. Nor will another driver use this backlight device. It's purely for userspace. So I don't understand how a locking loop can happen. What this code does for me is pushing brightness changes through the atomic machinery so I can treat it like any other property change. So the reason I made it a core helper is that I figured I wasn't the only one who would want this. I'll move it inside my driver unless someone chimes in and say they want it to. Noralf. > -Daniel > > >> + >> +static int drm_backlight_get_brightness(struct backlight_device *bd) >> +{ >> + struct drm_connector *connector = bl_get_data(bd); >> + struct drm_device *dev = connector->dev; >> + int brightness; >> + >> + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); >> + brightness = connector->state->backlight_brightness; >> + drm_modeset_unlock(&dev->mode_config.connection_mutex); >> + >> + return brightness; >> +} >> + >> +static const struct backlight_ops drm_backlight_ops = { >> + .get_brightness = drm_backlight_get_brightness, >> + .update_status = drm_backlight_update_status, >> +}; >> + >> +/* Can be exported for drivers carrying a legacy name */ >> +static int drm_backlight_register_with_name(struct drm_connector *connector, const char *name) >> +{ >> + struct backlight_device *bd; >> + const struct backlight_properties props = { >> + .type = BACKLIGHT_RAW, >> + .scale = BACKLIGHT_SCALE_NON_LINEAR, >> + .max_brightness = 100, >> + }; >> + >> + if (WARN_ON(!drm_core_check_feature(connector->dev, DRIVER_MODESET) || >> + !drm_drv_uses_atomic_modeset(connector->dev) || >> + !connector->kdev)) >> + return -EINVAL; >> + >> + bd = backlight_device_register(name, connector->kdev, connector, >> + &drm_backlight_ops, &props); >> + if (IS_ERR(bd)) >> + return PTR_ERR(bd); >> + >> + connector->backlight = bd; >> + >> + return 0; >> +} >> + >> +/** >> + * drm_backlight_register() - Register a backlight device for a connector >> + * @connector: Connector >> + * >> + * This function registers a backlight device for @connector with the following >> + * characteristics: >> + * >> + * - The connector sysfs device is used as a parent device for the backlight device. >> + * Userspace can use this to connect backlight device and connector. >> + * - Name will be on the form: **card0-HDMI-A-1-backlight** >> + * - Type is "raw" >> + * - Scale is "non-linear" (perceptual) >> + * - Max brightness is 100 giving a range of 0-100 inclusive >> + * - Reading sysfs **brightness** returns the backlight device property >> + * - Reading sysfs **actual_brightness** returns the connector state value >> + * - Writing sysfs **bl_power** is ignored, the DPMS connector property should >> + * be used to control power. >> + * - Backlight device suspend/resume events are ignored. >> + * >> + * Note: >> + * >> + * Brightness zero should not turn off backlight it should be the minimum >> + * brightness, DPMS handles power. >> + * >> + * This function must be called from &drm_connector_funcs->late_register() since >> + * it depends on the sysfs device. >> + * >> + * Returns: >> + * Zero on success or negative error code on failure. >> + */ >> +int drm_backlight_register(struct drm_connector *connector) >> +{ >> + const char *name = NULL; >> + int ret; >> + >> + name = kasprintf(GFP_KERNEL, "card%d-%s-backlight", >> + connector->dev->primary->index, connector->name); >> + if (!name) >> + return -ENOMEM; >> + >> + ret = drm_backlight_register_with_name(connector, name); >> + kfree(name); >> + >> + return ret; >> +} >> +EXPORT_SYMBOL(drm_backlight_register); >> + >> +/** >> + * drm_backlight_unregister() - Unregister backlight device >> + * @connector: Connector >> + * >> + * Unregister a backlight device. This must be called from the >> + * &drm_connector_funcs->early_unregister() callback. >> + */ >> +void drm_backlight_unregister(struct drm_connector *connector) >> +{ >> + backlight_device_unregister(connector->backlight); >> +} >> +EXPORT_SYMBOL(drm_backlight_unregister); >> diff --git a/include/drm/drm_backlight_helper.h b/include/drm/drm_backlight_helper.h >> new file mode 100644 >> index 000000000000..4151b66eb0b4 >> --- /dev/null >> +++ b/include/drm/drm_backlight_helper.h >> @@ -0,0 +1,9 @@ >> +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ >> + >> +#ifndef _LINUX_DRM_BACKLIGHT_HELPER_H >> +#define _LINUX_DRM_BACKLIGHT_HELPER_H >> + >> +int drm_backlight_register(struct drm_connector *connector); >> +void drm_backlight_unregister(struct drm_connector *connector); >> + >> +#endif >> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h >> index 221910948b37..ce678b694f45 100644 >> --- a/include/drm/drm_connector.h >> +++ b/include/drm/drm_connector.h >> @@ -32,6 +32,7 @@ >> >> #include >> >> +struct backlight_device; >> struct drm_connector_helper_funcs; >> struct drm_modeset_acquire_ctx; >> struct drm_device; >> @@ -656,6 +657,12 @@ struct drm_connector_state { >> */ >> u8 max_bpc; >> >> + /** >> + * @backlight_brightness: Brightness value of the connector backlight >> + * device. See drm_backlight_register(). >> + */ >> + u8 backlight_brightness; >> + >> /** >> * @hdr_output_metadata: >> * DRM blob property for HDR output metadata >> @@ -1422,6 +1429,9 @@ struct drm_connector { >> >> /** @hdr_sink_metadata: HDR Metadata Information read from sink */ >> struct hdr_sink_metadata hdr_sink_metadata; >> + >> + /** @backlight: Backlight device. See drm_backlight_register() */ >> + struct backlight_device *backlight; >> }; >> >> #define obj_to_connector(x) container_of(x, struct drm_connector, base) >> -- >> 2.23.0 >> >> _______________________________________________ >> dri-devel mailing list >> dri-devel@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/dri-devel > 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 X-Spam-Level: X-Spam-Status: No, score=-13.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BD4B1C3A5A9 for ; Mon, 4 May 2020 15:54:29 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 68F1720705 for ; Mon, 4 May 2020 15:54:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=tronnes.org header.i=@tronnes.org header.b="VaaxgGCY" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 68F1720705 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=tronnes.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C3F4789F82; Mon, 4 May 2020 15:54:28 +0000 (UTC) Received: from smtp.domeneshop.no (smtp.domeneshop.no [IPv6:2a01:5b40:0:3005::1]) by gabe.freedesktop.org (Postfix) with ESMTPS id B905289F82 for ; Mon, 4 May 2020 15:54:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tronnes.org ; s=ds201912; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: MIME-Version:Date:Message-ID:From:References:Cc:To:Subject:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=MKKVfCAscMMMoNdfpcY+wj0/D53ARrYKEKzF43Ea2+o=; b=VaaxgGCYcGwR0uFl3wh3Y//hX9 ZAPlNMVVREoE6C4n4cEagiL/m0Dt9DCWRyRVNwmYG36D7crjRC/Ok6lJ0m+7ChVOTxxy8bAM4qQvO rgbU1AkFxlHWFDW9C/clKQRl3OQkzmurLiWAen3oDBPG7tTDLyMs2GwwErsWWpOchkWrFK+uceoNS 95fBfiQSql+H6OPUJVseed7jZDvLEXVboWmTq5NGIm+JhzmpnAUwEHCyyVEGq+blo/ZpeAKsELZw7 1SfTW0+p4bj4zHKqbwNB1NNHqxhGFdOqfDm723avcFqOvPDAIR8NOPlerAJifuVBBGZ9sQn5QFjNQ RVTsLWSw==; Received: from 211.81-166-168.customer.lyse.net ([81.166.168.211]:59704 helo=[192.168.10.61]) by smtp.domeneshop.no with esmtpsa (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1jVdQG-0007HJ-IP; Mon, 04 May 2020 17:54:24 +0200 Subject: Re: [PATCH 02/10] drm: Add backlight helper To: Daniel Vetter References: <20200429124830.27475-1-noralf@tronnes.org> <20200429124830.27475-3-noralf@tronnes.org> <20200504120628.GK10381@phenom.ffwll.local> From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Message-ID: Date: Mon, 4 May 2020 17:54:23 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20200504120628.GK10381@phenom.ffwll.local> 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: Hans de Goede , Daniel Thompson , linux-usb@vger.kernel.org, dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" CgpEZW4gMDQuMDUuMjAyMCAxNC4wNiwgc2tyZXYgRGFuaWVsIFZldHRlcjoKPiBPbiBXZWQsIEFw ciAyOSwgMjAyMCBhdCAwMjo0ODoyMlBNICswMjAwLCBOb3JhbGYgVHLDuG5uZXMgd3JvdGU6Cj4+ IFRoaXMgYWRkcyBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGJhY2tsaWdodCBkZXZpY2UgZm9y IGEgY29ubmVjdG9yLgo+PiBJdCBkb2VzIG5vdCBkZWFsIHdpdGggdGhlIEtNUyBiYWNrbGlnaHQg QUJJIHByb3Bvc2l0aW9uWzFdIHRvIGFkZCBhCj4+IGNvbm5lY3RvciBwcm9wZXJ0eS4gSXQgb25s eSB0YWtlcyB0aGUgY3VycmVudCBiZXN0IHByYWN0aXNlIHRvIHN0YW5kYXJkaXNlCj4+IHRoZSBj cmVhdGlvbiBvZiBhIGJhY2tsaWdodCBkZXZpY2UgZm9yIERSTSBkcml2ZXJzIHdoaWxlIHdlIHdh aXQgZm9yIHRoZQo+PiBwcm9wZXJ0eS4KPj4KPj4gVGhlIGJyaWdodG5lc3MgdmFsdWUgaXMgc2V0 IHVzaW5nIGEgY29ubmVjdG9yIHN0YXRlIHZhcmlhYmxlIGFuZCBhbiBhdG9taWMKPj4gY29tbWl0 Lgo+Pgo+PiBJIGhhdmUgbG9va2VkIHRocm91Z2ggc29tZSBvZiB0aGUgYmFja2xpZ2h0IHVzZXJz IGFuZCB0aGlzIGlzIHdoYXQgSSd2ZSBmb3VuZDoKPj4KPj4gR05PTUUgWzJdCj4+IC0tLS0tLS0t LQo+Pgo+PiBCcmlnaHRuZXNzIHJhbmdlOiAwLTEwMAo+PiBTY2FsZTogQXNzdW1lcyBwZXJjZXB0 dWFsCj4+Cj4+IEF2b2lkcyBzZXR0aW5nIHRoZSBzeXNmcyBicmlnaHRuZXNzIHZhbHVlIHRvIHpl cm8gaWYgbWF4X2JyaWdodG5lc3MgPj0gOTkuCj4+IENhbiBjb25uZWN0IGNvbm5lY3RvciBhbmQg YmFja2xpZ2h0IHVzaW5nIHRoZSBzeXNmcyBkZXZpY2UuCj4+Cj4+IEtERSBbM10KPj4gLS0tLS0t LQo+Pgo+PiBCcmlnaHRuZXNzIHJhbmdlOiAwLTEwMAo+PiBTY2FsZTogQXNzdW1lcyBwZXJjZXB0 dWFsCj4+Cj4+IFdlc3RvbiBbNF0KPj4gLS0tLS0tLS0tLQo+Pgo+PiBCcmlnaHRuZXNzIHJhbmdl OiAwLTI1NQo+PiBTY2FsZTogQXNzdW1lcyBwZXJjZXB0dWFsCj4+Cj4+IENocm9taXVtIE9TIFs1 XQo+PiAtLS0tLS0tLS0tLS0tLS0KPj4KPj4gQnJpZ2h0bmVzcyByYW5nZTogMC0xMDAKPj4gU2Nh bGU6IERlcGVuZHMgb24gdGhlIHN5c2ZzIGZpbGUgJ3NjYWxlJyB3aGljaCBpcyBhIHJlY2VudCBh ZGRpdGlvbiAoMjAxOSkKPj4KPj4geHNlcnZlciBbNl0KPj4gLS0tLS0tLS0tLS0KPj4KPj4gQnJp Z2h0bmVzcyByYW5nZTogMC14IChkcml2ZXIgc3BlY2lmaWMpICgxIGlzIG1pbmltdW0sIDAgaXMg T0ZGKQo+PiBTY2FsZTogQXNzdW1lcyBwZXJjZXB0dWFsCj4+Cj4+IFRoZSBidWlsdGluIG1vZGVz ZXR0aW5nIGRyaXZlcls3XSBkb2VzIG5vdCBzdXBwb3J0IEJhY2tsaWdodCwgSW50ZWxbOF0gZG9l cy4KPj4KPj4gWzFdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2RyaS1kZXZlbC80YjE3YmEwOC0z OWYzLTU3ZGQtNWFhZC1kMzdkODQ0YjAyYzZAbGludXguaW50ZWwuY29tLwo+PiBbMl0gaHR0cHM6 Ly9naXRsYWIuZ25vbWUub3JnL0dOT01FL2dub21lLXNldHRpbmdzLWRhZW1vbi8tL2Jsb2IvbWFz dGVyL3BsdWdpbnMvcG93ZXIvZ3NkLWJhY2tsaWdodC5jCj4+IFszXSBodHRwczovL2dpdGh1Yi5j b20vS0RFL3Bvd2VyZGV2aWwvYmxvYi9tYXN0ZXIvZGFlbW9uL2JhY2tlbmRzL3Vwb3dlci9iYWNr bGlnaHRoZWxwZXIuY3BwCj4+IFs0XSBodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvd2F5 bGFuZC93ZXN0b24vLS9ibG9iL21hc3Rlci9saWJ3ZXN0b24vYmFja2VuZC1kcm0vZHJtLmMKPj4g WzVdIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9zL3BsYXRmb3Jt Mi8rL3JlZnMvaGVhZHMvbWFzdGVyL3Bvd2VyX21hbmFnZXIvcG93ZXJkL3N5c3RlbS9pbnRlcm5h bF9iYWNrbGlnaHQuY2MKPj4gWzZdIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlZGVza3RvcC94b3Jn LXJhbmRycHJvdG8vYmxvYi9tYXN0ZXIvcmFuZHJwcm90by50eHQKPj4gWzddIGh0dHBzOi8vZ2l0 bGFiLmZyZWVkZXNrdG9wLm9yZy94b3JnL3hzZXJ2ZXIvLS9ibG9iL21hc3Rlci9ody94ZnJlZTg2 L2RyaXZlcnMvbW9kZXNldHRpbmcvZHJtbW9kZV9kaXNwbGF5LmMKPj4gWzhdIGh0dHBzOi8vZ2l0 bGFiLmZyZWVkZXNrdG9wLm9yZy94b3JnL2RyaXZlci94Zjg2LXZpZGVvLWludGVsLy0vYmxvYi9t YXN0ZXIvc3JjL2JhY2tsaWdodC5jCj4+Cj4+IENjOiBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUBy ZWRoYXQuY29tPgo+PiBDYzogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGxpbnV4LmludGVsLmNv bT4KPj4gQ2M6IE1hcnRpbiBQZXJlcyA8bWFydGluLnBlcmVzQGxpbnV4LmludGVsLmNvbT4KPj4g Q2M6IERhbmllbCBUaG9tcHNvbiA8ZGFuaWVsLnRob21wc29uQGxpbmFyby5vcmc+Cj4+IFNpZ25l ZC1vZmYtYnk6IE5vcmFsZiBUcsO4bm5lcyA8bm9yYWxmQHRyb25uZXMub3JnPgo+PiAtLS0KPj4g IERvY3VtZW50YXRpb24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QgIHwgICA2ICsKPj4gIGRyaXZl cnMvZ3B1L2RybS9LY29uZmlnICAgICAgICAgICAgICAgIHwgICA3ICsrCj4+ICBkcml2ZXJzL2dw dS9kcm0vTWFrZWZpbGUgICAgICAgICAgICAgICB8ICAgMSArCj4+ICBkcml2ZXJzL2dwdS9kcm0v ZHJtX2JhY2tsaWdodF9oZWxwZXIuYyB8IDE1NCArKysrKysrKysrKysrKysrKysrKysrKysrCj4+ ICBpbmNsdWRlL2RybS9kcm1fYmFja2xpZ2h0X2hlbHBlci5oICAgICB8ICAgOSArKwo+PiAgaW5j bHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oICAgICAgICAgICAgfCAgMTAgKysKPj4gIDYgZmlsZXMg Y2hhbmdlZCwgMTg3IGluc2VydGlvbnMoKykKPj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vZHJtX2JhY2tsaWdodF9oZWxwZXIuYwo+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGlu Y2x1ZGUvZHJtL2RybV9iYWNrbGlnaHRfaGVscGVyLmgKPj4KPj4gZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QgYi9Eb2N1bWVudGF0aW9uL2dwdS9kcm0t a21zLWhlbHBlcnMucnN0Cj4+IGluZGV4IDk2NjhhN2ZlMjQwOC4uMjlhMmY0YjQ5ZmQyIDEwMDY0 NAo+PiAtLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9kcm0ta21zLWhlbHBlcnMucnN0Cj4+ICsrKyBi L0RvY3VtZW50YXRpb24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QKPj4gQEAgLTQxMSwzICs0MTEs OSBAQCBTSE1FTSBHRU0gSGVscGVyIFJlZmVyZW5jZQo+PiAgCj4+ICAuLiBrZXJuZWwtZG9jOjog ZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fc2htZW1faGVscGVyLmMKPj4gICAgIDpleHBvcnQ6Cj4+ ICsKPj4gK0JhY2tsaWdodCBIZWxwZXIgUmVmZXJlbmNlCj4+ICs9PT09PT09PT09PT09PT09PT09 PT09PT09PQo+PiArCj4+ICsuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9ncHUvZHJtL2RybV9iYWNr bGlnaHRfaGVscGVyLmMKPj4gKyAgIDpleHBvcnQ6Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCj4+IGluZGV4IGQwYWE2Y2Zm MmUwMi4uZjZlMTNlMThjOWNhIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZp Zwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwo+PiBAQCAtMjI0LDYgKzIyNCwxMyBA QCBjb25maWcgRFJNX0dFTV9TSE1FTV9IRUxQRVIKPj4gIAloZWxwCj4+ICAJICBDaG9vc2UgdGhp cyBpZiB5b3UgbmVlZCB0aGUgR0VNIHNobWVtIGhlbHBlciBmdW5jdGlvbnMKPj4gIAo+PiArY29u ZmlnIERSTV9CQUNLTElHSFRfSEVMUEVSCj4+ICsJYm9vbAo+PiArCWRlcGVuZHMgb24gRFJNCj4+ ICsJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKPj4gKwloZWxwCj4+ICsJICBDaG9vc2Ug dGhpcyBpZiB5b3UgbmVlZCB0aGUgYmFja2xpZ2h0IGRldmljZSBoZWxwZXIgZnVuY3Rpb25zCj4+ ICsKPj4gIGNvbmZpZyBEUk1fVk0KPj4gIAlib29sCj4+ICAJZGVwZW5kcyBvbiBEUk0gJiYgTU1V Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9k cm0vTWFrZWZpbGUKPj4gaW5kZXggNjQ5MzA4OGEwZmRkLi4wZDE3NjYyZGRlMGEgMTAwNjQ0Cj4+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0v TWFrZWZpbGUKPj4gQEAgLTUyLDYgKzUyLDcgQEAgZHJtX2ttc19oZWxwZXItJChDT05GSUdfRFJN X0ZCREVWX0VNVUxBVElPTikgKz0gZHJtX2ZiX2hlbHBlci5vCj4+ICBkcm1fa21zX2hlbHBlci0k KENPTkZJR19EUk1fS01TX0NNQV9IRUxQRVIpICs9IGRybV9mYl9jbWFfaGVscGVyLm8KPj4gIGRy bV9rbXNfaGVscGVyLSQoQ09ORklHX0RSTV9EUF9BVVhfQ0hBUkRFVikgKz0gZHJtX2RwX2F1eF9k ZXYubwo+PiAgZHJtX2ttc19oZWxwZXItJChDT05GSUdfRFJNX0RQX0NFQykgKz0gZHJtX2RwX2Nl Yy5vCj4+ICtkcm1fa21zX2hlbHBlci0kKENPTkZJR19EUk1fQkFDS0xJR0hUX0hFTFBFUikgKz0g ZHJtX2JhY2tsaWdodF9oZWxwZXIubwo+PiAgCj4+ICBvYmotJChDT05GSUdfRFJNX0tNU19IRUxQ RVIpICs9IGRybV9rbXNfaGVscGVyLm8KPj4gIG9iai0kKENPTkZJR19EUk1fREVCVUdfU0VMRlRF U1QpICs9IHNlbGZ0ZXN0cy8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYmFj a2xpZ2h0X2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9iYWNrbGlnaHRfaGVscGVyLmMK Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMDAwMDAwLi4wNmU2YTc1ZDFk MGEKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2JhY2tsaWdo dF9oZWxwZXIuYwo+PiBAQCAtMCwwICsxLDE1NCBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAgT1IgTUlUCj4+ICsvKgo+PiArICogQ29weXJpZ2h0IDIwMjAgTm9yYWxm IFRyw7hubmVzCj4+ICsgKi8KPj4gKwo+PiArI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgo+ PiArCj4+ICsjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWMuaD4KPj4gKyNpbmNsdWRlIDxkcm0vZHJt X2Nvbm5lY3Rvci5oPgo+PiArI2luY2x1ZGUgPGRybS9kcm1fZHJ2Lmg+Cj4+ICsjaW5jbHVkZSA8 ZHJtL2RybV9maWxlLmg+Cj4+ICsKPj4gK3N0YXRpYyBpbnQgZHJtX2JhY2tsaWdodF91cGRhdGVf c3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKPj4gK3sKPj4gKwlzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yID0gYmxfZ2V0X2RhdGEoYmQpOwo+PiArCXN0cnVjdCBkcm1f Y29ubmVjdG9yX3N0YXRlICpjb25uZWN0b3Jfc3RhdGU7Cj4+ICsJc3RydWN0IGRybV9kZXZpY2Ug KmRldiA9IGNvbm5lY3Rvci0+ZGV2Owo+PiArCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0 eCBjdHg7Cj4+ICsJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlOwo+PiArCWludCByZXQ7 Cj4+ICsKPj4gKwlzdGF0ZSA9IGRybV9hdG9taWNfc3RhdGVfYWxsb2MoZGV2KTsKPj4gKwlpZiAo IXN0YXRlKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCWRybV9tb2Rlc2V0X2FjcXVp cmVfaW5pdCgmY3R4LCAwKTsKPj4gKwlzdGF0ZS0+YWNxdWlyZV9jdHggPSAmY3R4Owo+PiArcmV0 cnk6Cj4+ICsJY29ubmVjdG9yX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY29ubmVjdG9yX3N0YXRl KHN0YXRlLCBjb25uZWN0b3IpOwo+PiArCWlmIChJU19FUlIoY29ubmVjdG9yX3N0YXRlKSkgewo+ PiArCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rvcl9zdGF0ZSk7Cj4+ICsJCWdvdG8gb3V0Owo+PiAr CX0KPj4gKwo+PiArCWNvbm5lY3Rvcl9zdGF0ZS0+YmFja2xpZ2h0X2JyaWdodG5lc3MgPSBiZC0+ cHJvcHMuYnJpZ2h0bmVzczsKPj4gKwo+PiArCXJldCA9IGRybV9hdG9taWNfY29tbWl0KHN0YXRl KTsKPj4gK291dDoKPj4gKwlpZiAocmV0ID09IC1FREVBRExLKSB7Cj4+ICsJCWRybV9hdG9taWNf c3RhdGVfY2xlYXIoc3RhdGUpOwo+PiArCQlkcm1fbW9kZXNldF9iYWNrb2ZmKCZjdHgpOwo+PiAr CQlnb3RvIHJldHJ5Owo+PiArCX0KPj4gKwo+PiArCWRybV9hdG9taWNfc3RhdGVfcHV0KHN0YXRl KTsKPj4gKwo+PiArCWRybV9tb2Rlc2V0X2Ryb3BfbG9ja3MoJmN0eCk7Cj4+ICsJZHJtX21vZGVz ZXRfYWNxdWlyZV9maW5pKCZjdHgpOwo+PiArCj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPiAKPiBM b29raW5nIGF0IHRoaXMsIEknbSBub3Qgc3VyZSB0aGlzIGlzIGdlbmVyYWxseSB1c2VhYmxlIG91 dHNpZGUgb2YgeW91cgo+IHVzYiBkcml2ZXIuIE9yIHN0dWZmIHRoYXQgZG9lcyBlc3NlbnRpYWxs eSB0aGUgc2FtZS4KPiAKPiBGb3IgcmVhbCBodyBkcml2ZXJzIEkgZXhwZWN0IGEgc2ltaWxhciBy ZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUga21zIGRyaXZlcgo+IGFuZCB0aGUgYmFja2xpZ2h0IGRy aXZlciBsaWtlIGZvciBpMmMsIGNsb2NrcywgcG93ZXIgZG9tYWluZXMsIC4uLiBpLmUuCj4gdGhl IGttcyBkcml2ZXIgY2FsbHMgaW50byB0aGUgYmFja2xpZ2h0IGRyaXZlci4gVGhpcyBhbHNvIG1l YW5zIHRoYXQga21zCj4gbG9ja3Mgd2lsbCBiZSBuZXN0aW5nIG91dHNpZGUgb2YgdGhlIGxvY2tz IG9mIHRoZXNlIHN1Ym9yZGluYXRlCj4gc3Vic3lzdGVtcywgYW5kIGhlbmNlIGRpcmVjdCBhY2Nl c3MgdGhyb3VnaCBvdGhlciB1c2Vyc3BhY2UgaW50ZXJmYWNlcwo+IChsaWtlIHdlIGhhdmUgZm9y IGkyYyB0b28pIG5lZWRzIHRvIGJ5cGFzcyBhdG9taWMga21zLiBPdGhlcndpc2Ugd2UgaGF2ZQo+ IGRlYWRsb2NrIHBvdGVudGlhbC4KPiAKPiAKPiBXaXRoIHlvdXIgc3R1ZmYgaGVyZSB3ZSBjYW4g cG90ZW50aWFsbHkgZ2V0IGEgYmFja2xpZ2h0IGxvY2tzIC0+IGttcyBsb2Nrcwo+IC0+IGJhY2ts aWdodCBsb2NrcyBzY2VuYXJpbywgYW5kIGxvY2tkZXAgd2lsbCBiZSBhbmdyeSBhYm91dCB0aGlz LiBTbyBpbgo+IGdlbmVyYWwgdGhpcyBkb2Vzbid0IHdvcmsgKEkgdGhpbmssIGxvY2tpbmcgaXMg aGFyZCksIGFuZCBpbiB0aGlzIHNwZWNpZmljCj4gY2FzZSBpdCBvbmx5IHdvcmtzIGJlY2F1c2Ug eW91ciB1c2IgZHJpdmVyIHNob3ZlbHMgZXZlcnl0aGluZyBvdmVyIHRvCj4gYW5vdGhlciBtYWNo aW5lLiBMb2NrZGVwIHdpbGwgc3RpbGwgY29tcGxhaW4gaWYgeW91IGxvYWQgdGhpcyB0b2dldGhl cgo+IHdpdGggc29tZSBvdGhlciBrbXMgZHJpdmVyIHRoYXQgdXNlcyBiYWNrbGlnaHQgbm9ybWFs bHkuCj4gCj4gQXNpZGU6IExvY2tpbmcgaXMgYnJva2VuIGluIHRoZSBiYWNrbGlnaHQgY29kZSwg d2UgdGFrZSB0aGUKPiBiZC0+dXBkYXRlX2xvY2sgdG9vIGxhdGUsIGFmdGVyIGJkLT5wcm9wcyBo YXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQKPiB1bnNhZmVseS4gQnV0IEkgZ3Vlc3MgdGhhdCdzIGEg c2lkZSBlZmZlY3Qgb2YgdGhlIHN5c2ZzIGludGVyZmFjZSBiZWluZwo+IHJhY3kgYnkgZGVmYXVs dC4gT3IgdGhlIGJhY2tsaWdodF9lbmFibGUvZGlzYWJsZSBoZWxwZXJzIHNob3VsZCB0YWtlCj4g YmQtPm9wc19sb2NrIHRvby4KPiAKPiBTbyB0d28gdGhpbmdzOgo+IC0gSSB0aGluayB0aGUgYWN0 dWFsIHVwZGF0ZSBuZWVkcyB0byBiZSBwdXNoZWQgdG8gYSB3b3JrX3N0cnVjdCwgd2l0aCBubwo+ ICAgZmx1c2hfd29yaywgdG8gYXZvaWQgdGhlc2UgbG9ja2luZyBsb29wcyBjb21wbGV0ZWx5Lgo+ IC0gSSB0aGluayB0aGlzIGlzIGJlc3QgbGVmdCBpbiB5b3VyIHVzYiBkcml2ZXIgZm9yIG5vdywg dW50aWwgc29tZW9uZQo+ICAgY29tZXMgdXAgd2l0aCBtYXliZSBhbiBzcGkgZm9yd2FyZGVyIG9y IHdoYXRldmVyIHdoZXJlIHdlIG1pZ2h0IG5lZWQKPiAgIHRoaXMgYWdhaW4uCj4gCj4gT3IsIGFu ZCB0aGlzIGlzIHByb2JhYmx5IG11Y2ggc2ltcGxlciwganVzdCBoYXZlIGEgc2ltcGxlciBiYWNr bGlnaHQKPiBkcml2ZXIgdGhhdCdzIGNvbXBsZXRlbHkgb3J0aG9nb25hbCB0byB0aGUga21zIHNp ZGUsIHdpdGggc29tZSBodyBsb2NrIHRvCj4gb3JnYW5pemUgdXBkYXRlcy4gRm9yIHRoYXQgY2Fz ZSBqdXN0IGFkZGluZyBhIGRybV9jb25uZWN0b3ItPmJhY2tsaWdodAo+IHBvaW50ZXIsIGFzIHBy ZXAgZm9yIEhhbnMnIHdvcmssIHdvdWxkIGJlIGdyZWF0LgoKSSBkb24ndCBxdWl0ZSBmb2xsb3cg eW91IGhlcmUuIFRoaXMgYmFja2xpZ2h0IGRldmljZSBpcyBmb3Iga21zIGRyaXZlcnMKdGhhdCBj b250cm9sIHRoZSBiYWNrbGlnaHQgYnJpZ2h0bmVzcyBieSB0aGVtc2VsdmVzLCBieSBzZXR0aW5n IGEgcHdtCnZhbHVlIG9yIHNvbWV0aGluZyBvbiB0aGVpciBoYXJkd2FyZS4gVGhlIGttcyBkcml2 ZXIgd2lsbCBub3QgYWN0IGFzIGEKcHJveHkgYW5kIGZvcndhcmQgdGhlIHZhbHVlIHRvIGFub3Ro ZXIgYmFja2xpZ2h0IGRyaXZlci4gTm9yIHdpbGwKYW5vdGhlciBkcml2ZXIgdXNlIHRoaXMgYmFj a2xpZ2h0IGRldmljZS4gSXQncyBwdXJlbHkgZm9yIHVzZXJzcGFjZS4gU28KSSBkb24ndCB1bmRl cnN0YW5kIGhvdyBhIGxvY2tpbmcgbG9vcCBjYW4gaGFwcGVuLgoKV2hhdCB0aGlzIGNvZGUgZG9l cyBmb3IgbWUgaXMgcHVzaGluZyBicmlnaHRuZXNzIGNoYW5nZXMgdGhyb3VnaCB0aGUKYXRvbWlj IG1hY2hpbmVyeSBzbyBJIGNhbiB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBwcm9wZXJ0eSBjaGFu Z2UuClNvIHRoZSByZWFzb24gSSBtYWRlIGl0IGEgY29yZSBoZWxwZXIgaXMgdGhhdCBJIGZpZ3Vy ZWQgSSB3YXNuJ3QgdGhlCm9ubHkgb25lIHdobyB3b3VsZCB3YW50IHRoaXMuCgpJJ2xsIG1vdmUg aXQgaW5zaWRlIG15IGRyaXZlciB1bmxlc3Mgc29tZW9uZSBjaGltZXMgaW4gYW5kIHNheSB0aGV5 IHdhbnQKaXQgdG8uCgpOb3JhbGYuCgo+IC1EYW5pZWwKPiAKPiAKPj4gKwo+PiArc3RhdGljIGlu dCBkcm1fYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpi ZCkKPj4gK3sKPj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gYmxfZ2V0X2Rh dGEoYmQpOwo+PiArCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKPj4g KwlpbnQgYnJpZ2h0bmVzczsKPj4gKwo+PiArCWRybV9tb2Rlc2V0X2xvY2soJmRldi0+bW9kZV9j b25maWcuY29ubmVjdGlvbl9tdXRleCwgTlVMTCk7Cj4+ICsJYnJpZ2h0bmVzcyA9IGNvbm5lY3Rv ci0+c3RhdGUtPmJhY2tsaWdodF9icmlnaHRuZXNzOwo+PiArCWRybV9tb2Rlc2V0X3VubG9jaygm ZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KTsKPj4gKwo+PiArCXJldHVybiBicmln aHRuZXNzOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMg ZHJtX2JhY2tsaWdodF9vcHMgPSB7Cj4+ICsJLmdldF9icmlnaHRuZXNzID0gZHJtX2JhY2tsaWdo dF9nZXRfYnJpZ2h0bmVzcywKPj4gKwkudXBkYXRlX3N0YXR1cwk9IGRybV9iYWNrbGlnaHRfdXBk YXRlX3N0YXR1cywKPj4gK307Cj4+ICsKPj4gKy8qIENhbiBiZSBleHBvcnRlZCBmb3IgZHJpdmVy cyBjYXJyeWluZyBhIGxlZ2FjeSBuYW1lICovCj4+ICtzdGF0aWMgaW50IGRybV9iYWNrbGlnaHRf cmVnaXN0ZXJfd2l0aF9uYW1lKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGNvbnN0 IGNoYXIgKm5hbWUpCj4+ICt7Cj4+ICsJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOwo+PiAr CWNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wcyA9IHsKPj4gKwkJLnR5cGUg PSBCQUNLTElHSFRfUkFXLAo+PiArCQkuc2NhbGUgPSBCQUNLTElHSFRfU0NBTEVfTk9OX0xJTkVB UiwKPj4gKwkJLm1heF9icmlnaHRuZXNzID0gMTAwLAo+PiArCX07Cj4+ICsKPj4gKwlpZiAoV0FS Tl9PTighZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShjb25uZWN0b3ItPmRldiwgRFJJVkVSX01PREVT RVQpIHx8Cj4+ICsJCSAgICAhZHJtX2Rydl91c2VzX2F0b21pY19tb2Rlc2V0KGNvbm5lY3Rvci0+ ZGV2KSB8fAo+PiArCQkgICAgIWNvbm5lY3Rvci0+a2RldikpCj4+ICsJCXJldHVybiAtRUlOVkFM Owo+PiArCj4+ICsJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIGNvbm5lY3Rv ci0+a2RldiwgY29ubmVjdG9yLAo+PiArCQkJCSAgICAgICAmZHJtX2JhY2tsaWdodF9vcHMsICZw cm9wcyk7Cj4+ICsJaWYgKElTX0VSUihiZCkpCj4+ICsJCXJldHVybiBQVFJfRVJSKGJkKTsKPj4g Kwo+PiArCWNvbm5lY3Rvci0+YmFja2xpZ2h0ID0gYmQ7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4g K30KPj4gKwo+PiArLyoqCj4+ICsgKiBkcm1fYmFja2xpZ2h0X3JlZ2lzdGVyKCkgLSBSZWdpc3Rl ciBhIGJhY2tsaWdodCBkZXZpY2UgZm9yIGEgY29ubmVjdG9yCj4+ICsgKiBAY29ubmVjdG9yOiBD b25uZWN0b3IKPj4gKyAqCj4+ICsgKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhIGJhY2tsaWdo dCBkZXZpY2UgZm9yIEBjb25uZWN0b3Igd2l0aCB0aGUgZm9sbG93aW5nCj4+ICsgKiBjaGFyYWN0 ZXJpc3RpY3M6Cj4+ICsgKgo+PiArICogLSBUaGUgY29ubmVjdG9yIHN5c2ZzIGRldmljZSBpcyB1 c2VkIGFzIGEgcGFyZW50IGRldmljZSBmb3IgdGhlIGJhY2tsaWdodCBkZXZpY2UuCj4+ICsgKiAg IFVzZXJzcGFjZSBjYW4gdXNlIHRoaXMgdG8gY29ubmVjdCBiYWNrbGlnaHQgZGV2aWNlIGFuZCBj b25uZWN0b3IuCj4+ICsgKiAtIE5hbWUgd2lsbCBiZSBvbiB0aGUgZm9ybTogKipjYXJkMC1IRE1J LUEtMS1iYWNrbGlnaHQqKgo+PiArICogLSBUeXBlIGlzICJyYXciCj4+ICsgKiAtIFNjYWxlIGlz ICJub24tbGluZWFyIiAocGVyY2VwdHVhbCkKPj4gKyAqIC0gTWF4IGJyaWdodG5lc3MgaXMgMTAw IGdpdmluZyBhIHJhbmdlIG9mIDAtMTAwIGluY2x1c2l2ZQo+PiArICogLSBSZWFkaW5nIHN5c2Zz ICoqYnJpZ2h0bmVzcyoqIHJldHVybnMgdGhlIGJhY2tsaWdodCBkZXZpY2UgcHJvcGVydHkKPj4g KyAqIC0gUmVhZGluZyBzeXNmcyAqKmFjdHVhbF9icmlnaHRuZXNzKiogcmV0dXJucyB0aGUgY29u bmVjdG9yIHN0YXRlIHZhbHVlCj4+ICsgKiAtIFdyaXRpbmcgc3lzZnMgKipibF9wb3dlcioqIGlz IGlnbm9yZWQsIHRoZSBEUE1TIGNvbm5lY3RvciBwcm9wZXJ0eSBzaG91bGQKPj4gKyAqICAgYmUg dXNlZCB0byBjb250cm9sIHBvd2VyLgo+PiArICogLSBCYWNrbGlnaHQgZGV2aWNlIHN1c3BlbmQv cmVzdW1lIGV2ZW50cyBhcmUgaWdub3JlZC4KPj4gKyAqCj4+ICsgKiBOb3RlOgo+PiArICoKPj4g KyAqIEJyaWdodG5lc3MgemVybyBzaG91bGQgbm90IHR1cm4gb2ZmIGJhY2tsaWdodCBpdCBzaG91 bGQgYmUgdGhlIG1pbmltdW0KPj4gKyAqIGJyaWdodG5lc3MsIERQTVMgaGFuZGxlcyBwb3dlci4K Pj4gKyAqCj4+ICsgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZyb20gJmRybV9jb25u ZWN0b3JfZnVuY3MtPmxhdGVfcmVnaXN0ZXIoKSBzaW5jZQo+PiArICogaXQgZGVwZW5kcyBvbiB0 aGUgc3lzZnMgZGV2aWNlLgo+PiArICoKPj4gKyAqIFJldHVybnM6Cj4+ICsgKiBaZXJvIG9uIHN1 Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+PiArICovCj4+ICtpbnQg ZHJtX2JhY2tsaWdodF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ PiArewo+PiArCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwo+PiArCWludCByZXQ7Cj4+ICsKPj4g KwluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJjYXJkJWQtJXMtYmFja2xpZ2h0IiwKPj4g KwkJCSBjb25uZWN0b3ItPmRldi0+cHJpbWFyeS0+aW5kZXgsIGNvbm5lY3Rvci0+bmFtZSk7Cj4+ ICsJaWYgKCFuYW1lKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCXJldCA9IGRybV9i YWNrbGlnaHRfcmVnaXN0ZXJfd2l0aF9uYW1lKGNvbm5lY3RvciwgbmFtZSk7Cj4+ICsJa2ZyZWUo bmFtZSk7Cj4+ICsKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArRVhQT1JUX1NZTUJPTChkcm1f YmFja2xpZ2h0X3JlZ2lzdGVyKTsKPj4gKwo+PiArLyoqCj4+ICsgKiBkcm1fYmFja2xpZ2h0X3Vu cmVnaXN0ZXIoKSAtIFVucmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZQo+PiArICogQGNvbm5lY3Rv cjogQ29ubmVjdG9yCj4+ICsgKgo+PiArICogVW5yZWdpc3RlciBhIGJhY2tsaWdodCBkZXZpY2Uu IFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUKPj4gKyAqICZkcm1fY29ubmVjdG9yX2Z1bmNz LT5lYXJseV91bnJlZ2lzdGVyKCkgY2FsbGJhY2suCj4+ICsgKi8KPj4gK3ZvaWQgZHJtX2JhY2ts aWdodF91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4+ICt7Cj4+ ICsJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGNvbm5lY3Rvci0+YmFja2xpZ2h0KTsKPj4g K30KPj4gK0VYUE9SVF9TWU1CT0woZHJtX2JhY2tsaWdodF91bnJlZ2lzdGVyKTsKPj4gZGlmZiAt LWdpdCBhL2luY2x1ZGUvZHJtL2RybV9iYWNrbGlnaHRfaGVscGVyLmggYi9pbmNsdWRlL2RybS9k cm1fYmFja2xpZ2h0X2hlbHBlci5oCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAw MDAwMDAwMDAwMC4uNDE1MWI2NmViMGI0Cj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvaW5jbHVk ZS9kcm0vZHJtX2JhY2tsaWdodF9oZWxwZXIuaAo+PiBAQCAtMCwwICsxLDkgQEAKPj4gKy8qIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wIE9SIE1JVCAqLwo+PiArCj4+ICsjaWZuZGVm IF9MSU5VWF9EUk1fQkFDS0xJR0hUX0hFTFBFUl9ICj4+ICsjZGVmaW5lIF9MSU5VWF9EUk1fQkFD S0xJR0hUX0hFTFBFUl9ICj4+ICsKPj4gK2ludCBkcm1fYmFja2xpZ2h0X3JlZ2lzdGVyKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwo+PiArdm9pZCBkcm1fYmFja2xpZ2h0X3VucmVn aXN0ZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4+ICsKPj4gKyNlbmRpZgo+ PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvci5oIGIvaW5jbHVkZS9kcm0v ZHJtX2Nvbm5lY3Rvci5oCj4+IGluZGV4IDIyMTkxMDk0OGIzNy4uY2U2NzhiNjk0ZjQ1IDEwMDY0 NAo+PiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fY29ubmVjdG9yLmgKPj4gKysrIGIvaW5jbHVkZS9k cm0vZHJtX2Nvbm5lY3Rvci5oCj4+IEBAIC0zMiw2ICszMiw3IEBACj4+ICAKPj4gICNpbmNsdWRl IDx1YXBpL2RybS9kcm1fbW9kZS5oPgo+PiAgCj4+ICtzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZTsK Pj4gIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jczsKPj4gIHN0cnVjdCBkcm1fbW9k ZXNldF9hY3F1aXJlX2N0eDsKPj4gIHN0cnVjdCBkcm1fZGV2aWNlOwo+PiBAQCAtNjU2LDYgKzY1 NywxMiBAQCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSB7Cj4+ICAJICovCj4+ICAJdTggbWF4 X2JwYzsKPj4gIAo+PiArCS8qKgo+PiArCSAqIEBiYWNrbGlnaHRfYnJpZ2h0bmVzczogQnJpZ2h0 bmVzcyB2YWx1ZSBvZiB0aGUgY29ubmVjdG9yIGJhY2tsaWdodAo+PiArCSAqIGRldmljZS4gU2Vl IGRybV9iYWNrbGlnaHRfcmVnaXN0ZXIoKS4KPj4gKwkgKi8KPj4gKwl1OCBiYWNrbGlnaHRfYnJp Z2h0bmVzczsKPj4gKwo+PiAgCS8qKgo+PiAgCSAqIEBoZHJfb3V0cHV0X21ldGFkYXRhOgo+PiAg CSAqIERSTSBibG9iIHByb3BlcnR5IGZvciBIRFIgb3V0cHV0IG1ldGFkYXRhCj4+IEBAIC0xNDIy LDYgKzE0MjksOSBAQCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciB7Cj4+ICAKPj4gIAkvKiogQGhkcl9z aW5rX21ldGFkYXRhOiBIRFIgTWV0YWRhdGEgSW5mb3JtYXRpb24gcmVhZCBmcm9tIHNpbmsgKi8K Pj4gIAlzdHJ1Y3QgaGRyX3NpbmtfbWV0YWRhdGEgaGRyX3NpbmtfbWV0YWRhdGE7Cj4+ICsKPj4g KwkvKiogQGJhY2tsaWdodDogQmFja2xpZ2h0IGRldmljZS4gU2VlIGRybV9iYWNrbGlnaHRfcmVn aXN0ZXIoKSAqLwo+PiArCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQ7Cj4+ICB9 Owo+PiAgCj4+ICAjZGVmaW5lIG9ial90b19jb25uZWN0b3IoeCkgY29udGFpbmVyX29mKHgsIHN0 cnVjdCBkcm1fY29ubmVjdG9yLCBiYXNlKQo+PiAtLSAKPj4gMi4yMy4wCj4+Cj4+IF9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4+IGRyaS1kZXZlbCBtYWls aW5nIGxpc3QKPj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+PiBodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo+IApfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK