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=-18.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 273A4C433DB for ; Tue, 9 Feb 2021 05:47:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C370364E75 for ; Tue, 9 Feb 2021 05:47:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229743AbhBIFqx (ORCPT ); Tue, 9 Feb 2021 00:46:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:36218 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229472AbhBIFqv (ORCPT ); Tue, 9 Feb 2021 00:46:51 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612849524; 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=SqWQMicuqwpUgM/IV7wpTQvXG4FaZXOYT8OH3bBnBdA=; b=Vx5tRdFR47udoRJMidmzym7ZAzvmm8+3N/rdPgDEU7uV43nEc5DL6+2g9fXl8H+vioGtBX eV1Nt/sAmoJR89ilX0dHebjQf5wb/Z7e+9crqeQJEz3p64yYg4uNs6KqVc6wc02w2pUrxZ VohTksLwfP3AVvNIOaln8u1xisX1Yvs= 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-534-bQdKlESHONuxbGIL6oWF_g-1; Tue, 09 Feb 2021 00:45:19 -0500 X-MC-Unique: bQdKlESHONuxbGIL6oWF_g-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D66195210; Tue, 9 Feb 2021 05:45:17 +0000 (UTC) Received: from [10.72.13.32] (ovpn-13-32.pek2.redhat.com [10.72.13.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9A43D63B8C; Tue, 9 Feb 2021 05:45:12 +0000 (UTC) Subject: Re: [PATCH RFC v2 3/4] virtio-net: support transmit timestamp To: Willem de Bruijn , virtualization@lists.linux-foundation.org Cc: netdev@vger.kernel.org, mst@redhat.com, richardcochran@gmail.com, Willem de Bruijn References: <20210208185558.995292-1-willemdebruijn.kernel@gmail.com> <20210208185558.995292-4-willemdebruijn.kernel@gmail.com> From: Jason Wang Message-ID: <6bfdf48d-c780-bc65-b0b9-24a33f18827b@redhat.com> Date: Tue, 9 Feb 2021 13:45:11 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20210208185558.995292-4-willemdebruijn.kernel@gmail.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On 2021/2/9 上午2:55, Willem de Bruijn wrote: > From: Willem de Bruijn > > Add optional PTP hardware tx timestamp offload for virtio-net. > > Accurate RTT measurement requires timestamps close to the wire. > Introduce virtio feature VIRTIO_NET_F_TX_TSTAMP, the transmit > equivalent to VIRTIO_NET_F_RX_TSTAMP. > > The driver sets VIRTIO_NET_HDR_F_TSTAMP to request a timestamp > returned on completion. If the feature is negotiated, the device > either places the timestamp or clears the feature bit. > > The timestamp straddles (virtual) hardware domains. Like PTP, use > international atomic time (CLOCK_TAI) as global clock base. The driver > must sync with the device, e.g., through kvm-clock. > > Modify can_push to ensure that on tx completion the header, and thus > timestamp, is in a predicatable location at skb_vnet_hdr. > > RFC: this implementation relies on the device writing to the buffer. > That breaks DMA_TO_DEVICE semantics. For now, disable when DMA is on. > The virtio changes should be a separate patch at the least. > > Tested: modified txtimestamp.c to with h/w timestamping: > - sock_opt = SOF_TIMESTAMPING_SOFTWARE | > + sock_opt = SOF_TIMESTAMPING_RAW_HARDWARE | > + do_test(family, SOF_TIMESTAMPING_TX_HARDWARE); > > Signed-off-by: Willem de Bruijn > --- > drivers/net/virtio_net.c | 61 ++++++++++++++++++++++++++++----- > drivers/virtio/virtio_ring.c | 3 +- > include/linux/virtio.h | 1 + > include/uapi/linux/virtio_net.h | 1 + > 4 files changed, 56 insertions(+), 10 deletions(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index ac44c5efa0bc..fc8ecd3a333a 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -210,6 +210,12 @@ struct virtnet_info { > /* Device will pass rx timestamp. Requires has_rx_tstamp */ > bool enable_rx_tstamp; > > + /* Device can pass CLOCK_TAI transmit time to the driver */ > + bool has_tx_tstamp; > + > + /* Device will pass tx timestamp. Requires has_tx_tstamp */ > + bool enable_tx_tstamp; > + > /* Has control virtqueue */ > bool has_cvq; > > @@ -1401,6 +1407,20 @@ static int virtnet_receive(struct receive_queue *rq, int budget, > return stats.packets; > } > > +static void virtnet_record_tx_tstamp(const struct send_queue *sq, > + struct sk_buff *skb) > +{ > + const struct virtio_net_hdr_hash_ts *h = skb_vnet_hdr_ht(skb); > + const struct virtnet_info *vi = sq->vq->vdev->priv; > + struct skb_shared_hwtstamps ts; > + > + if (h->hdr.flags & VIRTIO_NET_HDR_F_TSTAMP && > + vi->enable_tx_tstamp) { > + ts.hwtstamp = ns_to_ktime(le64_to_cpu(h->tstamp)); > + skb_tstamp_tx(skb, &ts); This probably won't work since the buffer is read-only from the device. (See virtqueue_add_outbuf()). Another issue that I vaguely remember that the virtio spec forbids out buffer after in buffer. > + } > +} > + > static void free_old_xmit_skbs(struct send_queue *sq, bool in_napi) > { > unsigned int len; > @@ -1412,6 +1432,7 @@ static void free_old_xmit_skbs(struct send_queue *sq, bool in_napi) > if (likely(!is_xdp_frame(ptr))) { > struct sk_buff *skb = ptr; > > + virtnet_record_tx_tstamp(sq, skb); > pr_debug("Sent skb %p\n", skb); > > bytes += skb->len; > @@ -1558,7 +1579,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) > struct virtio_net_hdr_mrg_rxbuf *hdr; > const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; > struct virtnet_info *vi = sq->vq->vdev->priv; > - struct virtio_net_hdr_v1_hash *ht; > + struct virtio_net_hdr_hash_ts *ht; > int num_sg; > unsigned hdr_len = vi->hdr_len; > bool can_push; > @@ -1567,7 +1588,8 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) > > can_push = vi->any_header_sg && > !((unsigned long)skb->data & (__alignof__(*hdr) - 1)) && > - !skb_header_cloned(skb) && skb_headroom(skb) >= hdr_len; > + !skb_header_cloned(skb) && skb_headroom(skb) >= hdr_len && > + !vi->enable_tx_tstamp; > /* Even if we can, don't push here yet as this would skew > * csum_start offset below. */ > if (can_push) > @@ -1588,10 +1610,12 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) > u16 report = skb->l4_hash ? VIRTIO_NET_HASH_REPORT_L4 : > VIRTIO_NET_HASH_REPORT_OTHER; > > - ht->hash_value = cpu_to_le32(skb->hash); > - ht->hash_report = cpu_to_le16(report); > - ht->hash_state = cpu_to_le16(VIRTIO_NET_HASH_STATE_DEFAULT); > + ht->hash.value = cpu_to_le32(skb->hash); > + ht->hash.report = cpu_to_le16(report); > + ht->hash.flow_state = cpu_to_le16(VIRTIO_NET_HASH_STATE_DEFAULT); > } > + if (vi->enable_tx_tstamp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) > + ht->hdr.flags |= VIRTIO_NET_HDR_F_TSTAMP; > > sg_init_table(sq->sg, skb_shinfo(skb)->nr_frags + (can_push ? 1 : 2)); > if (can_push) { > @@ -2307,7 +2331,13 @@ static int virtnet_get_ts_info(struct net_device *dev, > info->rx_filters = HWTSTAMP_FILTER_NONE; > } > > - info->tx_types = HWTSTAMP_TX_OFF; > + if (vi->has_tx_tstamp) { > + info->so_timestamping |= SOF_TIMESTAMPING_TX_HARDWARE | > + SOF_TIMESTAMPING_RAW_HARDWARE; > + info->tx_types = HWTSTAMP_TX_ON; > + } else { > + info->tx_types = HWTSTAMP_TX_OFF; > + } > > return 0; > } > @@ -2616,7 +2646,8 @@ static int virtnet_ioctl_set_hwtstamp(struct net_device *dev, struct ifreq *ifr) > return -EFAULT; > if (tsconf.flags) > return -EINVAL; > - if (tsconf.tx_type != HWTSTAMP_TX_OFF) > + if (tsconf.tx_type != HWTSTAMP_TX_OFF && > + tsconf.tx_type != HWTSTAMP_TX_ON) > return -ERANGE; > if (tsconf.rx_filter != HWTSTAMP_FILTER_NONE && > tsconf.rx_filter != HWTSTAMP_FILTER_ALL) > @@ -2627,6 +2658,11 @@ static int virtnet_ioctl_set_hwtstamp(struct net_device *dev, struct ifreq *ifr) > else > vi->enable_rx_tstamp = tsconf.rx_filter == HWTSTAMP_FILTER_ALL; > > + if (!vi->has_tx_tstamp) > + tsconf.tx_type = HWTSTAMP_TX_OFF; > + else > + vi->enable_tx_tstamp = tsconf.tx_type == HWTSTAMP_TX_ON; > + > if (copy_to_user(ifr->ifr_data, &tsconf, sizeof(tsconf))) > return -EFAULT; > > @@ -2641,7 +2677,8 @@ static int virtnet_ioctl_get_hwtstamp(struct net_device *dev, struct ifreq *ifr) > tsconf.flags = 0; > tsconf.rx_filter = vi->enable_rx_tstamp ? HWTSTAMP_FILTER_ALL : > HWTSTAMP_FILTER_NONE; > - tsconf.tx_type = HWTSTAMP_TX_OFF; > + tsconf.tx_type = vi->enable_tx_tstamp ? HWTSTAMP_TX_ON : > + HWTSTAMP_TX_OFF; > > if (copy_to_user(ifr->ifr_data, &tsconf, sizeof(tsconf))) > return -EFAULT; > @@ -3178,6 +3215,12 @@ static int virtnet_probe(struct virtio_device *vdev) > vi->hdr_len = sizeof(struct virtio_net_hdr_hash_ts); > } > > + if (virtio_has_feature(vdev, VIRTIO_NET_F_TX_TSTAMP) && > + !vring_use_dma_api(vdev)) { > + vi->has_tx_tstamp = true; > + vi->hdr_len = sizeof(struct virtio_net_hdr_hash_ts); > + } > + > if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT) || > virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) > vi->any_header_sg = true; > @@ -3369,7 +3412,7 @@ static struct virtio_device_id id_table[] = { > VIRTIO_NET_F_CTRL_MAC_ADDR, \ > VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, \ > VIRTIO_NET_F_SPEED_DUPLEX, VIRTIO_NET_F_STANDBY, \ > - VIRTIO_NET_F_TX_HASH, VIRTIO_NET_F_RX_TSTAMP > + VIRTIO_NET_F_TX_HASH, VIRTIO_NET_F_RX_TSTAMP, VIRTIO_NET_F_TX_TSTAMP > > static unsigned int features[] = { > VIRTNET_FEATURES, > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > index 71e16b53e9c1..cf5d5d1f9b14 100644 > --- a/drivers/virtio/virtio_ring.c > +++ b/drivers/virtio/virtio_ring.c > @@ -238,7 +238,7 @@ static inline bool virtqueue_use_indirect(struct virtqueue *_vq, > * unconditionally on data path. > */ > > -static bool vring_use_dma_api(struct virtio_device *vdev) > +bool vring_use_dma_api(struct virtio_device *vdev) > { > if (!virtio_has_dma_quirk(vdev)) > return true; > @@ -257,6 +257,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev) > > return false; > } > +EXPORT_SYMBOL_GPL(vring_use_dma_api); > > size_t virtio_max_dma_size(struct virtio_device *vdev) > { > diff --git a/include/linux/virtio.h b/include/linux/virtio.h > index 55ea329fe72a..5289e2812e95 100644 > --- a/include/linux/virtio.h > +++ b/include/linux/virtio.h > @@ -140,6 +140,7 @@ int virtio_device_freeze(struct virtio_device *dev); > int virtio_device_restore(struct virtio_device *dev); > #endif > > +bool vring_use_dma_api(struct virtio_device *vdev); > size_t virtio_max_dma_size(struct virtio_device *vdev); > > #define virtio_device_for_each_vq(vdev, vq) \ > diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h > index a5c84410cf92..b5d6f0c6cead 100644 > --- a/include/uapi/linux/virtio_net.h > +++ b/include/uapi/linux/virtio_net.h > @@ -57,6 +57,7 @@ > * Steering */ > #define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ > > +#define VIRTIO_NET_F_TX_TSTAMP 54 /* Device sends TAI transmit time */ > #define VIRTIO_NET_F_RX_TSTAMP 55 /* Device sends TAI receive time */ I wonder how much value to split into two features. Thanks > #define VIRTIO_NET_F_TX_HASH 56 /* Driver sends hash report */ > #define VIRTIO_NET_F_HASH_REPORT 57 /* Supports hash report */ 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=-15.3 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 7F7CEC433DB for ; Tue, 9 Feb 2021 05:45:29 +0000 (UTC) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (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 0B07264EAC for ; Tue, 9 Feb 2021 05:45:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0B07264EAC 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 hemlock.osuosl.org (Postfix) with ESMTP id B38FA870E8; Tue, 9 Feb 2021 05:45:28 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nyiU5HTSlLFp; Tue, 9 Feb 2021 05:45:26 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id AE289870B7; Tue, 9 Feb 2021 05:45:26 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 948EFC0174; Tue, 9 Feb 2021 05:45:26 +0000 (UTC) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id BCC4DC013A for ; Tue, 9 Feb 2021 05:45:25 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id AB7D2870BC for ; Tue, 9 Feb 2021 05:45:25 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DYz4E+gwguYb for ; Tue, 9 Feb 2021 05:45:24 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by hemlock.osuosl.org (Postfix) with ESMTPS id 5D725870B7 for ; Tue, 9 Feb 2021 05:45:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612849523; 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=SqWQMicuqwpUgM/IV7wpTQvXG4FaZXOYT8OH3bBnBdA=; b=PZbHUXWtHwlFl2romiET1ZzkMLhD6xBXlOJuZakrMmMCEVrF2e6lQRIEBiG3n9tJBhyxTs XstMTJBhussxKV+qrkqmkkOGNMUYpfaJJrlN63Xp0vS7K9n4Iwg5Q6EMr7K+udsXikjPGe Gt0STpWRmDjj3ZYVxG3fMnTzkKEm2vM= 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-534-bQdKlESHONuxbGIL6oWF_g-1; Tue, 09 Feb 2021 00:45:19 -0500 X-MC-Unique: bQdKlESHONuxbGIL6oWF_g-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D66195210; Tue, 9 Feb 2021 05:45:17 +0000 (UTC) Received: from [10.72.13.32] (ovpn-13-32.pek2.redhat.com [10.72.13.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9A43D63B8C; Tue, 9 Feb 2021 05:45:12 +0000 (UTC) Subject: Re: [PATCH RFC v2 3/4] virtio-net: support transmit timestamp To: Willem de Bruijn , virtualization@lists.linux-foundation.org References: <20210208185558.995292-1-willemdebruijn.kernel@gmail.com> <20210208185558.995292-4-willemdebruijn.kernel@gmail.com> From: Jason Wang Message-ID: <6bfdf48d-c780-bc65-b0b9-24a33f18827b@redhat.com> Date: Tue, 9 Feb 2021 13:45:11 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20210208185558.995292-4-willemdebruijn.kernel@gmail.com> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Cc: netdev@vger.kernel.org, richardcochran@gmail.com, Willem de Bruijn , mst@redhat.com 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" Ck9uIDIwMjEvMi85IOS4iuWNiDI6NTUsIFdpbGxlbSBkZSBCcnVpam4gd3JvdGU6Cj4gRnJvbTog V2lsbGVtIGRlIEJydWlqbiA8d2lsbGVtYkBnb29nbGUuY29tPgo+Cj4gQWRkIG9wdGlvbmFsIFBU UCBoYXJkd2FyZSB0eCB0aW1lc3RhbXAgb2ZmbG9hZCBmb3IgdmlydGlvLW5ldC4KPgo+IEFjY3Vy YXRlIFJUVCBtZWFzdXJlbWVudCByZXF1aXJlcyB0aW1lc3RhbXBzIGNsb3NlIHRvIHRoZSB3aXJl Lgo+IEludHJvZHVjZSB2aXJ0aW8gZmVhdHVyZSBWSVJUSU9fTkVUX0ZfVFhfVFNUQU1QLCB0aGUg dHJhbnNtaXQKPiBlcXVpdmFsZW50IHRvIFZJUlRJT19ORVRfRl9SWF9UU1RBTVAuCj4KPiBUaGUg ZHJpdmVyIHNldHMgVklSVElPX05FVF9IRFJfRl9UU1RBTVAgdG8gcmVxdWVzdCBhIHRpbWVzdGFt cAo+IHJldHVybmVkIG9uIGNvbXBsZXRpb24uIElmIHRoZSBmZWF0dXJlIGlzIG5lZ290aWF0ZWQs IHRoZSBkZXZpY2UKPiBlaXRoZXIgcGxhY2VzIHRoZSB0aW1lc3RhbXAgb3IgY2xlYXJzIHRoZSBm ZWF0dXJlIGJpdC4KPgo+IFRoZSB0aW1lc3RhbXAgc3RyYWRkbGVzICh2aXJ0dWFsKSBoYXJkd2Fy ZSBkb21haW5zLiBMaWtlIFBUUCwgdXNlCj4gaW50ZXJuYXRpb25hbCBhdG9taWMgdGltZSAoQ0xP Q0tfVEFJKSBhcyBnbG9iYWwgY2xvY2sgYmFzZS4gVGhlIGRyaXZlcgo+IG11c3Qgc3luYyB3aXRo IHRoZSBkZXZpY2UsIGUuZy4sIHRocm91Z2gga3ZtLWNsb2NrLgo+Cj4gTW9kaWZ5IGNhbl9wdXNo IHRvIGVuc3VyZSB0aGF0IG9uIHR4IGNvbXBsZXRpb24gdGhlIGhlYWRlciwgYW5kIHRodXMKPiB0 aW1lc3RhbXAsIGlzIGluIGEgcHJlZGljYXRhYmxlIGxvY2F0aW9uIGF0IHNrYl92bmV0X2hkci4K Pgo+IFJGQzogdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGRldmljZSB3cml0aW5n IHRvIHRoZSBidWZmZXIuCj4gVGhhdCBicmVha3MgRE1BX1RPX0RFVklDRSBzZW1hbnRpY3MuIEZv ciBub3csIGRpc2FibGUgd2hlbiBETUEgaXMgb24uCj4gVGhlIHZpcnRpbyBjaGFuZ2VzIHNob3Vs ZCBiZSBhIHNlcGFyYXRlIHBhdGNoIGF0IHRoZSBsZWFzdC4KPgo+IFRlc3RlZDogbW9kaWZpZWQg dHh0aW1lc3RhbXAuYyB0byB3aXRoIGgvdyB0aW1lc3RhbXBpbmc6Cj4gICAgLSAgICAgICBzb2Nr X29wdCA9IFNPRl9USU1FU1RBTVBJTkdfU09GVFdBUkUgfAo+ICAgICsgICAgICAgc29ja19vcHQg PSBTT0ZfVElNRVNUQU1QSU5HX1JBV19IQVJEV0FSRSB8Cj4gICAgKyBkb190ZXN0KGZhbWlseSwg U09GX1RJTUVTVEFNUElOR19UWF9IQVJEV0FSRSk7Cj4KPiBTaWduZWQtb2ZmLWJ5OiBXaWxsZW0g ZGUgQnJ1aWpuIDx3aWxsZW1iQGdvb2dsZS5jb20+Cj4gLS0tCj4gICBkcml2ZXJzL25ldC92aXJ0 aW9fbmV0LmMgICAgICAgIHwgNjEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tCj4g ICBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jICAgIHwgIDMgKy0KPiAgIGluY2x1ZGUvbGlu dXgvdmlydGlvLmggICAgICAgICAgfCAgMSArCj4gICBpbmNsdWRlL3VhcGkvbGludXgvdmlydGlv X25ldC5oIHwgIDEgKwo+ICAgNCBmaWxlcyBjaGFuZ2VkLCA1NiBpbnNlcnRpb25zKCspLCAxMCBk ZWxldGlvbnMoLSkKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMgYi9k cml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKPiBpbmRleCBhYzQ0YzVlZmEwYmMuLmZjOGVjZDNhMzMz YSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKPiArKysgYi9kcml2ZXJz L25ldC92aXJ0aW9fbmV0LmMKPiBAQCAtMjEwLDYgKzIxMCwxMiBAQCBzdHJ1Y3QgdmlydG5ldF9p bmZvIHsKPiAgIAkvKiBEZXZpY2Ugd2lsbCBwYXNzIHJ4IHRpbWVzdGFtcC4gUmVxdWlyZXMgaGFz X3J4X3RzdGFtcCAqLwo+ICAgCWJvb2wgZW5hYmxlX3J4X3RzdGFtcDsKPiAgIAo+ICsJLyogRGV2 aWNlIGNhbiBwYXNzIENMT0NLX1RBSSB0cmFuc21pdCB0aW1lIHRvIHRoZSBkcml2ZXIgKi8KPiAr CWJvb2wgaGFzX3R4X3RzdGFtcDsKPiArCj4gKwkvKiBEZXZpY2Ugd2lsbCBwYXNzIHR4IHRpbWVz dGFtcC4gUmVxdWlyZXMgaGFzX3R4X3RzdGFtcCAqLwo+ICsJYm9vbCBlbmFibGVfdHhfdHN0YW1w Owo+ICsKPiAgIAkvKiBIYXMgY29udHJvbCB2aXJ0cXVldWUgKi8KPiAgIAlib29sIGhhc19jdnE7 Cj4gICAKPiBAQCAtMTQwMSw2ICsxNDA3LDIwIEBAIHN0YXRpYyBpbnQgdmlydG5ldF9yZWNlaXZl KHN0cnVjdCByZWNlaXZlX3F1ZXVlICpycSwgaW50IGJ1ZGdldCwKPiAgIAlyZXR1cm4gc3RhdHMu cGFja2V0czsKPiAgIH0KPiAgIAo+ICtzdGF0aWMgdm9pZCB2aXJ0bmV0X3JlY29yZF90eF90c3Rh bXAoY29uc3Qgc3RydWN0IHNlbmRfcXVldWUgKnNxLAo+ICsJCQkJICAgICBzdHJ1Y3Qgc2tfYnVm ZiAqc2tiKQo+ICt7Cj4gKwljb25zdCBzdHJ1Y3QgdmlydGlvX25ldF9oZHJfaGFzaF90cyAqaCA9 IHNrYl92bmV0X2hkcl9odChza2IpOwo+ICsJY29uc3Qgc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkg PSBzcS0+dnEtPnZkZXYtPnByaXY7Cj4gKwlzdHJ1Y3Qgc2tiX3NoYXJlZF9od3RzdGFtcHMgdHM7 Cj4gKwo+ICsJaWYgKGgtPmhkci5mbGFncyAmIFZJUlRJT19ORVRfSERSX0ZfVFNUQU1QICYmCj4g KwkgICAgdmktPmVuYWJsZV90eF90c3RhbXApIHsKPiArCQl0cy5od3RzdGFtcCA9IG5zX3RvX2t0 aW1lKGxlNjRfdG9fY3B1KGgtPnRzdGFtcCkpOwo+ICsJCXNrYl90c3RhbXBfdHgoc2tiLCAmdHMp OwoKClRoaXMgcHJvYmFibHkgd29uJ3Qgd29yayBzaW5jZSB0aGUgYnVmZmVyIGlzIHJlYWQtb25s eSBmcm9tIHRoZSBkZXZpY2UuIAooU2VlIHZpcnRxdWV1ZV9hZGRfb3V0YnVmKCkpLgoKQW5vdGhl ciBpc3N1ZSB0aGF0IEkgdmFndWVseSByZW1lbWJlciB0aGF0IHRoZSB2aXJ0aW8gc3BlYyBmb3Ji aWRzIG91dCAKYnVmZmVyIGFmdGVyIGluIGJ1ZmZlci4KCgo+ICsJfQo+ICt9Cj4gKwo+ICAgc3Rh dGljIHZvaWQgZnJlZV9vbGRfeG1pdF9za2JzKHN0cnVjdCBzZW5kX3F1ZXVlICpzcSwgYm9vbCBp bl9uYXBpKQo+ICAgewo+ICAgCXVuc2lnbmVkIGludCBsZW47Cj4gQEAgLTE0MTIsNiArMTQzMiw3 IEBAIHN0YXRpYyB2b2lkIGZyZWVfb2xkX3htaXRfc2ticyhzdHJ1Y3Qgc2VuZF9xdWV1ZSAqc3Es IGJvb2wgaW5fbmFwaSkKPiAgIAkJaWYgKGxpa2VseSghaXNfeGRwX2ZyYW1lKHB0cikpKSB7Cj4g ICAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHRyOwo+ICAgCj4gKwkJCXZpcnRuZXRfcmVjb3Jk X3R4X3RzdGFtcChzcSwgc2tiKTsKPiAgIAkJCXByX2RlYnVnKCJTZW50IHNrYiAlcFxuIiwgc2ti KTsKPiAgIAo+ICAgCQkJYnl0ZXMgKz0gc2tiLT5sZW47Cj4gQEAgLTE1NTgsNyArMTU3OSw3IEBA IHN0YXRpYyBpbnQgeG1pdF9za2Ioc3RydWN0IHNlbmRfcXVldWUgKnNxLCBzdHJ1Y3Qgc2tfYnVm ZiAqc2tiKQo+ICAgCXN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYgKmhkcjsKPiAgIAlj b25zdCB1bnNpZ25lZCBjaGFyICpkZXN0ID0gKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+ aF9kZXN0Owo+ICAgCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gc3EtPnZxLT52ZGV2LT5wcml2 Owo+IC0Jc3RydWN0IHZpcnRpb19uZXRfaGRyX3YxX2hhc2ggKmh0Owo+ICsJc3RydWN0IHZpcnRp b19uZXRfaGRyX2hhc2hfdHMgKmh0Owo+ICAgCWludCBudW1fc2c7Cj4gICAJdW5zaWduZWQgaGRy X2xlbiA9IHZpLT5oZHJfbGVuOwo+ICAgCWJvb2wgY2FuX3B1c2g7Cj4gQEAgLTE1NjcsNyArMTU4 OCw4IEBAIHN0YXRpYyBpbnQgeG1pdF9za2Ioc3RydWN0IHNlbmRfcXVldWUgKnNxLCBzdHJ1Y3Qg c2tfYnVmZiAqc2tiKQo+ICAgCj4gICAJY2FuX3B1c2ggPSB2aS0+YW55X2hlYWRlcl9zZyAmJgo+ ICAgCQkhKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSAmIChfX2FsaWdub2ZfXygqaGRyKSAtIDEp KSAmJgo+IC0JCSFza2JfaGVhZGVyX2Nsb25lZChza2IpICYmIHNrYl9oZWFkcm9vbShza2IpID49 IGhkcl9sZW47Cj4gKwkJIXNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYgc2tiX2hlYWRyb29tKHNr YikgPj0gaGRyX2xlbiAmJgo+ICsJCSF2aS0+ZW5hYmxlX3R4X3RzdGFtcDsKPiAgIAkvKiBFdmVu IGlmIHdlIGNhbiwgZG9uJ3QgcHVzaCBoZXJlIHlldCBhcyB0aGlzIHdvdWxkIHNrZXcKPiAgIAkg KiBjc3VtX3N0YXJ0IG9mZnNldCBiZWxvdy4gKi8KPiAgIAlpZiAoY2FuX3B1c2gpCj4gQEAgLTE1 ODgsMTAgKzE2MTAsMTIgQEAgc3RhdGljIGludCB4bWl0X3NrYihzdHJ1Y3Qgc2VuZF9xdWV1ZSAq c3EsIHN0cnVjdCBza19idWZmICpza2IpCj4gICAJCXUxNiByZXBvcnQgPSBza2ItPmw0X2hhc2gg PyBWSVJUSU9fTkVUX0hBU0hfUkVQT1JUX0w0IDoKPiAgIAkJCQkJICAgIFZJUlRJT19ORVRfSEFT SF9SRVBPUlRfT1RIRVI7Cj4gICAKPiAtCQlodC0+aGFzaF92YWx1ZSA9IGNwdV90b19sZTMyKHNr Yi0+aGFzaCk7Cj4gLQkJaHQtPmhhc2hfcmVwb3J0ID0gY3B1X3RvX2xlMTYocmVwb3J0KTsKPiAt CQlodC0+aGFzaF9zdGF0ZSA9IGNwdV90b19sZTE2KFZJUlRJT19ORVRfSEFTSF9TVEFURV9ERUZB VUxUKTsKPiArCQlodC0+aGFzaC52YWx1ZSA9IGNwdV90b19sZTMyKHNrYi0+aGFzaCk7Cj4gKwkJ aHQtPmhhc2gucmVwb3J0ID0gY3B1X3RvX2xlMTYocmVwb3J0KTsKPiArCQlodC0+aGFzaC5mbG93 X3N0YXRlID0gY3B1X3RvX2xlMTYoVklSVElPX05FVF9IQVNIX1NUQVRFX0RFRkFVTFQpOwo+ICAg CX0KPiArCWlmICh2aS0+ZW5hYmxlX3R4X3RzdGFtcCAmJiBza2Jfc2hpbmZvKHNrYiktPnR4X2Zs YWdzICYgU0tCVFhfSFdfVFNUQU1QKQo+ICsJCWh0LT5oZHIuZmxhZ3MgfD0gVklSVElPX05FVF9I RFJfRl9UU1RBTVA7Cj4gICAKPiAgIAlzZ19pbml0X3RhYmxlKHNxLT5zZywgc2tiX3NoaW5mbyhz a2IpLT5ucl9mcmFncyArIChjYW5fcHVzaCA/IDEgOiAyKSk7Cj4gICAJaWYgKGNhbl9wdXNoKSB7 Cj4gQEAgLTIzMDcsNyArMjMzMSwxMyBAQCBzdGF0aWMgaW50IHZpcnRuZXRfZ2V0X3RzX2luZm8o c3RydWN0IG5ldF9kZXZpY2UgKmRldiwKPiAgIAkJaW5mby0+cnhfZmlsdGVycyA9IEhXVFNUQU1Q X0ZJTFRFUl9OT05FOwo+ICAgCX0KPiAgIAo+IC0JaW5mby0+dHhfdHlwZXMgPSBIV1RTVEFNUF9U WF9PRkY7Cj4gKwlpZiAodmktPmhhc190eF90c3RhbXApIHsKPiArCQlpbmZvLT5zb190aW1lc3Rh bXBpbmcgfD0gU09GX1RJTUVTVEFNUElOR19UWF9IQVJEV0FSRSB8Cj4gKwkJCQkJIFNPRl9USU1F U1RBTVBJTkdfUkFXX0hBUkRXQVJFOwo+ICsJCWluZm8tPnR4X3R5cGVzID0gSFdUU1RBTVBfVFhf T047Cj4gKwl9IGVsc2Ugewo+ICsJCWluZm8tPnR4X3R5cGVzID0gSFdUU1RBTVBfVFhfT0ZGOwo+ ICsJfQo+ICAgCj4gICAJcmV0dXJuIDA7Cj4gICB9Cj4gQEAgLTI2MTYsNyArMjY0Niw4IEBAIHN0 YXRpYyBpbnQgdmlydG5ldF9pb2N0bF9zZXRfaHd0c3RhbXAoc3RydWN0IG5ldF9kZXZpY2UgKmRl diwgc3RydWN0IGlmcmVxICppZnIpCj4gICAJCXJldHVybiAtRUZBVUxUOwo+ICAgCWlmICh0c2Nv bmYuZmxhZ3MpCj4gICAJCXJldHVybiAtRUlOVkFMOwo+IC0JaWYgKHRzY29uZi50eF90eXBlICE9 IEhXVFNUQU1QX1RYX09GRikKPiArCWlmICh0c2NvbmYudHhfdHlwZSAhPSBIV1RTVEFNUF9UWF9P RkYgJiYKPiArCSAgICB0c2NvbmYudHhfdHlwZSAhPSBIV1RTVEFNUF9UWF9PTikKPiAgIAkJcmV0 dXJuIC1FUkFOR0U7Cj4gICAJaWYgKHRzY29uZi5yeF9maWx0ZXIgIT0gSFdUU1RBTVBfRklMVEVS X05PTkUgJiYKPiAgIAkgICAgdHNjb25mLnJ4X2ZpbHRlciAhPSBIV1RTVEFNUF9GSUxURVJfQUxM KQo+IEBAIC0yNjI3LDYgKzI2NTgsMTEgQEAgc3RhdGljIGludCB2aXJ0bmV0X2lvY3RsX3NldF9o d3RzdGFtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKPiAgIAll bHNlCj4gICAJCXZpLT5lbmFibGVfcnhfdHN0YW1wID0gdHNjb25mLnJ4X2ZpbHRlciA9PSBIV1RT VEFNUF9GSUxURVJfQUxMOwo+ICAgCj4gKwlpZiAoIXZpLT5oYXNfdHhfdHN0YW1wKQo+ICsJCXRz Y29uZi50eF90eXBlID0gSFdUU1RBTVBfVFhfT0ZGOwo+ICsJZWxzZQo+ICsJCXZpLT5lbmFibGVf dHhfdHN0YW1wID0gdHNjb25mLnR4X3R5cGUgPT0gSFdUU1RBTVBfVFhfT047Cj4gKwo+ICAgCWlm IChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnRzY29uZiwgc2l6ZW9mKHRzY29uZikpKQo+ ICAgCQlyZXR1cm4gLUVGQVVMVDsKPiAgIAo+IEBAIC0yNjQxLDcgKzI2NzcsOCBAQCBzdGF0aWMg aW50IHZpcnRuZXRfaW9jdGxfZ2V0X2h3dHN0YW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0 cnVjdCBpZnJlcSAqaWZyKQo+ICAgCXRzY29uZi5mbGFncyA9IDA7Cj4gICAJdHNjb25mLnJ4X2Zp bHRlciA9IHZpLT5lbmFibGVfcnhfdHN0YW1wID8gSFdUU1RBTVBfRklMVEVSX0FMTCA6Cj4gICAJ CQkJCQkgIEhXVFNUQU1QX0ZJTFRFUl9OT05FOwo+IC0JdHNjb25mLnR4X3R5cGUgPSBIV1RTVEFN UF9UWF9PRkY7Cj4gKwl0c2NvbmYudHhfdHlwZSA9IHZpLT5lbmFibGVfdHhfdHN0YW1wID8gSFdU U1RBTVBfVFhfT04gOgo+ICsJCQkJCQlIV1RTVEFNUF9UWF9PRkY7Cj4gICAKPiAgIAlpZiAoY29w eV90b191c2VyKGlmci0+aWZyX2RhdGEsICZ0c2NvbmYsIHNpemVvZih0c2NvbmYpKSkKPiAgIAkJ cmV0dXJuIC1FRkFVTFQ7Cj4gQEAgLTMxNzgsNiArMzIxNSwxMiBAQCBzdGF0aWMgaW50IHZpcnRu ZXRfcHJvYmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCj4gICAJCXZpLT5oZHJfbGVuID0g c2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9oYXNoX3RzKTsKPiAgIAl9Cj4gICAKPiArCWlm ICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX05FVF9GX1RYX1RTVEFNUCkgJiYKPiAr CSAgICAhdnJpbmdfdXNlX2RtYV9hcGkodmRldikpIHsKPiArCQl2aS0+aGFzX3R4X3RzdGFtcCA9 IHRydWU7Cj4gKwkJdmktPmhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyX2hh c2hfdHMpOwo+ICsJfQo+ICsKPiAgIAlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJ T19GX0FOWV9MQVlPVVQpIHx8Cj4gICAJICAgIHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJU SU9fRl9WRVJTSU9OXzEpKQo+ICAgCQl2aS0+YW55X2hlYWRlcl9zZyA9IHRydWU7Cj4gQEAgLTMz NjksNyArMzQxMiw3IEBAIHN0YXRpYyBzdHJ1Y3QgdmlydGlvX2RldmljZV9pZCBpZF90YWJsZVtd ID0gewo+ICAgCVZJUlRJT19ORVRfRl9DVFJMX01BQ19BRERSLCBcCj4gICAJVklSVElPX05FVF9G X01UVSwgVklSVElPX05FVF9GX0NUUkxfR1VFU1RfT0ZGTE9BRFMsIFwKPiAgIAlWSVJUSU9fTkVU X0ZfU1BFRURfRFVQTEVYLCBWSVJUSU9fTkVUX0ZfU1RBTkRCWSwgXAo+IC0JVklSVElPX05FVF9G X1RYX0hBU0gsIFZJUlRJT19ORVRfRl9SWF9UU1RBTVAKPiArCVZJUlRJT19ORVRfRl9UWF9IQVNI LCBWSVJUSU9fTkVUX0ZfUlhfVFNUQU1QLCBWSVJUSU9fTkVUX0ZfVFhfVFNUQU1QCj4gICAKPiAg IHN0YXRpYyB1bnNpZ25lZCBpbnQgZmVhdHVyZXNbXSA9IHsKPiAgIAlWSVJUTkVUX0ZFQVRVUkVT LAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jIGIvZHJpdmVycy92 aXJ0aW8vdmlydGlvX3JpbmcuYwo+IGluZGV4IDcxZTE2YjUzZTljMS4uY2Y1ZDVkMWY5YjE0IDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKPiArKysgYi9kcml2ZXJz L3ZpcnRpby92aXJ0aW9fcmluZy5jCj4gQEAgLTIzOCw3ICsyMzgsNyBAQCBzdGF0aWMgaW5saW5l IGJvb2wgdmlydHF1ZXVlX3VzZV9pbmRpcmVjdChzdHJ1Y3QgdmlydHF1ZXVlICpfdnEsCj4gICAg KiB1bmNvbmRpdGlvbmFsbHkgb24gZGF0YSBwYXRoLgo+ICAgICovCj4gICAKPiAtc3RhdGljIGJv b2wgdnJpbmdfdXNlX2RtYV9hcGkoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCj4gK2Jvb2wg dnJpbmdfdXNlX2RtYV9hcGkoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCj4gICB7Cj4gICAJ aWYgKCF2aXJ0aW9faGFzX2RtYV9xdWlyayh2ZGV2KSkKPiAgIAkJcmV0dXJuIHRydWU7Cj4gQEAg LTI1Nyw2ICsyNTcsNyBAQCBzdGF0aWMgYm9vbCB2cmluZ191c2VfZG1hX2FwaShzdHJ1Y3Qgdmly dGlvX2RldmljZSAqdmRldikKPiAgIAo+ICAgCXJldHVybiBmYWxzZTsKPiAgIH0KPiArRVhQT1JU X1NZTUJPTF9HUEwodnJpbmdfdXNlX2RtYV9hcGkpOwo+ICAgCj4gICBzaXplX3QgdmlydGlvX21h eF9kbWFfc2l6ZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKPiAgIHsKPiBkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC92aXJ0aW8uaCBiL2luY2x1ZGUvbGludXgvdmlydGlvLmgKPiBpbmRl eCA1NWVhMzI5ZmU3MmEuLjUyODllMjgxMmU5NSAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4 L3ZpcnRpby5oCj4gKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW8uaAo+IEBAIC0xNDAsNiArMTQw LDcgQEAgaW50IHZpcnRpb19kZXZpY2VfZnJlZXplKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICpkZXYp Owo+ICAgaW50IHZpcnRpb19kZXZpY2VfcmVzdG9yZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqZGV2 KTsKPiAgICNlbmRpZgo+ICAgCj4gK2Jvb2wgdnJpbmdfdXNlX2RtYV9hcGkoc3RydWN0IHZpcnRp b19kZXZpY2UgKnZkZXYpOwo+ICAgc2l6ZV90IHZpcnRpb19tYXhfZG1hX3NpemUoc3RydWN0IHZp cnRpb19kZXZpY2UgKnZkZXYpOwo+ICAgCj4gICAjZGVmaW5lIHZpcnRpb19kZXZpY2VfZm9yX2Vh Y2hfdnEodmRldiwgdnEpIFwKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRp b19uZXQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC92aXJ0aW9fbmV0LmgKPiBpbmRleCBhNWM4NDQx MGNmOTIuLmI1ZDZmMGM2Y2VhZCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdmly dGlvX25ldC5oCj4gKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19uZXQuaAo+IEBAIC01 Nyw2ICs1Nyw3IEBACj4gICAJCQkJCSAqIFN0ZWVyaW5nICovCj4gICAjZGVmaW5lIFZJUlRJT19O RVRfRl9DVFJMX01BQ19BRERSIDIzCS8qIFNldCBNQUMgYWRkcmVzcyAqLwo+ICAgCj4gKyNkZWZp bmUgVklSVElPX05FVF9GX1RYX1RTVEFNUAkgIDU0CS8qIERldmljZSBzZW5kcyBUQUkgdHJhbnNt aXQgdGltZSAqLwo+ICAgI2RlZmluZSBWSVJUSU9fTkVUX0ZfUlhfVFNUQU1QCSAgNTUJLyogRGV2 aWNlIHNlbmRzIFRBSSByZWNlaXZlIHRpbWUgKi8KCgpJIHdvbmRlciBob3cgbXVjaCB2YWx1ZSB0 byBzcGxpdCBpbnRvIHR3byBmZWF0dXJlcy4KClRoYW5rcwoKCj4gICAjZGVmaW5lIFZJUlRJT19O RVRfRl9UWF9IQVNICSAgNTYJLyogRHJpdmVyIHNlbmRzIGhhc2ggcmVwb3J0ICovCj4gICAjZGVm aW5lIFZJUlRJT19ORVRfRl9IQVNIX1JFUE9SVCAgNTcJLyogU3VwcG9ydHMgaGFzaCByZXBvcnQg Ki8KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1 YWxpemF0aW9uIG1haWxpbmcgbGlzdApWaXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0 aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5m by92aXJ0dWFsaXphdGlvbg==