From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 31F86C433E1 for ; Wed, 24 Jun 2020 12:07:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EFBD32088E for ; Wed, 24 Jun 2020 12:07:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593000422; bh=DelhQOfEurrxPvXb+ZVq9Hz9ysbh4ZnDAcJ9Lv18tFE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=Y8+mWqym+ZlFXfRX6VpM2HNl14qooiNXUQ0cOA7hbDqFbW9kA3kW0YBlgETEHZdNU XXezSIKo6u7FAQC8wRUM/nQum+JCBDx5dCqpzKcD8BtLEu10/ZUHbsCNbjSQ5l/o3D SBRK4Pf+lXLvGe0bBJoDf/JN8F96Zl21VKlHaOf4= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389400AbgFXMHA convert rfc822-to-8bit (ORCPT ); Wed, 24 Jun 2020 08:07:00 -0400 Received: from mail-ej1-f44.google.com ([209.85.218.44]:34566 "EHLO mail-ej1-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388522AbgFXMG7 (ORCPT ); Wed, 24 Jun 2020 08:06:59 -0400 Received: by mail-ej1-f44.google.com with SMTP id y10so2221689eje.1; Wed, 24 Jun 2020 05:06:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=DIWUKwC5j7zR6xCRsdwY2boMvp3E8i9Nf4eBjr5JHPY=; b=VyzvRJ92l84AlOQmqf/tStZfCbdlYQGJJPXdEeyJV6q+spGaEYp9D1zfig7MIwtOrW kkEYSiCbH+7h/Om4mG1ql4HOmqCjkf1eP78IfU8IGvBtQZZ4KBs9hIbdXXVO1b4cqPpk Bh1YDptkRZSjeTITcF53u4BCrDHlKnJkNuqdyD2308rlk4nEDj7qzN1ESVO7XJY3k/zU WPCFC5A9h4+lX3Y5HZsF5rd+vNgrMvyKMW/C/D/u/HOUaeEfpzIjceIZHSvHsXg0gzsg LR8dyJRs4fI5sMQa+wTZUjKWqNjv/yZSwZEdz9rtCc/QcD4wJg5BKHd/GHWdXOVM4lH+ lrdA== X-Gm-Message-State: AOAM532boGHg4tFvN5+HI4xEUzDxN/4uj9PozyWeDug9WwU47MrrwXc8 RXb8vVUzQ4v7zIa31TzwOJI= X-Google-Smtp-Source: ABdhPJzw7dT7DuLroeMpi/tOn6HV4dIL8x9Vwikz8xM5kRlyFgOqcL6z4RnjLqHE3ANNvd+Td26jsg== X-Received: by 2002:a17:906:1b45:: with SMTP id p5mr11645122ejg.51.1593000414538; Wed, 24 Jun 2020 05:06:54 -0700 (PDT) Received: from pi3 ([194.230.155.235]) by smtp.googlemail.com with ESMTPSA id b98sm5452294edf.24.2020.06.24.05.06.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jun 2020 05:06:53 -0700 (PDT) Date: Wed, 24 Jun 2020 14:06:51 +0200 From: Krzysztof Kozlowski To: Kamil Konieczny Cc: Lukasz Luba , Willy Wolff , Chanwoo Choi , MyungJoo Ham , Kyungmin Park , Kukjin Kim , linux-pm@vger.kernel.org, "linux-samsung-soc@vger.kernel.org" , linux-arm-kernel@lists.infradead.org, "linux-kernel@vger.kernel.org" Subject: Re: brocken devfreq simple_ondemand for Odroid XU3/4? Message-ID: <20200624120651.GA20813@pi3> References: <20200623164733.qbhua7b6cg2umafj@macmini.local> <20200623191129.GA4171@kozik-lap> <85f5a8c0-7d48-f2cd-3385-c56d662f2c88@arm.com> <828b0d63-4d01-48d6-5971-64855adebed2@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8BIT In-Reply-To: <828b0d63-4d01-48d6-5971-64855adebed2@samsung.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 24, 2020 at 01:18:42PM +0200, Kamil Konieczny wrote: > Hi, > > On 24.06.2020 12:32, Lukasz Luba wrote: > > Hi Krzysztof and Willy > > > > On 6/23/20 8:11 PM, Krzysztof Kozlowski wrote: > >> On Tue, Jun 23, 2020 at 09:02:38PM +0200, Krzysztof Kozlowski wrote: > >>> On Tue, 23 Jun 2020 at 18:47, Willy Wolff wrote: > >>>> > >>>> Hi everybody, > >>>> > >>>> Is DVFS for memory bus really working on Odroid XU3/4 board? > >>>> Using a simple microbenchmark that is doing only memory accesses, memory DVFS > >>>> seems to not working properly: > >>>> > >>>> The microbenchmark is doing pointer chasing by following index in an array. > >>>> Indices in the array are set to follow a random pattern (cutting prefetcher), > >>>> and forcing RAM access. > >>>> > >>>> git clone https://protect2.fireeye.com/url?k=c364e88a-9eb6fe2f-c36563c5-0cc47a31bee8-631885f0a63a11a0&q=1&u=https%3A%2F%2Fgithub.com%2Fwwilly%2Fbenchmark.git \ > >>>>    && cd benchmark \ > >>>>    && source env.sh \ > >>>>    && ./bench_build.sh \ > >>>>    && bash source/scripts/test_dvfs_mem.sh > >>>> > >>>> Python 3, cmake and sudo rights are required. > >>>> > >>>> Results: > >>>> DVFS CPU with performance governor > >>>> mem_gov = simple_ondemand at 165000000 Hz in idle, should be bumped when the > >>>> benchmark is running. > >>>> - on the LITTLE cluster it takes 4.74308 s to run (683.004 c per memory access), > >>>> - on the big cluster it takes 4.76556 s to run (980.343 c per moemory access). > >>>> > >>>> While forcing DVFS memory bus to use performance governor, > >>>> mem_gov = performance at 825000000 Hz in idle, > >>>> - on the LITTLE cluster it takes 1.1451 s to run (164.894 c per memory access), > >>>> - on the big cluster it takes 1.18448 s to run (243.664 c per memory access). > >>>> > >>>> The kernel used is the last 5.7.5 stable with default exynos_defconfig. > >>> > >>> Thanks for the report. Few thoughts: > >>> 1. What trans_stat are saying? Except DMC driver you can also check > >>> all other devfreq devices (e.g. wcore) - maybe the devfreq events > >>> (nocp) are not properly assigned? > >>> 2. Try running the measurement for ~1 minutes or longer. The counters > >>> might have some delay (which would require probably fixing but the > >>> point is to narrow the problem). > >>> 3. What do you understand by "mem_gov"? Which device is it? > >> > >> +Cc Lukasz who was working on this. > > > > Thanks Krzysztof for adding me here. > > > >> > >> I just run memtester and more-or-less ondemand works (at least ramps > >> up): > >> > >> Before: > >> /sys/class/devfreq/10c20000.memory-controller$ cat trans_stat > >>       From  :   To > >>             : 165000000 206000000 275000000 413000000 543000000 633000000 728000000 825000000   time(ms) > >> * 165000000:         0         0         0         0         0         0         0         0   1795950 > >>    206000000:         1         0         0         0         0         0         0         0      4770 > >>    275000000:         0         1         0         0         0         0         0         0     15540 > >>    413000000:         0         0         1         0         0         0         0         0     20780 > >>    543000000:         0         0         0         1         0         0         0         1     10760 > >>    633000000:         0         0         0         0         2         0         0         0     10310 > >>    728000000:         0         0         0         0         0         0         0         0         0 > >>    825000000:         0         0         0         0         0         2         0         0     25920 > >> Total transition : 9 > >> > >> > >> $ sudo memtester 1G > >> > >> During memtester: > >> /sys/class/devfreq/10c20000.memory-controller$ cat trans_stat > >>       From  :   To > >>             : 165000000 206000000 275000000 413000000 543000000 633000000 728000000 825000000   time(ms) > >>    165000000:         0         0         0         0         0         0         0         1   1801490 > >>    206000000:         1         0         0         0         0         0         0         0      4770 > >>    275000000:         0         1         0         0         0         0         0         0     15540 > >>    413000000:         0         0         1         0         0         0         0         0     20780 > >>    543000000:         0         0         0         1         0         0         0         2     11090 > >>    633000000:         0         0         0         0         3         0         0         0     17210 > >>    728000000:         0         0         0         0         0         0         0         0         0 > >> * 825000000:         0         0         0         0         0         3         0         0    169020 > >> Total transition : 13 > >> > >> However after killing memtester it stays at 633 MHz for very long time > >> and does not slow down. This is indeed weird... > > > > I had issues with devfreq governor which wasn't called by devfreq > > workqueue. The old DELAYED vs DEFERRED work discussions and my patches > > for it [1]. If the CPU which scheduled the next work went idle, the > > devfreq workqueue will not be kicked and devfreq governor won't check > > DMC status and will not decide to decrease the frequency based on low > > busy_time. > > The same applies for going up with the frequency. They both are > > done by the governor but the workqueue must be scheduled periodically. > > > > I couldn't do much with this back then. I have given the example that > > this is causing issues with the DMC [2]. There is also a description > > of your situation staying at 633MHz for long time: > > ' When it is missing opportunity > > to change the frequency, it can either harm the performance or power > > consumption, depending of the frequency the device stuck on.' > > > > The patches were not accepted because it will cause CPU wake-up from > > idle, which increases the energy consumption. I know that there were > > some other attempts, but I don't know the status. > > > > I had also this devfreq workqueue issue when I have been working on > > thermal cooling for devfreq. The device status was not updated, because > > the devfreq workqueue didn't check the device [3]. > > > > Let me investigate if that is the case. > > > > Regards, > > Lukasz > > > > [1] https%3A%2F%2Flkml.org%2Flkml%2F2019%2F2%2F11%2F1146 > > [2] https%3A%2F%2Flkml.org%2Flkml%2F2019%2F2%2F12%2F383 > > [3] https%3A%2F%2Flwn.net%2Fml%2Flinux-kernel%2F20200511111912.3001-11-lukasz.luba%40arm.com%2F > > and here was another try to fix wq: "PM / devfreq: add possibility for delayed work" > > https://lkml.org/lkml/2019/12/9/486 My case was clearly showing wrong behavior. System was idle but not sleeping - network working, SSH connection ongoing. Therefore at least one CPU was not idle and could adjust the devfreq/DMC... but this did not happen. The system stayed for like a minute in 633 MHz OPP. Not-waking up idle processors - ok... so why not using power efficient workqueue? It is exactly for this purpose - wake up from time to time on whatever CPU to do the necessary job. Best regards, Krzysztof From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8835CC433E0 for ; Wed, 24 Jun 2020 12:08:56 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4A25A2088E for ; Wed, 24 Jun 2020 12:08:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="MutKdIcT" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4A25A2088E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=gopW1L0QRx1jC/mC1UUlIbXIjmng5OH/uC4aHK9Ynf8=; b=MutKdIcT+pRjP/aWiePKDvvAg 6GhbVMh9Bdta7DOGXhi2XYGQkUnCZhclN+pEAqXudmDx/OIGzYvflwKl9f8TtRRZGEicT+ckA0PwB l7w9PCXF5nj8FJGXU23NpLFAmJdUCfk+jnB3FlLNNlXukJ2MBotXFV10mvZyeRVpCC7OLdaRxA4Nj XXmE5iV1nrLg21NAVPT9L+Ewk7165cZynzvs/2zVXcTGy1+yWl5k73itCCXhqGLxkER93452NY9CM ikuPb7GgmkHvPrI1TSD65rLSrs83QysdWFGLVqfSyfBkkiBtNk4MLFtQIXaoIDAyG5vY5eKHFKIwn TmuMKRkMA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jo4B9-0007Xn-9s; Wed, 24 Jun 2020 12:06:59 +0000 Received: from mail-ej1-f53.google.com ([209.85.218.53]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jo4B5-0007XC-Vi for linux-arm-kernel@lists.infradead.org; Wed, 24 Jun 2020 12:06:57 +0000 Received: by mail-ej1-f53.google.com with SMTP id w6so2194297ejq.6 for ; Wed, 24 Jun 2020 05:06:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=DIWUKwC5j7zR6xCRsdwY2boMvp3E8i9Nf4eBjr5JHPY=; b=pAdsThBioFQLZ4pW6u5Phh0w4L4GJf2d4sDqWyL5Q1Wk97WCWvXCS1zZ4RiD5yBfKw PV2q78Utt/kLENKPiZmxYr61PppZFVFcBtbBdjHlFskngT6wZf+6GFgfoLczFe95DG4e z1F91WswxnSfqTahoWTGvM7oHPH2V3/Hub4BZYm+O2CklNst9zcJUvk1+/Kx7+Q6Hzxi wzZQpCw0qX1Zz4zqWf55VE0A4tNycRLZzAqC06bTmw5gaLlmb4aKNrvtpIWMxZapD/2n 7qcbHbN/fBhsXr12G0WChMmuAdaJQFKmJzzVdyU50r8MpMXsdx/kmuFEW7RsBqNs6hS3 o9mQ== X-Gm-Message-State: AOAM5320pRg9QYA7z6H3s/jwihI4hUPpsCVE/R4In/WVDc+UE+DokjLz VXpoCbNHzCjVvYaFwyPniXw= X-Google-Smtp-Source: ABdhPJzw7dT7DuLroeMpi/tOn6HV4dIL8x9Vwikz8xM5kRlyFgOqcL6z4RnjLqHE3ANNvd+Td26jsg== X-Received: by 2002:a17:906:1b45:: with SMTP id p5mr11645122ejg.51.1593000414538; Wed, 24 Jun 2020 05:06:54 -0700 (PDT) Received: from pi3 ([194.230.155.235]) by smtp.googlemail.com with ESMTPSA id b98sm5452294edf.24.2020.06.24.05.06.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jun 2020 05:06:53 -0700 (PDT) Date: Wed, 24 Jun 2020 14:06:51 +0200 From: Krzysztof Kozlowski To: Kamil Konieczny Subject: Re: brocken devfreq simple_ondemand for Odroid XU3/4? Message-ID: <20200624120651.GA20813@pi3> References: <20200623164733.qbhua7b6cg2umafj@macmini.local> <20200623191129.GA4171@kozik-lap> <85f5a8c0-7d48-f2cd-3385-c56d662f2c88@arm.com> <828b0d63-4d01-48d6-5971-64855adebed2@samsung.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <828b0d63-4d01-48d6-5971-64855adebed2@samsung.com> X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-kernel@lists.infradead.org, Willy Wolff , "linux-samsung-soc@vger.kernel.org" , linux-pm@vger.kernel.org, "linux-kernel@vger.kernel.org" , Chanwoo Choi , Kyungmin Park , Kukjin Kim , MyungJoo Ham , Lukasz Luba Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBKdW4gMjQsIDIwMjAgYXQgMDE6MTg6NDJQTSArMDIwMCwgS2FtaWwgS29uaWVjem55 IHdyb3RlOgo+IEhpLAo+IAo+IE9uIDI0LjA2LjIwMjAgMTI6MzIsIEx1a2FzeiBMdWJhIHdyb3Rl Ogo+ID4gSGkgS3J6eXN6dG9mIGFuZCBXaWxseQo+ID4gCj4gPiBPbiA2LzIzLzIwIDg6MTEgUE0s IEtyenlzenRvZiBLb3psb3dza2kgd3JvdGU6Cj4gPj4gT24gVHVlLCBKdW4gMjMsIDIwMjAgYXQg MDk6MDI6MzhQTSArMDIwMCwgS3J6eXN6dG9mIEtvemxvd3NraSB3cm90ZToKPiA+Pj4gT24gVHVl LCAyMyBKdW4gMjAyMCBhdCAxODo0NywgV2lsbHkgV29sZmYgPHdpbGx5Lm1oLndvbGZmLm1sQGdt YWlsLmNvbT4gd3JvdGU6Cj4gPj4+Pgo+ID4+Pj4gSGkgZXZlcnlib2R5LAo+ID4+Pj4KPiA+Pj4+ IElzIERWRlMgZm9yIG1lbW9yeSBidXMgcmVhbGx5IHdvcmtpbmcgb24gT2Ryb2lkIFhVMy80IGJv YXJkPwo+ID4+Pj4gVXNpbmcgYSBzaW1wbGUgbWljcm9iZW5jaG1hcmsgdGhhdCBpcyBkb2luZyBv bmx5IG1lbW9yeSBhY2Nlc3NlcywgbWVtb3J5IERWRlMKPiA+Pj4+IHNlZW1zIHRvIG5vdCB3b3Jr aW5nIHByb3Blcmx5Ogo+ID4+Pj4KPiA+Pj4+IFRoZSBtaWNyb2JlbmNobWFyayBpcyBkb2luZyBw b2ludGVyIGNoYXNpbmcgYnkgZm9sbG93aW5nIGluZGV4IGluIGFuIGFycmF5Lgo+ID4+Pj4gSW5k aWNlcyBpbiB0aGUgYXJyYXkgYXJlIHNldCB0byBmb2xsb3cgYSByYW5kb20gcGF0dGVybiAoY3V0 dGluZyBwcmVmZXRjaGVyKSwKPiA+Pj4+IGFuZCBmb3JjaW5nIFJBTSBhY2Nlc3MuCj4gPj4+Pgo+ ID4+Pj4gZ2l0IGNsb25lIGh0dHBzOi8vcHJvdGVjdDIuZmlyZWV5ZS5jb20vdXJsP2s9YzM2NGU4 OGEtOWViNmZlMmYtYzM2NTYzYzUtMGNjNDdhMzFiZWU4LTYzMTg4NWYwYTYzYTExYTAmcT0xJnU9 aHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGd3dpbGx5JTJGYmVuY2htYXJrLmdpdCBcCj4gPj4+ PiDCoMKgICYmIGNkIGJlbmNobWFyayBcCj4gPj4+PiDCoMKgICYmIHNvdXJjZSBlbnYuc2ggXAo+ ID4+Pj4gwqDCoCAmJiAuL2JlbmNoX2J1aWxkLnNoIFwKPiA+Pj4+IMKgwqAgJiYgYmFzaCBzb3Vy Y2Uvc2NyaXB0cy90ZXN0X2R2ZnNfbWVtLnNoCj4gPj4+Pgo+ID4+Pj4gUHl0aG9uIDMsIGNtYWtl IGFuZCBzdWRvIHJpZ2h0cyBhcmUgcmVxdWlyZWQuCj4gPj4+Pgo+ID4+Pj4gUmVzdWx0czoKPiA+ Pj4+IERWRlMgQ1BVIHdpdGggcGVyZm9ybWFuY2UgZ292ZXJub3IKPiA+Pj4+IG1lbV9nb3YgPSBz aW1wbGVfb25kZW1hbmQgYXQgMTY1MDAwMDAwIEh6IGluIGlkbGUsIHNob3VsZCBiZSBidW1wZWQg d2hlbiB0aGUKPiA+Pj4+IGJlbmNobWFyayBpcyBydW5uaW5nLgo+ID4+Pj4gLSBvbiB0aGUgTElU VExFIGNsdXN0ZXIgaXQgdGFrZXMgNC43NDMwOCBzIHRvIHJ1biAoNjgzLjAwNCBjIHBlciBtZW1v cnkgYWNjZXNzKSwKPiA+Pj4+IC0gb24gdGhlIGJpZyBjbHVzdGVyIGl0IHRha2VzIDQuNzY1NTYg cyB0byBydW4gKDk4MC4zNDMgYyBwZXIgbW9lbW9yeSBhY2Nlc3MpLgo+ID4+Pj4KPiA+Pj4+IFdo aWxlIGZvcmNpbmcgRFZGUyBtZW1vcnkgYnVzIHRvIHVzZSBwZXJmb3JtYW5jZSBnb3Zlcm5vciwK PiA+Pj4+IG1lbV9nb3YgPSBwZXJmb3JtYW5jZSBhdCA4MjUwMDAwMDAgSHogaW4gaWRsZSwKPiA+ Pj4+IC0gb24gdGhlIExJVFRMRSBjbHVzdGVyIGl0IHRha2VzIDEuMTQ1MSBzIHRvIHJ1biAoMTY0 Ljg5NCBjIHBlciBtZW1vcnkgYWNjZXNzKSwKPiA+Pj4+IC0gb24gdGhlIGJpZyBjbHVzdGVyIGl0 IHRha2VzIDEuMTg0NDggcyB0byBydW4gKDI0My42NjQgYyBwZXIgbWVtb3J5IGFjY2VzcykuCj4g Pj4+Pgo+ID4+Pj4gVGhlIGtlcm5lbCB1c2VkIGlzIHRoZSBsYXN0IDUuNy41IHN0YWJsZSB3aXRo IGRlZmF1bHQgZXh5bm9zX2RlZmNvbmZpZy4KPiA+Pj4KPiA+Pj4gVGhhbmtzIGZvciB0aGUgcmVw b3J0LiBGZXcgdGhvdWdodHM6Cj4gPj4+IDEuIFdoYXQgdHJhbnNfc3RhdCBhcmUgc2F5aW5nPyBF eGNlcHQgRE1DIGRyaXZlciB5b3UgY2FuIGFsc28gY2hlY2sKPiA+Pj4gYWxsIG90aGVyIGRldmZy ZXEgZGV2aWNlcyAoZS5nLiB3Y29yZSkgLSBtYXliZSB0aGUgZGV2ZnJlcSBldmVudHMKPiA+Pj4g KG5vY3ApIGFyZSBub3QgcHJvcGVybHkgYXNzaWduZWQ/Cj4gPj4+IDIuIFRyeSBydW5uaW5nIHRo ZSBtZWFzdXJlbWVudCBmb3IgfjEgbWludXRlcyBvciBsb25nZXIuIFRoZSBjb3VudGVycwo+ID4+ PiBtaWdodCBoYXZlIHNvbWUgZGVsYXkgKHdoaWNoIHdvdWxkIHJlcXVpcmUgcHJvYmFibHkgZml4 aW5nIGJ1dCB0aGUKPiA+Pj4gcG9pbnQgaXMgdG8gbmFycm93IHRoZSBwcm9ibGVtKS4KPiA+Pj4g My4gV2hhdCBkbyB5b3UgdW5kZXJzdGFuZCBieSAibWVtX2dvdiI/IFdoaWNoIGRldmljZSBpcyBp dD8KPiA+Pgo+ID4+ICtDYyBMdWthc3ogd2hvIHdhcyB3b3JraW5nIG9uIHRoaXMuCj4gPiAKPiA+ IFRoYW5rcyBLcnp5c3p0b2YgZm9yIGFkZGluZyBtZSBoZXJlLgo+ID4gCj4gPj4KPiA+PiBJIGp1 c3QgcnVuIG1lbXRlc3RlciBhbmQgbW9yZS1vci1sZXNzIG9uZGVtYW5kIHdvcmtzIChhdCBsZWFz dCByYW1wcwo+ID4+IHVwKToKPiA+Pgo+ID4+IEJlZm9yZToKPiA+PiAvc3lzL2NsYXNzL2RldmZy ZXEvMTBjMjAwMDAubWVtb3J5LWNvbnRyb2xsZXIkIGNhdCB0cmFuc19zdGF0Cj4gPj4gwqDCoMKg wqDCoCBGcm9twqAgOsKgwqAgVG8KPiA+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDogMTY1MDAw MDAwIDIwNjAwMDAwMCAyNzUwMDAwMDAgNDEzMDAwMDAwIDU0MzAwMDAwMCA2MzMwMDAwMDAgNzI4 MDAwMDAwIDgyNTAwMDAwMMKgwqAgdGltZShtcykKPiA+PiAqIDE2NTAwMDAwMDrCoMKgwqDCoMKg wqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDC oMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKg IDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgIDE3OTU5NTAKPiA+PiDCoMKgIDIwNjAwMDAwMDrCoMKg wqDCoMKgwqDCoMKgIDHCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDC oMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKg wqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgIDQ3NzAKPiA+PiDCoMKgIDI3NTAw MDAwMDrCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDHCoMKgwqDCoMKgwqDCoMKg IDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDC oMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoCAxNTU0MAo+ID4+IMKg wqAgNDEzMDAwMDAwOsKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKg wqDCoMKgwqAgMcKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDC oMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgIDIwNzgw Cj4gPj4gwqDCoCA1NDMwMDAwMDA6wqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAw wqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAxwqDCoMKgwqDCoMKgwqDCoCAwwqDC oMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAxwqDCoMKg wqAgMTA3NjAKPiA+PiDCoMKgIDYzMzAwMDAwMDrCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKg wqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDC oMKgIDLCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKg IDDCoMKgwqDCoCAxMDMxMAo+ID4+IMKgwqAgNzI4MDAwMDAwOsKgwqDCoMKgwqDCoMKgwqAgMMKg wqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDC oMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKg wqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMAo+ID4+IMKgwqAgODI1MDAwMDAwOsKgwqDCoMKg wqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDC oMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMsKgwqDCoMKgwqDCoMKg wqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgIDI1OTIwCj4gPj4gVG90YWwgdHJhbnNpdGlv biA6IDkKPiA+Pgo+ID4+Cj4gPj4gJCBzdWRvIG1lbXRlc3RlciAxRwo+ID4+Cj4gPj4gRHVyaW5n IG1lbXRlc3RlcjoKPiA+PiAvc3lzL2NsYXNzL2RldmZyZXEvMTBjMjAwMDAubWVtb3J5LWNvbnRy b2xsZXIkIGNhdCB0cmFuc19zdGF0Cj4gPj4gwqDCoMKgwqDCoCBGcm9twqAgOsKgwqAgVG8KPiA+ PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDogMTY1MDAwMDAwIDIwNjAwMDAwMCAyNzUwMDAwMDAg NDEzMDAwMDAwIDU0MzAwMDAwMCA2MzMwMDAwMDAgNzI4MDAwMDAwIDgyNTAwMDAwMMKgwqAgdGlt ZShtcykKPiA+PiDCoMKgIDE2NTAwMDAwMDrCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDC oMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKg IDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDHC oMKgIDE4MDE0OTAKPiA+PiDCoMKgIDIwNjAwMDAwMDrCoMKgwqDCoMKgwqDCoMKgIDHCoMKgwqDC oMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKg wqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDC oMKgIDDCoMKgwqDCoMKgIDQ3NzAKPiA+PiDCoMKgIDI3NTAwMDAwMDrCoMKgwqDCoMKgwqDCoMKg IDDCoMKgwqDCoMKgwqDCoMKgIDHCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDC oMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKg wqDCoMKgwqDCoMKgIDDCoMKgwqDCoCAxNTU0MAo+ID4+IMKgwqAgNDEzMDAwMDAwOsKgwqDCoMKg wqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMcKgwqDCoMKgwqDC oMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKg wqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgIDIwNzgwCj4gPj4gwqDCoCA1NDMwMDAwMDA6 wqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAwwqDC oMKgwqDCoMKgwqDCoCAxwqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAwwqDCoMKg wqDCoMKgwqDCoCAwwqDCoMKgwqDCoMKgwqDCoCAywqDCoMKgwqAgMTEwOTAKPiA+PiDCoMKgIDYz MzAwMDAwMDrCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDC oMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDPCoMKgwqDCoMKgwqDCoMKg IDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoCAxNzIxMAo+ID4+ IMKgwqAgNzI4MDAwMDAwOsKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDC oMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKg wqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDC oMKgwqAgMAo+ID4+ICogODI1MDAwMDAwOsKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKg wqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAg MMKgwqDCoMKgwqDCoMKgwqAgM8KgwqDCoMKgwqDCoMKgwqAgMMKgwqDCoMKgwqDCoMKgwqAgMMKg wqDCoCAxNjkwMjAKPiA+PiBUb3RhbCB0cmFuc2l0aW9uIDogMTMKPiA+Pgo+ID4+IEhvd2V2ZXIg YWZ0ZXIga2lsbGluZyBtZW10ZXN0ZXIgaXQgc3RheXMgYXQgNjMzIE1IeiBmb3IgdmVyeSBsb25n IHRpbWUKPiA+PiBhbmQgZG9lcyBub3Qgc2xvdyBkb3duLiBUaGlzIGlzIGluZGVlZCB3ZWlyZC4u Lgo+ID4gCj4gPiBJIGhhZCBpc3N1ZXMgd2l0aCBkZXZmcmVxIGdvdmVybm9yIHdoaWNoIHdhc24n dCBjYWxsZWQgYnkgZGV2ZnJlcQo+ID4gd29ya3F1ZXVlLiBUaGUgb2xkIERFTEFZRUQgdnMgREVG RVJSRUQgd29yayBkaXNjdXNzaW9ucyBhbmQgbXkgcGF0Y2hlcwo+ID4gZm9yIGl0IFsxXS4gSWYg dGhlIENQVSB3aGljaCBzY2hlZHVsZWQgdGhlIG5leHQgd29yayB3ZW50IGlkbGUsIHRoZQo+ID4g ZGV2ZnJlcSB3b3JrcXVldWUgd2lsbCBub3QgYmUga2lja2VkIGFuZCBkZXZmcmVxIGdvdmVybm9y IHdvbid0IGNoZWNrCj4gPiBETUMgc3RhdHVzIGFuZCB3aWxsIG5vdCBkZWNpZGUgdG8gZGVjcmVh c2UgdGhlIGZyZXF1ZW5jeSBiYXNlZCBvbiBsb3cKPiA+IGJ1c3lfdGltZS4KPiA+IFRoZSBzYW1l IGFwcGxpZXMgZm9yIGdvaW5nIHVwIHdpdGggdGhlIGZyZXF1ZW5jeS4gVGhleSBib3RoIGFyZQo+ ID4gZG9uZSBieSB0aGUgZ292ZXJub3IgYnV0IHRoZSB3b3JrcXVldWUgbXVzdCBiZSBzY2hlZHVs ZWQgcGVyaW9kaWNhbGx5Lgo+ID4gCj4gPiBJIGNvdWxkbid0IGRvIG11Y2ggd2l0aCB0aGlzIGJh Y2sgdGhlbi4gSSBoYXZlIGdpdmVuIHRoZSBleGFtcGxlIHRoYXQKPiA+IHRoaXMgaXMgY2F1c2lu ZyBpc3N1ZXMgd2l0aCB0aGUgRE1DIFsyXS4gVGhlcmUgaXMgYWxzbyBhIGRlc2NyaXB0aW9uCj4g PiBvZiB5b3VyIHNpdHVhdGlvbiBzdGF5aW5nIGF0IDYzM01IeiBmb3IgbG9uZyB0aW1lOgo+ID4g JyBXaGVuIGl0IGlzIG1pc3Npbmcgb3Bwb3J0dW5pdHkKPiA+IHRvIGNoYW5nZSB0aGUgZnJlcXVl bmN5LCBpdCBjYW4gZWl0aGVyIGhhcm0gdGhlIHBlcmZvcm1hbmNlIG9yIHBvd2VyCj4gPiBjb25z dW1wdGlvbiwgZGVwZW5kaW5nIG9mIHRoZSBmcmVxdWVuY3kgdGhlIGRldmljZSBzdHVjayBvbi4n Cj4gPiAKPiA+IFRoZSBwYXRjaGVzIHdlcmUgbm90IGFjY2VwdGVkIGJlY2F1c2UgaXQgd2lsbCBj YXVzZSBDUFUgd2FrZS11cCBmcm9tCj4gPiBpZGxlLCB3aGljaCBpbmNyZWFzZXMgdGhlIGVuZXJn eSBjb25zdW1wdGlvbi4gSSBrbm93IHRoYXQgdGhlcmUgd2VyZQo+ID4gc29tZSBvdGhlciBhdHRl bXB0cywgYnV0IEkgZG9uJ3Qga25vdyB0aGUgc3RhdHVzLgo+ID4gCj4gPiBJIGhhZCBhbHNvIHRo aXMgZGV2ZnJlcSB3b3JrcXVldWUgaXNzdWUgd2hlbiBJIGhhdmUgYmVlbiB3b3JraW5nIG9uCj4g PiB0aGVybWFsIGNvb2xpbmcgZm9yIGRldmZyZXEuIFRoZSBkZXZpY2Ugc3RhdHVzIHdhcyBub3Qg dXBkYXRlZCwgYmVjYXVzZQo+ID4gdGhlIGRldmZyZXEgd29ya3F1ZXVlIGRpZG4ndCBjaGVjayB0 aGUgZGV2aWNlIFszXS4KPiA+IAo+ID4gTGV0IG1lIGludmVzdGlnYXRlIGlmIHRoYXQgaXMgdGhl IGNhc2UuCj4gPiAKPiA+IFJlZ2FyZHMsCj4gPiBMdWthc3oKPiA+IAo+ID4gWzFdIGh0dHBzJTNB JTJGJTJGbGttbC5vcmclMkZsa21sJTJGMjAxOSUyRjIlMkYxMSUyRjExNDYKPiA+IFsyXSBodHRw cyUzQSUyRiUyRmxrbWwub3JnJTJGbGttbCUyRjIwMTklMkYyJTJGMTIlMkYzODMKPiA+IFszXSBo dHRwcyUzQSUyRiUyRmx3bi5uZXQlMkZtbCUyRmxpbnV4LWtlcm5lbCUyRjIwMjAwNTExMTExOTEy LjMwMDEtMTEtbHVrYXN6Lmx1YmElNDBhcm0uY29tJTJGCj4gCj4gYW5kIGhlcmUgd2FzIGFub3Ro ZXIgdHJ5IHRvIGZpeCB3cTogIlBNIC8gZGV2ZnJlcTogYWRkIHBvc3NpYmlsaXR5IGZvciBkZWxh eWVkIHdvcmsiCj4gCj4gaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTkvMTIvOS80ODYKCk15IGNh c2Ugd2FzIGNsZWFybHkgc2hvd2luZyB3cm9uZyBiZWhhdmlvci4gU3lzdGVtIHdhcyBpZGxlIGJ1 dCBub3QKc2xlZXBpbmcgLSBuZXR3b3JrIHdvcmtpbmcsIFNTSCBjb25uZWN0aW9uIG9uZ29pbmcu ICBUaGVyZWZvcmUgYXQgbGVhc3QKb25lIENQVSB3YXMgbm90IGlkbGUgYW5kIGNvdWxkIGFkanVz dCB0aGUgZGV2ZnJlcS9ETUMuLi4gYnV0IHRoaXMgZGlkIG5vdApoYXBwZW4uIFRoZSBzeXN0ZW0g c3RheWVkIGZvciBsaWtlIGEgbWludXRlIGluIDYzMyBNSHogT1BQLgoKTm90LXdha2luZyB1cCBp ZGxlIHByb2Nlc3NvcnMgLSBvay4uLiBzbyB3aHkgbm90IHVzaW5nIHBvd2VyIGVmZmljaWVudAp3 b3JrcXVldWU/IEl0IGlzIGV4YWN0bHkgZm9yIHRoaXMgcHVycG9zZSAtIHdha2UgdXAgZnJvbSB0 aW1lIHRvIHRpbWUgb24Kd2hhdGV2ZXIgQ1BVIHRvIGRvIHRoZSBuZWNlc3Nhcnkgam9iLgoKQmVz dCByZWdhcmRzLApLcnp5c3p0b2YKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2Vy bmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==