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 C46F2C48BF8 for ; Thu, 22 Feb 2024 16:44:18 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5C70110E9B9; Thu, 22 Feb 2024 16:44:18 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="HWBhoCrC"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.17]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6D1BF10E30B; Thu, 22 Feb 2024 16:44:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1708620256; x=1740156256; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=hzQJmorMTV5rdTl82QUGox6zoC899///hh48jdQr9E4=; b=HWBhoCrCQytrX0Fv0VR65D4+pDWPcVCSQ6kYsGsEOOCkOwK3nl2804mu hh/fn4T/7V/rW4MUEHfsM8XDIlzgEWhVPbyY7tlFwLxzsZUOlTdg6mT7K GayNpnFFqw8QOd8rjr3Y7k8tLTi3n97pduVn7KBgY7nTBkJDrWAR0Cty4 +mvtKBsjpMyr+8lJFMu74IKAGBEJ+3nLREsa8mR5pgjcIR/hn9+AesUve PxjLVYXeOGPgs5hAeK1l0L4J0SnhV7x/2VjokgCdyD/2MbNaTMZwwSbew hZTe9Y2M5gTptglf4TxXIfgqXxWfp/fp65kUQvjAuibZI+ofuIDOMTGfX g==; X-IronPort-AV: E=McAfee;i="6600,9927,10992"; a="2718255" X-IronPort-AV: E=Sophos;i="6.06,179,1705392000"; d="scan'208";a="2718255" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by fmvoesa111.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Feb 2024 08:44:15 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.06,179,1705392000"; d="scan'208";a="10289434" Received: from mhaehnex-mobl1.ger.corp.intel.com (HELO [10.252.2.135]) ([10.252.2.135]) by orviesa005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Feb 2024 08:44:10 -0800 Message-ID: <03e62bcf-137c-4947-8f34-0cbfcba92a30@intel.com> Date: Thu, 22 Feb 2024 16:44:06 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/2] devm-helpers: Add resource managed version of mutex init Content-Language: en-GB To: =?UTF-8?Q?Marek_Beh=C3=BAn?= , linux-kernel@vger.kernel.org, Hans de Goede , Matti Vaittinen Cc: Linus Walleij , Bartosz Golaszewski , Lucas De Marchi , Oded Gabbay , =?UTF-8?Q?Thomas_Hellstr=C3=B6m?= , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Aleksandr Mezin , Jean Delvare , Guenter Roeck , Pavel Machek , Lee Jones , Sebastian Reichel , Matthias Brugger , AngeloGioacchino Del Regno , linux-gpio@vger.kernel.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-hwmon@vger.kernel.org, linux-leds@vger.kernel.org, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org References: <20240222145838.12916-1-kabel@kernel.org> From: Matthew Auld In-Reply-To: <20240222145838.12916-1-kabel@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-BeenThere: intel-xe@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel Xe graphics driver List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-xe-bounces@lists.freedesktop.org Sender: "Intel-xe" On 22/02/2024 14:58, Marek Behún wrote: > A few drivers are doing resource-managed mutex initialization by > implementing ad-hoc one-liner mutex dropping functions and using them > with devm_add_action_or_reset(). Help drivers avoid these repeated > one-liners by adding managed version of mutex initialization. > > Use the new function devm_mutex_init() in the following drivers: > drivers/gpio/gpio-pisosr.c > drivers/gpio/gpio-sim.c > drivers/gpu/drm/xe/xe_hwmon.c > drivers/hwmon/nzxt-smart2.c > drivers/leds/leds-is31fl319x.c > drivers/power/supply/mt6370-charger.c > drivers/power/supply/rt9467-charger.c > > Signed-off-by: Marek Behún > --- > drivers/gpio/gpio-pisosr.c | 9 ++----- > drivers/gpio/gpio-sim.c | 12 ++-------- > drivers/gpu/drm/xe/xe_hwmon.c | 11 ++------- > drivers/hwmon/nzxt-smart2.c | 9 ++----- > drivers/leds/leds-is31fl319x.c | 9 ++----- > drivers/power/supply/mt6370-charger.c | 11 +-------- > drivers/power/supply/rt9467-charger.c | 34 ++++----------------------- > include/linux/devm-helpers.h | 32 +++++++++++++++++++++++++ > 8 files changed, 47 insertions(+), 80 deletions(-) > > diff --git a/drivers/gpio/gpio-pisosr.c b/drivers/gpio/gpio-pisosr.c > index e3013e778e15..dddbf37e855f 100644 > --- a/drivers/gpio/gpio-pisosr.c > +++ b/drivers/gpio/gpio-pisosr.c > @@ -7,6 +7,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -116,11 +117,6 @@ static const struct gpio_chip template_chip = { > .can_sleep = true, > }; > > -static void pisosr_mutex_destroy(void *lock) > -{ > - mutex_destroy(lock); > -} > - > static int pisosr_gpio_probe(struct spi_device *spi) > { > struct device *dev = &spi->dev; > @@ -147,8 +143,7 @@ static int pisosr_gpio_probe(struct spi_device *spi) > return dev_err_probe(dev, PTR_ERR(gpio->load_gpio), > "Unable to allocate load GPIO\n"); > > - mutex_init(&gpio->lock); > - ret = devm_add_action_or_reset(dev, pisosr_mutex_destroy, &gpio->lock); > + ret = devm_mutex_init(dev, &gpio->lock); > if (ret) > return ret; > > diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c > index c4106e37e6db..fcfcaa4efe70 100644 > --- a/drivers/gpio/gpio-sim.c > +++ b/drivers/gpio/gpio-sim.c > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -307,13 +308,6 @@ static ssize_t gpio_sim_sysfs_pull_store(struct device *dev, > return len; > } > > -static void gpio_sim_mutex_destroy(void *data) > -{ > - struct mutex *lock = data; > - > - mutex_destroy(lock); > -} > - > static void gpio_sim_put_device(void *data) > { > struct device *dev = data; > @@ -457,9 +451,7 @@ static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev) > if (ret) > return ret; > > - mutex_init(&chip->lock); > - ret = devm_add_action_or_reset(dev, gpio_sim_mutex_destroy, > - &chip->lock); > + ret = devm_mutex_init(dev, &chip->lock); > if (ret) > return ret; > > diff --git a/drivers/gpu/drm/xe/xe_hwmon.c b/drivers/gpu/drm/xe/xe_hwmon.c > index 174ed2185481..bb88ae1c196c 100644 > --- a/drivers/gpu/drm/xe/xe_hwmon.c > +++ b/drivers/gpu/drm/xe/xe_hwmon.c > @@ -3,6 +3,7 @@ > * Copyright © 2023 Intel Corporation > */ > > +#include > #include > #include > #include > @@ -729,13 +730,6 @@ xe_hwmon_get_preregistration_info(struct xe_device *xe) > xe_hwmon_energy_get(hwmon, &energy); > } > > -static void xe_hwmon_mutex_destroy(void *arg) > -{ > - struct xe_hwmon *hwmon = arg; > - > - mutex_destroy(&hwmon->hwmon_lock); > -} > - > void xe_hwmon_register(struct xe_device *xe) > { > struct device *dev = xe->drm.dev; > @@ -751,8 +745,7 @@ void xe_hwmon_register(struct xe_device *xe) > > xe->hwmon = hwmon; > > - mutex_init(&hwmon->hwmon_lock); > - if (devm_add_action_or_reset(dev, xe_hwmon_mutex_destroy, hwmon)) > + if (devm_mutex_init(dev, &hwmon->hwmon_lock)) > return; > > /* primary GT to access device level properties */ > diff --git a/drivers/hwmon/nzxt-smart2.c b/drivers/hwmon/nzxt-smart2.c > index 7aa586eb74be..00bc89607673 100644 > --- a/drivers/hwmon/nzxt-smart2.c > +++ b/drivers/hwmon/nzxt-smart2.c > @@ -5,6 +5,7 @@ > * Copyright (c) 2021 Aleksandr Mezin > */ > > +#include > #include > #include > #include > @@ -721,11 +722,6 @@ static int __maybe_unused nzxt_smart2_hid_reset_resume(struct hid_device *hdev) > return init_device(drvdata, drvdata->update_interval); > } > > -static void mutex_fini(void *lock) > -{ > - mutex_destroy(lock); > -} > - > static int nzxt_smart2_hid_probe(struct hid_device *hdev, > const struct hid_device_id *id) > { > @@ -741,8 +737,7 @@ static int nzxt_smart2_hid_probe(struct hid_device *hdev, > > init_waitqueue_head(&drvdata->wq); > > - mutex_init(&drvdata->mutex); > - ret = devm_add_action_or_reset(&hdev->dev, mutex_fini, &drvdata->mutex); > + ret = devm_mutex_init(&hdev->dev, &drvdata->mutex); > if (ret) > return ret; > > diff --git a/drivers/leds/leds-is31fl319x.c b/drivers/leds/leds-is31fl319x.c > index 66c65741202e..e9d7cf6a386c 100644 > --- a/drivers/leds/leds-is31fl319x.c > +++ b/drivers/leds/leds-is31fl319x.c > @@ -8,6 +8,7 @@ > * effect LEDs. > */ > > +#include > #include > #include > #include > @@ -495,11 +496,6 @@ static inline int is31fl3196_db_to_gain(u32 dezibel) > return dezibel / IS31FL3196_AUDIO_GAIN_DB_STEP; > } > > -static void is31f1319x_mutex_destroy(void *lock) > -{ > - mutex_destroy(lock); > -} > - > static int is31fl319x_probe(struct i2c_client *client) > { > struct is31fl319x_chip *is31; > @@ -515,8 +511,7 @@ static int is31fl319x_probe(struct i2c_client *client) > if (!is31) > return -ENOMEM; > > - mutex_init(&is31->lock); > - err = devm_add_action_or_reset(dev, is31f1319x_mutex_destroy, &is31->lock); > + err = devm_mutex_init(dev, &is31->lock); > if (err) > return err; > > diff --git a/drivers/power/supply/mt6370-charger.c b/drivers/power/supply/mt6370-charger.c > index e24fce087d80..fa0517d0352d 100644 > --- a/drivers/power/supply/mt6370-charger.c > +++ b/drivers/power/supply/mt6370-charger.c > @@ -766,13 +766,6 @@ static int mt6370_chg_init_psy(struct mt6370_priv *priv) > return PTR_ERR_OR_ZERO(priv->psy); > } > > -static void mt6370_chg_destroy_attach_lock(void *data) > -{ > - struct mutex *attach_lock = data; > - > - mutex_destroy(attach_lock); > -} > - > static void mt6370_chg_destroy_wq(void *data) > { > struct workqueue_struct *wq = data; > @@ -900,9 +893,7 @@ static int mt6370_chg_probe(struct platform_device *pdev) > if (ret) > return dev_err_probe(dev, ret, "Failed to init psy\n"); > > - mutex_init(&priv->attach_lock); > - ret = devm_add_action_or_reset(dev, mt6370_chg_destroy_attach_lock, > - &priv->attach_lock); > + ret = devm_mutex_init(dev, &priv->attach_lock); > if (ret) > return dev_err_probe(dev, ret, "Failed to init attach lock\n"); > > diff --git a/drivers/power/supply/rt9467-charger.c b/drivers/power/supply/rt9467-charger.c > index fdfdc83ab045..84f07c22077f 100644 > --- a/drivers/power/supply/rt9467-charger.c > +++ b/drivers/power/supply/rt9467-charger.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -1149,27 +1150,6 @@ static int rt9467_reset_chip(struct rt9467_chg_data *data) > return regmap_field_write(data->rm_field[F_RST], 1); > } > > -static void rt9467_chg_destroy_adc_lock(void *data) > -{ > - struct mutex *adc_lock = data; > - > - mutex_destroy(adc_lock); > -} > - > -static void rt9467_chg_destroy_attach_lock(void *data) > -{ > - struct mutex *attach_lock = data; > - > - mutex_destroy(attach_lock); > -} > - > -static void rt9467_chg_destroy_ichg_ieoc_lock(void *data) > -{ > - struct mutex *ichg_ieoc_lock = data; > - > - mutex_destroy(ichg_ieoc_lock); > -} > - > static void rt9467_chg_complete_aicl_done(void *data) > { > struct completion *aicl_done = data; > @@ -1222,21 +1202,15 @@ static int rt9467_charger_probe(struct i2c_client *i2c) > if (ret) > return dev_err_probe(dev, ret, "Failed to add irq chip\n"); > > - mutex_init(&data->adc_lock); > - ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_adc_lock, > - &data->adc_lock); > + ret = devm_mutex_init(dev, &data->adc_lock); > if (ret) > return dev_err_probe(dev, ret, "Failed to init ADC lock\n"); > > - mutex_init(&data->attach_lock); > - ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_attach_lock, > - &data->attach_lock); > + ret = devm_mutex_init(dev, &data->attach_lock); > if (ret) > return dev_err_probe(dev, ret, "Failed to init attach lock\n"); > > - mutex_init(&data->ichg_ieoc_lock); > - ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_ichg_ieoc_lock, > - &data->ichg_ieoc_lock); > + ret = devm_mutex_init(dev, &data->ichg_ieoc_lock); > if (ret) > return dev_err_probe(dev, ret, "Failed to init ICHG/IEOC lock\n"); > > diff --git a/include/linux/devm-helpers.h b/include/linux/devm-helpers.h > index 74891802200d..70640fb96117 100644 > --- a/include/linux/devm-helpers.h > +++ b/include/linux/devm-helpers.h > @@ -24,6 +24,8 @@ > */ > > #include > +#include > +#include > #include > > static inline void devm_delayed_work_drop(void *res) > @@ -76,4 +78,34 @@ static inline int devm_work_autocancel(struct device *dev, > return devm_add_action(dev, devm_work_drop, w); > } > > +static inline void devm_mutex_drop(void *res) > +{ > + mutex_destroy(res); > +} > + > +/** > + * devm_mutex_init - Resource managed mutex initialization > + * @dev: Device which lifetime mutex is bound to > + * @lock: Mutex to be initialized (and automatically destroyed) > + * > + * Initialize mutex which is automatically destroyed when driver is detached. > + * A few drivers initialize mutexes which they want destroyed before driver is > + * detached, for debugging purposes. > + * devm_mutex_init() can be used to omit the explicit mutex_destroy() call when > + * driver is detached. > + */ > +static inline int devm_mutex_init(struct device *dev, struct mutex *lock) > +{ > + mutex_init(lock); Do you know if this this needs __always_inline? The static lockdep key in mutex_init() should be different for each caller class. See c21f11d182c2 ("drm: fix drmm_mutex_init()"). > + > + /* > + * mutex_destroy() is an empty function if CONFIG_DEBUG_MUTEXES is > + * disabled. No need to allocate an action in that case. > + */ > + if (IS_ENABLED(CONFIG_DEBUG_MUTEXES)) > + return devm_add_action_or_reset(dev, devm_mutex_drop, lock); > + else > + return 0; > +} > + > #endif 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 57F9EC54791 for ; Thu, 22 Feb 2024 16:44:35 +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-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=dOdIL/5fiCxn1K2aWbiewsKn9arHk7lEMQdgc7jUOlU=; b=oqx1sNOfWJ60MC ikXUt0V7GriQyw4ETsD86+N+6K+8gDrhuooEXkvE2ky8Jjn/GOkIwqhjDMr6F34yXmg5Tf+ADWpFq 6cc18VzNKvXFXM9VaswYNPiChgvNRTrtEtqf/4J4tsNA45Mqiz/9u+oBeN+snMYm+dO6/uJEyk+08 BihtdS8/VHfrTpSDko7uQlgo1yXTzdwyq6bhkSkzGLt2H1R62OvySNH46GSAgMNaB2PBOMu5QiauA tkKyXY8XmQUTeoFcsiPljPVnnXfGxJRb3c/scyP/XlwAEOJ+juHdxkx3vGMHHqhHw8SW/ecvaGvxh S96ruiUSl92DpaI+CWPA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rdCBI-00000005eBj-2XU2; Thu, 22 Feb 2024 16:44:20 +0000 Received: from mgamail.intel.com ([192.198.163.17]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rdCBF-00000005e7T-0VzU; Thu, 22 Feb 2024 16:44:18 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1708620257; x=1740156257; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=hzQJmorMTV5rdTl82QUGox6zoC899///hh48jdQr9E4=; b=l+Q5o+tatMPS9g1/wykNMJAzM/lb2GlbBL5kZGpwLbgllcsvwVRypG4X VyO9oA2X6AqjMPbjSJKnlDyZfFSC2ri9eyhneAHO2Nm4BsKwBcv7JSmzE izCgQow/aMkd7aU9PyRbnfAiwc/DNCMXvfNbljMXZsBFtaAp87N6HcIRZ WP2xaxXU3rOhQJWj+hVVlWr+8YUayj/3fGIyZtoqjS16+cKFoB72QRDJY 65o88BGGB9gK7i61Ut7h58Kr+47Z+KjEIerqXZXr26ABozWlbpYp33uRC 6Yl61s+GX7CIozLPyBY0TXBnDSnUxX4qYgNH+DJ9RHuPH8eFTIALOg8pN Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10992"; a="2718254" X-IronPort-AV: E=Sophos;i="6.06,179,1705392000"; d="scan'208";a="2718254" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by fmvoesa111.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Feb 2024 08:44:15 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.06,179,1705392000"; d="scan'208";a="10289434" Received: from mhaehnex-mobl1.ger.corp.intel.com (HELO [10.252.2.135]) ([10.252.2.135]) by orviesa005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Feb 2024 08:44:10 -0800 Message-ID: <03e62bcf-137c-4947-8f34-0cbfcba92a30@intel.com> Date: Thu, 22 Feb 2024 16:44:06 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/2] devm-helpers: Add resource managed version of mutex init Content-Language: en-GB To: =?UTF-8?Q?Marek_Beh=C3=BAn?= , linux-kernel@vger.kernel.org, Hans de Goede , Matti Vaittinen Cc: Linus Walleij , Bartosz Golaszewski , Lucas De Marchi , Oded Gabbay , =?UTF-8?Q?Thomas_Hellstr=C3=B6m?= , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Aleksandr Mezin , Jean Delvare , Guenter Roeck , Pavel Machek , Lee Jones , Sebastian Reichel , Matthias Brugger , AngeloGioacchino Del Regno , linux-gpio@vger.kernel.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-hwmon@vger.kernel.org, linux-leds@vger.kernel.org, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org References: <20240222145838.12916-1-kabel@kernel.org> From: Matthew Auld In-Reply-To: <20240222145838.12916-1-kabel@kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240222_084417_275142_BBD98CED X-CRM114-Status: GOOD ( 29.19 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjIvMDIvMjAyNCAxNDo1OCwgTWFyZWsgQmVow7puIHdyb3RlOgo+IEEgZmV3IGRyaXZlcnMg YXJlIGRvaW5nIHJlc291cmNlLW1hbmFnZWQgbXV0ZXggaW5pdGlhbGl6YXRpb24gYnkKPiBpbXBs ZW1lbnRpbmcgYWQtaG9jIG9uZS1saW5lciBtdXRleCBkcm9wcGluZyBmdW5jdGlvbnMgYW5kIHVz aW5nIHRoZW0KPiB3aXRoIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldCgpLiBIZWxwIGRyaXZlcnMg YXZvaWQgdGhlc2UgcmVwZWF0ZWQKPiBvbmUtbGluZXJzIGJ5IGFkZGluZyBtYW5hZ2VkIHZlcnNp b24gb2YgbXV0ZXggaW5pdGlhbGl6YXRpb24uCj4gCj4gVXNlIHRoZSBuZXcgZnVuY3Rpb24gZGV2 bV9tdXRleF9pbml0KCkgaW4gdGhlIGZvbGxvd2luZyBkcml2ZXJzOgo+ICAgIGRyaXZlcnMvZ3Bp by9ncGlvLXBpc29zci5jCj4gICAgZHJpdmVycy9ncGlvL2dwaW8tc2ltLmMKPiAgICBkcml2ZXJz L2dwdS9kcm0veGUveGVfaHdtb24uYwo+ICAgIGRyaXZlcnMvaHdtb24vbnp4dC1zbWFydDIuYwo+ ICAgIGRyaXZlcnMvbGVkcy9sZWRzLWlzMzFmbDMxOXguYwo+ICAgIGRyaXZlcnMvcG93ZXIvc3Vw cGx5L210NjM3MC1jaGFyZ2VyLmMKPiAgICBkcml2ZXJzL3Bvd2VyL3N1cHBseS9ydDk0NjctY2hh cmdlci5jCj4gCj4gU2lnbmVkLW9mZi1ieTogTWFyZWsgQmVow7puIDxrYWJlbEBrZXJuZWwub3Jn Pgo+IC0tLQo+ICAgZHJpdmVycy9ncGlvL2dwaW8tcGlzb3NyLmMgICAgICAgICAgICB8ICA5ICsr LS0tLS0KPiAgIGRyaXZlcnMvZ3Bpby9ncGlvLXNpbS5jICAgICAgICAgICAgICAgfCAxMiArKy0t LS0tLS0tCj4gICBkcml2ZXJzL2dwdS9kcm0veGUveGVfaHdtb24uYyAgICAgICAgIHwgMTEgKyst LS0tLS0tCj4gICBkcml2ZXJzL2h3bW9uL256eHQtc21hcnQyLmMgICAgICAgICAgIHwgIDkgKyst LS0tLQo+ICAgZHJpdmVycy9sZWRzL2xlZHMtaXMzMWZsMzE5eC5jICAgICAgICB8ICA5ICsrLS0t LS0KPiAgIGRyaXZlcnMvcG93ZXIvc3VwcGx5L210NjM3MC1jaGFyZ2VyLmMgfCAxMSArLS0tLS0t LS0KPiAgIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3J0OTQ2Ny1jaGFyZ2VyLmMgfCAzNCArKysrLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgIGluY2x1ZGUvbGludXgvZGV2bS1oZWxwZXJzLmggICAg ICAgICAgfCAzMiArKysrKysrKysrKysrKysrKysrKysrKysrCj4gICA4IGZpbGVzIGNoYW5nZWQs IDQ3IGluc2VydGlvbnMoKyksIDgwIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBpc29zci5jCj4gaW5k ZXggZTMwMTNlNzc4ZTE1Li5kZGRiZjM3ZTg1NWYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncGlv L2dwaW8tcGlzb3NyLmMKPiArKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYwo+IEBAIC03 LDYgKzcsNyBAQAo+ICAgI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgo+ICAgI2luY2x1ZGUgPGxp bnV4L2JpdG9wcy5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9kZXZtLWhlbHBlcnMuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+ Cj4gICAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KPiBAQCAtMTE2LDExICsxMTcsNiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9f Y2hpcCB0ZW1wbGF0ZV9jaGlwID0gewo+ICAgCS5jYW5fc2xlZXAJCT0gdHJ1ZSwKPiAgIH07Cj4g ICAKPiAtc3RhdGljIHZvaWQgcGlzb3NyX211dGV4X2Rlc3Ryb3kodm9pZCAqbG9jaykKPiAtewo+ IC0JbXV0ZXhfZGVzdHJveShsb2NrKTsKPiAtfQo+IC0KPiAgIHN0YXRpYyBpbnQgcGlzb3NyX2dw aW9fcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKPiAgIHsKPiAgIAlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSAmc3BpLT5kZXY7Cj4gQEAgLTE0Nyw4ICsxNDMsNyBAQCBzdGF0aWMgaW50IHBpc29z cl9ncGlvX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCj4gICAJCXJldHVybiBkZXZfZXJy X3Byb2JlKGRldiwgUFRSX0VSUihncGlvLT5sb2FkX2dwaW8pLAo+ICAgCQkJCSAgICAgIlVuYWJs ZSB0byBhbGxvY2F0ZSBsb2FkIEdQSU9cbiIpOwo+ICAgCj4gLQltdXRleF9pbml0KCZncGlvLT5s b2NrKTsKPiAtCXJldCA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIHBpc29zcl9tdXRl eF9kZXN0cm95LCAmZ3Bpby0+bG9jayk7Cj4gKwlyZXQgPSBkZXZtX211dGV4X2luaXQoZGV2LCAm Z3Bpby0+bG9jayk7Cj4gICAJaWYgKHJldCkKPiAgIAkJcmV0dXJuIHJldDsKPiAgIAo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zaW0uYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNpbS5j Cj4gaW5kZXggYzQxMDZlMzdlNmRiLi5mY2ZjYWE0ZWZlNzAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncGlvL2dwaW8tc2ltLmMKPiArKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zaW0uYwo+IEBAIC0x Miw2ICsxMiw3IEBACj4gICAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgo+ICAgI2luY2x1 ZGUgPGxpbnV4L2NvbmZpZ2ZzLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9kZXZtLWhlbHBlcnMuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9lcnIuaD4K PiAgICNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Cj4gICAjaW5jbHVkZSA8bGludXgv Z3Bpby9kcml2ZXIuaD4KPiBAQCAtMzA3LDEzICszMDgsNiBAQCBzdGF0aWMgc3NpemVfdCBncGlv X3NpbV9zeXNmc19wdWxsX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiAgIAlyZXR1cm4gbGVu Owo+ICAgfQo+ICAgCj4gLXN0YXRpYyB2b2lkIGdwaW9fc2ltX211dGV4X2Rlc3Ryb3kodm9pZCAq ZGF0YSkKPiAtewo+IC0Jc3RydWN0IG11dGV4ICpsb2NrID0gZGF0YTsKPiAtCj4gLQltdXRleF9k ZXN0cm95KGxvY2spOwo+IC19Cj4gLQo+ICAgc3RhdGljIHZvaWQgZ3Bpb19zaW1fcHV0X2Rldmlj ZSh2b2lkICpkYXRhKQo+ICAgewo+ICAgCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7Cj4gQEAg LTQ1Nyw5ICs0NTEsNyBAQCBzdGF0aWMgaW50IGdwaW9fc2ltX2FkZF9iYW5rKHN0cnVjdCBmd25v ZGVfaGFuZGxlICpzd25vZGUsIHN0cnVjdCBkZXZpY2UgKmRldikKPiAgIAlpZiAocmV0KQo+ICAg CQlyZXR1cm4gcmV0Owo+ICAgCj4gLQltdXRleF9pbml0KCZjaGlwLT5sb2NrKTsKPiAtCXJldCA9 IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGdwaW9fc2ltX211dGV4X2Rlc3Ryb3ksCj4g LQkJCQkgICAgICAgJmNoaXAtPmxvY2spOwo+ICsJcmV0ID0gZGV2bV9tdXRleF9pbml0KGRldiwg JmNoaXAtPmxvY2spOwo+ICAgCWlmIChyZXQpCj4gICAJCXJldHVybiByZXQ7Cj4gICAKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3hlL3hlX2h3bW9uLmMgYi9kcml2ZXJzL2dwdS9kcm0v eGUveGVfaHdtb24uYwo+IGluZGV4IDE3NGVkMjE4NTQ4MS4uYmI4OGFlMWMxOTZjIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS94ZS94ZV9od21vbi5jCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3hlL3hlX2h3bW9uLmMKPiBAQCAtMyw2ICszLDcgQEAKPiAgICAqIENvcHlyaWdodCDCqSAy MDIzIEludGVsIENvcnBvcmF0aW9uCj4gICAgKi8KPiAgIAo+ICsjaW5jbHVkZSA8bGludXgvZGV2 bS1oZWxwZXJzLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KPiAgICNpbmNs dWRlIDxsaW51eC9od21vbi5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gQEAgLTcy OSwxMyArNzMwLDYgQEAgeGVfaHdtb25fZ2V0X3ByZXJlZ2lzdHJhdGlvbl9pbmZvKHN0cnVjdCB4 ZV9kZXZpY2UgKnhlKQo+ICAgCQl4ZV9od21vbl9lbmVyZ3lfZ2V0KGh3bW9uLCAmZW5lcmd5KTsK PiAgIH0KPiAgIAo+IC1zdGF0aWMgdm9pZCB4ZV9od21vbl9tdXRleF9kZXN0cm95KHZvaWQgKmFy ZykKPiAtewo+IC0Jc3RydWN0IHhlX2h3bW9uICpod21vbiA9IGFyZzsKPiAtCj4gLQltdXRleF9k ZXN0cm95KCZod21vbi0+aHdtb25fbG9jayk7Cj4gLX0KPiAtCj4gICB2b2lkIHhlX2h3bW9uX3Jl Z2lzdGVyKHN0cnVjdCB4ZV9kZXZpY2UgKnhlKQo+ICAgewo+ICAgCXN0cnVjdCBkZXZpY2UgKmRl diA9IHhlLT5kcm0uZGV2Owo+IEBAIC03NTEsOCArNzQ1LDcgQEAgdm9pZCB4ZV9od21vbl9yZWdp c3RlcihzdHJ1Y3QgeGVfZGV2aWNlICp4ZSkKPiAgIAo+ICAgCXhlLT5od21vbiA9IGh3bW9uOwo+ ICAgCj4gLQltdXRleF9pbml0KCZod21vbi0+aHdtb25fbG9jayk7Cj4gLQlpZiAoZGV2bV9hZGRf YWN0aW9uX29yX3Jlc2V0KGRldiwgeGVfaHdtb25fbXV0ZXhfZGVzdHJveSwgaHdtb24pKQo+ICsJ aWYgKGRldm1fbXV0ZXhfaW5pdChkZXYsICZod21vbi0+aHdtb25fbG9jaykpCj4gICAJCXJldHVy bjsKPiAgIAo+ICAgCS8qIHByaW1hcnkgR1QgdG8gYWNjZXNzIGRldmljZSBsZXZlbCBwcm9wZXJ0 aWVzICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbnp4dC1zbWFydDIuYyBiL2RyaXZl cnMvaHdtb24vbnp4dC1zbWFydDIuYwo+IGluZGV4IDdhYTU4NmViNzRiZS4uMDBiYzg5NjA3Njcz IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvaHdtb24vbnp4dC1zbWFydDIuYwo+ICsrKyBiL2RyaXZl cnMvaHdtb24vbnp4dC1zbWFydDIuYwo+IEBAIC01LDYgKzUsNyBAQAo+ICAgICogQ29weXJpZ2h0 IChjKSAyMDIxIEFsZWtzYW5kciBNZXppbgo+ICAgICovCj4gICAKPiArI2luY2x1ZGUgPGxpbnV4 L2Rldm0taGVscGVycy5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgo+ICAgI2luY2x1ZGUg PGxpbnV4L2h3bW9uLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvbWF0aC5oPgo+IEBAIC03MjEsMTEg KzcyMiw2IEBAIHN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbnp4dF9zbWFydDJfaGlkX3Jlc2V0 X3Jlc3VtZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKPiAgIAlyZXR1cm4gaW5pdF9kZXZpY2Uo ZHJ2ZGF0YSwgZHJ2ZGF0YS0+dXBkYXRlX2ludGVydmFsKTsKPiAgIH0KPiAgIAo+IC1zdGF0aWMg dm9pZCBtdXRleF9maW5pKHZvaWQgKmxvY2spCj4gLXsKPiAtCW11dGV4X2Rlc3Ryb3kobG9jayk7 Cj4gLX0KPiAtCj4gICBzdGF0aWMgaW50IG56eHRfc21hcnQyX2hpZF9wcm9iZShzdHJ1Y3QgaGlk X2RldmljZSAqaGRldiwKPiAgIAkJCQkgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQo+ ICAgewo+IEBAIC03NDEsOCArNzM3LDcgQEAgc3RhdGljIGludCBuenh0X3NtYXJ0Ml9oaWRfcHJv YmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCj4gICAKPiAgIAlpbml0X3dhaXRxdWV1ZV9oZWFk KCZkcnZkYXRhLT53cSk7Cj4gICAKPiAtCW11dGV4X2luaXQoJmRydmRhdGEtPm11dGV4KTsKPiAt CXJldCA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldCgmaGRldi0+ZGV2LCBtdXRleF9maW5pLCAm ZHJ2ZGF0YS0+bXV0ZXgpOwo+ICsJcmV0ID0gZGV2bV9tdXRleF9pbml0KCZoZGV2LT5kZXYsICZk cnZkYXRhLT5tdXRleCk7Cj4gICAJaWYgKHJldCkKPiAgIAkJcmV0dXJuIHJldDsKPiAgIAo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMgYi9kcml2ZXJzL2xlZHMv bGVkcy1pczMxZmwzMTl4LmMKPiBpbmRleCA2NmM2NTc0MTIwMmUuLmU5ZDdjZjZhMzg2YyAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMKPiArKysgYi9kcml2ZXJz L2xlZHMvbGVkcy1pczMxZmwzMTl4LmMKPiBAQCAtOCw2ICs4LDcgQEAKPiAgICAqIGVmZmVjdCBM RURzLgo+ICAgICovCj4gICAKPiArI2luY2x1ZGUgPGxpbnV4L2Rldm0taGVscGVycy5oPgo+ICAg I2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ICAgI2lu Y2x1ZGUgPGxpbnV4L2xlZHMuaD4KPiBAQCAtNDk1LDExICs0OTYsNiBAQCBzdGF0aWMgaW5saW5l IGludCBpczMxZmwzMTk2X2RiX3RvX2dhaW4odTMyIGRlemliZWwpCj4gICAJcmV0dXJuIGRlemli ZWwgLyBJUzMxRkwzMTk2X0FVRElPX0dBSU5fREJfU1RFUDsKPiAgIH0KPiAgIAo+IC1zdGF0aWMg dm9pZCBpczMxZjEzMTl4X211dGV4X2Rlc3Ryb3kodm9pZCAqbG9jaykKPiAtewo+IC0JbXV0ZXhf ZGVzdHJveShsb2NrKTsKPiAtfQo+IC0KPiAgIHN0YXRpYyBpbnQgaXMzMWZsMzE5eF9wcm9iZShz dHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQo+ICAgewo+ICAgCXN0cnVjdCBpczMxZmwzMTl4X2No aXAgKmlzMzE7Cj4gQEAgLTUxNSw4ICs1MTEsNyBAQCBzdGF0aWMgaW50IGlzMzFmbDMxOXhfcHJv YmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKPiAgIAlpZiAoIWlzMzEpCj4gICAJCXJldHVy biAtRU5PTUVNOwo+ICAgCj4gLQltdXRleF9pbml0KCZpczMxLT5sb2NrKTsKPiAtCWVyciA9IGRl dm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGlzMzFmMTMxOXhfbXV0ZXhfZGVzdHJveSwgJmlz MzEtPmxvY2spOwo+ICsJZXJyID0gZGV2bV9tdXRleF9pbml0KGRldiwgJmlzMzEtPmxvY2spOwo+ ICAgCWlmIChlcnIpCj4gICAJCXJldHVybiBlcnI7Cj4gICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9wb3dlci9zdXBwbHkvbXQ2MzcwLWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L210 NjM3MC1jaGFyZ2VyLmMKPiBpbmRleCBlMjRmY2UwODdkODAuLmZhMDUxN2QwMzUyZCAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tdDYzNzAtY2hhcmdlci5jCj4gKysrIGIvZHJp dmVycy9wb3dlci9zdXBwbHkvbXQ2MzcwLWNoYXJnZXIuYwo+IEBAIC03NjYsMTMgKzc2Niw2IEBA IHN0YXRpYyBpbnQgbXQ2MzcwX2NoZ19pbml0X3BzeShzdHJ1Y3QgbXQ2MzcwX3ByaXYgKnByaXYp Cj4gICAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwcml2LT5wc3kpOwo+ICAgfQo+ICAgCj4gLXN0 YXRpYyB2b2lkIG10NjM3MF9jaGdfZGVzdHJveV9hdHRhY2hfbG9jayh2b2lkICpkYXRhKQo+IC17 Cj4gLQlzdHJ1Y3QgbXV0ZXggKmF0dGFjaF9sb2NrID0gZGF0YTsKPiAtCj4gLQltdXRleF9kZXN0 cm95KGF0dGFjaF9sb2NrKTsKPiAtfQo+IC0KPiAgIHN0YXRpYyB2b2lkIG10NjM3MF9jaGdfZGVz dHJveV93cSh2b2lkICpkYXRhKQo+ICAgewo+ICAgCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3 cSA9IGRhdGE7Cj4gQEAgLTkwMCw5ICs4OTMsNyBAQCBzdGF0aWMgaW50IG10NjM3MF9jaGdfcHJv YmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgIAlpZiAocmV0KQo+ICAgCQlyZXR1 cm4gZGV2X2Vycl9wcm9iZShkZXYsIHJldCwgIkZhaWxlZCB0byBpbml0IHBzeVxuIik7Cj4gICAK PiAtCW11dGV4X2luaXQoJnByaXYtPmF0dGFjaF9sb2NrKTsKPiAtCXJldCA9IGRldm1fYWRkX2Fj dGlvbl9vcl9yZXNldChkZXYsIG10NjM3MF9jaGdfZGVzdHJveV9hdHRhY2hfbG9jaywKPiAtCQkJ CSAgICAgICAmcHJpdi0+YXR0YWNoX2xvY2spOwo+ICsJcmV0ID0gZGV2bV9tdXRleF9pbml0KGRl diwgJnByaXYtPmF0dGFjaF9sb2NrKTsKPiAgIAlpZiAocmV0KQo+ICAgCQlyZXR1cm4gZGV2X2Vy cl9wcm9iZShkZXYsIHJldCwgIkZhaWxlZCB0byBpbml0IGF0dGFjaCBsb2NrXG4iKTsKPiAgIAo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9ydDk0NjctY2hhcmdlci5jIGIvZHJp dmVycy9wb3dlci9zdXBwbHkvcnQ5NDY3LWNoYXJnZXIuYwo+IGluZGV4IGZkZmRjODNhYjA0NS4u ODRmMDdjMjIwNzdmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3J0OTQ2Ny1j aGFyZ2VyLmMKPiArKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9ydDk0NjctY2hhcmdlci5jCj4g QEAgLTEwLDYgKzEwLDcgQEAKPiAgICNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgo+ICAgI2lu Y2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KPiAgICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+ ICsjaW5jbHVkZSA8bGludXgvZGV2bS1oZWxwZXJzLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvZ3Bp by9jb25zdW1lci5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ICAgI2luY2x1ZGUgPGxp bnV4L2ludGVycnVwdC5oPgo+IEBAIC0xMTQ5LDI3ICsxMTUwLDYgQEAgc3RhdGljIGludCBydDk0 NjdfcmVzZXRfY2hpcChzdHJ1Y3QgcnQ5NDY3X2NoZ19kYXRhICpkYXRhKQo+ICAgCXJldHVybiBy ZWdtYXBfZmllbGRfd3JpdGUoZGF0YS0+cm1fZmllbGRbRl9SU1RdLCAxKTsKPiAgIH0KPiAgIAo+ IC1zdGF0aWMgdm9pZCBydDk0NjdfY2hnX2Rlc3Ryb3lfYWRjX2xvY2sodm9pZCAqZGF0YSkKPiAt ewo+IC0Jc3RydWN0IG11dGV4ICphZGNfbG9jayA9IGRhdGE7Cj4gLQo+IC0JbXV0ZXhfZGVzdHJv eShhZGNfbG9jayk7Cj4gLX0KPiAtCj4gLXN0YXRpYyB2b2lkIHJ0OTQ2N19jaGdfZGVzdHJveV9h dHRhY2hfbG9jayh2b2lkICpkYXRhKQo+IC17Cj4gLQlzdHJ1Y3QgbXV0ZXggKmF0dGFjaF9sb2Nr ID0gZGF0YTsKPiAtCj4gLQltdXRleF9kZXN0cm95KGF0dGFjaF9sb2NrKTsKPiAtfQo+IC0KPiAt c3RhdGljIHZvaWQgcnQ5NDY3X2NoZ19kZXN0cm95X2ljaGdfaWVvY19sb2NrKHZvaWQgKmRhdGEp Cj4gLXsKPiAtCXN0cnVjdCBtdXRleCAqaWNoZ19pZW9jX2xvY2sgPSBkYXRhOwo+IC0KPiAtCW11 dGV4X2Rlc3Ryb3koaWNoZ19pZW9jX2xvY2spOwo+IC19Cj4gLQo+ICAgc3RhdGljIHZvaWQgcnQ5 NDY3X2NoZ19jb21wbGV0ZV9haWNsX2RvbmUodm9pZCAqZGF0YSkKPiAgIHsKPiAgIAlzdHJ1Y3Qg Y29tcGxldGlvbiAqYWljbF9kb25lID0gZGF0YTsKPiBAQCAtMTIyMiwyMSArMTIwMiwxNSBAQCBz dGF0aWMgaW50IHJ0OTQ2N19jaGFyZ2VyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCj4g ICAJaWYgKHJldCkKPiAgIAkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCByZXQsICJGYWlsZWQg dG8gYWRkIGlycSBjaGlwXG4iKTsKPiAgIAo+IC0JbXV0ZXhfaW5pdCgmZGF0YS0+YWRjX2xvY2sp Owo+IC0JcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KGRldiwgcnQ5NDY3X2NoZ19kZXN0 cm95X2FkY19sb2NrLAo+IC0JCQkJICAgICAgICZkYXRhLT5hZGNfbG9jayk7Cj4gKwlyZXQgPSBk ZXZtX211dGV4X2luaXQoZGV2LCAmZGF0YS0+YWRjX2xvY2spOwo+ICAgCWlmIChyZXQpCj4gICAJ CXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LCAiRmFpbGVkIHRvIGluaXQgQURDIGxvY2tc biIpOwo+ICAgCj4gLQltdXRleF9pbml0KCZkYXRhLT5hdHRhY2hfbG9jayk7Cj4gLQlyZXQgPSBk ZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQoZGV2LCBydDk0NjdfY2hnX2Rlc3Ryb3lfYXR0YWNoX2xv Y2ssCj4gLQkJCQkgICAgICAgJmRhdGEtPmF0dGFjaF9sb2NrKTsKPiArCXJldCA9IGRldm1fbXV0 ZXhfaW5pdChkZXYsICZkYXRhLT5hdHRhY2hfbG9jayk7Cj4gICAJaWYgKHJldCkKPiAgIAkJcmV0 dXJuIGRldl9lcnJfcHJvYmUoZGV2LCByZXQsICJGYWlsZWQgdG8gaW5pdCBhdHRhY2ggbG9ja1xu Iik7Cj4gICAKPiAtCW11dGV4X2luaXQoJmRhdGEtPmljaGdfaWVvY19sb2NrKTsKPiAtCXJldCA9 IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIHJ0OTQ2N19jaGdfZGVzdHJveV9pY2hnX2ll b2NfbG9jaywKPiAtCQkJCSAgICAgICAmZGF0YS0+aWNoZ19pZW9jX2xvY2spOwo+ICsJcmV0ID0g ZGV2bV9tdXRleF9pbml0KGRldiwgJmRhdGEtPmljaGdfaWVvY19sb2NrKTsKPiAgIAlpZiAocmV0 KQo+ICAgCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIHJldCwgIkZhaWxlZCB0byBpbml0IElD SEcvSUVPQyBsb2NrXG4iKTsKPiAgIAo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Rldm0t aGVscGVycy5oIGIvaW5jbHVkZS9saW51eC9kZXZtLWhlbHBlcnMuaAo+IGluZGV4IDc0ODkxODAy MjAwZC4uNzA2NDBmYjk2MTE3IDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvbGludXgvZGV2bS1oZWxw ZXJzLmgKPiArKysgYi9pbmNsdWRlL2xpbnV4L2Rldm0taGVscGVycy5oCj4gQEAgLTI0LDYgKzI0 LDggQEAKPiAgICAqLwo+ICAgCj4gICAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9rY29uZmlnLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgo+ICAgI2lu Y2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgo+ICAgCj4gICBzdGF0aWMgaW5saW5lIHZvaWQgZGV2 bV9kZWxheWVkX3dvcmtfZHJvcCh2b2lkICpyZXMpCj4gQEAgLTc2LDQgKzc4LDM0IEBAIHN0YXRp YyBpbmxpbmUgaW50IGRldm1fd29ya19hdXRvY2FuY2VsKHN0cnVjdCBkZXZpY2UgKmRldiwKPiAg IAlyZXR1cm4gZGV2bV9hZGRfYWN0aW9uKGRldiwgZGV2bV93b3JrX2Ryb3AsIHcpOwo+ICAgfQo+ ICAgCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZtX211dGV4X2Ryb3Aodm9pZCAqcmVzKQo+ICt7 Cj4gKwltdXRleF9kZXN0cm95KHJlcyk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkZXZtX211dGV4 X2luaXQgLSBSZXNvdXJjZSBtYW5hZ2VkIG11dGV4IGluaXRpYWxpemF0aW9uCj4gKyAqIEBkZXY6 CURldmljZSB3aGljaCBsaWZldGltZSBtdXRleCBpcyBib3VuZCB0bwo+ICsgKiBAbG9jazoJTXV0 ZXggdG8gYmUgaW5pdGlhbGl6ZWQgKGFuZCBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCkKPiArICoK PiArICogSW5pdGlhbGl6ZSBtdXRleCB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCB3 aGVuIGRyaXZlciBpcyBkZXRhY2hlZC4KPiArICogQSBmZXcgZHJpdmVycyBpbml0aWFsaXplIG11 dGV4ZXMgd2hpY2ggdGhleSB3YW50IGRlc3Ryb3llZCBiZWZvcmUgZHJpdmVyIGlzCj4gKyAqIGRl dGFjaGVkLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgo+ICsgKiBkZXZtX211dGV4X2luaXQoKSBj YW4gYmUgdXNlZCB0byBvbWl0IHRoZSBleHBsaWNpdCBtdXRleF9kZXN0cm95KCkgY2FsbCB3aGVu Cj4gKyAqIGRyaXZlciBpcyBkZXRhY2hlZC4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50IGRl dm1fbXV0ZXhfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtdXRleCAqbG9jaykKPiAr ewo+ICsJbXV0ZXhfaW5pdChsb2NrKTsKCkRvIHlvdSBrbm93IGlmIHRoaXMgdGhpcyBuZWVkcyBf X2Fsd2F5c19pbmxpbmU/IFRoZSBzdGF0aWMgbG9ja2RlcCBrZXkgCmluIG11dGV4X2luaXQoKSBz aG91bGQgYmUgZGlmZmVyZW50IGZvciBlYWNoIGNhbGxlciBjbGFzcy4gU2VlIApjMjFmMTFkMTgy YzIgKCJkcm06IGZpeCBkcm1tX211dGV4X2luaXQoKSIpLgoKPiArCj4gKwkvKgo+ICsJICogbXV0 ZXhfZGVzdHJveSgpIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGlmIENPTkZJR19ERUJVR19NVVRFWEVT IGlzCj4gKwkgKiBkaXNhYmxlZC4gTm8gbmVlZCB0byBhbGxvY2F0ZSBhbiBhY3Rpb24gaW4gdGhh dCBjYXNlLgo+ICsJICovCj4gKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfREVCVUdfTVVURVhFUykp Cj4gKwkJcmV0dXJuIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGRldm1fbXV0ZXhfZHJv cCwgbG9jayk7Cj4gKwllbHNlCj4gKwkJcmV0dXJuIDA7Cj4gK30KPiArCj4gICAjZW5kaWYKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK