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 CC635C433F5 for ; Wed, 2 Feb 2022 15:30:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345462AbiBBPar (ORCPT ); Wed, 2 Feb 2022 10:30:47 -0500 Received: from foss.arm.com ([217.140.110.172]:37992 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230120AbiBBPaq (ORCPT ); Wed, 2 Feb 2022 10:30:46 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7D586113E; Wed, 2 Feb 2022 07:30:46 -0800 (PST) Received: from [192.168.122.164] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1971E3F73B; Wed, 2 Feb 2022 07:30:46 -0800 (PST) Message-ID: Date: Wed, 2 Feb 2022 09:30:45 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.3.0 Subject: Re: [PATCH] serial: 8250_bcm2835aux: Add ACPI support Content-Language: en-US To: Florian Fainelli , Adrien Thierry , linux-serial@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , Jiri Slaby , Nicolas Saenz Julienne , Ray Jui , Scott Branden , bcm-kernel-feedback-list@broadcom.com References: <20220201185001.926338-1-athierry@redhat.com> <412a456d-7294-a124-8a01-f052915348b4@gmail.com> <1ed6d576-63cb-fdd5-eaee-cc4154d25e0d@arm.com> <4502f052-9740-4e1e-0466-ddc92ff1fc0f@gmail.com> From: Jeremy Linton In-Reply-To: <4502f052-9740-4e1e-0466-ddc92ff1fc0f@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-serial@vger.kernel.org Hi, On 2/1/22 21:39, Florian Fainelli wrote: > > > On 2/1/2022 12:42 PM, Jeremy Linton wrote: >> Hi, >> >> On 2/1/22 13:24, Florian Fainelli wrote: >>> >>> >>> On 2/1/2022 10:50 AM, Adrien Thierry wrote: >>>> Add ACPI support to 8250_bcm2835aux driver. This makes it possible to >>>> use the miniuart on the Raspberry Pi with the tianocore/edk2 UEFI >>>> firmware. >>>> >>>> Signed-off-by: Adrien Thierry >>>> --- >>>>   drivers/tty/serial/8250/8250_bcm2835aux.c | 103 >>>> +++++++++++++++++----- >>>>   1 file changed, 83 insertions(+), 20 deletions(-) >>>> >>>> diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c >>>> b/drivers/tty/serial/8250/8250_bcm2835aux.c >>>> index fd95860cd..b904b321e 100644 >>>> --- a/drivers/tty/serial/8250/8250_bcm2835aux.c >>>> +++ b/drivers/tty/serial/8250/8250_bcm2835aux.c >>>> @@ -12,6 +12,7 @@ >>>>    * simultaneously to rs485. >>>>    */ >>>> +#include >>>>   #include >>>>   #include >>>>   #include >>>> @@ -44,6 +45,10 @@ struct bcm2835aux_data { >>>>       u32 cntl; >>>>   }; >>>> +struct bcm2835_aux_serial_acpi_driver_data { >>>> +    resource_size_t offset; >>>> +}; >>>> + >>>>   static void bcm2835aux_rs485_start_tx(struct uart_8250_port *up) >>>>   { >>>>       if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX)) { >>>> @@ -82,8 +87,12 @@ static int bcm2835aux_serial_probe(struct >>>> platform_device *pdev) >>>>   { >>>>       struct uart_8250_port up = { }; >>>>       struct bcm2835aux_data *data; >>>> +    struct bcm2835_aux_serial_acpi_driver_data *acpi_data; >>>>       struct resource *res; >>>>       int ret; >>>> +    resource_size_t mapbase; >>>> +    resource_size_t mapsize; >>>> +    unsigned int uartclk; >>>>       /* allocate the custom structure */ >>>>       data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); >>>> @@ -108,10 +117,12 @@ static int bcm2835aux_serial_probe(struct >>>> platform_device *pdev) >>>>       platform_set_drvdata(pdev, data); >>>> -    /* get the clock - this also enables the HW */ >>>> -    data->clk = devm_clk_get(&pdev->dev, NULL); >>>> -    if (IS_ERR(data->clk)) >>>> -        return dev_err_probe(&pdev->dev, PTR_ERR(data->clk), "could >>>> not get clk\n"); >>>> +    if (dev_of_node(&pdev->dev)) { >>>> +        /* get the clock - this also enables the HW */ >>>> +        data->clk = devm_clk_get(&pdev->dev, NULL); >>>> +        if (IS_ERR(data->clk)) >>>> +            return dev_err_probe(&pdev->dev, PTR_ERR(data->clk), >>>> "could not get clk\n"); >>>> +    } >>> >>> This does not seem necessary, if the clk is NULL when probed via >>> ACPI, all of the clk_* APIs will deal with that gracefully. If you >>> need not to treat -ENOENT as a hard error here, consider switching to >>> devm_clk_get_optional(). Given that you look at the 'clock-frequency' >>> property, you can still have some generic code, something like: >>> >>>      if (IS_ERR(data->clk)) { >>>          ret = device_property_read_u32(&pdev->dev, >>> "clock-frequency", &uartclk); >>>          if (ret) >>>              return dev_err_probe(&pdev->dev, ret, "could not get >>> clk\n"); >>>      } >>> >>>>       /* get the interrupt */ >>>>       ret = platform_get_irq(pdev, 0); >>>> @@ -125,20 +136,59 @@ static int bcm2835aux_serial_probe(struct >>>> platform_device *pdev) >>>>           dev_err(&pdev->dev, "memory resource not found"); >>>>           return -EINVAL; >>>>       } >>>> -    up.port.mapbase = res->start; >>>> -    up.port.mapsize = resource_size(res); >>>> - >>>> -    /* Check for a fixed line number */ >>>> -    ret = of_alias_get_id(pdev->dev.of_node, "serial"); >>>> -    if (ret >= 0) >>>> -        up.port.line = ret; >>>> - >>>> -    /* enable the clock as a last step */ >>>> -    ret = clk_prepare_enable(data->clk); >>>> -    if (ret) { >>>> -        dev_err(&pdev->dev, "unable to enable uart clock - %d\n", >>>> -            ret); >>>> -        return ret; >>> >>> All of that path can be common, and you can just define an offset to >>> apply to the resource at the top after you fetched the memory >>> resource. The offset will be non-0 for ACPI and 0 for non-ACPI. That >>> is, no need for the intermediate variables and conditional paths >>> whether this is ACPI apply this offset, or not. >>> >>>> + >>>> +    mapbase = res->start; >>>> +    mapsize = resource_size(res); >>>> + >>>> +    if (has_acpi_companion(&pdev->dev)) { >>>> +        const struct acpi_device_id *match; >>>> + >>>> +        match = >>>> acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev); >>>> +        if (!match) >>>> +            return -ENODEV; >>>> + >>>> +        acpi_data = (struct bcm2835_aux_serial_acpi_driver_data >>>> *)match->driver_data; >>>> + >>>> +        /* Some UEFI implementations (e.g. tianocore/edk2 for the >>>> Raspberry Pi) >>>> +         * describe the miniuart with a base address that >>>> encompasses the auxiliary >>>> +         * registers shared between the miniuart and spi. >>>> +         * >>>> +         * This is due to historical reasons, see discussion here : >>>> +         * https://edk2.groups.io/g/devel/topic/87501357#84349 >>>> +         * >>>> +         * We need to add the offset between the miniuart and >>>> auxiliary >>>> +         * registers to get the real miniuart base address. >>> >>> And ACPI on the Pi4 is so widely deployed that fixing the miniuart >>> resources is not an option at all? This really really continues to >>> contribute to my impression that ACPI on the Pi4 is a fad more than a >>> real thing, sorry. >> >> The problem again, is that this resource is legacy and used by >> windows/vmware/etc on both the rpi3 and rpi4. So, unfortunately it >> cannot really be changed without breaking existing OSs. > > Cannot we create another entry that only Linux would match? This is the > first time that an attempt for ACPIfying the 8250_bcm2835aux is done as > far as upstream is concerned so any cruft of legacy that is artificial > should really be avoided and this appear to be some. Well, then we would have a SPCR+DBG2 mismatch when used as a console or debug port (which is an option here since the DT being used by the low level vc4 firmware selects between the console or bluetooth for the serial device. And in windows and likely other OS's the unused device is going to confuse people when it shows up but is missing a driver. So its not really workable without diverging the ACPI tables based on OS. MS actually went and created a new uart type for this device a number of years ago when the initial edk2 port was made, and apparently that definition was somewhat incorrect because it uses this offset to cover the entire block. So it puts us in a bit of a bind, where there were issues with their original definitions (like this). For the most part the edk2 maintainers/rpi OS community tend to work these out, but sometimes they leak through to an OS and require changes. In this case Adrien initially tried to change the uart definition, and it was strongly NAKed by other members because linux is the odd one out here. Thanks 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 21931C433EF for ; Wed, 2 Feb 2022 15:47:56 +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=9ALPpBbXACpsAP9YqOjQ9nG+L/dFvHCoYXiMw1BK9Fw=; b=tmkvOOJAJ3sKYT 1A1F7x3MLoPkkLmhEsCm4/SiD3RFvRizDhZiTT9TZWV8OfqbjGSnHtYfKXUiIjrxQqCznB9Tz/tnS 3X0soYgLQhtBHMDMSR+jBwrjZvDia6/6VidsYHcYKEiHdin/MSW6EsujMZ2DIoZOl4xMiapQ5Ghx8 ZcGQgGonU6QJQ7kZnevo+Vg/kvGNOxiRi/Bw+AAISELH2TACfFL43nMfqCYHooKFStxvI7fgTDeRS IQBfEOxGlJ2BpYf1WKThHsAUZXZ5SZlR+Wt4EfOX+0n3awFvyMWsqx3sNTbZb8gNwJ8Mu28jYDDy4 YNmWYOrBNuBYMNX8q8Zw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFHpW-00G3Uo-FI; Wed, 02 Feb 2022 15:45:59 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFHaq-00Fzgy-16; Wed, 02 Feb 2022 15:30:50 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7D586113E; Wed, 2 Feb 2022 07:30:46 -0800 (PST) Received: from [192.168.122.164] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1971E3F73B; Wed, 2 Feb 2022 07:30:46 -0800 (PST) Message-ID: Date: Wed, 2 Feb 2022 09:30:45 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.3.0 Subject: Re: [PATCH] serial: 8250_bcm2835aux: Add ACPI support Content-Language: en-US To: Florian Fainelli , Adrien Thierry , linux-serial@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , Jiri Slaby , Nicolas Saenz Julienne , Ray Jui , Scott Branden , bcm-kernel-feedback-list@broadcom.com References: <20220201185001.926338-1-athierry@redhat.com> <412a456d-7294-a124-8a01-f052915348b4@gmail.com> <1ed6d576-63cb-fdd5-eaee-cc4154d25e0d@arm.com> <4502f052-9740-4e1e-0466-ddc92ff1fc0f@gmail.com> From: Jeremy Linton In-Reply-To: <4502f052-9740-4e1e-0466-ddc92ff1fc0f@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220202_073048_230174_F9BCE9DE X-CRM114-Status: GOOD ( 31.93 ) 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 SGksCgpPbiAyLzEvMjIgMjE6MzksIEZsb3JpYW4gRmFpbmVsbGkgd3JvdGU6Cj4gCj4gCj4gT24g Mi8xLzIwMjIgMTI6NDIgUE0sIEplcmVteSBMaW50b24gd3JvdGU6Cj4+IEhpLAo+Pgo+PiBPbiAy LzEvMjIgMTM6MjQsIEZsb3JpYW4gRmFpbmVsbGkgd3JvdGU6Cj4+Pgo+Pj4KPj4+IE9uIDIvMS8y MDIyIDEwOjUwIEFNLCBBZHJpZW4gVGhpZXJyeSB3cm90ZToKPj4+PiBBZGQgQUNQSSBzdXBwb3J0 IHRvIDgyNTBfYmNtMjgzNWF1eCBkcml2ZXIuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8KPj4+ PiB1c2UgdGhlIG1pbml1YXJ0IG9uIHRoZSBSYXNwYmVycnkgUGkgd2l0aCB0aGUgdGlhbm9jb3Jl L2VkazIgVUVGSQo+Pj4+IGZpcm13YXJlLgo+Pj4+Cj4+Pj4gU2lnbmVkLW9mZi1ieTogQWRyaWVu IFRoaWVycnkgPGF0aGllcnJ5QHJlZGhhdC5jb20+Cj4+Pj4gLS0tCj4+Pj4gwqAgZHJpdmVycy90 dHkvc2VyaWFsLzgyNTAvODI1MF9iY20yODM1YXV4LmMgfCAxMDMgCj4+Pj4gKysrKysrKysrKysr KysrKystLS0tLQo+Pj4+IMKgIDEgZmlsZSBjaGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspLCAyMCBk ZWxldGlvbnMoLSkKPj4+Pgo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1 MC84MjUwX2JjbTI4MzVhdXguYyAKPj4+PiBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBf YmNtMjgzNWF1eC5jCj4+Pj4gaW5kZXggZmQ5NTg2MGNkLi5iOTA0YjMyMWUgMTAwNjQ0Cj4+Pj4g LS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9iY20yODM1YXV4LmMKPj4+PiArKysg Yi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2JjbTI4MzVhdXguYwo+Pj4+IEBAIC0xMiw2 ICsxMiw3IEBACj4+Pj4gwqDCoCAqIHNpbXVsdGFuZW91c2x5IHRvIHJzNDg1Lgo+Pj4+IMKgwqAg Ki8KPj4+PiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPj4+PiDCoCAjaW5jbHVkZSA8bGludXgv Y2xrLmg+Cj4+Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4+Pj4gwqAgI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgo+Pj4+IEBAIC00NCw2ICs0NSwxMCBAQCBzdHJ1Y3QgYmNtMjgzNWF1eF9k YXRhIHsKPj4+PiDCoMKgwqDCoMKgIHUzMiBjbnRsOwo+Pj4+IMKgIH07Cj4+Pj4gK3N0cnVjdCBi Y20yODM1X2F1eF9zZXJpYWxfYWNwaV9kcml2ZXJfZGF0YSB7Cj4+Pj4gK8KgwqDCoCByZXNvdXJj ZV9zaXplX3Qgb2Zmc2V0Owo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiDCoCBzdGF0aWMgdm9pZCBiY20y ODM1YXV4X3JzNDg1X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCj4+Pj4gwqAg ewo+Pj4+IMKgwqDCoMKgwqAgaWYgKCEodXAtPnBvcnQucnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVf UlhfRFVSSU5HX1RYKSkgewo+Pj4+IEBAIC04Miw4ICs4NywxMiBAQCBzdGF0aWMgaW50IGJjbTI4 MzVhdXhfc2VyaWFsX3Byb2JlKHN0cnVjdCAKPj4+PiBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ Pj4gwqAgewo+Pj4+IMKgwqDCoMKgwqAgc3RydWN0IHVhcnRfODI1MF9wb3J0IHVwID0geyB9Owo+ Pj4+IMKgwqDCoMKgwqAgc3RydWN0IGJjbTI4MzVhdXhfZGF0YSAqZGF0YTsKPj4+PiArwqDCoMKg IHN0cnVjdCBiY20yODM1X2F1eF9zZXJpYWxfYWNwaV9kcml2ZXJfZGF0YSAqYWNwaV9kYXRhOwo+ Pj4+IMKgwqDCoMKgwqAgc3RydWN0IHJlc291cmNlICpyZXM7Cj4+Pj4gwqDCoMKgwqDCoCBpbnQg cmV0Owo+Pj4+ICvCoMKgwqAgcmVzb3VyY2Vfc2l6ZV90IG1hcGJhc2U7Cj4+Pj4gK8KgwqDCoCBy ZXNvdXJjZV9zaXplX3QgbWFwc2l6ZTsKPj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCB1YXJ0Y2xr Owo+Pj4+IMKgwqDCoMKgwqAgLyogYWxsb2NhdGUgdGhlIGN1c3RvbSBzdHJ1Y3R1cmUgKi8KPj4+ PiDCoMKgwqDCoMKgIGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkYXRh KSwgR0ZQX0tFUk5FTCk7Cj4+Pj4gQEAgLTEwOCwxMCArMTE3LDEyIEBAIHN0YXRpYyBpbnQgYmNt MjgzNWF1eF9zZXJpYWxfcHJvYmUoc3RydWN0IAo+Pj4+IHBsYXRmb3JtX2RldmljZSAqcGRldikK Pj4+PiDCoMKgwqDCoMKgIHBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwo+Pj4+IC3C oMKgwqAgLyogZ2V0IHRoZSBjbG9jayAtIHRoaXMgYWxzbyBlbmFibGVzIHRoZSBIVyAqLwo+Pj4+ IC3CoMKgwqAgZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwo+Pj4+ IC3CoMKgwqAgaWYgKElTX0VSUihkYXRhLT5jbGspKQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1 cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCBQVFJfRVJSKGRhdGEtPmNsayksICJjb3VsZCAK Pj4+PiBub3QgZ2V0IGNsa1xuIik7Cj4+Pj4gK8KgwqDCoCBpZiAoZGV2X29mX25vZGUoJnBkZXYt PmRldikpIHsKPj4+PiArwqDCoMKgwqDCoMKgwqAgLyogZ2V0IHRoZSBjbG9jayAtIHRoaXMgYWxz byBlbmFibGVzIHRoZSBIVyAqLwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBkYXRhLT5jbGsgPSBkZXZt X2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChJU19F UlIoZGF0YS0+Y2xrKSkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gZGV2X2Vy cl9wcm9iZSgmcGRldi0+ZGV2LCBQVFJfRVJSKGRhdGEtPmNsayksIAo+Pj4+ICJjb3VsZCBub3Qg Z2V0IGNsa1xuIik7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pgo+Pj4gVGhpcyBkb2VzIG5vdCBzZWVtIG5l Y2Vzc2FyeSwgaWYgdGhlIGNsayBpcyBOVUxMIHdoZW4gcHJvYmVkIHZpYSAKPj4+IEFDUEksIGFs bCBvZiB0aGUgY2xrXyogQVBJcyB3aWxsIGRlYWwgd2l0aCB0aGF0IGdyYWNlZnVsbHkuIElmIHlv dSAKPj4+IG5lZWQgbm90IHRvIHRyZWF0IC1FTk9FTlQgYXMgYSBoYXJkIGVycm9yIGhlcmUsIGNv bnNpZGVyIHN3aXRjaGluZyB0byAKPj4+IGRldm1fY2xrX2dldF9vcHRpb25hbCgpLiBHaXZlbiB0 aGF0IHlvdSBsb29rIGF0IHRoZSAnY2xvY2stZnJlcXVlbmN5JyAKPj4+IHByb3BlcnR5LCB5b3Ug Y2FuIHN0aWxsIGhhdmUgc29tZSBnZW5lcmljIGNvZGUsIHNvbWV0aGluZyBsaWtlOgo+Pj4KPj4+ IMKgwqDCoMKgwqBpZiAoSVNfRVJSKGRhdGEtPmNsaykpIHsKPj4+IMKgwqDCoMKgwqDCoMKgwqAg cmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsIAo+Pj4gImNsb2NrLWZy ZXF1ZW5jeSIsICZ1YXJ0Y2xrKTsKPj4+IMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkKPj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCBy ZXQsICJjb3VsZCBub3QgZ2V0IAo+Pj4gY2xrXG4iKTsKPj4+IMKgwqDCoMKgwqB9Cj4+Pgo+Pj4+ IMKgwqDCoMKgwqAgLyogZ2V0IHRoZSBpbnRlcnJ1cHQgKi8KPj4+PiDCoMKgwqDCoMKgIHJldCA9 IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Cj4+Pj4gQEAgLTEyNSwyMCArMTM2LDU5IEBAIHN0 YXRpYyBpbnQgYmNtMjgzNWF1eF9zZXJpYWxfcHJvYmUoc3RydWN0IAo+Pj4+IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKPj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZGV2X2VycigmcGRldi0+ZGV2LCAi bWVtb3J5IHJlc291cmNlIG5vdCBmb3VuZCIpOwo+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gLUVJTlZBTDsKPj4+PiDCoMKgwqDCoMKgIH0KPj4+PiAtwqDCoMKgIHVwLnBvcnQubWFwYmFz ZSA9IHJlcy0+c3RhcnQ7Cj4+Pj4gLcKgwqDCoCB1cC5wb3J0Lm1hcHNpemUgPSByZXNvdXJjZV9z aXplKHJlcyk7Cj4+Pj4gLQo+Pj4+IC3CoMKgwqAgLyogQ2hlY2sgZm9yIGEgZml4ZWQgbGluZSBu dW1iZXIgKi8KPj4+PiAtwqDCoMKgIHJldCA9IG9mX2FsaWFzX2dldF9pZChwZGV2LT5kZXYub2Zf bm9kZSwgInNlcmlhbCIpOwo+Pj4+IC3CoMKgwqAgaWYgKHJldCA+PSAwKQo+Pj4+IC3CoMKgwqDC oMKgwqDCoCB1cC5wb3J0LmxpbmUgPSByZXQ7Cj4+Pj4gLQo+Pj4+IC3CoMKgwqAgLyogZW5hYmxl IHRoZSBjbG9jayBhcyBhIGxhc3Qgc3RlcCAqLwo+Pj4+IC3CoMKgwqAgcmV0ID0gY2xrX3ByZXBh cmVfZW5hYmxlKGRhdGEtPmNsayk7Cj4+Pj4gLcKgwqDCoCBpZiAocmV0KSB7Cj4+Pj4gLcKgwqDC oMKgwqDCoMKgIGRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBlbmFibGUgdWFydCBjbG9j ayAtICVkXG4iLAo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCk7Cj4+Pj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+Pgo+Pj4gQWxsIG9mIHRoYXQgcGF0aCBjYW4gYmUgY29t bW9uLCBhbmQgeW91IGNhbiBqdXN0IGRlZmluZSBhbiBvZmZzZXQgdG8gCj4+PiBhcHBseSB0byB0 aGUgcmVzb3VyY2UgYXQgdGhlIHRvcCBhZnRlciB5b3UgZmV0Y2hlZCB0aGUgbWVtb3J5IAo+Pj4g cmVzb3VyY2UuIFRoZSBvZmZzZXQgd2lsbCBiZSBub24tMCBmb3IgQUNQSSBhbmQgMCBmb3Igbm9u LUFDUEkuIFRoYXQgCj4+PiBpcywgbm8gbmVlZCBmb3IgdGhlIGludGVybWVkaWF0ZSB2YXJpYWJs ZXMgYW5kIGNvbmRpdGlvbmFsIHBhdGhzIAo+Pj4gd2hldGhlciB0aGlzIGlzIEFDUEkgYXBwbHkg dGhpcyBvZmZzZXQsIG9yIG5vdC4KPj4+Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgbWFwYmFzZSA9IHJl cy0+c3RhcnQ7Cj4+Pj4gK8KgwqDCoCBtYXBzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwo+Pj4+ ICsKPj4+PiArwqDCoMKgIGlmIChoYXNfYWNwaV9jb21wYW5pb24oJnBkZXYtPmRldikpIHsKPj4+ PiArwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICptYXRjaDsKPj4+ PiArCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIG1hdGNoID0gCj4+Pj4gYWNwaV9tYXRjaF9kZXZpY2Uo cGRldi0+ZGV2LmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgJnBkZXYtPmRldik7Cj4+Pj4gK8Kg wqDCoMKgwqDCoMKgIGlmICghbWF0Y2gpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FTk9ERVY7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBhY3BpX2RhdGEgPSAoc3Ry dWN0IGJjbTI4MzVfYXV4X3NlcmlhbF9hY3BpX2RyaXZlcl9kYXRhIAo+Pj4+ICopbWF0Y2gtPmRy aXZlcl9kYXRhOwo+Pj4+ICsKPj4+PiArwqDCoMKgwqDCoMKgwqAgLyogU29tZSBVRUZJIGltcGxl bWVudGF0aW9ucyAoZS5nLiB0aWFub2NvcmUvZWRrMiBmb3IgdGhlIAo+Pj4+IFJhc3BiZXJyeSBQ aSkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqIGRlc2NyaWJlIHRoZSBtaW5pdWFydCB3aXRoIGEg YmFzZSBhZGRyZXNzIHRoYXQgCj4+Pj4gZW5jb21wYXNzZXMgdGhlIGF1eGlsaWFyeQo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgICogcmVnaXN0ZXJzIHNoYXJlZCBiZXR3ZWVuIHRoZSBtaW5pdWFydCBh bmQgc3BpLgo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgICoKPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAq IFRoaXMgaXMgZHVlIHRvIGhpc3RvcmljYWwgcmVhc29ucywgc2VlIGRpc2N1c3Npb24gaGVyZSA6 Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqAgKiBodHRwczovL2VkazIuZ3JvdXBzLmlvL2cvZGV2ZWwv dG9waWMvODc1MDEzNTcjODQzNDkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqCj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqAgKiBXZSBuZWVkIHRvIGFkZCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIG1pbml1 YXJ0IGFuZCAKPj4+PiBhdXhpbGlhcnkKPj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqIHJlZ2lzdGVy cyB0byBnZXQgdGhlIHJlYWwgbWluaXVhcnQgYmFzZSBhZGRyZXNzLgo+Pj4KPj4+IEFuZCBBQ1BJ IG9uIHRoZSBQaTQgaXMgc28gd2lkZWx5IGRlcGxveWVkIHRoYXQgZml4aW5nIHRoZSBtaW5pdWFy dCAKPj4+IHJlc291cmNlcyBpcyBub3QgYW4gb3B0aW9uIGF0IGFsbD8gVGhpcyByZWFsbHkgcmVh bGx5IGNvbnRpbnVlcyB0byAKPj4+IGNvbnRyaWJ1dGUgdG8gbXkgaW1wcmVzc2lvbiB0aGF0IEFD UEkgb24gdGhlIFBpNCBpcyBhIGZhZCBtb3JlIHRoYW4gYSAKPj4+IHJlYWwgdGhpbmcsIHNvcnJ5 Lgo+Pgo+PiBUaGUgcHJvYmxlbSBhZ2FpbiwgaXMgdGhhdCB0aGlzIHJlc291cmNlIGlzIGxlZ2Fj eSBhbmQgdXNlZCBieSAKPj4gd2luZG93cy92bXdhcmUvZXRjIG9uIGJvdGggdGhlIHJwaTMgYW5k IHJwaTQuIFNvLCB1bmZvcnR1bmF0ZWx5IGl0IAo+PiBjYW5ub3QgcmVhbGx5IGJlIGNoYW5nZWQg d2l0aG91dCBicmVha2luZyBleGlzdGluZyBPU3MuCj4gCj4gQ2Fubm90IHdlIGNyZWF0ZSBhbm90 aGVyIGVudHJ5IHRoYXQgb25seSBMaW51eCB3b3VsZCBtYXRjaD8gVGhpcyBpcyB0aGUgCj4gZmly c3QgdGltZSB0aGF0IGFuIGF0dGVtcHQgZm9yIEFDUElmeWluZyB0aGUgODI1MF9iY20yODM1YXV4 IGlzIGRvbmUgYXMgCj4gZmFyIGFzIHVwc3RyZWFtIGlzIGNvbmNlcm5lZCBzbyBhbnkgY3J1ZnQg b2YgbGVnYWN5IHRoYXQgaXMgYXJ0aWZpY2lhbCAKPiBzaG91bGQgcmVhbGx5IGJlIGF2b2lkZWQg YW5kIHRoaXMgYXBwZWFyIHRvIGJlIHNvbWUuCgpXZWxsLCB0aGVuIHdlIHdvdWxkIGhhdmUgYSBT UENSK0RCRzIgbWlzbWF0Y2ggd2hlbiB1c2VkIGFzIGEgY29uc29sZSBvciAKZGVidWcgcG9ydCAo d2hpY2ggaXMgYW4gb3B0aW9uIGhlcmUgc2luY2UgdGhlIERUIGJlaW5nIHVzZWQgYnkgdGhlIGxv dyAKbGV2ZWwgdmM0IGZpcm13YXJlIHNlbGVjdHMgYmV0d2VlbiB0aGUgY29uc29sZSBvciBibHVl dG9vdGggZm9yIHRoZSAKc2VyaWFsIGRldmljZS4gQW5kIGluIHdpbmRvd3MgYW5kIGxpa2VseSBv dGhlciBPUydzIHRoZSB1bnVzZWQgZGV2aWNlIGlzIApnb2luZyB0byBjb25mdXNlIHBlb3BsZSB3 aGVuIGl0IHNob3dzIHVwIGJ1dCBpcyBtaXNzaW5nIGEgZHJpdmVyLiBTbyBpdHMgCm5vdCByZWFs bHkgd29ya2FibGUgd2l0aG91dCBkaXZlcmdpbmcgdGhlIEFDUEkgdGFibGVzIGJhc2VkIG9uIE9T LgoKTVMgYWN0dWFsbHkgd2VudCBhbmQgY3JlYXRlZCBhIG5ldyB1YXJ0IHR5cGUgZm9yIHRoaXMg ZGV2aWNlIGEgbnVtYmVyIG9mIAp5ZWFycyBhZ28gd2hlbiB0aGUgaW5pdGlhbCBlZGsyIHBvcnQg d2FzIG1hZGUsIGFuZCBhcHBhcmVudGx5IHRoYXQgCmRlZmluaXRpb24gd2FzIHNvbWV3aGF0IGlu Y29ycmVjdCBiZWNhdXNlIGl0IHVzZXMgdGhpcyBvZmZzZXQgdG8gY292ZXIgCnRoZSBlbnRpcmUg YmxvY2suIFNvIGl0IHB1dHMgdXMgaW4gYSBiaXQgb2YgYSBiaW5kLCB3aGVyZSB0aGVyZSB3ZXJl IAppc3N1ZXMgd2l0aCB0aGVpciBvcmlnaW5hbCBkZWZpbml0aW9ucyAobGlrZSB0aGlzKS4gRm9y IHRoZSBtb3N0IHBhcnQgCnRoZSBlZGsyIG1haW50YWluZXJzL3JwaSBPUyBjb21tdW5pdHkgdGVu ZCB0byB3b3JrIHRoZXNlIG91dCwgYnV0IApzb21ldGltZXMgdGhleSBsZWFrIHRocm91Z2ggdG8g YW4gT1MgYW5kIHJlcXVpcmUgY2hhbmdlcy4gSW4gdGhpcyBjYXNlIApBZHJpZW4gaW5pdGlhbGx5 IHRyaWVkIHRvIGNoYW5nZSB0aGUgdWFydCBkZWZpbml0aW9uLCBhbmQgaXQgd2FzIApzdHJvbmds eSBOQUtlZCBieSBvdGhlciBtZW1iZXJzIGJlY2F1c2UgbGludXggaXMgdGhlIG9kZCBvbmUgb3V0 IGhlcmUuCgpUaGFua3MKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK