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=-6.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 63F27C55191 for ; Thu, 23 Apr 2020 17:57:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4023620663 for ; Thu, 23 Apr 2020 17:57:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="d9/G8/mm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730001AbgDWR5S (ORCPT ); Thu, 23 Apr 2020 13:57:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48166 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729924AbgDWR5R (ORCPT ); Thu, 23 Apr 2020 13:57:17 -0400 Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A3A5C09B045 for ; Thu, 23 Apr 2020 10:57:17 -0700 (PDT) Received: by mail-wr1-x441.google.com with SMTP id k1so7913433wrx.4 for ; Thu, 23 Apr 2020 10:57:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=d9/G8/mm1s6L7U3grcrEtILx0VltO1cSLr9xd4Th5rnmfCECHODYPAQ0aO21o3IwGg 9VNKbfx6NWZUcdSr9v8HKX2+nMaRgSKRlfadsYoGQdlqgEqTKlxTs7An4FwHmf9BnwCo iCyN465/N3DmU+Ka1WexrnY/usLFGoUbWnLPaJ+LmUXqKshiJUE+Hxhly097fmrbyfkx EZnhrBKkW2EKPTiOqC93lCk34rbf/RL/7Oi6vrZpec06JT1mzH7f9zwJHpd6nTRaokjA VVFuVqsMDVnX61YrbxeBo+1/bHB839FVondm/j53B8LD03vwQwTzfayVz25EsQhr37hg ZodQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=Nh5UAdz+TPxwmICmRRNmygzWl8pAlt3DpF36sH/JlIy2i0Vfvj7zhTAmMZm4vjQWr7 Nu4VVRQK/UqhCs/MZlUN/6BiI5F+dN8r2cEXguJCyFDJHEJ77ckWAC8N2waARIiy/gZI cmnPH68lG8KM3beW6B4z2G2HP/sCJIDYFNwhijCtUDooOp2VkX1Z7Xb7Lt5spnVwYiQx +uGY9ANjmhkUIh+8Li6RR5NEAv7PXZtlUMMS5Z7AE7ySYj21RyRD+k0D76y6SB00CWgU rVjDDBkyzSo/Z23yV7hVJGnTD3lSX29xPM37UPnuCOqxb3MNzA15wt75mNLhI43+Y+Vr ZAWQ== X-Gm-Message-State: AGi0PuaEecAsuu5ec9/fKTOmH3HLIJmWLq4wAT/KYgKp38hQWHCJrT6z FSIKWRUIrnDHOUMzM6FugNxoyg== X-Google-Smtp-Source: APiQypJl+oEUyy7z0GtqEAxyqDXffHB5kQWgiibXowQIt/FHM/GqoWI3jwvWyT/gnQK8/Affz/K20w== X-Received: by 2002:a5d:4e06:: with SMTP id p6mr6069297wrt.35.1587664635462; Thu, 23 Apr 2020 10:57:15 -0700 (PDT) Received: from linaro.org ([37.167.216.250]) by smtp.gmail.com with ESMTPSA id t8sm4719117wrq.88.2020.04.23.10.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2020 10:57:14 -0700 (PDT) Date: Thu, 23 Apr 2020 19:57:08 +0200 From: Daniel Lezcano To: Lukasz Luba Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-omap@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-imx@nxp.com, Dietmar.Eggemann@arm.com, cw00.choi@samsung.com, b.zolnierkie@samsung.com, rjw@rjwysocki.net, sudeep.holla@arm.com, viresh.kumar@linaro.org, nm@ti.com, sboyd@kernel.org, rui.zhang@intel.com, amit.kucheria@verdurent.com, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, rostedt@goodmis.org, qperret@google.com, bsegall@google.com, mgorman@suse.de, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, kernel@pengutronix.de, khilman@kernel.org, agross@kernel.org, bjorn.andersson@linaro.org, robh@kernel.org, matthias.bgg@gmail.com, steven.price@arm.com, tomeu.vizoso@collabora.com, alyssa.rosenzweig@collabora.com, airlied@linux.ie, daniel@ffwll.ch, liviu.dudau@arm.com, lorenzo.pieralisi@arm.com, patrick.bellasi@matbug.net, orjan.eide@arm.com, rdunlap@infradead.org, mka@chromium.org Subject: Re: [PATCH v6 09/10] thermal: devfreq_cooling: Refactor code and switch to use Energy Model Message-ID: <20200423175708.GG65632@linaro.org> References: <20200410084210.24932-1-lukasz.luba@arm.com> <20200410084210.24932-10-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20200410084210.24932-10-lukasz.luba@arm.com> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On Fri, Apr 10, 2020 at 09:42:09AM +0100, Lukasz Luba wrote: > The overhauled Energy Model (EM) framework support also devfreq devices. > The unified API interface of the EM can be used in the thermal subsystem to > not duplicate code. The power table now is taken from EM structure and > there is no need to maintain calculation for it locally. In case when the > EM is not provided by the device a simple interface for cooling device is > used. > > [lkp: Reported the build warning] > Reported-by: kbuild test robot > Reviewed-by: Steven Rostedt (VMware) # for tracing code > Signed-off-by: Lukasz Luba Is it possible to split this patch into smaller parts? It is hard to understand what is related to the em conversion and other changes which look not related so far. > --- > drivers/thermal/devfreq_cooling.c | 474 ++++++++++++++++-------------- > include/linux/devfreq_cooling.h | 39 +-- > include/trace/events/thermal.h | 19 +- > 3 files changed, 277 insertions(+), 255 deletions(-) > > diff --git a/drivers/thermal/devfreq_cooling.c b/drivers/thermal/devfreq_cooling.c > index f7f32e98331b..32df5f55bde8 100644 > --- a/drivers/thermal/devfreq_cooling.c > +++ b/drivers/thermal/devfreq_cooling.c > @@ -1,17 +1,9 @@ > +// SPDX-License-Identifier: GPL-2.0 > /* > * devfreq_cooling: Thermal cooling device implementation for devices using > * devfreq > * > - * Copyright (C) 2014-2015 ARM Limited > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 as > - * published by the Free Software Foundation. > - * > - * This program is distributed "as is" WITHOUT ANY WARRANTY of any > - * kind, whether express or implied; without even the implied warranty > - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > + * Copyright (C) 2014-2020 ARM Limited > * > * TODO: > * - If OPPs are added or removed after devfreq cooling has > @@ -41,36 +33,33 @@ static DEFINE_IDA(devfreq_ida); > * @cdev: Pointer to associated thermal cooling device. > * @devfreq: Pointer to associated devfreq device. > * @cooling_state: Current cooling state. > - * @power_table: Pointer to table with maximum power draw for each > - * cooling state. State is the index into the table, and > - * the power is in mW. > - * @freq_table: Pointer to a table with the frequencies sorted in descending > - * order. You can index the table by cooling device state > - * @freq_table_size: Size of the @freq_table and @power_table > - * @power_ops: Pointer to devfreq_cooling_power, used to generate the > - * @power_table. > + * @freq_table: Pointer to a table with the frequencies. > + * @max_state: It is the last index, that is, one less than the number of the > + * OPPs > + * @power_ops: Pointer to devfreq_cooling_power, a more precised model. > * @res_util: Resource utilization scaling factor for the power. > * It is multiplied by 100 to minimize the error. It is used > * for estimation of the power budget instead of using > - * 'utilization' (which is 'busy_time / 'total_time'). > - * The 'res_util' range is from 100 to (power_table[state] * 100) > - * for the corresponding 'state'. > - * @capped_state: index to cooling state with in dynamic power budget > + * 'utilization' (which is 'busy_time' / 'total_time'). > + * The 'res_util' range is from 100 to power * 100 for the > + * corresponding 'state'. > * @req_max_freq: PM QoS request for limiting the maximum frequency > * of the devfreq device. > + * @em: Energy Model which represents the associated Devfreq device > + * @em_registered: Devfreq cooling registered the EM and should free it. > */ > struct devfreq_cooling_device { > int id; > struct thermal_cooling_device *cdev; > struct devfreq *devfreq; > unsigned long cooling_state; > - u32 *power_table; > u32 *freq_table; > - size_t freq_table_size; > + size_t max_state; > struct devfreq_cooling_power *power_ops; > u32 res_util; > - int capped_state; > struct dev_pm_qos_request req_max_freq; > + struct em_perf_domain *em; > + bool em_registered; > }; > > static int devfreq_cooling_get_max_state(struct thermal_cooling_device *cdev, > @@ -78,7 +67,7 @@ static int devfreq_cooling_get_max_state(struct thermal_cooling_device *cdev, > { > struct devfreq_cooling_device *dfc = cdev->devdata; > > - *state = dfc->freq_table_size - 1; > + *state = dfc->max_state; > > return 0; > } > @@ -106,10 +95,16 @@ static int devfreq_cooling_set_cur_state(struct thermal_cooling_device *cdev, > > dev_dbg(dev, "Setting cooling state %lu\n", state); > > - if (state >= dfc->freq_table_size) > + if (state > dfc->max_state) > return -EINVAL; > > - freq = dfc->freq_table[state]; > + if (dfc->em) { > + /* Energy Model frequencies are in kHz */ > + freq = dfc->em->table[dfc->max_state - state].frequency; > + freq *= 1000; > + } else { > + freq = dfc->freq_table[state]; > + } > > dev_pm_qos_update_request(&dfc->req_max_freq, > DIV_ROUND_UP(freq, HZ_PER_KHZ)); > @@ -120,11 +115,11 @@ static int devfreq_cooling_set_cur_state(struct thermal_cooling_device *cdev, > } > > /** > - * freq_get_state() - get the cooling state corresponding to a frequency > + * freq_get_state() - get the performance index corresponding to a frequency > * @dfc: Pointer to devfreq cooling device > - * @freq: frequency in Hz > + * @freq: frequency in kHz > * > - * Return: the cooling state associated with the @freq, or > + * Return: the performance index associated with the @freq, or > * THERMAL_CSTATE_INVALID if it wasn't found. > */ > static unsigned long > @@ -132,8 +127,8 @@ freq_get_state(struct devfreq_cooling_device *dfc, unsigned long freq) > { > int i; > > - for (i = 0; i < dfc->freq_table_size; i++) { > - if (dfc->freq_table[i] == freq) > + for (i = 0; i <= dfc->max_state; i++) { > + if (dfc->em->table[i].frequency == freq) > return i; > } > > @@ -168,132 +163,92 @@ static unsigned long get_voltage(struct devfreq *df, unsigned long freq) > return voltage; > } > > -/** > - * get_static_power() - calculate the static power > - * @dfc: Pointer to devfreq cooling device > - * @freq: Frequency in Hz > - * > - * Calculate the static power in milliwatts using the supplied > - * get_static_power(). The current voltage is calculated using the > - * OPP library. If no get_static_power() was supplied, assume the > - * static power is negligible. > - */ > -static unsigned long > -get_static_power(struct devfreq_cooling_device *dfc, unsigned long freq) > +static void dfc_em_get_requested_power(struct em_perf_domain *em, > + struct devfreq_dev_status *status, > + u32 *power, int em_perf_idx) > { > - struct devfreq *df = dfc->devfreq; > - unsigned long voltage; > + *power = em->table[em_perf_idx].power; > > - if (!dfc->power_ops->get_static_power) > - return 0; > - > - voltage = get_voltage(df, freq); > - > - if (voltage == 0) > - return 0; > - > - return dfc->power_ops->get_static_power(df, voltage); > + /* Scale power for utilization */ > + *power *= status->busy_time; > + *power /= status->total_time; > } > > -/** > - * get_dynamic_power - calculate the dynamic power > - * @dfc: Pointer to devfreq cooling device > - * @freq: Frequency in Hz > - * @voltage: Voltage in millivolts > - * > - * Calculate the dynamic power in milliwatts consumed by the device at > - * frequency @freq and voltage @voltage. If the get_dynamic_power() > - * was supplied as part of the devfreq_cooling_power struct, then that > - * function is used. Otherwise, a simple power model (Pdyn = Coeff * > - * Voltage^2 * Frequency) is used. > - */ > -static unsigned long > -get_dynamic_power(struct devfreq_cooling_device *dfc, unsigned long freq, > - unsigned long voltage) > +static void _normalize_load(struct devfreq_dev_status *status) > { > - u64 power; > - u32 freq_mhz; > - struct devfreq_cooling_power *dfc_power = dfc->power_ops; > - > - if (dfc_power->get_dynamic_power) > - return dfc_power->get_dynamic_power(dfc->devfreq, freq, > - voltage); > - > - freq_mhz = freq / 1000000; > - power = (u64)dfc_power->dyn_power_coeff * freq_mhz * voltage * voltage; > - do_div(power, 1000000000); > + /* Make some space if needed */ > + if (status->busy_time > 0xffff) { > + status->busy_time >>= 10; > + status->total_time >>= 10; > + } > > - return power; > -} > + if (status->busy_time > status->total_time) > + status->busy_time = status->total_time; > > + status->busy_time *= 100; > + status->busy_time /= status->total_time ? : 1; > > -static inline unsigned long get_total_power(struct devfreq_cooling_device *dfc, > - unsigned long freq, > - unsigned long voltage) > -{ > - return get_static_power(dfc, freq) + get_dynamic_power(dfc, freq, > - voltage); > + /* Avoid division by 0 */ > + status->busy_time = status->busy_time ? : 1; > + status->total_time = 100; > } > > - > static int devfreq_cooling_get_requested_power(struct thermal_cooling_device *cdev, > struct thermal_zone_device *tz, > u32 *power) > { > struct devfreq_cooling_device *dfc = cdev->devdata; > struct devfreq *df = dfc->devfreq; > - struct devfreq_dev_status *status = &df->last_status; > - unsigned long state; > - unsigned long freq = status->current_frequency; > - unsigned long voltage; > - u32 dyn_power = 0; > - u32 static_power = 0; > + struct devfreq_dev_status status; > + unsigned long voltage, freq; > + unsigned long em_perf_idx; > int res; > > - state = freq_get_state(dfc, freq); > - if (state == THERMAL_CSTATE_INVALID) { > - res = -EAGAIN; > - goto fail; > - } > + mutex_lock(&df->lock); > + res = df->profile->get_dev_status(df->dev.parent, &status); > + mutex_unlock(&df->lock); > + if (res) > + return res; > > - if (dfc->power_ops->get_real_power) { > + freq = status.current_frequency; > + > + /* Energy Model frequencies are in kHz */ > + em_perf_idx = freq_get_state(dfc, freq / 1000); > + if (em_perf_idx == THERMAL_CSTATE_INVALID) > + return -EAGAIN; > + > + /* > + * If a more sophisticated cooling device model was not provided by the > + * driver, use simple Energy Model power calculation. > + */ > + if (!dfc->power_ops || !dfc->power_ops->get_real_power) { > + _normalize_load(&status); > + dfc_em_get_requested_power(dfc->em, &status, power, > + em_perf_idx); > + } else { > voltage = get_voltage(df, freq); > if (voltage == 0) { > - res = -EINVAL; > - goto fail; > + dfc->res_util = SCALE_ERROR_MITIGATION; > + return -EINVAL; > } > > res = dfc->power_ops->get_real_power(df, power, freq, voltage); > if (!res) { > - state = dfc->capped_state; > - dfc->res_util = dfc->power_table[state]; > + dfc->res_util = dfc->em->table[em_perf_idx].power; > dfc->res_util *= SCALE_ERROR_MITIGATION; > > if (*power > 1) > dfc->res_util /= *power; > } else { > - goto fail; > + /* It is safe to set max in this case */ > + dfc->res_util = SCALE_ERROR_MITIGATION; > + return res; > } > - } else { > - dyn_power = dfc->power_table[state]; > - > - /* Scale dynamic power for utilization */ > - dyn_power *= status->busy_time; > - dyn_power /= status->total_time; > - /* Get static power */ > - static_power = get_static_power(dfc, freq); > - > - *power = dyn_power + static_power; > } > > - trace_thermal_power_devfreq_get_power(cdev, status, freq, dyn_power, > - static_power, *power); > + trace_thermal_power_devfreq_get_power(cdev, &status, freq, *power); > > return 0; > -fail: > - /* It is safe to set max in this case */ > - dfc->res_util = SCALE_ERROR_MITIGATION; > - return res; > } > > static int devfreq_cooling_state2power(struct thermal_cooling_device *cdev, > @@ -302,16 +257,14 @@ static int devfreq_cooling_state2power(struct thermal_cooling_device *cdev, > u32 *power) > { > struct devfreq_cooling_device *dfc = cdev->devdata; > - unsigned long freq; > - u32 static_power; > + int idx; > > - if (state >= dfc->freq_table_size) > + if (state > dfc->max_state) > return -EINVAL; > > - freq = dfc->freq_table[state]; > - static_power = get_static_power(dfc, freq); > + idx = dfc->max_state - state; > + *power = dfc->em->table[idx].power; > > - *power = dfc->power_table[state] + static_power; > return 0; > } > > @@ -321,39 +274,41 @@ static int devfreq_cooling_power2state(struct thermal_cooling_device *cdev, > { > struct devfreq_cooling_device *dfc = cdev->devdata; > struct devfreq *df = dfc->devfreq; > - struct devfreq_dev_status *status = &df->last_status; > - unsigned long freq = status->current_frequency; > - unsigned long busy_time; > - s32 dyn_power; > - u32 static_power; > - s32 est_power; > + struct devfreq_dev_status status; > + u32 est_power = power; > + unsigned long freq; > int i; > > - if (dfc->power_ops->get_real_power) { > - /* Scale for resource utilization */ > - est_power = power * dfc->res_util; > - est_power /= SCALE_ERROR_MITIGATION; > - } else { > - static_power = get_static_power(dfc, freq); > + mutex_lock(&df->lock); > + status = df->last_status; > + mutex_unlock(&df->lock); > > - dyn_power = power - static_power; > - dyn_power = dyn_power > 0 ? dyn_power : 0; > + freq = status.current_frequency; > > - /* Scale dynamic power for utilization */ > - busy_time = status->busy_time ?: 1; > - est_power = (dyn_power * status->total_time) / busy_time; > + /* > + * Scale for resource utilization. Use simple Energy Model power > + * calculation if a more sophisticated cooling device model does > + * not exist. > + */ > + if (!dfc->power_ops || !dfc->power_ops->get_real_power) { > + _normalize_load(&status); > + est_power *= status.total_time; > + est_power /= status.busy_time; > + } else { > + est_power *= dfc->res_util; > + est_power /= SCALE_ERROR_MITIGATION; > } > > /* > * Find the first cooling state that is within the power > - * budget for dynamic power. > + * budget. The EM power table is sorted ascending. > */ > - for (i = 0; i < dfc->freq_table_size - 1; i++) > - if (est_power >= dfc->power_table[i]) > + for (i = dfc->max_state; i > 0; i--) > + if (est_power >= dfc->em->table[i].power) > break; > > - *state = i; > - dfc->capped_state = i; > + *state = dfc->max_state - i; > + > trace_thermal_power_devfreq_limit(cdev, freq, *state, power); > return 0; > } > @@ -365,91 +320,43 @@ static struct thermal_cooling_device_ops devfreq_cooling_ops = { > }; > > /** > - * devfreq_cooling_gen_tables() - Generate power and freq tables. > - * @dfc: Pointer to devfreq cooling device. > - * > - * Generate power and frequency tables: the power table hold the > - * device's maximum power usage at each cooling state (OPP). The > - * static and dynamic power using the appropriate voltage and > - * frequency for the state, is acquired from the struct > - * devfreq_cooling_power, and summed to make the maximum power draw. > - * > - * The frequency table holds the frequencies in descending order. > - * That way its indexed by cooling device state. > + * devfreq_cooling_gen_tables() - Generate frequency table. > + * @dfc: Pointer to devfreq cooling device. > + * @num_opps: Number of OPPs > * > - * The tables are malloced, and pointers put in dfc. They must be > - * freed when unregistering the devfreq cooling device. > + * Generate frequency table which holds the frequencies in descending > + * order. That way its indexed by cooling device state. This is for > + * compatibility with drivers which do not register Energy Model. > * > * Return: 0 on success, negative error code on failure. > */ > -static int devfreq_cooling_gen_tables(struct devfreq_cooling_device *dfc) > +static int devfreq_cooling_gen_tables(struct devfreq_cooling_device *dfc, > + int num_opps) > { > struct devfreq *df = dfc->devfreq; > struct device *dev = df->dev.parent; > - int ret, num_opps; > unsigned long freq; > - u32 *power_table = NULL; > - u32 *freq_table; > int i; > > - num_opps = dev_pm_opp_get_opp_count(dev); > - > - if (dfc->power_ops) { > - power_table = kcalloc(num_opps, sizeof(*power_table), > - GFP_KERNEL); > - if (!power_table) > - return -ENOMEM; > - } > - > - freq_table = kcalloc(num_opps, sizeof(*freq_table), > + dfc->freq_table = kcalloc(num_opps, sizeof(*dfc->freq_table), > GFP_KERNEL); > - if (!freq_table) { > - ret = -ENOMEM; > - goto free_power_table; > - } > + if (!dfc->freq_table) > + return -ENOMEM; > > for (i = 0, freq = ULONG_MAX; i < num_opps; i++, freq--) { > - unsigned long power, voltage; > struct dev_pm_opp *opp; > > opp = dev_pm_opp_find_freq_floor(dev, &freq); > if (IS_ERR(opp)) { > - ret = PTR_ERR(opp); > - goto free_tables; > + kfree(dfc->freq_table); > + return PTR_ERR(opp); > } > > - voltage = dev_pm_opp_get_voltage(opp) / 1000; /* mV */ > dev_pm_opp_put(opp); > - > - if (dfc->power_ops) { > - if (dfc->power_ops->get_real_power) > - power = get_total_power(dfc, freq, voltage); > - else > - power = get_dynamic_power(dfc, freq, voltage); > - > - dev_dbg(dev, "Power table: %lu MHz @ %lu mV: %lu = %lu mW\n", > - freq / 1000000, voltage, power, power); > - > - power_table[i] = power; > - } > - > - freq_table[i] = freq; > + dfc->freq_table[i] = freq; > } > > - if (dfc->power_ops) > - dfc->power_table = power_table; > - > - dfc->freq_table = freq_table; > - dfc->freq_table_size = num_opps; > - > return 0; > - > -free_tables: > - kfree(freq_table); > -free_power_table: > - kfree(power_table); > - > - return ret; > } > > /** > @@ -474,7 +381,7 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df, > struct thermal_cooling_device *cdev; > struct devfreq_cooling_device *dfc; > char dev_name[THERMAL_NAME_LENGTH]; > - int err; > + int err, num_opps; > > dfc = kzalloc(sizeof(*dfc), GFP_KERNEL); > if (!dfc) > @@ -482,28 +389,45 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df, > > dfc->devfreq = df; > > - if (dfc_power) { > - dfc->power_ops = dfc_power; > - > + dfc->em = em_pd_get(df->dev.parent); > + if (dfc->em) { > devfreq_cooling_ops.get_requested_power = > devfreq_cooling_get_requested_power; > devfreq_cooling_ops.state2power = devfreq_cooling_state2power; > devfreq_cooling_ops.power2state = devfreq_cooling_power2state; > + > + dfc->power_ops = dfc_power; > + > + num_opps = em_pd_nr_perf_states(dfc->em); > + } else { > + /* Backward compatibility for drivers which do not use IPA */ > + dev_dbg(df->dev.parent, "missing EM for cooling device\n"); > + > + num_opps = dev_pm_opp_get_opp_count(df->dev.parent); > + > + err = devfreq_cooling_gen_tables(dfc, num_opps); > + if (err) > + goto free_dfc; > } > > - err = devfreq_cooling_gen_tables(dfc); > - if (err) > + if (num_opps <= 0) { > + err = -EINVAL; > goto free_dfc; > + } > + > + /* max_state is an index, not a counter */ > + dfc->max_state = num_opps - 1; > > err = dev_pm_qos_add_request(df->dev.parent, &dfc->req_max_freq, > DEV_PM_QOS_MAX_FREQUENCY, > PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE); > if (err < 0) > - goto free_tables; > + goto free_table; > > err = ida_simple_get(&devfreq_ida, 0, 0, GFP_KERNEL); > if (err < 0) > goto remove_qos_req; > + > dfc->id = err; > > snprintf(dev_name, sizeof(dev_name), "thermal-devfreq-%d", dfc->id); > @@ -524,16 +448,16 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df, > > release_ida: > ida_simple_remove(&devfreq_ida, dfc->id); > - > remove_qos_req: > dev_pm_qos_remove_request(&dfc->req_max_freq); > - > -free_tables: > - kfree(dfc->power_table); > +free_table: > kfree(dfc->freq_table); > free_dfc: > kfree(dfc); > > + if (dfc->em) > + em_pd_put(df->dev.parent); > + > return ERR_PTR(err); > } > EXPORT_SYMBOL_GPL(of_devfreq_cooling_register_power); > @@ -561,25 +485,119 @@ struct thermal_cooling_device *devfreq_cooling_register(struct devfreq *df) > } > EXPORT_SYMBOL_GPL(devfreq_cooling_register); > > +/** > + * devfreq_cooling_em_register_power() - Register devfreq cooling device with > + * power information and attempt to register Energy Model (EM) > + * @df: Pointer to devfreq device. > + * @dfc_power: Pointer to devfreq_cooling_power. > + * @em_cb: Callback functions providing the data of the EM > + * > + * Register a devfreq cooling device and attempt to register Energy Model. The > + * available OPPs must be registered for the device. > + * > + * If @dfc_power is provided, the cooling device is registered with the > + * power extensions. If @em_cb is provided it will be called for each OPP to > + * calculate power value and cost. If @em_cb is not provided then simple Energy > + * Model is going to be used, which requires "dynamic-power-coefficient" a > + * devicetree property. > + */ > +struct thermal_cooling_device * > +devfreq_cooling_em_register_power(struct devfreq *df, > + struct devfreq_cooling_power *dfc_power, > + struct em_data_callback *em_cb) > +{ > + struct thermal_cooling_device *cdev; > + struct devfreq_cooling_device *dfc; > + struct device_node *np = NULL; > + struct device *dev; > + int nr_opp, ret; > + > + if (IS_ERR_OR_NULL(df)) > + return ERR_PTR(-EINVAL); > + > + dev = df->dev.parent; > + > + if (em_cb) { > + nr_opp = dev_pm_opp_get_opp_count(dev); > + if (nr_opp <= 0) { > + dev_err(dev, "No valid OPPs found\n"); > + return ERR_PTR(-EINVAL); > + } > + > + ret = em_dev_register_perf_domain(dev, nr_opp, em_cb, NULL); > + } else { > + ret = dev_pm_opp_of_register_em(dev, NULL); > + } > + > + if (ret) > + dev_warn(dev, "Unable to register EM for devfreq cooling device (%d)\n", > + ret); > + > + if (dev->of_node) > + np = of_node_get(dev->of_node); > + > + cdev = of_devfreq_cooling_register_power(np, df, dfc_power); > + > + if (np) > + of_node_put(np); > + > + if (IS_ERR_OR_NULL(cdev)) { > + if (!ret) > + em_dev_unregister_perf_domain(dev); > + } else { > + dfc = cdev->devdata; > + dfc->em_registered = !ret; > + } > + > + return cdev; > +} > +EXPORT_SYMBOL_GPL(devfreq_cooling_em_register_power); > + > +/** > + * devfreq_cooling_em_register() - Register devfreq cooling device together > + * with Energy Model. > + * @df: Pointer to devfreq device. > + * @em_cb: Callback functions providing the data of the Energy Model > + * > + * This function attempts to register Energy Model for devfreq device and then > + * register the devfreq cooling device. > + */ > +struct thermal_cooling_device * > +devfreq_cooling_em_register(struct devfreq *df, struct em_data_callback *em_cb) > +{ > + return devfreq_cooling_em_register_power(df, NULL, em_cb); > +} > +EXPORT_SYMBOL_GPL(devfreq_cooling_em_register); > + > /** > * devfreq_cooling_unregister() - Unregister devfreq cooling device. > * @cdev: Pointer to devfreq cooling device to unregister. > + * > + * Unregisters devfreq cooling device and related Energy Model if it was > + * present. > */ > void devfreq_cooling_unregister(struct thermal_cooling_device *cdev) > { > struct devfreq_cooling_device *dfc; > + struct device *dev; > > - if (!cdev) > + if (IS_ERR_OR_NULL(cdev)) > return; > > dfc = cdev->devdata; > + dev = dfc->devfreq->dev.parent; > > thermal_cooling_device_unregister(dfc->cdev); > ida_simple_remove(&devfreq_ida, dfc->id); > dev_pm_qos_remove_request(&dfc->req_max_freq); > - kfree(dfc->power_table); > - kfree(dfc->freq_table); > + em_pd_put(dev); > > + /* Check if devfreq cooling registered this EM and must free it. */ > + if (dfc->em_registered) > + em_dev_unregister_perf_domain(dev); > + > + kfree(dfc->freq_table); > kfree(dfc); > + > } > EXPORT_SYMBOL_GPL(devfreq_cooling_unregister); > diff --git a/include/linux/devfreq_cooling.h b/include/linux/devfreq_cooling.h > index 79a6e37a1d6f..613678ce23df 100644 > --- a/include/linux/devfreq_cooling.h > +++ b/include/linux/devfreq_cooling.h > @@ -18,22 +18,12 @@ > #define __DEVFREQ_COOLING_H__ > > #include > +#include > #include > > > /** > * struct devfreq_cooling_power - Devfreq cooling power ops > - * @get_static_power: Take voltage, in mV, and return the static power > - * in mW. If NULL, the static power is assumed > - * to be 0. > - * @get_dynamic_power: Take voltage, in mV, and frequency, in HZ, and > - * return the dynamic power draw in mW. If NULL, > - * a simple power model is used. > - * @dyn_power_coeff: Coefficient for the simple dynamic power model in > - * mW/(MHz mV mV). > - * If get_dynamic_power() is NULL, then the > - * dynamic power is calculated as > - * @dyn_power_coeff * frequency * voltage^2 > * @get_real_power: When this is set, the framework uses it to ask the > * device driver for the actual power. > * Some devices have more sophisticated methods > @@ -53,14 +43,8 @@ > * max total (static + dynamic) power value for each OPP. > */ > struct devfreq_cooling_power { > - unsigned long (*get_static_power)(struct devfreq *devfreq, > - unsigned long voltage); > - unsigned long (*get_dynamic_power)(struct devfreq *devfreq, > - unsigned long freq, > - unsigned long voltage); > int (*get_real_power)(struct devfreq *df, u32 *power, > unsigned long freq, unsigned long voltage); > - unsigned long dyn_power_coeff; > }; > > #ifdef CONFIG_DEVFREQ_THERMAL > @@ -72,6 +56,13 @@ struct thermal_cooling_device * > of_devfreq_cooling_register(struct device_node *np, struct devfreq *df); > struct thermal_cooling_device *devfreq_cooling_register(struct devfreq *df); > void devfreq_cooling_unregister(struct thermal_cooling_device *dfc); > +struct thermal_cooling_device * > +devfreq_cooling_em_register_power(struct devfreq *df, > + struct devfreq_cooling_power *dfc_power, > + struct em_data_callback *em_cb); > +struct thermal_cooling_device * > +devfreq_cooling_em_register(struct devfreq *df, > + struct em_data_callback *em_cb); > > #else /* !CONFIG_DEVFREQ_THERMAL */ > > @@ -94,6 +85,20 @@ devfreq_cooling_register(struct devfreq *df) > return ERR_PTR(-EINVAL); > } > > +static inline struct thermal_cooling_device * > +devfreq_cooling_em_register_power(struct devfreq *df, > + struct devfreq_cooling_power *dfc_power, > + struct em_data_callback *em_cb) > +{ > + return ERR_PTR(-EINVAL); > +} > + > +static inline struct thermal_cooling_device * > +devfreq_cooling_em_register(struct devfreq *df, struct em_data_callback *em_cb) > +{ > + return ERR_PTR(-EINVAL); > +} > + > static inline void > devfreq_cooling_unregister(struct thermal_cooling_device *dfc) > { > diff --git a/include/trace/events/thermal.h b/include/trace/events/thermal.h > index 135e5421f003..8a5f04888abd 100644 > --- a/include/trace/events/thermal.h > +++ b/include/trace/events/thermal.h > @@ -153,31 +153,30 @@ TRACE_EVENT(thermal_power_cpu_limit, > TRACE_EVENT(thermal_power_devfreq_get_power, > TP_PROTO(struct thermal_cooling_device *cdev, > struct devfreq_dev_status *status, unsigned long freq, > - u32 dynamic_power, u32 static_power, u32 power), > + u32 power), > > - TP_ARGS(cdev, status, freq, dynamic_power, static_power, power), > + TP_ARGS(cdev, status, freq, power), > > TP_STRUCT__entry( > __string(type, cdev->type ) > __field(unsigned long, freq ) > - __field(u32, load ) > - __field(u32, dynamic_power ) > - __field(u32, static_power ) > + __field(u32, busy_time) > + __field(u32, total_time) > __field(u32, power) > ), > > TP_fast_assign( > __assign_str(type, cdev->type); > __entry->freq = freq; > - __entry->load = (100 * status->busy_time) / status->total_time; > - __entry->dynamic_power = dynamic_power; > - __entry->static_power = static_power; > + __entry->busy_time = status->busy_time; > + __entry->total_time = status->total_time; > __entry->power = power; > ), > > - TP_printk("type=%s freq=%lu load=%u dynamic_power=%u static_power=%u power=%u", > + TP_printk("type=%s freq=%lu load=%u power=%u", > __get_str(type), __entry->freq, > - __entry->load, __entry->dynamic_power, __entry->static_power, > + __entry->total_time == 0 ? 0 : > + (100 * __entry->busy_time) / __entry->total_time, > __entry->power) > ); > > -- > 2.17.1 > -- Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog 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=-6.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable 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 EACDCC54FD0 for ; Thu, 23 Apr 2020 17:57:35 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 8EC7B20663 for ; Thu, 23 Apr 2020 17:57:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fBrfsaH7"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="d9/G8/mm" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8EC7B20663 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=3efwuq2CS+14RhgIlG5bcHOuM0jMaMY0XkHHmMC++5U=; b=fBrfsaH7ZRhQl2 1hldITq2KlbC1Nt+MkM7SEvCbVJG7eLolniFhTj50Aza54UvWgybHCxh7pIb5BF5jdYmRld5A+B3d 2pPM/sWlbj14CHjwTmF89P0CJ4uXmW9qB9KC1AlnklYhCu6aaRO3SvG8ZJBd12bBXesQ96V4uVK0k zOZUShJ8E1hFn2AUsj+1qozauiZLAK4/UOxhJLtXUt9R6qqT7vR1c8bGd7UiBT+a6JGmmFNpienOo 2EMpmNsvt0Es6e4pg50L0x9TXbeHbdJTMEBdZBantYPbQxqMHX5KupgVcxj4p7eyTTyztmYeL2EI4 D+A9enDqh8l14SogPhXQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jRg6E-0004dr-Kc; Thu, 23 Apr 2020 17:57:22 +0000 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jRg69-0004bX-No for linux-mediatek@lists.infradead.org; Thu, 23 Apr 2020 17:57:20 +0000 Received: by mail-wr1-x444.google.com with SMTP id i10so7879816wrv.10 for ; Thu, 23 Apr 2020 10:57:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=d9/G8/mm1s6L7U3grcrEtILx0VltO1cSLr9xd4Th5rnmfCECHODYPAQ0aO21o3IwGg 9VNKbfx6NWZUcdSr9v8HKX2+nMaRgSKRlfadsYoGQdlqgEqTKlxTs7An4FwHmf9BnwCo iCyN465/N3DmU+Ka1WexrnY/usLFGoUbWnLPaJ+LmUXqKshiJUE+Hxhly097fmrbyfkx EZnhrBKkW2EKPTiOqC93lCk34rbf/RL/7Oi6vrZpec06JT1mzH7f9zwJHpd6nTRaokjA VVFuVqsMDVnX61YrbxeBo+1/bHB839FVondm/j53B8LD03vwQwTzfayVz25EsQhr37hg ZodQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=C2rllzXrqHHbcrbdr0KzZF107mtqU7uxIumwXkckznvdzKagMCVd/rPh1qp9duqVXp K+0GFu/Wqgb161tm9rTrODXqmg/wzhlhqngV1G6XyC9/JJHtDbNdHV/Df1mj6WAgVgCg KMsSNS8J/t4Id+SxBMxCk68l63bbjQ71XiMOnjpm4C31HAmLeILVgpK+6jMtNK2TvmEe XioVsfVrFXdsH9Qk27s0KnXu6XVPC3NmmuuehE82wJGViFzkUqCNoOAoipZo4xoi6mrp BTeNQXDARujhKKh/LLDSO0sabaCFp4TU02wnWKWX6pCeVKfReEEOZ0WdAITjk+Jsur6T 9vaA== X-Gm-Message-State: AGi0Pubc22w5zmXiKieuk13C+6ZNypwQ1MUVc8lV/WetuxmlSFGgNPkP laHJIz15b3DgsaV9j+TJ+WGNVg== X-Google-Smtp-Source: APiQypJl+oEUyy7z0GtqEAxyqDXffHB5kQWgiibXowQIt/FHM/GqoWI3jwvWyT/gnQK8/Affz/K20w== X-Received: by 2002:a5d:4e06:: with SMTP id p6mr6069297wrt.35.1587664635462; Thu, 23 Apr 2020 10:57:15 -0700 (PDT) Received: from linaro.org ([37.167.216.250]) by smtp.gmail.com with ESMTPSA id t8sm4719117wrq.88.2020.04.23.10.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2020 10:57:14 -0700 (PDT) Date: Thu, 23 Apr 2020 19:57:08 +0200 From: Daniel Lezcano To: Lukasz Luba Subject: Re: [PATCH v6 09/10] thermal: devfreq_cooling: Refactor code and switch to use Energy Model Message-ID: <20200423175708.GG65632@linaro.org> References: <20200410084210.24932-1-lukasz.luba@arm.com> <20200410084210.24932-10-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200410084210.24932-10-lukasz.luba@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200423_105717_800202_95F3D8BA X-CRM114-Status: GOOD ( 33.00 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: nm@ti.com, juri.lelli@redhat.com, peterz@infradead.org, viresh.kumar@linaro.org, liviu.dudau@arm.com, dri-devel@lists.freedesktop.org, bjorn.andersson@linaro.org, bsegall@google.com, alyssa.rosenzweig@collabora.com, festevam@gmail.com, mka@chromium.org, robh@kernel.org, amit.kucheria@verdurent.com, lorenzo.pieralisi@arm.com, vincent.guittot@linaro.org, khilman@kernel.org, agross@kernel.org, b.zolnierkie@samsung.com, steven.price@arm.com, cw00.choi@samsung.com, mingo@redhat.com, linux-imx@nxp.com, rui.zhang@intel.com, mgorman@suse.de, orjan.eide@arm.com, daniel@ffwll.ch, linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org, s.hauer@pengutronix.de, rostedt@goodmis.org, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-omap@vger.kernel.org, Dietmar.Eggemann@arm.com, linux-arm-kernel@lists.infradead.org, airlied@linux.ie, tomeu.vizoso@collabora.com, qperret@google.com, sboyd@kernel.org, rdunlap@infradead.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, kernel@pengutronix.de, sudeep.holla@arm.com, patrick.bellasi@matbug.net, shawnguo@kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org T24gRnJpLCBBcHIgMTAsIDIwMjAgYXQgMDk6NDI6MDlBTSArMDEwMCwgTHVrYXN6IEx1YmEgd3Jv dGU6Cj4gVGhlIG92ZXJoYXVsZWQgRW5lcmd5IE1vZGVsIChFTSkgZnJhbWV3b3JrIHN1cHBvcnQg YWxzbyBkZXZmcmVxIGRldmljZXMuCj4gVGhlIHVuaWZpZWQgQVBJIGludGVyZmFjZSBvZiB0aGUg RU0gY2FuIGJlIHVzZWQgaW4gdGhlIHRoZXJtYWwgc3Vic3lzdGVtIHRvCj4gbm90IGR1cGxpY2F0 ZSBjb2RlLiBUaGUgcG93ZXIgdGFibGUgbm93IGlzIHRha2VuIGZyb20gRU0gc3RydWN0dXJlIGFu ZAo+IHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFpbnRhaW4gY2FsY3VsYXRpb24gZm9yIGl0IGxvY2Fs bHkuIEluIGNhc2Ugd2hlbiB0aGUKPiBFTSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBh IHNpbXBsZSBpbnRlcmZhY2UgZm9yIGNvb2xpbmcgZGV2aWNlIGlzCj4gdXNlZC4KPiAKPiBbbGtw OiBSZXBvcnRlZCB0aGUgYnVpbGQgd2FybmluZ10KPiBSZXBvcnRlZC1ieToga2J1aWxkIHRlc3Qg cm9ib3QgPGxrcEBpbnRlbC5jb20+Cj4gUmV2aWV3ZWQtYnk6IFN0ZXZlbiBSb3N0ZWR0IChWTXdh cmUpIDxyb3N0ZWR0QGdvb2RtaXMub3JnPiAjIGZvciB0cmFjaW5nIGNvZGUKPiBTaWduZWQtb2Zm LWJ5OiBMdWthc3ogTHViYSA8bHVrYXN6Lmx1YmFAYXJtLmNvbT4KCklzIGl0IHBvc3NpYmxlIHRv IHNwbGl0IHRoaXMgcGF0Y2ggaW50byBzbWFsbGVyIHBhcnRzPyBJdCBpcyBoYXJkIHRvIHVuZGVy c3RhbmQKd2hhdCBpcyByZWxhdGVkIHRvIHRoZSBlbSBjb252ZXJzaW9uIGFuZCBvdGhlciBjaGFu Z2VzIHdoaWNoIGxvb2sgbm90IHJlbGF0ZWQKc28gZmFyLgoKPiAtLS0KPiAgZHJpdmVycy90aGVy bWFsL2RldmZyZXFfY29vbGluZy5jIHwgNDc0ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0t LQo+ICBpbmNsdWRlL2xpbnV4L2RldmZyZXFfY29vbGluZy5oICAgfCAgMzkgKy0tCj4gIGluY2x1 ZGUvdHJhY2UvZXZlbnRzL3RoZXJtYWwuaCAgICB8ICAxOSArLQo+ICAzIGZpbGVzIGNoYW5nZWQs IDI3NyBpbnNlcnRpb25zKCspLCAyNTUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdGhlcm1hbC9kZXZmcmVxX2Nvb2xpbmcuYyBiL2RyaXZlcnMvdGhlcm1hbC9kZXZmcmVx X2Nvb2xpbmcuYwo+IGluZGV4IGY3ZjMyZTk4MzMxYi4uMzJkZjVmNTViZGU4IDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvdGhlcm1hbC9kZXZmcmVxX2Nvb2xpbmcuYwo+ICsrKyBiL2RyaXZlcnMvdGhl cm1hbC9kZXZmcmVxX2Nvb2xpbmcuYwo+IEBAIC0xLDE3ICsxLDkgQEAKPiArLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiAgLyoKPiAgICogZGV2ZnJlcV9jb29saW5nOiBUaGVy bWFsIGNvb2xpbmcgZGV2aWNlIGltcGxlbWVudGF0aW9uIGZvciBkZXZpY2VzIHVzaW5nCj4gICAq ICAgICAgICAgICAgICAgICAgZGV2ZnJlcQo+ICAgKgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMTQt MjAxNSBBUk0gTGltaXRlZAo+IC0gKgo+IC0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+IC0gKiBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwo+ IC0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPiAtICoKPiAt ICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFO VFkgb2YgYW55Cj4gLSAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKPiAtICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+IC0gKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MTQtMjAyMCBBUk0gTGltaXRlZAo+ICAgKgo+ICAgKiBUT0RPOgo+ICAgKiAgICAtIElmIE9QUHMg YXJlIGFkZGVkIG9yIHJlbW92ZWQgYWZ0ZXIgZGV2ZnJlcSBjb29saW5nIGhhcwo+IEBAIC00MSwz NiArMzMsMzMgQEAgc3RhdGljIERFRklORV9JREEoZGV2ZnJlcV9pZGEpOwo+ICAgKiBAY2RldjoJ UG9pbnRlciB0byBhc3NvY2lhdGVkIHRoZXJtYWwgY29vbGluZyBkZXZpY2UuCj4gICAqIEBkZXZm cmVxOglQb2ludGVyIHRvIGFzc29jaWF0ZWQgZGV2ZnJlcSBkZXZpY2UuCj4gICAqIEBjb29saW5n X3N0YXRlOglDdXJyZW50IGNvb2xpbmcgc3RhdGUuCj4gLSAqIEBwb3dlcl90YWJsZToJUG9pbnRl ciB0byB0YWJsZSB3aXRoIG1heGltdW0gcG93ZXIgZHJhdyBmb3IgZWFjaAo+IC0gKgkJCWNvb2xp bmcgc3RhdGUuIFN0YXRlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZSwgYW5kCj4gLSAqCQkJ dGhlIHBvd2VyIGlzIGluIG1XLgo+IC0gKiBAZnJlcV90YWJsZToJUG9pbnRlciB0byBhIHRhYmxl IHdpdGggdGhlIGZyZXF1ZW5jaWVzIHNvcnRlZCBpbiBkZXNjZW5kaW5nCj4gLSAqCQlvcmRlci4g IFlvdSBjYW4gaW5kZXggdGhlIHRhYmxlIGJ5IGNvb2xpbmcgZGV2aWNlIHN0YXRlCj4gLSAqIEBm cmVxX3RhYmxlX3NpemU6CVNpemUgb2YgdGhlIEBmcmVxX3RhYmxlIGFuZCBAcG93ZXJfdGFibGUK PiAtICogQHBvd2VyX29wczoJUG9pbnRlciB0byBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIsIHVzZWQg dG8gZ2VuZXJhdGUgdGhlCj4gLSAqCQlAcG93ZXJfdGFibGUuCj4gKyAqIEBmcmVxX3RhYmxlOiAg ICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIGZyZXF1ZW5jaWVzLgo+ICsgKiBAbWF4 X3N0YXRlOglJdCBpcyB0aGUgbGFzdCBpbmRleCwgdGhhdCBpcywgb25lIGxlc3MgdGhhbiB0aGUg bnVtYmVyIG9mIHRoZQo+ICsgKgkJT1BQcwo+ICsgKiBAcG93ZXJfb3BzOglQb2ludGVyIHRvIGRl dmZyZXFfY29vbGluZ19wb3dlciwgYSBtb3JlIHByZWNpc2VkIG1vZGVsLgo+ICAgKiBAcmVzX3V0 aWw6CVJlc291cmNlIHV0aWxpemF0aW9uIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgcG93ZXIuCj4g ICAqCQlJdCBpcyBtdWx0aXBsaWVkIGJ5IDEwMCB0byBtaW5pbWl6ZSB0aGUgZXJyb3IuIEl0IGlz IHVzZWQKPiAgICoJCWZvciBlc3RpbWF0aW9uIG9mIHRoZSBwb3dlciBidWRnZXQgaW5zdGVhZCBv ZiB1c2luZwo+IC0gKgkJJ3V0aWxpemF0aW9uJyAod2hpY2ggaXMJJ2J1c3lfdGltZSAvICd0b3Rh bF90aW1lJykuCj4gLSAqCQlUaGUgJ3Jlc191dGlsJyByYW5nZSBpcyBmcm9tIDEwMCB0byAocG93 ZXJfdGFibGVbc3RhdGVdICogMTAwKQo+IC0gKgkJZm9yIHRoZSBjb3JyZXNwb25kaW5nICdzdGF0 ZScuCj4gLSAqIEBjYXBwZWRfc3RhdGU6CWluZGV4IHRvIGNvb2xpbmcgc3RhdGUgd2l0aCBpbiBk eW5hbWljIHBvd2VyIGJ1ZGdldAo+ICsgKgkJJ3V0aWxpemF0aW9uJyAod2hpY2ggaXMJJ2J1c3lf dGltZScgLyAndG90YWxfdGltZScpLgo+ICsgKgkJVGhlICdyZXNfdXRpbCcgcmFuZ2UgaXMgZnJv bSAxMDAgdG8gcG93ZXIgKiAxMDAJZm9yIHRoZQo+ICsgKgkJY29ycmVzcG9uZGluZyAnc3RhdGUn Lgo+ICAgKiBAcmVxX21heF9mcmVxOglQTSBRb1MgcmVxdWVzdCBmb3IgbGltaXRpbmcgdGhlIG1h eGltdW0gZnJlcXVlbmN5Cj4gICAqCQkJb2YgdGhlIGRldmZyZXEgZGV2aWNlLgo+ICsgKiBAZW06 CQlFbmVyZ3kgTW9kZWwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYXNzb2NpYXRlZCBEZXZmcmVxIGRl dmljZQo+ICsgKiBAZW1fcmVnaXN0ZXJlZDoJRGV2ZnJlcSBjb29saW5nIHJlZ2lzdGVyZWQgdGhl IEVNIGFuZCBzaG91bGQgZnJlZSBpdC4KPiAgICovCj4gIHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdf ZGV2aWNlIHsKPiAgCWludCBpZDsKPiAgCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpj ZGV2Owo+ICAJc3RydWN0IGRldmZyZXEgKmRldmZyZXE7Cj4gIAl1bnNpZ25lZCBsb25nIGNvb2xp bmdfc3RhdGU7Cj4gLQl1MzIgKnBvd2VyX3RhYmxlOwo+ICAJdTMyICpmcmVxX3RhYmxlOwo+IC0J c2l6ZV90IGZyZXFfdGFibGVfc2l6ZTsKPiArCXNpemVfdCBtYXhfc3RhdGU7Cj4gIAlzdHJ1Y3Qg ZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpwb3dlcl9vcHM7Cj4gIAl1MzIgcmVzX3V0aWw7Cj4gLQlp bnQgY2FwcGVkX3N0YXRlOwo+ICAJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCByZXFfbWF4X2Zy ZXE7Cj4gKwlzdHJ1Y3QgZW1fcGVyZl9kb21haW4gKmVtOwo+ICsJYm9vbCBlbV9yZWdpc3RlcmVk Owo+ICB9Owo+ICAKPiAgc3RhdGljIGludCBkZXZmcmVxX2Nvb2xpbmdfZ2V0X21heF9zdGF0ZShz dHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiBAQCAtNzgsNyArNjcsNyBAQCBz dGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19nZXRfbWF4X3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpjZGV2LAo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2Rldmlj ZSAqZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiAgCj4gLQkqc3RhdGUgPSBkZmMtPmZyZXFfdGFibGVf c2l6ZSAtIDE7Cj4gKwkqc3RhdGUgPSBkZmMtPm1heF9zdGF0ZTsKPiAgCj4gIAlyZXR1cm4gMDsK PiAgfQo+IEBAIC0xMDYsMTAgKzk1LDE2IEBAIHN0YXRpYyBpbnQgZGV2ZnJlcV9jb29saW5nX3Nl dF9jdXJfc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4gIAo+ICAJ ZGV2X2RiZyhkZXYsICJTZXR0aW5nIGNvb2xpbmcgc3RhdGUgJWx1XG4iLCBzdGF0ZSk7Cj4gIAo+ IC0JaWYgKHN0YXRlID49IGRmYy0+ZnJlcV90YWJsZV9zaXplKQo+ICsJaWYgKHN0YXRlID4gZGZj LT5tYXhfc3RhdGUpCj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAo+IC0JZnJlcSA9IGRmYy0+ZnJl cV90YWJsZVtzdGF0ZV07Cj4gKwlpZiAoZGZjLT5lbSkgewo+ICsJCS8qIEVuZXJneSBNb2RlbCBm cmVxdWVuY2llcyBhcmUgaW4ga0h6ICovCj4gKwkJZnJlcSA9IGRmYy0+ZW0tPnRhYmxlW2RmYy0+ bWF4X3N0YXRlIC0gc3RhdGVdLmZyZXF1ZW5jeTsKPiArCQlmcmVxICo9IDEwMDA7Cj4gKwl9IGVs c2Ugewo+ICsJCWZyZXEgPSBkZmMtPmZyZXFfdGFibGVbc3RhdGVdOwo+ICsJfQo+ICAKPiAgCWRl dl9wbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRmYy0+cmVxX21heF9mcmVxLAo+ICAJCQkJICBESVZf Uk9VTkRfVVAoZnJlcSwgSFpfUEVSX0tIWikpOwo+IEBAIC0xMjAsMTEgKzExNSwxMSBAQCBzdGF0 aWMgaW50IGRldmZyZXFfY29vbGluZ19zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xp bmdfZGV2aWNlICpjZGV2LAo+ICB9Cj4gIAo+ICAvKioKPiAtICogZnJlcV9nZXRfc3RhdGUoKSAt IGdldCB0aGUgY29vbGluZyBzdGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgZnJlcXVlbmN5Cj4gKyAq IGZyZXFfZ2V0X3N0YXRlKCkgLSBnZXQgdGhlIHBlcmZvcm1hbmNlIGluZGV4IGNvcnJlc3BvbmRp bmcgdG8gYSBmcmVxdWVuY3kKPiAgICogQGRmYzoJUG9pbnRlciB0byBkZXZmcmVxIGNvb2xpbmcg ZGV2aWNlCj4gLSAqIEBmcmVxOglmcmVxdWVuY3kgaW4gSHoKPiArICogQGZyZXE6CWZyZXF1ZW5j eSBpbiBrSHoKPiAgICoKPiAtICogUmV0dXJuOiB0aGUgY29vbGluZyBzdGF0ZSBhc3NvY2lhdGVk IHdpdGggdGhlIEBmcmVxLCBvcgo+ICsgKiBSZXR1cm46IHRoZSBwZXJmb3JtYW5jZSBpbmRleCBh c3NvY2lhdGVkIHdpdGggdGhlIEBmcmVxLCBvcgo+ICAgKiBUSEVSTUFMX0NTVEFURV9JTlZBTElE IGlmIGl0IHdhc24ndCBmb3VuZC4KPiAgICovCj4gIHN0YXRpYyB1bnNpZ25lZCBsb25nCj4gQEAg LTEzMiw4ICsxMjcsOCBAQCBmcmVxX2dldF9zdGF0ZShzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2Rl dmljZSAqZGZjLCB1bnNpZ25lZCBsb25nIGZyZXEpCj4gIHsKPiAgCWludCBpOwo+ICAKPiAtCWZv ciAoaSA9IDA7IGkgPCBkZmMtPmZyZXFfdGFibGVfc2l6ZTsgaSsrKSB7Cj4gLQkJaWYgKGRmYy0+ ZnJlcV90YWJsZVtpXSA9PSBmcmVxKQo+ICsJZm9yIChpID0gMDsgaSA8PSBkZmMtPm1heF9zdGF0 ZTsgaSsrKSB7Cj4gKwkJaWYgKGRmYy0+ZW0tPnRhYmxlW2ldLmZyZXF1ZW5jeSA9PSBmcmVxKQo+ ICAJCQlyZXR1cm4gaTsKPiAgCX0KPiAgCj4gQEAgLTE2OCwxMzIgKzE2Myw5MiBAQCBzdGF0aWMg dW5zaWduZWQgbG9uZyBnZXRfdm9sdGFnZShzdHJ1Y3QgZGV2ZnJlcSAqZGYsIHVuc2lnbmVkIGxv bmcgZnJlcSkKPiAgCXJldHVybiB2b2x0YWdlOwo+ICB9Cj4gIAo+IC0vKioKPiAtICogZ2V0X3N0 YXRpY19wb3dlcigpIC0gY2FsY3VsYXRlIHRoZSBzdGF0aWMgcG93ZXIKPiAtICogQGRmYzoJUG9p bnRlciB0byBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlCj4gLSAqIEBmcmVxOglGcmVxdWVuY3kgaW4g SHoKPiAtICoKPiAtICogQ2FsY3VsYXRlIHRoZSBzdGF0aWMgcG93ZXIgaW4gbWlsbGl3YXR0cyB1 c2luZyB0aGUgc3VwcGxpZWQKPiAtICogZ2V0X3N0YXRpY19wb3dlcigpLiAgVGhlIGN1cnJlbnQg dm9sdGFnZSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZQo+IC0gKiBPUFAgbGlicmFyeS4gIElmIG5v IGdldF9zdGF0aWNfcG93ZXIoKSB3YXMgc3VwcGxpZWQsIGFzc3VtZSB0aGUKPiAtICogc3RhdGlj IHBvd2VyIGlzIG5lZ2xpZ2libGUuCj4gLSAqLwo+IC1zdGF0aWMgdW5zaWduZWQgbG9uZwo+IC1n ZXRfc3RhdGljX3Bvd2VyKHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMsIHVuc2ln bmVkIGxvbmcgZnJlcSkKPiArc3RhdGljIHZvaWQgZGZjX2VtX2dldF9yZXF1ZXN0ZWRfcG93ZXIo c3RydWN0IGVtX3BlcmZfZG9tYWluICplbSwKPiArCQkJCSAgICAgICBzdHJ1Y3QgZGV2ZnJlcV9k ZXZfc3RhdHVzICpzdGF0dXMsCj4gKwkJCQkgICAgICAgdTMyICpwb3dlciwgaW50IGVtX3BlcmZf aWR4KQo+ICB7Cj4gLQlzdHJ1Y3QgZGV2ZnJlcSAqZGYgPSBkZmMtPmRldmZyZXE7Cj4gLQl1bnNp Z25lZCBsb25nIHZvbHRhZ2U7Cj4gKwkqcG93ZXIgPSBlbS0+dGFibGVbZW1fcGVyZl9pZHhdLnBv d2VyOwo+ICAKPiAtCWlmICghZGZjLT5wb3dlcl9vcHMtPmdldF9zdGF0aWNfcG93ZXIpCj4gLQkJ cmV0dXJuIDA7Cj4gLQo+IC0Jdm9sdGFnZSA9IGdldF92b2x0YWdlKGRmLCBmcmVxKTsKPiAtCj4g LQlpZiAodm9sdGFnZSA9PSAwKQo+IC0JCXJldHVybiAwOwo+IC0KPiAtCXJldHVybiBkZmMtPnBv d2VyX29wcy0+Z2V0X3N0YXRpY19wb3dlcihkZiwgdm9sdGFnZSk7Cj4gKwkvKiBTY2FsZSBwb3dl ciBmb3IgdXRpbGl6YXRpb24gKi8KPiArCSpwb3dlciAqPSBzdGF0dXMtPmJ1c3lfdGltZTsKPiAr CSpwb3dlciAvPSBzdGF0dXMtPnRvdGFsX3RpbWU7Cj4gIH0KPiAgCj4gLS8qKgo+IC0gKiBnZXRf ZHluYW1pY19wb3dlciAtIGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBwb3dlcgo+IC0gKiBAZGZjOglQ b2ludGVyIHRvIGRldmZyZXEgY29vbGluZyBkZXZpY2UKPiAtICogQGZyZXE6CUZyZXF1ZW5jeSBp biBIego+IC0gKiBAdm9sdGFnZToJVm9sdGFnZSBpbiBtaWxsaXZvbHRzCj4gLSAqCj4gLSAqIENh bGN1bGF0ZSB0aGUgZHluYW1pYyBwb3dlciBpbiBtaWxsaXdhdHRzIGNvbnN1bWVkIGJ5IHRoZSBk ZXZpY2UgYXQKPiAtICogZnJlcXVlbmN5IEBmcmVxIGFuZCB2b2x0YWdlIEB2b2x0YWdlLiAgSWYg dGhlIGdldF9keW5hbWljX3Bvd2VyKCkKPiAtICogd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhl IGRldmZyZXFfY29vbGluZ19wb3dlciBzdHJ1Y3QsIHRoZW4gdGhhdAo+IC0gKiBmdW5jdGlvbiBp cyB1c2VkLiAgT3RoZXJ3aXNlLCBhIHNpbXBsZSBwb3dlciBtb2RlbCAoUGR5biA9IENvZWZmICoK PiAtICogVm9sdGFnZV4yICogRnJlcXVlbmN5KSBpcyB1c2VkLgo+IC0gKi8KPiAtc3RhdGljIHVu c2lnbmVkIGxvbmcKPiAtZ2V0X2R5bmFtaWNfcG93ZXIoc3RydWN0IGRldmZyZXFfY29vbGluZ19k ZXZpY2UgKmRmYywgdW5zaWduZWQgbG9uZyBmcmVxLAo+IC0JCSAgdW5zaWduZWQgbG9uZyB2b2x0 YWdlKQo+ICtzdGF0aWMgdm9pZCBfbm9ybWFsaXplX2xvYWQoc3RydWN0IGRldmZyZXFfZGV2X3N0 YXR1cyAqc3RhdHVzKQo+ICB7Cj4gLQl1NjQgcG93ZXI7Cj4gLQl1MzIgZnJlcV9taHo7Cj4gLQlz dHJ1Y3QgZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpkZmNfcG93ZXIgPSBkZmMtPnBvd2VyX29wczsK PiAtCj4gLQlpZiAoZGZjX3Bvd2VyLT5nZXRfZHluYW1pY19wb3dlcikKPiAtCQlyZXR1cm4gZGZj X3Bvd2VyLT5nZXRfZHluYW1pY19wb3dlcihkZmMtPmRldmZyZXEsIGZyZXEsCj4gLQkJCQkJCSAg ICB2b2x0YWdlKTsKPiAtCj4gLQlmcmVxX21oeiA9IGZyZXEgLyAxMDAwMDAwOwo+IC0JcG93ZXIg PSAodTY0KWRmY19wb3dlci0+ZHluX3Bvd2VyX2NvZWZmICogZnJlcV9taHogKiB2b2x0YWdlICog dm9sdGFnZTsKPiAtCWRvX2Rpdihwb3dlciwgMTAwMDAwMDAwMCk7Cj4gKwkvKiBNYWtlIHNvbWUg c3BhY2UgaWYgbmVlZGVkICovCj4gKwlpZiAoc3RhdHVzLT5idXN5X3RpbWUgPiAweGZmZmYpIHsK PiArCQlzdGF0dXMtPmJ1c3lfdGltZSA+Pj0gMTA7Cj4gKwkJc3RhdHVzLT50b3RhbF90aW1lID4+ PSAxMDsKPiArCX0KPiAgCj4gLQlyZXR1cm4gcG93ZXI7Cj4gLX0KPiArCWlmIChzdGF0dXMtPmJ1 c3lfdGltZSA+IHN0YXR1cy0+dG90YWxfdGltZSkKPiArCQlzdGF0dXMtPmJ1c3lfdGltZSA9IHN0 YXR1cy0+dG90YWxfdGltZTsKPiAgCj4gKwlzdGF0dXMtPmJ1c3lfdGltZSAqPSAxMDA7Cj4gKwlz dGF0dXMtPmJ1c3lfdGltZSAvPSBzdGF0dXMtPnRvdGFsX3RpbWUgPyA6IDE7Cj4gIAo+IC1zdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3RvdGFsX3Bvd2VyKHN0cnVjdCBkZXZmcmVxX2Nv b2xpbmdfZGV2aWNlICpkZmMsCj4gLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZnJlcSwKPiAtCQkJ CQkgICAgdW5zaWduZWQgbG9uZyB2b2x0YWdlKQo+IC17Cj4gLQlyZXR1cm4gZ2V0X3N0YXRpY19w b3dlcihkZmMsIGZyZXEpICsgZ2V0X2R5bmFtaWNfcG93ZXIoZGZjLCBmcmVxLAo+IC0JCQkJCQkJ ICAgICAgIHZvbHRhZ2UpOwo+ICsJLyogQXZvaWQgZGl2aXNpb24gYnkgMCAqLwo+ICsJc3RhdHVz LT5idXN5X3RpbWUgPSBzdGF0dXMtPmJ1c3lfdGltZSA/IDogMTsKPiArCXN0YXR1cy0+dG90YWxf dGltZSA9IDEwMDsKPiAgfQo+ICAKPiAtCj4gIHN0YXRpYyBpbnQgZGV2ZnJlcV9jb29saW5nX2dl dF9yZXF1ZXN0ZWRfcG93ZXIoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4g IAkJCQkJICAgICAgIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKPiAgCQkJCQkgICAg ICAgdTMyICpwb3dlcikKPiAgewo+ICAJc3RydWN0IGRldmZyZXFfY29vbGluZ19kZXZpY2UgKmRm YyA9IGNkZXYtPmRldmRhdGE7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcSAqZGYgPSBkZmMtPmRldmZyZXE7 Cj4gLQlzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzICpzdGF0dXMgPSAmZGYtPmxhc3Rfc3RhdHVz Owo+IC0JdW5zaWduZWQgbG9uZyBzdGF0ZTsKPiAtCXVuc2lnbmVkIGxvbmcgZnJlcSA9IHN0YXR1 cy0+Y3VycmVudF9mcmVxdWVuY3k7Cj4gLQl1bnNpZ25lZCBsb25nIHZvbHRhZ2U7Cj4gLQl1MzIg ZHluX3Bvd2VyID0gMDsKPiAtCXUzMiBzdGF0aWNfcG93ZXIgPSAwOwo+ICsJc3RydWN0IGRldmZy ZXFfZGV2X3N0YXR1cyBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nIHZvbHRhZ2UsIGZyZXE7Cj4g Kwl1bnNpZ25lZCBsb25nIGVtX3BlcmZfaWR4Owo+ICAJaW50IHJlczsKPiAgCj4gLQlzdGF0ZSA9 IGZyZXFfZ2V0X3N0YXRlKGRmYywgZnJlcSk7Cj4gLQlpZiAoc3RhdGUgPT0gVEhFUk1BTF9DU1RB VEVfSU5WQUxJRCkgewo+IC0JCXJlcyA9IC1FQUdBSU47Cj4gLQkJZ290byBmYWlsOwo+IC0JfQo+ ICsJbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ICsJcmVzID0gZGYtPnByb2ZpbGUtPmdldF9kZXZf c3RhdHVzKGRmLT5kZXYucGFyZW50LCAmc3RhdHVzKTsKPiArCW11dGV4X3VubG9jaygmZGYtPmxv Y2spOwo+ICsJaWYgKHJlcykKPiArCQlyZXR1cm4gcmVzOwo+ICAKPiAtCWlmIChkZmMtPnBvd2Vy X29wcy0+Z2V0X3JlYWxfcG93ZXIpIHsKPiArCWZyZXEgPSBzdGF0dXMuY3VycmVudF9mcmVxdWVu Y3k7Cj4gKwo+ICsJLyogRW5lcmd5IE1vZGVsIGZyZXF1ZW5jaWVzIGFyZSBpbiBrSHogKi8KPiAr CWVtX3BlcmZfaWR4ID0gZnJlcV9nZXRfc3RhdGUoZGZjLCBmcmVxIC8gMTAwMCk7Cj4gKwlpZiAo ZW1fcGVyZl9pZHggPT0gVEhFUk1BTF9DU1RBVEVfSU5WQUxJRCkKPiArCQlyZXR1cm4gLUVBR0FJ TjsKPiArCj4gKwkvKgo+ICsJICogSWYgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgY29vbGluZyBkZXZp Y2UgbW9kZWwgd2FzIG5vdCBwcm92aWRlZCBieSB0aGUKPiArCSAqIGRyaXZlciwgdXNlIHNpbXBs ZSBFbmVyZ3kgTW9kZWwgcG93ZXIgY2FsY3VsYXRpb24uCj4gKwkgKi8KPiArCWlmICghZGZjLT5w b3dlcl9vcHMgfHwgIWRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcikgewo+ICsJCV9ub3Jt YWxpemVfbG9hZCgmc3RhdHVzKTsKPiArCQlkZmNfZW1fZ2V0X3JlcXVlc3RlZF9wb3dlcihkZmMt PmVtLCAmc3RhdHVzLCBwb3dlciwKPiArCQkJCQkgICBlbV9wZXJmX2lkeCk7Cj4gKwl9IGVsc2Ug ewo+ICAJCXZvbHRhZ2UgPSBnZXRfdm9sdGFnZShkZiwgZnJlcSk7Cj4gIAkJaWYgKHZvbHRhZ2Ug PT0gMCkgewo+IC0JCQlyZXMgPSAtRUlOVkFMOwo+IC0JCQlnb3RvIGZhaWw7Cj4gKwkJCWRmYy0+ cmVzX3V0aWwgPSBTQ0FMRV9FUlJPUl9NSVRJR0FUSU9OOwo+ICsJCQlyZXR1cm4gLUVJTlZBTDsK PiAgCQl9Cj4gIAo+ICAJCXJlcyA9IGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcihkZiwg cG93ZXIsIGZyZXEsIHZvbHRhZ2UpOwo+ICAJCWlmICghcmVzKSB7Cj4gLQkJCXN0YXRlID0gZGZj LT5jYXBwZWRfc3RhdGU7Cj4gLQkJCWRmYy0+cmVzX3V0aWwgPSBkZmMtPnBvd2VyX3RhYmxlW3N0 YXRlXTsKPiArCQkJZGZjLT5yZXNfdXRpbCA9IGRmYy0+ZW0tPnRhYmxlW2VtX3BlcmZfaWR4XS5w b3dlcjsKPiAgCQkJZGZjLT5yZXNfdXRpbCAqPSBTQ0FMRV9FUlJPUl9NSVRJR0FUSU9OOwo+ICAK PiAgCQkJaWYgKCpwb3dlciA+IDEpCj4gIAkJCQlkZmMtPnJlc191dGlsIC89ICpwb3dlcjsKPiAg CQl9IGVsc2Ugewo+IC0JCQlnb3RvIGZhaWw7Cj4gKwkJCS8qIEl0IGlzIHNhZmUgdG8gc2V0IG1h eCBpbiB0aGlzIGNhc2UgKi8KPiArCQkJZGZjLT5yZXNfdXRpbCA9IFNDQUxFX0VSUk9SX01JVElH QVRJT047Cj4gKwkJCXJldHVybiByZXM7Cj4gIAkJfQo+IC0JfSBlbHNlIHsKPiAtCQlkeW5fcG93 ZXIgPSBkZmMtPnBvd2VyX3RhYmxlW3N0YXRlXTsKPiAtCj4gLQkJLyogU2NhbGUgZHluYW1pYyBw b3dlciBmb3IgdXRpbGl6YXRpb24gKi8KPiAtCQlkeW5fcG93ZXIgKj0gc3RhdHVzLT5idXN5X3Rp bWU7Cj4gLQkJZHluX3Bvd2VyIC89IHN0YXR1cy0+dG90YWxfdGltZTsKPiAtCQkvKiBHZXQgc3Rh dGljIHBvd2VyICovCj4gLQkJc3RhdGljX3Bvd2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMsIGZy ZXEpOwo+IC0KPiAtCQkqcG93ZXIgPSBkeW5fcG93ZXIgKyBzdGF0aWNfcG93ZXI7Cj4gIAl9Cj4g IAo+IC0JdHJhY2VfdGhlcm1hbF9wb3dlcl9kZXZmcmVxX2dldF9wb3dlcihjZGV2LCBzdGF0dXMs IGZyZXEsIGR5bl9wb3dlciwKPiAtCQkJCQkgICAgICBzdGF0aWNfcG93ZXIsICpwb3dlcik7Cj4g Kwl0cmFjZV90aGVybWFsX3Bvd2VyX2RldmZyZXFfZ2V0X3Bvd2VyKGNkZXYsICZzdGF0dXMsIGZy ZXEsICpwb3dlcik7Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gLWZhaWw6Cj4gLQkvKiBJdCBpcyBzYWZl IHRvIHNldCBtYXggaW4gdGhpcyBjYXNlICovCj4gLQlkZmMtPnJlc191dGlsID0gU0NBTEVfRVJS T1JfTUlUSUdBVElPTjsKPiAtCXJldHVybiByZXM7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgZGV2 ZnJlcV9jb29saW5nX3N0YXRlMnBvd2VyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpj ZGV2LAo+IEBAIC0zMDIsMTYgKzI1NywxNCBAQCBzdGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19z dGF0ZTJwb3dlcihzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiAgCQkJCSAg ICAgICB1MzIgKnBvd2VyKQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAq ZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiAtCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiAtCXUzMiBzdGF0 aWNfcG93ZXI7Cj4gKwlpbnQgaWR4Owo+ICAKPiAtCWlmIChzdGF0ZSA+PSBkZmMtPmZyZXFfdGFi bGVfc2l6ZSkKPiArCWlmIChzdGF0ZSA+IGRmYy0+bWF4X3N0YXRlKQo+ICAJCXJldHVybiAtRUlO VkFMOwo+ICAKPiAtCWZyZXEgPSBkZmMtPmZyZXFfdGFibGVbc3RhdGVdOwo+IC0Jc3RhdGljX3Bv d2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMsIGZyZXEpOwo+ICsJaWR4ID0gZGZjLT5tYXhfc3Rh dGUgLSBzdGF0ZTsKPiArCSpwb3dlciA9IGRmYy0+ZW0tPnRhYmxlW2lkeF0ucG93ZXI7Cj4gIAo+ IC0JKnBvd2VyID0gZGZjLT5wb3dlcl90YWJsZVtzdGF0ZV0gKyBzdGF0aWNfcG93ZXI7Cj4gIAly ZXR1cm4gMDsKPiAgfQo+ICAKPiBAQCAtMzIxLDM5ICsyNzQsNDEgQEAgc3RhdGljIGludCBkZXZm cmVxX2Nvb2xpbmdfcG93ZXIyc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNk ZXYsCj4gIHsKPiAgCXN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMgPSBjZGV2LT5k ZXZkYXRhOwo+ICAJc3RydWN0IGRldmZyZXEgKmRmID0gZGZjLT5kZXZmcmVxOwo+IC0Jc3RydWN0 IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdHVzID0gJmRmLT5sYXN0X3N0YXR1czsKPiAtCXVuc2ln bmVkIGxvbmcgZnJlcSA9IHN0YXR1cy0+Y3VycmVudF9mcmVxdWVuY3k7Cj4gLQl1bnNpZ25lZCBs b25nIGJ1c3lfdGltZTsKPiAtCXMzMiBkeW5fcG93ZXI7Cj4gLQl1MzIgc3RhdGljX3Bvd2VyOwo+ IC0JczMyIGVzdF9wb3dlcjsKPiArCXN0cnVjdCBkZXZmcmVxX2Rldl9zdGF0dXMgc3RhdHVzOwo+ ICsJdTMyIGVzdF9wb3dlciA9IHBvd2VyOwo+ICsJdW5zaWduZWQgbG9uZyBmcmVxOwo+ICAJaW50 IGk7Cj4gIAo+IC0JaWYgKGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcikgewo+IC0JCS8q IFNjYWxlIGZvciByZXNvdXJjZSB1dGlsaXphdGlvbiAqLwo+IC0JCWVzdF9wb3dlciA9IHBvd2Vy ICogZGZjLT5yZXNfdXRpbDsKPiAtCQllc3RfcG93ZXIgLz0gU0NBTEVfRVJST1JfTUlUSUdBVElP TjsKPiAtCX0gZWxzZSB7Cj4gLQkJc3RhdGljX3Bvd2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMs IGZyZXEpOwo+ICsJbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ICsJc3RhdHVzID0gZGYtPmxhc3Rf c3RhdHVzOwo+ICsJbXV0ZXhfdW5sb2NrKCZkZi0+bG9jayk7Cj4gIAo+IC0JCWR5bl9wb3dlciA9 IHBvd2VyIC0gc3RhdGljX3Bvd2VyOwo+IC0JCWR5bl9wb3dlciA9IGR5bl9wb3dlciA+IDAgPyBk eW5fcG93ZXIgOiAwOwo+ICsJZnJlcSA9IHN0YXR1cy5jdXJyZW50X2ZyZXF1ZW5jeTsKPiAgCj4g LQkJLyogU2NhbGUgZHluYW1pYyBwb3dlciBmb3IgdXRpbGl6YXRpb24gKi8KPiAtCQlidXN5X3Rp bWUgPSBzdGF0dXMtPmJ1c3lfdGltZSA/OiAxOwo+IC0JCWVzdF9wb3dlciA9IChkeW5fcG93ZXIg KiBzdGF0dXMtPnRvdGFsX3RpbWUpIC8gYnVzeV90aW1lOwo+ICsJLyoKPiArCSAqIFNjYWxlIGZv ciByZXNvdXJjZSB1dGlsaXphdGlvbi4gVXNlIHNpbXBsZSBFbmVyZ3kgTW9kZWwgcG93ZXIKPiAr CSAqIGNhbGN1bGF0aW9uIGlmIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGNvb2xpbmcgZGV2aWNlIG1v ZGVsIGRvZXMKPiArCSAqIG5vdCBleGlzdC4KPiArCSAqLwo+ICsJaWYgKCFkZmMtPnBvd2VyX29w cyB8fCAhZGZjLT5wb3dlcl9vcHMtPmdldF9yZWFsX3Bvd2VyKSB7Cj4gKwkJX25vcm1hbGl6ZV9s b2FkKCZzdGF0dXMpOwo+ICsJCWVzdF9wb3dlciAqPSBzdGF0dXMudG90YWxfdGltZTsKPiArCQll c3RfcG93ZXIgLz0gc3RhdHVzLmJ1c3lfdGltZTsKPiArCX0gZWxzZSB7Cj4gKwkJZXN0X3Bvd2Vy ICo9IGRmYy0+cmVzX3V0aWw7Cj4gKwkJZXN0X3Bvd2VyIC89IFNDQUxFX0VSUk9SX01JVElHQVRJ T047Cj4gIAl9Cj4gIAo+ICAJLyoKPiAgCSAqIEZpbmQgdGhlIGZpcnN0IGNvb2xpbmcgc3RhdGUg dGhhdCBpcyB3aXRoaW4gdGhlIHBvd2VyCj4gLQkgKiBidWRnZXQgZm9yIGR5bmFtaWMgcG93ZXIu Cj4gKwkgKiBidWRnZXQuIFRoZSBFTSBwb3dlciB0YWJsZSBpcyBzb3J0ZWQgYXNjZW5kaW5nLgo+ ICAJICovCj4gLQlmb3IgKGkgPSAwOyBpIDwgZGZjLT5mcmVxX3RhYmxlX3NpemUgLSAxOyBpKysp Cj4gLQkJaWYgKGVzdF9wb3dlciA+PSBkZmMtPnBvd2VyX3RhYmxlW2ldKQo+ICsJZm9yIChpID0g ZGZjLT5tYXhfc3RhdGU7IGkgPiAwOyBpLS0pCj4gKwkJaWYgKGVzdF9wb3dlciA+PSBkZmMtPmVt LT50YWJsZVtpXS5wb3dlcikKPiAgCQkJYnJlYWs7Cj4gIAo+IC0JKnN0YXRlID0gaTsKPiAtCWRm Yy0+Y2FwcGVkX3N0YXRlID0gaTsKPiArCSpzdGF0ZSA9IGRmYy0+bWF4X3N0YXRlIC0gaTsKPiAr Cj4gIAl0cmFjZV90aGVybWFsX3Bvd2VyX2RldmZyZXFfbGltaXQoY2RldiwgZnJlcSwgKnN0YXRl LCBwb3dlcik7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+IEBAIC0zNjUsOTEgKzMyMCw0MyBAQCBzdGF0 aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGRldmZyZXFfY29vbGluZ19vcHMg PSB7Cj4gIH07Cj4gIAo+ICAvKioKPiAtICogZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoKSAt IEdlbmVyYXRlIHBvd2VyIGFuZCBmcmVxIHRhYmxlcy4KPiAtICogQGRmYzogUG9pbnRlciB0byBk ZXZmcmVxIGNvb2xpbmcgZGV2aWNlLgo+IC0gKgo+IC0gKiBHZW5lcmF0ZSBwb3dlciBhbmQgZnJl cXVlbmN5IHRhYmxlczogdGhlIHBvd2VyIHRhYmxlIGhvbGQgdGhlCj4gLSAqIGRldmljZSdzIG1h eGltdW0gcG93ZXIgdXNhZ2UgYXQgZWFjaCBjb29saW5nIHN0YXRlIChPUFApLiAgVGhlCj4gLSAq IHN0YXRpYyBhbmQgZHluYW1pYyBwb3dlciB1c2luZyB0aGUgYXBwcm9wcmlhdGUgdm9sdGFnZSBh bmQKPiAtICogZnJlcXVlbmN5IGZvciB0aGUgc3RhdGUsIGlzIGFjcXVpcmVkIGZyb20gdGhlIHN0 cnVjdAo+IC0gKiBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIsIGFuZCBzdW1tZWQgdG8gbWFrZSB0aGUg bWF4aW11bSBwb3dlciBkcmF3Lgo+IC0gKgo+IC0gKiBUaGUgZnJlcXVlbmN5IHRhYmxlIGhvbGRz IHRoZSBmcmVxdWVuY2llcyBpbiBkZXNjZW5kaW5nIG9yZGVyLgo+IC0gKiBUaGF0IHdheSBpdHMg aW5kZXhlZCBieSBjb29saW5nIGRldmljZSBzdGF0ZS4KPiArICogZGV2ZnJlcV9jb29saW5nX2dl bl90YWJsZXMoKSAtIEdlbmVyYXRlIGZyZXF1ZW5jeSB0YWJsZS4KPiArICogQGRmYzoJUG9pbnRl ciB0byBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlLgo+ICsgKiBAbnVtX29wcHM6CU51bWJlciBvZiBP UFBzCj4gICAqCj4gLSAqIFRoZSB0YWJsZXMgYXJlIG1hbGxvY2VkLCBhbmQgcG9pbnRlcnMgcHV0 IGluIGRmYy4gIFRoZXkgbXVzdCBiZQo+IC0gKiBmcmVlZCB3aGVuIHVucmVnaXN0ZXJpbmcgdGhl IGRldmZyZXEgY29vbGluZyBkZXZpY2UuCj4gKyAqIEdlbmVyYXRlIGZyZXF1ZW5jeSB0YWJsZSB3 aGljaCBob2xkcyB0aGUgZnJlcXVlbmNpZXMgaW4gZGVzY2VuZGluZwo+ICsgKiBvcmRlci4gVGhh dCB3YXkgaXRzIGluZGV4ZWQgYnkgY29vbGluZyBkZXZpY2Ugc3RhdGUuIFRoaXMgaXMgZm9yCj4g KyAqIGNvbXBhdGliaWxpdHkgd2l0aCBkcml2ZXJzIHdoaWNoIGRvIG5vdCByZWdpc3RlciBFbmVy Z3kgTW9kZWwuCj4gICAqCj4gICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCj4gICAqLwo+IC1zdGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19n ZW5fdGFibGVzKHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMpCj4gK3N0YXRpYyBp bnQgZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoc3RydWN0IGRldmZyZXFfY29vbGluZ19kZXZp Y2UgKmRmYywKPiArCQkJCSAgICAgIGludCBudW1fb3BwcykKPiAgewo+ICAJc3RydWN0IGRldmZy ZXEgKmRmID0gZGZjLT5kZXZmcmVxOwo+ICAJc3RydWN0IGRldmljZSAqZGV2ID0gZGYtPmRldi5w YXJlbnQ7Cj4gLQlpbnQgcmV0LCBudW1fb3BwczsKPiAgCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiAt CXUzMiAqcG93ZXJfdGFibGUgPSBOVUxMOwo+IC0JdTMyICpmcmVxX3RhYmxlOwo+ICAJaW50IGk7 Cj4gIAo+IC0JbnVtX29wcHMgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQoZGV2KTsKPiAtCj4g LQlpZiAoZGZjLT5wb3dlcl9vcHMpIHsKPiAtCQlwb3dlcl90YWJsZSA9IGtjYWxsb2MobnVtX29w cHMsIHNpemVvZigqcG93ZXJfdGFibGUpLAo+IC0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Cj4gLQkJ aWYgKCFwb3dlcl90YWJsZSkKPiAtCQkJcmV0dXJuIC1FTk9NRU07Cj4gLQl9Cj4gLQo+IC0JZnJl cV90YWJsZSA9IGtjYWxsb2MobnVtX29wcHMsIHNpemVvZigqZnJlcV90YWJsZSksCj4gKwlkZmMt PmZyZXFfdGFibGUgPSBrY2FsbG9jKG51bV9vcHBzLCBzaXplb2YoKmRmYy0+ZnJlcV90YWJsZSks Cj4gIAkJCSAgICAgR0ZQX0tFUk5FTCk7Cj4gLQlpZiAoIWZyZXFfdGFibGUpIHsKPiAtCQlyZXQg PSAtRU5PTUVNOwo+IC0JCWdvdG8gZnJlZV9wb3dlcl90YWJsZTsKPiAtCX0KPiArCWlmICghZGZj LT5mcmVxX3RhYmxlKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICAKPiAgCWZvciAoaSA9IDAsIGZy ZXEgPSBVTE9OR19NQVg7IGkgPCBudW1fb3BwczsgaSsrLCBmcmVxLS0pIHsKPiAtCQl1bnNpZ25l ZCBsb25nIHBvd2VyLCB2b2x0YWdlOwo+ICAJCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7Cj4gIAo+ ICAJCW9wcCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yKGRldiwgJmZyZXEpOwo+ICAJCWlm IChJU19FUlIob3BwKSkgewo+IC0JCQlyZXQgPSBQVFJfRVJSKG9wcCk7Cj4gLQkJCWdvdG8gZnJl ZV90YWJsZXM7Cj4gKwkJCWtmcmVlKGRmYy0+ZnJlcV90YWJsZSk7Cj4gKwkJCXJldHVybiBQVFJf RVJSKG9wcCk7Cj4gIAkJfQo+ICAKPiAtCQl2b2x0YWdlID0gZGV2X3BtX29wcF9nZXRfdm9sdGFn ZShvcHApIC8gMTAwMDsgLyogbVYgKi8KPiAgCQlkZXZfcG1fb3BwX3B1dChvcHApOwo+IC0KPiAt CQlpZiAoZGZjLT5wb3dlcl9vcHMpIHsKPiAtCQkJaWYgKGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVh bF9wb3dlcikKPiAtCQkJCXBvd2VyID0gZ2V0X3RvdGFsX3Bvd2VyKGRmYywgZnJlcSwgdm9sdGFn ZSk7Cj4gLQkJCWVsc2UKPiAtCQkJCXBvd2VyID0gZ2V0X2R5bmFtaWNfcG93ZXIoZGZjLCBmcmVx LCB2b2x0YWdlKTsKPiAtCj4gLQkJCWRldl9kYmcoZGV2LCAiUG93ZXIgdGFibGU6ICVsdSBNSHog QCAlbHUgbVY6ICVsdSA9ICVsdSBtV1xuIiwKPiAtCQkJCWZyZXEgLyAxMDAwMDAwLCB2b2x0YWdl LCBwb3dlciwgcG93ZXIpOwo+IC0KPiAtCQkJcG93ZXJfdGFibGVbaV0gPSBwb3dlcjsKPiAtCQl9 Cj4gLQo+IC0JCWZyZXFfdGFibGVbaV0gPSBmcmVxOwo+ICsJCWRmYy0+ZnJlcV90YWJsZVtpXSA9 IGZyZXE7Cj4gIAl9Cj4gIAo+IC0JaWYgKGRmYy0+cG93ZXJfb3BzKQo+IC0JCWRmYy0+cG93ZXJf dGFibGUgPSBwb3dlcl90YWJsZTsKPiAtCj4gLQlkZmMtPmZyZXFfdGFibGUgPSBmcmVxX3RhYmxl Owo+IC0JZGZjLT5mcmVxX3RhYmxlX3NpemUgPSBudW1fb3BwczsKPiAtCj4gIAlyZXR1cm4gMDsK PiAtCj4gLWZyZWVfdGFibGVzOgo+IC0Ja2ZyZWUoZnJlcV90YWJsZSk7Cj4gLWZyZWVfcG93ZXJf dGFibGU6Cj4gLQlrZnJlZShwb3dlcl90YWJsZSk7Cj4gLQo+IC0JcmV0dXJuIHJldDsKPiAgfQo+ ICAKPiAgLyoqCj4gQEAgLTQ3NCw3ICszODEsNyBAQCBvZl9kZXZmcmVxX2Nvb2xpbmdfcmVnaXN0 ZXJfcG93ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGRldmZyZXEgKmRmLAo+ICAJ c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9j b29saW5nX2RldmljZSAqZGZjOwo+ICAJY2hhciBkZXZfbmFtZVtUSEVSTUFMX05BTUVfTEVOR1RI XTsKPiAtCWludCBlcnI7Cj4gKwlpbnQgZXJyLCBudW1fb3BwczsKPiAgCj4gIAlkZmMgPSBremFs bG9jKHNpemVvZigqZGZjKSwgR0ZQX0tFUk5FTCk7Cj4gIAlpZiAoIWRmYykKPiBAQCAtNDgyLDI4 ICszODksNDUgQEAgb2ZfZGV2ZnJlcV9jb29saW5nX3JlZ2lzdGVyX3Bvd2VyKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZmcmVxICpkZiwKPiAgCj4gIAlkZmMtPmRldmZyZXEgPSBk ZjsKPiAgCj4gLQlpZiAoZGZjX3Bvd2VyKSB7Cj4gLQkJZGZjLT5wb3dlcl9vcHMgPSBkZmNfcG93 ZXI7Cj4gLQo+ICsJZGZjLT5lbSA9IGVtX3BkX2dldChkZi0+ZGV2LnBhcmVudCk7Cj4gKwlpZiAo ZGZjLT5lbSkgewo+ICAJCWRldmZyZXFfY29vbGluZ19vcHMuZ2V0X3JlcXVlc3RlZF9wb3dlciA9 Cj4gIAkJCWRldmZyZXFfY29vbGluZ19nZXRfcmVxdWVzdGVkX3Bvd2VyOwo+ICAJCWRldmZyZXFf Y29vbGluZ19vcHMuc3RhdGUycG93ZXIgPSBkZXZmcmVxX2Nvb2xpbmdfc3RhdGUycG93ZXI7Cj4g IAkJZGV2ZnJlcV9jb29saW5nX29wcy5wb3dlcjJzdGF0ZSA9IGRldmZyZXFfY29vbGluZ19wb3dl cjJzdGF0ZTsKPiArCj4gKwkJZGZjLT5wb3dlcl9vcHMgPSBkZmNfcG93ZXI7Cj4gKwo+ICsJCW51 bV9vcHBzID0gZW1fcGRfbnJfcGVyZl9zdGF0ZXMoZGZjLT5lbSk7Cj4gKwl9IGVsc2Ugewo+ICsJ CS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGRyaXZlcnMgd2hpY2ggZG8gbm90IHVzZSBJ UEEgKi8KPiArCQlkZXZfZGJnKGRmLT5kZXYucGFyZW50LCAibWlzc2luZyBFTSBmb3IgY29vbGlu ZyBkZXZpY2VcbiIpOwo+ICsKPiArCQludW1fb3BwcyA9IGRldl9wbV9vcHBfZ2V0X29wcF9jb3Vu dChkZi0+ZGV2LnBhcmVudCk7Cj4gKwo+ICsJCWVyciA9IGRldmZyZXFfY29vbGluZ19nZW5fdGFi bGVzKGRmYywgbnVtX29wcHMpOwo+ICsJCWlmIChlcnIpCj4gKwkJCWdvdG8gZnJlZV9kZmM7Cj4g IAl9Cj4gIAo+IC0JZXJyID0gZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoZGZjKTsKPiAtCWlm IChlcnIpCj4gKwlpZiAobnVtX29wcHMgPD0gMCkgewo+ICsJCWVyciA9IC1FSU5WQUw7Cj4gIAkJ Z290byBmcmVlX2RmYzsKPiArCX0KPiArCj4gKwkvKiBtYXhfc3RhdGUgaXMgYW4gaW5kZXgsIG5v dCBhIGNvdW50ZXIgKi8KPiArCWRmYy0+bWF4X3N0YXRlID0gbnVtX29wcHMgLSAxOwo+ICAKPiAg CWVyciA9IGRldl9wbV9xb3NfYWRkX3JlcXVlc3QoZGYtPmRldi5wYXJlbnQsICZkZmMtPnJlcV9t YXhfZnJlcSwKPiAgCQkJCSAgICAgREVWX1BNX1FPU19NQVhfRlJFUVVFTkNZLAo+ICAJCQkJICAg ICBQTV9RT1NfTUFYX0ZSRVFVRU5DWV9ERUZBVUxUX1ZBTFVFKTsKPiAgCWlmIChlcnIgPCAwKQo+ IC0JCWdvdG8gZnJlZV90YWJsZXM7Cj4gKwkJZ290byBmcmVlX3RhYmxlOwo+ICAKPiAgCWVyciA9 IGlkYV9zaW1wbGVfZ2V0KCZkZXZmcmVxX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7Cj4gIAlpZiAo ZXJyIDwgMCkKPiAgCQlnb3RvIHJlbW92ZV9xb3NfcmVxOwo+ICsKPiAgCWRmYy0+aWQgPSBlcnI7 Cj4gIAo+ICAJc25wcmludGYoZGV2X25hbWUsIHNpemVvZihkZXZfbmFtZSksICJ0aGVybWFsLWRl dmZyZXEtJWQiLCBkZmMtPmlkKTsKPiBAQCAtNTI0LDE2ICs0NDgsMTYgQEAgb2ZfZGV2ZnJlcV9j b29saW5nX3JlZ2lzdGVyX3Bvd2VyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZm cmVxICpkZiwKPiAgCj4gIHJlbGVhc2VfaWRhOgo+ICAJaWRhX3NpbXBsZV9yZW1vdmUoJmRldmZy ZXFfaWRhLCBkZmMtPmlkKTsKPiAtCj4gIHJlbW92ZV9xb3NfcmVxOgo+ICAJZGV2X3BtX3Fvc19y ZW1vdmVfcmVxdWVzdCgmZGZjLT5yZXFfbWF4X2ZyZXEpOwo+IC0KPiAtZnJlZV90YWJsZXM6Cj4g LQlrZnJlZShkZmMtPnBvd2VyX3RhYmxlKTsKPiArZnJlZV90YWJsZToKPiAgCWtmcmVlKGRmYy0+ ZnJlcV90YWJsZSk7Cj4gIGZyZWVfZGZjOgo+ICAJa2ZyZWUoZGZjKTsKPiAgCj4gKwlpZiAoZGZj LT5lbSkKPiArCQllbV9wZF9wdXQoZGYtPmRldi5wYXJlbnQpOwo+ICsKPiAgCXJldHVybiBFUlJf UFRSKGVycik7Cj4gIH0KPiAgRVhQT1JUX1NZTUJPTF9HUEwob2ZfZGV2ZnJlcV9jb29saW5nX3Jl Z2lzdGVyX3Bvd2VyKTsKPiBAQCAtNTYxLDI1ICs0ODUsMTE5IEBAIHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpkZXZmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRm KQo+ICB9Cj4gIEVYUE9SVF9TWU1CT0xfR1BMKGRldmZyZXFfY29vbGluZ19yZWdpc3Rlcik7Cj4g IAo+ICsvKioKPiArICogZGV2ZnJlcV9jb29saW5nX2VtX3JlZ2lzdGVyX3Bvd2VyKCkgLSBSZWdp c3RlciBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlIHdpdGgKPiArICoJCXBvd2VyIGluZm9ybWF0aW9u IGFuZCBhdHRlbXB0IHRvIHJlZ2lzdGVyIEVuZXJneSBNb2RlbCAoRU0pCj4gKyAqIEBkZjoJCVBv aW50ZXIgdG8gZGV2ZnJlcSBkZXZpY2UuCj4gKyAqIEBkZmNfcG93ZXI6CVBvaW50ZXIgdG8gZGV2 ZnJlcV9jb29saW5nX3Bvd2VyLgo+ICsgKiBAZW1fY2I6CUNhbGxiYWNrIGZ1bmN0aW9ucyBwcm92 aWRpbmcgdGhlIGRhdGEgb2YgdGhlIEVNCj4gKyAqCj4gKyAqIFJlZ2lzdGVyIGEgZGV2ZnJlcSBj b29saW5nIGRldmljZSBhbmQgYXR0ZW1wdCB0byByZWdpc3RlciBFbmVyZ3kgTW9kZWwuIFRoZQo+ ICsgKiBhdmFpbGFibGUgT1BQcyBtdXN0IGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBkZXZpY2UuCj4g KyAqCj4gKyAqIElmIEBkZmNfcG93ZXIgaXMgcHJvdmlkZWQsIHRoZSBjb29saW5nIGRldmljZSBp cyByZWdpc3RlcmVkIHdpdGggdGhlCj4gKyAqIHBvd2VyIGV4dGVuc2lvbnMuIElmIEBlbV9jYiBp cyBwcm92aWRlZCBpdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBPUFAgdG8KPiArICogY2FsY3Vs YXRlIHBvd2VyIHZhbHVlIGFuZCBjb3N0LiBJZiBAZW1fY2IgaXMgbm90IHByb3ZpZGVkIHRoZW4g c2ltcGxlIEVuZXJneQo+ICsgKiBNb2RlbCBpcyBnb2luZyB0byBiZSB1c2VkLCB3aGljaCByZXF1 aXJlcyAiZHluYW1pYy1wb3dlci1jb2VmZmljaWVudCIgYQo+ICsgKiBkZXZpY2V0cmVlIHByb3Bl cnR5Lgo+ICsgKi8KPiArc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVx X2Nvb2xpbmdfZW1fcmVnaXN0ZXJfcG93ZXIoc3RydWN0IGRldmZyZXEgKmRmLAo+ICsJCQkJICBz dHJ1Y3QgZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpkZmNfcG93ZXIsCj4gKwkJCQkgIHN0cnVjdCBl bV9kYXRhX2NhbGxiYWNrICplbV9jYikKPiArewo+ICsJc3RydWN0IHRoZXJtYWxfY29vbGluZ19k ZXZpY2UgKmNkZXY7Cj4gKwlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAqZGZjOwo+ICsJ c3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4g KwlpbnQgbnJfb3BwLCByZXQ7Cj4gKwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGRmKSkKPiArCQly ZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPiArCj4gKwlkZXYgPSBkZi0+ZGV2LnBhcmVudDsKPiAr Cj4gKwlpZiAoZW1fY2IpIHsKPiArCQlucl9vcHAgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQo ZGV2KTsKPiArCQlpZiAobnJfb3BwIDw9IDApIHsKPiArCQkJZGV2X2VycihkZXYsICJObyB2YWxp ZCBPUFBzIGZvdW5kXG4iKTsKPiArCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gKwkJfQo+ ICsKPiArCQlyZXQgPSBlbV9kZXZfcmVnaXN0ZXJfcGVyZl9kb21haW4oZGV2LCBucl9vcHAsIGVt X2NiLCBOVUxMKTsKPiArCX0gZWxzZSB7Cj4gKwkJcmV0ID0gZGV2X3BtX29wcF9vZl9yZWdpc3Rl cl9lbShkZXYsIE5VTEwpOwo+ICsJfQo+ICsKPiArCWlmIChyZXQpCj4gKwkJZGV2X3dhcm4oZGV2 LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIEVNIGZvciBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlICglZClc biIsCj4gKwkJCSByZXQpOwo+ICsKPiArCWlmIChkZXYtPm9mX25vZGUpCj4gKwkJbnAgPSBvZl9u b2RlX2dldChkZXYtPm9mX25vZGUpOwo+ICsKPiArCWNkZXYgPSBvZl9kZXZmcmVxX2Nvb2xpbmdf cmVnaXN0ZXJfcG93ZXIobnAsIGRmLCBkZmNfcG93ZXIpOwo+ICsKPiArCWlmIChucCkKPiArCQlv Zl9ub2RlX3B1dChucCk7Cj4gKwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGNkZXYpKSB7Cj4gKwkJ aWYgKCFyZXQpCj4gKwkJCWVtX2Rldl91bnJlZ2lzdGVyX3BlcmZfZG9tYWluKGRldik7Cj4gKwl9 IGVsc2Ugewo+ICsJCWRmYyA9IGNkZXYtPmRldmRhdGE7Cj4gKwkJZGZjLT5lbV9yZWdpc3RlcmVk ID0gIXJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gY2RldjsKPiArfQo+ICtFWFBPUlRfU1lNQk9M X0dQTChkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXJfcG93ZXIpOwo+ICsKPiArLyoqCj4gKyAq IGRldmZyZXFfY29vbGluZ19lbV9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgZGV2ZnJlcSBjb29saW5n IGRldmljZSB0b2dldGhlcgo+ICsgKgkJCQl3aXRoIEVuZXJneSBNb2RlbC4KPiArICogQGRmOgkJ UG9pbnRlciB0byBkZXZmcmVxIGRldmljZS4KPiArICogQGVtX2NiOglDYWxsYmFjayBmdW5jdGlv bnMgcHJvdmlkaW5nIHRoZSBkYXRhIG9mIHRoZSBFbmVyZ3kgTW9kZWwKPiArICoKPiArICogVGhp cyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZWdpc3RlciBFbmVyZ3kgTW9kZWwgZm9yIGRldmZyZXEg ZGV2aWNlIGFuZCB0aGVuCj4gKyAqIHJlZ2lzdGVyIHRoZSBkZXZmcmVxIGNvb2xpbmcgZGV2aWNl Lgo+ICsgKi8KPiArc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nv b2xpbmdfZW1fcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRmLCBzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqZW1fY2IpCj4gK3sKPiArCXJldHVybiBkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXJf cG93ZXIoZGYsIE5VTEwsIGVtX2NiKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChkZXZmcmVx X2Nvb2xpbmdfZW1fcmVnaXN0ZXIpOwo+ICsKPiAgLyoqCj4gICAqIGRldmZyZXFfY29vbGluZ191 bnJlZ2lzdGVyKCkgLSBVbnJlZ2lzdGVyIGRldmZyZXEgY29vbGluZyBkZXZpY2UuCj4gICAqIEBj ZGV2OiBQb2ludGVyIHRvIGRldmZyZXEgY29vbGluZyBkZXZpY2UgdG8gdW5yZWdpc3Rlci4KPiAr ICoKPiArICogVW5yZWdpc3RlcnMgZGV2ZnJlcSBjb29saW5nIGRldmljZSBhbmQgcmVsYXRlZCBF bmVyZ3kgTW9kZWwgaWYgaXQgd2FzCj4gKyAqIHByZXNlbnQuCj4gICAqLwo+ICB2b2lkIGRldmZy ZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2 KQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAqZGZjOwo+ICsJc3RydWN0 IGRldmljZSAqZGV2Owo+ICAKPiAtCWlmICghY2RldikKPiArCWlmIChJU19FUlJfT1JfTlVMTChj ZGV2KSkKPiAgCQlyZXR1cm47Cj4gIAo+ICAJZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiArCWRldiA9 IGRmYy0+ZGV2ZnJlcS0+ZGV2LnBhcmVudDsKPiAgCj4gIAl0aGVybWFsX2Nvb2xpbmdfZGV2aWNl X3VucmVnaXN0ZXIoZGZjLT5jZGV2KTsKPiAgCWlkYV9zaW1wbGVfcmVtb3ZlKCZkZXZmcmVxX2lk YSwgZGZjLT5pZCk7Cj4gIAlkZXZfcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZkZmMtPnJlcV9tYXhf ZnJlcSk7Cj4gLQlrZnJlZShkZmMtPnBvd2VyX3RhYmxlKTsKPiAtCWtmcmVlKGRmYy0+ZnJlcV90 YWJsZSk7Cj4gKwllbV9wZF9wdXQoZGV2KTsKPiAgCj4gKwkvKiBDaGVjayBpZiBkZXZmcmVxIGNv b2xpbmcgcmVnaXN0ZXJlZCB0aGlzIEVNIGFuZCBtdXN0IGZyZWUgaXQuICovCj4gKwlpZiAoZGZj LT5lbV9yZWdpc3RlcmVkKQo+ICsJCWVtX2Rldl91bnJlZ2lzdGVyX3BlcmZfZG9tYWluKGRldik7 Cj4gKwo+ICsJa2ZyZWUoZGZjLT5mcmVxX3RhYmxlKTsKPiAgCWtmcmVlKGRmYyk7Cj4gKwo+ICB9 Cj4gIEVYUE9SVF9TWU1CT0xfR1BMKGRldmZyZXFfY29vbGluZ191bnJlZ2lzdGVyKTsKPiBkaWZm IC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZmcmVxX2Nvb2xpbmcuaCBiL2luY2x1ZGUvbGludXgv ZGV2ZnJlcV9jb29saW5nLmgKPiBpbmRleCA3OWE2ZTM3YTFkNmYuLjYxMzY3OGNlMjNkZiAxMDA2 NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2RldmZyZXFfY29vbGluZy5oCj4gKysrIGIvaW5jbHVk ZS9saW51eC9kZXZmcmVxX2Nvb2xpbmcuaAo+IEBAIC0xOCwyMiArMTgsMTIgQEAKPiAgI2RlZmlu ZSBfX0RFVkZSRVFfQ09PTElOR19IX18KPiAgCj4gICNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLmg+ Cj4gKyNpbmNsdWRlIDxsaW51eC9lbmVyZ3lfbW9kZWwuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L3Ro ZXJtYWwuaD4KPiAgCj4gIAo+ICAvKioKPiAgICogc3RydWN0IGRldmZyZXFfY29vbGluZ19wb3dl ciAtIERldmZyZXEgY29vbGluZyBwb3dlciBvcHMKPiAtICogQGdldF9zdGF0aWNfcG93ZXI6CVRh a2Ugdm9sdGFnZSwgaW4gbVYsIGFuZCByZXR1cm4gdGhlIHN0YXRpYyBwb3dlcgo+IC0gKgkJCWlu IG1XLiAgSWYgTlVMTCwgdGhlIHN0YXRpYyBwb3dlciBpcyBhc3N1bWVkCj4gLSAqCQkJdG8gYmUg MC4KPiAtICogQGdldF9keW5hbWljX3Bvd2VyOglUYWtlIHZvbHRhZ2UsIGluIG1WLCBhbmQgZnJl cXVlbmN5LCBpbiBIWiwgYW5kCj4gLSAqCQkJcmV0dXJuIHRoZSBkeW5hbWljIHBvd2VyIGRyYXcg aW4gbVcuICBJZiBOVUxMLAo+IC0gKgkJCWEgc2ltcGxlIHBvd2VyIG1vZGVsIGlzIHVzZWQuCj4g LSAqIEBkeW5fcG93ZXJfY29lZmY6CUNvZWZmaWNpZW50IGZvciB0aGUgc2ltcGxlIGR5bmFtaWMg cG93ZXIgbW9kZWwgaW4KPiAtICoJCQltVy8oTUh6IG1WIG1WKS4KPiAtICoJCQlJZiBnZXRfZHlu YW1pY19wb3dlcigpIGlzIE5VTEwsIHRoZW4gdGhlCj4gLSAqCQkJZHluYW1pYyBwb3dlciBpcyBj YWxjdWxhdGVkIGFzCj4gLSAqCQkJQGR5bl9wb3dlcl9jb2VmZiAqIGZyZXF1ZW5jeSAqIHZvbHRh Z2VeMgo+ICAgKiBAZ2V0X3JlYWxfcG93ZXI6CVdoZW4gdGhpcyBpcyBzZXQsIHRoZSBmcmFtZXdv cmsgdXNlcyBpdCB0byBhc2sgdGhlCj4gICAqCQkJZGV2aWNlIGRyaXZlciBmb3IgdGhlIGFjdHVh bCBwb3dlci4KPiAgICoJCQlTb21lIGRldmljZXMgaGF2ZSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0 aG9kcwo+IEBAIC01MywxNCArNDMsOCBAQAo+ICAgKgkJCW1heCB0b3RhbCAoc3RhdGljICsgZHlu YW1pYykgcG93ZXIgdmFsdWUgZm9yIGVhY2ggT1BQLgo+ICAgKi8KPiAgc3RydWN0IGRldmZyZXFf Y29vbGluZ19wb3dlciB7Cj4gLQl1bnNpZ25lZCBsb25nICgqZ2V0X3N0YXRpY19wb3dlcikoc3Ry dWN0IGRldmZyZXEgKmRldmZyZXEsCj4gLQkJCQkJICB1bnNpZ25lZCBsb25nIHZvbHRhZ2UpOwo+ IC0JdW5zaWduZWQgbG9uZyAoKmdldF9keW5hbWljX3Bvd2VyKShzdHJ1Y3QgZGV2ZnJlcSAqZGV2 ZnJlcSwKPiAtCQkJCQkgICB1bnNpZ25lZCBsb25nIGZyZXEsCj4gLQkJCQkJICAgdW5zaWduZWQg bG9uZyB2b2x0YWdlKTsKPiAgCWludCAoKmdldF9yZWFsX3Bvd2VyKShzdHJ1Y3QgZGV2ZnJlcSAq ZGYsIHUzMiAqcG93ZXIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJlcSwgdW5zaWduZWQg bG9uZyB2b2x0YWdlKTsKPiAtCXVuc2lnbmVkIGxvbmcgZHluX3Bvd2VyX2NvZWZmOwo+ICB9Owo+ ICAKPiAgI2lmZGVmIENPTkZJR19ERVZGUkVRX1RIRVJNQUwKPiBAQCAtNzIsNiArNTYsMTMgQEAg c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICBvZl9kZXZmcmVxX2Nvb2xpbmdfcmVn aXN0ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGRldmZyZXEgKmRmKTsKPiAgc3Ry dWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmRldmZyZXFfY29vbGluZ19yZWdpc3RlcihzdHJ1 Y3QgZGV2ZnJlcSAqZGYpOwo+ICB2b2lkIGRldmZyZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVj dCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpkZmMpOwo+ICtzdHJ1Y3QgdGhlcm1hbF9jb29saW5n X2RldmljZSAqCj4gK2RldmZyZXFfY29vbGluZ19lbV9yZWdpc3Rlcl9wb3dlcihzdHJ1Y3QgZGV2 ZnJlcSAqZGYsCj4gKwkJCQkgIHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIgKmRmY19wb3dl ciwKPiArCQkJCSAgc3RydWN0IGVtX2RhdGFfY2FsbGJhY2sgKmVtX2NiKTsKPiArc3RydWN0IHRo ZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXIoc3Ry dWN0IGRldmZyZXEgKmRmLAo+ICsJCQkgICAgc3RydWN0IGVtX2RhdGFfY2FsbGJhY2sgKmVtX2Ni KTsKPiAgCj4gICNlbHNlIC8qICFDT05GSUdfREVWRlJFUV9USEVSTUFMICovCj4gIAo+IEBAIC05 NCw2ICs4NSwyMCBAQCBkZXZmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRm KQo+ICAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nvb2xpbmdfZW1fcmVn aXN0ZXJfcG93ZXIoc3RydWN0IGRldmZyZXEgKmRmLAo+ICsJCQkJICBzdHJ1Y3QgZGV2ZnJlcV9j b29saW5nX3Bvd2VyICpkZmNfcG93ZXIsCj4gKwkJCQkgIHN0cnVjdCBlbV9kYXRhX2NhbGxiYWNr ICplbV9jYikKPiArewo+ICsJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nv b2xpbmdfZW1fcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRmLAlzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqZW1fY2IpCj4gK3sKPiArCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+ICt9Cj4gKwo+ ICBzdGF0aWMgaW5saW5lIHZvaWQKPiAgZGV2ZnJlcV9jb29saW5nX3VucmVnaXN0ZXIoc3RydWN0 IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmRmYykKPiAgewo+IGRpZmYgLS1naXQgYS9pbmNsdWRl L3RyYWNlL2V2ZW50cy90aGVybWFsLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVybWFsLmgK PiBpbmRleCAxMzVlNTQyMWYwMDMuLjhhNWYwNDg4OGFiZCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRl L3RyYWNlL2V2ZW50cy90aGVybWFsLmgKPiArKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVy bWFsLmgKPiBAQCAtMTUzLDMxICsxNTMsMzAgQEAgVFJBQ0VfRVZFTlQodGhlcm1hbF9wb3dlcl9j cHVfbGltaXQsCj4gIFRSQUNFX0VWRU5UKHRoZXJtYWxfcG93ZXJfZGV2ZnJlcV9nZXRfcG93ZXIs Cj4gIAlUUF9QUk9UTyhzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiAgCQkg c3RydWN0IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdHVzLCB1bnNpZ25lZCBsb25nIGZyZXEsCj4g LQkJdTMyIGR5bmFtaWNfcG93ZXIsIHUzMiBzdGF0aWNfcG93ZXIsIHUzMiBwb3dlciksCj4gKwkJ dTMyIHBvd2VyKSwKPiAgCj4gLQlUUF9BUkdTKGNkZXYsIHN0YXR1cywgIGZyZXEsIGR5bmFtaWNf cG93ZXIsIHN0YXRpY19wb3dlciwgcG93ZXIpLAo+ICsJVFBfQVJHUyhjZGV2LCBzdGF0dXMsICBm cmVxLCBwb3dlciksCj4gIAo+ICAJVFBfU1RSVUNUX19lbnRyeSgKPiAgCQlfX3N0cmluZyh0eXBl LCAgICAgICAgIGNkZXYtPnR5cGUgICAgKQo+ICAJCV9fZmllbGQodW5zaWduZWQgbG9uZywgZnJl cSAgICAgICAgICApCj4gLQkJX19maWVsZCh1MzIsICAgICAgICAgICBsb2FkICAgICAgICAgICkK PiAtCQlfX2ZpZWxkKHUzMiwgICAgICAgICAgIGR5bmFtaWNfcG93ZXIgKQo+IC0JCV9fZmllbGQo dTMyLCAgICAgICAgICAgc3RhdGljX3Bvd2VyICApCj4gKwkJX19maWVsZCh1MzIsICAgICAgICAg ICBidXN5X3RpbWUpCj4gKwkJX19maWVsZCh1MzIsICAgICAgICAgICB0b3RhbF90aW1lKQo+ICAJ CV9fZmllbGQodTMyLCAgICAgICAgICAgcG93ZXIpCj4gIAkpLAo+ICAKPiAgCVRQX2Zhc3RfYXNz aWduKAo+ICAJCV9fYXNzaWduX3N0cih0eXBlLCBjZGV2LT50eXBlKTsKPiAgCQlfX2VudHJ5LT5m cmVxID0gZnJlcTsKPiAtCQlfX2VudHJ5LT5sb2FkID0gKDEwMCAqIHN0YXR1cy0+YnVzeV90aW1l KSAvIHN0YXR1cy0+dG90YWxfdGltZTsKPiAtCQlfX2VudHJ5LT5keW5hbWljX3Bvd2VyID0gZHlu YW1pY19wb3dlcjsKPiAtCQlfX2VudHJ5LT5zdGF0aWNfcG93ZXIgPSBzdGF0aWNfcG93ZXI7Cj4g KwkJX19lbnRyeS0+YnVzeV90aW1lID0gc3RhdHVzLT5idXN5X3RpbWU7Cj4gKwkJX19lbnRyeS0+ dG90YWxfdGltZSA9IHN0YXR1cy0+dG90YWxfdGltZTsKPiAgCQlfX2VudHJ5LT5wb3dlciA9IHBv d2VyOwo+ICAJKSwKPiAgCj4gLQlUUF9wcmludGsoInR5cGU9JXMgZnJlcT0lbHUgbG9hZD0ldSBk eW5hbWljX3Bvd2VyPSV1IHN0YXRpY19wb3dlcj0ldSBwb3dlcj0ldSIsCj4gKwlUUF9wcmludGso InR5cGU9JXMgZnJlcT0lbHUgbG9hZD0ldSBwb3dlcj0ldSIsCj4gIAkJX19nZXRfc3RyKHR5cGUp LCBfX2VudHJ5LT5mcmVxLAo+IC0JCV9fZW50cnktPmxvYWQsIF9fZW50cnktPmR5bmFtaWNfcG93 ZXIsIF9fZW50cnktPnN0YXRpY19wb3dlciwKPiArCQlfX2VudHJ5LT50b3RhbF90aW1lID09IDAg PyAwIDoKPiArCQkJKDEwMCAqIF9fZW50cnktPmJ1c3lfdGltZSkgLyBfX2VudHJ5LT50b3RhbF90 aW1lLAo+ICAJCV9fZW50cnktPnBvd2VyKQo+ICApOwo+ICAKPiAtLSAKPiAyLjE3LjEKPiAKCi0t IAoKIDxodHRwOi8vd3d3LmxpbmFyby5vcmcvPiBMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBz b2Z0d2FyZSBmb3IgQVJNIFNvQ3MKCkZvbGxvdyBMaW5hcm86ICA8aHR0cDovL3d3dy5mYWNlYm9v ay5jb20vcGFnZXMvTGluYXJvPiBGYWNlYm9vayB8CjxodHRwOi8vdHdpdHRlci5jb20vIyEvbGlu YXJvb3JnPiBUd2l0dGVyIHwKPGh0dHA6Ly93d3cubGluYXJvLm9yZy9saW5hcm8tYmxvZy8+IEJs b2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4 LW1lZGlhdGVrIG1haWxpbmcgbGlzdApMaW51eC1tZWRpYXRla0BsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbWVkaWF0 ZWsK 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=-6.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 AB96DC54FCB for ; Thu, 23 Apr 2020 17:57:25 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 78B9120663 for ; Thu, 23 Apr 2020 17:57:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="kJdNQK7h"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="d9/G8/mm" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 78B9120663 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=3OIQ4dtScmIgUidoEf5HW7jIiOa3MIKoOw1ZkhX/Kcs=; b=kJdNQK7hHTyYn4 LztES+WmGaQ9cHAMJp7FTW0y08IvmGU+PDckRhIpM6rUzTLHjMzIopHb8fbs5SFTyHy55IJWzNqpD Blnm53x+uX4S0VaQeLtFGX0zkcSxmEcMnk9WzMDSbfj4DAUvxx0U+HikhQZt4Z2re0oGp6jzfyirw x1k5NCC76/wemnXr60xVcLK7bViVYuPvxPshVE2jfLLUjxvIc1ZnrCWsXkoOPNvdUSeh6FZj6Mj0m XxFAy7ZznIO92dIRTwlM7ZsKS6WfPbhi+v3CFj4gyUa+eCKqwddwdSodtaY/KEb4ACOJla0eZLzhg F2nNyt/tceM5g+BquWxg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jRg6F-0004ea-NZ; Thu, 23 Apr 2020 17:57:23 +0000 Received: from mail-wr1-x441.google.com ([2a00:1450:4864:20::441]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jRg69-0004bY-Nq for linux-arm-kernel@lists.infradead.org; Thu, 23 Apr 2020 17:57:21 +0000 Received: by mail-wr1-x441.google.com with SMTP id x18so7900924wrq.2 for ; Thu, 23 Apr 2020 10:57:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=d9/G8/mm1s6L7U3grcrEtILx0VltO1cSLr9xd4Th5rnmfCECHODYPAQ0aO21o3IwGg 9VNKbfx6NWZUcdSr9v8HKX2+nMaRgSKRlfadsYoGQdlqgEqTKlxTs7An4FwHmf9BnwCo iCyN465/N3DmU+Ka1WexrnY/usLFGoUbWnLPaJ+LmUXqKshiJUE+Hxhly097fmrbyfkx EZnhrBKkW2EKPTiOqC93lCk34rbf/RL/7Oi6vrZpec06JT1mzH7f9zwJHpd6nTRaokjA VVFuVqsMDVnX61YrbxeBo+1/bHB839FVondm/j53B8LD03vwQwTzfayVz25EsQhr37hg ZodQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=di/+tBN8ihYhGvH3+arBAuP52BmHssrU1EIzDsDpgpfNbgjvoS0dzuWM+a8WthrAi1 TXPECXAhP0Qxqr2Wotllf20tJC7FGaADmPU+ogiUInLC/elXv5t38bbJI00GByCfLgIT llWVUuKipwnyeV6PxHu5NdPotsLakXWDdAhYROcYvDKdIFADTWwV/j9wwt/rSSrFfJqQ KdYdQIN7UKeGng415OsHJEdFZk+st4Iwjifzxz3zAT1QWu3b0C1qNFbYQivXbq+3k68m bQipF6XpsLpD5arfrouIC1/KRcECy5q5UBWiZYKYIP9P7SmYoaMKJb5Q3TrSFpRYKv2b WdBg== X-Gm-Message-State: AGi0PuaFZotoqdTjoU63PrW/uUu3yPE02k5Sj+wfHEP6BdMIyJ4V5ZhX ZVQDews8XVJbSfPwksbHxm0hBg== X-Google-Smtp-Source: APiQypJl+oEUyy7z0GtqEAxyqDXffHB5kQWgiibXowQIt/FHM/GqoWI3jwvWyT/gnQK8/Affz/K20w== X-Received: by 2002:a5d:4e06:: with SMTP id p6mr6069297wrt.35.1587664635462; Thu, 23 Apr 2020 10:57:15 -0700 (PDT) Received: from linaro.org ([37.167.216.250]) by smtp.gmail.com with ESMTPSA id t8sm4719117wrq.88.2020.04.23.10.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2020 10:57:14 -0700 (PDT) Date: Thu, 23 Apr 2020 19:57:08 +0200 From: Daniel Lezcano To: Lukasz Luba Subject: Re: [PATCH v6 09/10] thermal: devfreq_cooling: Refactor code and switch to use Energy Model Message-ID: <20200423175708.GG65632@linaro.org> References: <20200410084210.24932-1-lukasz.luba@arm.com> <20200410084210.24932-10-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200410084210.24932-10-lukasz.luba@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200423_105717_801002_658E9DBE X-CRM114-Status: GOOD ( 34.75 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: nm@ti.com, juri.lelli@redhat.com, peterz@infradead.org, viresh.kumar@linaro.org, liviu.dudau@arm.com, dri-devel@lists.freedesktop.org, bjorn.andersson@linaro.org, bsegall@google.com, alyssa.rosenzweig@collabora.com, festevam@gmail.com, mka@chromium.org, robh@kernel.org, amit.kucheria@verdurent.com, lorenzo.pieralisi@arm.com, khilman@kernel.org, agross@kernel.org, b.zolnierkie@samsung.com, steven.price@arm.com, cw00.choi@samsung.com, mingo@redhat.com, linux-imx@nxp.com, rui.zhang@intel.com, mgorman@suse.de, orjan.eide@arm.com, daniel@ffwll.ch, linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org, s.hauer@pengutronix.de, rostedt@goodmis.org, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-omap@vger.kernel.org, Dietmar.Eggemann@arm.com, linux-arm-kernel@lists.infradead.org, airlied@linux.ie, tomeu.vizoso@collabora.com, qperret@google.com, sboyd@kernel.org, rdunlap@infradead.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, kernel@pengutronix.de, sudeep.holla@arm.com, patrick.bellasi@matbug.net, shawnguo@kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gRnJpLCBBcHIgMTAsIDIwMjAgYXQgMDk6NDI6MDlBTSArMDEwMCwgTHVrYXN6IEx1YmEgd3Jv dGU6Cj4gVGhlIG92ZXJoYXVsZWQgRW5lcmd5IE1vZGVsIChFTSkgZnJhbWV3b3JrIHN1cHBvcnQg YWxzbyBkZXZmcmVxIGRldmljZXMuCj4gVGhlIHVuaWZpZWQgQVBJIGludGVyZmFjZSBvZiB0aGUg RU0gY2FuIGJlIHVzZWQgaW4gdGhlIHRoZXJtYWwgc3Vic3lzdGVtIHRvCj4gbm90IGR1cGxpY2F0 ZSBjb2RlLiBUaGUgcG93ZXIgdGFibGUgbm93IGlzIHRha2VuIGZyb20gRU0gc3RydWN0dXJlIGFu ZAo+IHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFpbnRhaW4gY2FsY3VsYXRpb24gZm9yIGl0IGxvY2Fs bHkuIEluIGNhc2Ugd2hlbiB0aGUKPiBFTSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBh IHNpbXBsZSBpbnRlcmZhY2UgZm9yIGNvb2xpbmcgZGV2aWNlIGlzCj4gdXNlZC4KPiAKPiBbbGtw OiBSZXBvcnRlZCB0aGUgYnVpbGQgd2FybmluZ10KPiBSZXBvcnRlZC1ieToga2J1aWxkIHRlc3Qg cm9ib3QgPGxrcEBpbnRlbC5jb20+Cj4gUmV2aWV3ZWQtYnk6IFN0ZXZlbiBSb3N0ZWR0IChWTXdh cmUpIDxyb3N0ZWR0QGdvb2RtaXMub3JnPiAjIGZvciB0cmFjaW5nIGNvZGUKPiBTaWduZWQtb2Zm LWJ5OiBMdWthc3ogTHViYSA8bHVrYXN6Lmx1YmFAYXJtLmNvbT4KCklzIGl0IHBvc3NpYmxlIHRv IHNwbGl0IHRoaXMgcGF0Y2ggaW50byBzbWFsbGVyIHBhcnRzPyBJdCBpcyBoYXJkIHRvIHVuZGVy c3RhbmQKd2hhdCBpcyByZWxhdGVkIHRvIHRoZSBlbSBjb252ZXJzaW9uIGFuZCBvdGhlciBjaGFu Z2VzIHdoaWNoIGxvb2sgbm90IHJlbGF0ZWQKc28gZmFyLgoKPiAtLS0KPiAgZHJpdmVycy90aGVy bWFsL2RldmZyZXFfY29vbGluZy5jIHwgNDc0ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0t LQo+ICBpbmNsdWRlL2xpbnV4L2RldmZyZXFfY29vbGluZy5oICAgfCAgMzkgKy0tCj4gIGluY2x1 ZGUvdHJhY2UvZXZlbnRzL3RoZXJtYWwuaCAgICB8ICAxOSArLQo+ICAzIGZpbGVzIGNoYW5nZWQs IDI3NyBpbnNlcnRpb25zKCspLCAyNTUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdGhlcm1hbC9kZXZmcmVxX2Nvb2xpbmcuYyBiL2RyaXZlcnMvdGhlcm1hbC9kZXZmcmVx X2Nvb2xpbmcuYwo+IGluZGV4IGY3ZjMyZTk4MzMxYi4uMzJkZjVmNTViZGU4IDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvdGhlcm1hbC9kZXZmcmVxX2Nvb2xpbmcuYwo+ICsrKyBiL2RyaXZlcnMvdGhl cm1hbC9kZXZmcmVxX2Nvb2xpbmcuYwo+IEBAIC0xLDE3ICsxLDkgQEAKPiArLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiAgLyoKPiAgICogZGV2ZnJlcV9jb29saW5nOiBUaGVy bWFsIGNvb2xpbmcgZGV2aWNlIGltcGxlbWVudGF0aW9uIGZvciBkZXZpY2VzIHVzaW5nCj4gICAq ICAgICAgICAgICAgICAgICAgZGV2ZnJlcQo+ICAgKgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMTQt MjAxNSBBUk0gTGltaXRlZAo+IC0gKgo+IC0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+IC0gKiBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwo+ IC0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPiAtICoKPiAt ICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFO VFkgb2YgYW55Cj4gLSAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKPiAtICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+IC0gKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MTQtMjAyMCBBUk0gTGltaXRlZAo+ICAgKgo+ICAgKiBUT0RPOgo+ICAgKiAgICAtIElmIE9QUHMg YXJlIGFkZGVkIG9yIHJlbW92ZWQgYWZ0ZXIgZGV2ZnJlcSBjb29saW5nIGhhcwo+IEBAIC00MSwz NiArMzMsMzMgQEAgc3RhdGljIERFRklORV9JREEoZGV2ZnJlcV9pZGEpOwo+ICAgKiBAY2RldjoJ UG9pbnRlciB0byBhc3NvY2lhdGVkIHRoZXJtYWwgY29vbGluZyBkZXZpY2UuCj4gICAqIEBkZXZm cmVxOglQb2ludGVyIHRvIGFzc29jaWF0ZWQgZGV2ZnJlcSBkZXZpY2UuCj4gICAqIEBjb29saW5n X3N0YXRlOglDdXJyZW50IGNvb2xpbmcgc3RhdGUuCj4gLSAqIEBwb3dlcl90YWJsZToJUG9pbnRl ciB0byB0YWJsZSB3aXRoIG1heGltdW0gcG93ZXIgZHJhdyBmb3IgZWFjaAo+IC0gKgkJCWNvb2xp bmcgc3RhdGUuIFN0YXRlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZSwgYW5kCj4gLSAqCQkJ dGhlIHBvd2VyIGlzIGluIG1XLgo+IC0gKiBAZnJlcV90YWJsZToJUG9pbnRlciB0byBhIHRhYmxl IHdpdGggdGhlIGZyZXF1ZW5jaWVzIHNvcnRlZCBpbiBkZXNjZW5kaW5nCj4gLSAqCQlvcmRlci4g IFlvdSBjYW4gaW5kZXggdGhlIHRhYmxlIGJ5IGNvb2xpbmcgZGV2aWNlIHN0YXRlCj4gLSAqIEBm cmVxX3RhYmxlX3NpemU6CVNpemUgb2YgdGhlIEBmcmVxX3RhYmxlIGFuZCBAcG93ZXJfdGFibGUK PiAtICogQHBvd2VyX29wczoJUG9pbnRlciB0byBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIsIHVzZWQg dG8gZ2VuZXJhdGUgdGhlCj4gLSAqCQlAcG93ZXJfdGFibGUuCj4gKyAqIEBmcmVxX3RhYmxlOiAg ICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIGZyZXF1ZW5jaWVzLgo+ICsgKiBAbWF4 X3N0YXRlOglJdCBpcyB0aGUgbGFzdCBpbmRleCwgdGhhdCBpcywgb25lIGxlc3MgdGhhbiB0aGUg bnVtYmVyIG9mIHRoZQo+ICsgKgkJT1BQcwo+ICsgKiBAcG93ZXJfb3BzOglQb2ludGVyIHRvIGRl dmZyZXFfY29vbGluZ19wb3dlciwgYSBtb3JlIHByZWNpc2VkIG1vZGVsLgo+ICAgKiBAcmVzX3V0 aWw6CVJlc291cmNlIHV0aWxpemF0aW9uIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgcG93ZXIuCj4g ICAqCQlJdCBpcyBtdWx0aXBsaWVkIGJ5IDEwMCB0byBtaW5pbWl6ZSB0aGUgZXJyb3IuIEl0IGlz IHVzZWQKPiAgICoJCWZvciBlc3RpbWF0aW9uIG9mIHRoZSBwb3dlciBidWRnZXQgaW5zdGVhZCBv ZiB1c2luZwo+IC0gKgkJJ3V0aWxpemF0aW9uJyAod2hpY2ggaXMJJ2J1c3lfdGltZSAvICd0b3Rh bF90aW1lJykuCj4gLSAqCQlUaGUgJ3Jlc191dGlsJyByYW5nZSBpcyBmcm9tIDEwMCB0byAocG93 ZXJfdGFibGVbc3RhdGVdICogMTAwKQo+IC0gKgkJZm9yIHRoZSBjb3JyZXNwb25kaW5nICdzdGF0 ZScuCj4gLSAqIEBjYXBwZWRfc3RhdGU6CWluZGV4IHRvIGNvb2xpbmcgc3RhdGUgd2l0aCBpbiBk eW5hbWljIHBvd2VyIGJ1ZGdldAo+ICsgKgkJJ3V0aWxpemF0aW9uJyAod2hpY2ggaXMJJ2J1c3lf dGltZScgLyAndG90YWxfdGltZScpLgo+ICsgKgkJVGhlICdyZXNfdXRpbCcgcmFuZ2UgaXMgZnJv bSAxMDAgdG8gcG93ZXIgKiAxMDAJZm9yIHRoZQo+ICsgKgkJY29ycmVzcG9uZGluZyAnc3RhdGUn Lgo+ICAgKiBAcmVxX21heF9mcmVxOglQTSBRb1MgcmVxdWVzdCBmb3IgbGltaXRpbmcgdGhlIG1h eGltdW0gZnJlcXVlbmN5Cj4gICAqCQkJb2YgdGhlIGRldmZyZXEgZGV2aWNlLgo+ICsgKiBAZW06 CQlFbmVyZ3kgTW9kZWwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYXNzb2NpYXRlZCBEZXZmcmVxIGRl dmljZQo+ICsgKiBAZW1fcmVnaXN0ZXJlZDoJRGV2ZnJlcSBjb29saW5nIHJlZ2lzdGVyZWQgdGhl IEVNIGFuZCBzaG91bGQgZnJlZSBpdC4KPiAgICovCj4gIHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdf ZGV2aWNlIHsKPiAgCWludCBpZDsKPiAgCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpj ZGV2Owo+ICAJc3RydWN0IGRldmZyZXEgKmRldmZyZXE7Cj4gIAl1bnNpZ25lZCBsb25nIGNvb2xp bmdfc3RhdGU7Cj4gLQl1MzIgKnBvd2VyX3RhYmxlOwo+ICAJdTMyICpmcmVxX3RhYmxlOwo+IC0J c2l6ZV90IGZyZXFfdGFibGVfc2l6ZTsKPiArCXNpemVfdCBtYXhfc3RhdGU7Cj4gIAlzdHJ1Y3Qg ZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpwb3dlcl9vcHM7Cj4gIAl1MzIgcmVzX3V0aWw7Cj4gLQlp bnQgY2FwcGVkX3N0YXRlOwo+ICAJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCByZXFfbWF4X2Zy ZXE7Cj4gKwlzdHJ1Y3QgZW1fcGVyZl9kb21haW4gKmVtOwo+ICsJYm9vbCBlbV9yZWdpc3RlcmVk Owo+ICB9Owo+ICAKPiAgc3RhdGljIGludCBkZXZmcmVxX2Nvb2xpbmdfZ2V0X21heF9zdGF0ZShz dHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiBAQCAtNzgsNyArNjcsNyBAQCBz dGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19nZXRfbWF4X3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpjZGV2LAo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2Rldmlj ZSAqZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiAgCj4gLQkqc3RhdGUgPSBkZmMtPmZyZXFfdGFibGVf c2l6ZSAtIDE7Cj4gKwkqc3RhdGUgPSBkZmMtPm1heF9zdGF0ZTsKPiAgCj4gIAlyZXR1cm4gMDsK PiAgfQo+IEBAIC0xMDYsMTAgKzk1LDE2IEBAIHN0YXRpYyBpbnQgZGV2ZnJlcV9jb29saW5nX3Nl dF9jdXJfc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4gIAo+ICAJ ZGV2X2RiZyhkZXYsICJTZXR0aW5nIGNvb2xpbmcgc3RhdGUgJWx1XG4iLCBzdGF0ZSk7Cj4gIAo+ IC0JaWYgKHN0YXRlID49IGRmYy0+ZnJlcV90YWJsZV9zaXplKQo+ICsJaWYgKHN0YXRlID4gZGZj LT5tYXhfc3RhdGUpCj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAo+IC0JZnJlcSA9IGRmYy0+ZnJl cV90YWJsZVtzdGF0ZV07Cj4gKwlpZiAoZGZjLT5lbSkgewo+ICsJCS8qIEVuZXJneSBNb2RlbCBm cmVxdWVuY2llcyBhcmUgaW4ga0h6ICovCj4gKwkJZnJlcSA9IGRmYy0+ZW0tPnRhYmxlW2RmYy0+ bWF4X3N0YXRlIC0gc3RhdGVdLmZyZXF1ZW5jeTsKPiArCQlmcmVxICo9IDEwMDA7Cj4gKwl9IGVs c2Ugewo+ICsJCWZyZXEgPSBkZmMtPmZyZXFfdGFibGVbc3RhdGVdOwo+ICsJfQo+ICAKPiAgCWRl dl9wbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRmYy0+cmVxX21heF9mcmVxLAo+ICAJCQkJICBESVZf Uk9VTkRfVVAoZnJlcSwgSFpfUEVSX0tIWikpOwo+IEBAIC0xMjAsMTEgKzExNSwxMSBAQCBzdGF0 aWMgaW50IGRldmZyZXFfY29vbGluZ19zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xp bmdfZGV2aWNlICpjZGV2LAo+ICB9Cj4gIAo+ICAvKioKPiAtICogZnJlcV9nZXRfc3RhdGUoKSAt IGdldCB0aGUgY29vbGluZyBzdGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgZnJlcXVlbmN5Cj4gKyAq IGZyZXFfZ2V0X3N0YXRlKCkgLSBnZXQgdGhlIHBlcmZvcm1hbmNlIGluZGV4IGNvcnJlc3BvbmRp bmcgdG8gYSBmcmVxdWVuY3kKPiAgICogQGRmYzoJUG9pbnRlciB0byBkZXZmcmVxIGNvb2xpbmcg ZGV2aWNlCj4gLSAqIEBmcmVxOglmcmVxdWVuY3kgaW4gSHoKPiArICogQGZyZXE6CWZyZXF1ZW5j eSBpbiBrSHoKPiAgICoKPiAtICogUmV0dXJuOiB0aGUgY29vbGluZyBzdGF0ZSBhc3NvY2lhdGVk IHdpdGggdGhlIEBmcmVxLCBvcgo+ICsgKiBSZXR1cm46IHRoZSBwZXJmb3JtYW5jZSBpbmRleCBh c3NvY2lhdGVkIHdpdGggdGhlIEBmcmVxLCBvcgo+ICAgKiBUSEVSTUFMX0NTVEFURV9JTlZBTElE IGlmIGl0IHdhc24ndCBmb3VuZC4KPiAgICovCj4gIHN0YXRpYyB1bnNpZ25lZCBsb25nCj4gQEAg LTEzMiw4ICsxMjcsOCBAQCBmcmVxX2dldF9zdGF0ZShzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2Rl dmljZSAqZGZjLCB1bnNpZ25lZCBsb25nIGZyZXEpCj4gIHsKPiAgCWludCBpOwo+ICAKPiAtCWZv ciAoaSA9IDA7IGkgPCBkZmMtPmZyZXFfdGFibGVfc2l6ZTsgaSsrKSB7Cj4gLQkJaWYgKGRmYy0+ ZnJlcV90YWJsZVtpXSA9PSBmcmVxKQo+ICsJZm9yIChpID0gMDsgaSA8PSBkZmMtPm1heF9zdGF0 ZTsgaSsrKSB7Cj4gKwkJaWYgKGRmYy0+ZW0tPnRhYmxlW2ldLmZyZXF1ZW5jeSA9PSBmcmVxKQo+ ICAJCQlyZXR1cm4gaTsKPiAgCX0KPiAgCj4gQEAgLTE2OCwxMzIgKzE2Myw5MiBAQCBzdGF0aWMg dW5zaWduZWQgbG9uZyBnZXRfdm9sdGFnZShzdHJ1Y3QgZGV2ZnJlcSAqZGYsIHVuc2lnbmVkIGxv bmcgZnJlcSkKPiAgCXJldHVybiB2b2x0YWdlOwo+ICB9Cj4gIAo+IC0vKioKPiAtICogZ2V0X3N0 YXRpY19wb3dlcigpIC0gY2FsY3VsYXRlIHRoZSBzdGF0aWMgcG93ZXIKPiAtICogQGRmYzoJUG9p bnRlciB0byBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlCj4gLSAqIEBmcmVxOglGcmVxdWVuY3kgaW4g SHoKPiAtICoKPiAtICogQ2FsY3VsYXRlIHRoZSBzdGF0aWMgcG93ZXIgaW4gbWlsbGl3YXR0cyB1 c2luZyB0aGUgc3VwcGxpZWQKPiAtICogZ2V0X3N0YXRpY19wb3dlcigpLiAgVGhlIGN1cnJlbnQg dm9sdGFnZSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZQo+IC0gKiBPUFAgbGlicmFyeS4gIElmIG5v IGdldF9zdGF0aWNfcG93ZXIoKSB3YXMgc3VwcGxpZWQsIGFzc3VtZSB0aGUKPiAtICogc3RhdGlj IHBvd2VyIGlzIG5lZ2xpZ2libGUuCj4gLSAqLwo+IC1zdGF0aWMgdW5zaWduZWQgbG9uZwo+IC1n ZXRfc3RhdGljX3Bvd2VyKHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMsIHVuc2ln bmVkIGxvbmcgZnJlcSkKPiArc3RhdGljIHZvaWQgZGZjX2VtX2dldF9yZXF1ZXN0ZWRfcG93ZXIo c3RydWN0IGVtX3BlcmZfZG9tYWluICplbSwKPiArCQkJCSAgICAgICBzdHJ1Y3QgZGV2ZnJlcV9k ZXZfc3RhdHVzICpzdGF0dXMsCj4gKwkJCQkgICAgICAgdTMyICpwb3dlciwgaW50IGVtX3BlcmZf aWR4KQo+ICB7Cj4gLQlzdHJ1Y3QgZGV2ZnJlcSAqZGYgPSBkZmMtPmRldmZyZXE7Cj4gLQl1bnNp Z25lZCBsb25nIHZvbHRhZ2U7Cj4gKwkqcG93ZXIgPSBlbS0+dGFibGVbZW1fcGVyZl9pZHhdLnBv d2VyOwo+ICAKPiAtCWlmICghZGZjLT5wb3dlcl9vcHMtPmdldF9zdGF0aWNfcG93ZXIpCj4gLQkJ cmV0dXJuIDA7Cj4gLQo+IC0Jdm9sdGFnZSA9IGdldF92b2x0YWdlKGRmLCBmcmVxKTsKPiAtCj4g LQlpZiAodm9sdGFnZSA9PSAwKQo+IC0JCXJldHVybiAwOwo+IC0KPiAtCXJldHVybiBkZmMtPnBv d2VyX29wcy0+Z2V0X3N0YXRpY19wb3dlcihkZiwgdm9sdGFnZSk7Cj4gKwkvKiBTY2FsZSBwb3dl ciBmb3IgdXRpbGl6YXRpb24gKi8KPiArCSpwb3dlciAqPSBzdGF0dXMtPmJ1c3lfdGltZTsKPiAr CSpwb3dlciAvPSBzdGF0dXMtPnRvdGFsX3RpbWU7Cj4gIH0KPiAgCj4gLS8qKgo+IC0gKiBnZXRf ZHluYW1pY19wb3dlciAtIGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBwb3dlcgo+IC0gKiBAZGZjOglQ b2ludGVyIHRvIGRldmZyZXEgY29vbGluZyBkZXZpY2UKPiAtICogQGZyZXE6CUZyZXF1ZW5jeSBp biBIego+IC0gKiBAdm9sdGFnZToJVm9sdGFnZSBpbiBtaWxsaXZvbHRzCj4gLSAqCj4gLSAqIENh bGN1bGF0ZSB0aGUgZHluYW1pYyBwb3dlciBpbiBtaWxsaXdhdHRzIGNvbnN1bWVkIGJ5IHRoZSBk ZXZpY2UgYXQKPiAtICogZnJlcXVlbmN5IEBmcmVxIGFuZCB2b2x0YWdlIEB2b2x0YWdlLiAgSWYg dGhlIGdldF9keW5hbWljX3Bvd2VyKCkKPiAtICogd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhl IGRldmZyZXFfY29vbGluZ19wb3dlciBzdHJ1Y3QsIHRoZW4gdGhhdAo+IC0gKiBmdW5jdGlvbiBp cyB1c2VkLiAgT3RoZXJ3aXNlLCBhIHNpbXBsZSBwb3dlciBtb2RlbCAoUGR5biA9IENvZWZmICoK PiAtICogVm9sdGFnZV4yICogRnJlcXVlbmN5KSBpcyB1c2VkLgo+IC0gKi8KPiAtc3RhdGljIHVu c2lnbmVkIGxvbmcKPiAtZ2V0X2R5bmFtaWNfcG93ZXIoc3RydWN0IGRldmZyZXFfY29vbGluZ19k ZXZpY2UgKmRmYywgdW5zaWduZWQgbG9uZyBmcmVxLAo+IC0JCSAgdW5zaWduZWQgbG9uZyB2b2x0 YWdlKQo+ICtzdGF0aWMgdm9pZCBfbm9ybWFsaXplX2xvYWQoc3RydWN0IGRldmZyZXFfZGV2X3N0 YXR1cyAqc3RhdHVzKQo+ICB7Cj4gLQl1NjQgcG93ZXI7Cj4gLQl1MzIgZnJlcV9taHo7Cj4gLQlz dHJ1Y3QgZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpkZmNfcG93ZXIgPSBkZmMtPnBvd2VyX29wczsK PiAtCj4gLQlpZiAoZGZjX3Bvd2VyLT5nZXRfZHluYW1pY19wb3dlcikKPiAtCQlyZXR1cm4gZGZj X3Bvd2VyLT5nZXRfZHluYW1pY19wb3dlcihkZmMtPmRldmZyZXEsIGZyZXEsCj4gLQkJCQkJCSAg ICB2b2x0YWdlKTsKPiAtCj4gLQlmcmVxX21oeiA9IGZyZXEgLyAxMDAwMDAwOwo+IC0JcG93ZXIg PSAodTY0KWRmY19wb3dlci0+ZHluX3Bvd2VyX2NvZWZmICogZnJlcV9taHogKiB2b2x0YWdlICog dm9sdGFnZTsKPiAtCWRvX2Rpdihwb3dlciwgMTAwMDAwMDAwMCk7Cj4gKwkvKiBNYWtlIHNvbWUg c3BhY2UgaWYgbmVlZGVkICovCj4gKwlpZiAoc3RhdHVzLT5idXN5X3RpbWUgPiAweGZmZmYpIHsK PiArCQlzdGF0dXMtPmJ1c3lfdGltZSA+Pj0gMTA7Cj4gKwkJc3RhdHVzLT50b3RhbF90aW1lID4+ PSAxMDsKPiArCX0KPiAgCj4gLQlyZXR1cm4gcG93ZXI7Cj4gLX0KPiArCWlmIChzdGF0dXMtPmJ1 c3lfdGltZSA+IHN0YXR1cy0+dG90YWxfdGltZSkKPiArCQlzdGF0dXMtPmJ1c3lfdGltZSA9IHN0 YXR1cy0+dG90YWxfdGltZTsKPiAgCj4gKwlzdGF0dXMtPmJ1c3lfdGltZSAqPSAxMDA7Cj4gKwlz dGF0dXMtPmJ1c3lfdGltZSAvPSBzdGF0dXMtPnRvdGFsX3RpbWUgPyA6IDE7Cj4gIAo+IC1zdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3RvdGFsX3Bvd2VyKHN0cnVjdCBkZXZmcmVxX2Nv b2xpbmdfZGV2aWNlICpkZmMsCj4gLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZnJlcSwKPiAtCQkJ CQkgICAgdW5zaWduZWQgbG9uZyB2b2x0YWdlKQo+IC17Cj4gLQlyZXR1cm4gZ2V0X3N0YXRpY19w b3dlcihkZmMsIGZyZXEpICsgZ2V0X2R5bmFtaWNfcG93ZXIoZGZjLCBmcmVxLAo+IC0JCQkJCQkJ ICAgICAgIHZvbHRhZ2UpOwo+ICsJLyogQXZvaWQgZGl2aXNpb24gYnkgMCAqLwo+ICsJc3RhdHVz LT5idXN5X3RpbWUgPSBzdGF0dXMtPmJ1c3lfdGltZSA/IDogMTsKPiArCXN0YXR1cy0+dG90YWxf dGltZSA9IDEwMDsKPiAgfQo+ICAKPiAtCj4gIHN0YXRpYyBpbnQgZGV2ZnJlcV9jb29saW5nX2dl dF9yZXF1ZXN0ZWRfcG93ZXIoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4g IAkJCQkJICAgICAgIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKPiAgCQkJCQkgICAg ICAgdTMyICpwb3dlcikKPiAgewo+ICAJc3RydWN0IGRldmZyZXFfY29vbGluZ19kZXZpY2UgKmRm YyA9IGNkZXYtPmRldmRhdGE7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcSAqZGYgPSBkZmMtPmRldmZyZXE7 Cj4gLQlzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzICpzdGF0dXMgPSAmZGYtPmxhc3Rfc3RhdHVz Owo+IC0JdW5zaWduZWQgbG9uZyBzdGF0ZTsKPiAtCXVuc2lnbmVkIGxvbmcgZnJlcSA9IHN0YXR1 cy0+Y3VycmVudF9mcmVxdWVuY3k7Cj4gLQl1bnNpZ25lZCBsb25nIHZvbHRhZ2U7Cj4gLQl1MzIg ZHluX3Bvd2VyID0gMDsKPiAtCXUzMiBzdGF0aWNfcG93ZXIgPSAwOwo+ICsJc3RydWN0IGRldmZy ZXFfZGV2X3N0YXR1cyBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nIHZvbHRhZ2UsIGZyZXE7Cj4g Kwl1bnNpZ25lZCBsb25nIGVtX3BlcmZfaWR4Owo+ICAJaW50IHJlczsKPiAgCj4gLQlzdGF0ZSA9 IGZyZXFfZ2V0X3N0YXRlKGRmYywgZnJlcSk7Cj4gLQlpZiAoc3RhdGUgPT0gVEhFUk1BTF9DU1RB VEVfSU5WQUxJRCkgewo+IC0JCXJlcyA9IC1FQUdBSU47Cj4gLQkJZ290byBmYWlsOwo+IC0JfQo+ ICsJbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ICsJcmVzID0gZGYtPnByb2ZpbGUtPmdldF9kZXZf c3RhdHVzKGRmLT5kZXYucGFyZW50LCAmc3RhdHVzKTsKPiArCW11dGV4X3VubG9jaygmZGYtPmxv Y2spOwo+ICsJaWYgKHJlcykKPiArCQlyZXR1cm4gcmVzOwo+ICAKPiAtCWlmIChkZmMtPnBvd2Vy X29wcy0+Z2V0X3JlYWxfcG93ZXIpIHsKPiArCWZyZXEgPSBzdGF0dXMuY3VycmVudF9mcmVxdWVu Y3k7Cj4gKwo+ICsJLyogRW5lcmd5IE1vZGVsIGZyZXF1ZW5jaWVzIGFyZSBpbiBrSHogKi8KPiAr CWVtX3BlcmZfaWR4ID0gZnJlcV9nZXRfc3RhdGUoZGZjLCBmcmVxIC8gMTAwMCk7Cj4gKwlpZiAo ZW1fcGVyZl9pZHggPT0gVEhFUk1BTF9DU1RBVEVfSU5WQUxJRCkKPiArCQlyZXR1cm4gLUVBR0FJ TjsKPiArCj4gKwkvKgo+ICsJICogSWYgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgY29vbGluZyBkZXZp Y2UgbW9kZWwgd2FzIG5vdCBwcm92aWRlZCBieSB0aGUKPiArCSAqIGRyaXZlciwgdXNlIHNpbXBs ZSBFbmVyZ3kgTW9kZWwgcG93ZXIgY2FsY3VsYXRpb24uCj4gKwkgKi8KPiArCWlmICghZGZjLT5w b3dlcl9vcHMgfHwgIWRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcikgewo+ICsJCV9ub3Jt YWxpemVfbG9hZCgmc3RhdHVzKTsKPiArCQlkZmNfZW1fZ2V0X3JlcXVlc3RlZF9wb3dlcihkZmMt PmVtLCAmc3RhdHVzLCBwb3dlciwKPiArCQkJCQkgICBlbV9wZXJmX2lkeCk7Cj4gKwl9IGVsc2Ug ewo+ICAJCXZvbHRhZ2UgPSBnZXRfdm9sdGFnZShkZiwgZnJlcSk7Cj4gIAkJaWYgKHZvbHRhZ2Ug PT0gMCkgewo+IC0JCQlyZXMgPSAtRUlOVkFMOwo+IC0JCQlnb3RvIGZhaWw7Cj4gKwkJCWRmYy0+ cmVzX3V0aWwgPSBTQ0FMRV9FUlJPUl9NSVRJR0FUSU9OOwo+ICsJCQlyZXR1cm4gLUVJTlZBTDsK PiAgCQl9Cj4gIAo+ICAJCXJlcyA9IGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcihkZiwg cG93ZXIsIGZyZXEsIHZvbHRhZ2UpOwo+ICAJCWlmICghcmVzKSB7Cj4gLQkJCXN0YXRlID0gZGZj LT5jYXBwZWRfc3RhdGU7Cj4gLQkJCWRmYy0+cmVzX3V0aWwgPSBkZmMtPnBvd2VyX3RhYmxlW3N0 YXRlXTsKPiArCQkJZGZjLT5yZXNfdXRpbCA9IGRmYy0+ZW0tPnRhYmxlW2VtX3BlcmZfaWR4XS5w b3dlcjsKPiAgCQkJZGZjLT5yZXNfdXRpbCAqPSBTQ0FMRV9FUlJPUl9NSVRJR0FUSU9OOwo+ICAK PiAgCQkJaWYgKCpwb3dlciA+IDEpCj4gIAkJCQlkZmMtPnJlc191dGlsIC89ICpwb3dlcjsKPiAg CQl9IGVsc2Ugewo+IC0JCQlnb3RvIGZhaWw7Cj4gKwkJCS8qIEl0IGlzIHNhZmUgdG8gc2V0IG1h eCBpbiB0aGlzIGNhc2UgKi8KPiArCQkJZGZjLT5yZXNfdXRpbCA9IFNDQUxFX0VSUk9SX01JVElH QVRJT047Cj4gKwkJCXJldHVybiByZXM7Cj4gIAkJfQo+IC0JfSBlbHNlIHsKPiAtCQlkeW5fcG93 ZXIgPSBkZmMtPnBvd2VyX3RhYmxlW3N0YXRlXTsKPiAtCj4gLQkJLyogU2NhbGUgZHluYW1pYyBw b3dlciBmb3IgdXRpbGl6YXRpb24gKi8KPiAtCQlkeW5fcG93ZXIgKj0gc3RhdHVzLT5idXN5X3Rp bWU7Cj4gLQkJZHluX3Bvd2VyIC89IHN0YXR1cy0+dG90YWxfdGltZTsKPiAtCQkvKiBHZXQgc3Rh dGljIHBvd2VyICovCj4gLQkJc3RhdGljX3Bvd2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMsIGZy ZXEpOwo+IC0KPiAtCQkqcG93ZXIgPSBkeW5fcG93ZXIgKyBzdGF0aWNfcG93ZXI7Cj4gIAl9Cj4g IAo+IC0JdHJhY2VfdGhlcm1hbF9wb3dlcl9kZXZmcmVxX2dldF9wb3dlcihjZGV2LCBzdGF0dXMs IGZyZXEsIGR5bl9wb3dlciwKPiAtCQkJCQkgICAgICBzdGF0aWNfcG93ZXIsICpwb3dlcik7Cj4g Kwl0cmFjZV90aGVybWFsX3Bvd2VyX2RldmZyZXFfZ2V0X3Bvd2VyKGNkZXYsICZzdGF0dXMsIGZy ZXEsICpwb3dlcik7Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gLWZhaWw6Cj4gLQkvKiBJdCBpcyBzYWZl IHRvIHNldCBtYXggaW4gdGhpcyBjYXNlICovCj4gLQlkZmMtPnJlc191dGlsID0gU0NBTEVfRVJS T1JfTUlUSUdBVElPTjsKPiAtCXJldHVybiByZXM7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgZGV2 ZnJlcV9jb29saW5nX3N0YXRlMnBvd2VyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpj ZGV2LAo+IEBAIC0zMDIsMTYgKzI1NywxNCBAQCBzdGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19z dGF0ZTJwb3dlcihzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiAgCQkJCSAg ICAgICB1MzIgKnBvd2VyKQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAq ZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiAtCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiAtCXUzMiBzdGF0 aWNfcG93ZXI7Cj4gKwlpbnQgaWR4Owo+ICAKPiAtCWlmIChzdGF0ZSA+PSBkZmMtPmZyZXFfdGFi bGVfc2l6ZSkKPiArCWlmIChzdGF0ZSA+IGRmYy0+bWF4X3N0YXRlKQo+ICAJCXJldHVybiAtRUlO VkFMOwo+ICAKPiAtCWZyZXEgPSBkZmMtPmZyZXFfdGFibGVbc3RhdGVdOwo+IC0Jc3RhdGljX3Bv d2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMsIGZyZXEpOwo+ICsJaWR4ID0gZGZjLT5tYXhfc3Rh dGUgLSBzdGF0ZTsKPiArCSpwb3dlciA9IGRmYy0+ZW0tPnRhYmxlW2lkeF0ucG93ZXI7Cj4gIAo+ IC0JKnBvd2VyID0gZGZjLT5wb3dlcl90YWJsZVtzdGF0ZV0gKyBzdGF0aWNfcG93ZXI7Cj4gIAly ZXR1cm4gMDsKPiAgfQo+ICAKPiBAQCAtMzIxLDM5ICsyNzQsNDEgQEAgc3RhdGljIGludCBkZXZm cmVxX2Nvb2xpbmdfcG93ZXIyc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNk ZXYsCj4gIHsKPiAgCXN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMgPSBjZGV2LT5k ZXZkYXRhOwo+ICAJc3RydWN0IGRldmZyZXEgKmRmID0gZGZjLT5kZXZmcmVxOwo+IC0Jc3RydWN0 IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdHVzID0gJmRmLT5sYXN0X3N0YXR1czsKPiAtCXVuc2ln bmVkIGxvbmcgZnJlcSA9IHN0YXR1cy0+Y3VycmVudF9mcmVxdWVuY3k7Cj4gLQl1bnNpZ25lZCBs b25nIGJ1c3lfdGltZTsKPiAtCXMzMiBkeW5fcG93ZXI7Cj4gLQl1MzIgc3RhdGljX3Bvd2VyOwo+ IC0JczMyIGVzdF9wb3dlcjsKPiArCXN0cnVjdCBkZXZmcmVxX2Rldl9zdGF0dXMgc3RhdHVzOwo+ ICsJdTMyIGVzdF9wb3dlciA9IHBvd2VyOwo+ICsJdW5zaWduZWQgbG9uZyBmcmVxOwo+ICAJaW50 IGk7Cj4gIAo+IC0JaWYgKGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcikgewo+IC0JCS8q IFNjYWxlIGZvciByZXNvdXJjZSB1dGlsaXphdGlvbiAqLwo+IC0JCWVzdF9wb3dlciA9IHBvd2Vy ICogZGZjLT5yZXNfdXRpbDsKPiAtCQllc3RfcG93ZXIgLz0gU0NBTEVfRVJST1JfTUlUSUdBVElP TjsKPiAtCX0gZWxzZSB7Cj4gLQkJc3RhdGljX3Bvd2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMs IGZyZXEpOwo+ICsJbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ICsJc3RhdHVzID0gZGYtPmxhc3Rf c3RhdHVzOwo+ICsJbXV0ZXhfdW5sb2NrKCZkZi0+bG9jayk7Cj4gIAo+IC0JCWR5bl9wb3dlciA9 IHBvd2VyIC0gc3RhdGljX3Bvd2VyOwo+IC0JCWR5bl9wb3dlciA9IGR5bl9wb3dlciA+IDAgPyBk eW5fcG93ZXIgOiAwOwo+ICsJZnJlcSA9IHN0YXR1cy5jdXJyZW50X2ZyZXF1ZW5jeTsKPiAgCj4g LQkJLyogU2NhbGUgZHluYW1pYyBwb3dlciBmb3IgdXRpbGl6YXRpb24gKi8KPiAtCQlidXN5X3Rp bWUgPSBzdGF0dXMtPmJ1c3lfdGltZSA/OiAxOwo+IC0JCWVzdF9wb3dlciA9IChkeW5fcG93ZXIg KiBzdGF0dXMtPnRvdGFsX3RpbWUpIC8gYnVzeV90aW1lOwo+ICsJLyoKPiArCSAqIFNjYWxlIGZv ciByZXNvdXJjZSB1dGlsaXphdGlvbi4gVXNlIHNpbXBsZSBFbmVyZ3kgTW9kZWwgcG93ZXIKPiAr CSAqIGNhbGN1bGF0aW9uIGlmIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGNvb2xpbmcgZGV2aWNlIG1v ZGVsIGRvZXMKPiArCSAqIG5vdCBleGlzdC4KPiArCSAqLwo+ICsJaWYgKCFkZmMtPnBvd2VyX29w cyB8fCAhZGZjLT5wb3dlcl9vcHMtPmdldF9yZWFsX3Bvd2VyKSB7Cj4gKwkJX25vcm1hbGl6ZV9s b2FkKCZzdGF0dXMpOwo+ICsJCWVzdF9wb3dlciAqPSBzdGF0dXMudG90YWxfdGltZTsKPiArCQll c3RfcG93ZXIgLz0gc3RhdHVzLmJ1c3lfdGltZTsKPiArCX0gZWxzZSB7Cj4gKwkJZXN0X3Bvd2Vy ICo9IGRmYy0+cmVzX3V0aWw7Cj4gKwkJZXN0X3Bvd2VyIC89IFNDQUxFX0VSUk9SX01JVElHQVRJ T047Cj4gIAl9Cj4gIAo+ICAJLyoKPiAgCSAqIEZpbmQgdGhlIGZpcnN0IGNvb2xpbmcgc3RhdGUg dGhhdCBpcyB3aXRoaW4gdGhlIHBvd2VyCj4gLQkgKiBidWRnZXQgZm9yIGR5bmFtaWMgcG93ZXIu Cj4gKwkgKiBidWRnZXQuIFRoZSBFTSBwb3dlciB0YWJsZSBpcyBzb3J0ZWQgYXNjZW5kaW5nLgo+ ICAJICovCj4gLQlmb3IgKGkgPSAwOyBpIDwgZGZjLT5mcmVxX3RhYmxlX3NpemUgLSAxOyBpKysp Cj4gLQkJaWYgKGVzdF9wb3dlciA+PSBkZmMtPnBvd2VyX3RhYmxlW2ldKQo+ICsJZm9yIChpID0g ZGZjLT5tYXhfc3RhdGU7IGkgPiAwOyBpLS0pCj4gKwkJaWYgKGVzdF9wb3dlciA+PSBkZmMtPmVt LT50YWJsZVtpXS5wb3dlcikKPiAgCQkJYnJlYWs7Cj4gIAo+IC0JKnN0YXRlID0gaTsKPiAtCWRm Yy0+Y2FwcGVkX3N0YXRlID0gaTsKPiArCSpzdGF0ZSA9IGRmYy0+bWF4X3N0YXRlIC0gaTsKPiAr Cj4gIAl0cmFjZV90aGVybWFsX3Bvd2VyX2RldmZyZXFfbGltaXQoY2RldiwgZnJlcSwgKnN0YXRl LCBwb3dlcik7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+IEBAIC0zNjUsOTEgKzMyMCw0MyBAQCBzdGF0 aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGRldmZyZXFfY29vbGluZ19vcHMg PSB7Cj4gIH07Cj4gIAo+ICAvKioKPiAtICogZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoKSAt IEdlbmVyYXRlIHBvd2VyIGFuZCBmcmVxIHRhYmxlcy4KPiAtICogQGRmYzogUG9pbnRlciB0byBk ZXZmcmVxIGNvb2xpbmcgZGV2aWNlLgo+IC0gKgo+IC0gKiBHZW5lcmF0ZSBwb3dlciBhbmQgZnJl cXVlbmN5IHRhYmxlczogdGhlIHBvd2VyIHRhYmxlIGhvbGQgdGhlCj4gLSAqIGRldmljZSdzIG1h eGltdW0gcG93ZXIgdXNhZ2UgYXQgZWFjaCBjb29saW5nIHN0YXRlIChPUFApLiAgVGhlCj4gLSAq IHN0YXRpYyBhbmQgZHluYW1pYyBwb3dlciB1c2luZyB0aGUgYXBwcm9wcmlhdGUgdm9sdGFnZSBh bmQKPiAtICogZnJlcXVlbmN5IGZvciB0aGUgc3RhdGUsIGlzIGFjcXVpcmVkIGZyb20gdGhlIHN0 cnVjdAo+IC0gKiBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIsIGFuZCBzdW1tZWQgdG8gbWFrZSB0aGUg bWF4aW11bSBwb3dlciBkcmF3Lgo+IC0gKgo+IC0gKiBUaGUgZnJlcXVlbmN5IHRhYmxlIGhvbGRz IHRoZSBmcmVxdWVuY2llcyBpbiBkZXNjZW5kaW5nIG9yZGVyLgo+IC0gKiBUaGF0IHdheSBpdHMg aW5kZXhlZCBieSBjb29saW5nIGRldmljZSBzdGF0ZS4KPiArICogZGV2ZnJlcV9jb29saW5nX2dl bl90YWJsZXMoKSAtIEdlbmVyYXRlIGZyZXF1ZW5jeSB0YWJsZS4KPiArICogQGRmYzoJUG9pbnRl ciB0byBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlLgo+ICsgKiBAbnVtX29wcHM6CU51bWJlciBvZiBP UFBzCj4gICAqCj4gLSAqIFRoZSB0YWJsZXMgYXJlIG1hbGxvY2VkLCBhbmQgcG9pbnRlcnMgcHV0 IGluIGRmYy4gIFRoZXkgbXVzdCBiZQo+IC0gKiBmcmVlZCB3aGVuIHVucmVnaXN0ZXJpbmcgdGhl IGRldmZyZXEgY29vbGluZyBkZXZpY2UuCj4gKyAqIEdlbmVyYXRlIGZyZXF1ZW5jeSB0YWJsZSB3 aGljaCBob2xkcyB0aGUgZnJlcXVlbmNpZXMgaW4gZGVzY2VuZGluZwo+ICsgKiBvcmRlci4gVGhh dCB3YXkgaXRzIGluZGV4ZWQgYnkgY29vbGluZyBkZXZpY2Ugc3RhdGUuIFRoaXMgaXMgZm9yCj4g KyAqIGNvbXBhdGliaWxpdHkgd2l0aCBkcml2ZXJzIHdoaWNoIGRvIG5vdCByZWdpc3RlciBFbmVy Z3kgTW9kZWwuCj4gICAqCj4gICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCj4gICAqLwo+IC1zdGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19n ZW5fdGFibGVzKHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMpCj4gK3N0YXRpYyBp bnQgZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoc3RydWN0IGRldmZyZXFfY29vbGluZ19kZXZp Y2UgKmRmYywKPiArCQkJCSAgICAgIGludCBudW1fb3BwcykKPiAgewo+ICAJc3RydWN0IGRldmZy ZXEgKmRmID0gZGZjLT5kZXZmcmVxOwo+ICAJc3RydWN0IGRldmljZSAqZGV2ID0gZGYtPmRldi5w YXJlbnQ7Cj4gLQlpbnQgcmV0LCBudW1fb3BwczsKPiAgCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiAt CXUzMiAqcG93ZXJfdGFibGUgPSBOVUxMOwo+IC0JdTMyICpmcmVxX3RhYmxlOwo+ICAJaW50IGk7 Cj4gIAo+IC0JbnVtX29wcHMgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQoZGV2KTsKPiAtCj4g LQlpZiAoZGZjLT5wb3dlcl9vcHMpIHsKPiAtCQlwb3dlcl90YWJsZSA9IGtjYWxsb2MobnVtX29w cHMsIHNpemVvZigqcG93ZXJfdGFibGUpLAo+IC0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Cj4gLQkJ aWYgKCFwb3dlcl90YWJsZSkKPiAtCQkJcmV0dXJuIC1FTk9NRU07Cj4gLQl9Cj4gLQo+IC0JZnJl cV90YWJsZSA9IGtjYWxsb2MobnVtX29wcHMsIHNpemVvZigqZnJlcV90YWJsZSksCj4gKwlkZmMt PmZyZXFfdGFibGUgPSBrY2FsbG9jKG51bV9vcHBzLCBzaXplb2YoKmRmYy0+ZnJlcV90YWJsZSks Cj4gIAkJCSAgICAgR0ZQX0tFUk5FTCk7Cj4gLQlpZiAoIWZyZXFfdGFibGUpIHsKPiAtCQlyZXQg PSAtRU5PTUVNOwo+IC0JCWdvdG8gZnJlZV9wb3dlcl90YWJsZTsKPiAtCX0KPiArCWlmICghZGZj LT5mcmVxX3RhYmxlKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICAKPiAgCWZvciAoaSA9IDAsIGZy ZXEgPSBVTE9OR19NQVg7IGkgPCBudW1fb3BwczsgaSsrLCBmcmVxLS0pIHsKPiAtCQl1bnNpZ25l ZCBsb25nIHBvd2VyLCB2b2x0YWdlOwo+ICAJCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7Cj4gIAo+ ICAJCW9wcCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yKGRldiwgJmZyZXEpOwo+ICAJCWlm IChJU19FUlIob3BwKSkgewo+IC0JCQlyZXQgPSBQVFJfRVJSKG9wcCk7Cj4gLQkJCWdvdG8gZnJl ZV90YWJsZXM7Cj4gKwkJCWtmcmVlKGRmYy0+ZnJlcV90YWJsZSk7Cj4gKwkJCXJldHVybiBQVFJf RVJSKG9wcCk7Cj4gIAkJfQo+ICAKPiAtCQl2b2x0YWdlID0gZGV2X3BtX29wcF9nZXRfdm9sdGFn ZShvcHApIC8gMTAwMDsgLyogbVYgKi8KPiAgCQlkZXZfcG1fb3BwX3B1dChvcHApOwo+IC0KPiAt CQlpZiAoZGZjLT5wb3dlcl9vcHMpIHsKPiAtCQkJaWYgKGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVh bF9wb3dlcikKPiAtCQkJCXBvd2VyID0gZ2V0X3RvdGFsX3Bvd2VyKGRmYywgZnJlcSwgdm9sdGFn ZSk7Cj4gLQkJCWVsc2UKPiAtCQkJCXBvd2VyID0gZ2V0X2R5bmFtaWNfcG93ZXIoZGZjLCBmcmVx LCB2b2x0YWdlKTsKPiAtCj4gLQkJCWRldl9kYmcoZGV2LCAiUG93ZXIgdGFibGU6ICVsdSBNSHog QCAlbHUgbVY6ICVsdSA9ICVsdSBtV1xuIiwKPiAtCQkJCWZyZXEgLyAxMDAwMDAwLCB2b2x0YWdl LCBwb3dlciwgcG93ZXIpOwo+IC0KPiAtCQkJcG93ZXJfdGFibGVbaV0gPSBwb3dlcjsKPiAtCQl9 Cj4gLQo+IC0JCWZyZXFfdGFibGVbaV0gPSBmcmVxOwo+ICsJCWRmYy0+ZnJlcV90YWJsZVtpXSA9 IGZyZXE7Cj4gIAl9Cj4gIAo+IC0JaWYgKGRmYy0+cG93ZXJfb3BzKQo+IC0JCWRmYy0+cG93ZXJf dGFibGUgPSBwb3dlcl90YWJsZTsKPiAtCj4gLQlkZmMtPmZyZXFfdGFibGUgPSBmcmVxX3RhYmxl Owo+IC0JZGZjLT5mcmVxX3RhYmxlX3NpemUgPSBudW1fb3BwczsKPiAtCj4gIAlyZXR1cm4gMDsK PiAtCj4gLWZyZWVfdGFibGVzOgo+IC0Ja2ZyZWUoZnJlcV90YWJsZSk7Cj4gLWZyZWVfcG93ZXJf dGFibGU6Cj4gLQlrZnJlZShwb3dlcl90YWJsZSk7Cj4gLQo+IC0JcmV0dXJuIHJldDsKPiAgfQo+ ICAKPiAgLyoqCj4gQEAgLTQ3NCw3ICszODEsNyBAQCBvZl9kZXZmcmVxX2Nvb2xpbmdfcmVnaXN0 ZXJfcG93ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGRldmZyZXEgKmRmLAo+ICAJ c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9j b29saW5nX2RldmljZSAqZGZjOwo+ICAJY2hhciBkZXZfbmFtZVtUSEVSTUFMX05BTUVfTEVOR1RI XTsKPiAtCWludCBlcnI7Cj4gKwlpbnQgZXJyLCBudW1fb3BwczsKPiAgCj4gIAlkZmMgPSBremFs bG9jKHNpemVvZigqZGZjKSwgR0ZQX0tFUk5FTCk7Cj4gIAlpZiAoIWRmYykKPiBAQCAtNDgyLDI4 ICszODksNDUgQEAgb2ZfZGV2ZnJlcV9jb29saW5nX3JlZ2lzdGVyX3Bvd2VyKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZmcmVxICpkZiwKPiAgCj4gIAlkZmMtPmRldmZyZXEgPSBk ZjsKPiAgCj4gLQlpZiAoZGZjX3Bvd2VyKSB7Cj4gLQkJZGZjLT5wb3dlcl9vcHMgPSBkZmNfcG93 ZXI7Cj4gLQo+ICsJZGZjLT5lbSA9IGVtX3BkX2dldChkZi0+ZGV2LnBhcmVudCk7Cj4gKwlpZiAo ZGZjLT5lbSkgewo+ICAJCWRldmZyZXFfY29vbGluZ19vcHMuZ2V0X3JlcXVlc3RlZF9wb3dlciA9 Cj4gIAkJCWRldmZyZXFfY29vbGluZ19nZXRfcmVxdWVzdGVkX3Bvd2VyOwo+ICAJCWRldmZyZXFf Y29vbGluZ19vcHMuc3RhdGUycG93ZXIgPSBkZXZmcmVxX2Nvb2xpbmdfc3RhdGUycG93ZXI7Cj4g IAkJZGV2ZnJlcV9jb29saW5nX29wcy5wb3dlcjJzdGF0ZSA9IGRldmZyZXFfY29vbGluZ19wb3dl cjJzdGF0ZTsKPiArCj4gKwkJZGZjLT5wb3dlcl9vcHMgPSBkZmNfcG93ZXI7Cj4gKwo+ICsJCW51 bV9vcHBzID0gZW1fcGRfbnJfcGVyZl9zdGF0ZXMoZGZjLT5lbSk7Cj4gKwl9IGVsc2Ugewo+ICsJ CS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGRyaXZlcnMgd2hpY2ggZG8gbm90IHVzZSBJ UEEgKi8KPiArCQlkZXZfZGJnKGRmLT5kZXYucGFyZW50LCAibWlzc2luZyBFTSBmb3IgY29vbGlu ZyBkZXZpY2VcbiIpOwo+ICsKPiArCQludW1fb3BwcyA9IGRldl9wbV9vcHBfZ2V0X29wcF9jb3Vu dChkZi0+ZGV2LnBhcmVudCk7Cj4gKwo+ICsJCWVyciA9IGRldmZyZXFfY29vbGluZ19nZW5fdGFi bGVzKGRmYywgbnVtX29wcHMpOwo+ICsJCWlmIChlcnIpCj4gKwkJCWdvdG8gZnJlZV9kZmM7Cj4g IAl9Cj4gIAo+IC0JZXJyID0gZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoZGZjKTsKPiAtCWlm IChlcnIpCj4gKwlpZiAobnVtX29wcHMgPD0gMCkgewo+ICsJCWVyciA9IC1FSU5WQUw7Cj4gIAkJ Z290byBmcmVlX2RmYzsKPiArCX0KPiArCj4gKwkvKiBtYXhfc3RhdGUgaXMgYW4gaW5kZXgsIG5v dCBhIGNvdW50ZXIgKi8KPiArCWRmYy0+bWF4X3N0YXRlID0gbnVtX29wcHMgLSAxOwo+ICAKPiAg CWVyciA9IGRldl9wbV9xb3NfYWRkX3JlcXVlc3QoZGYtPmRldi5wYXJlbnQsICZkZmMtPnJlcV9t YXhfZnJlcSwKPiAgCQkJCSAgICAgREVWX1BNX1FPU19NQVhfRlJFUVVFTkNZLAo+ICAJCQkJICAg ICBQTV9RT1NfTUFYX0ZSRVFVRU5DWV9ERUZBVUxUX1ZBTFVFKTsKPiAgCWlmIChlcnIgPCAwKQo+ IC0JCWdvdG8gZnJlZV90YWJsZXM7Cj4gKwkJZ290byBmcmVlX3RhYmxlOwo+ICAKPiAgCWVyciA9 IGlkYV9zaW1wbGVfZ2V0KCZkZXZmcmVxX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7Cj4gIAlpZiAo ZXJyIDwgMCkKPiAgCQlnb3RvIHJlbW92ZV9xb3NfcmVxOwo+ICsKPiAgCWRmYy0+aWQgPSBlcnI7 Cj4gIAo+ICAJc25wcmludGYoZGV2X25hbWUsIHNpemVvZihkZXZfbmFtZSksICJ0aGVybWFsLWRl dmZyZXEtJWQiLCBkZmMtPmlkKTsKPiBAQCAtNTI0LDE2ICs0NDgsMTYgQEAgb2ZfZGV2ZnJlcV9j b29saW5nX3JlZ2lzdGVyX3Bvd2VyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZm cmVxICpkZiwKPiAgCj4gIHJlbGVhc2VfaWRhOgo+ICAJaWRhX3NpbXBsZV9yZW1vdmUoJmRldmZy ZXFfaWRhLCBkZmMtPmlkKTsKPiAtCj4gIHJlbW92ZV9xb3NfcmVxOgo+ICAJZGV2X3BtX3Fvc19y ZW1vdmVfcmVxdWVzdCgmZGZjLT5yZXFfbWF4X2ZyZXEpOwo+IC0KPiAtZnJlZV90YWJsZXM6Cj4g LQlrZnJlZShkZmMtPnBvd2VyX3RhYmxlKTsKPiArZnJlZV90YWJsZToKPiAgCWtmcmVlKGRmYy0+ ZnJlcV90YWJsZSk7Cj4gIGZyZWVfZGZjOgo+ICAJa2ZyZWUoZGZjKTsKPiAgCj4gKwlpZiAoZGZj LT5lbSkKPiArCQllbV9wZF9wdXQoZGYtPmRldi5wYXJlbnQpOwo+ICsKPiAgCXJldHVybiBFUlJf UFRSKGVycik7Cj4gIH0KPiAgRVhQT1JUX1NZTUJPTF9HUEwob2ZfZGV2ZnJlcV9jb29saW5nX3Jl Z2lzdGVyX3Bvd2VyKTsKPiBAQCAtNTYxLDI1ICs0ODUsMTE5IEBAIHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpkZXZmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRm KQo+ICB9Cj4gIEVYUE9SVF9TWU1CT0xfR1BMKGRldmZyZXFfY29vbGluZ19yZWdpc3Rlcik7Cj4g IAo+ICsvKioKPiArICogZGV2ZnJlcV9jb29saW5nX2VtX3JlZ2lzdGVyX3Bvd2VyKCkgLSBSZWdp c3RlciBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlIHdpdGgKPiArICoJCXBvd2VyIGluZm9ybWF0aW9u IGFuZCBhdHRlbXB0IHRvIHJlZ2lzdGVyIEVuZXJneSBNb2RlbCAoRU0pCj4gKyAqIEBkZjoJCVBv aW50ZXIgdG8gZGV2ZnJlcSBkZXZpY2UuCj4gKyAqIEBkZmNfcG93ZXI6CVBvaW50ZXIgdG8gZGV2 ZnJlcV9jb29saW5nX3Bvd2VyLgo+ICsgKiBAZW1fY2I6CUNhbGxiYWNrIGZ1bmN0aW9ucyBwcm92 aWRpbmcgdGhlIGRhdGEgb2YgdGhlIEVNCj4gKyAqCj4gKyAqIFJlZ2lzdGVyIGEgZGV2ZnJlcSBj b29saW5nIGRldmljZSBhbmQgYXR0ZW1wdCB0byByZWdpc3RlciBFbmVyZ3kgTW9kZWwuIFRoZQo+ ICsgKiBhdmFpbGFibGUgT1BQcyBtdXN0IGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBkZXZpY2UuCj4g KyAqCj4gKyAqIElmIEBkZmNfcG93ZXIgaXMgcHJvdmlkZWQsIHRoZSBjb29saW5nIGRldmljZSBp cyByZWdpc3RlcmVkIHdpdGggdGhlCj4gKyAqIHBvd2VyIGV4dGVuc2lvbnMuIElmIEBlbV9jYiBp cyBwcm92aWRlZCBpdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBPUFAgdG8KPiArICogY2FsY3Vs YXRlIHBvd2VyIHZhbHVlIGFuZCBjb3N0LiBJZiBAZW1fY2IgaXMgbm90IHByb3ZpZGVkIHRoZW4g c2ltcGxlIEVuZXJneQo+ICsgKiBNb2RlbCBpcyBnb2luZyB0byBiZSB1c2VkLCB3aGljaCByZXF1 aXJlcyAiZHluYW1pYy1wb3dlci1jb2VmZmljaWVudCIgYQo+ICsgKiBkZXZpY2V0cmVlIHByb3Bl cnR5Lgo+ICsgKi8KPiArc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVx X2Nvb2xpbmdfZW1fcmVnaXN0ZXJfcG93ZXIoc3RydWN0IGRldmZyZXEgKmRmLAo+ICsJCQkJICBz dHJ1Y3QgZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpkZmNfcG93ZXIsCj4gKwkJCQkgIHN0cnVjdCBl bV9kYXRhX2NhbGxiYWNrICplbV9jYikKPiArewo+ICsJc3RydWN0IHRoZXJtYWxfY29vbGluZ19k ZXZpY2UgKmNkZXY7Cj4gKwlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAqZGZjOwo+ICsJ c3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4g KwlpbnQgbnJfb3BwLCByZXQ7Cj4gKwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGRmKSkKPiArCQly ZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPiArCj4gKwlkZXYgPSBkZi0+ZGV2LnBhcmVudDsKPiAr Cj4gKwlpZiAoZW1fY2IpIHsKPiArCQlucl9vcHAgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQo ZGV2KTsKPiArCQlpZiAobnJfb3BwIDw9IDApIHsKPiArCQkJZGV2X2VycihkZXYsICJObyB2YWxp ZCBPUFBzIGZvdW5kXG4iKTsKPiArCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gKwkJfQo+ ICsKPiArCQlyZXQgPSBlbV9kZXZfcmVnaXN0ZXJfcGVyZl9kb21haW4oZGV2LCBucl9vcHAsIGVt X2NiLCBOVUxMKTsKPiArCX0gZWxzZSB7Cj4gKwkJcmV0ID0gZGV2X3BtX29wcF9vZl9yZWdpc3Rl cl9lbShkZXYsIE5VTEwpOwo+ICsJfQo+ICsKPiArCWlmIChyZXQpCj4gKwkJZGV2X3dhcm4oZGV2 LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIEVNIGZvciBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlICglZClc biIsCj4gKwkJCSByZXQpOwo+ICsKPiArCWlmIChkZXYtPm9mX25vZGUpCj4gKwkJbnAgPSBvZl9u b2RlX2dldChkZXYtPm9mX25vZGUpOwo+ICsKPiArCWNkZXYgPSBvZl9kZXZmcmVxX2Nvb2xpbmdf cmVnaXN0ZXJfcG93ZXIobnAsIGRmLCBkZmNfcG93ZXIpOwo+ICsKPiArCWlmIChucCkKPiArCQlv Zl9ub2RlX3B1dChucCk7Cj4gKwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGNkZXYpKSB7Cj4gKwkJ aWYgKCFyZXQpCj4gKwkJCWVtX2Rldl91bnJlZ2lzdGVyX3BlcmZfZG9tYWluKGRldik7Cj4gKwl9 IGVsc2Ugewo+ICsJCWRmYyA9IGNkZXYtPmRldmRhdGE7Cj4gKwkJZGZjLT5lbV9yZWdpc3RlcmVk ID0gIXJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gY2RldjsKPiArfQo+ICtFWFBPUlRfU1lNQk9M X0dQTChkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXJfcG93ZXIpOwo+ICsKPiArLyoqCj4gKyAq IGRldmZyZXFfY29vbGluZ19lbV9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgZGV2ZnJlcSBjb29saW5n IGRldmljZSB0b2dldGhlcgo+ICsgKgkJCQl3aXRoIEVuZXJneSBNb2RlbC4KPiArICogQGRmOgkJ UG9pbnRlciB0byBkZXZmcmVxIGRldmljZS4KPiArICogQGVtX2NiOglDYWxsYmFjayBmdW5jdGlv bnMgcHJvdmlkaW5nIHRoZSBkYXRhIG9mIHRoZSBFbmVyZ3kgTW9kZWwKPiArICoKPiArICogVGhp cyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZWdpc3RlciBFbmVyZ3kgTW9kZWwgZm9yIGRldmZyZXEg ZGV2aWNlIGFuZCB0aGVuCj4gKyAqIHJlZ2lzdGVyIHRoZSBkZXZmcmVxIGNvb2xpbmcgZGV2aWNl Lgo+ICsgKi8KPiArc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nv b2xpbmdfZW1fcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRmLCBzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqZW1fY2IpCj4gK3sKPiArCXJldHVybiBkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXJf cG93ZXIoZGYsIE5VTEwsIGVtX2NiKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChkZXZmcmVx X2Nvb2xpbmdfZW1fcmVnaXN0ZXIpOwo+ICsKPiAgLyoqCj4gICAqIGRldmZyZXFfY29vbGluZ191 bnJlZ2lzdGVyKCkgLSBVbnJlZ2lzdGVyIGRldmZyZXEgY29vbGluZyBkZXZpY2UuCj4gICAqIEBj ZGV2OiBQb2ludGVyIHRvIGRldmZyZXEgY29vbGluZyBkZXZpY2UgdG8gdW5yZWdpc3Rlci4KPiAr ICoKPiArICogVW5yZWdpc3RlcnMgZGV2ZnJlcSBjb29saW5nIGRldmljZSBhbmQgcmVsYXRlZCBF bmVyZ3kgTW9kZWwgaWYgaXQgd2FzCj4gKyAqIHByZXNlbnQuCj4gICAqLwo+ICB2b2lkIGRldmZy ZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2 KQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAqZGZjOwo+ICsJc3RydWN0 IGRldmljZSAqZGV2Owo+ICAKPiAtCWlmICghY2RldikKPiArCWlmIChJU19FUlJfT1JfTlVMTChj ZGV2KSkKPiAgCQlyZXR1cm47Cj4gIAo+ICAJZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiArCWRldiA9 IGRmYy0+ZGV2ZnJlcS0+ZGV2LnBhcmVudDsKPiAgCj4gIAl0aGVybWFsX2Nvb2xpbmdfZGV2aWNl X3VucmVnaXN0ZXIoZGZjLT5jZGV2KTsKPiAgCWlkYV9zaW1wbGVfcmVtb3ZlKCZkZXZmcmVxX2lk YSwgZGZjLT5pZCk7Cj4gIAlkZXZfcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZkZmMtPnJlcV9tYXhf ZnJlcSk7Cj4gLQlrZnJlZShkZmMtPnBvd2VyX3RhYmxlKTsKPiAtCWtmcmVlKGRmYy0+ZnJlcV90 YWJsZSk7Cj4gKwllbV9wZF9wdXQoZGV2KTsKPiAgCj4gKwkvKiBDaGVjayBpZiBkZXZmcmVxIGNv b2xpbmcgcmVnaXN0ZXJlZCB0aGlzIEVNIGFuZCBtdXN0IGZyZWUgaXQuICovCj4gKwlpZiAoZGZj LT5lbV9yZWdpc3RlcmVkKQo+ICsJCWVtX2Rldl91bnJlZ2lzdGVyX3BlcmZfZG9tYWluKGRldik7 Cj4gKwo+ICsJa2ZyZWUoZGZjLT5mcmVxX3RhYmxlKTsKPiAgCWtmcmVlKGRmYyk7Cj4gKwo+ICB9 Cj4gIEVYUE9SVF9TWU1CT0xfR1BMKGRldmZyZXFfY29vbGluZ191bnJlZ2lzdGVyKTsKPiBkaWZm IC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZmcmVxX2Nvb2xpbmcuaCBiL2luY2x1ZGUvbGludXgv ZGV2ZnJlcV9jb29saW5nLmgKPiBpbmRleCA3OWE2ZTM3YTFkNmYuLjYxMzY3OGNlMjNkZiAxMDA2 NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2RldmZyZXFfY29vbGluZy5oCj4gKysrIGIvaW5jbHVk ZS9saW51eC9kZXZmcmVxX2Nvb2xpbmcuaAo+IEBAIC0xOCwyMiArMTgsMTIgQEAKPiAgI2RlZmlu ZSBfX0RFVkZSRVFfQ09PTElOR19IX18KPiAgCj4gICNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLmg+ Cj4gKyNpbmNsdWRlIDxsaW51eC9lbmVyZ3lfbW9kZWwuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L3Ro ZXJtYWwuaD4KPiAgCj4gIAo+ICAvKioKPiAgICogc3RydWN0IGRldmZyZXFfY29vbGluZ19wb3dl ciAtIERldmZyZXEgY29vbGluZyBwb3dlciBvcHMKPiAtICogQGdldF9zdGF0aWNfcG93ZXI6CVRh a2Ugdm9sdGFnZSwgaW4gbVYsIGFuZCByZXR1cm4gdGhlIHN0YXRpYyBwb3dlcgo+IC0gKgkJCWlu IG1XLiAgSWYgTlVMTCwgdGhlIHN0YXRpYyBwb3dlciBpcyBhc3N1bWVkCj4gLSAqCQkJdG8gYmUg MC4KPiAtICogQGdldF9keW5hbWljX3Bvd2VyOglUYWtlIHZvbHRhZ2UsIGluIG1WLCBhbmQgZnJl cXVlbmN5LCBpbiBIWiwgYW5kCj4gLSAqCQkJcmV0dXJuIHRoZSBkeW5hbWljIHBvd2VyIGRyYXcg aW4gbVcuICBJZiBOVUxMLAo+IC0gKgkJCWEgc2ltcGxlIHBvd2VyIG1vZGVsIGlzIHVzZWQuCj4g LSAqIEBkeW5fcG93ZXJfY29lZmY6CUNvZWZmaWNpZW50IGZvciB0aGUgc2ltcGxlIGR5bmFtaWMg cG93ZXIgbW9kZWwgaW4KPiAtICoJCQltVy8oTUh6IG1WIG1WKS4KPiAtICoJCQlJZiBnZXRfZHlu YW1pY19wb3dlcigpIGlzIE5VTEwsIHRoZW4gdGhlCj4gLSAqCQkJZHluYW1pYyBwb3dlciBpcyBj YWxjdWxhdGVkIGFzCj4gLSAqCQkJQGR5bl9wb3dlcl9jb2VmZiAqIGZyZXF1ZW5jeSAqIHZvbHRh Z2VeMgo+ICAgKiBAZ2V0X3JlYWxfcG93ZXI6CVdoZW4gdGhpcyBpcyBzZXQsIHRoZSBmcmFtZXdv cmsgdXNlcyBpdCB0byBhc2sgdGhlCj4gICAqCQkJZGV2aWNlIGRyaXZlciBmb3IgdGhlIGFjdHVh bCBwb3dlci4KPiAgICoJCQlTb21lIGRldmljZXMgaGF2ZSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0 aG9kcwo+IEBAIC01MywxNCArNDMsOCBAQAo+ICAgKgkJCW1heCB0b3RhbCAoc3RhdGljICsgZHlu YW1pYykgcG93ZXIgdmFsdWUgZm9yIGVhY2ggT1BQLgo+ICAgKi8KPiAgc3RydWN0IGRldmZyZXFf Y29vbGluZ19wb3dlciB7Cj4gLQl1bnNpZ25lZCBsb25nICgqZ2V0X3N0YXRpY19wb3dlcikoc3Ry dWN0IGRldmZyZXEgKmRldmZyZXEsCj4gLQkJCQkJICB1bnNpZ25lZCBsb25nIHZvbHRhZ2UpOwo+ IC0JdW5zaWduZWQgbG9uZyAoKmdldF9keW5hbWljX3Bvd2VyKShzdHJ1Y3QgZGV2ZnJlcSAqZGV2 ZnJlcSwKPiAtCQkJCQkgICB1bnNpZ25lZCBsb25nIGZyZXEsCj4gLQkJCQkJICAgdW5zaWduZWQg bG9uZyB2b2x0YWdlKTsKPiAgCWludCAoKmdldF9yZWFsX3Bvd2VyKShzdHJ1Y3QgZGV2ZnJlcSAq ZGYsIHUzMiAqcG93ZXIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJlcSwgdW5zaWduZWQg bG9uZyB2b2x0YWdlKTsKPiAtCXVuc2lnbmVkIGxvbmcgZHluX3Bvd2VyX2NvZWZmOwo+ICB9Owo+ ICAKPiAgI2lmZGVmIENPTkZJR19ERVZGUkVRX1RIRVJNQUwKPiBAQCAtNzIsNiArNTYsMTMgQEAg c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICBvZl9kZXZmcmVxX2Nvb2xpbmdfcmVn aXN0ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGRldmZyZXEgKmRmKTsKPiAgc3Ry dWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmRldmZyZXFfY29vbGluZ19yZWdpc3RlcihzdHJ1 Y3QgZGV2ZnJlcSAqZGYpOwo+ICB2b2lkIGRldmZyZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVj dCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpkZmMpOwo+ICtzdHJ1Y3QgdGhlcm1hbF9jb29saW5n X2RldmljZSAqCj4gK2RldmZyZXFfY29vbGluZ19lbV9yZWdpc3Rlcl9wb3dlcihzdHJ1Y3QgZGV2 ZnJlcSAqZGYsCj4gKwkJCQkgIHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIgKmRmY19wb3dl ciwKPiArCQkJCSAgc3RydWN0IGVtX2RhdGFfY2FsbGJhY2sgKmVtX2NiKTsKPiArc3RydWN0IHRo ZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXIoc3Ry dWN0IGRldmZyZXEgKmRmLAo+ICsJCQkgICAgc3RydWN0IGVtX2RhdGFfY2FsbGJhY2sgKmVtX2Ni KTsKPiAgCj4gICNlbHNlIC8qICFDT05GSUdfREVWRlJFUV9USEVSTUFMICovCj4gIAo+IEBAIC05 NCw2ICs4NSwyMCBAQCBkZXZmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRm KQo+ICAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nvb2xpbmdfZW1fcmVn aXN0ZXJfcG93ZXIoc3RydWN0IGRldmZyZXEgKmRmLAo+ICsJCQkJICBzdHJ1Y3QgZGV2ZnJlcV9j b29saW5nX3Bvd2VyICpkZmNfcG93ZXIsCj4gKwkJCQkgIHN0cnVjdCBlbV9kYXRhX2NhbGxiYWNr ICplbV9jYikKPiArewo+ICsJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nv b2xpbmdfZW1fcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRmLAlzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqZW1fY2IpCj4gK3sKPiArCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+ICt9Cj4gKwo+ ICBzdGF0aWMgaW5saW5lIHZvaWQKPiAgZGV2ZnJlcV9jb29saW5nX3VucmVnaXN0ZXIoc3RydWN0 IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmRmYykKPiAgewo+IGRpZmYgLS1naXQgYS9pbmNsdWRl L3RyYWNlL2V2ZW50cy90aGVybWFsLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVybWFsLmgK PiBpbmRleCAxMzVlNTQyMWYwMDMuLjhhNWYwNDg4OGFiZCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRl L3RyYWNlL2V2ZW50cy90aGVybWFsLmgKPiArKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVy bWFsLmgKPiBAQCAtMTUzLDMxICsxNTMsMzAgQEAgVFJBQ0VfRVZFTlQodGhlcm1hbF9wb3dlcl9j cHVfbGltaXQsCj4gIFRSQUNFX0VWRU5UKHRoZXJtYWxfcG93ZXJfZGV2ZnJlcV9nZXRfcG93ZXIs Cj4gIAlUUF9QUk9UTyhzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiAgCQkg c3RydWN0IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdHVzLCB1bnNpZ25lZCBsb25nIGZyZXEsCj4g LQkJdTMyIGR5bmFtaWNfcG93ZXIsIHUzMiBzdGF0aWNfcG93ZXIsIHUzMiBwb3dlciksCj4gKwkJ dTMyIHBvd2VyKSwKPiAgCj4gLQlUUF9BUkdTKGNkZXYsIHN0YXR1cywgIGZyZXEsIGR5bmFtaWNf cG93ZXIsIHN0YXRpY19wb3dlciwgcG93ZXIpLAo+ICsJVFBfQVJHUyhjZGV2LCBzdGF0dXMsICBm cmVxLCBwb3dlciksCj4gIAo+ICAJVFBfU1RSVUNUX19lbnRyeSgKPiAgCQlfX3N0cmluZyh0eXBl LCAgICAgICAgIGNkZXYtPnR5cGUgICAgKQo+ICAJCV9fZmllbGQodW5zaWduZWQgbG9uZywgZnJl cSAgICAgICAgICApCj4gLQkJX19maWVsZCh1MzIsICAgICAgICAgICBsb2FkICAgICAgICAgICkK PiAtCQlfX2ZpZWxkKHUzMiwgICAgICAgICAgIGR5bmFtaWNfcG93ZXIgKQo+IC0JCV9fZmllbGQo dTMyLCAgICAgICAgICAgc3RhdGljX3Bvd2VyICApCj4gKwkJX19maWVsZCh1MzIsICAgICAgICAg ICBidXN5X3RpbWUpCj4gKwkJX19maWVsZCh1MzIsICAgICAgICAgICB0b3RhbF90aW1lKQo+ICAJ CV9fZmllbGQodTMyLCAgICAgICAgICAgcG93ZXIpCj4gIAkpLAo+ICAKPiAgCVRQX2Zhc3RfYXNz aWduKAo+ICAJCV9fYXNzaWduX3N0cih0eXBlLCBjZGV2LT50eXBlKTsKPiAgCQlfX2VudHJ5LT5m cmVxID0gZnJlcTsKPiAtCQlfX2VudHJ5LT5sb2FkID0gKDEwMCAqIHN0YXR1cy0+YnVzeV90aW1l KSAvIHN0YXR1cy0+dG90YWxfdGltZTsKPiAtCQlfX2VudHJ5LT5keW5hbWljX3Bvd2VyID0gZHlu YW1pY19wb3dlcjsKPiAtCQlfX2VudHJ5LT5zdGF0aWNfcG93ZXIgPSBzdGF0aWNfcG93ZXI7Cj4g KwkJX19lbnRyeS0+YnVzeV90aW1lID0gc3RhdHVzLT5idXN5X3RpbWU7Cj4gKwkJX19lbnRyeS0+ dG90YWxfdGltZSA9IHN0YXR1cy0+dG90YWxfdGltZTsKPiAgCQlfX2VudHJ5LT5wb3dlciA9IHBv d2VyOwo+ICAJKSwKPiAgCj4gLQlUUF9wcmludGsoInR5cGU9JXMgZnJlcT0lbHUgbG9hZD0ldSBk eW5hbWljX3Bvd2VyPSV1IHN0YXRpY19wb3dlcj0ldSBwb3dlcj0ldSIsCj4gKwlUUF9wcmludGso InR5cGU9JXMgZnJlcT0lbHUgbG9hZD0ldSBwb3dlcj0ldSIsCj4gIAkJX19nZXRfc3RyKHR5cGUp LCBfX2VudHJ5LT5mcmVxLAo+IC0JCV9fZW50cnktPmxvYWQsIF9fZW50cnktPmR5bmFtaWNfcG93 ZXIsIF9fZW50cnktPnN0YXRpY19wb3dlciwKPiArCQlfX2VudHJ5LT50b3RhbF90aW1lID09IDAg PyAwIDoKPiArCQkJKDEwMCAqIF9fZW50cnktPmJ1c3lfdGltZSkgLyBfX2VudHJ5LT50b3RhbF90 aW1lLAo+ICAJCV9fZW50cnktPnBvd2VyKQo+ICApOwo+ICAKPiAtLSAKPiAyLjE3LjEKPiAKCi0t IAoKIDxodHRwOi8vd3d3LmxpbmFyby5vcmcvPiBMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBz b2Z0d2FyZSBmb3IgQVJNIFNvQ3MKCkZvbGxvdyBMaW5hcm86ICA8aHR0cDovL3d3dy5mYWNlYm9v ay5jb20vcGFnZXMvTGluYXJvPiBGYWNlYm9vayB8CjxodHRwOi8vdHdpdHRlci5jb20vIyEvbGlu YXJvb3JnPiBUd2l0dGVyIHwKPGh0dHA6Ly93d3cubGluYXJvLm9yZy9saW5hcm8tYmxvZy8+IEJs b2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK 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=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable 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 4F95EC55192 for ; Thu, 23 Apr 2020 22:52:45 +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 221EB20736 for ; Thu, 23 Apr 2020 22:52:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="d9/G8/mm" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 221EB20736 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.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 920206EA6A; Thu, 23 Apr 2020 22:52:17 +0000 (UTC) Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by gabe.freedesktop.org (Postfix) with ESMTPS id 588B56E962 for ; Thu, 23 Apr 2020 17:57:17 +0000 (UTC) Received: by mail-wr1-x441.google.com with SMTP id s10so7922180wrr.0 for ; Thu, 23 Apr 2020 10:57:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=d9/G8/mm1s6L7U3grcrEtILx0VltO1cSLr9xd4Th5rnmfCECHODYPAQ0aO21o3IwGg 9VNKbfx6NWZUcdSr9v8HKX2+nMaRgSKRlfadsYoGQdlqgEqTKlxTs7An4FwHmf9BnwCo iCyN465/N3DmU+Ka1WexrnY/usLFGoUbWnLPaJ+LmUXqKshiJUE+Hxhly097fmrbyfkx EZnhrBKkW2EKPTiOqC93lCk34rbf/RL/7Oi6vrZpec06JT1mzH7f9zwJHpd6nTRaokjA VVFuVqsMDVnX61YrbxeBo+1/bHB839FVondm/j53B8LD03vwQwTzfayVz25EsQhr37hg ZodQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=0hqfNbN7Lf6ov4w56CDnMkJIiUf+NvNwcefMLgixvfs=; b=pOgJ/D6eMw+x4CzgN8lHOav/8/qSpYQ1kKkQduELCH7pbTvy9y9PYZhgFF3KjyfTFF vNfod/XYTGNe3pjwtEV1ezE0gFztnt8s6fwux4KiCnXj2NTq0Bo85yIkaFFQtRydSo70 hrVsArodBXxeIncRmqSRj24vAY3hpAbMKuGwmbL5JHCPulIwGlmIh2ZR60YdkjSu6udF MsJUbaQ+rEKRa2/cVjeWgaLFRpr2jG8AAel7ZDkQsX3MidVbRlwdXcE96+XOKg0HAg8k JRXgG/7lqq7lWtYQFDG8VlwJNKuC6jiWxlQSPW7O9vBr6TJX1O7tXSqu8wnwsTmyYoyB UXpg== X-Gm-Message-State: AGi0PuaBEvpHB3fI2g2bbgXwmEUeaoCZi3BfSO8qWqQQojcgW1b13tnV dPNEz08un3XRCEUFwhDSg3+mpQ== X-Google-Smtp-Source: APiQypJl+oEUyy7z0GtqEAxyqDXffHB5kQWgiibXowQIt/FHM/GqoWI3jwvWyT/gnQK8/Affz/K20w== X-Received: by 2002:a5d:4e06:: with SMTP id p6mr6069297wrt.35.1587664635462; Thu, 23 Apr 2020 10:57:15 -0700 (PDT) Received: from linaro.org ([37.167.216.250]) by smtp.gmail.com with ESMTPSA id t8sm4719117wrq.88.2020.04.23.10.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2020 10:57:14 -0700 (PDT) Date: Thu, 23 Apr 2020 19:57:08 +0200 From: Daniel Lezcano To: Lukasz Luba Subject: Re: [PATCH v6 09/10] thermal: devfreq_cooling: Refactor code and switch to use Energy Model Message-ID: <20200423175708.GG65632@linaro.org> References: <20200410084210.24932-1-lukasz.luba@arm.com> <20200410084210.24932-10-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200410084210.24932-10-lukasz.luba@arm.com> X-Mailman-Approved-At: Thu, 23 Apr 2020 22:50:35 +0000 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: nm@ti.com, juri.lelli@redhat.com, peterz@infradead.org, viresh.kumar@linaro.org, liviu.dudau@arm.com, dri-devel@lists.freedesktop.org, bjorn.andersson@linaro.org, bsegall@google.com, alyssa.rosenzweig@collabora.com, mka@chromium.org, amit.kucheria@verdurent.com, lorenzo.pieralisi@arm.com, vincent.guittot@linaro.org, khilman@kernel.org, agross@kernel.org, b.zolnierkie@samsung.com, steven.price@arm.com, cw00.choi@samsung.com, mingo@redhat.com, linux-imx@nxp.com, rui.zhang@intel.com, mgorman@suse.de, orjan.eide@arm.com, linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org, s.hauer@pengutronix.de, rostedt@goodmis.org, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-omap@vger.kernel.org, Dietmar.Eggemann@arm.com, linux-arm-kernel@lists.infradead.org, airlied@linux.ie, tomeu.vizoso@collabora.com, qperret@google.com, sboyd@kernel.org, rdunlap@infradead.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, kernel@pengutronix.de, sudeep.holla@arm.com, patrick.bellasi@matbug.net, shawnguo@kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gRnJpLCBBcHIgMTAsIDIwMjAgYXQgMDk6NDI6MDlBTSArMDEwMCwgTHVrYXN6IEx1YmEgd3Jv dGU6Cj4gVGhlIG92ZXJoYXVsZWQgRW5lcmd5IE1vZGVsIChFTSkgZnJhbWV3b3JrIHN1cHBvcnQg YWxzbyBkZXZmcmVxIGRldmljZXMuCj4gVGhlIHVuaWZpZWQgQVBJIGludGVyZmFjZSBvZiB0aGUg RU0gY2FuIGJlIHVzZWQgaW4gdGhlIHRoZXJtYWwgc3Vic3lzdGVtIHRvCj4gbm90IGR1cGxpY2F0 ZSBjb2RlLiBUaGUgcG93ZXIgdGFibGUgbm93IGlzIHRha2VuIGZyb20gRU0gc3RydWN0dXJlIGFu ZAo+IHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFpbnRhaW4gY2FsY3VsYXRpb24gZm9yIGl0IGxvY2Fs bHkuIEluIGNhc2Ugd2hlbiB0aGUKPiBFTSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBh IHNpbXBsZSBpbnRlcmZhY2UgZm9yIGNvb2xpbmcgZGV2aWNlIGlzCj4gdXNlZC4KPiAKPiBbbGtw OiBSZXBvcnRlZCB0aGUgYnVpbGQgd2FybmluZ10KPiBSZXBvcnRlZC1ieToga2J1aWxkIHRlc3Qg cm9ib3QgPGxrcEBpbnRlbC5jb20+Cj4gUmV2aWV3ZWQtYnk6IFN0ZXZlbiBSb3N0ZWR0IChWTXdh cmUpIDxyb3N0ZWR0QGdvb2RtaXMub3JnPiAjIGZvciB0cmFjaW5nIGNvZGUKPiBTaWduZWQtb2Zm LWJ5OiBMdWthc3ogTHViYSA8bHVrYXN6Lmx1YmFAYXJtLmNvbT4KCklzIGl0IHBvc3NpYmxlIHRv IHNwbGl0IHRoaXMgcGF0Y2ggaW50byBzbWFsbGVyIHBhcnRzPyBJdCBpcyBoYXJkIHRvIHVuZGVy c3RhbmQKd2hhdCBpcyByZWxhdGVkIHRvIHRoZSBlbSBjb252ZXJzaW9uIGFuZCBvdGhlciBjaGFu Z2VzIHdoaWNoIGxvb2sgbm90IHJlbGF0ZWQKc28gZmFyLgoKPiAtLS0KPiAgZHJpdmVycy90aGVy bWFsL2RldmZyZXFfY29vbGluZy5jIHwgNDc0ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0t LQo+ICBpbmNsdWRlL2xpbnV4L2RldmZyZXFfY29vbGluZy5oICAgfCAgMzkgKy0tCj4gIGluY2x1 ZGUvdHJhY2UvZXZlbnRzL3RoZXJtYWwuaCAgICB8ICAxOSArLQo+ICAzIGZpbGVzIGNoYW5nZWQs IDI3NyBpbnNlcnRpb25zKCspLCAyNTUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdGhlcm1hbC9kZXZmcmVxX2Nvb2xpbmcuYyBiL2RyaXZlcnMvdGhlcm1hbC9kZXZmcmVx X2Nvb2xpbmcuYwo+IGluZGV4IGY3ZjMyZTk4MzMxYi4uMzJkZjVmNTViZGU4IDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvdGhlcm1hbC9kZXZmcmVxX2Nvb2xpbmcuYwo+ICsrKyBiL2RyaXZlcnMvdGhl cm1hbC9kZXZmcmVxX2Nvb2xpbmcuYwo+IEBAIC0xLDE3ICsxLDkgQEAKPiArLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiAgLyoKPiAgICogZGV2ZnJlcV9jb29saW5nOiBUaGVy bWFsIGNvb2xpbmcgZGV2aWNlIGltcGxlbWVudGF0aW9uIGZvciBkZXZpY2VzIHVzaW5nCj4gICAq ICAgICAgICAgICAgICAgICAgZGV2ZnJlcQo+ICAgKgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMTQt MjAxNSBBUk0gTGltaXRlZAo+IC0gKgo+IC0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+IC0gKiBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwo+ IC0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPiAtICoKPiAt ICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFO VFkgb2YgYW55Cj4gLSAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKPiAtICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+IC0gKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MTQtMjAyMCBBUk0gTGltaXRlZAo+ICAgKgo+ICAgKiBUT0RPOgo+ICAgKiAgICAtIElmIE9QUHMg YXJlIGFkZGVkIG9yIHJlbW92ZWQgYWZ0ZXIgZGV2ZnJlcSBjb29saW5nIGhhcwo+IEBAIC00MSwz NiArMzMsMzMgQEAgc3RhdGljIERFRklORV9JREEoZGV2ZnJlcV9pZGEpOwo+ICAgKiBAY2RldjoJ UG9pbnRlciB0byBhc3NvY2lhdGVkIHRoZXJtYWwgY29vbGluZyBkZXZpY2UuCj4gICAqIEBkZXZm cmVxOglQb2ludGVyIHRvIGFzc29jaWF0ZWQgZGV2ZnJlcSBkZXZpY2UuCj4gICAqIEBjb29saW5n X3N0YXRlOglDdXJyZW50IGNvb2xpbmcgc3RhdGUuCj4gLSAqIEBwb3dlcl90YWJsZToJUG9pbnRl ciB0byB0YWJsZSB3aXRoIG1heGltdW0gcG93ZXIgZHJhdyBmb3IgZWFjaAo+IC0gKgkJCWNvb2xp bmcgc3RhdGUuIFN0YXRlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZSwgYW5kCj4gLSAqCQkJ dGhlIHBvd2VyIGlzIGluIG1XLgo+IC0gKiBAZnJlcV90YWJsZToJUG9pbnRlciB0byBhIHRhYmxl IHdpdGggdGhlIGZyZXF1ZW5jaWVzIHNvcnRlZCBpbiBkZXNjZW5kaW5nCj4gLSAqCQlvcmRlci4g IFlvdSBjYW4gaW5kZXggdGhlIHRhYmxlIGJ5IGNvb2xpbmcgZGV2aWNlIHN0YXRlCj4gLSAqIEBm cmVxX3RhYmxlX3NpemU6CVNpemUgb2YgdGhlIEBmcmVxX3RhYmxlIGFuZCBAcG93ZXJfdGFibGUK PiAtICogQHBvd2VyX29wczoJUG9pbnRlciB0byBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIsIHVzZWQg dG8gZ2VuZXJhdGUgdGhlCj4gLSAqCQlAcG93ZXJfdGFibGUuCj4gKyAqIEBmcmVxX3RhYmxlOiAg ICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIGZyZXF1ZW5jaWVzLgo+ICsgKiBAbWF4 X3N0YXRlOglJdCBpcyB0aGUgbGFzdCBpbmRleCwgdGhhdCBpcywgb25lIGxlc3MgdGhhbiB0aGUg bnVtYmVyIG9mIHRoZQo+ICsgKgkJT1BQcwo+ICsgKiBAcG93ZXJfb3BzOglQb2ludGVyIHRvIGRl dmZyZXFfY29vbGluZ19wb3dlciwgYSBtb3JlIHByZWNpc2VkIG1vZGVsLgo+ICAgKiBAcmVzX3V0 aWw6CVJlc291cmNlIHV0aWxpemF0aW9uIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgcG93ZXIuCj4g ICAqCQlJdCBpcyBtdWx0aXBsaWVkIGJ5IDEwMCB0byBtaW5pbWl6ZSB0aGUgZXJyb3IuIEl0IGlz IHVzZWQKPiAgICoJCWZvciBlc3RpbWF0aW9uIG9mIHRoZSBwb3dlciBidWRnZXQgaW5zdGVhZCBv ZiB1c2luZwo+IC0gKgkJJ3V0aWxpemF0aW9uJyAod2hpY2ggaXMJJ2J1c3lfdGltZSAvICd0b3Rh bF90aW1lJykuCj4gLSAqCQlUaGUgJ3Jlc191dGlsJyByYW5nZSBpcyBmcm9tIDEwMCB0byAocG93 ZXJfdGFibGVbc3RhdGVdICogMTAwKQo+IC0gKgkJZm9yIHRoZSBjb3JyZXNwb25kaW5nICdzdGF0 ZScuCj4gLSAqIEBjYXBwZWRfc3RhdGU6CWluZGV4IHRvIGNvb2xpbmcgc3RhdGUgd2l0aCBpbiBk eW5hbWljIHBvd2VyIGJ1ZGdldAo+ICsgKgkJJ3V0aWxpemF0aW9uJyAod2hpY2ggaXMJJ2J1c3lf dGltZScgLyAndG90YWxfdGltZScpLgo+ICsgKgkJVGhlICdyZXNfdXRpbCcgcmFuZ2UgaXMgZnJv bSAxMDAgdG8gcG93ZXIgKiAxMDAJZm9yIHRoZQo+ICsgKgkJY29ycmVzcG9uZGluZyAnc3RhdGUn Lgo+ICAgKiBAcmVxX21heF9mcmVxOglQTSBRb1MgcmVxdWVzdCBmb3IgbGltaXRpbmcgdGhlIG1h eGltdW0gZnJlcXVlbmN5Cj4gICAqCQkJb2YgdGhlIGRldmZyZXEgZGV2aWNlLgo+ICsgKiBAZW06 CQlFbmVyZ3kgTW9kZWwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYXNzb2NpYXRlZCBEZXZmcmVxIGRl dmljZQo+ICsgKiBAZW1fcmVnaXN0ZXJlZDoJRGV2ZnJlcSBjb29saW5nIHJlZ2lzdGVyZWQgdGhl IEVNIGFuZCBzaG91bGQgZnJlZSBpdC4KPiAgICovCj4gIHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdf ZGV2aWNlIHsKPiAgCWludCBpZDsKPiAgCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpj ZGV2Owo+ICAJc3RydWN0IGRldmZyZXEgKmRldmZyZXE7Cj4gIAl1bnNpZ25lZCBsb25nIGNvb2xp bmdfc3RhdGU7Cj4gLQl1MzIgKnBvd2VyX3RhYmxlOwo+ICAJdTMyICpmcmVxX3RhYmxlOwo+IC0J c2l6ZV90IGZyZXFfdGFibGVfc2l6ZTsKPiArCXNpemVfdCBtYXhfc3RhdGU7Cj4gIAlzdHJ1Y3Qg ZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpwb3dlcl9vcHM7Cj4gIAl1MzIgcmVzX3V0aWw7Cj4gLQlp bnQgY2FwcGVkX3N0YXRlOwo+ICAJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCByZXFfbWF4X2Zy ZXE7Cj4gKwlzdHJ1Y3QgZW1fcGVyZl9kb21haW4gKmVtOwo+ICsJYm9vbCBlbV9yZWdpc3RlcmVk Owo+ICB9Owo+ICAKPiAgc3RhdGljIGludCBkZXZmcmVxX2Nvb2xpbmdfZ2V0X21heF9zdGF0ZShz dHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiBAQCAtNzgsNyArNjcsNyBAQCBz dGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19nZXRfbWF4X3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpjZGV2LAo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2Rldmlj ZSAqZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiAgCj4gLQkqc3RhdGUgPSBkZmMtPmZyZXFfdGFibGVf c2l6ZSAtIDE7Cj4gKwkqc3RhdGUgPSBkZmMtPm1heF9zdGF0ZTsKPiAgCj4gIAlyZXR1cm4gMDsK PiAgfQo+IEBAIC0xMDYsMTAgKzk1LDE2IEBAIHN0YXRpYyBpbnQgZGV2ZnJlcV9jb29saW5nX3Nl dF9jdXJfc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4gIAo+ICAJ ZGV2X2RiZyhkZXYsICJTZXR0aW5nIGNvb2xpbmcgc3RhdGUgJWx1XG4iLCBzdGF0ZSk7Cj4gIAo+ IC0JaWYgKHN0YXRlID49IGRmYy0+ZnJlcV90YWJsZV9zaXplKQo+ICsJaWYgKHN0YXRlID4gZGZj LT5tYXhfc3RhdGUpCj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAo+IC0JZnJlcSA9IGRmYy0+ZnJl cV90YWJsZVtzdGF0ZV07Cj4gKwlpZiAoZGZjLT5lbSkgewo+ICsJCS8qIEVuZXJneSBNb2RlbCBm cmVxdWVuY2llcyBhcmUgaW4ga0h6ICovCj4gKwkJZnJlcSA9IGRmYy0+ZW0tPnRhYmxlW2RmYy0+ bWF4X3N0YXRlIC0gc3RhdGVdLmZyZXF1ZW5jeTsKPiArCQlmcmVxICo9IDEwMDA7Cj4gKwl9IGVs c2Ugewo+ICsJCWZyZXEgPSBkZmMtPmZyZXFfdGFibGVbc3RhdGVdOwo+ICsJfQo+ICAKPiAgCWRl dl9wbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRmYy0+cmVxX21heF9mcmVxLAo+ICAJCQkJICBESVZf Uk9VTkRfVVAoZnJlcSwgSFpfUEVSX0tIWikpOwo+IEBAIC0xMjAsMTEgKzExNSwxMSBAQCBzdGF0 aWMgaW50IGRldmZyZXFfY29vbGluZ19zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xp bmdfZGV2aWNlICpjZGV2LAo+ICB9Cj4gIAo+ICAvKioKPiAtICogZnJlcV9nZXRfc3RhdGUoKSAt IGdldCB0aGUgY29vbGluZyBzdGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgZnJlcXVlbmN5Cj4gKyAq IGZyZXFfZ2V0X3N0YXRlKCkgLSBnZXQgdGhlIHBlcmZvcm1hbmNlIGluZGV4IGNvcnJlc3BvbmRp bmcgdG8gYSBmcmVxdWVuY3kKPiAgICogQGRmYzoJUG9pbnRlciB0byBkZXZmcmVxIGNvb2xpbmcg ZGV2aWNlCj4gLSAqIEBmcmVxOglmcmVxdWVuY3kgaW4gSHoKPiArICogQGZyZXE6CWZyZXF1ZW5j eSBpbiBrSHoKPiAgICoKPiAtICogUmV0dXJuOiB0aGUgY29vbGluZyBzdGF0ZSBhc3NvY2lhdGVk IHdpdGggdGhlIEBmcmVxLCBvcgo+ICsgKiBSZXR1cm46IHRoZSBwZXJmb3JtYW5jZSBpbmRleCBh c3NvY2lhdGVkIHdpdGggdGhlIEBmcmVxLCBvcgo+ICAgKiBUSEVSTUFMX0NTVEFURV9JTlZBTElE IGlmIGl0IHdhc24ndCBmb3VuZC4KPiAgICovCj4gIHN0YXRpYyB1bnNpZ25lZCBsb25nCj4gQEAg LTEzMiw4ICsxMjcsOCBAQCBmcmVxX2dldF9zdGF0ZShzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2Rl dmljZSAqZGZjLCB1bnNpZ25lZCBsb25nIGZyZXEpCj4gIHsKPiAgCWludCBpOwo+ICAKPiAtCWZv ciAoaSA9IDA7IGkgPCBkZmMtPmZyZXFfdGFibGVfc2l6ZTsgaSsrKSB7Cj4gLQkJaWYgKGRmYy0+ ZnJlcV90YWJsZVtpXSA9PSBmcmVxKQo+ICsJZm9yIChpID0gMDsgaSA8PSBkZmMtPm1heF9zdGF0 ZTsgaSsrKSB7Cj4gKwkJaWYgKGRmYy0+ZW0tPnRhYmxlW2ldLmZyZXF1ZW5jeSA9PSBmcmVxKQo+ ICAJCQlyZXR1cm4gaTsKPiAgCX0KPiAgCj4gQEAgLTE2OCwxMzIgKzE2Myw5MiBAQCBzdGF0aWMg dW5zaWduZWQgbG9uZyBnZXRfdm9sdGFnZShzdHJ1Y3QgZGV2ZnJlcSAqZGYsIHVuc2lnbmVkIGxv bmcgZnJlcSkKPiAgCXJldHVybiB2b2x0YWdlOwo+ICB9Cj4gIAo+IC0vKioKPiAtICogZ2V0X3N0 YXRpY19wb3dlcigpIC0gY2FsY3VsYXRlIHRoZSBzdGF0aWMgcG93ZXIKPiAtICogQGRmYzoJUG9p bnRlciB0byBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlCj4gLSAqIEBmcmVxOglGcmVxdWVuY3kgaW4g SHoKPiAtICoKPiAtICogQ2FsY3VsYXRlIHRoZSBzdGF0aWMgcG93ZXIgaW4gbWlsbGl3YXR0cyB1 c2luZyB0aGUgc3VwcGxpZWQKPiAtICogZ2V0X3N0YXRpY19wb3dlcigpLiAgVGhlIGN1cnJlbnQg dm9sdGFnZSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZQo+IC0gKiBPUFAgbGlicmFyeS4gIElmIG5v IGdldF9zdGF0aWNfcG93ZXIoKSB3YXMgc3VwcGxpZWQsIGFzc3VtZSB0aGUKPiAtICogc3RhdGlj IHBvd2VyIGlzIG5lZ2xpZ2libGUuCj4gLSAqLwo+IC1zdGF0aWMgdW5zaWduZWQgbG9uZwo+IC1n ZXRfc3RhdGljX3Bvd2VyKHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMsIHVuc2ln bmVkIGxvbmcgZnJlcSkKPiArc3RhdGljIHZvaWQgZGZjX2VtX2dldF9yZXF1ZXN0ZWRfcG93ZXIo c3RydWN0IGVtX3BlcmZfZG9tYWluICplbSwKPiArCQkJCSAgICAgICBzdHJ1Y3QgZGV2ZnJlcV9k ZXZfc3RhdHVzICpzdGF0dXMsCj4gKwkJCQkgICAgICAgdTMyICpwb3dlciwgaW50IGVtX3BlcmZf aWR4KQo+ICB7Cj4gLQlzdHJ1Y3QgZGV2ZnJlcSAqZGYgPSBkZmMtPmRldmZyZXE7Cj4gLQl1bnNp Z25lZCBsb25nIHZvbHRhZ2U7Cj4gKwkqcG93ZXIgPSBlbS0+dGFibGVbZW1fcGVyZl9pZHhdLnBv d2VyOwo+ICAKPiAtCWlmICghZGZjLT5wb3dlcl9vcHMtPmdldF9zdGF0aWNfcG93ZXIpCj4gLQkJ cmV0dXJuIDA7Cj4gLQo+IC0Jdm9sdGFnZSA9IGdldF92b2x0YWdlKGRmLCBmcmVxKTsKPiAtCj4g LQlpZiAodm9sdGFnZSA9PSAwKQo+IC0JCXJldHVybiAwOwo+IC0KPiAtCXJldHVybiBkZmMtPnBv d2VyX29wcy0+Z2V0X3N0YXRpY19wb3dlcihkZiwgdm9sdGFnZSk7Cj4gKwkvKiBTY2FsZSBwb3dl ciBmb3IgdXRpbGl6YXRpb24gKi8KPiArCSpwb3dlciAqPSBzdGF0dXMtPmJ1c3lfdGltZTsKPiAr CSpwb3dlciAvPSBzdGF0dXMtPnRvdGFsX3RpbWU7Cj4gIH0KPiAgCj4gLS8qKgo+IC0gKiBnZXRf ZHluYW1pY19wb3dlciAtIGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBwb3dlcgo+IC0gKiBAZGZjOglQ b2ludGVyIHRvIGRldmZyZXEgY29vbGluZyBkZXZpY2UKPiAtICogQGZyZXE6CUZyZXF1ZW5jeSBp biBIego+IC0gKiBAdm9sdGFnZToJVm9sdGFnZSBpbiBtaWxsaXZvbHRzCj4gLSAqCj4gLSAqIENh bGN1bGF0ZSB0aGUgZHluYW1pYyBwb3dlciBpbiBtaWxsaXdhdHRzIGNvbnN1bWVkIGJ5IHRoZSBk ZXZpY2UgYXQKPiAtICogZnJlcXVlbmN5IEBmcmVxIGFuZCB2b2x0YWdlIEB2b2x0YWdlLiAgSWYg dGhlIGdldF9keW5hbWljX3Bvd2VyKCkKPiAtICogd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhl IGRldmZyZXFfY29vbGluZ19wb3dlciBzdHJ1Y3QsIHRoZW4gdGhhdAo+IC0gKiBmdW5jdGlvbiBp cyB1c2VkLiAgT3RoZXJ3aXNlLCBhIHNpbXBsZSBwb3dlciBtb2RlbCAoUGR5biA9IENvZWZmICoK PiAtICogVm9sdGFnZV4yICogRnJlcXVlbmN5KSBpcyB1c2VkLgo+IC0gKi8KPiAtc3RhdGljIHVu c2lnbmVkIGxvbmcKPiAtZ2V0X2R5bmFtaWNfcG93ZXIoc3RydWN0IGRldmZyZXFfY29vbGluZ19k ZXZpY2UgKmRmYywgdW5zaWduZWQgbG9uZyBmcmVxLAo+IC0JCSAgdW5zaWduZWQgbG9uZyB2b2x0 YWdlKQo+ICtzdGF0aWMgdm9pZCBfbm9ybWFsaXplX2xvYWQoc3RydWN0IGRldmZyZXFfZGV2X3N0 YXR1cyAqc3RhdHVzKQo+ICB7Cj4gLQl1NjQgcG93ZXI7Cj4gLQl1MzIgZnJlcV9taHo7Cj4gLQlz dHJ1Y3QgZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpkZmNfcG93ZXIgPSBkZmMtPnBvd2VyX29wczsK PiAtCj4gLQlpZiAoZGZjX3Bvd2VyLT5nZXRfZHluYW1pY19wb3dlcikKPiAtCQlyZXR1cm4gZGZj X3Bvd2VyLT5nZXRfZHluYW1pY19wb3dlcihkZmMtPmRldmZyZXEsIGZyZXEsCj4gLQkJCQkJCSAg ICB2b2x0YWdlKTsKPiAtCj4gLQlmcmVxX21oeiA9IGZyZXEgLyAxMDAwMDAwOwo+IC0JcG93ZXIg PSAodTY0KWRmY19wb3dlci0+ZHluX3Bvd2VyX2NvZWZmICogZnJlcV9taHogKiB2b2x0YWdlICog dm9sdGFnZTsKPiAtCWRvX2Rpdihwb3dlciwgMTAwMDAwMDAwMCk7Cj4gKwkvKiBNYWtlIHNvbWUg c3BhY2UgaWYgbmVlZGVkICovCj4gKwlpZiAoc3RhdHVzLT5idXN5X3RpbWUgPiAweGZmZmYpIHsK PiArCQlzdGF0dXMtPmJ1c3lfdGltZSA+Pj0gMTA7Cj4gKwkJc3RhdHVzLT50b3RhbF90aW1lID4+ PSAxMDsKPiArCX0KPiAgCj4gLQlyZXR1cm4gcG93ZXI7Cj4gLX0KPiArCWlmIChzdGF0dXMtPmJ1 c3lfdGltZSA+IHN0YXR1cy0+dG90YWxfdGltZSkKPiArCQlzdGF0dXMtPmJ1c3lfdGltZSA9IHN0 YXR1cy0+dG90YWxfdGltZTsKPiAgCj4gKwlzdGF0dXMtPmJ1c3lfdGltZSAqPSAxMDA7Cj4gKwlz dGF0dXMtPmJ1c3lfdGltZSAvPSBzdGF0dXMtPnRvdGFsX3RpbWUgPyA6IDE7Cj4gIAo+IC1zdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3RvdGFsX3Bvd2VyKHN0cnVjdCBkZXZmcmVxX2Nv b2xpbmdfZGV2aWNlICpkZmMsCj4gLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZnJlcSwKPiAtCQkJ CQkgICAgdW5zaWduZWQgbG9uZyB2b2x0YWdlKQo+IC17Cj4gLQlyZXR1cm4gZ2V0X3N0YXRpY19w b3dlcihkZmMsIGZyZXEpICsgZ2V0X2R5bmFtaWNfcG93ZXIoZGZjLCBmcmVxLAo+IC0JCQkJCQkJ ICAgICAgIHZvbHRhZ2UpOwo+ICsJLyogQXZvaWQgZGl2aXNpb24gYnkgMCAqLwo+ICsJc3RhdHVz LT5idXN5X3RpbWUgPSBzdGF0dXMtPmJ1c3lfdGltZSA/IDogMTsKPiArCXN0YXR1cy0+dG90YWxf dGltZSA9IDEwMDsKPiAgfQo+ICAKPiAtCj4gIHN0YXRpYyBpbnQgZGV2ZnJlcV9jb29saW5nX2dl dF9yZXF1ZXN0ZWRfcG93ZXIoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsCj4g IAkJCQkJICAgICAgIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKPiAgCQkJCQkgICAg ICAgdTMyICpwb3dlcikKPiAgewo+ICAJc3RydWN0IGRldmZyZXFfY29vbGluZ19kZXZpY2UgKmRm YyA9IGNkZXYtPmRldmRhdGE7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcSAqZGYgPSBkZmMtPmRldmZyZXE7 Cj4gLQlzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzICpzdGF0dXMgPSAmZGYtPmxhc3Rfc3RhdHVz Owo+IC0JdW5zaWduZWQgbG9uZyBzdGF0ZTsKPiAtCXVuc2lnbmVkIGxvbmcgZnJlcSA9IHN0YXR1 cy0+Y3VycmVudF9mcmVxdWVuY3k7Cj4gLQl1bnNpZ25lZCBsb25nIHZvbHRhZ2U7Cj4gLQl1MzIg ZHluX3Bvd2VyID0gMDsKPiAtCXUzMiBzdGF0aWNfcG93ZXIgPSAwOwo+ICsJc3RydWN0IGRldmZy ZXFfZGV2X3N0YXR1cyBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nIHZvbHRhZ2UsIGZyZXE7Cj4g Kwl1bnNpZ25lZCBsb25nIGVtX3BlcmZfaWR4Owo+ICAJaW50IHJlczsKPiAgCj4gLQlzdGF0ZSA9 IGZyZXFfZ2V0X3N0YXRlKGRmYywgZnJlcSk7Cj4gLQlpZiAoc3RhdGUgPT0gVEhFUk1BTF9DU1RB VEVfSU5WQUxJRCkgewo+IC0JCXJlcyA9IC1FQUdBSU47Cj4gLQkJZ290byBmYWlsOwo+IC0JfQo+ ICsJbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ICsJcmVzID0gZGYtPnByb2ZpbGUtPmdldF9kZXZf c3RhdHVzKGRmLT5kZXYucGFyZW50LCAmc3RhdHVzKTsKPiArCW11dGV4X3VubG9jaygmZGYtPmxv Y2spOwo+ICsJaWYgKHJlcykKPiArCQlyZXR1cm4gcmVzOwo+ICAKPiAtCWlmIChkZmMtPnBvd2Vy X29wcy0+Z2V0X3JlYWxfcG93ZXIpIHsKPiArCWZyZXEgPSBzdGF0dXMuY3VycmVudF9mcmVxdWVu Y3k7Cj4gKwo+ICsJLyogRW5lcmd5IE1vZGVsIGZyZXF1ZW5jaWVzIGFyZSBpbiBrSHogKi8KPiAr CWVtX3BlcmZfaWR4ID0gZnJlcV9nZXRfc3RhdGUoZGZjLCBmcmVxIC8gMTAwMCk7Cj4gKwlpZiAo ZW1fcGVyZl9pZHggPT0gVEhFUk1BTF9DU1RBVEVfSU5WQUxJRCkKPiArCQlyZXR1cm4gLUVBR0FJ TjsKPiArCj4gKwkvKgo+ICsJICogSWYgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgY29vbGluZyBkZXZp Y2UgbW9kZWwgd2FzIG5vdCBwcm92aWRlZCBieSB0aGUKPiArCSAqIGRyaXZlciwgdXNlIHNpbXBs ZSBFbmVyZ3kgTW9kZWwgcG93ZXIgY2FsY3VsYXRpb24uCj4gKwkgKi8KPiArCWlmICghZGZjLT5w b3dlcl9vcHMgfHwgIWRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcikgewo+ICsJCV9ub3Jt YWxpemVfbG9hZCgmc3RhdHVzKTsKPiArCQlkZmNfZW1fZ2V0X3JlcXVlc3RlZF9wb3dlcihkZmMt PmVtLCAmc3RhdHVzLCBwb3dlciwKPiArCQkJCQkgICBlbV9wZXJmX2lkeCk7Cj4gKwl9IGVsc2Ug ewo+ICAJCXZvbHRhZ2UgPSBnZXRfdm9sdGFnZShkZiwgZnJlcSk7Cj4gIAkJaWYgKHZvbHRhZ2Ug PT0gMCkgewo+IC0JCQlyZXMgPSAtRUlOVkFMOwo+IC0JCQlnb3RvIGZhaWw7Cj4gKwkJCWRmYy0+ cmVzX3V0aWwgPSBTQ0FMRV9FUlJPUl9NSVRJR0FUSU9OOwo+ICsJCQlyZXR1cm4gLUVJTlZBTDsK PiAgCQl9Cj4gIAo+ICAJCXJlcyA9IGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcihkZiwg cG93ZXIsIGZyZXEsIHZvbHRhZ2UpOwo+ICAJCWlmICghcmVzKSB7Cj4gLQkJCXN0YXRlID0gZGZj LT5jYXBwZWRfc3RhdGU7Cj4gLQkJCWRmYy0+cmVzX3V0aWwgPSBkZmMtPnBvd2VyX3RhYmxlW3N0 YXRlXTsKPiArCQkJZGZjLT5yZXNfdXRpbCA9IGRmYy0+ZW0tPnRhYmxlW2VtX3BlcmZfaWR4XS5w b3dlcjsKPiAgCQkJZGZjLT5yZXNfdXRpbCAqPSBTQ0FMRV9FUlJPUl9NSVRJR0FUSU9OOwo+ICAK PiAgCQkJaWYgKCpwb3dlciA+IDEpCj4gIAkJCQlkZmMtPnJlc191dGlsIC89ICpwb3dlcjsKPiAg CQl9IGVsc2Ugewo+IC0JCQlnb3RvIGZhaWw7Cj4gKwkJCS8qIEl0IGlzIHNhZmUgdG8gc2V0IG1h eCBpbiB0aGlzIGNhc2UgKi8KPiArCQkJZGZjLT5yZXNfdXRpbCA9IFNDQUxFX0VSUk9SX01JVElH QVRJT047Cj4gKwkJCXJldHVybiByZXM7Cj4gIAkJfQo+IC0JfSBlbHNlIHsKPiAtCQlkeW5fcG93 ZXIgPSBkZmMtPnBvd2VyX3RhYmxlW3N0YXRlXTsKPiAtCj4gLQkJLyogU2NhbGUgZHluYW1pYyBw b3dlciBmb3IgdXRpbGl6YXRpb24gKi8KPiAtCQlkeW5fcG93ZXIgKj0gc3RhdHVzLT5idXN5X3Rp bWU7Cj4gLQkJZHluX3Bvd2VyIC89IHN0YXR1cy0+dG90YWxfdGltZTsKPiAtCQkvKiBHZXQgc3Rh dGljIHBvd2VyICovCj4gLQkJc3RhdGljX3Bvd2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMsIGZy ZXEpOwo+IC0KPiAtCQkqcG93ZXIgPSBkeW5fcG93ZXIgKyBzdGF0aWNfcG93ZXI7Cj4gIAl9Cj4g IAo+IC0JdHJhY2VfdGhlcm1hbF9wb3dlcl9kZXZmcmVxX2dldF9wb3dlcihjZGV2LCBzdGF0dXMs IGZyZXEsIGR5bl9wb3dlciwKPiAtCQkJCQkgICAgICBzdGF0aWNfcG93ZXIsICpwb3dlcik7Cj4g Kwl0cmFjZV90aGVybWFsX3Bvd2VyX2RldmZyZXFfZ2V0X3Bvd2VyKGNkZXYsICZzdGF0dXMsIGZy ZXEsICpwb3dlcik7Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gLWZhaWw6Cj4gLQkvKiBJdCBpcyBzYWZl IHRvIHNldCBtYXggaW4gdGhpcyBjYXNlICovCj4gLQlkZmMtPnJlc191dGlsID0gU0NBTEVfRVJS T1JfTUlUSUdBVElPTjsKPiAtCXJldHVybiByZXM7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgZGV2 ZnJlcV9jb29saW5nX3N0YXRlMnBvd2VyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpj ZGV2LAo+IEBAIC0zMDIsMTYgKzI1NywxNCBAQCBzdGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19z dGF0ZTJwb3dlcihzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiAgCQkJCSAg ICAgICB1MzIgKnBvd2VyKQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAq ZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiAtCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiAtCXUzMiBzdGF0 aWNfcG93ZXI7Cj4gKwlpbnQgaWR4Owo+ICAKPiAtCWlmIChzdGF0ZSA+PSBkZmMtPmZyZXFfdGFi bGVfc2l6ZSkKPiArCWlmIChzdGF0ZSA+IGRmYy0+bWF4X3N0YXRlKQo+ICAJCXJldHVybiAtRUlO VkFMOwo+ICAKPiAtCWZyZXEgPSBkZmMtPmZyZXFfdGFibGVbc3RhdGVdOwo+IC0Jc3RhdGljX3Bv d2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMsIGZyZXEpOwo+ICsJaWR4ID0gZGZjLT5tYXhfc3Rh dGUgLSBzdGF0ZTsKPiArCSpwb3dlciA9IGRmYy0+ZW0tPnRhYmxlW2lkeF0ucG93ZXI7Cj4gIAo+ IC0JKnBvd2VyID0gZGZjLT5wb3dlcl90YWJsZVtzdGF0ZV0gKyBzdGF0aWNfcG93ZXI7Cj4gIAly ZXR1cm4gMDsKPiAgfQo+ICAKPiBAQCAtMzIxLDM5ICsyNzQsNDEgQEAgc3RhdGljIGludCBkZXZm cmVxX2Nvb2xpbmdfcG93ZXIyc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNk ZXYsCj4gIHsKPiAgCXN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMgPSBjZGV2LT5k ZXZkYXRhOwo+ICAJc3RydWN0IGRldmZyZXEgKmRmID0gZGZjLT5kZXZmcmVxOwo+IC0Jc3RydWN0 IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdHVzID0gJmRmLT5sYXN0X3N0YXR1czsKPiAtCXVuc2ln bmVkIGxvbmcgZnJlcSA9IHN0YXR1cy0+Y3VycmVudF9mcmVxdWVuY3k7Cj4gLQl1bnNpZ25lZCBs b25nIGJ1c3lfdGltZTsKPiAtCXMzMiBkeW5fcG93ZXI7Cj4gLQl1MzIgc3RhdGljX3Bvd2VyOwo+ IC0JczMyIGVzdF9wb3dlcjsKPiArCXN0cnVjdCBkZXZmcmVxX2Rldl9zdGF0dXMgc3RhdHVzOwo+ ICsJdTMyIGVzdF9wb3dlciA9IHBvd2VyOwo+ICsJdW5zaWduZWQgbG9uZyBmcmVxOwo+ICAJaW50 IGk7Cj4gIAo+IC0JaWYgKGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVhbF9wb3dlcikgewo+IC0JCS8q IFNjYWxlIGZvciByZXNvdXJjZSB1dGlsaXphdGlvbiAqLwo+IC0JCWVzdF9wb3dlciA9IHBvd2Vy ICogZGZjLT5yZXNfdXRpbDsKPiAtCQllc3RfcG93ZXIgLz0gU0NBTEVfRVJST1JfTUlUSUdBVElP TjsKPiAtCX0gZWxzZSB7Cj4gLQkJc3RhdGljX3Bvd2VyID0gZ2V0X3N0YXRpY19wb3dlcihkZmMs IGZyZXEpOwo+ICsJbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ICsJc3RhdHVzID0gZGYtPmxhc3Rf c3RhdHVzOwo+ICsJbXV0ZXhfdW5sb2NrKCZkZi0+bG9jayk7Cj4gIAo+IC0JCWR5bl9wb3dlciA9 IHBvd2VyIC0gc3RhdGljX3Bvd2VyOwo+IC0JCWR5bl9wb3dlciA9IGR5bl9wb3dlciA+IDAgPyBk eW5fcG93ZXIgOiAwOwo+ICsJZnJlcSA9IHN0YXR1cy5jdXJyZW50X2ZyZXF1ZW5jeTsKPiAgCj4g LQkJLyogU2NhbGUgZHluYW1pYyBwb3dlciBmb3IgdXRpbGl6YXRpb24gKi8KPiAtCQlidXN5X3Rp bWUgPSBzdGF0dXMtPmJ1c3lfdGltZSA/OiAxOwo+IC0JCWVzdF9wb3dlciA9IChkeW5fcG93ZXIg KiBzdGF0dXMtPnRvdGFsX3RpbWUpIC8gYnVzeV90aW1lOwo+ICsJLyoKPiArCSAqIFNjYWxlIGZv ciByZXNvdXJjZSB1dGlsaXphdGlvbi4gVXNlIHNpbXBsZSBFbmVyZ3kgTW9kZWwgcG93ZXIKPiAr CSAqIGNhbGN1bGF0aW9uIGlmIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGNvb2xpbmcgZGV2aWNlIG1v ZGVsIGRvZXMKPiArCSAqIG5vdCBleGlzdC4KPiArCSAqLwo+ICsJaWYgKCFkZmMtPnBvd2VyX29w cyB8fCAhZGZjLT5wb3dlcl9vcHMtPmdldF9yZWFsX3Bvd2VyKSB7Cj4gKwkJX25vcm1hbGl6ZV9s b2FkKCZzdGF0dXMpOwo+ICsJCWVzdF9wb3dlciAqPSBzdGF0dXMudG90YWxfdGltZTsKPiArCQll c3RfcG93ZXIgLz0gc3RhdHVzLmJ1c3lfdGltZTsKPiArCX0gZWxzZSB7Cj4gKwkJZXN0X3Bvd2Vy ICo9IGRmYy0+cmVzX3V0aWw7Cj4gKwkJZXN0X3Bvd2VyIC89IFNDQUxFX0VSUk9SX01JVElHQVRJ T047Cj4gIAl9Cj4gIAo+ICAJLyoKPiAgCSAqIEZpbmQgdGhlIGZpcnN0IGNvb2xpbmcgc3RhdGUg dGhhdCBpcyB3aXRoaW4gdGhlIHBvd2VyCj4gLQkgKiBidWRnZXQgZm9yIGR5bmFtaWMgcG93ZXIu Cj4gKwkgKiBidWRnZXQuIFRoZSBFTSBwb3dlciB0YWJsZSBpcyBzb3J0ZWQgYXNjZW5kaW5nLgo+ ICAJICovCj4gLQlmb3IgKGkgPSAwOyBpIDwgZGZjLT5mcmVxX3RhYmxlX3NpemUgLSAxOyBpKysp Cj4gLQkJaWYgKGVzdF9wb3dlciA+PSBkZmMtPnBvd2VyX3RhYmxlW2ldKQo+ICsJZm9yIChpID0g ZGZjLT5tYXhfc3RhdGU7IGkgPiAwOyBpLS0pCj4gKwkJaWYgKGVzdF9wb3dlciA+PSBkZmMtPmVt LT50YWJsZVtpXS5wb3dlcikKPiAgCQkJYnJlYWs7Cj4gIAo+IC0JKnN0YXRlID0gaTsKPiAtCWRm Yy0+Y2FwcGVkX3N0YXRlID0gaTsKPiArCSpzdGF0ZSA9IGRmYy0+bWF4X3N0YXRlIC0gaTsKPiAr Cj4gIAl0cmFjZV90aGVybWFsX3Bvd2VyX2RldmZyZXFfbGltaXQoY2RldiwgZnJlcSwgKnN0YXRl LCBwb3dlcik7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+IEBAIC0zNjUsOTEgKzMyMCw0MyBAQCBzdGF0 aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGRldmZyZXFfY29vbGluZ19vcHMg PSB7Cj4gIH07Cj4gIAo+ICAvKioKPiAtICogZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoKSAt IEdlbmVyYXRlIHBvd2VyIGFuZCBmcmVxIHRhYmxlcy4KPiAtICogQGRmYzogUG9pbnRlciB0byBk ZXZmcmVxIGNvb2xpbmcgZGV2aWNlLgo+IC0gKgo+IC0gKiBHZW5lcmF0ZSBwb3dlciBhbmQgZnJl cXVlbmN5IHRhYmxlczogdGhlIHBvd2VyIHRhYmxlIGhvbGQgdGhlCj4gLSAqIGRldmljZSdzIG1h eGltdW0gcG93ZXIgdXNhZ2UgYXQgZWFjaCBjb29saW5nIHN0YXRlIChPUFApLiAgVGhlCj4gLSAq IHN0YXRpYyBhbmQgZHluYW1pYyBwb3dlciB1c2luZyB0aGUgYXBwcm9wcmlhdGUgdm9sdGFnZSBh bmQKPiAtICogZnJlcXVlbmN5IGZvciB0aGUgc3RhdGUsIGlzIGFjcXVpcmVkIGZyb20gdGhlIHN0 cnVjdAo+IC0gKiBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIsIGFuZCBzdW1tZWQgdG8gbWFrZSB0aGUg bWF4aW11bSBwb3dlciBkcmF3Lgo+IC0gKgo+IC0gKiBUaGUgZnJlcXVlbmN5IHRhYmxlIGhvbGRz IHRoZSBmcmVxdWVuY2llcyBpbiBkZXNjZW5kaW5nIG9yZGVyLgo+IC0gKiBUaGF0IHdheSBpdHMg aW5kZXhlZCBieSBjb29saW5nIGRldmljZSBzdGF0ZS4KPiArICogZGV2ZnJlcV9jb29saW5nX2dl bl90YWJsZXMoKSAtIEdlbmVyYXRlIGZyZXF1ZW5jeSB0YWJsZS4KPiArICogQGRmYzoJUG9pbnRl ciB0byBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlLgo+ICsgKiBAbnVtX29wcHM6CU51bWJlciBvZiBP UFBzCj4gICAqCj4gLSAqIFRoZSB0YWJsZXMgYXJlIG1hbGxvY2VkLCBhbmQgcG9pbnRlcnMgcHV0 IGluIGRmYy4gIFRoZXkgbXVzdCBiZQo+IC0gKiBmcmVlZCB3aGVuIHVucmVnaXN0ZXJpbmcgdGhl IGRldmZyZXEgY29vbGluZyBkZXZpY2UuCj4gKyAqIEdlbmVyYXRlIGZyZXF1ZW5jeSB0YWJsZSB3 aGljaCBob2xkcyB0aGUgZnJlcXVlbmNpZXMgaW4gZGVzY2VuZGluZwo+ICsgKiBvcmRlci4gVGhh dCB3YXkgaXRzIGluZGV4ZWQgYnkgY29vbGluZyBkZXZpY2Ugc3RhdGUuIFRoaXMgaXMgZm9yCj4g KyAqIGNvbXBhdGliaWxpdHkgd2l0aCBkcml2ZXJzIHdoaWNoIGRvIG5vdCByZWdpc3RlciBFbmVy Z3kgTW9kZWwuCj4gICAqCj4gICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCj4gICAqLwo+IC1zdGF0aWMgaW50IGRldmZyZXFfY29vbGluZ19n ZW5fdGFibGVzKHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfZGV2aWNlICpkZmMpCj4gK3N0YXRpYyBp bnQgZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoc3RydWN0IGRldmZyZXFfY29vbGluZ19kZXZp Y2UgKmRmYywKPiArCQkJCSAgICAgIGludCBudW1fb3BwcykKPiAgewo+ICAJc3RydWN0IGRldmZy ZXEgKmRmID0gZGZjLT5kZXZmcmVxOwo+ICAJc3RydWN0IGRldmljZSAqZGV2ID0gZGYtPmRldi5w YXJlbnQ7Cj4gLQlpbnQgcmV0LCBudW1fb3BwczsKPiAgCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiAt CXUzMiAqcG93ZXJfdGFibGUgPSBOVUxMOwo+IC0JdTMyICpmcmVxX3RhYmxlOwo+ICAJaW50IGk7 Cj4gIAo+IC0JbnVtX29wcHMgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQoZGV2KTsKPiAtCj4g LQlpZiAoZGZjLT5wb3dlcl9vcHMpIHsKPiAtCQlwb3dlcl90YWJsZSA9IGtjYWxsb2MobnVtX29w cHMsIHNpemVvZigqcG93ZXJfdGFibGUpLAo+IC0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Cj4gLQkJ aWYgKCFwb3dlcl90YWJsZSkKPiAtCQkJcmV0dXJuIC1FTk9NRU07Cj4gLQl9Cj4gLQo+IC0JZnJl cV90YWJsZSA9IGtjYWxsb2MobnVtX29wcHMsIHNpemVvZigqZnJlcV90YWJsZSksCj4gKwlkZmMt PmZyZXFfdGFibGUgPSBrY2FsbG9jKG51bV9vcHBzLCBzaXplb2YoKmRmYy0+ZnJlcV90YWJsZSks Cj4gIAkJCSAgICAgR0ZQX0tFUk5FTCk7Cj4gLQlpZiAoIWZyZXFfdGFibGUpIHsKPiAtCQlyZXQg PSAtRU5PTUVNOwo+IC0JCWdvdG8gZnJlZV9wb3dlcl90YWJsZTsKPiAtCX0KPiArCWlmICghZGZj LT5mcmVxX3RhYmxlKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICAKPiAgCWZvciAoaSA9IDAsIGZy ZXEgPSBVTE9OR19NQVg7IGkgPCBudW1fb3BwczsgaSsrLCBmcmVxLS0pIHsKPiAtCQl1bnNpZ25l ZCBsb25nIHBvd2VyLCB2b2x0YWdlOwo+ICAJCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7Cj4gIAo+ ICAJCW9wcCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yKGRldiwgJmZyZXEpOwo+ICAJCWlm IChJU19FUlIob3BwKSkgewo+IC0JCQlyZXQgPSBQVFJfRVJSKG9wcCk7Cj4gLQkJCWdvdG8gZnJl ZV90YWJsZXM7Cj4gKwkJCWtmcmVlKGRmYy0+ZnJlcV90YWJsZSk7Cj4gKwkJCXJldHVybiBQVFJf RVJSKG9wcCk7Cj4gIAkJfQo+ICAKPiAtCQl2b2x0YWdlID0gZGV2X3BtX29wcF9nZXRfdm9sdGFn ZShvcHApIC8gMTAwMDsgLyogbVYgKi8KPiAgCQlkZXZfcG1fb3BwX3B1dChvcHApOwo+IC0KPiAt CQlpZiAoZGZjLT5wb3dlcl9vcHMpIHsKPiAtCQkJaWYgKGRmYy0+cG93ZXJfb3BzLT5nZXRfcmVh bF9wb3dlcikKPiAtCQkJCXBvd2VyID0gZ2V0X3RvdGFsX3Bvd2VyKGRmYywgZnJlcSwgdm9sdGFn ZSk7Cj4gLQkJCWVsc2UKPiAtCQkJCXBvd2VyID0gZ2V0X2R5bmFtaWNfcG93ZXIoZGZjLCBmcmVx LCB2b2x0YWdlKTsKPiAtCj4gLQkJCWRldl9kYmcoZGV2LCAiUG93ZXIgdGFibGU6ICVsdSBNSHog QCAlbHUgbVY6ICVsdSA9ICVsdSBtV1xuIiwKPiAtCQkJCWZyZXEgLyAxMDAwMDAwLCB2b2x0YWdl LCBwb3dlciwgcG93ZXIpOwo+IC0KPiAtCQkJcG93ZXJfdGFibGVbaV0gPSBwb3dlcjsKPiAtCQl9 Cj4gLQo+IC0JCWZyZXFfdGFibGVbaV0gPSBmcmVxOwo+ICsJCWRmYy0+ZnJlcV90YWJsZVtpXSA9 IGZyZXE7Cj4gIAl9Cj4gIAo+IC0JaWYgKGRmYy0+cG93ZXJfb3BzKQo+IC0JCWRmYy0+cG93ZXJf dGFibGUgPSBwb3dlcl90YWJsZTsKPiAtCj4gLQlkZmMtPmZyZXFfdGFibGUgPSBmcmVxX3RhYmxl Owo+IC0JZGZjLT5mcmVxX3RhYmxlX3NpemUgPSBudW1fb3BwczsKPiAtCj4gIAlyZXR1cm4gMDsK PiAtCj4gLWZyZWVfdGFibGVzOgo+IC0Ja2ZyZWUoZnJlcV90YWJsZSk7Cj4gLWZyZWVfcG93ZXJf dGFibGU6Cj4gLQlrZnJlZShwb3dlcl90YWJsZSk7Cj4gLQo+IC0JcmV0dXJuIHJldDsKPiAgfQo+ ICAKPiAgLyoqCj4gQEAgLTQ3NCw3ICszODEsNyBAQCBvZl9kZXZmcmVxX2Nvb2xpbmdfcmVnaXN0 ZXJfcG93ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGRldmZyZXEgKmRmLAo+ICAJ c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9j b29saW5nX2RldmljZSAqZGZjOwo+ICAJY2hhciBkZXZfbmFtZVtUSEVSTUFMX05BTUVfTEVOR1RI XTsKPiAtCWludCBlcnI7Cj4gKwlpbnQgZXJyLCBudW1fb3BwczsKPiAgCj4gIAlkZmMgPSBremFs bG9jKHNpemVvZigqZGZjKSwgR0ZQX0tFUk5FTCk7Cj4gIAlpZiAoIWRmYykKPiBAQCAtNDgyLDI4 ICszODksNDUgQEAgb2ZfZGV2ZnJlcV9jb29saW5nX3JlZ2lzdGVyX3Bvd2VyKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZmcmVxICpkZiwKPiAgCj4gIAlkZmMtPmRldmZyZXEgPSBk ZjsKPiAgCj4gLQlpZiAoZGZjX3Bvd2VyKSB7Cj4gLQkJZGZjLT5wb3dlcl9vcHMgPSBkZmNfcG93 ZXI7Cj4gLQo+ICsJZGZjLT5lbSA9IGVtX3BkX2dldChkZi0+ZGV2LnBhcmVudCk7Cj4gKwlpZiAo ZGZjLT5lbSkgewo+ICAJCWRldmZyZXFfY29vbGluZ19vcHMuZ2V0X3JlcXVlc3RlZF9wb3dlciA9 Cj4gIAkJCWRldmZyZXFfY29vbGluZ19nZXRfcmVxdWVzdGVkX3Bvd2VyOwo+ICAJCWRldmZyZXFf Y29vbGluZ19vcHMuc3RhdGUycG93ZXIgPSBkZXZmcmVxX2Nvb2xpbmdfc3RhdGUycG93ZXI7Cj4g IAkJZGV2ZnJlcV9jb29saW5nX29wcy5wb3dlcjJzdGF0ZSA9IGRldmZyZXFfY29vbGluZ19wb3dl cjJzdGF0ZTsKPiArCj4gKwkJZGZjLT5wb3dlcl9vcHMgPSBkZmNfcG93ZXI7Cj4gKwo+ICsJCW51 bV9vcHBzID0gZW1fcGRfbnJfcGVyZl9zdGF0ZXMoZGZjLT5lbSk7Cj4gKwl9IGVsc2Ugewo+ICsJ CS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGRyaXZlcnMgd2hpY2ggZG8gbm90IHVzZSBJ UEEgKi8KPiArCQlkZXZfZGJnKGRmLT5kZXYucGFyZW50LCAibWlzc2luZyBFTSBmb3IgY29vbGlu ZyBkZXZpY2VcbiIpOwo+ICsKPiArCQludW1fb3BwcyA9IGRldl9wbV9vcHBfZ2V0X29wcF9jb3Vu dChkZi0+ZGV2LnBhcmVudCk7Cj4gKwo+ICsJCWVyciA9IGRldmZyZXFfY29vbGluZ19nZW5fdGFi bGVzKGRmYywgbnVtX29wcHMpOwo+ICsJCWlmIChlcnIpCj4gKwkJCWdvdG8gZnJlZV9kZmM7Cj4g IAl9Cj4gIAo+IC0JZXJyID0gZGV2ZnJlcV9jb29saW5nX2dlbl90YWJsZXMoZGZjKTsKPiAtCWlm IChlcnIpCj4gKwlpZiAobnVtX29wcHMgPD0gMCkgewo+ICsJCWVyciA9IC1FSU5WQUw7Cj4gIAkJ Z290byBmcmVlX2RmYzsKPiArCX0KPiArCj4gKwkvKiBtYXhfc3RhdGUgaXMgYW4gaW5kZXgsIG5v dCBhIGNvdW50ZXIgKi8KPiArCWRmYy0+bWF4X3N0YXRlID0gbnVtX29wcHMgLSAxOwo+ICAKPiAg CWVyciA9IGRldl9wbV9xb3NfYWRkX3JlcXVlc3QoZGYtPmRldi5wYXJlbnQsICZkZmMtPnJlcV9t YXhfZnJlcSwKPiAgCQkJCSAgICAgREVWX1BNX1FPU19NQVhfRlJFUVVFTkNZLAo+ICAJCQkJICAg ICBQTV9RT1NfTUFYX0ZSRVFVRU5DWV9ERUZBVUxUX1ZBTFVFKTsKPiAgCWlmIChlcnIgPCAwKQo+ IC0JCWdvdG8gZnJlZV90YWJsZXM7Cj4gKwkJZ290byBmcmVlX3RhYmxlOwo+ICAKPiAgCWVyciA9 IGlkYV9zaW1wbGVfZ2V0KCZkZXZmcmVxX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7Cj4gIAlpZiAo ZXJyIDwgMCkKPiAgCQlnb3RvIHJlbW92ZV9xb3NfcmVxOwo+ICsKPiAgCWRmYy0+aWQgPSBlcnI7 Cj4gIAo+ICAJc25wcmludGYoZGV2X25hbWUsIHNpemVvZihkZXZfbmFtZSksICJ0aGVybWFsLWRl dmZyZXEtJWQiLCBkZmMtPmlkKTsKPiBAQCAtNTI0LDE2ICs0NDgsMTYgQEAgb2ZfZGV2ZnJlcV9j b29saW5nX3JlZ2lzdGVyX3Bvd2VyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZm cmVxICpkZiwKPiAgCj4gIHJlbGVhc2VfaWRhOgo+ICAJaWRhX3NpbXBsZV9yZW1vdmUoJmRldmZy ZXFfaWRhLCBkZmMtPmlkKTsKPiAtCj4gIHJlbW92ZV9xb3NfcmVxOgo+ICAJZGV2X3BtX3Fvc19y ZW1vdmVfcmVxdWVzdCgmZGZjLT5yZXFfbWF4X2ZyZXEpOwo+IC0KPiAtZnJlZV90YWJsZXM6Cj4g LQlrZnJlZShkZmMtPnBvd2VyX3RhYmxlKTsKPiArZnJlZV90YWJsZToKPiAgCWtmcmVlKGRmYy0+ ZnJlcV90YWJsZSk7Cj4gIGZyZWVfZGZjOgo+ICAJa2ZyZWUoZGZjKTsKPiAgCj4gKwlpZiAoZGZj LT5lbSkKPiArCQllbV9wZF9wdXQoZGYtPmRldi5wYXJlbnQpOwo+ICsKPiAgCXJldHVybiBFUlJf UFRSKGVycik7Cj4gIH0KPiAgRVhQT1JUX1NZTUJPTF9HUEwob2ZfZGV2ZnJlcV9jb29saW5nX3Jl Z2lzdGVyX3Bvd2VyKTsKPiBAQCAtNTYxLDI1ICs0ODUsMTE5IEBAIHN0cnVjdCB0aGVybWFsX2Nv b2xpbmdfZGV2aWNlICpkZXZmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRm KQo+ICB9Cj4gIEVYUE9SVF9TWU1CT0xfR1BMKGRldmZyZXFfY29vbGluZ19yZWdpc3Rlcik7Cj4g IAo+ICsvKioKPiArICogZGV2ZnJlcV9jb29saW5nX2VtX3JlZ2lzdGVyX3Bvd2VyKCkgLSBSZWdp c3RlciBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlIHdpdGgKPiArICoJCXBvd2VyIGluZm9ybWF0aW9u IGFuZCBhdHRlbXB0IHRvIHJlZ2lzdGVyIEVuZXJneSBNb2RlbCAoRU0pCj4gKyAqIEBkZjoJCVBv aW50ZXIgdG8gZGV2ZnJlcSBkZXZpY2UuCj4gKyAqIEBkZmNfcG93ZXI6CVBvaW50ZXIgdG8gZGV2 ZnJlcV9jb29saW5nX3Bvd2VyLgo+ICsgKiBAZW1fY2I6CUNhbGxiYWNrIGZ1bmN0aW9ucyBwcm92 aWRpbmcgdGhlIGRhdGEgb2YgdGhlIEVNCj4gKyAqCj4gKyAqIFJlZ2lzdGVyIGEgZGV2ZnJlcSBj b29saW5nIGRldmljZSBhbmQgYXR0ZW1wdCB0byByZWdpc3RlciBFbmVyZ3kgTW9kZWwuIFRoZQo+ ICsgKiBhdmFpbGFibGUgT1BQcyBtdXN0IGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBkZXZpY2UuCj4g KyAqCj4gKyAqIElmIEBkZmNfcG93ZXIgaXMgcHJvdmlkZWQsIHRoZSBjb29saW5nIGRldmljZSBp cyByZWdpc3RlcmVkIHdpdGggdGhlCj4gKyAqIHBvd2VyIGV4dGVuc2lvbnMuIElmIEBlbV9jYiBp cyBwcm92aWRlZCBpdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBPUFAgdG8KPiArICogY2FsY3Vs YXRlIHBvd2VyIHZhbHVlIGFuZCBjb3N0LiBJZiBAZW1fY2IgaXMgbm90IHByb3ZpZGVkIHRoZW4g c2ltcGxlIEVuZXJneQo+ICsgKiBNb2RlbCBpcyBnb2luZyB0byBiZSB1c2VkLCB3aGljaCByZXF1 aXJlcyAiZHluYW1pYy1wb3dlci1jb2VmZmljaWVudCIgYQo+ICsgKiBkZXZpY2V0cmVlIHByb3Bl cnR5Lgo+ICsgKi8KPiArc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVx X2Nvb2xpbmdfZW1fcmVnaXN0ZXJfcG93ZXIoc3RydWN0IGRldmZyZXEgKmRmLAo+ICsJCQkJICBz dHJ1Y3QgZGV2ZnJlcV9jb29saW5nX3Bvd2VyICpkZmNfcG93ZXIsCj4gKwkJCQkgIHN0cnVjdCBl bV9kYXRhX2NhbGxiYWNrICplbV9jYikKPiArewo+ICsJc3RydWN0IHRoZXJtYWxfY29vbGluZ19k ZXZpY2UgKmNkZXY7Cj4gKwlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAqZGZjOwo+ICsJ c3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4g KwlpbnQgbnJfb3BwLCByZXQ7Cj4gKwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGRmKSkKPiArCQly ZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPiArCj4gKwlkZXYgPSBkZi0+ZGV2LnBhcmVudDsKPiAr Cj4gKwlpZiAoZW1fY2IpIHsKPiArCQlucl9vcHAgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQo ZGV2KTsKPiArCQlpZiAobnJfb3BwIDw9IDApIHsKPiArCQkJZGV2X2VycihkZXYsICJObyB2YWxp ZCBPUFBzIGZvdW5kXG4iKTsKPiArCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gKwkJfQo+ ICsKPiArCQlyZXQgPSBlbV9kZXZfcmVnaXN0ZXJfcGVyZl9kb21haW4oZGV2LCBucl9vcHAsIGVt X2NiLCBOVUxMKTsKPiArCX0gZWxzZSB7Cj4gKwkJcmV0ID0gZGV2X3BtX29wcF9vZl9yZWdpc3Rl cl9lbShkZXYsIE5VTEwpOwo+ICsJfQo+ICsKPiArCWlmIChyZXQpCj4gKwkJZGV2X3dhcm4oZGV2 LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIEVNIGZvciBkZXZmcmVxIGNvb2xpbmcgZGV2aWNlICglZClc biIsCj4gKwkJCSByZXQpOwo+ICsKPiArCWlmIChkZXYtPm9mX25vZGUpCj4gKwkJbnAgPSBvZl9u b2RlX2dldChkZXYtPm9mX25vZGUpOwo+ICsKPiArCWNkZXYgPSBvZl9kZXZmcmVxX2Nvb2xpbmdf cmVnaXN0ZXJfcG93ZXIobnAsIGRmLCBkZmNfcG93ZXIpOwo+ICsKPiArCWlmIChucCkKPiArCQlv Zl9ub2RlX3B1dChucCk7Cj4gKwo+ICsJaWYgKElTX0VSUl9PUl9OVUxMKGNkZXYpKSB7Cj4gKwkJ aWYgKCFyZXQpCj4gKwkJCWVtX2Rldl91bnJlZ2lzdGVyX3BlcmZfZG9tYWluKGRldik7Cj4gKwl9 IGVsc2Ugewo+ICsJCWRmYyA9IGNkZXYtPmRldmRhdGE7Cj4gKwkJZGZjLT5lbV9yZWdpc3RlcmVk ID0gIXJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gY2RldjsKPiArfQo+ICtFWFBPUlRfU1lNQk9M X0dQTChkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXJfcG93ZXIpOwo+ICsKPiArLyoqCj4gKyAq IGRldmZyZXFfY29vbGluZ19lbV9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgZGV2ZnJlcSBjb29saW5n IGRldmljZSB0b2dldGhlcgo+ICsgKgkJCQl3aXRoIEVuZXJneSBNb2RlbC4KPiArICogQGRmOgkJ UG9pbnRlciB0byBkZXZmcmVxIGRldmljZS4KPiArICogQGVtX2NiOglDYWxsYmFjayBmdW5jdGlv bnMgcHJvdmlkaW5nIHRoZSBkYXRhIG9mIHRoZSBFbmVyZ3kgTW9kZWwKPiArICoKPiArICogVGhp cyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZWdpc3RlciBFbmVyZ3kgTW9kZWwgZm9yIGRldmZyZXEg ZGV2aWNlIGFuZCB0aGVuCj4gKyAqIHJlZ2lzdGVyIHRoZSBkZXZmcmVxIGNvb2xpbmcgZGV2aWNl Lgo+ICsgKi8KPiArc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nv b2xpbmdfZW1fcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRmLCBzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqZW1fY2IpCj4gK3sKPiArCXJldHVybiBkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXJf cG93ZXIoZGYsIE5VTEwsIGVtX2NiKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChkZXZmcmVx X2Nvb2xpbmdfZW1fcmVnaXN0ZXIpOwo+ICsKPiAgLyoqCj4gICAqIGRldmZyZXFfY29vbGluZ191 bnJlZ2lzdGVyKCkgLSBVbnJlZ2lzdGVyIGRldmZyZXEgY29vbGluZyBkZXZpY2UuCj4gICAqIEBj ZGV2OiBQb2ludGVyIHRvIGRldmZyZXEgY29vbGluZyBkZXZpY2UgdG8gdW5yZWdpc3Rlci4KPiAr ICoKPiArICogVW5yZWdpc3RlcnMgZGV2ZnJlcSBjb29saW5nIGRldmljZSBhbmQgcmVsYXRlZCBF bmVyZ3kgTW9kZWwgaWYgaXQgd2FzCj4gKyAqIHByZXNlbnQuCj4gICAqLwo+ICB2b2lkIGRldmZy ZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2 KQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2ZnJlcV9jb29saW5nX2RldmljZSAqZGZjOwo+ICsJc3RydWN0 IGRldmljZSAqZGV2Owo+ICAKPiAtCWlmICghY2RldikKPiArCWlmIChJU19FUlJfT1JfTlVMTChj ZGV2KSkKPiAgCQlyZXR1cm47Cj4gIAo+ICAJZGZjID0gY2Rldi0+ZGV2ZGF0YTsKPiArCWRldiA9 IGRmYy0+ZGV2ZnJlcS0+ZGV2LnBhcmVudDsKPiAgCj4gIAl0aGVybWFsX2Nvb2xpbmdfZGV2aWNl X3VucmVnaXN0ZXIoZGZjLT5jZGV2KTsKPiAgCWlkYV9zaW1wbGVfcmVtb3ZlKCZkZXZmcmVxX2lk YSwgZGZjLT5pZCk7Cj4gIAlkZXZfcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZkZmMtPnJlcV9tYXhf ZnJlcSk7Cj4gLQlrZnJlZShkZmMtPnBvd2VyX3RhYmxlKTsKPiAtCWtmcmVlKGRmYy0+ZnJlcV90 YWJsZSk7Cj4gKwllbV9wZF9wdXQoZGV2KTsKPiAgCj4gKwkvKiBDaGVjayBpZiBkZXZmcmVxIGNv b2xpbmcgcmVnaXN0ZXJlZCB0aGlzIEVNIGFuZCBtdXN0IGZyZWUgaXQuICovCj4gKwlpZiAoZGZj LT5lbV9yZWdpc3RlcmVkKQo+ICsJCWVtX2Rldl91bnJlZ2lzdGVyX3BlcmZfZG9tYWluKGRldik7 Cj4gKwo+ICsJa2ZyZWUoZGZjLT5mcmVxX3RhYmxlKTsKPiAgCWtmcmVlKGRmYyk7Cj4gKwo+ICB9 Cj4gIEVYUE9SVF9TWU1CT0xfR1BMKGRldmZyZXFfY29vbGluZ191bnJlZ2lzdGVyKTsKPiBkaWZm IC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZmcmVxX2Nvb2xpbmcuaCBiL2luY2x1ZGUvbGludXgv ZGV2ZnJlcV9jb29saW5nLmgKPiBpbmRleCA3OWE2ZTM3YTFkNmYuLjYxMzY3OGNlMjNkZiAxMDA2 NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2RldmZyZXFfY29vbGluZy5oCj4gKysrIGIvaW5jbHVk ZS9saW51eC9kZXZmcmVxX2Nvb2xpbmcuaAo+IEBAIC0xOCwyMiArMTgsMTIgQEAKPiAgI2RlZmlu ZSBfX0RFVkZSRVFfQ09PTElOR19IX18KPiAgCj4gICNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLmg+ Cj4gKyNpbmNsdWRlIDxsaW51eC9lbmVyZ3lfbW9kZWwuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L3Ro ZXJtYWwuaD4KPiAgCj4gIAo+ICAvKioKPiAgICogc3RydWN0IGRldmZyZXFfY29vbGluZ19wb3dl ciAtIERldmZyZXEgY29vbGluZyBwb3dlciBvcHMKPiAtICogQGdldF9zdGF0aWNfcG93ZXI6CVRh a2Ugdm9sdGFnZSwgaW4gbVYsIGFuZCByZXR1cm4gdGhlIHN0YXRpYyBwb3dlcgo+IC0gKgkJCWlu IG1XLiAgSWYgTlVMTCwgdGhlIHN0YXRpYyBwb3dlciBpcyBhc3N1bWVkCj4gLSAqCQkJdG8gYmUg MC4KPiAtICogQGdldF9keW5hbWljX3Bvd2VyOglUYWtlIHZvbHRhZ2UsIGluIG1WLCBhbmQgZnJl cXVlbmN5LCBpbiBIWiwgYW5kCj4gLSAqCQkJcmV0dXJuIHRoZSBkeW5hbWljIHBvd2VyIGRyYXcg aW4gbVcuICBJZiBOVUxMLAo+IC0gKgkJCWEgc2ltcGxlIHBvd2VyIG1vZGVsIGlzIHVzZWQuCj4g LSAqIEBkeW5fcG93ZXJfY29lZmY6CUNvZWZmaWNpZW50IGZvciB0aGUgc2ltcGxlIGR5bmFtaWMg cG93ZXIgbW9kZWwgaW4KPiAtICoJCQltVy8oTUh6IG1WIG1WKS4KPiAtICoJCQlJZiBnZXRfZHlu YW1pY19wb3dlcigpIGlzIE5VTEwsIHRoZW4gdGhlCj4gLSAqCQkJZHluYW1pYyBwb3dlciBpcyBj YWxjdWxhdGVkIGFzCj4gLSAqCQkJQGR5bl9wb3dlcl9jb2VmZiAqIGZyZXF1ZW5jeSAqIHZvbHRh Z2VeMgo+ICAgKiBAZ2V0X3JlYWxfcG93ZXI6CVdoZW4gdGhpcyBpcyBzZXQsIHRoZSBmcmFtZXdv cmsgdXNlcyBpdCB0byBhc2sgdGhlCj4gICAqCQkJZGV2aWNlIGRyaXZlciBmb3IgdGhlIGFjdHVh bCBwb3dlci4KPiAgICoJCQlTb21lIGRldmljZXMgaGF2ZSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0 aG9kcwo+IEBAIC01MywxNCArNDMsOCBAQAo+ICAgKgkJCW1heCB0b3RhbCAoc3RhdGljICsgZHlu YW1pYykgcG93ZXIgdmFsdWUgZm9yIGVhY2ggT1BQLgo+ICAgKi8KPiAgc3RydWN0IGRldmZyZXFf Y29vbGluZ19wb3dlciB7Cj4gLQl1bnNpZ25lZCBsb25nICgqZ2V0X3N0YXRpY19wb3dlcikoc3Ry dWN0IGRldmZyZXEgKmRldmZyZXEsCj4gLQkJCQkJICB1bnNpZ25lZCBsb25nIHZvbHRhZ2UpOwo+ IC0JdW5zaWduZWQgbG9uZyAoKmdldF9keW5hbWljX3Bvd2VyKShzdHJ1Y3QgZGV2ZnJlcSAqZGV2 ZnJlcSwKPiAtCQkJCQkgICB1bnNpZ25lZCBsb25nIGZyZXEsCj4gLQkJCQkJICAgdW5zaWduZWQg bG9uZyB2b2x0YWdlKTsKPiAgCWludCAoKmdldF9yZWFsX3Bvd2VyKShzdHJ1Y3QgZGV2ZnJlcSAq ZGYsIHUzMiAqcG93ZXIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJlcSwgdW5zaWduZWQg bG9uZyB2b2x0YWdlKTsKPiAtCXVuc2lnbmVkIGxvbmcgZHluX3Bvd2VyX2NvZWZmOwo+ICB9Owo+ ICAKPiAgI2lmZGVmIENPTkZJR19ERVZGUkVRX1RIRVJNQUwKPiBAQCAtNzIsNiArNTYsMTMgQEAg c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICBvZl9kZXZmcmVxX2Nvb2xpbmdfcmVn aXN0ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGRldmZyZXEgKmRmKTsKPiAgc3Ry dWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmRldmZyZXFfY29vbGluZ19yZWdpc3RlcihzdHJ1 Y3QgZGV2ZnJlcSAqZGYpOwo+ICB2b2lkIGRldmZyZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVj dCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpkZmMpOwo+ICtzdHJ1Y3QgdGhlcm1hbF9jb29saW5n X2RldmljZSAqCj4gK2RldmZyZXFfY29vbGluZ19lbV9yZWdpc3Rlcl9wb3dlcihzdHJ1Y3QgZGV2 ZnJlcSAqZGYsCj4gKwkJCQkgIHN0cnVjdCBkZXZmcmVxX2Nvb2xpbmdfcG93ZXIgKmRmY19wb3dl ciwKPiArCQkJCSAgc3RydWN0IGVtX2RhdGFfY2FsbGJhY2sgKmVtX2NiKTsKPiArc3RydWN0IHRo ZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nvb2xpbmdfZW1fcmVnaXN0ZXIoc3Ry dWN0IGRldmZyZXEgKmRmLAo+ICsJCQkgICAgc3RydWN0IGVtX2RhdGFfY2FsbGJhY2sgKmVtX2Ni KTsKPiAgCj4gICNlbHNlIC8qICFDT05GSUdfREVWRlJFUV9USEVSTUFMICovCj4gIAo+IEBAIC05 NCw2ICs4NSwyMCBAQCBkZXZmcmVxX2Nvb2xpbmdfcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRm KQo+ICAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nvb2xpbmdfZW1fcmVn aXN0ZXJfcG93ZXIoc3RydWN0IGRldmZyZXEgKmRmLAo+ICsJCQkJICBzdHJ1Y3QgZGV2ZnJlcV9j b29saW5nX3Bvd2VyICpkZmNfcG93ZXIsCj4gKwkJCQkgIHN0cnVjdCBlbV9kYXRhX2NhbGxiYWNr ICplbV9jYikKPiArewo+ICsJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKgo+ICtkZXZmcmVxX2Nv b2xpbmdfZW1fcmVnaXN0ZXIoc3RydWN0IGRldmZyZXEgKmRmLAlzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqZW1fY2IpCj4gK3sKPiArCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+ICt9Cj4gKwo+ ICBzdGF0aWMgaW5saW5lIHZvaWQKPiAgZGV2ZnJlcV9jb29saW5nX3VucmVnaXN0ZXIoc3RydWN0 IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmRmYykKPiAgewo+IGRpZmYgLS1naXQgYS9pbmNsdWRl L3RyYWNlL2V2ZW50cy90aGVybWFsLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVybWFsLmgK PiBpbmRleCAxMzVlNTQyMWYwMDMuLjhhNWYwNDg4OGFiZCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRl L3RyYWNlL2V2ZW50cy90aGVybWFsLmgKPiArKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVy bWFsLmgKPiBAQCAtMTUzLDMxICsxNTMsMzAgQEAgVFJBQ0VfRVZFTlQodGhlcm1hbF9wb3dlcl9j cHVfbGltaXQsCj4gIFRSQUNFX0VWRU5UKHRoZXJtYWxfcG93ZXJfZGV2ZnJlcV9nZXRfcG93ZXIs Cj4gIAlUUF9QUk9UTyhzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKPiAgCQkg c3RydWN0IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdHVzLCB1bnNpZ25lZCBsb25nIGZyZXEsCj4g LQkJdTMyIGR5bmFtaWNfcG93ZXIsIHUzMiBzdGF0aWNfcG93ZXIsIHUzMiBwb3dlciksCj4gKwkJ dTMyIHBvd2VyKSwKPiAgCj4gLQlUUF9BUkdTKGNkZXYsIHN0YXR1cywgIGZyZXEsIGR5bmFtaWNf cG93ZXIsIHN0YXRpY19wb3dlciwgcG93ZXIpLAo+ICsJVFBfQVJHUyhjZGV2LCBzdGF0dXMsICBm cmVxLCBwb3dlciksCj4gIAo+ICAJVFBfU1RSVUNUX19lbnRyeSgKPiAgCQlfX3N0cmluZyh0eXBl LCAgICAgICAgIGNkZXYtPnR5cGUgICAgKQo+ICAJCV9fZmllbGQodW5zaWduZWQgbG9uZywgZnJl cSAgICAgICAgICApCj4gLQkJX19maWVsZCh1MzIsICAgICAgICAgICBsb2FkICAgICAgICAgICkK PiAtCQlfX2ZpZWxkKHUzMiwgICAgICAgICAgIGR5bmFtaWNfcG93ZXIgKQo+IC0JCV9fZmllbGQo dTMyLCAgICAgICAgICAgc3RhdGljX3Bvd2VyICApCj4gKwkJX19maWVsZCh1MzIsICAgICAgICAg ICBidXN5X3RpbWUpCj4gKwkJX19maWVsZCh1MzIsICAgICAgICAgICB0b3RhbF90aW1lKQo+ICAJ CV9fZmllbGQodTMyLCAgICAgICAgICAgcG93ZXIpCj4gIAkpLAo+ICAKPiAgCVRQX2Zhc3RfYXNz aWduKAo+ICAJCV9fYXNzaWduX3N0cih0eXBlLCBjZGV2LT50eXBlKTsKPiAgCQlfX2VudHJ5LT5m cmVxID0gZnJlcTsKPiAtCQlfX2VudHJ5LT5sb2FkID0gKDEwMCAqIHN0YXR1cy0+YnVzeV90aW1l KSAvIHN0YXR1cy0+dG90YWxfdGltZTsKPiAtCQlfX2VudHJ5LT5keW5hbWljX3Bvd2VyID0gZHlu YW1pY19wb3dlcjsKPiAtCQlfX2VudHJ5LT5zdGF0aWNfcG93ZXIgPSBzdGF0aWNfcG93ZXI7Cj4g KwkJX19lbnRyeS0+YnVzeV90aW1lID0gc3RhdHVzLT5idXN5X3RpbWU7Cj4gKwkJX19lbnRyeS0+ dG90YWxfdGltZSA9IHN0YXR1cy0+dG90YWxfdGltZTsKPiAgCQlfX2VudHJ5LT5wb3dlciA9IHBv d2VyOwo+ICAJKSwKPiAgCj4gLQlUUF9wcmludGsoInR5cGU9JXMgZnJlcT0lbHUgbG9hZD0ldSBk eW5hbWljX3Bvd2VyPSV1IHN0YXRpY19wb3dlcj0ldSBwb3dlcj0ldSIsCj4gKwlUUF9wcmludGso InR5cGU9JXMgZnJlcT0lbHUgbG9hZD0ldSBwb3dlcj0ldSIsCj4gIAkJX19nZXRfc3RyKHR5cGUp LCBfX2VudHJ5LT5mcmVxLAo+IC0JCV9fZW50cnktPmxvYWQsIF9fZW50cnktPmR5bmFtaWNfcG93 ZXIsIF9fZW50cnktPnN0YXRpY19wb3dlciwKPiArCQlfX2VudHJ5LT50b3RhbF90aW1lID09IDAg PyAwIDoKPiArCQkJKDEwMCAqIF9fZW50cnktPmJ1c3lfdGltZSkgLyBfX2VudHJ5LT50b3RhbF90 aW1lLAo+ICAJCV9fZW50cnktPnBvd2VyKQo+ICApOwo+ICAKPiAtLSAKPiAyLjE3LjEKPiAKCi0t IAoKIDxodHRwOi8vd3d3LmxpbmFyby5vcmcvPiBMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBz b2Z0d2FyZSBmb3IgQVJNIFNvQ3MKCkZvbGxvdyBMaW5hcm86ICA8aHR0cDovL3d3dy5mYWNlYm9v ay5jb20vcGFnZXMvTGluYXJvPiBGYWNlYm9vayB8CjxodHRwOi8vdHdpdHRlci5jb20vIyEvbGlu YXJvb3JnPiBUd2l0dGVyIHwKPGh0dHA6Ly93d3cubGluYXJvLm9yZy9saW5hcm8tYmxvZy8+IEJs b2cKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==