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=-1.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_PASS 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 1AADCC43381 for ; Tue, 19 Mar 2019 17:00:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CD1BA20835 for ; Tue, 19 Mar 2019 17:00:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="CMM1xB66" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727357AbfCSRAJ (ORCPT ); Tue, 19 Mar 2019 13:00:09 -0400 Received: from fllv0016.ext.ti.com ([198.47.19.142]:38756 "EHLO fllv0016.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727018AbfCSRAJ (ORCPT ); Tue, 19 Mar 2019 13:00:09 -0400 Received: from lelv0265.itg.ti.com ([10.180.67.224]) by fllv0016.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2JGxvue020945; Tue, 19 Mar 2019 11:59:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1553014797; bh=NRtg6594FkNOvXP+rO/epHu61LR22qv+OM9Gih7OxXw=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=CMM1xB66N5z2JRpGwszoc2ZtTXNUpZjMFilTDk9xx6hHYEiSvHAdpq7QjOuLFn6So t74VwVmxV3XjhvbzTyFXvQ7sWCj9qgsievmaiCFnnELyXVmflt7Rv8Yc1sgbznA2eD UKE/A3RIhxP/rT3z9KrUh07zgH75t+hjx4XtYkTo= Received: from DFLE111.ent.ti.com (dfle111.ent.ti.com [10.64.6.32]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2JGxv1V049282 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 19 Mar 2019 11:59:57 -0500 Received: from DFLE106.ent.ti.com (10.64.6.27) by DFLE111.ent.ti.com (10.64.6.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Tue, 19 Mar 2019 11:59:57 -0500 Received: from dlep32.itg.ti.com (157.170.170.100) by DFLE106.ent.ti.com (10.64.6.27) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1713.5 via Frontend Transport; Tue, 19 Mar 2019 11:59:57 -0500 Received: from [10.250.67.168] (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep32.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2JGxuQg009304; Tue, 19 Mar 2019 11:59:56 -0500 Subject: Re: [RFC][PATCH 0/5 v2] DMA-BUF Heaps (destaging ION) To: Benjamin Gaignard , John Stultz CC: Liam Mark , lkml , Laura Abbott , Greg KH , Sumit Semwal , Brian Starkey , Chenbo Feng , Alistair Strachan , dri-devel , Vincent Donnefort , Marissa Wall References: <1551819273-640-1-git-send-email-john.stultz@linaro.org> From: "Andrew F. Davis" Message-ID: Date: Tue, 19 Mar 2019 11:59:56 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 3/19/19 11:54 AM, Benjamin Gaignard wrote: > Le mer. 13 mars 2019 à 23:31, John Stultz a écrit : >> >> On Wed, Mar 13, 2019 at 1:11 PM Liam Mark wrote: >>> On Tue, 5 Mar 2019, John Stultz wrote: >>>> >>>> Eventual TODOS: >>>> * Reimplement page-pool for system heap (working on this) >>>> * Add stats accounting to system/cma heaps >>>> * Make the kselftest actually useful >>>> * Add other heaps folks see as useful (would love to get >>>> some help from actual carveout/chunk users)! >>> >>> We use a modified carveout heap for certain secure use cases. >> >> Cool! It would be great to see if you have any concerns about adding >> such a secure-carveout heap to this framework. I suspect it would be >> fairly similar to how its integrated into ION, but particularly I'd be >> interested in issues around the lack of private flags and other >> allocation arguments like alignment. >> >>> Although there would probably be some benefit in discssing how the dma-buf >>> heap framework may want to support >>> secure heaps in the future it is a large topic which I assume you don't >>> want to tackle now. >> >> So I suspect others (Benjamin?) would have a more informed opinion on >> the details, but the intent is to allow secure heap implementations. >> I'm not sure what areas of concern you have for this allocation >> framework in particular? > > yes I would be great to understand how you provide the information to > tell that a dmabuf > is secure (or not) since we can't add flag in dmabuf structure itself. > An option is manage > the access rights when a device attach itself to the dmabuf but in > this case you need define > a list of allowed devices per heap... > If you have a good solution for secure heaps you are welcome :-) > Do we really need any of that? A secure buffer is secured by the hardware firewalls that keep out certain IP (including often the processor running Linux). So the only thing we need to track internally is that we should not allow mmap/kmap on the buffer. That can be done in the per-heap layer, everything else stays the same as a standard carveout heap. Andrew > Benjamin >> >>> We don't have any non-secure carveout heap use cases but the client use >>> case I have seen usually revolve around >>> wanting large allocations to succeed very quickly. >>> For example I have seen camera use cases which do very large allocations >>> on camera bootup from the carveout heap, these allocations would come from >>> the carveout heap and fallback to the system heap when the carveout heap >>> was full. >>> Actual non-secure carveout heap can perhaps provide more detail. >> >> Yea, I'm aware that folks still see carveout as preferable to CMA due >> to more consistent/predictable allocation latency. I think we still >> have the issue that we don't have bindings to establish/configure >> carveout regions w/ dts, and I'm not really wanting to hold up the >> allocation API on that issue. >> >> >>> Since we are making some fundamental changes to how ION worked and since >>> Android is likely also be the largest user of the dma-buf heaps framework >>> I think it would be good >>> to have a path to resolve the issues which are currently preventing >>> commercial Android releases from moving to the upstream version of ION. >> >> Yea, I do see solving the cache management efficiency issues as >> critical for the dmabuf heaps to be actually usable (my previous >> version of this patchset accidentally had my hacks to improve >> performance rolled in!). And there are discussions going on in >> various channels to try to figure out how to either change Android to >> use dma-bufs more in line with how upstream expects, or what more >> generic dma-buf changes we may need to allow Android to use dmabufs >> with the expected performance they need. >> >>> I can understand if you don't necessarily want to put all/any of these >>> changes into the dma-buf heaps framework as part of this series, but my >>> hope is we can get >>> the upstream community and the Android framework team to agree on what >>> upstreamable changes to dma-buf heaps framework, and/or the Android >>> framework, would be required in order for Android to move to the upstream >>> dma-buf heaps framework for commercial devices. >> >> Yes. Though I also don't want to get the bigger dma-buf usage >> discussion (which really affects all dmabuf exporters) too tied up >> with this patch sets attempt to provide a usable allocation interface. >> Part of the problem that I think we've seen with ION is that there is >> a nest of of related issues, and the entire thing is just too big to >> address at once, which I think is part of why ION has sat in staging >> for so long. This patchset just tries to provide an dmabuf allocation >> interface, and a few example exporter heap types. >> >>> I don't mean to make this specific to Android, but my assumption is that >>> many of the ION/dma-buf heaps issues which affect Android would likely >>> affect other new large users of the dma-buf heaps framework, so if we >>> resolve it for Android we would be helping these future users as well. >>> And I do understand that some the issues facing Android may need to be >>> resolved by making changes to Android framework. >> >> While true, I also think some of the assumptions in how the dma-bufs >> are used (pre-attachment of all devices, etc) are maybe not so >> realistic given how Android is using them. I do want to explore if >> Android can change how they use dma-bufs, but I also worry that we >> need to think about how we could loosen the expectations for dma-bufs, >> as well as trying to figure out how to support things folks have >> brought up like partial cache maintenance. >> >>> I think it would be helpful to try and get as much of this agreed upon as >>> possible before the dma-buf heaps framework moves out of staging. >>> >>> As part of my review I will highlight some of the issues which would >>> affect Android. >>> In my comments I will apply them to the system heap since that is what >>> Android currently uses for a lot of its use cases. >>> I realize that this new framework provides more flexibility to heaps, so >>> perhaps some of these issues can be solved by creating a new type of >>> system heap which Android can use, but even if the solution involves >>> creating a new system heap I would like to make sure that this "new" >>> system heap is upstreamable. >> >> So yea, I do realize I'm dodging the hard problem here, but I think >> the cache-management/usage issue is far more generic. >> >> You're right that this implementation give a lot of flexibility to the >> exporter heaps in how they implement the dmabuf ops (just like how >> other device drivers that are dmabuf exporters have the same >> flexibility), but I very much agree we don't want to add a system and >> then later a "system-android" heap. So yea, a reasonable amount of >> caution is warranted here. >> >> Thanks so much for the review and feedback! I'll try to address things >> as I can as I'm traveling this week (so I may be a bit spotty). >> >> thanks >> -john From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Andrew F. Davis" Subject: Re: [RFC][PATCH 0/5 v2] DMA-BUF Heaps (destaging ION) Date: Tue, 19 Mar 2019 11:59:56 -0500 Message-ID: References: <1551819273-640-1-git-send-email-john.stultz@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fllv0016.ext.ti.com (fllv0016.ext.ti.com [198.47.19.142]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9929089B22 for ; Tue, 19 Mar 2019 17:00:04 +0000 (UTC) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Benjamin Gaignard , John Stultz Cc: Alistair Strachan , Vincent Donnefort , Greg KH , Chenbo Feng , lkml , Liam Mark , Marissa Wall , dri-devel List-Id: dri-devel@lists.freedesktop.org T24gMy8xOS8xOSAxMTo1NCBBTSwgQmVuamFtaW4gR2FpZ25hcmQgd3JvdGU6Cj4gTGUgbWVyLiAx MyBtYXJzIDIwMTkgw6AgMjM6MzEsIEpvaG4gU3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8ub3Jn PiBhIMOpY3JpdCA6Cj4+Cj4+IE9uIFdlZCwgTWFyIDEzLCAyMDE5IGF0IDE6MTEgUE0gTGlhbSBN YXJrIDxsbWFya0Bjb2RlYXVyb3JhLm9yZz4gd3JvdGU6Cj4+PiBPbiBUdWUsIDUgTWFyIDIwMTks IEpvaG4gU3R1bHR6IHdyb3RlOgo+Pj4+Cj4+Pj4gRXZlbnR1YWwgVE9ET1M6Cj4+Pj4gKiBSZWlt cGxlbWVudCBwYWdlLXBvb2wgZm9yIHN5c3RlbSBoZWFwICh3b3JraW5nIG9uIHRoaXMpCj4+Pj4g KiBBZGQgc3RhdHMgYWNjb3VudGluZyB0byBzeXN0ZW0vY21hIGhlYXBzCj4+Pj4gKiBNYWtlIHRo ZSBrc2VsZnRlc3QgYWN0dWFsbHkgdXNlZnVsCj4+Pj4gKiBBZGQgb3RoZXIgaGVhcHMgZm9sa3Mg c2VlIGFzIHVzZWZ1bCAod291bGQgbG92ZSB0byBnZXQKPj4+PiAgIHNvbWUgaGVscCBmcm9tIGFj dHVhbCBjYXJ2ZW91dC9jaHVuayB1c2VycykhCj4+Pgo+Pj4gV2UgdXNlIGEgbW9kaWZpZWQgY2Fy dmVvdXQgaGVhcCBmb3IgY2VydGFpbiBzZWN1cmUgdXNlIGNhc2VzLgo+Pgo+PiBDb29sISBJdCB3 b3VsZCBiZSBncmVhdCB0byBzZWUgaWYgeW91IGhhdmUgYW55IGNvbmNlcm5zIGFib3V0IGFkZGlu Zwo+PiBzdWNoIGEgc2VjdXJlLWNhcnZlb3V0IGhlYXAgdG8gdGhpcyBmcmFtZXdvcmsuIEkgc3Vz cGVjdCBpdCB3b3VsZCBiZQo+PiBmYWlybHkgc2ltaWxhciB0byBob3cgaXRzIGludGVncmF0ZWQg aW50byBJT04sIGJ1dCBwYXJ0aWN1bGFybHkgSSdkIGJlCj4+IGludGVyZXN0ZWQgaW4gaXNzdWVz IGFyb3VuZCB0aGUgbGFjayBvZiBwcml2YXRlIGZsYWdzIGFuZCBvdGhlcgo+PiBhbGxvY2F0aW9u IGFyZ3VtZW50cyBsaWtlIGFsaWdubWVudC4KPj4KPj4+IEFsdGhvdWdoIHRoZXJlIHdvdWxkIHBy b2JhYmx5IGJlIHNvbWUgYmVuZWZpdCBpbiBkaXNjc3NpbmcgaG93IHRoZSBkbWEtYnVmCj4+PiBo ZWFwIGZyYW1ld29yayBtYXkgd2FudCB0byBzdXBwb3J0Cj4+PiBzZWN1cmUgaGVhcHMgaW4gdGhl IGZ1dHVyZSBpdCBpcyBhIGxhcmdlIHRvcGljIHdoaWNoIEkgYXNzdW1lIHlvdSBkb24ndAo+Pj4g d2FudCB0byB0YWNrbGUgbm93Lgo+Pgo+PiBTbyBJIHN1c3BlY3Qgb3RoZXJzIChCZW5qYW1pbj8p IHdvdWxkIGhhdmUgYSBtb3JlIGluZm9ybWVkIG9waW5pb24gb24KPj4gdGhlIGRldGFpbHMsIGJ1 dCB0aGUgaW50ZW50IGlzIHRvIGFsbG93IHNlY3VyZSBoZWFwIGltcGxlbWVudGF0aW9ucy4KPj4g SSdtIG5vdCBzdXJlIHdoYXQgYXJlYXMgb2YgY29uY2VybiB5b3UgaGF2ZSBmb3IgdGhpcyBhbGxv Y2F0aW9uCj4+IGZyYW1ld29yayBpbiBwYXJ0aWN1bGFyPwo+IAo+IHllcyBJIHdvdWxkIGJlIGdy ZWF0IHRvIHVuZGVyc3RhbmQgaG93IHlvdSBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiB0bwo+IHRl bGwgdGhhdCBhIGRtYWJ1Zgo+IGlzIHNlY3VyZSAob3Igbm90KSBzaW5jZSB3ZSBjYW4ndCBhZGQg ZmxhZyBpbiBkbWFidWYgc3RydWN0dXJlIGl0c2VsZi4KPiBBbiBvcHRpb24gaXMgbWFuYWdlCj4g dGhlIGFjY2VzcyByaWdodHMgd2hlbiBhIGRldmljZSBhdHRhY2ggaXRzZWxmIHRvIHRoZSBkbWFi dWYgYnV0IGluCj4gdGhpcyBjYXNlIHlvdSBuZWVkIGRlZmluZQo+IGEgbGlzdCBvZiBhbGxvd2Vk IGRldmljZXMgcGVyIGhlYXAuLi4KPiBJZiB5b3UgaGF2ZSBhIGdvb2Qgc29sdXRpb24gZm9yIHNl Y3VyZSBoZWFwcyB5b3UgYXJlIHdlbGNvbWUgOi0pCj4gCgpEbyB3ZSByZWFsbHkgbmVlZCBhbnkg b2YgdGhhdD8gQSBzZWN1cmUgYnVmZmVyIGlzIHNlY3VyZWQgYnkgdGhlCmhhcmR3YXJlIGZpcmV3 YWxscyB0aGF0IGtlZXAgb3V0IGNlcnRhaW4gSVAgKGluY2x1ZGluZyBvZnRlbiB0aGUKcHJvY2Vz c29yIHJ1bm5pbmcgTGludXgpLiBTbyB0aGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIHRyYWNrIGlu dGVybmFsbHkKaXMgdGhhdCB3ZSBzaG91bGQgbm90IGFsbG93IG1tYXAva21hcCBvbiB0aGUgYnVm ZmVyLiBUaGF0IGNhbiBiZSBkb25lIGluCnRoZSBwZXItaGVhcCBsYXllciwgZXZlcnl0aGluZyBl bHNlIHN0YXlzIHRoZSBzYW1lIGFzIGEgc3RhbmRhcmQKY2FydmVvdXQgaGVhcC4KCkFuZHJldwoK PiBCZW5qYW1pbgo+Pgo+Pj4gV2UgZG9uJ3QgaGF2ZSBhbnkgbm9uLXNlY3VyZSBjYXJ2ZW91dCBo ZWFwIHVzZSBjYXNlcyBidXQgdGhlIGNsaWVudCB1c2UKPj4+IGNhc2UgSSBoYXZlIHNlZW4gdXN1 YWxseSByZXZvbHZlIGFyb3VuZAo+Pj4gd2FudGluZyBsYXJnZSBhbGxvY2F0aW9ucyB0byBzdWNj ZWVkIHZlcnkgcXVpY2tseS4KPj4+IEZvciBleGFtcGxlIEkgaGF2ZSBzZWVuIGNhbWVyYSB1c2Ug Y2FzZXMgd2hpY2ggZG8gdmVyeSBsYXJnZSBhbGxvY2F0aW9ucwo+Pj4gb24gY2FtZXJhIGJvb3R1 cCBmcm9tIHRoZSBjYXJ2ZW91dCBoZWFwLCB0aGVzZSBhbGxvY2F0aW9ucyB3b3VsZCBjb21lIGZy b20KPj4+IHRoZSBjYXJ2ZW91dCBoZWFwIGFuZCBmYWxsYmFjayB0byB0aGUgc3lzdGVtIGhlYXAg d2hlbiB0aGUgY2FydmVvdXQgaGVhcAo+Pj4gd2FzIGZ1bGwuCj4+PiBBY3R1YWwgbm9uLXNlY3Vy ZSBjYXJ2ZW91dCBoZWFwIGNhbiBwZXJoYXBzIHByb3ZpZGUgbW9yZSBkZXRhaWwuCj4+Cj4+IFll YSwgSSdtIGF3YXJlIHRoYXQgZm9sa3Mgc3RpbGwgc2VlIGNhcnZlb3V0IGFzIHByZWZlcmFibGUg dG8gQ01BIGR1ZQo+PiB0byBtb3JlIGNvbnNpc3RlbnQvcHJlZGljdGFibGUgYWxsb2NhdGlvbiBs YXRlbmN5LiAgSSB0aGluayB3ZSBzdGlsbAo+PiBoYXZlIHRoZSBpc3N1ZSB0aGF0IHdlIGRvbid0 IGhhdmUgYmluZGluZ3MgdG8gZXN0YWJsaXNoL2NvbmZpZ3VyZQo+PiBjYXJ2ZW91dCByZWdpb25z IHcvIGR0cywgYW5kIEknbSBub3QgcmVhbGx5IHdhbnRpbmcgdG8gaG9sZCB1cCB0aGUKPj4gYWxs b2NhdGlvbiBBUEkgb24gdGhhdCBpc3N1ZS4KPj4KPj4KPj4+IFNpbmNlIHdlIGFyZSBtYWtpbmcg c29tZSBmdW5kYW1lbnRhbCBjaGFuZ2VzIHRvIGhvdyBJT04gd29ya2VkIGFuZCBzaW5jZQo+Pj4g QW5kcm9pZCBpcyBsaWtlbHkgYWxzbyBiZSB0aGUgbGFyZ2VzdCB1c2VyIG9mIHRoZSBkbWEtYnVm IGhlYXBzIGZyYW1ld29yawo+Pj4gSSB0aGluayBpdCB3b3VsZCBiZSBnb29kCj4+PiB0byBoYXZl IGEgcGF0aCB0byByZXNvbHZlIHRoZSBpc3N1ZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcmV2ZW50 aW5nCj4+PiBjb21tZXJjaWFsIEFuZHJvaWQgcmVsZWFzZXMgZnJvbSBtb3ZpbmcgdG8gdGhlIHVw c3RyZWFtIHZlcnNpb24gb2YgSU9OLgo+Pgo+PiBZZWEsIEkgZG8gc2VlIHNvbHZpbmcgdGhlIGNh Y2hlIG1hbmFnZW1lbnQgZWZmaWNpZW5jeSBpc3N1ZXMgYXMKPj4gY3JpdGljYWwgZm9yIHRoZSBk bWFidWYgaGVhcHMgdG8gYmUgYWN0dWFsbHkgdXNhYmxlIChteSBwcmV2aW91cwo+PiB2ZXJzaW9u IG9mIHRoaXMgcGF0Y2hzZXQgYWNjaWRlbnRhbGx5IGhhZCBteSBoYWNrcyB0byBpbXByb3ZlCj4+ IHBlcmZvcm1hbmNlIHJvbGxlZCBpbiEpLiAgQW5kIHRoZXJlIGFyZSBkaXNjdXNzaW9ucyBnb2lu ZyBvbiBpbgo+PiB2YXJpb3VzIGNoYW5uZWxzIHRvIHRyeSB0byBmaWd1cmUgb3V0IGhvdyB0byBl aXRoZXIgY2hhbmdlIEFuZHJvaWQgdG8KPj4gdXNlIGRtYS1idWZzIG1vcmUgaW4gbGluZSB3aXRo IGhvdyB1cHN0cmVhbSBleHBlY3RzLCBvciB3aGF0IG1vcmUKPj4gZ2VuZXJpYyBkbWEtYnVmIGNo YW5nZXMgd2UgbWF5IG5lZWQgdG8gYWxsb3cgQW5kcm9pZCB0byB1c2UgZG1hYnVmcwo+PiB3aXRo IHRoZSBleHBlY3RlZCBwZXJmb3JtYW5jZSB0aGV5IG5lZWQuCj4+Cj4+PiBJIGNhbiB1bmRlcnN0 YW5kIGlmIHlvdSBkb24ndCBuZWNlc3NhcmlseSB3YW50IHRvIHB1dCBhbGwvYW55IG9mIHRoZXNl Cj4+PiBjaGFuZ2VzIGludG8gdGhlIGRtYS1idWYgaGVhcHMgZnJhbWV3b3JrIGFzIHBhcnQgb2Yg dGhpcyBzZXJpZXMsIGJ1dCBteQo+Pj4gaG9wZSBpcyB3ZSBjYW4gZ2V0Cj4+PiB0aGUgdXBzdHJl YW0gY29tbXVuaXR5IGFuZCB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgdGVhbSB0byBhZ3JlZSBvbiB3 aGF0Cj4+PiB1cHN0cmVhbWFibGUgY2hhbmdlcyB0byBkbWEtYnVmIGhlYXBzIGZyYW1ld29yaywg YW5kL29yIHRoZSBBbmRyb2lkCj4+PiBmcmFtZXdvcmssIHdvdWxkIGJlIHJlcXVpcmVkIGluIG9y ZGVyIGZvciBBbmRyb2lkIHRvIG1vdmUgdG8gdGhlIHVwc3RyZWFtCj4+PiBkbWEtYnVmIGhlYXBz IGZyYW1ld29yayBmb3IgY29tbWVyY2lhbCBkZXZpY2VzLgo+Pgo+PiBZZXMuIFRob3VnaCBJIGFs c28gZG9uJ3Qgd2FudCB0byBnZXQgdGhlIGJpZ2dlciBkbWEtYnVmIHVzYWdlCj4+IGRpc2N1c3Np b24gKHdoaWNoIHJlYWxseSBhZmZlY3RzIGFsbCBkbWFidWYgZXhwb3J0ZXJzKSB0b28gdGllZCB1 cAo+PiB3aXRoIHRoaXMgcGF0Y2ggc2V0cyBhdHRlbXB0IHRvIHByb3ZpZGUgYSB1c2FibGUgYWxs b2NhdGlvbiBpbnRlcmZhY2UuCj4+IFBhcnQgb2YgdGhlIHByb2JsZW0gdGhhdCBJIHRoaW5rIHdl J3ZlIHNlZW4gd2l0aCBJT04gaXMgdGhhdCB0aGVyZSBpcwo+PiBhIG5lc3Qgb2Ygb2YgcmVsYXRl ZCBpc3N1ZXMsIGFuZCB0aGUgZW50aXJlIHRoaW5nIGlzIGp1c3QgdG9vIGJpZyB0bwo+PiBhZGRy ZXNzIGF0IG9uY2UsIHdoaWNoIEkgdGhpbmsgaXMgcGFydCBvZiB3aHkgSU9OIGhhcyBzYXQgaW4g c3RhZ2luZwo+PiBmb3Igc28gbG9uZy4gVGhpcyBwYXRjaHNldCBqdXN0IHRyaWVzIHRvIHByb3Zp ZGUgYW4gZG1hYnVmIGFsbG9jYXRpb24KPj4gaW50ZXJmYWNlLCBhbmQgYSBmZXcgZXhhbXBsZSBl eHBvcnRlciBoZWFwIHR5cGVzLgo+Pgo+Pj4gSSBkb24ndCBtZWFuIHRvIG1ha2UgdGhpcyBzcGVj aWZpYyB0byBBbmRyb2lkLCBidXQgbXkgYXNzdW1wdGlvbiBpcyB0aGF0Cj4+PiBtYW55IG9mIHRo ZSBJT04vZG1hLWJ1ZiBoZWFwcyBpc3N1ZXMgd2hpY2ggYWZmZWN0IEFuZHJvaWQgd291bGQgbGlr ZWx5Cj4+PiBhZmZlY3Qgb3RoZXIgbmV3IGxhcmdlIHVzZXJzIG9mIHRoZSBkbWEtYnVmIGhlYXBz IGZyYW1ld29yaywgc28gaWYgd2UKPj4+IHJlc29sdmUgaXQgZm9yIEFuZHJvaWQgd2Ugd291bGQg YmUgaGVscGluZyB0aGVzZSBmdXR1cmUgdXNlcnMgYXMgd2VsbC4KPj4+IEFuZCBJIGRvIHVuZGVy c3RhbmQgdGhhdCBzb21lIHRoZSBpc3N1ZXMgZmFjaW5nIEFuZHJvaWQgbWF5IG5lZWQgdG8gYmUK Pj4+IHJlc29sdmVkIGJ5IG1ha2luZyBjaGFuZ2VzIHRvIEFuZHJvaWQgZnJhbWV3b3JrLgo+Pgo+ PiBXaGlsZSB0cnVlLCBJIGFsc28gdGhpbmsgc29tZSBvZiB0aGUgYXNzdW1wdGlvbnMgaW4gaG93 IHRoZSBkbWEtYnVmcwo+PiBhcmUgdXNlZCAocHJlLWF0dGFjaG1lbnQgb2YgYWxsIGRldmljZXMs IGV0YykgYXJlIG1heWJlIG5vdCBzbwo+PiByZWFsaXN0aWMgZ2l2ZW4gaG93IEFuZHJvaWQgaXMg dXNpbmcgdGhlbS4gIEkgZG8gd2FudCB0byBleHBsb3JlIGlmCj4+IEFuZHJvaWQgY2FuIGNoYW5n ZSBob3cgdGhleSB1c2UgZG1hLWJ1ZnMsIGJ1dCBJIGFsc28gd29ycnkgdGhhdCB3ZQo+PiBuZWVk IHRvIHRoaW5rIGFib3V0IGhvdyB3ZSBjb3VsZCBsb29zZW4gdGhlIGV4cGVjdGF0aW9ucyBmb3Ig ZG1hLWJ1ZnMsCj4+IGFzIHdlbGwgYXMgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHN1cHBv cnQgdGhpbmdzIGZvbGtzIGhhdmUKPj4gYnJvdWdodCB1cCBsaWtlIHBhcnRpYWwgY2FjaGUgbWFp bnRlbmFuY2UuCj4+Cj4+PiBJIHRoaW5rIGl0IHdvdWxkIGJlIGhlbHBmdWwgdG8gdHJ5IGFuZCBn ZXQgYXMgbXVjaCBvZiB0aGlzIGFncmVlZCB1cG9uIGFzCj4+PiBwb3NzaWJsZSBiZWZvcmUgdGhl IGRtYS1idWYgaGVhcHMgZnJhbWV3b3JrIG1vdmVzIG91dCBvZiBzdGFnaW5nLgo+Pj4KPj4+IEFz IHBhcnQgb2YgbXkgcmV2aWV3IEkgd2lsbCBoaWdobGlnaHQgc29tZSBvZiB0aGUgaXNzdWVzIHdo aWNoIHdvdWxkCj4+PiBhZmZlY3QgQW5kcm9pZC4KPj4+IEluIG15IGNvbW1lbnRzIEkgd2lsbCBh cHBseSB0aGVtIHRvIHRoZSBzeXN0ZW0gaGVhcCBzaW5jZSB0aGF0IGlzIHdoYXQKPj4+IEFuZHJv aWQgY3VycmVudGx5IHVzZXMgZm9yIGEgbG90IG9mIGl0cyB1c2UgY2FzZXMuCj4+PiBJIHJlYWxp emUgdGhhdCB0aGlzIG5ldyBmcmFtZXdvcmsgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eSB0byBo ZWFwcywgc28KPj4+IHBlcmhhcHMgc29tZSBvZiB0aGVzZSBpc3N1ZXMgY2FuIGJlIHNvbHZlZCBi eSBjcmVhdGluZyBhIG5ldyB0eXBlIG9mCj4+PiBzeXN0ZW0gaGVhcCB3aGljaCBBbmRyb2lkIGNh biB1c2UsIGJ1dCBldmVuIGlmIHRoZSBzb2x1dGlvbiBpbnZvbHZlcwo+Pj4gY3JlYXRpbmcgYSBu ZXcgc3lzdGVtIGhlYXAgSSB3b3VsZCBsaWtlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgIm5ldyIK Pj4+IHN5c3RlbSBoZWFwIGlzIHVwc3RyZWFtYWJsZS4KPj4KPj4gU28geWVhLCBJIGRvIHJlYWxp emUgSSdtIGRvZGdpbmcgdGhlIGhhcmQgcHJvYmxlbSBoZXJlLCBidXQgSSB0aGluawo+PiB0aGUg Y2FjaGUtbWFuYWdlbWVudC91c2FnZSBpc3N1ZSBpcyBmYXIgbW9yZSBnZW5lcmljLgo+Pgo+PiBZ b3UncmUgcmlnaHQgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGdpdmUgYSBsb3Qgb2YgZmxleGli aWxpdHkgdG8gdGhlCj4+IGV4cG9ydGVyIGhlYXBzIGluIGhvdyB0aGV5IGltcGxlbWVudCB0aGUg ZG1hYnVmIG9wcyAoanVzdCBsaWtlIGhvdwo+PiBvdGhlciBkZXZpY2UgZHJpdmVycyB0aGF0IGFy ZSBkbWFidWYgZXhwb3J0ZXJzIGhhdmUgdGhlIHNhbWUKPj4gZmxleGliaWxpdHkpLCBidXQgSSB2 ZXJ5IG11Y2ggYWdyZWUgd2UgZG9uJ3Qgd2FudCB0byBhZGQgYSBzeXN0ZW0gYW5kCj4+IHRoZW4g bGF0ZXIgYSAic3lzdGVtLWFuZHJvaWQiIGhlYXAuIFNvIHllYSwgYSByZWFzb25hYmxlIGFtb3Vu dCBvZgo+PiBjYXV0aW9uIGlzIHdhcnJhbnRlZCBoZXJlLgo+Pgo+PiBUaGFua3Mgc28gbXVjaCBm b3IgdGhlIHJldmlldyBhbmQgZmVlZGJhY2shIEknbGwgdHJ5IHRvIGFkZHJlc3MgdGhpbmdzCj4+ IGFzIEkgY2FuIGFzIEknbSB0cmF2ZWxpbmcgdGhpcyB3ZWVrIChzbyBJIG1heSBiZSBhIGJpdCBz cG90dHkpLgo+Pgo+PiB0aGFua3MKPj4gLWpvaG4KX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVs