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 552E1C433F5 for ; Wed, 2 Feb 2022 03:39:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244012AbiBBDjy (ORCPT ); Tue, 1 Feb 2022 22:39:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36882 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244009AbiBBDjw (ORCPT ); Tue, 1 Feb 2022 22:39:52 -0500 Received: from mail-pj1-x102c.google.com (mail-pj1-x102c.google.com [IPv6:2607:f8b0:4864:20::102c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C62AC061714; Tue, 1 Feb 2022 19:39:52 -0800 (PST) Received: by mail-pj1-x102c.google.com with SMTP id d5so19035188pjk.5; Tue, 01 Feb 2022 19:39:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to:content-transfer-encoding; bh=FH3lA+QmQ34YMVQggkRBneX/6THqRI+yhsVXXyqjsE0=; b=CSc/4mW1vSfTeByTRutnWRZBzww0aqF7R/gRteF1RIc9azAL277+MeGryjHTkMbSQl +GsjpFTDIWgrjZGXiRRD/PYrGVQVPIr4ywsH5fNHd/ShN9k80V/UdoPPF+wvWp6dPovo /Zcs6zAI1MwQ/ffObMeJiJ85ONMMK3iIBQzwcDgt3cTYRQ4x7schHNmutkYUTQ628G/Q mXbgzmNhmg0xZR9ywDnIVjj3ojSyl2TUuqGS8rZ0RnNUvgRdZjorYXDoDOez1Kc+/Ali fsq/FF1NhhLb4g3US4cSV4BxflfiM0gvdu4e/neMIQOmgyCVIcGfKi+BFiTxqrb5ewUY 3BRA== 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=FH3lA+QmQ34YMVQggkRBneX/6THqRI+yhsVXXyqjsE0=; b=nGGWhY+/CbxFAFUMq0n+73KyOTWANxpB7bmpNOtj9G97oK2ahojsgP4AS8MXTvVL0f M6VI4gd0rxj8+piIx5Su1G+1YUebGaMiqiSC+qg2ZdngXucBqCdF3C8mjrFgYjATZ6mc PTLZwbF5dHcRkxrDnBjS62ja6yO0JHmgTaoWRBQPTdvuWy3cBOjAknaJLupvJxRUIK0/ aKtwlrrFRQRjy2wzIJUe4TpRuQ4OzvnES/aSfIS/UWJO0qEcWh6GvAXJ6vZVW30GmtHU SsMdgeGX3/QsjW96q8q2ftIbr3IAK0CE1kJ7LeEeeqyyzyrRocHM7NUv5Tc7IyecJrUQ h+Rg== X-Gm-Message-State: AOAM533LcXa0F9hGLsgQa2DvntlLQnC2A9kt6AX4Ka0bjJhI04Sw8ATQ 5xXEfFPu4FmvPxFo8MN+FUU= X-Google-Smtp-Source: ABdhPJyaZcuyo9coxirqeiZxRAWyFi81kIxwgYofREEGGFpqz2LrtxSa9PGWO+EwxdIDg4yujmdAdw== X-Received: by 2002:a17:902:f682:: with SMTP id l2mr28411192plg.114.1643773191899; Tue, 01 Feb 2022 19:39:51 -0800 (PST) Received: from [192.168.1.3] (ip72-194-116-95.oc.oc.cox.net. [72.194.116.95]) by smtp.gmail.com with ESMTPSA id lb7sm4489298pjb.56.2022.02.01.19.39.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 01 Feb 2022 19:39:50 -0800 (PST) Message-ID: <4502f052-9740-4e1e-0466-ddc92ff1fc0f@gmail.com> Date: Tue, 1 Feb 2022 19:39:49 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: [PATCH] serial: 8250_bcm2835aux: Add ACPI support Content-Language: en-US To: Jeremy Linton , 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> From: Florian Fainelli In-Reply-To: <1ed6d576-63cb-fdd5-eaee-cc4154d25e0d@arm.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 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. -- Florian 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 C4EE5C433F5 for ; Wed, 2 Feb 2022 03:41: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: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=+NEjLSnSp1v9O28ixpYlyw4socVzpLCdqEAHe5duU94=; b=nCqsxNMPXdGHHF GpjOtVCwM6EA/qzZNJKlwigBkqn820akz5rK+0Wt0/a4zkspFPQ5lbGC8x4YNQNiWofyFsFQPZQcX Qd11/c/XGuJoEPX9sChRnyuGSrd1heek8E4xC+tKcAI6TSqMWT/WxmYAK4fU963958HqMxA8HFpDR 19PCdrdT8mSGuvuOedap5DLxLKZSAfRvoIUXao7l17Ia3I2hjvPyvIVUBVJVVnU5yQMXNHeytuusl XrOA7n10x7sayrx/Ry6uiOsu+1UWwnU8IQyoVdS6/mKOhLWUYktxv6Gcl/2SVzAD15+1XjnJ9f80X +Q644pBXWGF45yA4oJ2w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nF6Uv-00E4pV-Jg; Wed, 02 Feb 2022 03:39:57 +0000 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nF6Uq-00E4om-Ru; Wed, 02 Feb 2022 03:39:55 +0000 Received: by mail-pl1-x636.google.com with SMTP id s6so11551369plg.12; Tue, 01 Feb 2022 19:39:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to:content-transfer-encoding; bh=FH3lA+QmQ34YMVQggkRBneX/6THqRI+yhsVXXyqjsE0=; b=CSc/4mW1vSfTeByTRutnWRZBzww0aqF7R/gRteF1RIc9azAL277+MeGryjHTkMbSQl +GsjpFTDIWgrjZGXiRRD/PYrGVQVPIr4ywsH5fNHd/ShN9k80V/UdoPPF+wvWp6dPovo /Zcs6zAI1MwQ/ffObMeJiJ85ONMMK3iIBQzwcDgt3cTYRQ4x7schHNmutkYUTQ628G/Q mXbgzmNhmg0xZR9ywDnIVjj3ojSyl2TUuqGS8rZ0RnNUvgRdZjorYXDoDOez1Kc+/Ali fsq/FF1NhhLb4g3US4cSV4BxflfiM0gvdu4e/neMIQOmgyCVIcGfKi+BFiTxqrb5ewUY 3BRA== 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=FH3lA+QmQ34YMVQggkRBneX/6THqRI+yhsVXXyqjsE0=; b=sDucEl2heA33ZbRfzmxxYDDv7YHhgJOwItWK8k9sCtApSz3hn1DfkGK0lAdsGKQAJW drLZRDRLxKTjh0VIsv1DHE3Mfsp0lAVKTtZDR21+bZKMcol7g6RNATwPH6PNMB9L+x20 ih3JpEowk8sM/6TPaWbODpnm96z1NiueADtFC7sd4tyiVEpEWKMAtxfiQUs7O8+gF/zk IZyxxn7bPBODRqFc5VlWwPxZ2VETg7VzIEZCC8YmlG3tV6wMG+Mif5LpZZF3O7DAzfkY tF3tEVE3HjqvHgnLSt6cAerTwYJDi0qo5IXc+FMGRlbft693fDN6zLUwJ5pF5WuVDzA1 Bzwg== X-Gm-Message-State: AOAM532LFXa3WINYX1cA0oq8JPr0GUJZVVbdeShWoNt7ZvymJ+4Z88AV PBi1Vrwrasqpr+a7Rv6jIiI= X-Google-Smtp-Source: ABdhPJyaZcuyo9coxirqeiZxRAWyFi81kIxwgYofREEGGFpqz2LrtxSa9PGWO+EwxdIDg4yujmdAdw== X-Received: by 2002:a17:902:f682:: with SMTP id l2mr28411192plg.114.1643773191899; Tue, 01 Feb 2022 19:39:51 -0800 (PST) Received: from [192.168.1.3] (ip72-194-116-95.oc.oc.cox.net. [72.194.116.95]) by smtp.gmail.com with ESMTPSA id lb7sm4489298pjb.56.2022.02.01.19.39.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 01 Feb 2022 19:39:50 -0800 (PST) Message-ID: <4502f052-9740-4e1e-0466-ddc92ff1fc0f@gmail.com> Date: Tue, 1 Feb 2022 19:39:49 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: [PATCH] serial: 8250_bcm2835aux: Add ACPI support Content-Language: en-US To: Jeremy Linton , 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> From: Florian Fainelli In-Reply-To: <1ed6d576-63cb-fdd5-eaee-cc4154d25e0d@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220201_193952_940822_6704EB77 X-CRM114-Status: GOOD ( 27.41 ) 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 CgpPbiAyLzEvMjAyMiAxMjo0MiBQTSwgSmVyZW15IExpbnRvbiB3cm90ZToKPiBIaSwKPiAKPiBP biAyLzEvMjIgMTM6MjQsIEZsb3JpYW4gRmFpbmVsbGkgd3JvdGU6Cj4+Cj4+Cj4+IE9uIDIvMS8y MDIyIDEwOjUwIEFNLCBBZHJpZW4gVGhpZXJyeSB3cm90ZToKPj4+IEFkZCBBQ1BJIHN1cHBvcnQg dG8gODI1MF9iY20yODM1YXV4IGRyaXZlci4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0bwo+Pj4g dXNlIHRoZSBtaW5pdWFydCBvbiB0aGUgUmFzcGJlcnJ5IFBpIHdpdGggdGhlIHRpYW5vY29yZS9l ZGsyIFVFRkkKPj4+IGZpcm13YXJlLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IEFkcmllbiBUaGll cnJ5IDxhdGhpZXJyeUByZWRoYXQuY29tPgo+Pj4gLS0tCj4+PiDCoCBkcml2ZXJzL3R0eS9zZXJp YWwvODI1MC84MjUwX2JjbTI4MzVhdXguYyB8IDEwMyArKysrKysrKysrKysrKysrKy0tLS0tCj4+ PiDCoCAxIGZpbGUgY2hhbmdlZCwgODMgaW5zZXJ0aW9ucygrKSwgMjAgZGVsZXRpb25zKC0pCj4+ Pgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfYmNtMjgzNWF1 eC5jIAo+Pj4gYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2JjbTI4MzVhdXguYwo+Pj4g aW5kZXggZmQ5NTg2MGNkLi5iOTA0YjMyMWUgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL3R0eS9z ZXJpYWwvODI1MC84MjUwX2JjbTI4MzVhdXguYwo+Pj4gKysrIGIvZHJpdmVycy90dHkvc2VyaWFs LzgyNTAvODI1MF9iY20yODM1YXV4LmMKPj4+IEBAIC0xMiw2ICsxMiw3IEBACj4+PiDCoMKgICog c2ltdWx0YW5lb3VzbHkgdG8gcnM0ODUuCj4+PiDCoMKgICovCj4+PiArI2luY2x1ZGUgPGxpbnV4 L2FjcGkuaD4KPj4+IMKgICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPj4+IMKgICNpbmNsdWRlIDxs aW51eC9pby5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4gQEAgLTQ0LDYg KzQ1LDEwIEBAIHN0cnVjdCBiY20yODM1YXV4X2RhdGEgewo+Pj4gwqDCoMKgwqDCoCB1MzIgY250 bDsKPj4+IMKgIH07Cj4+PiArc3RydWN0IGJjbTI4MzVfYXV4X3NlcmlhbF9hY3BpX2RyaXZlcl9k YXRhIHsKPj4+ICvCoMKgwqAgcmVzb3VyY2Vfc2l6ZV90IG9mZnNldDsKPj4+ICt9Owo+Pj4gKwo+ Pj4gwqAgc3RhdGljIHZvaWQgYmNtMjgzNWF1eF9yczQ4NV9zdGFydF90eChzdHJ1Y3QgdWFydF84 MjUwX3BvcnQgKnVwKQo+Pj4gwqAgewo+Pj4gwqDCoMKgwqDCoCBpZiAoISh1cC0+cG9ydC5yczQ4 NS5mbGFncyAmIFNFUl9SUzQ4NV9SWF9EVVJJTkdfVFgpKSB7Cj4+PiBAQCAtODIsOCArODcsMTIg QEAgc3RhdGljIGludCBiY20yODM1YXV4X3NlcmlhbF9wcm9iZShzdHJ1Y3QgCj4+PiBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCj4+PiDCoCB7Cj4+PiDCoMKgwqDCoMKgIHN0cnVjdCB1YXJ0XzgyNTBf cG9ydCB1cCA9IHsgfTsKPj4+IMKgwqDCoMKgwqAgc3RydWN0IGJjbTI4MzVhdXhfZGF0YSAqZGF0 YTsKPj4+ICvCoMKgwqAgc3RydWN0IGJjbTI4MzVfYXV4X3NlcmlhbF9hY3BpX2RyaXZlcl9kYXRh ICphY3BpX2RhdGE7Cj4+PiDCoMKgwqDCoMKgIHN0cnVjdCByZXNvdXJjZSAqcmVzOwo+Pj4gwqDC oMKgwqDCoCBpbnQgcmV0Owo+Pj4gK8KgwqDCoCByZXNvdXJjZV9zaXplX3QgbWFwYmFzZTsKPj4+ ICvCoMKgwqAgcmVzb3VyY2Vfc2l6ZV90IG1hcHNpemU7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGlu dCB1YXJ0Y2xrOwo+Pj4gwqDCoMKgwqDCoCAvKiBhbGxvY2F0ZSB0aGUgY3VzdG9tIHN0cnVjdHVy ZSAqLwo+Pj4gwqDCoMKgwqDCoCBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVv ZigqZGF0YSksIEdGUF9LRVJORUwpOwo+Pj4gQEAgLTEwOCwxMCArMTE3LDEyIEBAIHN0YXRpYyBp bnQgYmNtMjgzNWF1eF9zZXJpYWxfcHJvYmUoc3RydWN0IAo+Pj4gcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQo+Pj4gwqDCoMKgwqDCoCBwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKPj4+ IC3CoMKgwqAgLyogZ2V0IHRoZSBjbG9jayAtIHRoaXMgYWxzbyBlbmFibGVzIHRoZSBIVyAqLwo+ Pj4gLcKgwqDCoCBkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Cj4+ PiAtwqDCoMKgIGlmIChJU19FUlIoZGF0YS0+Y2xrKSkKPj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1 cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCBQVFJfRVJSKGRhdGEtPmNsayksICJjb3VsZCAK Pj4+IG5vdCBnZXQgY2xrXG4iKTsKPj4+ICvCoMKgwqAgaWYgKGRldl9vZl9ub2RlKCZwZGV2LT5k ZXYpKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgLyogZ2V0IHRoZSBjbG9jayAtIHRoaXMgYWxzbyBl bmFibGVzIHRoZSBIVyAqLwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGRhdGEtPmNsayA9IGRldm1fY2xr X2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoSVNfRVJSKGRh dGEtPmNsaykpCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gZGV2X2Vycl9wcm9i ZSgmcGRldi0+ZGV2LCBQVFJfRVJSKGRhdGEtPmNsayksIAo+Pj4gImNvdWxkIG5vdCBnZXQgY2xr XG4iKTsKPj4+ICvCoMKgwqAgfQo+Pgo+PiBUaGlzIGRvZXMgbm90IHNlZW0gbmVjZXNzYXJ5LCBp ZiB0aGUgY2xrIGlzIE5VTEwgd2hlbiBwcm9iZWQgdmlhIEFDUEksIAo+PiBhbGwgb2YgdGhlIGNs a18qIEFQSXMgd2lsbCBkZWFsIHdpdGggdGhhdCBncmFjZWZ1bGx5LiBJZiB5b3UgbmVlZCBub3Qg Cj4+IHRvIHRyZWF0IC1FTk9FTlQgYXMgYSBoYXJkIGVycm9yIGhlcmUsIGNvbnNpZGVyIHN3aXRj aGluZyB0byAKPj4gZGV2bV9jbGtfZ2V0X29wdGlvbmFsKCkuIEdpdmVuIHRoYXQgeW91IGxvb2sg YXQgdGhlICdjbG9jay1mcmVxdWVuY3knIAo+PiBwcm9wZXJ0eSwgeW91IGNhbiBzdGlsbCBoYXZl IHNvbWUgZ2VuZXJpYyBjb2RlLCBzb21ldGhpbmcgbGlrZToKPj4KPj4gwqDCoMKgwqDCoGlmIChJ U19FUlIoZGF0YS0+Y2xrKSkgewo+PiDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IGRldmljZV9wcm9w ZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAiY2xvY2stZnJlcXVlbmN5IiwgCj4+ICZ1YXJ0Y2xr KTsKPj4gwqDCoMKgwqDCoMKgwqDCoCBpZiAocmV0KQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LCAiY291bGQgbm90IGdldCAK Pj4gY2xrXG4iKTsKPj4gwqDCoMKgwqDCoH0KPj4KPj4+IMKgwqDCoMKgwqAgLyogZ2V0IHRoZSBp bnRlcnJ1cHQgKi8KPj4+IMKgwqDCoMKgwqAgcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAw KTsKPj4+IEBAIC0xMjUsMjAgKzEzNiw1OSBAQCBzdGF0aWMgaW50IGJjbTI4MzVhdXhfc2VyaWFs X3Byb2JlKHN0cnVjdCAKPj4+IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4+IMKgwqDCoMKgwqDC oMKgwqDCoCBkZXZfZXJyKCZwZGV2LT5kZXYsICJtZW1vcnkgcmVzb3VyY2Ugbm90IGZvdW5kIik7 Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+PiDCoMKgwqDCoMKgIH0K Pj4+IC3CoMKgwqAgdXAucG9ydC5tYXBiYXNlID0gcmVzLT5zdGFydDsKPj4+IC3CoMKgwqAgdXAu cG9ydC5tYXBzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwo+Pj4gLQo+Pj4gLcKgwqDCoCAvKiBD aGVjayBmb3IgYSBmaXhlZCBsaW5lIG51bWJlciAqLwo+Pj4gLcKgwqDCoCByZXQgPSBvZl9hbGlh c19nZXRfaWQocGRldi0+ZGV2Lm9mX25vZGUsICJzZXJpYWwiKTsKPj4+IC3CoMKgwqAgaWYgKHJl dCA+PSAwKQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHVwLnBvcnQubGluZSA9IHJldDsKPj4+IC0KPj4+ IC3CoMKgwqAgLyogZW5hYmxlIHRoZSBjbG9jayBhcyBhIGxhc3Qgc3RlcCAqLwo+Pj4gLcKgwqDC oCByZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+Y2xrKTsKPj4+IC3CoMKgwqAgaWYgKHJl dCkgewo+Pj4gLcKgwqDCoMKgwqDCoMKgIGRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBl bmFibGUgdWFydCBjbG9jayAtICVkXG4iLAo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 KTsKPj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+Pgo+PiBBbGwgb2YgdGhhdCBwYXRo IGNhbiBiZSBjb21tb24sIGFuZCB5b3UgY2FuIGp1c3QgZGVmaW5lIGFuIG9mZnNldCB0byAKPj4g YXBwbHkgdG8gdGhlIHJlc291cmNlIGF0IHRoZSB0b3AgYWZ0ZXIgeW91IGZldGNoZWQgdGhlIG1l bW9yeSAKPj4gcmVzb3VyY2UuIFRoZSBvZmZzZXQgd2lsbCBiZSBub24tMCBmb3IgQUNQSSBhbmQg MCBmb3Igbm9uLUFDUEkuIFRoYXQgCj4+IGlzLCBubyBuZWVkIGZvciB0aGUgaW50ZXJtZWRpYXRl IHZhcmlhYmxlcyBhbmQgY29uZGl0aW9uYWwgcGF0aHMgCj4+IHdoZXRoZXIgdGhpcyBpcyBBQ1BJ IGFwcGx5IHRoaXMgb2Zmc2V0LCBvciBub3QuCj4+Cj4+PiArCj4+PiArwqDCoMKgIG1hcGJhc2Ug PSByZXMtPnN0YXJ0Owo+Pj4gK8KgwqDCoCBtYXBzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwo+ Pj4gKwo+Pj4gK8KgwqDCoCBpZiAoaGFzX2FjcGlfY29tcGFuaW9uKCZwZGV2LT5kZXYpKSB7Cj4+ PiArwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICptYXRjaDsKPj4+ ICsKPj4+ICvCoMKgwqDCoMKgwqDCoCBtYXRjaCA9IAo+Pj4gYWNwaV9tYXRjaF9kZXZpY2UocGRl di0+ZGV2LmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgJnBkZXYtPmRldik7Cj4+PiArwqDCoMKg wqDCoMKgwqAgaWYgKCFtYXRjaCkKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAt RU5PREVWOwo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGFjcGlfZGF0YSA9IChzdHJ1Y3QgYmNt MjgzNV9hdXhfc2VyaWFsX2FjcGlfZHJpdmVyX2RhdGEgCj4+PiAqKW1hdGNoLT5kcml2ZXJfZGF0 YTsKPj4+ICsKPj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBTb21lIFVFRkkgaW1wbGVtZW50YXRpb25z IChlLmcuIHRpYW5vY29yZS9lZGsyIGZvciB0aGUgCj4+PiBSYXNwYmVycnkgUGkpCj4+PiArwqDC oMKgwqDCoMKgwqDCoCAqIGRlc2NyaWJlIHRoZSBtaW5pdWFydCB3aXRoIGEgYmFzZSBhZGRyZXNz IHRoYXQgCj4+PiBlbmNvbXBhc3NlcyB0aGUgYXV4aWxpYXJ5Cj4+PiArwqDCoMKgwqDCoMKgwqDC oCAqIHJlZ2lzdGVycyBzaGFyZWQgYmV0d2VlbiB0aGUgbWluaXVhcnQgYW5kIHNwaS4KPj4+ICvC oMKgwqDCoMKgwqDCoMKgICoKPj4+ICvCoMKgwqDCoMKgwqDCoMKgICogVGhpcyBpcyBkdWUgdG8g aGlzdG9yaWNhbCByZWFzb25zLCBzZWUgZGlzY3Vzc2lvbiBoZXJlIDoKPj4+ICvCoMKgwqDCoMKg wqDCoMKgICogaHR0cHM6Ly9lZGsyLmdyb3Vwcy5pby9nL2RldmVsL3RvcGljLzg3NTAxMzU3Izg0 MzQ5Cj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqCj4+PiArwqDCoMKgwqDCoMKgwqDCoCAqIFdlIG5l ZWQgdG8gYWRkIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgbWluaXVhcnQgYW5kIGF1eGlsaWFyeQo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqAgKiByZWdpc3RlcnMgdG8gZ2V0IHRoZSByZWFsIG1pbml1YXJ0 IGJhc2UgYWRkcmVzcy4KPj4KPj4gQW5kIEFDUEkgb24gdGhlIFBpNCBpcyBzbyB3aWRlbHkgZGVw bG95ZWQgdGhhdCBmaXhpbmcgdGhlIG1pbml1YXJ0IAo+PiByZXNvdXJjZXMgaXMgbm90IGFuIG9w dGlvbiBhdCBhbGw/IFRoaXMgcmVhbGx5IHJlYWxseSBjb250aW51ZXMgdG8gCj4+IGNvbnRyaWJ1 dGUgdG8gbXkgaW1wcmVzc2lvbiB0aGF0IEFDUEkgb24gdGhlIFBpNCBpcyBhIGZhZCBtb3JlIHRo YW4gYSAKPj4gcmVhbCB0aGluZywgc29ycnkuCj4gCj4gVGhlIHByb2JsZW0gYWdhaW4sIGlzIHRo YXQgdGhpcyByZXNvdXJjZSBpcyBsZWdhY3kgYW5kIHVzZWQgYnkgCj4gd2luZG93cy92bXdhcmUv ZXRjIG9uIGJvdGggdGhlIHJwaTMgYW5kIHJwaTQuIFNvLCB1bmZvcnR1bmF0ZWx5IGl0IAo+IGNh bm5vdCByZWFsbHkgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIGV4aXN0aW5nIE9Tcy4KCkNh bm5vdCB3ZSBjcmVhdGUgYW5vdGhlciBlbnRyeSB0aGF0IG9ubHkgTGludXggd291bGQgbWF0Y2g/ IFRoaXMgaXMgdGhlIApmaXJzdCB0aW1lIHRoYXQgYW4gYXR0ZW1wdCBmb3IgQUNQSWZ5aW5nIHRo ZSA4MjUwX2JjbTI4MzVhdXggaXMgZG9uZSBhcyAKZmFyIGFzIHVwc3RyZWFtIGlzIGNvbmNlcm5l ZCBzbyBhbnkgY3J1ZnQgb2YgbGVnYWN5IHRoYXQgaXMgYXJ0aWZpY2lhbCAKc2hvdWxkIHJlYWxs eSBiZSBhdm9pZGVkIGFuZCB0aGlzIGFwcGVhciB0byBiZSBzb21lLgotLSAKRmxvcmlhbgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtl cm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5l bAo=