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=-9.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,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 1B1EBC433E2 for ; Fri, 28 Aug 2020 10:34:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D8B0A2086A for ; Fri, 28 Aug 2020 10:34:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="W8woipnq" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728984AbgH1Keo (ORCPT ); Fri, 28 Aug 2020 06:34:44 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:31067 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728269AbgH1Keh (ORCPT ); Fri, 28 Aug 2020 06:34:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598610873; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eyhyOZZeXyjOUxzIH0DtRTqoBLTjTp+jiU9M+24uIhg=; b=W8woipnqE9IZRoPGEkJTj4CVjVs3Zn5tmXZURlO9GKFwrfNg/D9D+efyUQLqWegABJ/G6r pKJOq677b8tAw+uo9vFZGVV2ngZ7dDhXM4U0+MdSVBmlQJN1QGaq9EEQUPSUuikqU6Q00z bgQU2xdQsSbSkpuuYhdJSdUivUrBAnA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-21-njR1iMVoNSG-WNv5-XNFkQ-1; Fri, 28 Aug 2020 06:34:28 -0400 X-MC-Unique: njR1iMVoNSG-WNv5-XNFkQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 712EC8712FE; Fri, 28 Aug 2020 10:34:24 +0000 (UTC) Received: from gondolin (ovpn-113-255.ams2.redhat.com [10.36.113.255]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1A4116716C; Fri, 28 Aug 2020 10:34:12 +0000 (UTC) Date: Fri, 28 Aug 2020 12:34:09 +0200 From: Cornelia Huck To: Jason Wang Cc: Kishon Vijay Abraham I , "Michael S. Tsirkin" , Ohad Ben-Cohen , Bjorn Andersson , Jon Mason , Dave Jiang , Allen Hubbe , Lorenzo Pieralisi , Bjorn Helgaas , Paolo Bonzini , Stefan Hajnoczi , Stefano Garzarella , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, linux-ntb@googlegroups.com, linux-pci@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org Subject: Re: [RFC PATCH 00/22] Enhance VHOST to enable SoC-to-SoC communication Message-ID: <20200828123409.4cd2a812.cohuck@redhat.com> In-Reply-To: References: <20200702082143.25259-1-kishon@ti.com> <20200702055026-mutt-send-email-mst@kernel.org> <603970f5-3289-cd53-82a9-aa62b292c552@redhat.com> <14c6cad7-9361-7fa4-e1c6-715ccc7e5f6b@ti.com> <59fd6a0b-8566-44b7-3dae-bb52b468219b@redhat.com> <45a8a97c-2061-13ee-5da8-9877a4a3b8aa@ti.com> Organization: Red Hat GmbH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Sender: linux-doc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org On Thu, 9 Jul 2020 14:26:53 +0800 Jason Wang wrote: [Let me note right at the beginning that I first noted this while listening to Kishon's talk at LPC on Wednesday. I might be very confused about the background here, so let me apologize beforehand for any confusion I might spread.] > On 2020/7/8 =E4=B8=8B=E5=8D=889:13, Kishon Vijay Abraham I wrote: > > Hi Jason, > > > > On 7/8/2020 4:52 PM, Jason Wang wrote: =20 > >> On 2020/7/7 =E4=B8=8B=E5=8D=8810:45, Kishon Vijay Abraham I wrote: =20 > >>> Hi Jason, > >>> > >>> On 7/7/2020 3:17 PM, Jason Wang wrote: =20 > >>>> On 2020/7/6 =E4=B8=8B=E5=8D=885:32, Kishon Vijay Abraham I wrote: =20 > >>>>> Hi Jason, > >>>>> > >>>>> On 7/3/2020 12:46 PM, Jason Wang wrote: =20 > >>>>>> On 2020/7/2 =E4=B8=8B=E5=8D=889:35, Kishon Vijay Abraham I wrote: = =20 > >>>>>>> Hi Jason, > >>>>>>> > >>>>>>> On 7/2/2020 3:40 PM, Jason Wang wrote: =20 > >>>>>>>> On 2020/7/2 =E4=B8=8B=E5=8D=885:51, Michael S. Tsirkin wrote: =20 > >>>>>>>>> On Thu, Jul 02, 2020 at 01:51:21PM +0530, Kishon Vijay Abraham = I wrote: =20 > >>>>>>>>>> This series enhances Linux Vhost support to enable SoC-to-SoC > >>>>>>>>>> communication over MMIO. This series enables rpmsg communicati= on between > >>>>>>>>>> two SoCs using both PCIe RC<->EP and HOST1-NTB-HOST2 > >>>>>>>>>> > >>>>>>>>>> 1) Modify vhost to use standard Linux driver model > >>>>>>>>>> 2) Add support in vring to access virtqueue over MMIO > >>>>>>>>>> 3) Add vhost client driver for rpmsg > >>>>>>>>>> 4) Add PCIe RC driver (uses virtio) and PCIe EP driver (uses v= host) for > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rpmsg communication betw= een two SoCs connected to each other > >>>>>>>>>> 5) Add NTB Virtio driver and NTB Vhost driver for rpmsg commun= ication > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 between two SoCs connect= ed via NTB > >>>>>>>>>> 6) Add configfs to configure the components > >>>>>>>>>> > >>>>>>>>>> UseCase1 : > >>>>>>>>>> > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0 VHOST RPMSG=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 VIRTIO RPMSG > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 + > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> +-----v------+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +------v-------+ > >>>>>>>>>> |=C2=A0=C2=A0 Linux=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= |=C2=A0=C2=A0=C2=A0=C2=A0 Linux=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> |=C2=A0 Endpoint=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | Root Complex= | > >>>>>>>>>> |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 <----------------->=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> |=C2=A0=C2=A0=C2=A0 SOC1=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0=C2=A0=C2=A0=C2=A0 SOC2=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> +------------+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +--------------+ > >>>>>>>>>> > >>>>>>>>>> UseCase 2: > >>>>>>>>>> > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 VHOST RPMSG= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 VI= RTIO RPMSG > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 + > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +------v------+=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +------v------+ > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0 HOST= 1=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= |=C2=A0=C2=A0=C2=A0 HOST2=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +------^------+=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +------^------+ > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | > >>>>>>>>>> +-------------------------------------------------------------= --------+ > >>>>>>>>>> |=C2=A0 +------v------+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 +------v------+=C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0 EP=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2= =A0=C2=A0=C2=A0 EP=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 | > >>>>>>>>>> |=C2=A0 | CONTROLLER1 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 | CONTROLLER2 |=C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 <----------------------------------->=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 |=C2=A0 SoC With Multiple EP Instances=C2=A0=C2=A0 |= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |= =C2=A0 | > >>>>>>>>>> |=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 |=C2=A0 (Configured using NTB Function)=C2=A0 |=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 | > >>>>>>>>>> |=C2=A0 +-------------+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 +-------------+=C2=A0 | > >>>>>>>>>> +-------------------------------------------------------------= --------+ First of all, to clarify the terminology: Is "vhost rpmsg" acting as what the virtio standard calls the 'device', and "virtio rpmsg" as the 'driver'? Or is the "vhost" part mostly just virtqueues + the exiting vhost interfaces? > >>>>>>>>>> > >>>>>>>>>> Software Layering: > >>>>>>>>>> > >>>>>>>>>> The high-level SW layering should look something like below. T= his series > >>>>>>>>>> adds support only for RPMSG VHOST, however something similar s= hould be > >>>>>>>>>> done for net and scsi. With that any vhost device (PCI, NTB, P= latform > >>>>>>>>>> device, user) can use any of the vhost client driver. > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +----------------+= =C2=A0 +-----------+=C2=A0 +------------+=C2=A0 +----------+ > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 RPMSG VHOS= T=C2=A0=C2=A0 |=C2=A0 | NET VHOST |=C2=A0 | SCSI VHOST |=C2=A0 |=C2=A0=C2= =A0=C2=A0 X=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 +-------^--------+= =C2=A0 +-----^-----+=C2=A0 +-----^------+=C2=A0 +----^-----+ > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> +-----------v-----------------v--------------v--------------v-= ---------+ > >>>>>>>>>> |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 VHOST CORE=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= | > >>>>>>>>>> +--------^---------------^--------------------^---------------= ---^-----+ > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> +--------v-------+=C2=A0 +----v------+=C2=A0 +----------v-----= -----+=C2=A0 +----v-----+ > >>>>>>>>>> |=C2=A0 PCI EPF VHOST |=C2=A0 | NTB VHOST |=C2=A0 |PLATFORM DE= VICE VHOST|=C2=A0 |=C2=A0=C2=A0=C2=A0 X=C2=A0=C2=A0=C2=A0=C2=A0 | > >>>>>>>>>> +----------------+=C2=A0 +-----------+=C2=A0 +----------------= -----+=C2=A0 +----------+ So, the upper half is basically various functionality types, e.g. a net device. What is the lower half, a hardware interface? Would it be equivalent to e.g. a normal PCI device? > >>>>>>>>>> > >>>>>>>>>> This was initially proposed here [1] > >>>>>>>>>> > >>>>>>>>>> [1] -> > >>>>>>>>>> https://lore.kernel.org/r/2cf00ec4-1ed6-f66e-6897-006d1a5b6390= @ti.com =20 > >>>>>>>>> I find this very interesting. A huge patchset so will take a bit > >>>>>>>>> to review, but I certainly plan to do that. Thanks! =20 > >>>>>>>> Yes, it would be better if there's a git branch for us to have a= look. =20 > >>>>>>> I've pushed the branch > >>>>>>> https://github.com/kishon/linux-wip.git vhost_rpmsg_pci_ntb_rfc = =20 > >>>>>> Thanks > >>>>>> > >>>>>> =20 > >>>>>>>> Btw, I'm not sure I get the big picture, but I vaguely feel some= of the > >>>>>>>> work is > >>>>>>>> duplicated with vDPA (e.g the epf transport or vhost bus). =20 > >>>>>>> This is about connecting two different HW systems both running Li= nux and > >>>>>>> doesn't necessarily involve virtualization. =20 > >>>>>> Right, this is something similar to VOP > >>>>>> (Documentation/misc-devices/mic/mic_overview.rst). The different i= s the > >>>>>> hardware I guess and VOP use userspace application to implement th= e device. =20 > >>>>> I'd also like to point out, this series tries to have communication= between > >>>>> two > >>>>> SoCs in vendor agnostic way. Since this series solves for 2 usecase= s (PCIe > >>>>> RC<->EP and NTB), for the NTB case it directly plugs into NTB frame= work and > >>>>> any > >>>>> of the HW in NTB below should be able to use a virtio-vhost communi= cation > >>>>> > >>>>> #ls drivers/ntb/hw/ > >>>>> amd=C2=A0 epf=C2=A0 idt=C2=A0 intel=C2=A0 mscc > >>>>> > >>>>> And similarly for the PCIe RC<->EP communication, this adds a gener= ic endpoint > >>>>> function driver and hence any SoC that supports configurable PCIe e= ndpoint can > >>>>> use virtio-vhost communication > >>>>> > >>>>> # ls drivers/pci/controller/dwc/*ep* > >>>>> drivers/pci/controller/dwc/pcie-designware-ep.c > >>>>> drivers/pci/controller/dwc/pcie-uniphier-ep.c > >>>>> drivers/pci/controller/dwc/pci-layerscape-ep.c =20 > >>>> Thanks for those backgrounds. > >>>> > >>>> =20 > >>>>>>> =C2=A0=C2=A0=C2=A0 So there is no guest or host as in > >>>>>>> virtualization but two entirely different systems connected via P= CIe cable, > >>>>>>> one > >>>>>>> acting as guest and one as host. So one system will provide virtio > >>>>>>> functionality reserving memory for virtqueues and the other provi= des vhost > >>>>>>> functionality providing a way to access the virtqueues in virtio = memory. > >>>>>>> One is > >>>>>>> source and the other is sink and there is no intermediate entity.= (vhost was > >>>>>>> probably intermediate entity in virtualization?) =20 > >>>>>> (Not a native English speaker) but "vhost" could introduce some co= nfusion for > >>>>>> me since it was use for implementing virtio backend for userspace = drivers. I > >>>>>> guess "vringh" could be better. =20 > >>>>> Initially I had named this vringh but later decided to choose vhost= instead of > >>>>> vringh. vhost is still a virtio backend (not necessarily userspace)= though it > >>>>> now resides in an entirely different system. Whatever virtio is for= a frontend > >>>>> system, vhost can be that for a backend system. vring can be for ac= cessing > >>>>> virtqueue and can be used either in frontend or backend. =20 I guess that clears up at least some of my questions from above... > >>>> Ok. > >>>> > >>>> =20 > >>>>>>>> Have you considered to implement these through vDPA? =20 > >>>>>>> IIUC vDPA only provides an interface to userspace and an in-kerne= l rpmsg > >>>>>>> driver > >>>>>>> or vhost net driver is not provided. > >>>>>>> > >>>>>>> The HW connection looks something like https://pasteboard.co/JfMV= VHC.jpg > >>>>>>> (usecase2 above), =20 > >>>>>> I see. > >>>>>> > >>>>>> =20 > >>>>>>> =C2=A0=C2=A0=C2=A0 all the boards run Linux. The middle board pr= ovides NTB > >>>>>>> functionality and board on either side provides virtio/vhost > >>>>>>> functionality and > >>>>>>> transfer data using rpmsg.=20 This setup looks really interesting (sometimes, it's really hard to imagine this in the abstract.) =20 > >>>>>> So I wonder whether it's worthwhile for a new bus. Can we use > >>>>>> the existed virtio-bus/drivers? It might work as, except for > >>>>>> the epf transport, we can introduce a epf "vhost" transport > >>>>>> driver. =20 > >>>>> IMHO we'll need two buses one for frontend and other for > >>>>> backend because the two components can then co-operate/interact > >>>>> with each other to provide a functionality. Though both will > >>>>> seemingly provide similar callbacks, they are both provide > >>>>> symmetrical or complimentary funcitonality and need not be same > >>>>> or identical. > >>>>> > >>>>> Having the same bus can also create sequencing issues. > >>>>> > >>>>> If you look at virtio_dev_probe() of virtio_bus > >>>>> > >>>>> device_features =3D dev->config->get_features(dev); > >>>>> > >>>>> Now if we use same bus for both front-end and back-end, both > >>>>> will try to get_features when there has been no set_features. > >>>>> Ideally vhost device should be initialized first with the set > >>>>> of features it supports. Vhost and virtio should use "status" > >>>>> and "features" complimentarily and not identically. =20 > >>>> Yes, but there's no need for doing status/features passthrough > >>>> in epf vhost drivers.b > >>>> > >>>> =20 > >>>>> virtio device (or frontend) cannot be initialized before vhost > >>>>> device (or backend) gets initialized with data such as > >>>>> features. Similarly vhost (backend) > >>>>> cannot access virqueues or buffers before virtio (frontend) sets > >>>>> VIRTIO_CONFIG_S_DRIVER_OK whereas that requirement is not there > >>>>> for virtio as the physical memory for virtqueues are created by > >>>>> virtio (frontend). =20 > >>>> epf vhost drivers need to implement two devices: vhost(vringh) > >>>> device and virtio device (which is a mediated device). The > >>>> vhost(vringh) device is doing feature negotiation with the > >>>> virtio device via RC/EP or NTB. The virtio device is doing > >>>> feature negotiation with local virtio drivers. If there're > >>>> feature mismatch, epf vhost drivers and do mediation between > >>>> them. =20 > >>> Here epf vhost should be initialized with a set of features for > >>> it to negotiate either as vhost device or virtio device no? Where > >>> should the initial feature set for epf vhost come from? =20 > >> > >> I think it can work as: > >> > >> 1) Having an initial features (hard coded in the code) set X in > >> epf vhost 2) Using this X for both virtio device and vhost(vringh) > >> device 3) local virtio driver will negotiate with virtio device > >> with feature set Y 4) remote virtio driver will negotiate with > >> vringh device with feature set Z 5) mediate between feature Y and > >> feature Z since both Y and Z are a subset of X > >> > >> =20 > > okay. I'm also thinking if we could have configfs for configuring > > this. Anyways we could find different approaches of configuring > > this. =20 >=20 >=20 > Yes, and I think some management API is needed even in the design of=20 > your "Software Layering". In that figure, rpmsg vhost need some > pre-set or hard-coded features. When I saw the plumbers talk, my first idea was "this needs to be a new transport". You have some hard-coded or pre-configured features, and then features are negotiated via a transport-specific means in the usual way. There's basically an extra/extended layer for this (and status, and whatever). Does that make any sense? >=20 >=20 > >>>>>> It will have virtqueues but only used for the communication > >>>>>> between itself and > >>>>>> uppter virtio driver. And it will have vringh queues which > >>>>>> will be probe by virtio epf transport drivers. And it needs to > >>>>>> do datacopy between virtqueue and > >>>>>> vringh queues. > >>>>>> > >>>>>> It works like: > >>>>>> > >>>>>> virtio drivers <- virtqueue/virtio-bus -> epf vhost drivers <- > >>>>>> vringh queue/epf> =20 > >>>>>> > >>>>>> The advantages is that there's no need for writing new buses > >>>>>> and drivers. =20 > >>>>> I think this will work however there is an addtional copy > >>>>> between vringh queue and virtqueue, =20 > >>>> I think not? E.g in use case 1), if we stick to virtio bus, we > >>>> will have: > >>>> > >>>> virtio-rpmsg (EP) <- virtio ring(1) -> epf vhost driver (EP) <- > >>>> virtio ring(2) -> virtio pci (RC) <-> virtio rpmsg (RC) =20 > >>> IIUC epf vhost driver (EP) will access virtio ring(2) using > >>> vringh? =20 > >> > >> Yes. > >> > >> =20 > >>> And virtio > >>> ring(2) is created by virtio pci (RC). =20 > >> > >> Yes. > >> > >> =20 > >>>> What epf vhost driver did is to read from virtio ring(1) about > >>>> the buffer len and addr and them DMA to Linux(RC)? =20 > >>> okay, I made some optimization here where vhost-rpmsg using a > >>> helper writes a buffer from rpmsg's upper layer directly to > >>> remote Linux (RC) as against here were it has to be first written > >>> to virtio ring (1). > >>> > >>> Thinking how this would look for NTB > >>> virtio-rpmsg (HOST1) <- virtio ring(1) -> NTB(HOST1) <-> > >>> NTB(HOST2)=C2=A0 <- virtio ring(2) -> virtio-rpmsg (HOST2) > >>> > >>> Here the NTB(HOST1) will access the virtio ring(2) using vringh? =20 > >> > >> Yes, I think so it needs to use vring to access virtio ring (1) as > >> well. =20 > > NTB(HOST1) and virtio ring(1) will be in the same system. So it > > doesn't have to use vring. virtio ring(1) is by the virtio device > > the NTB(HOST1) creates. =20 >=20 >=20 > Right. >=20 >=20 > >> =20 > >>> Do you also think this will work seamlessly with virtio_net.c, > >>> virtio_blk.c? =20 > >> > >> Yes. =20 > > okay, I haven't looked at this but the backend of virtio_blk should > > access an actual storage device no? =20 >=20 >=20 > Good point, for non-peer device like storage. There's probably no > need for it to be registered on the virtio bus and it might be better > to behave as you proposed. I might be missing something; but if you expose something as a block device, it should have something it can access with block reads/writes, shouldn't it? Of course, that can be a variety of things. >=20 > Just to make sure I understand the design, how is VHOST SCSI expected > to work in your proposal, does it have a device for file as a backend? >=20 >=20 > >> =20 > >>> I'd like to get clarity on two things in the approach you > >>> suggested, one is features (since epf vhost should ideally be > >>> transparent to any virtio driver) =20 > >> > >> We can have have an array of pre-defined features indexed by > >> virtio device id in the code. > >> > >> =20 > >>> and the other is how certain inputs to virtio device such as > >>> number of buffers be determined. =20 > >> > >> We can start from hard coded the value like 256, or introduce some > >> API for user to change the value. > >> > >> =20 > >>> Thanks again for your suggestions! =20 > >> > >> You're welcome. > >> > >> Note that I just want to check whether or not we can reuse the > >> virtio bus/driver. It's something similar to what you proposed in > >> Software Layering but we just replace "vhost core" with "virtio > >> bus" and move the vhost core below epf/ntb/platform transport. =20 > > Got it. My initial design was based on my understanding of your > > comments [1]. =20 >=20 >=20 > Yes, but that's just for a networking device. If we want something > more generic, it may require more thought (bus etc). I believe that we indeed need something bus-like to be able to support a variety of devices. >=20 >=20 > > > > I'll try to create something based on your proposed design here. =20 >=20 >=20 > Sure, but for coding, we'd better wait for other's opinion here. Please tell me if my thoughts above make any sense... I have just started looking at that, so I might be completely off. 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=-8.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,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 C1F63C433E6 for ; Fri, 28 Aug 2020 10:34:45 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (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 6A1BE2086A for ; Fri, 28 Aug 2020 10:34:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="SB0u9c5F" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6A1BE2086A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=virtualization-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 3BA6387FED; Fri, 28 Aug 2020 10:34:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BZnlKU6I9Wjg; Fri, 28 Aug 2020 10:34:41 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id BFD5287CE1; Fri, 28 Aug 2020 10:34:41 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A4D85C016F; Fri, 28 Aug 2020 10:34:41 +0000 (UTC) Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 1024FC0051 for ; Fri, 28 Aug 2020 10:34:40 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id D6EA4228E8 for ; Fri, 28 Aug 2020 10:34:39 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 366I3mFAxU42 for ; Fri, 28 Aug 2020 10:34:37 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by silver.osuosl.org (Postfix) with ESMTPS id C4751228DC for ; Fri, 28 Aug 2020 10:34:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598610875; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eyhyOZZeXyjOUxzIH0DtRTqoBLTjTp+jiU9M+24uIhg=; b=SB0u9c5FduHKisFEZ9yCLtfdDYUaLCPvbOUAmx6dQoiWufAOX3I4hvNBDsNxTBSDKX3vHB TRUz+VesNJXnX2baN93L27NeuzkiIiLeo7GJX26PrF3KaPRUamZCN+oaxwIRskrrgw/md1 n5rgbmdbCI+42rnOD9bliR3/+pqj/vA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-21-njR1iMVoNSG-WNv5-XNFkQ-1; Fri, 28 Aug 2020 06:34:28 -0400 X-MC-Unique: njR1iMVoNSG-WNv5-XNFkQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 712EC8712FE; Fri, 28 Aug 2020 10:34:24 +0000 (UTC) Received: from gondolin (ovpn-113-255.ams2.redhat.com [10.36.113.255]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1A4116716C; Fri, 28 Aug 2020 10:34:12 +0000 (UTC) Date: Fri, 28 Aug 2020 12:34:09 +0200 From: Cornelia Huck To: Jason Wang Subject: Re: [RFC PATCH 00/22] Enhance VHOST to enable SoC-to-SoC communication Message-ID: <20200828123409.4cd2a812.cohuck@redhat.com> In-Reply-To: References: <20200702082143.25259-1-kishon@ti.com> <20200702055026-mutt-send-email-mst@kernel.org> <603970f5-3289-cd53-82a9-aa62b292c552@redhat.com> <14c6cad7-9361-7fa4-e1c6-715ccc7e5f6b@ti.com> <59fd6a0b-8566-44b7-3dae-bb52b468219b@redhat.com> <45a8a97c-2061-13ee-5da8-9877a4a3b8aa@ti.com> Organization: Red Hat GmbH MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Cc: Ohad Ben-Cohen , Allen Hubbe , Lorenzo Pieralisi , Dave Jiang , kvm@vger.kernel.org, linux-ntb@googlegroups.com, "Michael S. Tsirkin" , linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson , netdev@vger.kernel.org, Stefan Hajnoczi , Jon Mason , Bjorn Helgaas , Paolo Bonzini , Kishon Vijay Abraham I , virtualization@lists.linux-foundation.org X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" T24gVGh1LCA5IEp1bCAyMDIwIDE0OjI2OjUzICswODAwCkphc29uIFdhbmcgPGphc293YW5nQHJl ZGhhdC5jb20+IHdyb3RlOgoKW0xldCBtZSBub3RlIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgdGhh dCBJIGZpcnN0IG5vdGVkIHRoaXMgd2hpbGUKbGlzdGVuaW5nIHRvIEtpc2hvbidzIHRhbGsgYXQg TFBDIG9uIFdlZG5lc2RheS4gSSBtaWdodCBiZSB2ZXJ5CmNvbmZ1c2VkIGFib3V0IHRoZSBiYWNr Z3JvdW5kIGhlcmUsIHNvIGxldCBtZSBhcG9sb2dpemUgYmVmb3JlaGFuZCBmb3IKYW55IGNvbmZ1 c2lvbiBJIG1pZ2h0IHNwcmVhZC5dCgo+IE9uIDIwMjAvNy84IOS4i+WNiDk6MTMsIEtpc2hvbiBW aWpheSBBYnJhaGFtIEkgd3JvdGU6Cj4gPiBIaSBKYXNvbiwKPiA+Cj4gPiBPbiA3LzgvMjAyMCA0 OjUyIFBNLCBKYXNvbiBXYW5nIHdyb3RlOiAgCj4gPj4gT24gMjAyMC83Lzcg5LiL5Y2IMTA6NDUs IEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgd3JvdGU6ICAKPiA+Pj4gSGkgSmFzb24sCj4gPj4+Cj4g Pj4+IE9uIDcvNy8yMDIwIDM6MTcgUE0sIEphc29uIFdhbmcgd3JvdGU6ICAKPiA+Pj4+IE9uIDIw MjAvNy82IOS4i+WNiDU6MzIsIEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgd3JvdGU6ICAKPiA+Pj4+ PiBIaSBKYXNvbiwKPiA+Pj4+Pgo+ID4+Pj4+IE9uIDcvMy8yMDIwIDEyOjQ2IFBNLCBKYXNvbiBX YW5nIHdyb3RlOiAgCj4gPj4+Pj4+IE9uIDIwMjAvNy8yIOS4i+WNiDk6MzUsIEtpc2hvbiBWaWph eSBBYnJhaGFtIEkgd3JvdGU6ICAKPiA+Pj4+Pj4+IEhpIEphc29uLAo+ID4+Pj4+Pj4KPiA+Pj4+ Pj4+IE9uIDcvMi8yMDIwIDM6NDAgUE0sIEphc29uIFdhbmcgd3JvdGU6ICAKPiA+Pj4+Pj4+PiBP biAyMDIwLzcvMiDkuIvljYg1OjUxLCBNaWNoYWVsIFMuIFRzaXJraW4gd3JvdGU6ICAKPiA+Pj4+ Pj4+Pj4gT24gVGh1LCBKdWwgMDIsIDIwMjAgYXQgMDE6NTE6MjFQTSArMDUzMCwgS2lzaG9uIFZp amF5IEFicmFoYW0gSSB3cm90ZTogIAo+ID4+Pj4+Pj4+Pj4gVGhpcyBzZXJpZXMgZW5oYW5jZXMg TGludXggVmhvc3Qgc3VwcG9ydCB0byBlbmFibGUgU29DLXRvLVNvQwo+ID4+Pj4+Pj4+Pj4gY29t bXVuaWNhdGlvbiBvdmVyIE1NSU8uIFRoaXMgc2VyaWVzIGVuYWJsZXMgcnBtc2cgY29tbXVuaWNh dGlvbiBiZXR3ZWVuCj4gPj4+Pj4+Pj4+PiB0d28gU29DcyB1c2luZyBib3RoIFBDSWUgUkM8LT5F UCBhbmQgSE9TVDEtTlRCLUhPU1QyCj4gPj4+Pj4+Pj4+Pgo+ID4+Pj4+Pj4+Pj4gMSkgTW9kaWZ5 IHZob3N0IHRvIHVzZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgbW9kZWwKPiA+Pj4+Pj4+Pj4+IDIp IEFkZCBzdXBwb3J0IGluIHZyaW5nIHRvIGFjY2VzcyB2aXJ0cXVldWUgb3ZlciBNTUlPCj4gPj4+ Pj4+Pj4+PiAzKSBBZGQgdmhvc3QgY2xpZW50IGRyaXZlciBmb3IgcnBtc2cKPiA+Pj4+Pj4+Pj4+ IDQpIEFkZCBQQ0llIFJDIGRyaXZlciAodXNlcyB2aXJ0aW8pIGFuZCBQQ0llIEVQIGRyaXZlciAo dXNlcyB2aG9zdCkgZm9yCj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgIHJwbXNnIGNvbW11bmlj YXRpb24gYmV0d2VlbiB0d28gU29DcyBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlcgo+ID4+Pj4+Pj4+ Pj4gNSkgQWRkIE5UQiBWaXJ0aW8gZHJpdmVyIGFuZCBOVEIgVmhvc3QgZHJpdmVyIGZvciBycG1z ZyBjb21tdW5pY2F0aW9uCj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgIGJldHdlZW4gdHdvIFNv Q3MgY29ubmVjdGVkIHZpYSBOVEIKPiA+Pj4+Pj4+Pj4+IDYpIEFkZCBjb25maWdmcyB0byBjb25m aWd1cmUgdGhlIGNvbXBvbmVudHMKPiA+Pj4+Pj4+Pj4+Cj4gPj4+Pj4+Pj4+PiBVc2VDYXNlMSA6 Cj4gPj4+Pj4+Pj4+Pgo+ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgIFZIT1NUIFJQTVNHwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBWSVJUSU8gUlBNU0cKPiA+Pj4+Pj4+Pj4+ ICDCoMKgwqDCoMKgwqDCoMKgwqAgK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCArCj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDC oMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfAo+ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPiA+Pj4+ Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDC oMKgwqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfAo+ID4+Pj4+Pj4+Pj4gKy0tLS0tdi0tLS0tLSvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCArLS0tLS0tdi0tLS0tLS0rCj4gPj4+Pj4+Pj4+PiB8wqDCoCBM aW51eMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgIExp bnV4wqDCoMKgIHwKPiA+Pj4+Pj4+Pj4+IHzCoCBFbmRwb2ludMKgIHzCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB8IFJvb3QgQ29tcGxleCB8Cj4gPj4+Pj4+Pj4+PiB8wqDCoMKgwqDC oMKgwqDCoMKgwqDCoCA8LS0tLS0tLS0tLS0tLS0tLS0+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfAo+ID4+Pj4+Pj4+Pj4gfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+Pj4+ Pj4+PiB8wqDCoMKgIFNPQzHCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHzCoMKgwqDCoCBTT0MywqDCoMKgwqAgfAo+ID4+Pj4+Pj4+Pj4gKy0tLS0tLS0tLS0tLSvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCArLS0tLS0tLS0tLS0tLS0rCj4gPj4+Pj4+Pj4+ Pgo+ID4+Pj4+Pj4+Pj4gVXNlQ2FzZSAyOgo+ID4+Pj4+Pj4+Pj4KPiA+Pj4+Pj4+Pj4+ICDCoMKg wqDCoMKgwqDCoMKgIFZIT1NUIFJQTVNHwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVklSVElPIFJQTVNHCj4g Pj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCArCj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+ Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+Pj4+ Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgICstLS0tLS12LS0t LS0tK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICstLS0tLS12LS0tLS0tKwo+ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDC oCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHwKPiA+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqAgfMKgwqDCoCBIT1NUMcKgwqDC oCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfMKgwqDCoCBIT1NUMsKgwqDCoCB8Cj4gPj4+Pj4+Pj4+PiAgwqDCoMKg wqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfAo+ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoCArLS0tLS0tXi0tLS0t LSvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCArLS0tLS0tXi0tLS0tLSsKPiA+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwK PiA+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPiA+Pj4+Pj4+Pj4+ICstLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4g Pj4+Pj4+Pj4+PiB8wqAgKy0tLS0tLXYtLS0tLS0rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKy0tLS0tLXYtLS0tLS0r wqAgfAo+ID4+Pj4+Pj4+Pj4gfMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIHwKPiA+Pj4+Pj4+Pj4+IHzCoCB8wqDC oMKgwqAgRVDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqAgRVDCoMKgwqDCoMKgIHzC oCB8Cj4gPj4+Pj4+Pj4+PiB8wqAgfCBDT05UUk9MTEVSMSB8wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCBDT05UUk9M TEVSMiB8wqAgfAo+ID4+Pj4+Pj4+Pj4gfMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgPC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB8wqAgfAo+ID4+Pj4+Pj4+Pj4gfMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIHwKPiA+Pj4+Pj4+Pj4+IHzCoCB8 wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHzCoCB8Cj4gPj4+Pj4+Pj4+PiB8wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8 wqAgU29DIFdpdGggTXVsdGlwbGUgRVAgSW5zdGFuY2VzwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHzCoCB8Cj4gPj4+Pj4+Pj4+PiB8wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8 wqAgKENvbmZpZ3VyZWQgdXNpbmcgTlRCIEZ1bmN0aW9uKcKgIHzCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfMKgIHwKPiA+Pj4+Pj4+Pj4+IHzCoCArLS0tLS0tLS0tLS0tLSvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAr LS0tLS0tLS0tLS0tLSvCoCB8Cj4gPj4+Pj4+Pj4+PiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKRmlyc3Qgb2Yg YWxsLCB0byBjbGFyaWZ5IHRoZSB0ZXJtaW5vbG9neToKSXMgInZob3N0IHJwbXNnIiBhY3Rpbmcg YXMgd2hhdCB0aGUgdmlydGlvIHN0YW5kYXJkIGNhbGxzIHRoZSAnZGV2aWNlJywKYW5kICJ2aXJ0 aW8gcnBtc2ciIGFzIHRoZSAnZHJpdmVyJz8gT3IgaXMgdGhlICJ2aG9zdCIgcGFydCBtb3N0bHkg anVzdAp2aXJ0cXVldWVzICsgdGhlIGV4aXRpbmcgdmhvc3QgaW50ZXJmYWNlcz8KCj4gPj4+Pj4+ Pj4+Pgo+ID4+Pj4+Pj4+Pj4gU29mdHdhcmUgTGF5ZXJpbmc6Cj4gPj4+Pj4+Pj4+Pgo+ID4+Pj4+ Pj4+Pj4gVGhlIGhpZ2gtbGV2ZWwgU1cgbGF5ZXJpbmcgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxp a2UgYmVsb3cuIFRoaXMgc2VyaWVzCj4gPj4+Pj4+Pj4+PiBhZGRzIHN1cHBvcnQgb25seSBmb3Ig UlBNU0cgVkhPU1QsIGhvd2V2ZXIgc29tZXRoaW5nIHNpbWlsYXIgc2hvdWxkIGJlCj4gPj4+Pj4+ Pj4+PiBkb25lIGZvciBuZXQgYW5kIHNjc2kuIFdpdGggdGhhdCBhbnkgdmhvc3QgZGV2aWNlIChQ Q0ksIE5UQiwgUGxhdGZvcm0KPiA+Pj4+Pj4+Pj4+IGRldmljZSwgdXNlcikgY2FuIHVzZSBhbnkg b2YgdGhlIHZob3N0IGNsaWVudCBkcml2ZXIuCj4gPj4+Pj4+Pj4+Pgo+ID4+Pj4+Pj4+Pj4KPiA+ Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoCArLS0tLS0tLS0tLS0tLS0tLSvCoCArLS0tLS0tLS0t LS0rwqAgKy0tLS0tLS0tLS0tLSvCoCArLS0tLS0tLS0tLSsKPiA+Pj4+Pj4+Pj4+ICDCoMKgwqDC oMKgwqDCoCB8wqAgUlBNU0cgVkhPU1TCoMKgIHzCoCB8IE5FVCBWSE9TVCB8wqAgfCBTQ1NJIFZI T1NUIHzCoCB8wqDCoMKgIFjCoMKgwqDCoCB8Cj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqAg Ky0tLS0tLS1eLS0tLS0tLS0rwqAgKy0tLS0tXi0tLS0tK8KgICstLS0tLV4tLS0tLS0rwqAgKy0t LS1eLS0tLS0rCj4gPj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPiA+Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+ ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4gPj4+Pj4+Pj4+PiArLS0tLS0tLS0tLS12LS0tLS0tLS0t LS0tLS0tLS12LS0tLS0tLS0tLS0tLS12LS0tLS0tLS0tLS0tLS12LS0tLS0tLS0tLSsKPiA+Pj4+ Pj4+Pj4+IHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgVkhPU1QgQ09SRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPiA+Pj4+Pj4+Pj4+ICstLS0tLS0tLV4tLS0tLS0tLS0t LS0tLS1eLS0tLS0tLS0tLS0tLS0tLS0tLS1eLS0tLS0tLS0tLS0tLS0tLS0tXi0tLS0tKwo+ID4+ Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfAo+ID4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+ID4+Pj4+Pj4+Pj4gKy0tLS0t LS0tdi0tLS0tLS0rwqAgKy0tLS12LS0tLS0tK8KgICstLS0tLS0tLS0tdi0tLS0tLS0tLS0rwqAg Ky0tLS12LS0tLS0rCj4gPj4+Pj4+Pj4+PiB8wqAgUENJIEVQRiBWSE9TVCB8wqAgfCBOVEIgVkhP U1QgfMKgIHxQTEFURk9STSBERVZJQ0UgVkhPU1R8wqAgfMKgwqDCoCBYwqDCoMKgwqAgfAo+ID4+ Pj4+Pj4+Pj4gKy0tLS0tLS0tLS0tLS0tLS0rwqAgKy0tLS0tLS0tLS0tK8KgICstLS0tLS0tLS0t LS0tLS0tLS0tLS0rwqAgKy0tLS0tLS0tLS0rCgpTbywgdGhlIHVwcGVyIGhhbGYgaXMgYmFzaWNh bGx5IHZhcmlvdXMgZnVuY3Rpb25hbGl0eSB0eXBlcywgZS5nLiBhIG5ldApkZXZpY2UuIFdoYXQg aXMgdGhlIGxvd2VyIGhhbGYsIGEgaGFyZHdhcmUgaW50ZXJmYWNlPyBXb3VsZCBpdCBiZQplcXVp dmFsZW50IHRvIGUuZy4gYSBub3JtYWwgUENJIGRldmljZT8KCj4gPj4+Pj4+Pj4+Pgo+ID4+Pj4+ Pj4+Pj4gVGhpcyB3YXMgaW5pdGlhbGx5IHByb3Bvc2VkIGhlcmUgWzFdCj4gPj4+Pj4+Pj4+Pgo+ ID4+Pj4+Pj4+Pj4gWzFdIC0+Cj4gPj4+Pj4+Pj4+PiBodHRwczovL2xvcmUua2VybmVsLm9yZy9y LzJjZjAwZWM0LTFlZDYtZjY2ZS02ODk3LTAwNmQxYTViNjM5MEB0aS5jb20gIAo+ID4+Pj4+Pj4+ PiBJIGZpbmQgdGhpcyB2ZXJ5IGludGVyZXN0aW5nLiBBIGh1Z2UgcGF0Y2hzZXQgc28gd2lsbCB0 YWtlIGEgYml0Cj4gPj4+Pj4+Pj4+IHRvIHJldmlldywgYnV0IEkgY2VydGFpbmx5IHBsYW4gdG8g ZG8gdGhhdC4gVGhhbmtzISAgCj4gPj4+Pj4+Pj4gWWVzLCBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYg dGhlcmUncyBhIGdpdCBicmFuY2ggZm9yIHVzIHRvIGhhdmUgYSBsb29rLiAgCj4gPj4+Pj4+PiBJ J3ZlIHB1c2hlZCB0aGUgYnJhbmNoCj4gPj4+Pj4+PiBodHRwczovL2dpdGh1Yi5jb20va2lzaG9u L2xpbnV4LXdpcC5naXQgdmhvc3RfcnBtc2dfcGNpX250Yl9yZmMgIAo+ID4+Pj4+PiBUaGFua3MK PiA+Pj4+Pj4KPiA+Pj4+Pj4gIAo+ID4+Pj4+Pj4+IEJ0dywgSSdtIG5vdCBzdXJlIEkgZ2V0IHRo ZSBiaWcgcGljdHVyZSwgYnV0IEkgdmFndWVseSBmZWVsIHNvbWUgb2YgdGhlCj4gPj4+Pj4+Pj4g d29yayBpcwo+ID4+Pj4+Pj4+IGR1cGxpY2F0ZWQgd2l0aCB2RFBBIChlLmcgdGhlIGVwZiB0cmFu c3BvcnQgb3Igdmhvc3QgYnVzKS4gIAo+ID4+Pj4+Pj4gVGhpcyBpcyBhYm91dCBjb25uZWN0aW5n IHR3byBkaWZmZXJlbnQgSFcgc3lzdGVtcyBib3RoIHJ1bm5pbmcgTGludXggYW5kCj4gPj4+Pj4+ PiBkb2Vzbid0IG5lY2Vzc2FyaWx5IGludm9sdmUgdmlydHVhbGl6YXRpb24uICAKPiA+Pj4+Pj4g UmlnaHQsIHRoaXMgaXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gVk9QCj4gPj4+Pj4+IChEb2N1bWVu dGF0aW9uL21pc2MtZGV2aWNlcy9taWMvbWljX292ZXJ2aWV3LnJzdCkuIFRoZSBkaWZmZXJlbnQg aXMgdGhlCj4gPj4+Pj4+IGhhcmR3YXJlIEkgZ3Vlc3MgYW5kIFZPUCB1c2UgdXNlcnNwYWNlIGFw cGxpY2F0aW9uIHRvIGltcGxlbWVudCB0aGUgZGV2aWNlLiAgCj4gPj4+Pj4gSSdkIGFsc28gbGlr ZSB0byBwb2ludCBvdXQsIHRoaXMgc2VyaWVzIHRyaWVzIHRvIGhhdmUgY29tbXVuaWNhdGlvbiBi ZXR3ZWVuCj4gPj4+Pj4gdHdvCj4gPj4+Pj4gU29DcyBpbiB2ZW5kb3IgYWdub3N0aWMgd2F5LiBT aW5jZSB0aGlzIHNlcmllcyBzb2x2ZXMgZm9yIDIgdXNlY2FzZXMgKFBDSWUKPiA+Pj4+PiBSQzwt PkVQIGFuZCBOVEIpLCBmb3IgdGhlIE5UQiBjYXNlIGl0IGRpcmVjdGx5IHBsdWdzIGludG8gTlRC IGZyYW1ld29yayBhbmQKPiA+Pj4+PiBhbnkKPiA+Pj4+PiBvZiB0aGUgSFcgaW4gTlRCIGJlbG93 IHNob3VsZCBiZSBhYmxlIHRvIHVzZSBhIHZpcnRpby12aG9zdCBjb21tdW5pY2F0aW9uCj4gPj4+ Pj4KPiA+Pj4+PiAjbHMgZHJpdmVycy9udGIvaHcvCj4gPj4+Pj4gYW1kwqAgZXBmwqAgaWR0wqAg aW50ZWzCoCBtc2NjCj4gPj4+Pj4KPiA+Pj4+PiBBbmQgc2ltaWxhcmx5IGZvciB0aGUgUENJZSBS QzwtPkVQIGNvbW11bmljYXRpb24sIHRoaXMgYWRkcyBhIGdlbmVyaWMgZW5kcG9pbnQKPiA+Pj4+ PiBmdW5jdGlvbiBkcml2ZXIgYW5kIGhlbmNlIGFueSBTb0MgdGhhdCBzdXBwb3J0cyBjb25maWd1 cmFibGUgUENJZSBlbmRwb2ludCBjYW4KPiA+Pj4+PiB1c2UgdmlydGlvLXZob3N0IGNvbW11bmlj YXRpb24KPiA+Pj4+Pgo+ID4+Pj4+ICMgbHMgZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvKmVw Kgo+ID4+Pj4+IGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtZGVzaWdud2FyZS1lcC5j Cj4gPj4+Pj4gZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpZS11bmlwaGllci1lcC5jCj4g Pj4+Pj4gZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWxheWVyc2NhcGUtZXAuYyAgCj4g Pj4+PiBUaGFua3MgZm9yIHRob3NlIGJhY2tncm91bmRzLgo+ID4+Pj4KPiA+Pj4+ICAKPiA+Pj4+ Pj4+ICDCoMKgwqAgU28gdGhlcmUgaXMgbm8gZ3Vlc3Qgb3IgaG9zdCBhcyBpbgo+ID4+Pj4+Pj4g dmlydHVhbGl6YXRpb24gYnV0IHR3byBlbnRpcmVseSBkaWZmZXJlbnQgc3lzdGVtcyBjb25uZWN0 ZWQgdmlhIFBDSWUgY2FibGUsCj4gPj4+Pj4+PiBvbmUKPiA+Pj4+Pj4+IGFjdGluZyBhcyBndWVz dCBhbmQgb25lIGFzIGhvc3QuIFNvIG9uZSBzeXN0ZW0gd2lsbCBwcm92aWRlIHZpcnRpbwo+ID4+ Pj4+Pj4gZnVuY3Rpb25hbGl0eSByZXNlcnZpbmcgbWVtb3J5IGZvciB2aXJ0cXVldWVzIGFuZCB0 aGUgb3RoZXIgcHJvdmlkZXMgdmhvc3QKPiA+Pj4+Pj4+IGZ1bmN0aW9uYWxpdHkgcHJvdmlkaW5n IGEgd2F5IHRvIGFjY2VzcyB0aGUgdmlydHF1ZXVlcyBpbiB2aXJ0aW8gbWVtb3J5Lgo+ID4+Pj4+ Pj4gT25lIGlzCj4gPj4+Pj4+PiBzb3VyY2UgYW5kIHRoZSBvdGhlciBpcyBzaW5rIGFuZCB0aGVy ZSBpcyBubyBpbnRlcm1lZGlhdGUgZW50aXR5LiAodmhvc3Qgd2FzCj4gPj4+Pj4+PiBwcm9iYWJs eSBpbnRlcm1lZGlhdGUgZW50aXR5IGluIHZpcnR1YWxpemF0aW9uPykgIAo+ID4+Pj4+PiAoTm90 IGEgbmF0aXZlIEVuZ2xpc2ggc3BlYWtlcikgYnV0ICJ2aG9zdCIgY291bGQgaW50cm9kdWNlIHNv bWUgY29uZnVzaW9uIGZvcgo+ID4+Pj4+PiBtZSBzaW5jZSBpdCB3YXMgdXNlIGZvciBpbXBsZW1l bnRpbmcgdmlydGlvIGJhY2tlbmQgZm9yIHVzZXJzcGFjZSBkcml2ZXJzLiBJCj4gPj4+Pj4+IGd1 ZXNzICJ2cmluZ2giIGNvdWxkIGJlIGJldHRlci4gIAo+ID4+Pj4+IEluaXRpYWxseSBJIGhhZCBu YW1lZCB0aGlzIHZyaW5naCBidXQgbGF0ZXIgZGVjaWRlZCB0byBjaG9vc2Ugdmhvc3QgaW5zdGVh ZCBvZgo+ID4+Pj4+IHZyaW5naC4gdmhvc3QgaXMgc3RpbGwgYSB2aXJ0aW8gYmFja2VuZCAobm90 IG5lY2Vzc2FyaWx5IHVzZXJzcGFjZSkgdGhvdWdoIGl0Cj4gPj4+Pj4gbm93IHJlc2lkZXMgaW4g YW4gZW50aXJlbHkgZGlmZmVyZW50IHN5c3RlbS4gV2hhdGV2ZXIgdmlydGlvIGlzIGZvciBhIGZy b250ZW5kCj4gPj4+Pj4gc3lzdGVtLCB2aG9zdCBjYW4gYmUgdGhhdCBmb3IgYSBiYWNrZW5kIHN5 c3RlbS4gdnJpbmcgY2FuIGJlIGZvciBhY2Nlc3NpbmcKPiA+Pj4+PiB2aXJ0cXVldWUgYW5kIGNh biBiZSB1c2VkIGVpdGhlciBpbiBmcm9udGVuZCBvciBiYWNrZW5kLiAgCgpJIGd1ZXNzIHRoYXQg Y2xlYXJzIHVwIGF0IGxlYXN0IHNvbWUgb2YgbXkgcXVlc3Rpb25zIGZyb20gYWJvdmUuLi4KCj4g Pj4+PiBPay4KPiA+Pj4+Cj4gPj4+PiAgCj4gPj4+Pj4+Pj4gSGF2ZSB5b3UgY29uc2lkZXJlZCB0 byBpbXBsZW1lbnQgdGhlc2UgdGhyb3VnaCB2RFBBPyAgCj4gPj4+Pj4+PiBJSVVDIHZEUEEgb25s eSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdXNlcnNwYWNlIGFuZCBhbiBpbi1rZXJuZWwgcnBt c2cKPiA+Pj4+Pj4+IGRyaXZlcgo+ID4+Pj4+Pj4gb3Igdmhvc3QgbmV0IGRyaXZlciBpcyBub3Qg cHJvdmlkZWQuCj4gPj4+Pj4+Pgo+ID4+Pj4+Pj4gVGhlIEhXIGNvbm5lY3Rpb24gbG9va3Mgc29t ZXRoaW5nIGxpa2UgaHR0cHM6Ly9wYXN0ZWJvYXJkLmNvL0pmTVZWSEMuanBnCj4gPj4+Pj4+PiAo dXNlY2FzZTIgYWJvdmUpLCAgCj4gPj4+Pj4+IEkgc2VlLgo+ID4+Pj4+Pgo+ID4+Pj4+PiAgCj4g Pj4+Pj4+PiAgwqDCoMKgIGFsbCB0aGUgYm9hcmRzIHJ1biBMaW51eC4gVGhlIG1pZGRsZSBib2Fy ZCBwcm92aWRlcyBOVEIKPiA+Pj4+Pj4+IGZ1bmN0aW9uYWxpdHkgYW5kIGJvYXJkIG9uIGVpdGhl ciBzaWRlIHByb3ZpZGVzIHZpcnRpby92aG9zdAo+ID4+Pj4+Pj4gZnVuY3Rpb25hbGl0eSBhbmQK PiA+Pj4+Pj4+IHRyYW5zZmVyIGRhdGEgdXNpbmcgcnBtc2cuIAoKVGhpcyBzZXR1cCBsb29rcyBy ZWFsbHkgaW50ZXJlc3RpbmcgKHNvbWV0aW1lcywgaXQncyByZWFsbHkgaGFyZCB0bwppbWFnaW5l IHRoaXMgaW4gdGhlIGFic3RyYWN0LikKIAo+ID4+Pj4+PiBTbyBJIHdvbmRlciB3aGV0aGVyIGl0 J3Mgd29ydGh3aGlsZSBmb3IgYSBuZXcgYnVzLiBDYW4gd2UgdXNlCj4gPj4+Pj4+IHRoZSBleGlz dGVkIHZpcnRpby1idXMvZHJpdmVycz8gSXQgbWlnaHQgd29yayBhcywgZXhjZXB0IGZvcgo+ID4+ Pj4+PiB0aGUgZXBmIHRyYW5zcG9ydCwgd2UgY2FuIGludHJvZHVjZSBhIGVwZiAidmhvc3QiIHRy YW5zcG9ydAo+ID4+Pj4+PiBkcml2ZXIuICAKPiA+Pj4+PiBJTUhPIHdlJ2xsIG5lZWQgdHdvIGJ1 c2VzIG9uZSBmb3IgZnJvbnRlbmQgYW5kIG90aGVyIGZvcgo+ID4+Pj4+IGJhY2tlbmQgYmVjYXVz ZSB0aGUgdHdvIGNvbXBvbmVudHMgY2FuIHRoZW4gY28tb3BlcmF0ZS9pbnRlcmFjdAo+ID4+Pj4+ IHdpdGggZWFjaCBvdGhlciB0byBwcm92aWRlIGEgZnVuY3Rpb25hbGl0eS4gVGhvdWdoIGJvdGgg d2lsbAo+ID4+Pj4+IHNlZW1pbmdseSBwcm92aWRlIHNpbWlsYXIgY2FsbGJhY2tzLCB0aGV5IGFy ZSBib3RoIHByb3ZpZGUKPiA+Pj4+PiBzeW1tZXRyaWNhbCBvciBjb21wbGltZW50YXJ5IGZ1bmNp dG9uYWxpdHkgYW5kIG5lZWQgbm90IGJlIHNhbWUKPiA+Pj4+PiBvciBpZGVudGljYWwuCj4gPj4+ Pj4KPiA+Pj4+PiBIYXZpbmcgdGhlIHNhbWUgYnVzIGNhbiBhbHNvIGNyZWF0ZSBzZXF1ZW5jaW5n IGlzc3Vlcy4KPiA+Pj4+Pgo+ID4+Pj4+IElmIHlvdSBsb29rIGF0IHZpcnRpb19kZXZfcHJvYmUo KSBvZiB2aXJ0aW9fYnVzCj4gPj4+Pj4KPiA+Pj4+PiBkZXZpY2VfZmVhdHVyZXMgPSBkZXYtPmNv bmZpZy0+Z2V0X2ZlYXR1cmVzKGRldik7Cj4gPj4+Pj4KPiA+Pj4+PiBOb3cgaWYgd2UgdXNlIHNh bWUgYnVzIGZvciBib3RoIGZyb250LWVuZCBhbmQgYmFjay1lbmQsIGJvdGgKPiA+Pj4+PiB3aWxs IHRyeSB0byBnZXRfZmVhdHVyZXMgd2hlbiB0aGVyZSBoYXMgYmVlbiBubyBzZXRfZmVhdHVyZXMu Cj4gPj4+Pj4gSWRlYWxseSB2aG9zdCBkZXZpY2Ugc2hvdWxkIGJlIGluaXRpYWxpemVkIGZpcnN0 IHdpdGggdGhlIHNldAo+ID4+Pj4+IG9mIGZlYXR1cmVzIGl0IHN1cHBvcnRzLiBWaG9zdCBhbmQg dmlydGlvIHNob3VsZCB1c2UgInN0YXR1cyIKPiA+Pj4+PiBhbmQgImZlYXR1cmVzIiBjb21wbGlt ZW50YXJpbHkgYW5kIG5vdCBpZGVudGljYWxseS4gIAo+ID4+Pj4gWWVzLCBidXQgdGhlcmUncyBu byBuZWVkIGZvciBkb2luZyBzdGF0dXMvZmVhdHVyZXMgcGFzc3Rocm91Z2gKPiA+Pj4+IGluIGVw ZiB2aG9zdCBkcml2ZXJzLmIKPiA+Pj4+Cj4gPj4+PiAgCj4gPj4+Pj4gdmlydGlvIGRldmljZSAo b3IgZnJvbnRlbmQpIGNhbm5vdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdmhvc3QKPiA+Pj4+PiBk ZXZpY2UgKG9yIGJhY2tlbmQpIGdldHMgaW5pdGlhbGl6ZWQgd2l0aCBkYXRhIHN1Y2ggYXMKPiA+ Pj4+PiBmZWF0dXJlcy4gU2ltaWxhcmx5IHZob3N0IChiYWNrZW5kKQo+ID4+Pj4+IGNhbm5vdCBh Y2Nlc3MgdmlycXVldWVzIG9yIGJ1ZmZlcnMgYmVmb3JlIHZpcnRpbyAoZnJvbnRlbmQpIHNldHMK PiA+Pj4+PiBWSVJUSU9fQ09ORklHX1NfRFJJVkVSX09LIHdoZXJlYXMgdGhhdCByZXF1aXJlbWVu dCBpcyBub3QgdGhlcmUKPiA+Pj4+PiBmb3IgdmlydGlvIGFzIHRoZSBwaHlzaWNhbCBtZW1vcnkg Zm9yIHZpcnRxdWV1ZXMgYXJlIGNyZWF0ZWQgYnkKPiA+Pj4+PiB2aXJ0aW8gKGZyb250ZW5kKS4g IAo+ID4+Pj4gZXBmIHZob3N0IGRyaXZlcnMgbmVlZCB0byBpbXBsZW1lbnQgdHdvIGRldmljZXM6 IHZob3N0KHZyaW5naCkKPiA+Pj4+IGRldmljZSBhbmQgdmlydGlvIGRldmljZSAod2hpY2ggaXMg YSBtZWRpYXRlZCBkZXZpY2UpLiBUaGUKPiA+Pj4+IHZob3N0KHZyaW5naCkgZGV2aWNlIGlzIGRv aW5nIGZlYXR1cmUgbmVnb3RpYXRpb24gd2l0aCB0aGUKPiA+Pj4+IHZpcnRpbyBkZXZpY2Ugdmlh IFJDL0VQIG9yIE5UQi4gVGhlIHZpcnRpbyBkZXZpY2UgaXMgZG9pbmcKPiA+Pj4+IGZlYXR1cmUg bmVnb3RpYXRpb24gd2l0aCBsb2NhbCB2aXJ0aW8gZHJpdmVycy4gSWYgdGhlcmUncmUKPiA+Pj4+ IGZlYXR1cmUgbWlzbWF0Y2gsIGVwZiB2aG9zdCBkcml2ZXJzIGFuZCBkbyBtZWRpYXRpb24gYmV0 d2Vlbgo+ID4+Pj4gdGhlbS4gIAo+ID4+PiBIZXJlIGVwZiB2aG9zdCBzaG91bGQgYmUgaW5pdGlh bGl6ZWQgd2l0aCBhIHNldCBvZiBmZWF0dXJlcyBmb3IKPiA+Pj4gaXQgdG8gbmVnb3RpYXRlIGVp dGhlciBhcyB2aG9zdCBkZXZpY2Ugb3IgdmlydGlvIGRldmljZSBubz8gV2hlcmUKPiA+Pj4gc2hv dWxkIHRoZSBpbml0aWFsIGZlYXR1cmUgc2V0IGZvciBlcGYgdmhvc3QgY29tZSBmcm9tPyAgCj4g Pj4KPiA+PiBJIHRoaW5rIGl0IGNhbiB3b3JrIGFzOgo+ID4+Cj4gPj4gMSkgSGF2aW5nIGFuIGlu aXRpYWwgZmVhdHVyZXMgKGhhcmQgY29kZWQgaW4gdGhlIGNvZGUpIHNldCBYIGluCj4gPj4gZXBm IHZob3N0IDIpIFVzaW5nIHRoaXMgWCBmb3IgYm90aCB2aXJ0aW8gZGV2aWNlIGFuZCB2aG9zdCh2 cmluZ2gpCj4gPj4gZGV2aWNlIDMpIGxvY2FsIHZpcnRpbyBkcml2ZXIgd2lsbCBuZWdvdGlhdGUg d2l0aCB2aXJ0aW8gZGV2aWNlCj4gPj4gd2l0aCBmZWF0dXJlIHNldCBZIDQpIHJlbW90ZSB2aXJ0 aW8gZHJpdmVyIHdpbGwgbmVnb3RpYXRlIHdpdGgKPiA+PiB2cmluZ2ggZGV2aWNlIHdpdGggZmVh dHVyZSBzZXQgWiA1KSBtZWRpYXRlIGJldHdlZW4gZmVhdHVyZSBZIGFuZAo+ID4+IGZlYXR1cmUg WiBzaW5jZSBib3RoIFkgYW5kIFogYXJlIGEgc3Vic2V0IG9mIFgKPiA+Pgo+ID4+ICAKPiA+IG9r YXkuIEknbSBhbHNvIHRoaW5raW5nIGlmIHdlIGNvdWxkIGhhdmUgY29uZmlnZnMgZm9yIGNvbmZp Z3VyaW5nCj4gPiB0aGlzLiBBbnl3YXlzIHdlIGNvdWxkIGZpbmQgZGlmZmVyZW50IGFwcHJvYWNo ZXMgb2YgY29uZmlndXJpbmcKPiA+IHRoaXMuICAKPiAKPiAKPiBZZXMsIGFuZCBJIHRoaW5rIHNv bWUgbWFuYWdlbWVudCBBUEkgaXMgbmVlZGVkIGV2ZW4gaW4gdGhlIGRlc2lnbiBvZiAKPiB5b3Vy ICJTb2Z0d2FyZSBMYXllcmluZyIuIEluIHRoYXQgZmlndXJlLCBycG1zZyB2aG9zdCBuZWVkIHNv bWUKPiBwcmUtc2V0IG9yIGhhcmQtY29kZWQgZmVhdHVyZXMuCgpXaGVuIEkgc2F3IHRoZSBwbHVt YmVycyB0YWxrLCBteSBmaXJzdCBpZGVhIHdhcyAidGhpcyBuZWVkcyB0byBiZSBhIG5ldwp0cmFu c3BvcnQiLiBZb3UgaGF2ZSBzb21lIGhhcmQtY29kZWQgb3IgcHJlLWNvbmZpZ3VyZWQgZmVhdHVy ZXMsIGFuZAp0aGVuIGZlYXR1cmVzIGFyZSBuZWdvdGlhdGVkIHZpYSBhIHRyYW5zcG9ydC1zcGVj aWZpYyBtZWFucyBpbiB0aGUKdXN1YWwgd2F5LiBUaGVyZSdzIGJhc2ljYWxseSBhbiBleHRyYS9l eHRlbmRlZCBsYXllciBmb3IgdGhpcyAoYW5kCnN0YXR1cywgYW5kIHdoYXRldmVyKS4KCkRvZXMg dGhhdCBtYWtlIGFueSBzZW5zZT8KCj4gCj4gCj4gPj4+Pj4+IEl0IHdpbGwgaGF2ZSB2aXJ0cXVl dWVzIGJ1dCBvbmx5IHVzZWQgZm9yIHRoZSBjb21tdW5pY2F0aW9uCj4gPj4+Pj4+IGJldHdlZW4g aXRzZWxmIGFuZAo+ID4+Pj4+PiB1cHB0ZXIgdmlydGlvIGRyaXZlci4gQW5kIGl0IHdpbGwgaGF2 ZSB2cmluZ2ggcXVldWVzIHdoaWNoCj4gPj4+Pj4+IHdpbGwgYmUgcHJvYmUgYnkgdmlydGlvIGVw ZiB0cmFuc3BvcnQgZHJpdmVycy4gQW5kIGl0IG5lZWRzIHRvCj4gPj4+Pj4+IGRvIGRhdGFjb3B5 IGJldHdlZW4gdmlydHF1ZXVlIGFuZAo+ID4+Pj4+PiB2cmluZ2ggcXVldWVzLgo+ID4+Pj4+Pgo+ ID4+Pj4+PiBJdCB3b3JrcyBsaWtlOgo+ID4+Pj4+Pgo+ID4+Pj4+PiB2aXJ0aW8gZHJpdmVycyA8 LSB2aXJ0cXVldWUvdmlydGlvLWJ1cyAtPiBlcGYgdmhvc3QgZHJpdmVycyA8LQo+ID4+Pj4+PiB2 cmluZ2ggcXVldWUvZXBmPiAgCj4gPj4+Pj4+Cj4gPj4+Pj4+IFRoZSBhZHZhbnRhZ2VzIGlzIHRo YXQgdGhlcmUncyBubyBuZWVkIGZvciB3cml0aW5nIG5ldyBidXNlcwo+ID4+Pj4+PiBhbmQgZHJp dmVycy4gIAo+ID4+Pj4+IEkgdGhpbmsgdGhpcyB3aWxsIHdvcmsgaG93ZXZlciB0aGVyZSBpcyBh biBhZGR0aW9uYWwgY29weQo+ID4+Pj4+IGJldHdlZW4gdnJpbmdoIHF1ZXVlIGFuZCB2aXJ0cXVl dWUsICAKPiA+Pj4+IEkgdGhpbmsgbm90PyBFLmcgaW4gdXNlIGNhc2UgMSksIGlmIHdlIHN0aWNr IHRvIHZpcnRpbyBidXMsIHdlCj4gPj4+PiB3aWxsIGhhdmU6Cj4gPj4+Pgo+ID4+Pj4gdmlydGlv LXJwbXNnIChFUCkgPC0gdmlydGlvIHJpbmcoMSkgLT4gZXBmIHZob3N0IGRyaXZlciAoRVApIDwt Cj4gPj4+PiB2aXJ0aW8gcmluZygyKSAtPiB2aXJ0aW8gcGNpIChSQykgPC0+IHZpcnRpbyBycG1z ZyAoUkMpICAKPiA+Pj4gSUlVQyBlcGYgdmhvc3QgZHJpdmVyIChFUCkgd2lsbCBhY2Nlc3Mgdmly dGlvIHJpbmcoMikgdXNpbmcKPiA+Pj4gdnJpbmdoPyAgCj4gPj4KPiA+PiBZZXMuCj4gPj4KPiA+ PiAgCj4gPj4+IEFuZCB2aXJ0aW8KPiA+Pj4gcmluZygyKSBpcyBjcmVhdGVkIGJ5IHZpcnRpbyBw Y2kgKFJDKS4gIAo+ID4+Cj4gPj4gWWVzLgo+ID4+Cj4gPj4gIAo+ID4+Pj4gV2hhdCBlcGYgdmhv c3QgZHJpdmVyIGRpZCBpcyB0byByZWFkIGZyb20gdmlydGlvIHJpbmcoMSkgYWJvdXQKPiA+Pj4+ IHRoZSBidWZmZXIgbGVuIGFuZCBhZGRyIGFuZCB0aGVtIERNQSB0byBMaW51eChSQyk/ICAKPiA+ Pj4gb2theSwgSSBtYWRlIHNvbWUgb3B0aW1pemF0aW9uIGhlcmUgd2hlcmUgdmhvc3QtcnBtc2cg dXNpbmcgYQo+ID4+PiBoZWxwZXIgd3JpdGVzIGEgYnVmZmVyIGZyb20gcnBtc2cncyB1cHBlciBs YXllciBkaXJlY3RseSB0bwo+ID4+PiByZW1vdGUgTGludXggKFJDKSBhcyBhZ2FpbnN0IGhlcmUg d2VyZSBpdCBoYXMgdG8gYmUgZmlyc3Qgd3JpdHRlbgo+ID4+PiB0byB2aXJ0aW8gcmluZyAoMSku Cj4gPj4+Cj4gPj4+IFRoaW5raW5nIGhvdyB0aGlzIHdvdWxkIGxvb2sgZm9yIE5UQgo+ID4+PiB2 aXJ0aW8tcnBtc2cgKEhPU1QxKSA8LSB2aXJ0aW8gcmluZygxKSAtPiBOVEIoSE9TVDEpIDwtPgo+ ID4+PiBOVEIoSE9TVDIpwqAgPC0gdmlydGlvIHJpbmcoMikgLT4gdmlydGlvLXJwbXNnIChIT1NU MikKPiA+Pj4KPiA+Pj4gSGVyZSB0aGUgTlRCKEhPU1QxKSB3aWxsIGFjY2VzcyB0aGUgdmlydGlv IHJpbmcoMikgdXNpbmcgdnJpbmdoPyAgCj4gPj4KPiA+PiBZZXMsIEkgdGhpbmsgc28gaXQgbmVl ZHMgdG8gdXNlIHZyaW5nIHRvIGFjY2VzcyB2aXJ0aW8gcmluZyAoMSkgYXMKPiA+PiB3ZWxsLiAg Cj4gPiBOVEIoSE9TVDEpIGFuZCB2aXJ0aW8gcmluZygxKSB3aWxsIGJlIGluIHRoZSBzYW1lIHN5 c3RlbS4gU28gaXQKPiA+IGRvZXNuJ3QgaGF2ZSB0byB1c2UgdnJpbmcuIHZpcnRpbyByaW5nKDEp IGlzIGJ5IHRoZSB2aXJ0aW8gZGV2aWNlCj4gPiB0aGUgTlRCKEhPU1QxKSBjcmVhdGVzLiAgCj4g Cj4gCj4gUmlnaHQuCj4gCj4gCj4gPj4gIAo+ID4+PiBEbyB5b3UgYWxzbyB0aGluayB0aGlzIHdp bGwgd29yayBzZWFtbGVzc2x5IHdpdGggdmlydGlvX25ldC5jLAo+ID4+PiB2aXJ0aW9fYmxrLmM/ ICAKPiA+Pgo+ID4+IFllcy4gIAo+ID4gb2theSwgSSBoYXZlbid0IGxvb2tlZCBhdCB0aGlzIGJ1 dCB0aGUgYmFja2VuZCBvZiB2aXJ0aW9fYmxrIHNob3VsZAo+ID4gYWNjZXNzIGFuIGFjdHVhbCBz dG9yYWdlIGRldmljZSBubz8gIAo+IAo+IAo+IEdvb2QgcG9pbnQsIGZvciBub24tcGVlciBkZXZp Y2UgbGlrZSBzdG9yYWdlLiBUaGVyZSdzIHByb2JhYmx5IG5vCj4gbmVlZCBmb3IgaXQgdG8gYmUg cmVnaXN0ZXJlZCBvbiB0aGUgdmlydGlvIGJ1cyBhbmQgaXQgbWlnaHQgYmUgYmV0dGVyCj4gdG8g YmVoYXZlIGFzIHlvdSBwcm9wb3NlZC4KCkkgbWlnaHQgYmUgbWlzc2luZyBzb21ldGhpbmc7IGJ1 dCBpZiB5b3UgZXhwb3NlIHNvbWV0aGluZyBhcyBhIGJsb2NrCmRldmljZSwgaXQgc2hvdWxkIGhh dmUgc29tZXRoaW5nIGl0IGNhbiBhY2Nlc3Mgd2l0aCBibG9jayByZWFkcy93cml0ZXMsCnNob3Vs ZG4ndCBpdD8gT2YgY291cnNlLCB0aGF0IGNhbiBiZSBhIHZhcmlldHkgb2YgdGhpbmdzLgoKPiAK PiBKdXN0IHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGRlc2lnbiwgaG93IGlzIFZIT1NU IFNDU0kgZXhwZWN0ZWQKPiB0byB3b3JrIGluIHlvdXIgcHJvcG9zYWwsIGRvZXMgaXQgaGF2ZSBh IGRldmljZSBmb3IgZmlsZSBhcyBhIGJhY2tlbmQ/Cj4gCj4gCj4gPj4gIAo+ID4+PiBJJ2QgbGlr ZSB0byBnZXQgY2xhcml0eSBvbiB0d28gdGhpbmdzIGluIHRoZSBhcHByb2FjaCB5b3UKPiA+Pj4g c3VnZ2VzdGVkLCBvbmUgaXMgZmVhdHVyZXMgKHNpbmNlIGVwZiB2aG9zdCBzaG91bGQgaWRlYWxs eSBiZQo+ID4+PiB0cmFuc3BhcmVudCB0byBhbnkgdmlydGlvIGRyaXZlcikgIAo+ID4+Cj4gPj4g V2UgY2FuIGhhdmUgaGF2ZSBhbiBhcnJheSBvZiBwcmUtZGVmaW5lZCBmZWF0dXJlcyBpbmRleGVk IGJ5Cj4gPj4gdmlydGlvIGRldmljZSBpZCBpbiB0aGUgY29kZS4KPiA+Pgo+ID4+ICAKPiA+Pj4g YW5kIHRoZSBvdGhlciBpcyBob3cgY2VydGFpbiBpbnB1dHMgdG8gdmlydGlvIGRldmljZSBzdWNo IGFzCj4gPj4+IG51bWJlciBvZiBidWZmZXJzIGJlIGRldGVybWluZWQuICAKPiA+Pgo+ID4+IFdl IGNhbiBzdGFydCBmcm9tIGhhcmQgY29kZWQgdGhlIHZhbHVlIGxpa2UgMjU2LCBvciBpbnRyb2R1 Y2Ugc29tZQo+ID4+IEFQSSBmb3IgdXNlciB0byBjaGFuZ2UgdGhlIHZhbHVlLgo+ID4+Cj4gPj4g IAo+ID4+PiBUaGFua3MgYWdhaW4gZm9yIHlvdXIgc3VnZ2VzdGlvbnMhICAKPiA+Pgo+ID4+IFlv dSdyZSB3ZWxjb21lLgo+ID4+Cj4gPj4gTm90ZSB0aGF0IEkganVzdCB3YW50IHRvIGNoZWNrIHdo ZXRoZXIgb3Igbm90IHdlIGNhbiByZXVzZSB0aGUKPiA+PiB2aXJ0aW8gYnVzL2RyaXZlci4gSXQn cyBzb21ldGhpbmcgc2ltaWxhciB0byB3aGF0IHlvdSBwcm9wb3NlZCBpbgo+ID4+IFNvZnR3YXJl IExheWVyaW5nIGJ1dCB3ZSBqdXN0IHJlcGxhY2UgInZob3N0IGNvcmUiIHdpdGggInZpcnRpbwo+ ID4+IGJ1cyIgYW5kIG1vdmUgdGhlIHZob3N0IGNvcmUgYmVsb3cgZXBmL250Yi9wbGF0Zm9ybSB0 cmFuc3BvcnQuICAKPiA+IEdvdCBpdC4gTXkgaW5pdGlhbCBkZXNpZ24gd2FzIGJhc2VkIG9uIG15 IHVuZGVyc3RhbmRpbmcgb2YgeW91cgo+ID4gY29tbWVudHMgWzFdLiAgCj4gCj4gCj4gWWVzLCBi dXQgdGhhdCdzIGp1c3QgZm9yIGEgbmV0d29ya2luZyBkZXZpY2UuIElmIHdlIHdhbnQgc29tZXRo aW5nCj4gbW9yZSBnZW5lcmljLCBpdCBtYXkgcmVxdWlyZSBtb3JlIHRob3VnaHQgKGJ1cyBldGMp LgoKSSBiZWxpZXZlIHRoYXQgd2UgaW5kZWVkIG5lZWQgc29tZXRoaW5nIGJ1cy1saWtlIHRvIGJl IGFibGUgdG8gc3VwcG9ydAphIHZhcmlldHkgb2YgZGV2aWNlcy4KCj4gCj4gCj4gPgo+ID4gSSds bCB0cnkgdG8gY3JlYXRlIHNvbWV0aGluZyBiYXNlZCBvbiB5b3VyIHByb3Bvc2VkIGRlc2lnbiBo ZXJlLiAgCj4gCj4gCj4gU3VyZSwgYnV0IGZvciBjb2RpbmcsIHdlJ2QgYmV0dGVyIHdhaXQgZm9y IG90aGVyJ3Mgb3BpbmlvbiBoZXJlLgoKUGxlYXNlIHRlbGwgbWUgaWYgbXkgdGhvdWdodHMgYWJv dmUgbWFrZSBhbnkgc2Vuc2UuLi4gSSBoYXZlIGp1c3QKc3RhcnRlZCBsb29raW5nIGF0IHRoYXQs IHNvIEkgbWlnaHQgYmUgY29tcGxldGVseSBvZmYuCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpWaXJ0dWFsaXphdGlvbiBtYWlsaW5nIGxpc3QKVmlydHVh bGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZv dW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vdmlydHVhbGl6YXRpb24=