From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A4C28C43334 for ; Tue, 5 Jul 2022 09:09:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229789AbiGEJJQ (ORCPT ); Tue, 5 Jul 2022 05:09:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229517AbiGEJJO (ORCPT ); Tue, 5 Jul 2022 05:09:14 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC03C110C for ; Tue, 5 Jul 2022 02:09:12 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id v14so16584965wra.5 for ; Tue, 05 Jul 2022 02:09:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to:content-transfer-encoding; bh=yJ3/p/b20rd9gITr340jXdoH64eB6vygRRljkiC3keQ=; b=ZkMdT84ipj39vCO/c7Hf55PtVWpnxXpU4nIqZoPE9TBg3nzHvLN5uXiLRJJWJZUaFH IVV75UQbUT+9xDfo9XPMnzulnGXkf0TEsJjRSIzZUi4Ckh7/Svqgm6oN4TBOEqX64CxG h1KaOpT1pmbUcEpWFyctI/tMq+QCjPS5Hr+2hYok5wrZ/PJK3CVduRzjKGmy3YoOQBrb SRQRym6k4u4qGoicGUV4zLsVl6uHpRCNWbzTsrDP8oIWC04qpRxzkL622nDV/MlfMoZu H9yzQ2Y0LwSktRRbqcW3hWnun7r1kUQ63dSBNCTL7dvAD9Aw2G8GXycOd7X0Cd+7J08O JYgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=yJ3/p/b20rd9gITr340jXdoH64eB6vygRRljkiC3keQ=; b=wAkpjLWPxvx9S3Q5ibuQlf+U9HBE5RiXqIY793NDhkei18SyDNzJ7Ajjth5EuN1ssI yATdEl+tVfuu07IDb5guMAqfZDpfE6LFyFw6ScBdB4NR8j/H49j2CC70vwJDXBIrSz6m DMM3mU+FyKivA/zTcdMx1Y5KvVZiJKuuSjsYhwriFV6Vm8lTwZyZKXEpxzgsji/xXaEJ fUWeTNDPciQPgGHkiiNMkFePiZBcKOVo16zQRKCjbDN8pDXgHrdgdbKsy7pjTlq/Xql6 hjezTBpzHNsM4lOKT/HgVTorgi9u6VJQBKAwIbnCAg8L6z4cY4ZbvIbuLKt/FtAReHxr mLxg== X-Gm-Message-State: AJIora8AldFWTcjxIHGVqmOilcSYt2XHh77Wbh6nNAvRcpkObW0txF1b a+Nnlnbdpa/YE2oGaihRZAOUxQ== X-Google-Smtp-Source: AGRyM1uOmYs7yfGw762F2c9Ek0zTm5wi/+qAG9KZ9cTFCOZgYur4sj1hP42/yknm4nKxzPH5BLFvaw== X-Received: by 2002:a5d:4345:0:b0:21a:3b82:ad57 with SMTP id u5-20020a5d4345000000b0021a3b82ad57mr31677768wrr.176.1657012151232; Tue, 05 Jul 2022 02:09:11 -0700 (PDT) Received: from [192.168.10.46] (146725694.box.freepro.com. [130.180.211.218]) by smtp.googlemail.com with ESMTPSA id l14-20020a05600c4f0e00b003a199ed4f44sm10760635wmq.27.2022.07.05.02.09.09 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 05 Jul 2022 02:09:10 -0700 (PDT) Message-ID: <3b0ce952-0674-d01d-3fc0-795d35743723@linaro.org> Date: Tue, 5 Jul 2022 11:09:09 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH 1/4] PM: EM: convert power field to micro-Watts precision and align drivers Content-Language: en-US To: Lukasz Luba , linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: amitk@kernel.org, rui.zhang@intel.com, viresh.kumar@linaro.org, rafael@kernel.org, dietmar.eggemann@arm.com, nm@ti.com, sboyd@kernel.org, sudeep.holla@arm.com, cristian.marussi@arm.com, matthias.bgg@gmail.com, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org References: <20220622145802.13032-1-lukasz.luba@arm.com> <20220622145802.13032-2-lukasz.luba@arm.com> From: Daniel Lezcano In-Reply-To: <20220622145802.13032-2-lukasz.luba@arm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 22/06/2022 16:57, Lukasz Luba wrote: > The milli-Watts precision causes rounding errors while calculating > efficiency cost for each OPP. This is especially visible in the 'simple' > Energy Model (EM), where the power for each OPP is provided from OPP > framework. This can cause some OPPs to be marked inefficient, while > using micro-Watts precision that might not happen. > > Update all EM users which access 'power' field and assume the value is > in milli-Watts. > > Solve also an issue with potential overflow in calculation of energy > estimation on 32bit machine. It's needed now since the power value > (thus the 'cost' as well) are higher. > > Example calculation which shows the rounding error and impact: > > power = 'dyn-power-coeff' * volt_mV * volt_mV * freq_MHz > > power_a_uW = (100 * 600mW * 600mW * 500MHz) / 10^6 = 18000 > power_a_mW = (100 * 600mW * 600mW * 500MHz) / 10^9 = 18 > > power_b_uW = (100 * 605mW * 605mW * 600MHz) / 10^6 = 21961 > power_b_mW = (100 * 605mW * 605mW * 600MHz) / 10^9 = 21 > > max_freq = 2000MHz > > cost_a_mW = 18 * 2000MHz/500MHz = 72 > cost_a_uW = 18000 * 2000MHz/500MHz = 72000 > > cost_b_mW = 21 * 2000MHz/600MHz = 70 // <- artificially better > cost_b_uW = 21961 * 2000MHz/600MHz = 73203 > > The 'cost_b_mW' (which is based on old milli-Watts) is misleadingly > better that the 'cost_b_uW' (this patch uses micro-Watts) and such > would have impact on the 'inefficient OPPs' information in the Cpufreq > framework. This patch set removes the rounding issue. Thanks for this detailed description, it really helps to understand why this change is needed. Perhaps it would make sense to add a power_uw in the EM structure and keeping the old one with the milli-watts in order to reduce the impact of the change. It is a suggestion if you find it more convenient. Otherwise I'm fine with this approach too. A few comments below. > Signed-off-by: Lukasz Luba > --- > drivers/cpufreq/mediatek-cpufreq-hw.c | 7 +-- > drivers/cpufreq/scmi-cpufreq.c | 6 +++ > drivers/opp/of.c | 15 ++++--- > drivers/powercap/dtpm_cpu.c | 5 +-- > drivers/thermal/cpufreq_cooling.c | 13 +++++- > drivers/thermal/devfreq_cooling.c | 19 ++++++-- > include/linux/energy_model.h | 63 ++++++++++++++++++++------- > kernel/power/energy_model.c | 31 ++++++++----- > 8 files changed, 114 insertions(+), 45 deletions(-) > > diff --git a/drivers/cpufreq/mediatek-cpufreq-hw.c b/drivers/cpufreq/mediatek-cpufreq-hw.c > index 813cccbfe934..f0e0a35c7f21 100644 > --- a/drivers/cpufreq/mediatek-cpufreq-hw.c > +++ b/drivers/cpufreq/mediatek-cpufreq-hw.c > @@ -51,7 +51,7 @@ static const u16 cpufreq_mtk_offsets[REG_ARRAY_SIZE] = { > }; > [ ... ] > diff --git a/drivers/thermal/cpufreq_cooling.c b/drivers/thermal/cpufreq_cooling.c > index b8151d95a806..dc19e7c80751 100644 > --- a/drivers/thermal/cpufreq_cooling.c > +++ b/drivers/thermal/cpufreq_cooling.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > > #include > > @@ -101,6 +102,7 @@ static unsigned long get_level(struct cpufreq_cooling_device *cpufreq_cdev, > static u32 cpu_freq_to_power(struct cpufreq_cooling_device *cpufreq_cdev, > u32 freq) > { > + unsigned long power_mw; > int i; > > for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) { > @@ -108,16 +110,23 @@ static u32 cpu_freq_to_power(struct cpufreq_cooling_device *cpufreq_cdev, > break; > } > > - return cpufreq_cdev->em->table[i + 1].power; > + power_mw = cpufreq_cdev->em->table[i + 1].power; > + power_mw /= MICROWATT_PER_MILLIWATT; Won't this fail with an unresolved symbols on some archs ? I mean may be do_div should be used instead ? > + > + return power_mw; > } [ ... ] > #ifdef CONFIG_64BIT > -#define em_scale_power(p) ((p) * 1000) > +#define em_estimate_energy(cost, sum_util, scale_cpu) \ > + (((cost) * (sum_util)) / (scale_cpu)) > #else > -#define em_scale_power(p) (p) > +#define em_estimate_energy(cost, sum_util, scale_cpu) \ > + (((cost) / (scale_cpu)) * (sum_util)) > #endif > > struct em_data_callback { > @@ -112,7 +143,7 @@ struct em_data_callback { > * and frequency. > * > * In case of CPUs, the power is the one of a single CPU in the domain, > - * expressed in milli-Watts or an abstract scale. It is expected to > + * expressed in micro-Watts or an abstract scale. It is expected to > * fit in the [0, EM_MAX_POWER] range. > * > * Return 0 on success. > @@ -148,7 +179,7 @@ struct em_perf_domain *em_cpu_get(int cpu); > struct em_perf_domain *em_pd_get(struct device *dev); > int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states, > struct em_data_callback *cb, cpumask_t *span, > - bool milliwatts); > + bool microwatts); > void em_dev_unregister_perf_domain(struct device *dev); > > /** > @@ -273,7 +304,7 @@ static inline unsigned long em_cpu_energy(struct em_perf_domain *pd, > * pd_nrg = ------------------------ (4) > * scale_cpu > */ > - return ps->cost * sum_util / scale_cpu; > + return em_estimate_energy(ps->cost, sum_util, scale_cpu); > } > > /** > @@ -297,7 +328,7 @@ struct em_data_callback {}; > static inline > int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states, > struct em_data_callback *cb, cpumask_t *span, > - bool milliwatts) > + bool microwatts) > { > return -EINVAL; > } > diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c > index 6c373f2960e7..910668ec8838 100644 > --- a/kernel/power/energy_model.c > +++ b/kernel/power/energy_model.c > @@ -108,10 +108,11 @@ static void em_debug_remove_pd(struct device *dev) {} > > static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd, > int nr_states, struct em_data_callback *cb, > - unsigned long flags) > + unsigned long flags, int num_devs) > { > unsigned long power, freq, prev_freq = 0, prev_cost = ULONG_MAX; > struct em_perf_state *table; > + unsigned long max_cost = 0; > int i, ret; > u64 fmax; > > @@ -145,7 +146,7 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd, > > /* > * The power returned by active_state() is expected to be > - * positive and to fit into 16 bits. > + * positive and be in range. > */ > if (!power || power > EM_MAX_POWER) { > dev_err(dev, "EM: invalid power: %lu\n", > @@ -170,7 +171,7 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd, > goto free_ps_table; > } > } else { > - power_res = em_scale_power(table[i].power); > + power_res = table[i].power; > cost = div64_u64(fmax * power_res, table[i].frequency); > } > > @@ -183,6 +184,15 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd, > } else { > prev_cost = table[i].cost; > } > + > + if (max_cost < table[i].cost) > + max_cost = table[i].cost; > + } > + > + /* Check if it won't overflow during energy estimation. */ > + if (em_validate_cost(max_cost, num_devs)) { I'm not finding the em_validate_cost() function > + dev_err(dev, "EM: too big 'cost' value: %lu\n", max_cost); > + goto free_ps_table; > } > > pd->table = table; > @@ -199,9 +209,9 @@ static int em_create_pd(struct device *dev, int nr_states, > struct em_data_callback *cb, cpumask_t *cpus, > unsigned long flags) > { > + int cpu, ret, num_devs = 1; > struct em_perf_domain *pd; > struct device *cpu_dev; > - int cpu, ret; > > if (_is_cpu_device(dev)) { > pd = kzalloc(sizeof(*pd) + cpumask_size(), GFP_KERNEL); > @@ -209,13 +219,14 @@ static int em_create_pd(struct device *dev, int nr_states, > return -ENOMEM; > > cpumask_copy(em_span_cpus(pd), cpus); > + num_devs = cpumask_weight(cpus); Why is this change needed ? What is the connection with the uW unit change ? > } else { > pd = kzalloc(sizeof(*pd), GFP_KERNEL); > if (!pd) > return -ENOMEM; > } > > - ret = em_create_perf_table(dev, pd, nr_states, cb, flags); > + ret = em_create_perf_table(dev, pd, nr_states, cb, flags, num_devs); > if (ret) { > kfree(pd); > return ret; > @@ -314,13 +325,13 @@ EXPORT_SYMBOL_GPL(em_cpu_get); > * @cpus : Pointer to cpumask_t, which in case of a CPU device is > * obligatory. It can be taken from i.e. 'policy->cpus'. For other > * type of devices this should be set to NULL. > - * @milliwatts : Flag indicating that the power values are in milliWatts or > + * @microwatts : Flag indicating that the power values are in micro-Watts or > * in some other scale. It must be set properly. > * > * Create Energy Model tables for a performance domain using the callbacks > * defined in cb. > * > - * The @milliwatts is important to set with correct value. Some kernel > + * The @microwatts is important to set with correct value. Some kernel > * sub-systems might rely on this flag and check if all devices in the EM are > * using the same scale. > * > @@ -331,7 +342,7 @@ EXPORT_SYMBOL_GPL(em_cpu_get); > */ > int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states, > struct em_data_callback *cb, cpumask_t *cpus, > - bool milliwatts) > + bool microwatts) > { > unsigned long cap, prev_cap = 0; > unsigned long flags = 0; > @@ -381,8 +392,8 @@ int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states, > } > } > > - if (milliwatts) > - flags |= EM_PERF_DOMAIN_MILLIWATTS; > + if (microwatts) > + flags |= EM_PERF_DOMAIN_MICROWATTS; > else if (cb->get_cost) > flags |= EM_PERF_DOMAIN_ARTIFICIAL; > -- 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 57E97C433EF for ; Tue, 5 Jul 2022 09:12:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=bhPq/5KGw4rD+iF84zkN7gRM46/I6IoIH/XiPCSfbY8=; b=TbzhzoOpTxLQaa mmOknrrJ+Qx5bB9m1sVpzWjVpZOj9EDlBB7m4Ee+kwbwzMhK45VROCwF//hAmVn2G4KQY9hObyCYQ 5KcaOx+3e4HcF2MkBn0TVQFv2jpuvM9eonySPFq5rL9hISZqQ9PuPC+20y/DpGiAcnxgoo9yQCn3a bNqcCEtPA2zJDlw/a2IvNWynTxModw83UXeDvPstitMuuTD1QM3PCeLqo3GvqXwwO1NHXEwE3y5Fe bvY+3N/BPtGUW7EHpt8GxhgECISvSxRe9BYynAoZnQaJif7o8XIVstPOb0XXQ5LYt1jC8QCWOVavf RvV7B1ubLpO4Jpl4ydJg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o8eaV-00GXll-0U; Tue, 05 Jul 2022 09:11:19 +0000 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o8eYV-00GWLW-Ob for linux-arm-kernel@lists.infradead.org; Tue, 05 Jul 2022 09:09:18 +0000 Received: by mail-wr1-x435.google.com with SMTP id b26so16607441wrc.2 for ; Tue, 05 Jul 2022 02:09:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to:content-transfer-encoding; bh=yJ3/p/b20rd9gITr340jXdoH64eB6vygRRljkiC3keQ=; b=ZkMdT84ipj39vCO/c7Hf55PtVWpnxXpU4nIqZoPE9TBg3nzHvLN5uXiLRJJWJZUaFH IVV75UQbUT+9xDfo9XPMnzulnGXkf0TEsJjRSIzZUi4Ckh7/Svqgm6oN4TBOEqX64CxG h1KaOpT1pmbUcEpWFyctI/tMq+QCjPS5Hr+2hYok5wrZ/PJK3CVduRzjKGmy3YoOQBrb SRQRym6k4u4qGoicGUV4zLsVl6uHpRCNWbzTsrDP8oIWC04qpRxzkL622nDV/MlfMoZu H9yzQ2Y0LwSktRRbqcW3hWnun7r1kUQ63dSBNCTL7dvAD9Aw2G8GXycOd7X0Cd+7J08O JYgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=yJ3/p/b20rd9gITr340jXdoH64eB6vygRRljkiC3keQ=; b=tsqb+DARTwCddkxhqj9Fm091q3ADDiQeYLZYUT+LE4jtRm5+iLIUk6fFAdQu5RE15F hbrge8iKMoGJobmLP4ec+wflHvsXdfa+CigOmRwS8ZgwS52cPAvuP9pk4jKARfVCTbWu oGUiukZx8hF8+vtZB4LYEKXeQbWT3t0nb2qwJke3um2kX9V0w5ICR3dpnSGLzXypF3Ta h6B8evIZPGjdtiL+FYXLJO8b+L8PekMQHOna3AHJAIMuGqJiWeizwP0sC2evHT9mi5iN 3xCTzWuHYXin2ZdB9fEol0S/Of8Gp8yCargHjs7dKDObIYa0mhpL46iWWCN9WkoBDoK4 OnJg== X-Gm-Message-State: AJIora/w8BA+61152Gz9HZiJEf0byMREfnN2cVTqIk6TeIaYxKU1rye0 YqBIde6sfvcSXboRCPlPeNHTPQ== X-Google-Smtp-Source: AGRyM1uOmYs7yfGw762F2c9Ek0zTm5wi/+qAG9KZ9cTFCOZgYur4sj1hP42/yknm4nKxzPH5BLFvaw== X-Received: by 2002:a5d:4345:0:b0:21a:3b82:ad57 with SMTP id u5-20020a5d4345000000b0021a3b82ad57mr31677768wrr.176.1657012151232; Tue, 05 Jul 2022 02:09:11 -0700 (PDT) Received: from [192.168.10.46] (146725694.box.freepro.com. [130.180.211.218]) by smtp.googlemail.com with ESMTPSA id l14-20020a05600c4f0e00b003a199ed4f44sm10760635wmq.27.2022.07.05.02.09.09 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 05 Jul 2022 02:09:10 -0700 (PDT) Message-ID: <3b0ce952-0674-d01d-3fc0-795d35743723@linaro.org> Date: Tue, 5 Jul 2022 11:09:09 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH 1/4] PM: EM: convert power field to micro-Watts precision and align drivers Content-Language: en-US To: Lukasz Luba , linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: amitk@kernel.org, rui.zhang@intel.com, viresh.kumar@linaro.org, rafael@kernel.org, dietmar.eggemann@arm.com, nm@ti.com, sboyd@kernel.org, sudeep.holla@arm.com, cristian.marussi@arm.com, matthias.bgg@gmail.com, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org References: <20220622145802.13032-1-lukasz.luba@arm.com> <20220622145802.13032-2-lukasz.luba@arm.com> From: Daniel Lezcano In-Reply-To: <20220622145802.13032-2-lukasz.luba@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220705_020915_833904_F20A0633 X-CRM114-Status: GOOD ( 45.38 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjIvMDYvMjAyMiAxNjo1NywgTHVrYXN6IEx1YmEgd3JvdGU6Cj4gVGhlIG1pbGxpLVdhdHRz IHByZWNpc2lvbiBjYXVzZXMgcm91bmRpbmcgZXJyb3JzIHdoaWxlIGNhbGN1bGF0aW5nCj4gZWZm aWNpZW5jeSBjb3N0IGZvciBlYWNoIE9QUC4gVGhpcyBpcyBlc3BlY2lhbGx5IHZpc2libGUgaW4g dGhlICdzaW1wbGUnCj4gRW5lcmd5IE1vZGVsIChFTSksIHdoZXJlIHRoZSBwb3dlciBmb3IgZWFj aCBPUFAgaXMgcHJvdmlkZWQgZnJvbSBPUFAKPiBmcmFtZXdvcmsuIFRoaXMgY2FuIGNhdXNlIHNv bWUgT1BQcyB0byBiZSBtYXJrZWQgaW5lZmZpY2llbnQsIHdoaWxlCj4gdXNpbmcgbWljcm8tV2F0 dHMgcHJlY2lzaW9uIHRoYXQgbWlnaHQgbm90IGhhcHBlbi4KPiAKPiBVcGRhdGUgYWxsIEVNIHVz ZXJzIHdoaWNoIGFjY2VzcyAncG93ZXInIGZpZWxkIGFuZCBhc3N1bWUgdGhlIHZhbHVlIGlzCj4g aW4gbWlsbGktV2F0dHMuCj4gCj4gU29sdmUgYWxzbyBhbiBpc3N1ZSB3aXRoIHBvdGVudGlhbCBv dmVyZmxvdyBpbiBjYWxjdWxhdGlvbiBvZiBlbmVyZ3kKPiBlc3RpbWF0aW9uIG9uIDMyYml0IG1h Y2hpbmUuIEl0J3MgbmVlZGVkIG5vdyBzaW5jZSB0aGUgcG93ZXIgdmFsdWUKPiAodGh1cyB0aGUg J2Nvc3QnIGFzIHdlbGwpIGFyZSBoaWdoZXIuCj4gCj4gRXhhbXBsZSBjYWxjdWxhdGlvbiB3aGlj aCBzaG93cyB0aGUgcm91bmRpbmcgZXJyb3IgYW5kIGltcGFjdDoKPiAKPiBwb3dlciA9ICdkeW4t cG93ZXItY29lZmYnICogdm9sdF9tViAqIHZvbHRfbVYgKiBmcmVxX01Iego+IAo+IHBvd2VyX2Ff dVcgPSAoMTAwICogNjAwbVcgKiA2MDBtVyAqIDUwME1IeikgLyAxMF42ID0gMTgwMDAKPiBwb3dl cl9hX21XID0gKDEwMCAqIDYwMG1XICogNjAwbVcgKiA1MDBNSHopIC8gMTBeOSA9IDE4Cj4gCj4g cG93ZXJfYl91VyA9ICgxMDAgKiA2MDVtVyAqIDYwNW1XICogNjAwTUh6KSAvIDEwXjYgPSAyMTk2 MQo+IHBvd2VyX2JfbVcgPSAoMTAwICogNjA1bVcgKiA2MDVtVyAqIDYwME1IeikgLyAxMF45ID0g MjEKPiAKPiBtYXhfZnJlcSA9IDIwMDBNSHoKPiAKPiBjb3N0X2FfbVcgPSAxOCAqIDIwMDBNSHov NTAwTUh6ID0gNzIKPiBjb3N0X2FfdVcgPSAxODAwMCAqIDIwMDBNSHovNTAwTUh6ID0gNzIwMDAK PiAKPiBjb3N0X2JfbVcgPSAyMSAqIDIwMDBNSHovNjAwTUh6ID0gNzAgLy8gPC0gYXJ0aWZpY2lh bGx5IGJldHRlcgo+IGNvc3RfYl91VyA9IDIxOTYxICogMjAwME1Iei82MDBNSHogPSA3MzIwMwo+ IAo+IFRoZSAnY29zdF9iX21XJyAod2hpY2ggaXMgYmFzZWQgb24gb2xkIG1pbGxpLVdhdHRzKSBp cyBtaXNsZWFkaW5nbHkKPiBiZXR0ZXIgdGhhdCB0aGUgJ2Nvc3RfYl91VycgKHRoaXMgcGF0Y2gg dXNlcyBtaWNyby1XYXR0cykgYW5kIHN1Y2gKPiB3b3VsZCBoYXZlIGltcGFjdCBvbiB0aGUgJ2lu ZWZmaWNpZW50IE9QUHMnIGluZm9ybWF0aW9uIGluIHRoZSBDcHVmcmVxCj4gZnJhbWV3b3JrLiBU aGlzIHBhdGNoIHNldCByZW1vdmVzIHRoZSByb3VuZGluZyBpc3N1ZS4KClRoYW5rcyBmb3IgdGhp cyBkZXRhaWxlZCBkZXNjcmlwdGlvbiwgaXQgcmVhbGx5IGhlbHBzIHRvIHVuZGVyc3RhbmQgd2h5 IAp0aGlzIGNoYW5nZSBpcyBuZWVkZWQuCgpQZXJoYXBzIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8g YWRkIGEgcG93ZXJfdXcgaW4gdGhlIEVNIHN0cnVjdHVyZSBhbmQgCmtlZXBpbmcgdGhlIG9sZCBv bmUgd2l0aCB0aGUgbWlsbGktd2F0dHMgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBpbXBhY3QgCm9m IHRoZSBjaGFuZ2UuCgpJdCBpcyBhIHN1Z2dlc3Rpb24gaWYgeW91IGZpbmQgaXQgbW9yZSBjb252 ZW5pZW50LiBPdGhlcndpc2UgSSdtIGZpbmUgCndpdGggdGhpcyBhcHByb2FjaCB0b28uCgpBIGZl dyBjb21tZW50cyBiZWxvdy4KCj4gU2lnbmVkLW9mZi1ieTogTHVrYXN6IEx1YmEgPGx1a2Fzei5s dWJhQGFybS5jb20+Cj4gLS0tCj4gICBkcml2ZXJzL2NwdWZyZXEvbWVkaWF0ZWstY3B1ZnJlcS1o dy5jIHwgIDcgKy0tCj4gICBkcml2ZXJzL2NwdWZyZXEvc2NtaS1jcHVmcmVxLmMgICAgICAgIHwg IDYgKysrCj4gICBkcml2ZXJzL29wcC9vZi5jICAgICAgICAgICAgICAgICAgICAgIHwgMTUgKysr Ky0tLQo+ICAgZHJpdmVycy9wb3dlcmNhcC9kdHBtX2NwdS5jICAgICAgICAgICB8ICA1ICstLQo+ ICAgZHJpdmVycy90aGVybWFsL2NwdWZyZXFfY29vbGluZy5jICAgICB8IDEzICsrKysrLQo+ICAg ZHJpdmVycy90aGVybWFsL2RldmZyZXFfY29vbGluZy5jICAgICB8IDE5ICsrKysrKy0tCj4gICBp bmNsdWRlL2xpbnV4L2VuZXJneV9tb2RlbC5oICAgICAgICAgIHwgNjMgKysrKysrKysrKysrKysr KysrKystLS0tLS0tCj4gICBrZXJuZWwvcG93ZXIvZW5lcmd5X21vZGVsLmMgICAgICAgICAgIHwg MzEgKysrKysrKystLS0tLQo+ICAgOCBmaWxlcyBjaGFuZ2VkLCAxMTQgaW5zZXJ0aW9ucygrKSwg NDUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9tZWRpYXRl ay1jcHVmcmVxLWh3LmMgYi9kcml2ZXJzL2NwdWZyZXEvbWVkaWF0ZWstY3B1ZnJlcS1ody5jCj4g aW5kZXggODEzY2NjYmZlOTM0Li5mMGUwYTM1YzdmMjEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9j cHVmcmVxL21lZGlhdGVrLWNwdWZyZXEtaHcuYwo+ICsrKyBiL2RyaXZlcnMvY3B1ZnJlcS9tZWRp YXRlay1jcHVmcmVxLWh3LmMKPiBAQCAtNTEsNyArNTEsNyBAQCBzdGF0aWMgY29uc3QgdTE2IGNw dWZyZXFfbXRrX29mZnNldHNbUkVHX0FSUkFZX1NJWkVdID0gewo+ICAgfTsKPiAgIAoKWyAuLi4g XQoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL2NwdWZyZXFfY29vbGluZy5jIGIvZHJp dmVycy90aGVybWFsL2NwdWZyZXFfY29vbGluZy5jCj4gaW5kZXggYjgxNTFkOTVhODA2Li5kYzE5 ZTdjODA3NTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy90aGVybWFsL2NwdWZyZXFfY29vbGluZy5j Cj4gKysrIGIvZHJpdmVycy90aGVybWFsL2NwdWZyZXFfY29vbGluZy5jCj4gQEAgLTIxLDYgKzIx LDcgQEAKPiAgICNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9z bGFiLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgo+ICsjaW5jbHVkZSA8bGludXgv dW5pdHMuaD4KPiAgIAo+ICAgI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy90aGVybWFsLmg+Cj4gICAK PiBAQCAtMTAxLDYgKzEwMiw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9sZXZlbChzdHJ1 Y3QgY3B1ZnJlcV9jb29saW5nX2RldmljZSAqY3B1ZnJlcV9jZGV2LAo+ICAgc3RhdGljIHUzMiBj cHVfZnJlcV90b19wb3dlcihzdHJ1Y3QgY3B1ZnJlcV9jb29saW5nX2RldmljZSAqY3B1ZnJlcV9j ZGV2LAo+ICAgCQkJICAgICB1MzIgZnJlcSkKPiAgIHsKPiArCXVuc2lnbmVkIGxvbmcgcG93ZXJf bXc7Cj4gICAJaW50IGk7Cj4gICAKPiAgIAlmb3IgKGkgPSBjcHVmcmVxX2NkZXYtPm1heF9sZXZl bCAtIDE7IGkgPj0gMDsgaS0tKSB7Cj4gQEAgLTEwOCwxNiArMTEwLDIzIEBAIHN0YXRpYyB1MzIg Y3B1X2ZyZXFfdG9fcG93ZXIoc3RydWN0IGNwdWZyZXFfY29vbGluZ19kZXZpY2UgKmNwdWZyZXFf Y2RldiwKPiAgIAkJCWJyZWFrOwo+ICAgCX0KPiAgIAo+IC0JcmV0dXJuIGNwdWZyZXFfY2Rldi0+ ZW0tPnRhYmxlW2kgKyAxXS5wb3dlcjsKPiArCXBvd2VyX213ID0gY3B1ZnJlcV9jZGV2LT5lbS0+ dGFibGVbaSArIDFdLnBvd2VyOwo+ICsJcG93ZXJfbXcgLz0gTUlDUk9XQVRUX1BFUl9NSUxMSVdB VFQ7CgpXb24ndCB0aGlzIGZhaWwgd2l0aCBhbiB1bnJlc29sdmVkIHN5bWJvbHMgb24gc29tZSBh cmNocyA/IEkgbWVhbiBtYXkgYmUgCmRvX2RpdiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkID8KCj4g Kwo+ICsJcmV0dXJuIHBvd2VyX213Owo+ICAgfQoKWyAuLi4gXQoKPiAgICNpZmRlZiBDT05GSUdf NjRCSVQKPiAtI2RlZmluZSBlbV9zY2FsZV9wb3dlcihwKSAoKHApICogMTAwMCkKPiArI2RlZmlu ZSBlbV9lc3RpbWF0ZV9lbmVyZ3koY29zdCwgc3VtX3V0aWwsIHNjYWxlX2NwdSkgXAo+ICsJKCgo Y29zdCkgKiAoc3VtX3V0aWwpKSAvIChzY2FsZV9jcHUpKQo+ICAgI2Vsc2UKPiAtI2RlZmluZSBl bV9zY2FsZV9wb3dlcihwKSAocCkKPiArI2RlZmluZSBlbV9lc3RpbWF0ZV9lbmVyZ3koY29zdCwg c3VtX3V0aWwsIHNjYWxlX2NwdSkgXAo+ICsJKCgoY29zdCkgLyAoc2NhbGVfY3B1KSkgKiAoc3Vt X3V0aWwpKQo+ICAgI2VuZGlmCj4gICAKPiAgIHN0cnVjdCBlbV9kYXRhX2NhbGxiYWNrIHsKPiBA QCAtMTEyLDcgKzE0Myw3IEBAIHN0cnVjdCBlbV9kYXRhX2NhbGxiYWNrIHsKPiAgIAkgKiBhbmQg ZnJlcXVlbmN5Lgo+ICAgCSAqCj4gICAJICogSW4gY2FzZSBvZiBDUFVzLCB0aGUgcG93ZXIgaXMg dGhlIG9uZSBvZiBhIHNpbmdsZSBDUFUgaW4gdGhlIGRvbWFpbiwKPiAtCSAqIGV4cHJlc3NlZCBp biBtaWxsaS1XYXR0cyBvciBhbiBhYnN0cmFjdCBzY2FsZS4gSXQgaXMgZXhwZWN0ZWQgdG8KPiAr CSAqIGV4cHJlc3NlZCBpbiBtaWNyby1XYXR0cyBvciBhbiBhYnN0cmFjdCBzY2FsZS4gSXQgaXMg ZXhwZWN0ZWQgdG8KPiAgIAkgKiBmaXQgaW4gdGhlIFswLCBFTV9NQVhfUE9XRVJdIHJhbmdlLgo+ ICAgCSAqCj4gICAJICogUmV0dXJuIDAgb24gc3VjY2Vzcy4KPiBAQCAtMTQ4LDcgKzE3OSw3IEBA IHN0cnVjdCBlbV9wZXJmX2RvbWFpbiAqZW1fY3B1X2dldChpbnQgY3B1KTsKPiAgIHN0cnVjdCBl bV9wZXJmX2RvbWFpbiAqZW1fcGRfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldik7Cj4gICBpbnQgZW1f ZGV2X3JlZ2lzdGVyX3BlcmZfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50 IG5yX3N0YXRlcywKPiAgIAkJCQlzdHJ1Y3QgZW1fZGF0YV9jYWxsYmFjayAqY2IsIGNwdW1hc2tf dCAqc3BhbiwKPiAtCQkJCWJvb2wgbWlsbGl3YXR0cyk7Cj4gKwkJCQlib29sIG1pY3Jvd2F0dHMp Owo+ICAgdm9pZCBlbV9kZXZfdW5yZWdpc3Rlcl9wZXJmX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICpk ZXYpOwo+ICAgCj4gICAvKioKPiBAQCAtMjczLDcgKzMwNCw3IEBAIHN0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBlbV9jcHVfZW5lcmd5KHN0cnVjdCBlbV9wZXJmX2RvbWFpbiAqcGQsCj4gICAJ ICogICBwZF9ucmcgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAg ICAgICg0KQo+ICAgCSAqICAgICAgICAgICAgICAgICAgc2NhbGVfY3B1Cj4gICAJICovCj4gLQly ZXR1cm4gcHMtPmNvc3QgKiBzdW1fdXRpbCAvIHNjYWxlX2NwdTsKPiArCXJldHVybiBlbV9lc3Rp bWF0ZV9lbmVyZ3kocHMtPmNvc3QsIHN1bV91dGlsLCBzY2FsZV9jcHUpOwo+ICAgfQo+ICAgCj4g ICAvKioKPiBAQCAtMjk3LDcgKzMyOCw3IEBAIHN0cnVjdCBlbV9kYXRhX2NhbGxiYWNrIHt9Owo+ ICAgc3RhdGljIGlubGluZQo+ICAgaW50IGVtX2Rldl9yZWdpc3Rlcl9wZXJmX2RvbWFpbihzdHJ1 Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBucl9zdGF0ZXMsCj4gICAJCQkJc3RydWN0IGVt X2RhdGFfY2FsbGJhY2sgKmNiLCBjcHVtYXNrX3QgKnNwYW4sCj4gLQkJCQlib29sIG1pbGxpd2F0 dHMpCj4gKwkJCQlib29sIG1pY3Jvd2F0dHMpCj4gICB7Cj4gICAJcmV0dXJuIC1FSU5WQUw7Cj4g ICB9Cj4gZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9lbmVyZ3lfbW9kZWwuYyBiL2tlcm5lbC9w b3dlci9lbmVyZ3lfbW9kZWwuYwo+IGluZGV4IDZjMzczZjI5NjBlNy4uOTEwNjY4ZWM4ODM4IDEw MDY0NAo+IC0tLSBhL2tlcm5lbC9wb3dlci9lbmVyZ3lfbW9kZWwuYwo+ICsrKyBiL2tlcm5lbC9w b3dlci9lbmVyZ3lfbW9kZWwuYwo+IEBAIC0xMDgsMTAgKzEwOCwxMSBAQCBzdGF0aWMgdm9pZCBl bV9kZWJ1Z19yZW1vdmVfcGQoc3RydWN0IGRldmljZSAqZGV2KSB7fQo+ICAgCj4gICBzdGF0aWMg aW50IGVtX2NyZWF0ZV9wZXJmX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGVtX3Bl cmZfZG9tYWluICpwZCwKPiAgIAkJCQlpbnQgbnJfc3RhdGVzLCBzdHJ1Y3QgZW1fZGF0YV9jYWxs YmFjayAqY2IsCj4gLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQo+ICsJCQkJdW5zaWduZWQgbG9u ZyBmbGFncywgaW50IG51bV9kZXZzKQo+ICAgewo+ICAgCXVuc2lnbmVkIGxvbmcgcG93ZXIsIGZy ZXEsIHByZXZfZnJlcSA9IDAsIHByZXZfY29zdCA9IFVMT05HX01BWDsKPiAgIAlzdHJ1Y3QgZW1f cGVyZl9zdGF0ZSAqdGFibGU7Cj4gKwl1bnNpZ25lZCBsb25nIG1heF9jb3N0ID0gMDsKPiAgIAlp bnQgaSwgcmV0Owo+ICAgCXU2NCBmbWF4Owo+ICAgCj4gQEAgLTE0NSw3ICsxNDYsNyBAQCBzdGF0 aWMgaW50IGVtX2NyZWF0ZV9wZXJmX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGVt X3BlcmZfZG9tYWluICpwZCwKPiAgIAo+ICAgCQkvKgo+ICAgCQkgKiBUaGUgcG93ZXIgcmV0dXJu ZWQgYnkgYWN0aXZlX3N0YXRlKCkgaXMgZXhwZWN0ZWQgdG8gYmUKPiAtCQkgKiBwb3NpdGl2ZSBh bmQgdG8gZml0IGludG8gMTYgYml0cy4KPiArCQkgKiBwb3NpdGl2ZSBhbmQgYmUgaW4gcmFuZ2Uu Cj4gICAJCSAqLwo+ICAgCQlpZiAoIXBvd2VyIHx8IHBvd2VyID4gRU1fTUFYX1BPV0VSKSB7Cj4g ICAJCQlkZXZfZXJyKGRldiwgIkVNOiBpbnZhbGlkIHBvd2VyOiAlbHVcbiIsCj4gQEAgLTE3MCw3 ICsxNzEsNyBAQCBzdGF0aWMgaW50IGVtX2NyZWF0ZV9wZXJmX3RhYmxlKHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IGVtX3BlcmZfZG9tYWluICpwZCwKPiAgIAkJCQlnb3RvIGZyZWVfcHNfdGFi bGU7Cj4gICAJCQl9Cj4gICAJCX0gZWxzZSB7Cj4gLQkJCXBvd2VyX3JlcyA9IGVtX3NjYWxlX3Bv d2VyKHRhYmxlW2ldLnBvd2VyKTsKPiArCQkJcG93ZXJfcmVzID0gdGFibGVbaV0ucG93ZXI7Cj4g ICAJCQljb3N0ID0gZGl2NjRfdTY0KGZtYXggKiBwb3dlcl9yZXMsIHRhYmxlW2ldLmZyZXF1ZW5j eSk7Cj4gICAJCX0KPiAgIAo+IEBAIC0xODMsNiArMTg0LDE1IEBAIHN0YXRpYyBpbnQgZW1fY3Jl YXRlX3BlcmZfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZW1fcGVyZl9kb21haW4g KnBkLAo+ICAgCQl9IGVsc2Ugewo+ICAgCQkJcHJldl9jb3N0ID0gdGFibGVbaV0uY29zdDsKPiAg IAkJfQo+ICsKPiArCQlpZiAobWF4X2Nvc3QgPCB0YWJsZVtpXS5jb3N0KQo+ICsJCQltYXhfY29z dCA9IHRhYmxlW2ldLmNvc3Q7Cj4gKwl9Cj4gKwo+ICsJLyogQ2hlY2sgaWYgaXQgd29uJ3Qgb3Zl cmZsb3cgZHVyaW5nIGVuZXJneSBlc3RpbWF0aW9uLiAqLwo+ICsJaWYgKGVtX3ZhbGlkYXRlX2Nv c3QobWF4X2Nvc3QsIG51bV9kZXZzKSkgewoKSSdtIG5vdCBmaW5kaW5nIHRoZSBlbV92YWxpZGF0 ZV9jb3N0KCkgZnVuY3Rpb24KCj4gKwkJZGV2X2VycihkZXYsICJFTTogdG9vIGJpZyAnY29zdCcg dmFsdWU6ICVsdVxuIiwJbWF4X2Nvc3QpOwo+ICsJCWdvdG8gZnJlZV9wc190YWJsZTsKPiAgIAl9 Cj4gICAKPiAgIAlwZC0+dGFibGUgPSB0YWJsZTsKPiBAQCAtMTk5LDkgKzIwOSw5IEBAIHN0YXRp YyBpbnQgZW1fY3JlYXRlX3BkKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG5yX3N0YXRlcywKPiAg IAkJCXN0cnVjdCBlbV9kYXRhX2NhbGxiYWNrICpjYiwgY3B1bWFza190ICpjcHVzLAo+ICAgCQkJ dW5zaWduZWQgbG9uZyBmbGFncykKPiAgIHsKPiArCWludCBjcHUsIHJldCwgbnVtX2RldnMgPSAx Owo+ICAgCXN0cnVjdCBlbV9wZXJmX2RvbWFpbiAqcGQ7Cj4gICAJc3RydWN0IGRldmljZSAqY3B1 X2RldjsKPiAtCWludCBjcHUsIHJldDsKPiAgIAo+ICAgCWlmIChfaXNfY3B1X2RldmljZShkZXYp KSB7Cj4gICAJCXBkID0ga3phbGxvYyhzaXplb2YoKnBkKSArIGNwdW1hc2tfc2l6ZSgpLCBHRlBf S0VSTkVMKTsKPiBAQCAtMjA5LDEzICsyMTksMTQgQEAgc3RhdGljIGludCBlbV9jcmVhdGVfcGQo c3RydWN0IGRldmljZSAqZGV2LCBpbnQgbnJfc3RhdGVzLAo+ICAgCQkJcmV0dXJuIC1FTk9NRU07 Cj4gICAKPiAgIAkJY3B1bWFza19jb3B5KGVtX3NwYW5fY3B1cyhwZCksIGNwdXMpOwo+ICsJCW51 bV9kZXZzID0gY3B1bWFza193ZWlnaHQoY3B1cyk7CgpXaHkgaXMgdGhpcyBjaGFuZ2UgbmVlZGVk ID8gV2hhdCBpcyB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSB1VyB1bml0IGNoYW5nZSA/CgoKPiAg IAl9IGVsc2Ugewo+ICAgCQlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwo+ ICAgCQlpZiAoIXBkKQo+ICAgCQkJcmV0dXJuIC1FTk9NRU07Cj4gICAJfQo+ICAgCj4gLQlyZXQg PSBlbV9jcmVhdGVfcGVyZl90YWJsZShkZXYsIHBkLCBucl9zdGF0ZXMsIGNiLCBmbGFncyk7Cj4g KwlyZXQgPSBlbV9jcmVhdGVfcGVyZl90YWJsZShkZXYsIHBkLCBucl9zdGF0ZXMsIGNiLCBmbGFn cywgbnVtX2RldnMpOwo+ICAgCWlmIChyZXQpIHsKPiAgIAkJa2ZyZWUocGQpOwo+ICAgCQlyZXR1 cm4gcmV0Owo+IEBAIC0zMTQsMTMgKzMyNSwxMyBAQCBFWFBPUlRfU1lNQk9MX0dQTChlbV9jcHVf Z2V0KTsKPiAgICAqIEBjcHVzCTogUG9pbnRlciB0byBjcHVtYXNrX3QsIHdoaWNoIGluIGNhc2Ug b2YgYSBDUFUgZGV2aWNlIGlzCj4gICAgKgkJb2JsaWdhdG9yeS4gSXQgY2FuIGJlIHRha2VuIGZy b20gaS5lLiAncG9saWN5LT5jcHVzJy4gRm9yIG90aGVyCj4gICAgKgkJdHlwZSBvZiBkZXZpY2Vz IHRoaXMgc2hvdWxkIGJlIHNldCB0byBOVUxMLgo+IC0gKiBAbWlsbGl3YXR0cwk6IEZsYWcgaW5k aWNhdGluZyB0aGF0IHRoZSBwb3dlciB2YWx1ZXMgYXJlIGluIG1pbGxpV2F0dHMgb3IKPiArICog QG1pY3Jvd2F0dHMJOiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgcG93ZXIgdmFsdWVzIGFyZSBp biBtaWNyby1XYXR0cyBvcgo+ICAgICoJCWluIHNvbWUgb3RoZXIgc2NhbGUuIEl0IG11c3QgYmUg c2V0IHByb3Blcmx5Lgo+ICAgICoKPiAgICAqIENyZWF0ZSBFbmVyZ3kgTW9kZWwgdGFibGVzIGZv ciBhIHBlcmZvcm1hbmNlIGRvbWFpbiB1c2luZyB0aGUgY2FsbGJhY2tzCj4gICAgKiBkZWZpbmVk IGluIGNiLgo+ICAgICoKPiAtICogVGhlIEBtaWxsaXdhdHRzIGlzIGltcG9ydGFudCB0byBzZXQg d2l0aCBjb3JyZWN0IHZhbHVlLiBTb21lIGtlcm5lbAo+ICsgKiBUaGUgQG1pY3Jvd2F0dHMgaXMg aW1wb3J0YW50IHRvIHNldCB3aXRoIGNvcnJlY3QgdmFsdWUuIFNvbWUga2VybmVsCj4gICAgKiBz dWItc3lzdGVtcyBtaWdodCByZWx5IG9uIHRoaXMgZmxhZyBhbmQgY2hlY2sgaWYgYWxsIGRldmlj ZXMgaW4gdGhlIEVNIGFyZQo+ICAgICogdXNpbmcgdGhlIHNhbWUgc2NhbGUuCj4gICAgKgo+IEBA IC0zMzEsNyArMzQyLDcgQEAgRVhQT1JUX1NZTUJPTF9HUEwoZW1fY3B1X2dldCk7Cj4gICAgKi8K PiAgIGludCBlbV9kZXZfcmVnaXN0ZXJfcGVyZl9kb21haW4oc3RydWN0IGRldmljZSAqZGV2LCB1 bnNpZ25lZCBpbnQgbnJfc3RhdGVzLAo+ICAgCQkJCXN0cnVjdCBlbV9kYXRhX2NhbGxiYWNrICpj YiwgY3B1bWFza190ICpjcHVzLAo+IC0JCQkJYm9vbCBtaWxsaXdhdHRzKQo+ICsJCQkJYm9vbCBt aWNyb3dhdHRzKQo+ICAgewo+ICAgCXVuc2lnbmVkIGxvbmcgY2FwLCBwcmV2X2NhcCA9IDA7Cj4g ICAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Cj4gQEAgLTM4MSw4ICszOTIsOCBAQCBpbnQgZW1f ZGV2X3JlZ2lzdGVyX3BlcmZfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50 IG5yX3N0YXRlcywKPiAgIAkJfQo+ICAgCX0KPiAgIAo+IC0JaWYgKG1pbGxpd2F0dHMpCj4gLQkJ ZmxhZ3MgfD0gRU1fUEVSRl9ET01BSU5fTUlMTElXQVRUUzsKPiArCWlmIChtaWNyb3dhdHRzKQo+ ICsJCWZsYWdzIHw9IEVNX1BFUkZfRE9NQUlOX01JQ1JPV0FUVFM7Cj4gICAJZWxzZSBpZiAoY2It PmdldF9jb3N0KQo+ICAgCQlmbGFncyB8PSBFTV9QRVJGX0RPTUFJTl9BUlRJRklDSUFMOwo+ICAg CgoKLS0gCjxodHRwOi8vd3d3LmxpbmFyby5vcmcvPiBMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJj ZSBzb2Z0d2FyZSBmb3IgQVJNIFNvQ3MKCkZvbGxvdyBMaW5hcm86ICA8aHR0cDovL3d3dy5mYWNl Ym9vay5jb20vcGFnZXMvTGluYXJvPiBGYWNlYm9vayB8CjxodHRwOi8vdHdpdHRlci5jb20vIyEv bGluYXJvb3JnPiBUd2l0dGVyIHwKPGh0dHA6Ly93d3cubGluYXJvLm9yZy9saW5hcm8tYmxvZy8+ IEJsb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LWFybS1rZXJuZWwK