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 BDAC8C47089 for ; Thu, 1 Dec 2022 15:56:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232040AbiLAP4k (ORCPT ); Thu, 1 Dec 2022 10:56:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41680 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230366AbiLAP4h (ORCPT ); Thu, 1 Dec 2022 10:56:37 -0500 Received: from mail-ot1-x32a.google.com (mail-ot1-x32a.google.com [IPv6:2607:f8b0:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E04BFA896F; Thu, 1 Dec 2022 07:56:35 -0800 (PST) Received: by mail-ot1-x32a.google.com with SMTP id g51-20020a9d12b6000000b0066dbea0d203so1214031otg.6; Thu, 01 Dec 2022 07:56:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:subject:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:sender :from:to:cc:subject:date:message-id:reply-to; bh=YCGjYzF2+06EInqIcZCZP7MFyaDySpfz2bo8H03l0ds=; b=NFGBbL+fJfqNs3PAby8Bo7Yc6LypSLHwPDYSjDrvABwSuveD4GNg+/qwqJmNVL2VGz w7OZ+qS4Ux06CB7aKhw7NJ+4mTTnTdi9phNJFeseFEVBHNfQs1RSqkdbNnm/FeaOMWL+ quJkdsqxfSE0ArBkI5EHMk4VR2RdiXmb74tDfnkC/yKwsbVF4SnBrsHVckILfKqReGJk 3TO1CaGZHk+ulQvkMHtbAD90Lg6j8OxiEoSdSkb1vku1riKucKzDY3DHF75Dq7YmiVvK NVUxWgGZiuNBvjaUCSoJpMoNP3zdDaqBdg7Ouhbm5CmlJwZEa4YUcbgfJJA2xDENjs2k GUfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:subject:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:sender :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YCGjYzF2+06EInqIcZCZP7MFyaDySpfz2bo8H03l0ds=; b=I1NWMlpSzhuJAfFQhxFNJ8MHmNyNXlkMK40gH7XzBIzBkyzhkMs8VjWbmrvrFIOuFC 9B0KLU9F9SL3L0XErzRqL5cWByWCXWLP7/f/WTuuyYGz1+HKE/o42Xbz7JRxV9bceeSx HO+bXhpr6ujuf0rOcscYthPLZ4UmY7JqZfgYMEM0Egu79X5gAQBoROpv6Wc55wRR91KW 17BqO806I8DA9roEFAQTrsN5qJ0DZvWUGkXODzBkJxFsHTJUfmdbIz+CXJcOA31hI3Z7 GbrtG03NYUByp4NE2/YP/KBXwaGgj/RGCV/wUzJqG2JgvTPZU99D1jH8qDyaRpoJYJ15 lqTQ== X-Gm-Message-State: ANoB5pmx2ov5FojqQCQPXl3oo1KuICdcItSyu3UjkT41DabFN2gMNrWd ZExNRvfnpPYwEEvKbYHOS0w= X-Google-Smtp-Source: AA0mqf6tdHKUT0Rez3bvp+l3vt+phCcuDbgASXWtiSr3yZf+5B1lVB06h3EMKkWWCUm8erCWv1G6vA== X-Received: by 2002:a9d:2d1:0:b0:66d:c20f:2f9 with SMTP id 75-20020a9d02d1000000b0066dc20f02f9mr22993600otl.115.1669910195199; Thu, 01 Dec 2022 07:56:35 -0800 (PST) Received: from ?IPV6:2600:1700:e321:62f0:329c:23ff:fee3:9d7c? ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id f199-20020a4a58d0000000b004a084b7062asm800413oob.40.2022.12.01.07.56.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 01 Dec 2022 07:56:34 -0800 (PST) Sender: Guenter Roeck Message-ID: <0fa0cce5-47b3-90f7-7936-61409aae5c7f@roeck-us.net> Date: Thu, 1 Dec 2022 07:56:32 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: en-US To: Michal Simek , "Neeli, Srinivas" Cc: "wim@linux-watchdog.org" , "Datta, Shubhrajyoti" , "robh+dt@kernel.org" , "krzysztof.kozlowski+dt@linaro.org" , "linux-kernel@vger.kernel.org" , "linux-watchdog@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "devicetree@vger.kernel.org" , "git (AMD-Xilinx)" References: <20220927110257.41963-1-srinivas.neeli@amd.com> <20220927110257.41963-3-srinivas.neeli@amd.com> <20221002162528.GA2900147@roeck-us.net> <20221103172432.GB177861@roeck-us.net> <8bd8f53b-948e-637a-d692-78a7ac15c6df@amd.com> From: Guenter Roeck Subject: Re: [PATCH 2/3] watchdog: xilinx_wwdt: Add Versal window watchdog support In-Reply-To: <8bd8f53b-948e-637a-d692-78a7ac15c6df@amd.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 12/1/22 03:08, Michal Simek wrote: > Hi Guenter, > > On 11/6/22 16:16, Neeli, Srinivas wrote: >> Hi Guenter, >> >>> -----Original Message----- >>> From: Guenter Roeck On Behalf Of Guenter Roeck >>> Sent: Thursday, November 3, 2022 10:55 PM >>> To: Neeli, Srinivas >>> Cc: wim@linux-watchdog.org; Datta, Shubhrajyoti >>> ; Simek, Michal ; >>> robh+dt@kernel.org; krzysztof.kozlowski+dt@linaro.org; linux- >>> kernel@vger.kernel.org; linux-watchdog@vger.kernel.org; linux-arm- >>> kernel@lists.infradead.org; devicetree@vger.kernel.org; git (AMD-Xilinx) >>> >>> Subject: Re: [PATCH 2/3] watchdog: xilinx_wwdt: Add Versal window >>> watchdog support >>> >>> On Thu, Nov 03, 2022 at 04:51:14PM +0000, Neeli, Srinivas wrote: >>>> HI Guenter, >>>> >>>>> -----Original Message----- >>>>> From: Neeli, Srinivas >>>>> Sent: Tuesday, October 11, 2022 11:57 AM >>>>> To: Guenter Roeck >>>>> Cc: wim@linux-watchdog.org; Datta, Shubhrajyoti >>>>> ; Simek, Michal >>> ; >>>>> robh+dt@kernel.org; krzysztof.kozlowski+dt@linaro.org; linux- >>>>> kernel@vger.kernel.org; linux-watchdog@vger.kernel.org; linux-arm- >>>>> kernel@lists.infradead.org; devicetree@vger.kernel.org; git >>>>> (AMD-Xilinx) >>>>> Subject: RE: [PATCH 2/3] watchdog: xilinx_wwdt: Add Versal window >>>>> watchdog support >>>>> >>>>> Hi, >>>>> >>>>>> -----Original Message----- >>>>>> From: Guenter Roeck On Behalf Of Guenter >>> Roeck >>>>>> Sent: Sunday, October 2, 2022 9:55 PM >>>>>> To: Neeli, Srinivas >>>>>> Cc: wim@linux-watchdog.org; Datta, Shubhrajyoti >>>>>> ; Simek, Michal >>>>> ; >>>>>> robh+dt@kernel.org; krzysztof.kozlowski+dt@linaro.org; linux- >>>>>> kernel@vger.kernel.org; linux-watchdog@vger.kernel.org; linux-arm- >>>>>> kernel@lists.infradead.org; devicetree@vger.kernel.org; git >>>>>> (AMD-Xilinx) >>>>>> Subject: Re: [PATCH 2/3] watchdog: xilinx_wwdt: Add Versal window >>>>>> watchdog support >>>>>> >>>>>> On Tue, Sep 27, 2022 at 04:32:56PM +0530, Srinivas Neeli wrote: >>>>>>> Versal watchdog driver uses window watchdog mode. Window >>>>>>> watchdog >>>>>>> timer(WWDT) contains closed(first) and open(second) window with >>>>>>> 32 bit width. Write to the watchdog timer within predefined >>>>>>> window periods of time. This means a period that is not too soon >>>>>>> and a period that is not too late. The WWDT has to be restarted >>>>>>> within the open window time. If software tries to restart WWDT >>>>>>> outside of the open window time period, it generates a reset. >>>>>>> >>>>>>> Signed-off-by: Srinivas Neeli >>>>>>> --- >>>>>>>   drivers/watchdog/Kconfig       |  17 ++ >>>>>>>   drivers/watchdog/Makefile      |   1 + >>>>>>>   drivers/watchdog/xilinx_wwdt.c | 286 >>>>>>> +++++++++++++++++++++++++++++++++ >>>>>>>   3 files changed, 304 insertions(+)  create mode 100644 >>>>>>> drivers/watchdog/xilinx_wwdt.c >>>>>>> >>>>>>> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig >>>>>>> index >>>>>>> 688922fc4edb..9822e471b9f0 100644 >>>>>>> --- a/drivers/watchdog/Kconfig >>>>>>> +++ b/drivers/watchdog/Kconfig >>>>>>> @@ -304,6 +304,23 @@ config XILINX_WATCHDOG >>>>>>>         To compile this driver as a module, choose M here: the >>>>>>>         module will be called of_xilinx_wdt. >>>>>>> >>>>>>> +config XILINX_WINDOW_WATCHDOG >>>>>>> +    tristate "Xilinx window watchdog timer" >>>>>>> +    depends on HAS_IOMEM >>>>>>> +    select WATCHDOG_CORE >>>>>>> +    help >>>>>>> +      Window watchdog driver for the versal_wwdt ip core. >>>>>>> +      Window watchdog timer(WWDT) contains closed(first) and >>>>>>> +      open(second) window with 32 bit width. Write to the >>> watchdog >>>>>>> +      timer within predefined window periods of time. This >>> means >>>>>>> +      a period that is not too soon and a period that is not too >>>>>>> +      late. The WWDT has to be restarted within the open >>> window time. >>>>>>> +      If software tries to restart WWDT outside of the open >>> window >>>>>>> +      time period, it generates a reset. >>>>>>> + >>>>>>> +      To compile this driver as a module, choose M here: the >>>>>>> +      module will be called xilinx_wwdt. >>>>>>> + >>>>>>>   config ZIIRAVE_WATCHDOG >>>>>>>       tristate "Zodiac RAVE Watchdog Timer" >>>>>>>       depends on I2C >>>>>>> diff --git a/drivers/watchdog/Makefile >>>>>>> b/drivers/watchdog/Makefile index cdeb119e6e61..4ff96c517407 >>>>>>> 100644 >>>>>>> --- a/drivers/watchdog/Makefile >>>>>>> +++ b/drivers/watchdog/Makefile >>>>>>> @@ -155,6 +155,7 @@ obj-$(CONFIG_M54xx_WATCHDOG) += >>>>>> m54xx_wdt.o >>>>>>> >>>>>>>   # MicroBlaze Architecture >>>>>>>   obj-$(CONFIG_XILINX_WATCHDOG) += of_xilinx_wdt.o >>>>>>> +obj-$(CONFIG_XILINX_WINDOW_WATCHDOG) += xilinx_wwdt.o >>>>>>> >>>>>>>   # MIPS Architecture >>>>>>>   obj-$(CONFIG_ATH79_WDT) += ath79_wdt.o diff --git >>>>>>> a/drivers/watchdog/xilinx_wwdt.c >>>>>>> b/drivers/watchdog/xilinx_wwdt.c new file mode 100644 index >>>>>>> 000000000000..2594a01c2764 >>>>>>> --- /dev/null >>>>>>> +++ b/drivers/watchdog/xilinx_wwdt.c >>>>>>> @@ -0,0 +1,286 @@ >>>>>>> +// SPDX-License-Identifier: GPL-2.0 >>>>>>> +/* >>>>>>> + * Window watchdog device driver for Xilinx Versal WWDT >>>>>>> + * >>>>>>> + * Copyright (C) 2022, Advanced Micro Devices, Inc. >>>>>>> + */ >>>>>>> + >>>>>>> +#include >>>>>>> +#include >>>>>>> +#include >>>>>>> +#include >>>>>>> +#include >>>>>>> +#include >>>>>>> +#include >>>>>>> +#include >>>>>>> + >>>>>>> +#define XWWDT_DEFAULT_TIMEOUT    40 >>>>>>> +#define XWWDT_MIN_TIMEOUT    1 >>>>>>> +#define XWWDT_MAX_TIMEOUT    42 >>>>>>> + >>>>>>> +/* Register offsets for the WWDT device */ >>>>>>> +#define XWWDT_MWR_OFFSET    0x00 >>>>>>> +#define XWWDT_ESR_OFFSET    0x04 >>>>>>> +#define XWWDT_FCR_OFFSET    0x08 >>>>>>> +#define XWWDT_FWR_OFFSET    0x0c >>>>>>> +#define XWWDT_SWR_OFFSET    0x10 >>>>>>> + >>>>>>> +/* Master Write Control Register Masks */ >>>>>>> +#define XWWDT_MWR_MASK        BIT(0) >>>>>>> + >>>>>>> +/* Enable and Status Register Masks */ >>>>>>> +#define XWWDT_ESR_WINT_MASK    BIT(16) >>>>>>> +#define XWWDT_ESR_WSW_MASK    BIT(8) >>>>>>> +#define XWWDT_ESR_WEN_MASK    BIT(0) >>>>>>> + >>>>>>> +#define XWWDT_PERCENT        50 >>>>>>> + >>>>>>> +static int xwwdt_timeout; >>>>>>> +static int xclosed_window_percent; >>>>>>> + >>>>>>> +module_param(xwwdt_timeout, int, 0644); >>>>>>> +MODULE_PARM_DESC(xwwdt_timeout, >>>>>>> +         "Watchdog time in seconds. (default=" >>>>>>> +         __MODULE_STRING(XWWDT_DEFAULT_TIMEOUT) >>> ")"); >>>>>> >>>>>> There is no reason to make this writeable. There are means to set >>>>>> the timeout in runtime. Those should be used. >>>>> >>>>> Accepted and will update in V2. >>>>>> >>>>>>> +module_param(xclosed_window_percent, int, 0644); >>>>>>> +MODULE_PARM_DESC(xclosed_window_percent, >>>>>>> +         "Watchdog closed window percentage. (default=" >>>>>>> +         __MODULE_STRING(XWWDT_PERCENT) ")"); >>>>>> >>>>>> The above is problematic. This should really not be set during >>>>>> runtime, and the behavior is pretty much undefined if it is >>>>>> changed while the watchdog is running. It should really be set >>>>>> using devicetree and not be changed in the running system. >>>>> >>>>> Accepted and will update in V2. >>>>>> >>>>>>> + >>>>>>> +/** >>>>>>> + * struct xwwdt_device - Watchdog device structure >>>>>>> + * @base: base io address of WDT device >>>>>>> + * @spinlock: spinlock for IO register access >>>>>>> + * @xilinx_wwdt_wdd: watchdog device structure >>>>>>> + * @clk: struct clk * of a clock source >>>>>>> + * @freq: source clock frequency of WWDT  */ struct xwwdt_device { >>>>>>> +    void __iomem *base; >>>>>>> +    spinlock_t spinlock; /* spinlock for register handling */ >>>>>>> +    struct watchdog_device xilinx_wwdt_wdd; >>>>>>> +    struct clk *clk; >>>>>>> +    unsigned long    freq; >>>>>>> +}; >>>>>>> + >>>>>>> +static bool is_wwdt_in_closed_window(struct watchdog_device >>> *wdd) { >>>>>>> +    struct xwwdt_device *xdev = watchdog_get_drvdata(wdd); >>>>>>> +    u32 csr, ret; >>>>>>> + >>>>>>> +    csr = ioread32(xdev->base + XWWDT_ESR_OFFSET); >>>>>>> + >>>>>>> +    ret = (csr & XWWDT_ESR_WEN_MASK) ? !(csr & >>>>>> XWWDT_ESR_WSW_MASK) ? 0 : >>>>>>> +1 : 1; >>>>>> >>>>>> This is confusing. >>>>>> >>>>>>     return !(csr & XWWDT_ESR_WEN_MASK) || ((csr & >>>>> XWWDT_ESR_WSW_MASK); >>>>>> >>>>>> should do the same and would be easier to understand, though I am >>>>>> not sure if it is correct (making the point that the expression is >>> confusing). >>>>>> >>>>> Accepted and will update in V2. >>>>> >>>>>>> + >>>>>>> +    return ret; >>>>>>> +} >>>>>>> + >>>>>>> +static int xilinx_wwdt_start(struct watchdog_device *wdd) { >>>>>>> +    struct xwwdt_device *xdev = watchdog_get_drvdata(wdd); >>>>>>> +    struct watchdog_device *xilinx_wwdt_wdd = &xdev- >>>>>>> xilinx_wwdt_wdd; >>>>>>> +    u64 time_out, closed_timeout, open_timeout; >>>>>>> +    u32 control_status_reg; >>>>>>> + >>>>>>> +    /* Calculate timeout count */ >>>>>>> +    time_out = xdev->freq * wdd->timeout; >>>>>>> + >>>>>>> +    if (xclosed_window_percent) { >>>>>>> +        closed_timeout = (time_out * >>> xclosed_window_percent) / >>>>>> 100; >>>>>>> +        open_timeout = time_out - closed_timeout; >>>>>>> +        wdd->min_hw_heartbeat_ms = >>> xclosed_window_percent * >>>>>> 10 * wdd->timeout; >>>>>>> +    } else { >>>>>>> +        /* Calculate 50% of timeout */ >>>>>> >>>>>> Isn't that a bit random ? >>>>> >>>>> Versal Window watchdog IP supports below features. >>>>>   1)Start >>>>>   2)Stop >>>>>   3)Configure Timeout >>>>>   4)Refresh >>>>> >>>>> Planning to take closed window percentage from device tree parameter. >>>>> If the user hasn't passed the closed window percentage from the >>>>> device tree, by default, taking XWWDT_PERCENT value which is 50. >>>>> >> >> Does above explanation looks fine to you ? >> >>>>>> >>>>>>> +        time_out *= XWWDT_PERCENT; >>>>>>> +        time_out /= 100; >>>>>>> +        wdd->min_hw_heartbeat_ms = XWWDT_PERCENT * >>> 10 * >>>>>> wdd->timeout; >>>>>> >>>>>> min_hw_heartbeat_ms is supposed to be fixed after probe. Behavior >>>>>> of changing it when starting the watchdog is undefined. This will >>>>>> likely fail under some conditions. >>>>> >>>>> As I said in above comments versal watchdog IP supports >>>>> reconfiguration of timeout, so every restart we are updating >>>>> min_hw_heartbeat_ms based on timeout. >>>>> >> >> After stop we are reconfiguring the min_hw_heartbeat_ms, do you think still it will fail ?. >> >>>>>> >>>>>>> +    } >>>>>>> + >>>>>>> +    spin_lock(&xdev->spinlock); >>>>>>> + >>>>>>> +    iowrite32(XWWDT_MWR_MASK, xdev->base + >>>>>> XWWDT_MWR_OFFSET); >>>>>>> +    iowrite32(~(u32)XWWDT_ESR_WEN_MASK, xdev->base + >>>>>> XWWDT_ESR_OFFSET); >>>>>>> + >>>>>>> +    if (xclosed_window_percent) { >>>>>>> +        iowrite32((u32)closed_timeout, xdev->base + >>>>>> XWWDT_FWR_OFFSET); >>>>>>> +        iowrite32((u32)open_timeout, xdev->base + >>>>>> XWWDT_SWR_OFFSET); >>>>>>> +    } else { >>>>>>> +        /* Configure closed and open windows with 50% of >>> timeout >>>>>> */ >>>>>>> +        iowrite32((u32)time_out, xdev->base + >>>>>> XWWDT_FWR_OFFSET); >>>>>>> +        iowrite32((u32)time_out, xdev->base + >>>>>> XWWDT_SWR_OFFSET); >>>>>>> +    } >>>>>> >>>>>> This if/else should not be necessary by using appropriate >>>>>> calculations >>>>> above. >>>>>> Anyway, this is moot - as said above, changing min_hw_heartbeat_ms >>>>>> after probe is unexpected, and the code will have to be changed to >>>>>> use a fixed value for the window size. With that, all calculations >>>>>> can and should be done in the probe function. >>>>>> >>>>>>> + >>>>>>> +    /* Enable the window watchdog timer */ >>>>>>> +    control_status_reg = ioread32(xdev->base + >>> XWWDT_ESR_OFFSET); >>>>>>> +    control_status_reg |= XWWDT_ESR_WEN_MASK; >>>>>>> +    iowrite32(control_status_reg, xdev->base + >>> XWWDT_ESR_OFFSET); >>>>>> >>>>>> Why is this enabled unconditionally ? I would assume that a user >>>>>> specifying a 0-percentage window size doesn't want it enabled. >>>>> >>>>> Plan to add a check for closed window percentage. If user tries to >>>>> configure 100% of closed window, driver configures XWWDT_PERCENT >>> value. >>>>> Configuring 100% of closed window not suggestible. >>>>> >> >> Do you have any feedback on above explanation ?. >> >>>>>> >>>>>>> + >>>>>>> +    spin_unlock(&xdev->spinlock); >>>>>>> + >>>>>>> +    dev_dbg(xilinx_wwdt_wdd->parent, "Watchdog Started!\n"); >>>>>>> + >>>>>>> +    return 0; >>>>>>> +} >>>>>>> + >>>>>>> +static int xilinx_wwdt_keepalive(struct watchdog_device *wdd) { >>>>>>> +    struct xwwdt_device *xdev = watchdog_get_drvdata(wdd); >>>>>>> +    u32 control_status_reg; >>>>>>> + >>>>>>> +    spin_lock(&xdev->spinlock); >>>>>>> + >>>>>>> +    /* Enable write access control bit for the window watchdog >>> */ >>>>>>> +    iowrite32(XWWDT_MWR_MASK, xdev->base + >>>>>> XWWDT_MWR_OFFSET); >>>>>>> + >>>>>>> +    /* Trigger restart kick to watchdog */ >>>>>>> +    control_status_reg = ioread32(xdev->base + >>> XWWDT_ESR_OFFSET); >>>>>>> +    control_status_reg |= XWWDT_ESR_WSW_MASK; >>>>>>> +    iowrite32(control_status_reg, xdev->base + >>> XWWDT_ESR_OFFSET); >>>>>>> + >>>>>>> +    spin_unlock(&xdev->spinlock); >>>>>>> + >>>>>>> +    return 0; >>>>>>> +} >>>>>>> + >>>>>>> +static int xilinx_wwdt_set_timeout(struct watchdog_device *wdd, >>>>>>> +                   unsigned int new_time) >>>>>>> +{ >>>>>>> +    struct xwwdt_device *xdev = watchdog_get_drvdata(wdd); >>>>>>> +    struct watchdog_device *xilinx_wwdt_wdd = &xdev- >>>>>>> xilinx_wwdt_wdd; >>>>>>> + >>>>>>> +    if (watchdog_active(xilinx_wwdt_wdd)) >>>>>>> +        return -EPERM; >>>>>> >>>>>> Why ? This will be the most common case and means to change the >>>>> timeout. >>>>> >>>>> Versal Watchdog supports reconfiguration of timeout. If we try to >>>>> reconfigure timeout without stopping the watchdog, driver returns >>>>> error immediately. Reconfiguration of timeout, Stop and Refresh not >>>>> allowed in closed window. >>>>> User can trigger set timeout any point of time, So avoiding >>>>> reconfiguring the timeout feature using driver API if the watchdog is >>> active. >>>>> >> >> Please share your comments on this. >> > > I see that there are still some pending questions on this thread. > Could you please take a look at it? > If you think that would be better to send v2 and better describe the problematic parts as the part of commit message that should be also fine. > I can only decode the comment on the bottom. I think that problem needs a better solution. Returning -EPERM is definitely wrong here. How would you expect userspace to react on it ? Expecting userspace to stop the watchdog before updating the timeout is not acceptable; that is not defined in the ABI, and we can not expect watchdog daemons to know about it. You could, for example: - stop the watchdog, update the timeout, and restart it. That is less than perfect, but other drivers with similar limitations do it as well. - Mark the timeout update as pending, and update it in the permitted window (if that is possible; the above comment is vague on that). Guenter 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 36AFEC43217 for ; Thu, 1 Dec 2022 15:57:45 +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:Subject:From:References:Cc:To: 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=/myor7OpTZbtAFDJ3wnZtVy2NdlHbrwnV9qrSFa4/1w=; b=zrxkimTGQRK7jY Q8F2mYSCVlGaGWyjkxcxOYSwTfIseH6wYGBv2d2PzHyJvM/Jhj+SRk/Vb7TzCckK1uR2ubC7D5H+G kpJ8fYhHyDa5YDijuaQR89DPPe8NveJcCQSOp3bxFjpGM4w7mFhDcKLayYZjZeR+Tm2VBNlvUaTxT m2Bo/+WiIK2DUVYOgRJ5fGp9C7zJIB/PAt3JjuQ7neGd+WRFQBZLVJMSHWUqvmC4GC//6yCeRwgS9 sdH6Jff+LEpnKqp7sTDSDyypwQxauvfppm/ysesvVY2sxMjAtKiygw/RpKHZDtVcEcK2HooT21f68 /8a7rfZsTXVHnJb0CeiQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1p0lvV-008OL4-NB; Thu, 01 Dec 2022 15:56:41 +0000 Received: from mail-ot1-x32e.google.com ([2607:f8b0:4864:20::32e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1p0lvR-008OIO-M7 for linux-arm-kernel@lists.infradead.org; Thu, 01 Dec 2022 15:56:40 +0000 Received: by mail-ot1-x32e.google.com with SMTP id a7-20020a056830008700b0066c82848060so1215222oto.4 for ; Thu, 01 Dec 2022 07:56:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:subject:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:sender :from:to:cc:subject:date:message-id:reply-to; bh=YCGjYzF2+06EInqIcZCZP7MFyaDySpfz2bo8H03l0ds=; b=NFGBbL+fJfqNs3PAby8Bo7Yc6LypSLHwPDYSjDrvABwSuveD4GNg+/qwqJmNVL2VGz w7OZ+qS4Ux06CB7aKhw7NJ+4mTTnTdi9phNJFeseFEVBHNfQs1RSqkdbNnm/FeaOMWL+ quJkdsqxfSE0ArBkI5EHMk4VR2RdiXmb74tDfnkC/yKwsbVF4SnBrsHVckILfKqReGJk 3TO1CaGZHk+ulQvkMHtbAD90Lg6j8OxiEoSdSkb1vku1riKucKzDY3DHF75Dq7YmiVvK NVUxWgGZiuNBvjaUCSoJpMoNP3zdDaqBdg7Ouhbm5CmlJwZEa4YUcbgfJJA2xDENjs2k GUfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:subject:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:sender :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YCGjYzF2+06EInqIcZCZP7MFyaDySpfz2bo8H03l0ds=; b=UqL03HOluWLzbCrrTqkJ12i/9HgDW+VkTMMIexXFE3N8Mq0A5eV8oB4h/xiuhctAVE 0ff/GPuA5t+6VlRAveLyKd8ZOKg84qwGIFCEPU94wf9jltDDYETieDcOiTL36dAcLsEm fssTXCjlFl4FTBVPzG2SM3OooGXIvCAx3NaN9523rLSY21sNIMubSF1Az89TNfW7xqB3 aaOBsaZ2qvWDcCPvt8yGLoeOCj4Y1TBWPH/8uRskBjcqoMib9tk3xjCSdwiGbWkTiL4t FbkzkR5qLjNpyfppVgIircnbo596WSsuMh9zt0qOWD3O3GB6j8iZk/5r5EIP4g3krXcM a1Jw== X-Gm-Message-State: ANoB5pkm8E954tRByQA3AjukzKxQjH35zoKJZ0bKvApwg80tFVLEOeD+ 9KR3CEvdMzdd+nTfYKBNc9k= X-Google-Smtp-Source: AA0mqf6tdHKUT0Rez3bvp+l3vt+phCcuDbgASXWtiSr3yZf+5B1lVB06h3EMKkWWCUm8erCWv1G6vA== X-Received: by 2002:a9d:2d1:0:b0:66d:c20f:2f9 with SMTP id 75-20020a9d02d1000000b0066dc20f02f9mr22993600otl.115.1669910195199; Thu, 01 Dec 2022 07:56:35 -0800 (PST) Received: from ?IPV6:2600:1700:e321:62f0:329c:23ff:fee3:9d7c? ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id f199-20020a4a58d0000000b004a084b7062asm800413oob.40.2022.12.01.07.56.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 01 Dec 2022 07:56:34 -0800 (PST) Message-ID: <0fa0cce5-47b3-90f7-7936-61409aae5c7f@roeck-us.net> Date: Thu, 1 Dec 2022 07:56:32 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: en-US To: Michal Simek , "Neeli, Srinivas" Cc: "wim@linux-watchdog.org" , "Datta, Shubhrajyoti" , "robh+dt@kernel.org" , "krzysztof.kozlowski+dt@linaro.org" , "linux-kernel@vger.kernel.org" , "linux-watchdog@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "devicetree@vger.kernel.org" , "git (AMD-Xilinx)" References: <20220927110257.41963-1-srinivas.neeli@amd.com> <20220927110257.41963-3-srinivas.neeli@amd.com> <20221002162528.GA2900147@roeck-us.net> <20221103172432.GB177861@roeck-us.net> <8bd8f53b-948e-637a-d692-78a7ac15c6df@amd.com> From: Guenter Roeck Subject: Re: [PATCH 2/3] watchdog: xilinx_wwdt: Add Versal window watchdog support In-Reply-To: <8bd8f53b-948e-637a-d692-78a7ac15c6df@amd.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221201_075637_820742_1D7913D1 X-CRM114-Status: GOOD ( 31.12 ) 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 T24gMTIvMS8yMiAwMzowOCwgTWljaGFsIFNpbWVrIHdyb3RlOgo+IEhpIEd1ZW50ZXIsCj4gCj4g T24gMTEvNi8yMiAxNjoxNiwgTmVlbGksIFNyaW5pdmFzIHdyb3RlOgo+PiBIaSBHdWVudGVyLAo+ Pgo+Pj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+IEZyb206IEd1ZW50ZXIgUm9lY2sg PGdyb2VjazdAZ21haWwuY29tPiBPbiBCZWhhbGYgT2YgR3VlbnRlciBSb2Vjawo+Pj4gU2VudDog VGh1cnNkYXksIE5vdmVtYmVyIDMsIDIwMjIgMTA6NTUgUE0KPj4+IFRvOiBOZWVsaSwgU3Jpbml2 YXMgPHNyaW5pdmFzLm5lZWxpQGFtZC5jb20+Cj4+PiBDYzogd2ltQGxpbnV4LXdhdGNoZG9nLm9y ZzsgRGF0dGEsIFNodWJocmFqeW90aQo+Pj4gPHNodWJocmFqeW90aS5kYXR0YUBhbWQuY29tPjsg U2ltZWssIE1pY2hhbCA8bWljaGFsLnNpbWVrQGFtZC5jb20+Owo+Pj4gcm9iaCtkdEBrZXJuZWwu b3JnOyBrcnp5c3p0b2Yua296bG93c2tpK2R0QGxpbmFyby5vcmc7IGxpbnV4LQo+Pj4ga2VybmVs QHZnZXIua2VybmVsLm9yZzsgbGludXgtd2F0Y2hkb2dAdmdlci5rZXJuZWwub3JnOyBsaW51eC1h cm0tCj4+PiBrZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsgZGV2aWNldHJlZUB2Z2VyLmtlcm5l bC5vcmc7IGdpdCAoQU1ELVhpbGlueCkKPj4+IDxnaXRAYW1kLmNvbT4KPj4+IFN1YmplY3Q6IFJl OiBbUEFUQ0ggMi8zXSB3YXRjaGRvZzogeGlsaW54X3d3ZHQ6IEFkZCBWZXJzYWwgd2luZG93Cj4+ PiB3YXRjaGRvZyBzdXBwb3J0Cj4+Pgo+Pj4gT24gVGh1LCBOb3YgMDMsIDIwMjIgYXQgMDQ6NTE6 MTRQTSArMDAwMCwgTmVlbGksIFNyaW5pdmFzIHdyb3RlOgo+Pj4+IEhJIEd1ZW50ZXIsCj4+Pj4K Pj4+Pj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+Pj4gRnJvbTogTmVlbGksIFNyaW5p dmFzIDxzcmluaXZhcy5uZWVsaUBhbWQuY29tPgo+Pj4+PiBTZW50OiBUdWVzZGF5LCBPY3RvYmVy IDExLCAyMDIyIDExOjU3IEFNCj4+Pj4+IFRvOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11 cy5uZXQ+Cj4+Pj4+IENjOiB3aW1AbGludXgtd2F0Y2hkb2cub3JnOyBEYXR0YSwgU2h1YmhyYWp5 b3RpCj4+Pj4+IDxzaHViaHJhanlvdGkuZGF0dGFAYW1kLmNvbT47IFNpbWVrLCBNaWNoYWwKPj4+ IDxtaWNoYWwuc2ltZWtAYW1kLmNvbT47Cj4+Pj4+IHJvYmgrZHRAa2VybmVsLm9yZzsga3J6eXN6 dG9mLmtvemxvd3NraStkdEBsaW5hcm8ub3JnOyBsaW51eC0KPj4+Pj4ga2VybmVsQHZnZXIua2Vy bmVsLm9yZzsgbGludXgtd2F0Y2hkb2dAdmdlci5rZXJuZWwub3JnOyBsaW51eC1hcm0tCj4+Pj4+ IGtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsg Z2l0Cj4+Pj4+IChBTUQtWGlsaW54KSA8Z2l0QGFtZC5jb20+Cj4+Pj4+IFN1YmplY3Q6IFJFOiBb UEFUQ0ggMi8zXSB3YXRjaGRvZzogeGlsaW54X3d3ZHQ6IEFkZCBWZXJzYWwgd2luZG93Cj4+Pj4+ IHdhdGNoZG9nIHN1cHBvcnQKPj4+Pj4KPj4+Pj4gSGksCj4+Pj4+Cj4+Pj4+PiAtLS0tLU9yaWdp bmFsIE1lc3NhZ2UtLS0tLQo+Pj4+Pj4gRnJvbTogR3VlbnRlciBSb2VjayA8Z3JvZWNrN0BnbWFp bC5jb20+IE9uIEJlaGFsZiBPZiBHdWVudGVyCj4+PiBSb2Vjawo+Pj4+Pj4gU2VudDogU3VuZGF5 LCBPY3RvYmVyIDIsIDIwMjIgOTo1NSBQTQo+Pj4+Pj4gVG86IE5lZWxpLCBTcmluaXZhcyA8c3Jp bml2YXMubmVlbGlAYW1kLmNvbT4KPj4+Pj4+IENjOiB3aW1AbGludXgtd2F0Y2hkb2cub3JnOyBE YXR0YSwgU2h1YmhyYWp5b3RpCj4+Pj4+PiA8c2h1YmhyYWp5b3RpLmRhdHRhQGFtZC5jb20+OyBT aW1laywgTWljaGFsCj4+Pj4+IDxtaWNoYWwuc2ltZWtAYW1kLmNvbT47Cj4+Pj4+PiByb2JoK2R0 QGtlcm5lbC5vcmc7IGtyenlzenRvZi5rb3psb3dza2krZHRAbGluYXJvLm9yZzsgbGludXgtCj4+ Pj4+PiBrZXJuZWxAdmdlci5rZXJuZWwub3JnOyBsaW51eC13YXRjaGRvZ0B2Z2VyLmtlcm5lbC5v cmc7IGxpbnV4LWFybS0KPj4+Pj4+IGtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBkZXZpY2V0 cmVlQHZnZXIua2VybmVsLm9yZzsgZ2l0Cj4+Pj4+PiAoQU1ELVhpbGlueCkgPGdpdEBhbWQuY29t Pgo+Pj4+Pj4gU3ViamVjdDogUmU6IFtQQVRDSCAyLzNdIHdhdGNoZG9nOiB4aWxpbnhfd3dkdDog QWRkIFZlcnNhbCB3aW5kb3cKPj4+Pj4+IHdhdGNoZG9nIHN1cHBvcnQKPj4+Pj4+Cj4+Pj4+PiBP biBUdWUsIFNlcCAyNywgMjAyMiBhdCAwNDozMjo1NlBNICswNTMwLCBTcmluaXZhcyBOZWVsaSB3 cm90ZToKPj4+Pj4+PiBWZXJzYWwgd2F0Y2hkb2cgZHJpdmVyIHVzZXMgd2luZG93IHdhdGNoZG9n IG1vZGUuIFdpbmRvdwo+Pj4+Pj4+IHdhdGNoZG9nCj4+Pj4+Pj4gdGltZXIoV1dEVCkgY29udGFp bnMgY2xvc2VkKGZpcnN0KSBhbmQgb3BlbihzZWNvbmQpIHdpbmRvdyB3aXRoCj4+Pj4+Pj4gMzIg Yml0IHdpZHRoLiBXcml0ZSB0byB0aGUgd2F0Y2hkb2cgdGltZXIgd2l0aGluIHByZWRlZmluZWQK Pj4+Pj4+PiB3aW5kb3cgcGVyaW9kcyBvZiB0aW1lLiBUaGlzIG1lYW5zIGEgcGVyaW9kIHRoYXQg aXMgbm90IHRvbyBzb29uCj4+Pj4+Pj4gYW5kIGEgcGVyaW9kIHRoYXQgaXMgbm90IHRvbyBsYXRl LiBUaGUgV1dEVCBoYXMgdG8gYmUgcmVzdGFydGVkCj4+Pj4+Pj4gd2l0aGluIHRoZSBvcGVuIHdp bmRvdyB0aW1lLiBJZiBzb2Z0d2FyZSB0cmllcyB0byByZXN0YXJ0IFdXRFQKPj4+Pj4+PiBvdXRz aWRlIG9mIHRoZSBvcGVuIHdpbmRvdyB0aW1lIHBlcmlvZCwgaXQgZ2VuZXJhdGVzIGEgcmVzZXQu Cj4+Pj4+Pj4KPj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBTcmluaXZhcyBOZWVsaSA8c3Jpbml2YXMu bmVlbGlAYW1kLmNvbT4KPj4+Pj4+PiAtLS0KPj4+Pj4+PiDCoCBkcml2ZXJzL3dhdGNoZG9nL0tj b25maWfCoMKgwqDCoMKgwqAgfMKgIDE3ICsrCj4+Pj4+Pj4gwqAgZHJpdmVycy93YXRjaGRvZy9N YWtlZmlsZcKgwqDCoMKgwqAgfMKgwqAgMSArCj4+Pj4+Pj4gwqAgZHJpdmVycy93YXRjaGRvZy94 aWxpbnhfd3dkdC5jIHwgMjg2Cj4+Pj4+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4+Pj4+Pj4gwqAgMyBmaWxlcyBjaGFuZ2VkLCAzMDQgaW5zZXJ0aW9ucygrKcKgIGNyZWF0 ZSBtb2RlIDEwMDY0NAo+Pj4+Pj4+IGRyaXZlcnMvd2F0Y2hkb2cveGlsaW54X3d3ZHQuYwo+Pj4+ Pj4+Cj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZl cnMvd2F0Y2hkb2cvS2NvbmZpZwo+Pj4+Pj4+IGluZGV4Cj4+Pj4+Pj4gNjg4OTIyZmM0ZWRiLi45 ODIyZTQ3MWI5ZjAgMTAwNjQ0Cj4+Pj4+Pj4gLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmln Cj4+Pj4+Pj4gKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCj4+Pj4+Pj4gQEAgLTMwNCw2 ICszMDQsMjMgQEAgY29uZmlnIFhJTElOWF9XQVRDSERPRwo+Pj4+Pj4+IMKgwqDCoMKgwqDCoMKg IFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQo+ Pj4+Pj4+IMKgwqDCoMKgwqDCoMKgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvZl94aWxpbnhfd2R0 Lgo+Pj4+Pj4+Cj4+Pj4+Pj4gK2NvbmZpZyBYSUxJTlhfV0lORE9XX1dBVENIRE9HCj4+Pj4+Pj4g K8KgwqDCoCB0cmlzdGF0ZSAiWGlsaW54IHdpbmRvdyB3YXRjaGRvZyB0aW1lciIKPj4+Pj4+PiAr wqDCoMKgIGRlcGVuZHMgb24gSEFTX0lPTUVNCj4+Pj4+Pj4gK8KgwqDCoCBzZWxlY3QgV0FUQ0hE T0dfQ09SRQo+Pj4+Pj4+ICvCoMKgwqAgaGVscAo+Pj4+Pj4+ICvCoMKgwqDCoMKgIFdpbmRvdyB3 YXRjaGRvZyBkcml2ZXIgZm9yIHRoZSB2ZXJzYWxfd3dkdCBpcCBjb3JlLgo+Pj4+Pj4+ICvCoMKg wqDCoMKgIFdpbmRvdyB3YXRjaGRvZyB0aW1lcihXV0RUKSBjb250YWlucyBjbG9zZWQoZmlyc3Qp IGFuZAo+Pj4+Pj4+ICvCoMKgwqDCoMKgIG9wZW4oc2Vjb25kKSB3aW5kb3cgd2l0aCAzMiBiaXQg d2lkdGguIFdyaXRlIHRvIHRoZQo+Pj4gd2F0Y2hkb2cKPj4+Pj4+PiArwqDCoMKgwqDCoCB0aW1l ciB3aXRoaW4gcHJlZGVmaW5lZCB3aW5kb3cgcGVyaW9kcyBvZiB0aW1lLiBUaGlzCj4+PiBtZWFu cwo+Pj4+Pj4+ICvCoMKgwqDCoMKgIGEgcGVyaW9kIHRoYXQgaXMgbm90IHRvbyBzb29uIGFuZCBh IHBlcmlvZCB0aGF0IGlzIG5vdCB0b28KPj4+Pj4+PiArwqDCoMKgwqDCoCBsYXRlLiBUaGUgV1dE VCBoYXMgdG8gYmUgcmVzdGFydGVkIHdpdGhpbiB0aGUgb3Blbgo+Pj4gd2luZG93IHRpbWUuCj4+ Pj4+Pj4gK8KgwqDCoMKgwqAgSWYgc29mdHdhcmUgdHJpZXMgdG8gcmVzdGFydCBXV0RUIG91dHNp ZGUgb2YgdGhlIG9wZW4KPj4+IHdpbmRvdwo+Pj4+Pj4+ICvCoMKgwqDCoMKgIHRpbWUgcGVyaW9k LCBpdCBnZW5lcmF0ZXMgYSByZXNldC4KPj4+Pj4+PiArCj4+Pj4+Pj4gK8KgwqDCoMKgwqAgVG8g Y29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCj4+Pj4+ Pj4gK8KgwqDCoMKgwqAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHhpbGlueF93d2R0Lgo+Pj4+Pj4+ ICsKPj4+Pj4+PiDCoCBjb25maWcgWklJUkFWRV9XQVRDSERPRwo+Pj4+Pj4+IMKgwqDCoMKgwqAg dHJpc3RhdGUgIlpvZGlhYyBSQVZFIFdhdGNoZG9nIFRpbWVyIgo+Pj4+Pj4+IMKgwqDCoMKgwqAg ZGVwZW5kcyBvbiBJMkMKPj4+Pj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9NYWtl ZmlsZQo+Pj4+Pj4+IGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZSBpbmRleCBjZGViMTE5ZTZl NjEuLjRmZjk2YzUxNzQwNwo+Pj4+Pj4+IDEwMDY0NAo+Pj4+Pj4+IC0tLSBhL2RyaXZlcnMvd2F0 Y2hkb2cvTWFrZWZpbGUKPj4+Pj4+PiArKysgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCj4+ Pj4+Pj4gQEAgLTE1NSw2ICsxNTUsNyBAQCBvYmotJChDT05GSUdfTTU0eHhfV0FUQ0hET0cpICs9 Cj4+Pj4+PiBtNTR4eF93ZHQubwo+Pj4+Pj4+Cj4+Pj4+Pj4gwqAgIyBNaWNyb0JsYXplIEFyY2hp dGVjdHVyZQo+Pj4+Pj4+IMKgIG9iai0kKENPTkZJR19YSUxJTlhfV0FUQ0hET0cpICs9IG9mX3hp bGlueF93ZHQubwo+Pj4+Pj4+ICtvYmotJChDT05GSUdfWElMSU5YX1dJTkRPV19XQVRDSERPRykg Kz0geGlsaW54X3d3ZHQubwo+Pj4+Pj4+Cj4+Pj4+Pj4gwqAgIyBNSVBTIEFyY2hpdGVjdHVyZQo+ Pj4+Pj4+IMKgIG9iai0kKENPTkZJR19BVEg3OV9XRFQpICs9IGF0aDc5X3dkdC5vIGRpZmYgLS1n aXQKPj4+Pj4+PiBhL2RyaXZlcnMvd2F0Y2hkb2cveGlsaW54X3d3ZHQuYwo+Pj4+Pj4+IGIvZHJp dmVycy93YXRjaGRvZy94aWxpbnhfd3dkdC5jIG5ldyBmaWxlIG1vZGUgMTAwNjQ0IGluZGV4Cj4+ Pj4+Pj4gMDAwMDAwMDAwMDAwLi4yNTk0YTAxYzI3NjQKPj4+Pj4+PiAtLS0gL2Rldi9udWxsCj4+ Pj4+Pj4gKysrIGIvZHJpdmVycy93YXRjaGRvZy94aWxpbnhfd3dkdC5jCj4+Pj4+Pj4gQEAgLTAs MCArMSwyODYgQEAKPj4+Pj4+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAK Pj4+Pj4+PiArLyoKPj4+Pj4+PiArICogV2luZG93IHdhdGNoZG9nIGRldmljZSBkcml2ZXIgZm9y IFhpbGlueCBWZXJzYWwgV1dEVAo+Pj4+Pj4+ICsgKgo+Pj4+Pj4+ICsgKiBDb3B5cmlnaHQgKEMp IDIwMjIsIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KPj4+Pj4+PiArICovCj4+Pj4+Pj4g Kwo+Pj4+Pj4+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4+Pj4+Pj4gKyNpbmNsdWRlIDxsaW51 eC9pbnRlcnJ1cHQuaD4KPj4+Pj4+PiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4+Pj4+Pj4gKyNp bmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KPj4+Pj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o Pgo+Pj4+Pj4+ICsjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4+Pj4+Pj4gKyNpbmNsdWRl IDxsaW51eC9vZl9hZGRyZXNzLmg+Cj4+Pj4+Pj4gKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5o Pgo+Pj4+Pj4+ICsKPj4+Pj4+PiArI2RlZmluZSBYV1dEVF9ERUZBVUxUX1RJTUVPVVTCoMKgwqAg NDAKPj4+Pj4+PiArI2RlZmluZSBYV1dEVF9NSU5fVElNRU9VVMKgwqDCoCAxCj4+Pj4+Pj4gKyNk ZWZpbmUgWFdXRFRfTUFYX1RJTUVPVVTCoMKgwqAgNDIKPj4+Pj4+PiArCj4+Pj4+Pj4gKy8qIFJl Z2lzdGVyIG9mZnNldHMgZm9yIHRoZSBXV0RUIGRldmljZSAqLwo+Pj4+Pj4+ICsjZGVmaW5lIFhX V0RUX01XUl9PRkZTRVTCoMKgwqAgMHgwMAo+Pj4+Pj4+ICsjZGVmaW5lIFhXV0RUX0VTUl9PRkZT RVTCoMKgwqAgMHgwNAo+Pj4+Pj4+ICsjZGVmaW5lIFhXV0RUX0ZDUl9PRkZTRVTCoMKgwqAgMHgw OAo+Pj4+Pj4+ICsjZGVmaW5lIFhXV0RUX0ZXUl9PRkZTRVTCoMKgwqAgMHgwYwo+Pj4+Pj4+ICsj ZGVmaW5lIFhXV0RUX1NXUl9PRkZTRVTCoMKgwqAgMHgxMAo+Pj4+Pj4+ICsKPj4+Pj4+PiArLyog TWFzdGVyIFdyaXRlIENvbnRyb2wgUmVnaXN0ZXIgTWFza3MgKi8KPj4+Pj4+PiArI2RlZmluZSBY V1dEVF9NV1JfTUFTS8KgwqDCoMKgwqDCoMKgIEJJVCgwKQo+Pj4+Pj4+ICsKPj4+Pj4+PiArLyog RW5hYmxlIGFuZCBTdGF0dXMgUmVnaXN0ZXIgTWFza3MgKi8KPj4+Pj4+PiArI2RlZmluZSBYV1dE VF9FU1JfV0lOVF9NQVNLwqDCoMKgIEJJVCgxNikKPj4+Pj4+PiArI2RlZmluZSBYV1dEVF9FU1Jf V1NXX01BU0vCoMKgwqAgQklUKDgpCj4+Pj4+Pj4gKyNkZWZpbmUgWFdXRFRfRVNSX1dFTl9NQVNL wqDCoMKgIEJJVCgwKQo+Pj4+Pj4+ICsKPj4+Pj4+PiArI2RlZmluZSBYV1dEVF9QRVJDRU5UwqDC oMKgwqDCoMKgwqAgNTAKPj4+Pj4+PiArCj4+Pj4+Pj4gK3N0YXRpYyBpbnQgeHd3ZHRfdGltZW91 dDsKPj4+Pj4+PiArc3RhdGljIGludCB4Y2xvc2VkX3dpbmRvd19wZXJjZW50Owo+Pj4+Pj4+ICsK Pj4+Pj4+PiArbW9kdWxlX3BhcmFtKHh3d2R0X3RpbWVvdXQsIGludCwgMDY0NCk7Cj4+Pj4+Pj4g K01PRFVMRV9QQVJNX0RFU0MoeHd3ZHRfdGltZW91dCwKPj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDC oCAiV2F0Y2hkb2cgdGltZSBpbiBzZWNvbmRzLiAoZGVmYXVsdD0iCj4+Pj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqAgX19NT0RVTEVfU1RSSU5HKFhXV0RUX0RFRkFVTFRfVElNRU9VVCkKPj4+ICIpIik7 Cj4+Pj4+Pgo+Pj4+Pj4gVGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2UgdGhpcyB3cml0ZWFibGUu IFRoZXJlIGFyZSBtZWFucyB0byBzZXQKPj4+Pj4+IHRoZSB0aW1lb3V0IGluIHJ1bnRpbWUuIFRo b3NlIHNob3VsZCBiZSB1c2VkLgo+Pj4+Pgo+Pj4+PiBBY2NlcHRlZCBhbmQgd2lsbCB1cGRhdGUg aW4gVjIuCj4+Pj4+Pgo+Pj4+Pj4+ICttb2R1bGVfcGFyYW0oeGNsb3NlZF93aW5kb3dfcGVyY2Vu dCwgaW50LCAwNjQ0KTsKPj4+Pj4+PiArTU9EVUxFX1BBUk1fREVTQyh4Y2xvc2VkX3dpbmRvd19w ZXJjZW50LAo+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICJXYXRjaGRvZyBjbG9zZWQgd2luZG93 IHBlcmNlbnRhZ2UuIChkZWZhdWx0PSIKPj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoCBfX01PRFVM RV9TVFJJTkcoWFdXRFRfUEVSQ0VOVCkgIikiKTsKPj4+Pj4+Cj4+Pj4+PiBUaGUgYWJvdmUgaXMg cHJvYmxlbWF0aWMuIFRoaXMgc2hvdWxkIHJlYWxseSBub3QgYmUgc2V0IGR1cmluZwo+Pj4+Pj4g cnVudGltZSwgYW5kIHRoZSBiZWhhdmlvciBpcyBwcmV0dHkgbXVjaCB1bmRlZmluZWQgaWYgaXQg aXMKPj4+Pj4+IGNoYW5nZWQgd2hpbGUgdGhlIHdhdGNoZG9nIGlzIHJ1bm5pbmcuIEl0IHNob3Vs ZCByZWFsbHkgYmUgc2V0Cj4+Pj4+PiB1c2luZyBkZXZpY2V0cmVlIGFuZCBub3QgYmUgY2hhbmdl ZCBpbiB0aGUgcnVubmluZyBzeXN0ZW0uCj4+Pj4+Cj4+Pj4+IEFjY2VwdGVkIGFuZCB3aWxsIHVw ZGF0ZSBpbiBWMi4KPj4+Pj4+Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICsvKioKPj4+Pj4+PiArICogc3Ry dWN0IHh3d2R0X2RldmljZSAtIFdhdGNoZG9nIGRldmljZSBzdHJ1Y3R1cmUKPj4+Pj4+PiArICog QGJhc2U6IGJhc2UgaW8gYWRkcmVzcyBvZiBXRFQgZGV2aWNlCj4+Pj4+Pj4gKyAqIEBzcGlubG9j azogc3BpbmxvY2sgZm9yIElPIHJlZ2lzdGVyIGFjY2Vzcwo+Pj4+Pj4+ICsgKiBAeGlsaW54X3d3 ZHRfd2RkOiB3YXRjaGRvZyBkZXZpY2Ugc3RydWN0dXJlCj4+Pj4+Pj4gKyAqIEBjbGs6IHN0cnVj dCBjbGsgKiBvZiBhIGNsb2NrIHNvdXJjZQo+Pj4+Pj4+ICsgKiBAZnJlcTogc291cmNlIGNsb2Nr IGZyZXF1ZW5jeSBvZiBXV0RUwqAgKi8gc3RydWN0IHh3d2R0X2RldmljZSB7Cj4+Pj4+Pj4gK8Kg wqDCoCB2b2lkIF9faW9tZW0gKmJhc2U7Cj4+Pj4+Pj4gK8KgwqDCoCBzcGlubG9ja190IHNwaW5s b2NrOyAvKiBzcGlubG9jayBmb3IgcmVnaXN0ZXIgaGFuZGxpbmcgKi8KPj4+Pj4+PiArwqDCoMKg IHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgeGlsaW54X3d3ZHRfd2RkOwo+Pj4+Pj4+ICvCoMKgwqAg c3RydWN0IGNsayAqY2xrOwo+Pj4+Pj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZ8KgwqDCoCBmcmVx Owo+Pj4+Pj4+ICt9Owo+Pj4+Pj4+ICsKPj4+Pj4+PiArc3RhdGljIGJvb2wgaXNfd3dkdF9pbl9j bG9zZWRfd2luZG93KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UKPj4+ICp3ZGQpIHsKPj4+Pj4+PiAr wqDCoMKgIHN0cnVjdCB4d3dkdF9kZXZpY2UgKnhkZXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3 ZGQpOwo+Pj4+Pj4+ICvCoMKgwqAgdTMyIGNzciwgcmV0Owo+Pj4+Pj4+ICsKPj4+Pj4+PiArwqDC oMKgIGNzciA9IGlvcmVhZDMyKHhkZXYtPmJhc2UgKyBYV1dEVF9FU1JfT0ZGU0VUKTsKPj4+Pj4+ PiArCj4+Pj4+Pj4gK8KgwqDCoCByZXQgPSAoY3NyICYgWFdXRFRfRVNSX1dFTl9NQVNLKSA/ICEo Y3NyICYKPj4+Pj4+IFhXV0RUX0VTUl9XU1dfTUFTSykgPyAwIDoKPj4+Pj4+PiArMSA6IDE7Cj4+ Pj4+Pgo+Pj4+Pj4gVGhpcyBpcyBjb25mdXNpbmcuCj4+Pj4+Pgo+Pj4+Pj4gwqDCoMKgwqByZXR1 cm4gIShjc3IgJiBYV1dEVF9FU1JfV0VOX01BU0spIHx8ICgoY3NyICYKPj4+Pj4gWFdXRFRfRVNS X1dTV19NQVNLKTsKPj4+Pj4+Cj4+Pj4+PiBzaG91bGQgZG8gdGhlIHNhbWUgYW5kIHdvdWxkIGJl IGVhc2llciB0byB1bmRlcnN0YW5kLCB0aG91Z2ggSSBhbQo+Pj4+Pj4gbm90IHN1cmUgaWYgaXQg aXMgY29ycmVjdCAobWFraW5nIHRoZSBwb2ludCB0aGF0IHRoZSBleHByZXNzaW9uIGlzCj4+PiBj b25mdXNpbmcpLgo+Pj4+Pj4KPj4+Pj4gQWNjZXB0ZWQgYW5kIHdpbGwgdXBkYXRlIGluIFYyLgo+ Pj4+Pgo+Pj4+Pj4+ICsKPj4+Pj4+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+Pj4+Pj4gK30KPj4+ Pj4+PiArCj4+Pj4+Pj4gK3N0YXRpYyBpbnQgeGlsaW54X3d3ZHRfc3RhcnQoc3RydWN0IHdhdGNo ZG9nX2RldmljZSAqd2RkKSB7Cj4+Pj4+Pj4gK8KgwqDCoCBzdHJ1Y3QgeHd3ZHRfZGV2aWNlICp4 ZGV2ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKPj4+Pj4+PiArwqDCoMKgIHN0cnVjdCB3 YXRjaGRvZ19kZXZpY2UgKnhpbGlueF93d2R0X3dkZCA9ICZ4ZGV2LQo+Pj4+Pj4+IHhpbGlueF93 d2R0X3dkZDsKPj4+Pj4+PiArwqDCoMKgIHU2NCB0aW1lX291dCwgY2xvc2VkX3RpbWVvdXQsIG9w ZW5fdGltZW91dDsKPj4+Pj4+PiArwqDCoMKgIHUzMiBjb250cm9sX3N0YXR1c19yZWc7Cj4+Pj4+ Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgLyogQ2FsY3VsYXRlIHRpbWVvdXQgY291bnQgKi8KPj4+Pj4+ PiArwqDCoMKgIHRpbWVfb3V0ID0geGRldi0+ZnJlcSAqIHdkZC0+dGltZW91dDsKPj4+Pj4+PiAr Cj4+Pj4+Pj4gK8KgwqDCoCBpZiAoeGNsb3NlZF93aW5kb3dfcGVyY2VudCkgewo+Pj4+Pj4+ICvC oMKgwqDCoMKgwqDCoCBjbG9zZWRfdGltZW91dCA9ICh0aW1lX291dCAqCj4+PiB4Y2xvc2VkX3dp bmRvd19wZXJjZW50KSAvCj4+Pj4+PiAxMDA7Cj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIG9wZW5f dGltZW91dCA9IHRpbWVfb3V0IC0gY2xvc2VkX3RpbWVvdXQ7Cj4+Pj4+Pj4gK8KgwqDCoMKgwqDC oMKgIHdkZC0+bWluX2h3X2hlYXJ0YmVhdF9tcyA9Cj4+PiB4Y2xvc2VkX3dpbmRvd19wZXJjZW50 ICoKPj4+Pj4+IDEwICogd2RkLT50aW1lb3V0Owo+Pj4+Pj4+ICvCoMKgwqAgfSBlbHNlIHsKPj4+ Pj4+PiArwqDCoMKgwqDCoMKgwqAgLyogQ2FsY3VsYXRlIDUwJSBvZiB0aW1lb3V0ICovCj4+Pj4+ Pgo+Pj4+Pj4gSXNuJ3QgdGhhdCBhIGJpdCByYW5kb20gPwo+Pj4+Pgo+Pj4+PiBWZXJzYWwgV2lu ZG93IHdhdGNoZG9nIElQIHN1cHBvcnRzIGJlbG93IGZlYXR1cmVzLgo+Pj4+PiDCoCAxKVN0YXJ0 Cj4+Pj4+IMKgIDIpU3RvcAo+Pj4+PiDCoCAzKUNvbmZpZ3VyZSBUaW1lb3V0Cj4+Pj4+IMKgIDQp UmVmcmVzaAo+Pj4+Pgo+Pj4+PiBQbGFubmluZyB0byB0YWtlIGNsb3NlZCB3aW5kb3cgcGVyY2Vu dGFnZSBmcm9tIGRldmljZSB0cmVlIHBhcmFtZXRlci4KPj4+Pj4gSWYgdGhlIHVzZXIgaGFzbid0 IHBhc3NlZCB0aGUgY2xvc2VkIHdpbmRvdyBwZXJjZW50YWdlIGZyb20gdGhlCj4+Pj4+IGRldmlj ZSB0cmVlLCBieSBkZWZhdWx0LCB0YWtpbmcgWFdXRFRfUEVSQ0VOVCB2YWx1ZSB3aGljaCBpcyA1 MC4KPj4+Pj4KPj4KPj4gRG9lcyBhYm92ZSBleHBsYW5hdGlvbiBsb29rcyBmaW5lIHRvIHlvdSA/ Cj4+Cj4+Pj4+Pgo+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCB0aW1lX291dCAqPSBYV1dEVF9QRVJD RU5UOwo+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCB0aW1lX291dCAvPSAxMDA7Cj4+Pj4+Pj4gK8Kg wqDCoMKgwqDCoMKgIHdkZC0+bWluX2h3X2hlYXJ0YmVhdF9tcyA9IFhXV0RUX1BFUkNFTlQgKgo+ Pj4gMTAgKgo+Pj4+Pj4gd2RkLT50aW1lb3V0Owo+Pj4+Pj4KPj4+Pj4+IG1pbl9od19oZWFydGJl YXRfbXMgaXMgc3VwcG9zZWQgdG8gYmUgZml4ZWQgYWZ0ZXIgcHJvYmUuIEJlaGF2aW9yCj4+Pj4+ PiBvZiBjaGFuZ2luZyBpdCB3aGVuIHN0YXJ0aW5nIHRoZSB3YXRjaGRvZyBpcyB1bmRlZmluZWQu IFRoaXMgd2lsbAo+Pj4+Pj4gbGlrZWx5IGZhaWwgdW5kZXIgc29tZSBjb25kaXRpb25zLgo+Pj4+ Pgo+Pj4+PiBBcyBJIHNhaWQgaW4gYWJvdmUgY29tbWVudHMgdmVyc2FsIHdhdGNoZG9nIElQIHN1 cHBvcnRzCj4+Pj4+IHJlY29uZmlndXJhdGlvbiBvZiB0aW1lb3V0LCBzbyBldmVyeSByZXN0YXJ0 IHdlIGFyZSB1cGRhdGluZwo+Pj4+PiBtaW5faHdfaGVhcnRiZWF0X21zIGJhc2VkIG9uIHRpbWVv dXQuCj4+Pj4+Cj4+Cj4+IEFmdGVyIHN0b3Agd2UgYXJlIHJlY29uZmlndXJpbmcgdGhlIG1pbl9o d19oZWFydGJlYXRfbXMsIGRvIHlvdSB0aGluayBzdGlsbCBpdCB3aWxsIGZhaWwgPy4KPj4KPj4+ Pj4+Cj4+Pj4+Pj4gK8KgwqDCoCB9Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgc3Bpbl9sb2Nr KCZ4ZGV2LT5zcGlubG9jayk7Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgaW93cml0ZTMyKFhX V0RUX01XUl9NQVNLLCB4ZGV2LT5iYXNlICsKPj4+Pj4+IFhXV0RUX01XUl9PRkZTRVQpOwo+Pj4+ Pj4+ICvCoMKgwqAgaW93cml0ZTMyKH4odTMyKVhXV0RUX0VTUl9XRU5fTUFTSywgeGRldi0+YmFz ZSArCj4+Pj4+PiBYV1dEVF9FU1JfT0ZGU0VUKTsKPj4+Pj4+PiArCj4+Pj4+Pj4gK8KgwqDCoCBp ZiAoeGNsb3NlZF93aW5kb3dfcGVyY2VudCkgewo+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpb3dy aXRlMzIoKHUzMiljbG9zZWRfdGltZW91dCwgeGRldi0+YmFzZSArCj4+Pj4+PiBYV1dEVF9GV1Jf T0ZGU0VUKTsKPj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgaW93cml0ZTMyKCh1MzIpb3Blbl90aW1l b3V0LCB4ZGV2LT5iYXNlICsKPj4+Pj4+IFhXV0RUX1NXUl9PRkZTRVQpOwo+Pj4+Pj4+ICvCoMKg wqAgfSBlbHNlIHsKPj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgLyogQ29uZmlndXJlIGNsb3NlZCBh bmQgb3BlbiB3aW5kb3dzIHdpdGggNTAlIG9mCj4+PiB0aW1lb3V0Cj4+Pj4+PiAqLwo+Pj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoCBpb3dyaXRlMzIoKHUzMil0aW1lX291dCwgeGRldi0+YmFzZSArCj4+ Pj4+PiBYV1dEVF9GV1JfT0ZGU0VUKTsKPj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgaW93cml0ZTMy KCh1MzIpdGltZV9vdXQsIHhkZXYtPmJhc2UgKwo+Pj4+Pj4gWFdXRFRfU1dSX09GRlNFVCk7Cj4+ Pj4+Pj4gK8KgwqDCoCB9Cj4+Pj4+Pgo+Pj4+Pj4gVGhpcyBpZi9lbHNlIHNob3VsZCBub3QgYmUg bmVjZXNzYXJ5IGJ5IHVzaW5nIGFwcHJvcHJpYXRlCj4+Pj4+PiBjYWxjdWxhdGlvbnMKPj4+Pj4g YWJvdmUuCj4+Pj4+PiBBbnl3YXksIHRoaXMgaXMgbW9vdCAtIGFzIHNhaWQgYWJvdmUsIGNoYW5n aW5nIG1pbl9od19oZWFydGJlYXRfbXMKPj4+Pj4+IGFmdGVyIHByb2JlIGlzIHVuZXhwZWN0ZWQs IGFuZCB0aGUgY29kZSB3aWxsIGhhdmUgdG8gYmUgY2hhbmdlZCB0bwo+Pj4+Pj4gdXNlIGEgZml4 ZWQgdmFsdWUgZm9yIHRoZSB3aW5kb3cgc2l6ZS4gV2l0aCB0aGF0LCBhbGwgY2FsY3VsYXRpb25z Cj4+Pj4+PiBjYW4gYW5kIHNob3VsZCBiZSBkb25lIGluIHRoZSBwcm9iZSBmdW5jdGlvbi4KPj4+ Pj4+Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgLyogRW5hYmxlIHRoZSB3aW5kb3cgd2F0Y2hk b2cgdGltZXIgKi8KPj4+Pj4+PiArwqDCoMKgIGNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMy KHhkZXYtPmJhc2UgKwo+Pj4gWFdXRFRfRVNSX09GRlNFVCk7Cj4+Pj4+Pj4gK8KgwqDCoCBjb250 cm9sX3N0YXR1c19yZWcgfD0gWFdXRFRfRVNSX1dFTl9NQVNLOwo+Pj4+Pj4+ICvCoMKgwqAgaW93 cml0ZTMyKGNvbnRyb2xfc3RhdHVzX3JlZywgeGRldi0+YmFzZSArCj4+PiBYV1dEVF9FU1JfT0ZG U0VUKTsKPj4+Pj4+Cj4+Pj4+PiBXaHkgaXMgdGhpcyBlbmFibGVkIHVuY29uZGl0aW9uYWxseSA/ IEkgd291bGQgYXNzdW1lIHRoYXQgYSB1c2VyCj4+Pj4+PiBzcGVjaWZ5aW5nIGEgMC1wZXJjZW50 YWdlIHdpbmRvdyBzaXplIGRvZXNuJ3Qgd2FudCBpdCBlbmFibGVkLgo+Pj4+Pgo+Pj4+PiBQbGFu IHRvIGFkZCBhIGNoZWNrIGZvciBjbG9zZWQgd2luZG93IHBlcmNlbnRhZ2UuIElmIHVzZXIgdHJp ZXMgdG8KPj4+Pj4gY29uZmlndXJlIDEwMCUgb2YgY2xvc2VkIHdpbmRvdywgZHJpdmVyIGNvbmZp Z3VyZXMgWFdXRFRfUEVSQ0VOVAo+Pj4gdmFsdWUuCj4+Pj4+IENvbmZpZ3VyaW5nIDEwMCUgb2Yg Y2xvc2VkIHdpbmRvdyBub3Qgc3VnZ2VzdGlibGUuCj4+Pj4+Cj4+Cj4+IERvIHlvdSBoYXZlIGFu eSBmZWVkYmFjayBvbiBhYm92ZSBleHBsYW5hdGlvbiA/Lgo+Pgo+Pj4+Pj4KPj4+Pj4+PiArCj4+ Pj4+Pj4gK8KgwqDCoCBzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOwo+Pj4+Pj4+ICsKPj4+ Pj4+PiArwqDCoMKgIGRldl9kYmcoeGlsaW54X3d3ZHRfd2RkLT5wYXJlbnQsICJXYXRjaGRvZyBT dGFydGVkIVxuIik7Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+Pj4+Pj4g K30KPj4+Pj4+PiArCj4+Pj4+Pj4gK3N0YXRpYyBpbnQgeGlsaW54X3d3ZHRfa2VlcGFsaXZlKHN0 cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkgewo+Pj4+Pj4+ICvCoMKgwqAgc3RydWN0IHh3d2R0 X2RldmljZSAqeGRldiA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7Cj4+Pj4+Pj4gK8KgwqDC oCB1MzIgY29udHJvbF9zdGF0dXNfcmVnOwo+Pj4+Pj4+ICsKPj4+Pj4+PiArwqDCoMKgIHNwaW5f bG9jaygmeGRldi0+c3BpbmxvY2spOwo+Pj4+Pj4+ICsKPj4+Pj4+PiArwqDCoMKgIC8qIEVuYWJs ZSB3cml0ZSBhY2Nlc3MgY29udHJvbCBiaXQgZm9yIHRoZSB3aW5kb3cgd2F0Y2hkb2cKPj4+ICov Cj4+Pj4+Pj4gK8KgwqDCoCBpb3dyaXRlMzIoWFdXRFRfTVdSX01BU0ssIHhkZXYtPmJhc2UgKwo+ Pj4+Pj4gWFdXRFRfTVdSX09GRlNFVCk7Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgLyogVHJp Z2dlciByZXN0YXJ0IGtpY2sgdG8gd2F0Y2hkb2cgKi8KPj4+Pj4+PiArwqDCoMKgIGNvbnRyb2xf c3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYtPmJhc2UgKwo+Pj4gWFdXRFRfRVNSX09GRlNFVCk7 Cj4+Pj4+Pj4gK8KgwqDCoCBjb250cm9sX3N0YXR1c19yZWcgfD0gWFdXRFRfRVNSX1dTV19NQVNL Owo+Pj4+Pj4+ICvCoMKgwqAgaW93cml0ZTMyKGNvbnRyb2xfc3RhdHVzX3JlZywgeGRldi0+YmFz ZSArCj4+PiBYV1dEVF9FU1JfT0ZGU0VUKTsKPj4+Pj4+PiArCj4+Pj4+Pj4gK8KgwqDCoCBzcGlu X3VubG9jaygmeGRldi0+c3BpbmxvY2spOwo+Pj4+Pj4+ICsKPj4+Pj4+PiArwqDCoMKgIHJldHVy biAwOwo+Pj4+Pj4+ICt9Cj4+Pj4+Pj4gKwo+Pj4+Pj4+ICtzdGF0aWMgaW50IHhpbGlueF93d2R0 X3NldF90aW1lb3V0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCwKPj4+Pj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBuZXdfdGltZSkKPj4+ Pj4+PiArewo+Pj4+Pj4+ICvCoMKgwqAgc3RydWN0IHh3d2R0X2RldmljZSAqeGRldiA9IHdhdGNo ZG9nX2dldF9kcnZkYXRhKHdkZCk7Cj4+Pj4+Pj4gK8KgwqDCoCBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2 aWNlICp4aWxpbnhfd3dkdF93ZGQgPSAmeGRldi0KPj4+Pj4+PiB4aWxpbnhfd3dkdF93ZGQ7Cj4+ Pj4+Pj4gKwo+Pj4+Pj4+ICvCoMKgwqAgaWYgKHdhdGNoZG9nX2FjdGl2ZSh4aWxpbnhfd3dkdF93 ZGQpKQo+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVQRVJNOwo+Pj4+Pj4KPj4+Pj4+ IFdoeSA/IFRoaXMgd2lsbCBiZSB0aGUgbW9zdCBjb21tb24gY2FzZSBhbmQgbWVhbnMgdG8gY2hh bmdlIHRoZQo+Pj4+PiB0aW1lb3V0Lgo+Pj4+Pgo+Pj4+PiBWZXJzYWwgV2F0Y2hkb2cgc3VwcG9y dHMgcmVjb25maWd1cmF0aW9uIG9mIHRpbWVvdXQuIElmIHdlIHRyeSB0bwo+Pj4+PiByZWNvbmZp Z3VyZSB0aW1lb3V0IHdpdGhvdXQgc3RvcHBpbmcgdGhlIHdhdGNoZG9nLCBkcml2ZXIgcmV0dXJu cwo+Pj4+PiBlcnJvciBpbW1lZGlhdGVseS4gUmVjb25maWd1cmF0aW9uIG9mIHRpbWVvdXQsIFN0 b3AgYW5kIFJlZnJlc2ggbm90Cj4+Pj4+IGFsbG93ZWQgaW4gY2xvc2VkIHdpbmRvdy4KPj4+Pj4g VXNlciBjYW4gdHJpZ2dlciBzZXQgdGltZW91dCBhbnkgcG9pbnQgb2YgdGltZSwgU28gYXZvaWRp bmcKPj4+Pj4gcmVjb25maWd1cmluZyB0aGUgdGltZW91dCBmZWF0dXJlIHVzaW5nIGRyaXZlciBB UEkgaWYgdGhlIHdhdGNoZG9nIGlzCj4+PiBhY3RpdmUuCj4+Pj4+Cj4+Cj4+IFBsZWFzZSBzaGFy ZSB5b3VyIGNvbW1lbnRzIG9uIHRoaXMuCj4+Cj4gCj4gSSBzZWUgdGhhdCB0aGVyZSBhcmUgc3Rp bGwgc29tZSBwZW5kaW5nIHF1ZXN0aW9ucyBvbiB0aGlzIHRocmVhZC4KPiBDb3VsZCB5b3UgcGxl YXNlIHRha2UgYSBsb29rIGF0IGl0Pwo+IElmIHlvdSB0aGluayB0aGF0IHdvdWxkIGJlIGJldHRl ciB0byBzZW5kIHYyIGFuZCBiZXR0ZXIgZGVzY3JpYmUgdGhlIHByb2JsZW1hdGljIHBhcnRzIGFz IHRoZSBwYXJ0IG9mIGNvbW1pdCBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIGFsc28gZmluZS4KPiAK CkkgY2FuIG9ubHkgZGVjb2RlIHRoZSBjb21tZW50IG9uIHRoZSBib3R0b20uIEkgdGhpbmsgdGhh dCBwcm9ibGVtIG5lZWRzCmEgYmV0dGVyIHNvbHV0aW9uLiBSZXR1cm5pbmcgLUVQRVJNIGlzIGRl ZmluaXRlbHkgd3JvbmcgaGVyZS4gSG93IHdvdWxkCnlvdSBleHBlY3QgdXNlcnNwYWNlIHRvIHJl YWN0IG9uIGl0ID8gRXhwZWN0aW5nIHVzZXJzcGFjZSB0byBzdG9wIHRoZQp3YXRjaGRvZyBiZWZv cmUgdXBkYXRpbmcgdGhlIHRpbWVvdXQgaXMgbm90IGFjY2VwdGFibGU7IHRoYXQgaXMgbm90CmRl ZmluZWQgaW4gdGhlIEFCSSwgYW5kIHdlIGNhbiBub3QgZXhwZWN0IHdhdGNoZG9nIGRhZW1vbnMg dG8ga25vdyBhYm91dAppdC4KCllvdSBjb3VsZCwgZm9yIGV4YW1wbGU6Ci0gc3RvcCB0aGUgd2F0 Y2hkb2csIHVwZGF0ZSB0aGUgdGltZW91dCwgYW5kIHJlc3RhcnQgaXQuIFRoYXQgaXMKICAgbGVz cyB0aGFuIHBlcmZlY3QsIGJ1dCBvdGhlciBkcml2ZXJzIHdpdGggc2ltaWxhciBsaW1pdGF0aW9u cwogICBkbyBpdCBhcyB3ZWxsLgotIE1hcmsgdGhlIHRpbWVvdXQgdXBkYXRlIGFzIHBlbmRpbmcs IGFuZCB1cGRhdGUgaXQgaW4gdGhlIHBlcm1pdHRlZAogICB3aW5kb3cgKGlmIHRoYXQgaXMgcG9z c2libGU7IHRoZSBhYm92ZSBjb21tZW50IGlzIHZhZ3VlIG9uIHRoYXQpLgoKR3VlbnRlcgoKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK