From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 90D9DCA9EC0 for ; Mon, 28 Oct 2019 18:01:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5520D20862 for ; Mon, 28 Oct 2019 18:01:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="V49twJFB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404283AbfJ1SBV (ORCPT ); Mon, 28 Oct 2019 14:01:21 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:34367 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730966AbfJ1SBV (ORCPT ); Mon, 28 Oct 2019 14:01:21 -0400 Received: by mail-wr1-f65.google.com with SMTP id t16so10910875wrr.1 for ; Mon, 28 Oct 2019 11:01:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=jduO3+nmeKK9VS1s8WbIrvAU7M7GfnDKYTuy7uL3lUk=; b=V49twJFBnv8vhyt1xGKbHgkEMxw/QmzBWMVQxqa8ndFePF1i4p6i1Jfh+Wm51qxxjT A2pFiKu4QAZlTUF+VhSBJktYwoKAglOebImWS3d9LIRmEBPxakf600WFrk81zBnmZOfc KqpQCGwEBzU/zKPHyTiOP+paHBqhzcfBEkZ2hx82xIxjkRptjQ/KVTGkYRVgLeIy7I2b s4ffI+Z9GLwb4Z7RZYYyFvIWqQb4TKbqW7GiXegoH3sNIlBeBNrFVue1zNS4Wrh2HCb4 ZVcMsMa0bgF/A3EL8TH9XbcmBcm4k2/4rcgSN4cc+0WRDyHJaDkKTGflpHuRMwM2xwip xxtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=jduO3+nmeKK9VS1s8WbIrvAU7M7GfnDKYTuy7uL3lUk=; b=PdhKD/bk0u528cBZ0QunzwSj37cQWhOvEuF7cBMUuWKgUnAJKEeMPxZrXi7NxVympG nENpyXXa8VqwcKEN767BVOaUiTAJHmEwf4QeyX6n+IuXr/yCMU1j4dbeb+fMzoT31dE8 oERoqfNdfGOXHQSF2ZGiZYxaHmSSYQSh5CD9+WrRcUzgaLX2PIyy46TC/CXCFtg2jSKE 7qU/RnpADsKqojPVjb4liKPUWQvubKRVTkD3vRauk5UHuboDb0QpVCAejRXhwETUtMW4 qKfM2bZiBKzSZ4xRPPRkUlByL3Gre4JVB9/i09IAvf1Q7Bp9bo+I9YFQR5WB3sBPfWh9 I7Wg== X-Gm-Message-State: APjAAAUHyfLkl2kulHMAc32tqDY2rgH8TQDBQUjKXV5Z2joFXb4U+XRo riBc61A5019EdVHH0MxZ85be+5tIezvAqi3V3H8= X-Google-Smtp-Source: APXvYqzoAdGTSHSTU9eyo8LQOBqa6heDODvIKG2DLAH+ujy7LtazhawvcWzU5HbRuAOr79Iu1oSlrWXXkm2MzpNIx/A= X-Received: by 2002:a5d:444b:: with SMTP id x11mr16184711wrr.207.1572285675441; Mon, 28 Oct 2019 11:01:15 -0700 (PDT) MIME-Version: 1.0 References: <20191028024156.23964-1-linux@roeck-us.net> In-Reply-To: <20191028024156.23964-1-linux@roeck-us.net> From: Andrey Smirnov Date: Mon, 28 Oct 2019 11:01:03 -0700 Message-ID: Subject: Re: [PATCH] nvme: Add hardware monitoring support To: Guenter Roeck Cc: Keith Busch , Chris Healy , Jens Axboe , Christoph Hellwig , Sagi Grimberg , linux-kernel , linux-nvme@lists.infradead.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 28, 2019 at 7:04 AM Guenter Roeck wrote: > > nvme devices report temperature information in the controller information > (for limits) and in the smart log. Currently, the only means to retrieve > this information is the nvme command line interface, which requires > super-user privileges. > > At the same time, it would be desirable to use NVME temperature informati= on > for thermal control. > > This patch adds support to read NVME temperatures from the kernel using t= he > hwmon API and adds temperature zones for NVME drives. The thermal subsyst= em > can use this information to set thermal policies, and userspace can acces= s > it using libsensors and/or the "sensors" command. > > Example output from the "sensors" command: > > nvme0-pci-0100 > Adapter: PCI adapter > Composite: +39.0=C2=B0C (high =3D +85.0=C2=B0C, crit =3D +85.0=C2=B0C= ) > Sensor 1: +39.0=C2=B0C > Sensor 2: +41.0=C2=B0C > Tried this on ZII i.MX8MQ Ultra Zest Board with NVMe device attached. Seems to work as advertised, so: Tested-by: Andrey Smirnov > Signed-off-by: Guenter Roeck > --- > drivers/nvme/host/Kconfig | 10 +++ > drivers/nvme/host/Makefile | 1 + > drivers/nvme/host/core.c | 5 ++ > drivers/nvme/host/nvme-hwmon.c | 160 +++++++++++++++++++++++++++++++++ > drivers/nvme/host/nvme.h | 8 ++ > 5 files changed, 184 insertions(+) > create mode 100644 drivers/nvme/host/nvme-hwmon.c > > diff --git a/drivers/nvme/host/Kconfig b/drivers/nvme/host/Kconfig > index 2b36f052bfb9..aeb49e16e386 100644 > --- a/drivers/nvme/host/Kconfig > +++ b/drivers/nvme/host/Kconfig > @@ -23,6 +23,16 @@ config NVME_MULTIPATH > /dev/nvmeXnY device will show up for each NVMe namespaces, > even if it is accessible through multiple controllers. > > +config NVME_HWMON > + bool "NVME hardware monitoring" > + depends on (NVME_CORE=3Dy && HWMON=3Dy) || (NVME_CORE=3Dm && HWMO= N) > + help > + This provides support for NVME hardware monitoring. If enabled, > + a hardware monitoring device will be created for each NVME driv= e > + in the system. > + > + If unsure, say N. > + > config NVME_FABRICS > tristate > > diff --git a/drivers/nvme/host/Makefile b/drivers/nvme/host/Makefile > index 8a4b671c5f0c..03de4797a877 100644 > --- a/drivers/nvme/host/Makefile > +++ b/drivers/nvme/host/Makefile > @@ -14,6 +14,7 @@ nvme-core-$(CONFIG_TRACING) +=3D trace.o > nvme-core-$(CONFIG_NVME_MULTIPATH) +=3D multipath.o > nvme-core-$(CONFIG_NVM) +=3D lightnvm.o > nvme-core-$(CONFIG_FAULT_INJECTION_DEBUG_FS) +=3D fault_inject.o > +nvme-core-$(CONFIG_NVME_HWMON) +=3D nvme-hwmon.o > > nvme-y +=3D pci.o > > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c > index fa7ba09dca77..fc1d4b146717 100644 > --- a/drivers/nvme/host/core.c > +++ b/drivers/nvme/host/core.c > @@ -2796,6 +2796,9 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) > ctrl->oncs =3D le16_to_cpu(id->oncs); > ctrl->mtfa =3D le16_to_cpu(id->mtfa); > ctrl->oaes =3D le32_to_cpu(id->oaes); > + ctrl->wctemp =3D le16_to_cpu(id->wctemp); > + ctrl->cctemp =3D le16_to_cpu(id->cctemp); > + > atomic_set(&ctrl->abort_limit, id->acl + 1); > ctrl->vwc =3D id->vwc; > if (id->mdts) > @@ -2897,6 +2900,8 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) > > ctrl->identified =3D true; > > + nvme_hwmon_init(ctrl); > + > return 0; > > out_free: > diff --git a/drivers/nvme/host/nvme-hwmon.c b/drivers/nvme/host/nvme-hwmo= n.c > new file mode 100644 > index 000000000000..f19098bc3228 > --- /dev/null > +++ b/drivers/nvme/host/nvme-hwmon.c > @@ -0,0 +1,160 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * NVM Express hardware monitoring support > + * Copyright (c) 2019, Guenter Roeck > + */ > + > +#include > + > +#include "nvme.h" > + > +struct nvme_hwmon_data { > + struct nvme_ctrl *ctrl; > + struct nvme_smart_log log; > +}; > + > +static int nvme_hwmon_get_smart_log(struct nvme_hwmon_data *data) > +{ > + return nvme_get_log(data->ctrl, NVME_NSID_ALL, NVME_LOG_SMART, 0, > + &data->log, sizeof(data->log), 0); > +} > + > +static int nvme_hwmon_read(struct device *dev, enum hwmon_sensor_types t= ype, > + u32 attr, int channel, long *val) > +{ > + struct nvme_hwmon_data *data =3D dev_get_drvdata(dev); > + struct nvme_smart_log *log =3D &data->log; > + int err; > + int temp; > + > + err =3D nvme_hwmon_get_smart_log(data); > + if (err) > + return err < 0 ? err : -EPROTO; > + > + switch (attr) { > + case hwmon_temp_max: > + *val =3D (data->ctrl->wctemp - 273) * 1000; > + break; > + case hwmon_temp_crit: > + *val =3D (data->ctrl->cctemp - 273) * 1000; > + break; > + case hwmon_temp_input: > + if (!channel) > + temp =3D le16_to_cpup((__le16 *)log->temperature)= ; > + else > + temp =3D le16_to_cpu(log->temp_sensor[channel - 1= ]); > + *val =3D (temp - 273) * 1000; > + break; > + case hwmon_temp_crit_alarm: > + *val =3D !!(log->critical_warning & NVME_SMART_CRIT_TEMPE= RATURE); > + break; > + default: > + err =3D -EOPNOTSUPP; > + break; > + } > + return err; > +} > + > +static const char * const nvme_hwmon_sensor_names[] =3D { > + "Composite", > + "Sensor 1", > + "Sensor 2", > + "Sensor 3", > + "Sensor 4", > + "Sensor 5", > + "Sensor 6", > + "Sensor 7", > + "Sensor 8", > +}; > + > +static int nvme_hwmon_read_string(struct device *dev, > + enum hwmon_sensor_types type, u32 attr, > + int channel, const char **str) > +{ > + *str =3D nvme_hwmon_sensor_names[channel]; > + return 0; > +} > + > +static umode_t nvme_hwmon_is_visible(const void *_data, > + enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + const struct nvme_hwmon_data *data =3D _data; > + > + switch (attr) { > + case hwmon_temp_crit: > + if (!channel && data->ctrl->cctemp) > + return 0444; > + break; > + case hwmon_temp_max: > + if (!channel && data->ctrl->wctemp) > + return 0444; > + break; > + case hwmon_temp_crit_alarm: > + if (!channel) > + return 0444; > + break; > + case hwmon_temp_input: > + case hwmon_temp_label: > + if (!channel || data->log.temp_sensor[channel - 1]) > + return 0444; > + break; > + default: > + break; > + } > + return 0; > +} > + > +static const struct hwmon_channel_info *nvme_hwmon_info[] =3D { > + HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ), > + HWMON_CHANNEL_INFO(temp, > + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT | > + HWMON_T_LABEL | HWMON_T_CRIT_ALARM, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL, > + HWMON_T_INPUT | HWMON_T_LABEL), > + NULL > +}; > + > +static const struct hwmon_ops nvme_hwmon_ops =3D { > + .is_visible =3D nvme_hwmon_is_visible, > + .read =3D nvme_hwmon_read, > + .read_string =3D nvme_hwmon_read_string, > +}; > + > +static const struct hwmon_chip_info nvme_hwmon_chip_info =3D { > + .ops =3D &nvme_hwmon_ops, > + .info =3D nvme_hwmon_info, > +}; > + > +void nvme_hwmon_init(struct nvme_ctrl *ctrl) > +{ > + struct device *dev =3D ctrl->device; > + struct nvme_hwmon_data *data; > + struct device *hwmon; > + int err; > + > + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); > + if (!data) > + return; > + > + data->ctrl =3D ctrl; > + > + err =3D nvme_hwmon_get_smart_log(data); > + if (err) { > + dev_warn(dev, "Failed to read smart log (error %d)\n", er= r); > + return; > + } > + > + hwmon =3D devm_hwmon_device_register_with_info(dev, dev_name(dev)= , > + data, > + &nvme_hwmon_chip_inf= o, > + NULL); > + if (IS_ERR(hwmon)) > + dev_warn(dev, "Failed to instantiate hwmon device\n"); > +} > diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h > index 22e8401352c2..e6460c1216bc 100644 > --- a/drivers/nvme/host/nvme.h > +++ b/drivers/nvme/host/nvme.h > @@ -231,6 +231,8 @@ struct nvme_ctrl { > u16 kas; > u8 npss; > u8 apsta; > + u16 wctemp; > + u16 cctemp; > u32 oaes; > u32 aen_result; > u32 ctratt; > @@ -652,4 +654,10 @@ static inline struct nvme_ns *nvme_get_ns_from_dev(s= truct device *dev) > return dev_to_disk(dev)->private_data; > } > > +#if IS_ENABLED(CONFIG_NVME_HWMON) > +void nvme_hwmon_init(struct nvme_ctrl *ctrl); > +#else > +static inline void nvme_hwmon_init(struct nvme_ctrl *ctrl) { } > +#endif > + > #endif /* _NVME_H */ > -- > 2.17.1 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.7 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 70770CA9EC0 for ; Mon, 28 Oct 2019 18:01:27 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.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 4974E20862 for ; Mon, 28 Oct 2019 18:01:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="b326OcnO"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="V49twJFB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4974E20862 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=seNb1vxsI6psSM2ccYu+5PfLhCfY9e8a1nbzoBOQ7Ys=; b=b326OcnOqz+73H A4IzXAdQ4ddNFeTQ/pUmf5BkKBScQwD4YTEist1XXx1eTR4krb9cQExXdPFU3A1Rm3q3NLHNjPYjY 353mPVaV8s1b6fGOemMhMTrhivOvzRQOOAVaNYmEV9QDpjrRsgC3M4auJsz7x+EnbFS/ptFgCEBAc lNsfhld67iIwnQ8mMCcAQ43JGPBcTOFpCauB9xm1Tie8b1RVEwJ7pnFcHhulvUAWddw3YvcJwVi1v gejashs9+RpwcEm2nNuScqRHom0qXhVn3MTTeTynZQwCfRi7y+laeEe1xLyAwoCAJHafsVGByuvbq n/oFgtEabZffmiFYGavA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iP9KT-0001La-3O; Mon, 28 Oct 2019 18:01:21 +0000 Received: from mail-wr1-x441.google.com ([2a00:1450:4864:20::441]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iP9KP-0001L1-K3 for linux-nvme@lists.infradead.org; Mon, 28 Oct 2019 18:01:19 +0000 Received: by mail-wr1-x441.google.com with SMTP id v9so10893491wrq.5 for ; Mon, 28 Oct 2019 11:01:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=jduO3+nmeKK9VS1s8WbIrvAU7M7GfnDKYTuy7uL3lUk=; b=V49twJFBnv8vhyt1xGKbHgkEMxw/QmzBWMVQxqa8ndFePF1i4p6i1Jfh+Wm51qxxjT A2pFiKu4QAZlTUF+VhSBJktYwoKAglOebImWS3d9LIRmEBPxakf600WFrk81zBnmZOfc KqpQCGwEBzU/zKPHyTiOP+paHBqhzcfBEkZ2hx82xIxjkRptjQ/KVTGkYRVgLeIy7I2b s4ffI+Z9GLwb4Z7RZYYyFvIWqQb4TKbqW7GiXegoH3sNIlBeBNrFVue1zNS4Wrh2HCb4 ZVcMsMa0bgF/A3EL8TH9XbcmBcm4k2/4rcgSN4cc+0WRDyHJaDkKTGflpHuRMwM2xwip xxtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=jduO3+nmeKK9VS1s8WbIrvAU7M7GfnDKYTuy7uL3lUk=; b=PYQAhWaGhuDFeB4JkSKi7uyOD+0zrIkFlQUfGwUgB8OC8acPPM014lX5b/Tp6GDEU/ 7iZhQAjHIJPt5oYKtEi8sMzJZqHYd8f4h1xau9jI2cg4mQHQmw2IKjC6FUJVHvVHIu3/ InUlC87sWZxi7/Nu7uVBBD8QkInRflrpnFycSdrcsaKcKXAK/PHfwmjft+s885AICdiK C9kRQWZ6fcwCxtYKfwom3972XqzAYo1DzriOUQImtStU7xBSxUa+byss4k+wZNVgxWeu u8Sq/HD+Z/HmM9XXxfg0JkB08kXb6OL+NYfedV5NRXonryOMKvL6fTbn/PF7tTswhnWy pETA== X-Gm-Message-State: APjAAAXMMbfFZbseeHquHrfL8SdCyuIHSoB66b2LC978KlZFNz8Ndhyl 5Ds/8uE8sky21BLzN0XzHRgCbGbTBPR8A/rM6Qs= X-Google-Smtp-Source: APXvYqzoAdGTSHSTU9eyo8LQOBqa6heDODvIKG2DLAH+ujy7LtazhawvcWzU5HbRuAOr79Iu1oSlrWXXkm2MzpNIx/A= X-Received: by 2002:a5d:444b:: with SMTP id x11mr16184711wrr.207.1572285675441; Mon, 28 Oct 2019 11:01:15 -0700 (PDT) MIME-Version: 1.0 References: <20191028024156.23964-1-linux@roeck-us.net> In-Reply-To: <20191028024156.23964-1-linux@roeck-us.net> From: Andrey Smirnov Date: Mon, 28 Oct 2019 11:01:03 -0700 Message-ID: Subject: Re: [PATCH] nvme: Add hardware monitoring support To: Guenter Roeck X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191028_110117_661409_ACFCF4A3 X-CRM114-Status: GOOD ( 27.51 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sagi Grimberg , linux-kernel , linux-nvme@lists.infradead.org, Jens Axboe , Chris Healy , Keith Busch , Christoph Hellwig Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org T24gTW9uLCBPY3QgMjgsIDIwMTkgYXQgNzowNCBBTSBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vj ay11cy5uZXQ+IHdyb3RlOgo+Cj4gbnZtZSBkZXZpY2VzIHJlcG9ydCB0ZW1wZXJhdHVyZSBpbmZv cm1hdGlvbiBpbiB0aGUgY29udHJvbGxlciBpbmZvcm1hdGlvbgo+IChmb3IgbGltaXRzKSBhbmQg aW4gdGhlIHNtYXJ0IGxvZy4gQ3VycmVudGx5LCB0aGUgb25seSBtZWFucyB0byByZXRyaWV2ZQo+ IHRoaXMgaW5mb3JtYXRpb24gaXMgdGhlIG52bWUgY29tbWFuZCBsaW5lIGludGVyZmFjZSwgd2hp Y2ggcmVxdWlyZXMKPiBzdXBlci11c2VyIHByaXZpbGVnZXMuCj4KPiBBdCB0aGUgc2FtZSB0aW1l LCBpdCB3b3VsZCBiZSBkZXNpcmFibGUgdG8gdXNlIE5WTUUgdGVtcGVyYXR1cmUgaW5mb3JtYXRp b24KPiBmb3IgdGhlcm1hbCBjb250cm9sLgo+Cj4gVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgdG8g cmVhZCBOVk1FIHRlbXBlcmF0dXJlcyBmcm9tIHRoZSBrZXJuZWwgdXNpbmcgdGhlCj4gaHdtb24g QVBJIGFuZCBhZGRzIHRlbXBlcmF0dXJlIHpvbmVzIGZvciBOVk1FIGRyaXZlcy4gVGhlIHRoZXJt YWwgc3Vic3lzdGVtCj4gY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIHNldCB0aGVybWFsIHBv bGljaWVzLCBhbmQgdXNlcnNwYWNlIGNhbiBhY2Nlc3MKPiBpdCB1c2luZyBsaWJzZW5zb3JzIGFu ZC9vciB0aGUgInNlbnNvcnMiIGNvbW1hbmQuCj4KPiBFeGFtcGxlIG91dHB1dCBmcm9tIHRoZSAi c2Vuc29ycyIgY29tbWFuZDoKPgo+IG52bWUwLXBjaS0wMTAwCj4gQWRhcHRlcjogUENJIGFkYXB0 ZXIKPiBDb21wb3NpdGU6ICAgICszOS4wwrBDICAoaGlnaCA9ICs4NS4wwrBDLCBjcml0ID0gKzg1 LjDCsEMpCj4gU2Vuc29yIDE6ICAgICArMzkuMMKwQwo+IFNlbnNvciAyOiAgICAgKzQxLjDCsEMK PgoKVHJpZWQgdGhpcyBvbiBaSUkgaS5NWDhNUSBVbHRyYSBaZXN0IEJvYXJkIHdpdGggTlZNZSBk ZXZpY2UgYXR0YWNoZWQuClNlZW1zIHRvIHdvcmsgYXMgYWR2ZXJ0aXNlZCwgc286CgpUZXN0ZWQt Ynk6IEFuZHJleSBTbWlybm92IDxhbmRyZXcuc21pcm5vdkBnbWFpbC5jb20+Cgo+IFNpZ25lZC1v ZmYtYnk6IEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KPiAtLS0KPiAgZHJpdmVy cy9udm1lL2hvc3QvS2NvbmZpZyAgICAgIHwgIDEwICsrKwo+ICBkcml2ZXJzL252bWUvaG9zdC9N YWtlZmlsZSAgICAgfCAgIDEgKwo+ICBkcml2ZXJzL252bWUvaG9zdC9jb3JlLmMgICAgICAgfCAg IDUgKysKPiAgZHJpdmVycy9udm1lL2hvc3QvbnZtZS1od21vbi5jIHwgMTYwICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL252bWUvaG9zdC9udm1lLmggICAgICAg fCAgIDggKysKPiAgNSBmaWxlcyBjaGFuZ2VkLCAxODQgaW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9udm1lL2hvc3QvbnZtZS1od21vbi5jCj4KPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcK PiBpbmRleCAyYjM2ZjA1MmJmYjkuLmFlYjQ5ZTE2ZTM4NiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L252bWUvaG9zdC9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZwo+IEBA IC0yMyw2ICsyMywxNiBAQCBjb25maWcgTlZNRV9NVUxUSVBBVEgKPiAgICAgICAgICAgIC9kZXYv bnZtZVhuWSBkZXZpY2Ugd2lsbCBzaG93IHVwIGZvciBlYWNoIE5WTWUgbmFtZXNwYWNlcywKPiAg ICAgICAgICAgIGV2ZW4gaWYgaXQgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIG11bHRpcGxlIGNvbnRy b2xsZXJzLgo+Cj4gK2NvbmZpZyBOVk1FX0hXTU9OCj4gKyAgICAgICBib29sICJOVk1FIGhhcmR3 YXJlIG1vbml0b3JpbmciCj4gKyAgICAgICBkZXBlbmRzIG9uIChOVk1FX0NPUkU9eSAmJiBIV01P Tj15KSB8fCAoTlZNRV9DT1JFPW0gJiYgSFdNT04pCj4gKyAgICAgICBoZWxwCj4gKyAgICAgICAg IFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgTlZNRSBoYXJkd2FyZSBtb25pdG9yaW5nLiBJZiBl bmFibGVkLAo+ICsgICAgICAgICBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlIHdpbGwgYmUg Y3JlYXRlZCBmb3IgZWFjaCBOVk1FIGRyaXZlCj4gKyAgICAgICAgIGluIHRoZSBzeXN0ZW0uCj4g Kwo+ICsgICAgICAgICBJZiB1bnN1cmUsIHNheSBOLgo+ICsKPiAgY29uZmlnIE5WTUVfRkFCUklD Uwo+ICAgICAgICAgdHJpc3RhdGUKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9N YWtlZmlsZSBiL2RyaXZlcnMvbnZtZS9ob3N0L01ha2VmaWxlCj4gaW5kZXggOGE0YjY3MWM1ZjBj Li4wM2RlNDc5N2E4NzcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvTWFrZWZpbGUK PiArKysgYi9kcml2ZXJzL252bWUvaG9zdC9NYWtlZmlsZQo+IEBAIC0xNCw2ICsxNCw3IEBAIG52 bWUtY29yZS0kKENPTkZJR19UUkFDSU5HKSAgICAgICAgICAgKz0gdHJhY2Uubwo+ICBudm1lLWNv cmUtJChDT05GSUdfTlZNRV9NVUxUSVBBVEgpICAgICArPSBtdWx0aXBhdGgubwo+ICBudm1lLWNv cmUtJChDT05GSUdfTlZNKSAgICAgICAgICAgICAgICAgICAgICAgICs9IGxpZ2h0bnZtLm8KPiAg bnZtZS1jb3JlLSQoQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUykgICArPSBmYXVsdF9p bmplY3Qubwo+ICtudm1lLWNvcmUtJChDT05GSUdfTlZNRV9IV01PTikgICAgICAgICArPSBudm1l LWh3bW9uLm8KPgo+ICBudm1lLXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBw Y2kubwo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYyBiL2RyaXZlcnMv bnZtZS9ob3N0L2NvcmUuYwo+IGluZGV4IGZhN2JhMDlkY2E3Ny4uZmMxZDRiMTQ2NzE3IDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYwo+ICsrKyBiL2RyaXZlcnMvbnZtZS9o b3N0L2NvcmUuYwo+IEBAIC0yNzk2LDYgKzI3OTYsOSBAQCBpbnQgbnZtZV9pbml0X2lkZW50aWZ5 KHN0cnVjdCBudm1lX2N0cmwgKmN0cmwpCj4gICAgICAgICBjdHJsLT5vbmNzID0gbGUxNl90b19j cHUoaWQtPm9uY3MpOwo+ICAgICAgICAgY3RybC0+bXRmYSA9IGxlMTZfdG9fY3B1KGlkLT5tdGZh KTsKPiAgICAgICAgIGN0cmwtPm9hZXMgPSBsZTMyX3RvX2NwdShpZC0+b2Flcyk7Cj4gKyAgICAg ICBjdHJsLT53Y3RlbXAgPSBsZTE2X3RvX2NwdShpZC0+d2N0ZW1wKTsKPiArICAgICAgIGN0cmwt PmNjdGVtcCA9IGxlMTZfdG9fY3B1KGlkLT5jY3RlbXApOwo+ICsKPiAgICAgICAgIGF0b21pY19z ZXQoJmN0cmwtPmFib3J0X2xpbWl0LCBpZC0+YWNsICsgMSk7Cj4gICAgICAgICBjdHJsLT52d2Mg PSBpZC0+dndjOwo+ICAgICAgICAgaWYgKGlkLT5tZHRzKQo+IEBAIC0yODk3LDYgKzI5MDAsOCBA QCBpbnQgbnZtZV9pbml0X2lkZW50aWZ5KHN0cnVjdCBudm1lX2N0cmwgKmN0cmwpCj4KPiAgICAg ICAgIGN0cmwtPmlkZW50aWZpZWQgPSB0cnVlOwo+Cj4gKyAgICAgICBudm1lX2h3bW9uX2luaXQo Y3RybCk7Cj4gKwo+ICAgICAgICAgcmV0dXJuIDA7Cj4KPiAgb3V0X2ZyZWU6Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbnZtZS9ob3N0L252bWUtaHdtb24uYyBiL2RyaXZlcnMvbnZtZS9ob3N0L252 bWUtaHdtb24uYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi5m MTkwOThiYzMyMjgKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9udm1lL2hvc3QvbnZt ZS1od21vbi5jCj4gQEAgLTAsMCArMSwxNjAgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAKPiArLyoKPiArICogTlZNIEV4cHJlc3MgaGFyZHdhcmUgbW9uaXRvcmluZyBz dXBwb3J0Cj4gKyAqIENvcHlyaWdodCAoYykgMjAxOSwgR3VlbnRlciBSb2Vjawo+ICsgKi8KPiAr Cj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgo+ICsKPiArI2luY2x1ZGUgIm52bWUuaCIKPiAr Cj4gK3N0cnVjdCBudm1lX2h3bW9uX2RhdGEgewo+ICsgICAgICAgc3RydWN0IG52bWVfY3RybCAq Y3RybDsKPiArICAgICAgIHN0cnVjdCBudm1lX3NtYXJ0X2xvZyBsb2c7Cj4gK307Cj4gKwo+ICtz dGF0aWMgaW50IG52bWVfaHdtb25fZ2V0X3NtYXJ0X2xvZyhzdHJ1Y3QgbnZtZV9od21vbl9kYXRh ICpkYXRhKQo+ICt7Cj4gKyAgICAgICByZXR1cm4gbnZtZV9nZXRfbG9nKGRhdGEtPmN0cmwsIE5W TUVfTlNJRF9BTEwsIE5WTUVfTE9HX1NNQVJULCAwLAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAmZGF0YS0+bG9nLCBzaXplb2YoZGF0YS0+bG9nKSwgMCk7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgbnZtZV9od21vbl9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5z b3JfdHlwZXMgdHlwZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgYXR0ciwgaW50 IGNoYW5uZWwsIGxvbmcgKnZhbCkKPiArewo+ICsgICAgICAgc3RydWN0IG52bWVfaHdtb25fZGF0 YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsgICAgICAgc3RydWN0IG52bWVfc21h cnRfbG9nICpsb2cgPSAmZGF0YS0+bG9nOwo+ICsgICAgICAgaW50IGVycjsKPiArICAgICAgIGlu dCB0ZW1wOwo+ICsKPiArICAgICAgIGVyciA9IG52bWVfaHdtb25fZ2V0X3NtYXJ0X2xvZyhkYXRh KTsKPiArICAgICAgIGlmIChlcnIpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBlcnIgPCAwID8g ZXJyIDogLUVQUk9UTzsKPiArCj4gKyAgICAgICBzd2l0Y2ggKGF0dHIpIHsKPiArICAgICAgIGNh c2UgaHdtb25fdGVtcF9tYXg6Cj4gKyAgICAgICAgICAgICAgICp2YWwgPSAoZGF0YS0+Y3RybC0+ d2N0ZW1wIC0gMjczKSAqIDEwMDA7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAg Y2FzZSBod21vbl90ZW1wX2NyaXQ6Cj4gKyAgICAgICAgICAgICAgICp2YWwgPSAoZGF0YS0+Y3Ry bC0+Y2N0ZW1wIC0gMjczKSAqIDEwMDA7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAg ICAgY2FzZSBod21vbl90ZW1wX2lucHV0Ogo+ICsgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWwp Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICop bG9nLT50ZW1wZXJhdHVyZSk7Cj4gKyAgICAgICAgICAgICAgIGVsc2UKPiArICAgICAgICAgICAg ICAgICAgICAgICB0ZW1wID0gbGUxNl90b19jcHUobG9nLT50ZW1wX3NlbnNvcltjaGFubmVsIC0g MV0pOwo+ICsgICAgICAgICAgICAgICAqdmFsID0gKHRlbXAgLSAyNzMpICogMTAwMDsKPiArICAg ICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToK PiArICAgICAgICAgICAgICAgKnZhbCA9ICEhKGxvZy0+Y3JpdGljYWxfd2FybmluZyAmIE5WTUVf U01BUlRfQ1JJVF9URU1QRVJBVFVSRSk7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAg ICAgZGVmYXVsdDoKPiArICAgICAgICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7Cj4gKyAgICAg ICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgfQo+ICsgICAgICAgcmV0dXJuIGVycjsKPiArfQo+ ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBudm1lX2h3bW9uX3NlbnNvcl9uYW1lc1td ID0gewo+ICsgICAgICAgIkNvbXBvc2l0ZSIsCj4gKyAgICAgICAiU2Vuc29yIDEiLAo+ICsgICAg ICAgIlNlbnNvciAyIiwKPiArICAgICAgICJTZW5zb3IgMyIsCj4gKyAgICAgICAiU2Vuc29yIDQi LAo+ICsgICAgICAgIlNlbnNvciA1IiwKPiArICAgICAgICJTZW5zb3IgNiIsCj4gKyAgICAgICAi U2Vuc29yIDciLAo+ICsgICAgICAgIlNlbnNvciA4IiwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQg bnZtZV9od21vbl9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsIHUzMiBh dHRyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgY29u c3QgY2hhciAqKnN0cikKPiArewo+ICsgICAgICAgKnN0ciA9IG52bWVfaHdtb25fc2Vuc29yX25h bWVzW2NoYW5uZWxdOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1bW9k ZV90IG52bWVfaHdtb25faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGF0dHIsIGludCBjaGFu bmVsKQo+ICt7Cj4gKyAgICAgICBjb25zdCBzdHJ1Y3QgbnZtZV9od21vbl9kYXRhICpkYXRhID0g X2RhdGE7Cj4gKwo+ICsgICAgICAgc3dpdGNoIChhdHRyKSB7Cj4gKyAgICAgICBjYXNlIGh3bW9u X3RlbXBfY3JpdDoKPiArICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsICYmIGRhdGEtPmN0cmwt PmNjdGVtcCkKPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDQ0NDsKPiArICAgICAg ICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIGh3bW9uX3RlbXBfbWF4Ogo+ICsgICAgICAg ICAgICAgICBpZiAoIWNoYW5uZWwgJiYgZGF0YS0+Y3RybC0+d2N0ZW1wKQo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiAwNDQ0Owo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAg ICAgIGNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgo+ICsgICAgICAgICAgICAgICBpZiAoIWNo YW5uZWwpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA0NDQ7Cj4gKyAgICAgICAg ICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSBod21vbl90ZW1wX2lucHV0Ogo+ICsgICAgICAg Y2FzZSBod21vbl90ZW1wX2xhYmVsOgo+ICsgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWwgfHwg ZGF0YS0+bG9nLnRlbXBfc2Vuc29yW2NoYW5uZWwgLSAxXSkKPiArICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gMDQ0NDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBkZWZh dWx0Ogo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIH0KPiArICAgICAgIHJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAq bnZtZV9od21vbl9pbmZvW10gPSB7Cj4gKyAgICAgICBIV01PTl9DSEFOTkVMX0lORk8oY2hpcCwg SFdNT05fQ19SRUdJU1RFUl9UWiksCj4gKyAgICAgICBIV01PTl9DSEFOTkVMX0lORk8odGVtcCwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVgg fCBIV01PTl9UX0NSSVQgfAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdNT05f VF9MQUJFTCB8IEhXTU9OX1RfQ1JJVF9BTEFSTSwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCksCj4g KyAgICAgICBOVUxMCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBu dm1lX2h3bW9uX29wcyA9IHsKPiArICAgICAgIC5pc192aXNpYmxlID0gbnZtZV9od21vbl9pc192 aXNpYmxlLAo+ICsgICAgICAgLnJlYWQgPSBudm1lX2h3bW9uX3JlYWQsCj4gKyAgICAgICAucmVh ZF9zdHJpbmcgPSBudm1lX2h3bW9uX3JlYWRfc3RyaW5nLAo+ICt9Owo+ICsKPiArc3RhdGljIGNv bnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbnZtZV9od21vbl9jaGlwX2luZm8gPSB7Cj4gKyAg ICAgICAub3BzID0gJm52bWVfaHdtb25fb3BzLAo+ICsgICAgICAgLmluZm8gPSBudm1lX2h3bW9u X2luZm8sCj4gK307Cj4gKwo+ICt2b2lkIG52bWVfaHdtb25faW5pdChzdHJ1Y3QgbnZtZV9jdHJs ICpjdHJsKQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjdHJsLT5kZXZpY2U7 Cj4gKyAgICAgICBzdHJ1Y3QgbnZtZV9od21vbl9kYXRhICpkYXRhOwo+ICsgICAgICAgc3RydWN0 IGRldmljZSAqaHdtb247Cj4gKyAgICAgICBpbnQgZXJyOwo+ICsKPiArICAgICAgIGRhdGEgPSBk ZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKPiArICAgICAgIGlm ICghZGF0YSkKPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsKPiArICAgICAgIGRhdGEtPmN0 cmwgPSBjdHJsOwo+ICsKPiArICAgICAgIGVyciA9IG52bWVfaHdtb25fZ2V0X3NtYXJ0X2xvZyhk YXRhKTsKPiArICAgICAgIGlmIChlcnIpIHsKPiArICAgICAgICAgICAgICAgZGV2X3dhcm4oZGV2 LCAiRmFpbGVkIHRvIHJlYWQgc21hcnQgbG9nIChlcnJvciAlZClcbiIsIGVycik7Cj4gKyAgICAg ICAgICAgICAgIHJldHVybjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBod21vbiA9IGRldm1f aHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGRldl9uYW1lKGRldiksCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm52 bWVfaHdtb25fY2hpcF9pbmZvLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTlVMTCk7Cj4gKyAgICAgICBpZiAoSVNfRVJSKGh3bW9uKSkKPiAr ICAgICAgICAgICAgICAgZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGh3bW9u IGRldmljZVxuIik7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvbnZtZS5o IGIvZHJpdmVycy9udm1lL2hvc3QvbnZtZS5oCj4gaW5kZXggMjJlODQwMTM1MmMyLi5lNjQ2MGMx MjE2YmMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvbnZtZS5oCj4gKysrIGIvZHJp dmVycy9udm1lL2hvc3QvbnZtZS5oCj4gQEAgLTIzMSw2ICsyMzEsOCBAQCBzdHJ1Y3QgbnZtZV9j dHJsIHsKPiAgICAgICAgIHUxNiBrYXM7Cj4gICAgICAgICB1OCBucHNzOwo+ICAgICAgICAgdTgg YXBzdGE7Cj4gKyAgICAgICB1MTYgd2N0ZW1wOwo+ICsgICAgICAgdTE2IGNjdGVtcDsKPiAgICAg ICAgIHUzMiBvYWVzOwo+ICAgICAgICAgdTMyIGFlbl9yZXN1bHQ7Cj4gICAgICAgICB1MzIgY3Ry YXR0Owo+IEBAIC02NTIsNCArNjU0LDEwIEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IG52bWVfbnMg Km52bWVfZ2V0X25zX2Zyb21fZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKPiAgICAgICAgIHJldHVy biBkZXZfdG9fZGlzayhkZXYpLT5wcml2YXRlX2RhdGE7Cj4gIH0KPgo+ICsjaWYgSVNfRU5BQkxF RChDT05GSUdfTlZNRV9IV01PTikKPiArdm9pZCBudm1lX2h3bW9uX2luaXQoc3RydWN0IG52bWVf Y3RybCAqY3RybCk7Cj4gKyNlbHNlCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBudm1lX2h3bW9uX2lu aXQoc3RydWN0IG52bWVfY3RybCAqY3RybCkgeyB9Cj4gKyNlbmRpZgo+ICsKPiAgI2VuZGlmIC8q IF9OVk1FX0ggKi8KPiAtLQo+IDIuMTcuMQo+CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpMaW51eC1udm1lIG1haWxpbmcgbGlzdApMaW51eC1udm1lQGxp c3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0 aW5mby9saW51eC1udm1lCg==