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=-7.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,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 DE667C43381 for ; Wed, 6 Mar 2019 18:33:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AA28B2087C for ; Wed, 6 Mar 2019 18:33:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="FMYDGQ/W" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728693AbfCFSdR (ORCPT ); Wed, 6 Mar 2019 13:33:17 -0500 Received: from fllv0016.ext.ti.com ([198.47.19.142]:35192 "EHLO fllv0016.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728582AbfCFSdR (ORCPT ); Wed, 6 Mar 2019 13:33:17 -0500 Received: from lelv0266.itg.ti.com ([10.180.67.225]) by fllv0016.ext.ti.com (8.15.2/8.15.2) with ESMTP id x26IWsSL043085; Wed, 6 Mar 2019 12:32:55 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1551897175; bh=oBIn2LlCBeVvQa2EAXWKLEE2er0kFV9nytsYYqpmFao=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=FMYDGQ/WUUlnRuMsnJejWYP915h8ajK9udf1P1Ckko6414IXn8TogS+GU3MnNQeq6 lVVhfyF4cDfYjZf6jZBjRCGbK/Y/3DgtEMeUVC5vcgEY2zEg5fWA7wDCprfmgTRbMW kJQ36cRIMUMF2Z8ubDEz/onDs51G+TiOuH1bwE/Y= Received: from DLEE103.ent.ti.com (dlee103.ent.ti.com [157.170.170.33]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x26IWs7F094264 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 6 Mar 2019 12:32:54 -0600 Received: from DLEE108.ent.ti.com (157.170.170.38) by DLEE103.ent.ti.com (157.170.170.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1591.10; Wed, 6 Mar 2019 12:32:54 -0600 Received: from dflp32.itg.ti.com (10.64.6.15) by DLEE108.ent.ti.com (157.170.170.38) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1591.10 via Frontend Transport; Wed, 6 Mar 2019 12:32:54 -0600 Received: from [172.22.114.173] (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp32.itg.ti.com (8.14.3/8.13.8) with ESMTP id x26IWrsb032111; Wed, 6 Mar 2019 12:32:53 -0600 Subject: Re: [RFC][PATCH 5/5 v2] kselftests: Add dma-heap test To: John Stultz CC: Benjamin Gaignard , lkml , Laura Abbott , Greg KH , Sumit Semwal , Liam Mark , Brian Starkey , Chenbo Feng , Alistair Strachan , ML dri-devel References: <1551819273-640-1-git-send-email-john.stultz@linaro.org> <1551819273-640-6-git-send-email-john.stultz@linaro.org> <7deadc25-c8b2-3b58-1867-86f7db3188fa@ti.com> From: "Andrew F. Davis" Message-ID: <5fbeb711-62f9-1619-cc50-15594713551f@ti.com> Date: Wed, 6 Mar 2019 12:32:53 -0600 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/6/19 12:19 PM, John Stultz wrote: > On Wed, Mar 6, 2019 at 10:15 AM Andrew F. Davis wrote: >> >> On 3/6/19 10:14 AM, Benjamin Gaignard wrote: >>> Le mar. 5 mars 2019 à 21:54, John Stultz a écrit : >>>> >>>> Add very trivial allocation test for dma-heaps. >>>> >>>> TODO: Need to actually do some validation on >>>> the returned dma-buf. >>>> >>>> Cc: Laura Abbott >>>> Cc: Benjamin Gaignard >>>> Cc: Greg KH >>>> Cc: Sumit Semwal >>>> Cc: Liam Mark >>>> Cc: Brian Starkey >>>> Cc: Andrew F. Davis >>>> Cc: Chenbo Feng >>>> Cc: Alistair Strachan >>>> Cc: dri-devel@lists.freedesktop.org >>>> Signed-off-by: John Stultz >>>> --- >>>> v2: Switched to use reworked dma-heap apis >>>> --- >>>> tools/testing/selftests/dmabuf-heaps/Makefile | 11 +++ >>>> tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c | 96 ++++++++++++++++++++++ >>>> 2 files changed, 107 insertions(+) >>>> create mode 100644 tools/testing/selftests/dmabuf-heaps/Makefile >>>> create mode 100644 tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >>>> >>>> diff --git a/tools/testing/selftests/dmabuf-heaps/Makefile b/tools/testing/selftests/dmabuf-heaps/Makefile >>>> new file mode 100644 >>>> index 0000000..c414ad3 >>>> --- /dev/null >>>> +++ b/tools/testing/selftests/dmabuf-heaps/Makefile >>>> @@ -0,0 +1,11 @@ >>>> +# SPDX-License-Identifier: GPL-2.0 >>>> +CFLAGS += -static -O3 -Wl,-no-as-needed -Wall >>>> +#LDLIBS += -lrt -lpthread -lm >>>> + >>>> +# these are all "safe" tests that don't modify >>>> +# system time or require escalated privileges >>>> +TEST_GEN_PROGS = dmabuf-heap >>>> + >>>> + >>>> +include ../lib.mk >>>> + >>>> diff --git a/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c b/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >>>> new file mode 100644 >>>> index 0000000..06837a4 >>>> --- /dev/null >>>> +++ b/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c >>>> @@ -0,0 +1,96 @@ >>>> +// SPDX-License-Identifier: GPL-2.0 >>>> + >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> + >>>> +#include "../../../../include/uapi/linux/dma-heap.h" >>>> + >>>> +#define DEVPATH "/dev/dma_heap" >>>> + >>>> +int dmabuf_heap_open(char *name) >>>> +{ >>>> + int ret, fd; >>>> + char buf[256]; >>>> + >>>> + ret = sprintf(buf, "%s/%s", DEVPATH, name); >>>> + if (ret < 0) { >>>> + printf("sprintf failed!\n"); >>>> + return ret; >>>> + } >>>> + >>>> + fd = open(buf, O_RDWR); >>>> + if (fd < 0) >>>> + printf("open %s failed!\n", buf); >>>> + return fd; >>>> +} >>>> + >>>> +int dmabuf_heap_alloc(int fd, size_t len, unsigned int flags, int *dmabuf_fd) >>>> +{ >>>> + struct dma_heap_allocation_data data = { >>>> + .len = len, >>>> + .flags = flags, >>>> + }; >>>> + int ret; >>>> + >>>> + if (dmabuf_fd == NULL) >>>> + return -EINVAL; >>>> + >>>> + ret = ioctl(fd, DMA_HEAP_IOC_ALLOC, &data); >>>> + if (ret < 0) >>>> + return ret; >>>> + *dmabuf_fd = (int)data.fd; >>>> + return ret; >>>> +} >>>> + >>>> +#define ONE_MEG (1024*1024) >>>> + >>>> +void do_test(char *heap_name) >>>> +{ >>>> + int heap_fd = -1, dmabuf_fd = -1; >>>> + int ret; >>>> + >>>> + printf("Testing heap: %s\n", heap_name); >>>> + >>>> + heap_fd = dmabuf_heap_open(heap_name); >>>> + if (heap_fd < 0) >>>> + return; >>>> + >>>> + printf("Allocating 1 MEG\n"); >>>> + ret = dmabuf_heap_alloc(heap_fd, ONE_MEG, 0, &dmabuf_fd); >>>> + if (ret) >>>> + goto out; >>>> + >>>> + /* DO SOMETHING WITH THE DMABUF HERE? */ >>> >>> You can do a call to mmap and write a pattern in the buffer. >>> >> >> mmap is optional for DMA-BUFs, only attach/map are required. To test >> those we would need a dummy device, so a test kernel module may be >> needed to really exercise this. >> >> I have one I use for ION buffer testing, it consumes a DMA-BUF passed >> from userspace, attach/maps it to a dummy device then return the >> physical address of the first page of the buffer for validation. Might >> be a good test, but dummy devices don't always have the proper dma >> attributes set like a real device does, so it may also fail for some >> otherwise valid buffers. > > Cool! Do you mind sharing that? I might try to rework and integrate it > into this patchset? > Sure, top two patches here: > https://git.ti.com/ti-analog-linux-kernel/afd-analog/commits/dma-buf-to-phys Andrew > thanks > -john > From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Andrew F. Davis" Subject: Re: [RFC][PATCH 5/5 v2] kselftests: Add dma-heap test Date: Wed, 6 Mar 2019 12:32:53 -0600 Message-ID: <5fbeb711-62f9-1619-cc50-15594713551f@ti.com> References: <1551819273-640-1-git-send-email-john.stultz@linaro.org> <1551819273-640-6-git-send-email-john.stultz@linaro.org> <7deadc25-c8b2-3b58-1867-86f7db3188fa@ti.com> 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 3931F6E160 for ; Wed, 6 Mar 2019 18:33:02 +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: John Stultz Cc: Alistair Strachan , Greg KH , Chenbo Feng , lkml , Liam Mark , ML dri-devel List-Id: dri-devel@lists.freedesktop.org T24gMy82LzE5IDEyOjE5IFBNLCBKb2huIFN0dWx0eiB3cm90ZToKPiBPbiBXZWQsIE1hciA2LCAy MDE5IGF0IDEwOjE1IEFNIEFuZHJldyBGLiBEYXZpcyA8YWZkQHRpLmNvbT4gd3JvdGU6Cj4+Cj4+ IE9uIDMvNi8xOSAxMDoxNCBBTSwgQmVuamFtaW4gR2FpZ25hcmQgd3JvdGU6Cj4+PiBMZSBtYXIu IDUgbWFycyAyMDE5IMOgIDIxOjU0LCBKb2huIFN0dWx0eiA8am9obi5zdHVsdHpAbGluYXJvLm9y Zz4gYSDDqWNyaXQgOgo+Pj4+Cj4+Pj4gQWRkIHZlcnkgdHJpdmlhbCBhbGxvY2F0aW9uIHRlc3Qg Zm9yIGRtYS1oZWFwcy4KPj4+Pgo+Pj4+IFRPRE86IE5lZWQgdG8gYWN0dWFsbHkgZG8gc29tZSB2 YWxpZGF0aW9uIG9uCj4+Pj4gdGhlIHJldHVybmVkIGRtYS1idWYuCj4+Pj4KPj4+PiBDYzogTGF1 cmEgQWJib3R0IDxsYWJib3R0QHJlZGhhdC5jb20+Cj4+Pj4gQ2M6IEJlbmphbWluIEdhaWduYXJk IDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgo+Pj4+IENjOiBHcmVnIEtIIDxncmVna2hA bGludXhmb3VuZGF0aW9uLm9yZz4KPj4+PiBDYzogU3VtaXQgU2Vtd2FsIDxzdW1pdC5zZW13YWxA bGluYXJvLm9yZz4KPj4+PiBDYzogTGlhbSBNYXJrIDxsbWFya0Bjb2RlYXVyb3JhLm9yZz4KPj4+ PiBDYzogQnJpYW4gU3RhcmtleSA8QnJpYW4uU3RhcmtleUBhcm0uY29tPgo+Pj4+IENjOiBBbmRy ZXcgRi4gRGF2aXMgPGFmZEB0aS5jb20+Cj4+Pj4gQ2M6IENoZW5ibyBGZW5nIDxmZW5nY0Bnb29n bGUuY29tPgo+Pj4+IENjOiBBbGlzdGFpciBTdHJhY2hhbiA8YXN0cmFjaGFuQGdvb2dsZS5jb20+ Cj4+Pj4gQ2M6IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPj4+PiBTaWduZWQtb2Zm LWJ5OiBKb2huIFN0dWx0eiA8am9obi5zdHVsdHpAbGluYXJvLm9yZz4KPj4+PiAtLS0KPj4+PiB2 MjogU3dpdGNoZWQgdG8gdXNlIHJld29ya2VkIGRtYS1oZWFwIGFwaXMKPj4+PiAtLS0KPj4+PiAg dG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZG1hYnVmLWhlYXBzL01ha2VmaWxlICAgICAgfCAxMSAr KysKPj4+PiAgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZG1hYnVmLWhlYXBzL2RtYWJ1Zi1oZWFw LmMgfCA5NiArKysrKysrKysrKysrKysrKysrKysrCj4+Pj4gIDIgZmlsZXMgY2hhbmdlZCwgMTA3 IGluc2VydGlvbnMoKykKPj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL3Rlc3Rpbmcvc2Vs ZnRlc3RzL2RtYWJ1Zi1oZWFwcy9NYWtlZmlsZQo+Pj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9v bHMvdGVzdGluZy9zZWxmdGVzdHMvZG1hYnVmLWhlYXBzL2RtYWJ1Zi1oZWFwLmMKPj4+Pgo+Pj4+ IGRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kbWFidWYtaGVhcHMvTWFrZWZp bGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kbWFidWYtaGVhcHMvTWFrZWZpbGUKPj4+PiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAuLmM0MTRhZDMKPj4+PiAtLS0g L2Rldi9udWxsCj4+Pj4gKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZG1hYnVmLWhlYXBz L01ha2VmaWxlCj4+Pj4gQEAgLTAsMCArMSwxMSBAQAo+Pj4+ICsjIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wCj4+Pj4gK0NGTEFHUyArPSAtc3RhdGljIC1PMyAtV2wsLW5vLWFzLW5l ZWRlZCAtV2FsbAo+Pj4+ICsjTERMSUJTICs9IC1scnQgLWxwdGhyZWFkIC1sbQo+Pj4+ICsKPj4+ PiArIyB0aGVzZSBhcmUgYWxsICJzYWZlIiB0ZXN0cyB0aGF0IGRvbid0IG1vZGlmeQo+Pj4+ICsj IHN5c3RlbSB0aW1lIG9yIHJlcXVpcmUgZXNjYWxhdGVkIHByaXZpbGVnZXMKPj4+PiArVEVTVF9H RU5fUFJPR1MgPSBkbWFidWYtaGVhcAo+Pj4+ICsKPj4+PiArCj4+Pj4gK2luY2x1ZGUgLi4vbGli Lm1rCj4+Pj4gKwo+Pj4+IGRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kbWFi dWYtaGVhcHMvZG1hYnVmLWhlYXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RtYWJ1Zi1o ZWFwcy9kbWFidWYtaGVhcC5jCj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+PiBpbmRleCAw MDAwMDAwLi4wNjgzN2E0Cj4+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4+ICsrKyBiL3Rvb2xzL3Rlc3Rp bmcvc2VsZnRlc3RzL2RtYWJ1Zi1oZWFwcy9kbWFidWYtaGVhcC5jCj4+Pj4gQEAgLTAsMCArMSw5 NiBAQAo+Pj4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+Pj4+ICsKPj4+ PiArI2luY2x1ZGUgPGRpcmVudC5oPgo+Pj4+ICsjaW5jbHVkZSA8ZXJybm8uaD4KPj4+PiArI2lu Y2x1ZGUgPGZjbnRsLmg+Cj4+Pj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+Pj4+ICsjaW5jbHVkZSA8 c3RyaW5nLmg+Cj4+Pj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPj4+PiArI2luY2x1ZGUgPHN5cy9p b2N0bC5oPgo+Pj4+ICsjaW5jbHVkZSA8c3lzL21tYW4uaD4KPj4+PiArI2luY2x1ZGUgPHN5cy90 eXBlcy5oPgo+Pj4+ICsKPj4+PiArI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvdWFwaS9s aW51eC9kbWEtaGVhcC5oIgo+Pj4+ICsKPj4+PiArI2RlZmluZSBERVZQQVRIICIvZGV2L2RtYV9o ZWFwIgo+Pj4+ICsKPj4+PiAraW50IGRtYWJ1Zl9oZWFwX29wZW4oY2hhciAqbmFtZSkKPj4+PiAr ewo+Pj4+ICsgICAgICAgaW50IHJldCwgZmQ7Cj4+Pj4gKyAgICAgICBjaGFyIGJ1ZlsyNTZdOwo+ Pj4+ICsKPj4+PiArICAgICAgIHJldCA9IHNwcmludGYoYnVmLCAiJXMvJXMiLCBERVZQQVRILCBu YW1lKTsKPj4+PiArICAgICAgIGlmIChyZXQgPCAwKSB7Cj4+Pj4gKyAgICAgICAgICAgICAgIHBy aW50Zigic3ByaW50ZiBmYWlsZWQhXG4iKTsKPj4+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl dDsKPj4+PiArICAgICAgIH0KPj4+PiArCj4+Pj4gKyAgICAgICBmZCA9IG9wZW4oYnVmLCBPX1JE V1IpOwo+Pj4+ICsgICAgICAgaWYgKGZkIDwgMCkKPj4+PiArICAgICAgICAgICAgICAgcHJpbnRm KCJvcGVuICVzIGZhaWxlZCFcbiIsIGJ1Zik7Cj4+Pj4gKyAgICAgICByZXR1cm4gZmQ7Cj4+Pj4g K30KPj4+PiArCj4+Pj4gK2ludCBkbWFidWZfaGVhcF9hbGxvYyhpbnQgZmQsIHNpemVfdCBsZW4s IHVuc2lnbmVkIGludCBmbGFncywgaW50ICpkbWFidWZfZmQpCj4+Pj4gK3sKPj4+PiArICAgICAg IHN0cnVjdCBkbWFfaGVhcF9hbGxvY2F0aW9uX2RhdGEgZGF0YSA9IHsKPj4+PiArICAgICAgICAg ICAgICAgLmxlbiA9IGxlbiwKPj4+PiArICAgICAgICAgICAgICAgLmZsYWdzID0gZmxhZ3MsCj4+ Pj4gKyAgICAgICB9Owo+Pj4+ICsgICAgICAgaW50IHJldDsKPj4+PiArCj4+Pj4gKyAgICAgICBp ZiAoZG1hYnVmX2ZkID09IE5VTEwpCj4+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFM Owo+Pj4+ICsKPj4+PiArICAgICAgIHJldCA9IGlvY3RsKGZkLCBETUFfSEVBUF9JT0NfQUxMT0Ms ICZkYXRhKTsKPj4+PiArICAgICAgIGlmIChyZXQgPCAwKQo+Pj4+ICsgICAgICAgICAgICAgICBy ZXR1cm4gcmV0Owo+Pj4+ICsgICAgICAgKmRtYWJ1Zl9mZCA9IChpbnQpZGF0YS5mZDsKPj4+PiAr ICAgICAgIHJldHVybiByZXQ7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gKyNkZWZpbmUgT05FX01FRyAo MTAyNCoxMDI0KQo+Pj4+ICsKPj4+PiArdm9pZCBkb190ZXN0KGNoYXIgKmhlYXBfbmFtZSkKPj4+ PiArewo+Pj4+ICsgICAgICAgaW50IGhlYXBfZmQgPSAtMSwgZG1hYnVmX2ZkID0gLTE7Cj4+Pj4g KyAgICAgICBpbnQgcmV0Owo+Pj4+ICsKPj4+PiArICAgICAgIHByaW50ZigiVGVzdGluZyBoZWFw OiAlc1xuIiwgaGVhcF9uYW1lKTsKPj4+PiArCj4+Pj4gKyAgICAgICBoZWFwX2ZkID0gZG1hYnVm X2hlYXBfb3BlbihoZWFwX25hbWUpOwo+Pj4+ICsgICAgICAgaWYgKGhlYXBfZmQgPCAwKQo+Pj4+ ICsgICAgICAgICAgICAgICByZXR1cm47Cj4+Pj4gKwo+Pj4+ICsgICAgICAgcHJpbnRmKCJBbGxv Y2F0aW5nIDEgTUVHXG4iKTsKPj4+PiArICAgICAgIHJldCA9IGRtYWJ1Zl9oZWFwX2FsbG9jKGhl YXBfZmQsIE9ORV9NRUcsIDAsICZkbWFidWZfZmQpOwo+Pj4+ICsgICAgICAgaWYgKHJldCkKPj4+ PiArICAgICAgICAgICAgICAgZ290byBvdXQ7Cj4+Pj4gKwo+Pj4+ICsgICAgICAgLyogRE8gU09N RVRISU5HIFdJVEggVEhFIERNQUJVRiBIRVJFPyAqLwo+Pj4KPj4+IFlvdSBjYW4gZG8gYSBjYWxs IHRvIG1tYXAgYW5kIHdyaXRlIGEgcGF0dGVybiBpbiB0aGUgYnVmZmVyLgo+Pj4KPj4KPj4gbW1h cCBpcyBvcHRpb25hbCBmb3IgRE1BLUJVRnMsIG9ubHkgYXR0YWNoL21hcCBhcmUgcmVxdWlyZWQu IFRvIHRlc3QKPj4gdGhvc2Ugd2Ugd291bGQgbmVlZCBhIGR1bW15IGRldmljZSwgc28gYSB0ZXN0 IGtlcm5lbCBtb2R1bGUgbWF5IGJlCj4+IG5lZWRlZCB0byByZWFsbHkgZXhlcmNpc2UgdGhpcy4K Pj4KPj4gSSBoYXZlIG9uZSBJIHVzZSBmb3IgSU9OIGJ1ZmZlciB0ZXN0aW5nLCBpdCBjb25zdW1l cyBhIERNQS1CVUYgcGFzc2VkCj4+IGZyb20gdXNlcnNwYWNlLCBhdHRhY2gvbWFwcyBpdCB0byBh IGR1bW15IGRldmljZSB0aGVuIHJldHVybiB0aGUKPj4gcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUg Zmlyc3QgcGFnZSBvZiB0aGUgYnVmZmVyIGZvciB2YWxpZGF0aW9uLiBNaWdodAo+PiBiZSBhIGdv b2QgdGVzdCwgYnV0IGR1bW15IGRldmljZXMgZG9uJ3QgYWx3YXlzIGhhdmUgdGhlIHByb3BlciBk bWEKPj4gYXR0cmlidXRlcyBzZXQgbGlrZSBhIHJlYWwgZGV2aWNlIGRvZXMsIHNvIGl0IG1heSBh bHNvIGZhaWwgZm9yIHNvbWUKPj4gb3RoZXJ3aXNlIHZhbGlkIGJ1ZmZlcnMuCj4gCj4gQ29vbCEg RG8geW91IG1pbmQgc2hhcmluZyB0aGF0PyBJIG1pZ2h0IHRyeSB0byByZXdvcmsgYW5kIGludGVn cmF0ZSBpdAo+IGludG8gdGhpcyBwYXRjaHNldD8KPiAKClN1cmUsIHRvcCB0d28gcGF0Y2hlcyBo ZXJlOgoKPiBodHRwczovL2dpdC50aS5jb20vdGktYW5hbG9nLWxpbnV4LWtlcm5lbC9hZmQtYW5h bG9nL2NvbW1pdHMvZG1hLWJ1Zi10by1waHlzCgpBbmRyZXcKCj4gdGhhbmtzCj4gLWpvaG4KPiAK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs