From mboxrd@z Thu Jan 1 00:00:00 1970 From: Billy Tsai Date: Mon, 6 Dec 2021 05:27:43 +0000 Subject: [PATCH v4 05/13] peci: Add peci-aspeed controller driver In-Reply-To: <20211123140706.2945700-6-iwona.winiarska@intel.com> References: <20211123140706.2945700-1-iwona.winiarska@intel.com> <20211123140706.2945700-6-iwona.winiarska@intel.com> Message-ID: <71D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com> List-Id: To: linux-aspeed@lists.ozlabs.org MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, After reviewing the patch, I have some suggestions for you. Please see the reply inline. On 2021/11/23, 10:11 PM, "openbmc on behalf of Iwona Winiarska" wrote: > From: Jae Hyun Yoo Add the define for the bus frequency #define ASPEED_PECI_BUS_FREQUENCY_MIN 2000 #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT 2000 #define ASPEED_PECI_BUS_FREQUENCY_MAX 1000000 > +struct aspeed_peci { > + struct peci_controller *controller; > + struct device *dev; > + void __iomem *base; > + struct clk *clk; > + struct reset_control *rst; > + int irq; > + spinlock_t lock; /* to sync completion status handling */ > + struct completion xfer_complete; > + u32 status; > + u32 cmd_timeout_ms; > + u32 msg_timing; > + u32 addr_timing; > + u32 rd_sampling_point; > + u32 clk_div; Add the paremeter to store the bus_freq from the dts property u32 bus_freq; > +}; > + > +static void aspeed_peci_init_regs(struct aspeed_peci *priv) > +{ > + u32 val; > + > + val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, ASPEED_PECI_CLK_DIV_DEFAULT); > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; > + writel(val, priv->base + ASPEED_PECI_CTRL); > + /* > + * Timing negotiation period setting. > + * The unit of the programmed value is 4 times of PECI clock period. > + */ > + val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv->msg_timing); > + val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv->addr_timing); > + writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); > + > + /* Clear interrupts */ > + val = readl(priv->base + ASPEED_PECI_INT_STS) | ASPEED_PECI_INT_MASK; > + writel(val, priv->base + ASPEED_PECI_INT_STS); > + > + /* Set timing negotiation mode and enable interrupts */ > + val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO); > + val |= ASPEED_PECI_INT_MASK; > + writel(val, priv->base + ASPEED_PECI_INT_CTRL); > + > + val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv->rd_sampling_point); > + val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv->clk_div); > + val |= ASPEED_PECI_CTRL_PECI_EN; > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; > + writel(val, priv->base + ASPEED_PECI_CTRL); > +} > + > +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) > +{ > + u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); > + > + if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == ASPEED_PECI_CMD_STS_ADDR_T_NEGO) > + aspeed_peci_init_regs(priv); As long as the state is not idle, the controller need to reinitialize the PECI register for solving the PECI controller hang. Before ast2600A3, the controller should assert/de-assert the reset for solving the hang issue. For backward compatible, I suggest to add the reset assert/de-assert in this place. if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { reset_control_assert(priv->rst); reset_control_deassert(priv->rst); aspeed_peci_init_regs(priv); } > + return readl_poll_timeout(priv->base + ASPEED_PECI_CMD, > + cmd_sts, > + !(cmd_sts & ASPEED_PECI_CMD_IDLE_MASK), > + ASPEED_PECI_IDLE_CHECK_INTERVAL_US, > + ASPEED_PECI_IDLE_CHECK_TIMEOUT_US); > +} > + > +static int aspeed_peci_xfer(struct peci_controller *controller, > + u8 addr, struct peci_request *req) > +{ > + struct aspeed_peci *priv = dev_get_drvdata(controller->dev.parent); > + unsigned long timeout = msecs_to_jiffies(priv->cmd_timeout_ms); > + u32 peci_head; > + int ret; > + > + if (req->tx.len > ASPEED_PECI_DATA_BUF_SIZE_MAX || > + req->rx.len > ASPEED_PECI_DATA_BUF_SIZE_MAX) > + return -EINVAL; > + > + /* Check command sts and bus idle state */ > + ret = aspeed_peci_check_idle(priv); > + if (ret) > + return ret; /* -ETIMEDOUT */ > + > + spin_lock_irq(&priv->lock); > + reinit_completion(&priv->xfer_complete); > + > + peci_head = FIELD_PREP(ASPEED_PECI_TARGET_ADDR_MASK, addr) | > + FIELD_PREP(ASPEED_PECI_WR_LEN_MASK, req->tx.len) | > + FIELD_PREP(ASPEED_PECI_RD_LEN_MASK, req->rx.len); > + > + writel(peci_head, priv->base + ASPEED_PECI_RW_LENGTH); > + > + memcpy_toio(priv->base + ASPEED_PECI_WR_DATA0, req->tx.buf, min_t(u8, req->tx.len, 16)); > + if (req->tx.len > 16) > + memcpy_toio(priv->base + ASPEED_PECI_WR_DATA4, req->tx.buf + 16, > + req->tx.len - 16); > + > +#if IS_ENABLED(CONFIG_DYNAMIC_DEBUG) > + dev_dbg(priv->dev, "HEAD : %#08x\n", peci_head); > + print_hex_dump_bytes("TX : ", DUMP_PREFIX_NONE, req->tx.buf, req->tx.len); > +#endif > + priv->status = 0; > + writel(ASPEED_PECI_CMD_FIRE, priv->base + ASPEED_PECI_CMD); > + spin_unlock_irq(&priv->lock); > + > + ret = wait_for_completion_interruptible_timeout(&priv->xfer_complete, timeout); > + if (ret < 0) > + return ret; > + > + if (ret == 0) { > + dev_dbg(priv->dev, "Timeout waiting for a response!\n"); dev_err? > + return -ETIMEDOUT; > + } > + > + spin_lock_irq(&priv->lock); > + > + if (priv->status != ASPEED_PECI_INT_CMD_DONE) { > + spin_unlock_irq(&priv->lock); > + dev_dbg(priv->dev, "No valid response, status: %#02x\n", priv->status); dev_err? > + return -EIO; > + } > + > + spin_unlock_irq(&priv->lock); > + > + memcpy_fromio(req->rx.buf, priv->base + ASPEED_PECI_RD_DATA0, min_t(u8, req->rx.len, 16)); > + if (req->rx.len > 16) > + memcpy_fromio(req->rx.buf + 16, priv->base + ASPEED_PECI_RD_DATA4, > + req->rx.len - 16); > + > +#if IS_ENABLED(CONFIG_DYNAMIC_DEBUG) > + print_hex_dump_bytes("RX : ", DUMP_PREFIX_NONE, req->rx.buf, req->rx.len); > +#endif > + return 0; > +} > + > +static irqreturn_t aspeed_peci_irq_handler(int irq, void *arg) > +{ > + struct aspeed_peci *priv = arg; > + u32 status; > + > + spin_lock(&priv->lock); > + status = readl(priv->base + ASPEED_PECI_INT_STS); > + writel(status, priv->base + ASPEED_PECI_INT_STS); > + priv->status |= (status & ASPEED_PECI_INT_MASK); > + > + /* > + * All commands should be ended up with a ASPEED_PECI_INT_CMD_DONE bit > + * set even in an error case. > + */ > + if (status & ASPEED_PECI_INT_CMD_DONE) > + complete(&priv->xfer_complete); > + > + writel(0, priv->base + ASPEED_PECI_CMD); > + > + spin_unlock(&priv->lock); > + > + return IRQ_HANDLED; > +} > + > +static void aspeed_peci_property_sanitize(struct device *dev, const char *propname, > + u32 min, u32 max, u32 default_val, u32 *propval) > +{ > + u32 val; > + int ret; > + > + ret = device_property_read_u32(dev, propname, &val); > + if (ret) { > + val = default_val; > + } else if (val > max || val < min) { > + dev_warn(dev, "Invalid %s: %u, falling back to: %u\n", > + propname, val, default_val); > + > + val = default_val; > + } > + > + *propval = val; > +} > + > +static void aspeed_peci_property_setup(struct aspeed_peci *priv) > +{ > + aspeed_peci_property_sanitize(priv->dev, "aspeed,clock-divider", > + 0, ASPEED_PECI_CLK_DIV_MAX, > + ASPEED_PECI_CLK_DIV_DEFAULT, &priv->clk_div); > + aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", > + 0, ASPEED_PECI_MSG_TIMING_MAX, > + ASPEED_PECI_MSG_TIMING_DEFAULT, &priv->msg_timing); > + aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", > + 0, ASPEED_PECI_ADDR_TIMING_MAX, > + ASPEED_PECI_ADDR_TIMING_DEFAULT, &priv->addr_timing); Use the bus-frequency to replace the property above: aspeed_peci_property_sanitize(priv->dev, "bus-frequency", ASPEED_PECI_BUS_FREQUENCY_MIN, ASPEED_PECI_BUS_FREQUENCY_MAX, ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv->bus_freq); > + aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling-point", > + 0, ASPEED_PECI_RD_SAMPLING_POINT_MAX, > + ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT, > + &priv->rd_sampling_point); > + aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", > + 1, ASPEED_PECI_CMD_TIMEOUT_MS_MAX, > + ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms); > +} Add the function of automatically calculating the settings to adapt to the bus frequency. static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) { unsigned long src_clk_rate; int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; u32 msg_timing, clk_div; src_clk_rate = clk_get_rate(priv->clk); /* * PECI bus freq = (source clk rate) / (4 * (PECI04[15:8]*4+1) * (1 << PECI00[10:8])) * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk rate) / (4 * PECI bus freq ) */ clk_divisor = src_clk_rate / (4 * priv->bus_freq); delta_value = clk_divisor; /* Find the closest divisor for bus-frequency */ for (msg_timing = 1; msg_timing <= 255; msg_timing++) for (clk_div = 0; clk_div < 7; clk_div++) { clk_divisor_tmp = (1 << clk_div) * (msg_timing * 4 + 1); delta_tmp = abs(clk_divisor - clk_divisor_tmp); if (delta_tmp < delta_value) { delta_value = delta_tmp; priv->msg_timing = msg_timing; priv->addr_timing = priv->msg_timing; priv->clk_div = clk_div; } } } > + > +static struct peci_controller_ops aspeed_ops = { > + .xfer = aspeed_peci_xfer, > +}; > + > +static void aspeed_peci_reset_control_release(void *data) > +{ > + reset_control_assert(data); > +} > + > +static int devm_aspeed_peci_reset_control_deassert(struct device *dev, struct reset_control *rst) > +{ > + int ret; > + > + ret = reset_control_deassert(rst); > + if (ret) > + return ret; > + > + return devm_add_action_or_reset(dev, aspeed_peci_reset_control_release, rst); > +} > + > +static void aspeed_peci_clk_release(void *data) > +{ > + clk_disable_unprepare(data); > +} > + > +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk *clk) > +{ > + int ret; > + > + ret = clk_prepare_enable(clk); > + if (ret) > + return ret; > + > + return devm_add_action_or_reset(dev, aspeed_peci_clk_release, clk); > +} > + > +static int aspeed_peci_probe(struct platform_device *pdev) > +{ > + struct peci_controller *controller; > + struct aspeed_peci *priv; > + int ret; > + > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + priv->dev = &pdev->dev; > + dev_set_drvdata(priv->dev, priv); > + > + priv->base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(priv->base)) > + return PTR_ERR(priv->base); > + > + priv->irq = platform_get_irq(pdev, 0); > + if (!priv->irq) > + return priv->irq; > + > + ret = devm_request_irq(&pdev->dev, priv->irq, aspeed_peci_irq_handler, > + 0, "peci-aspeed", priv); > + if (ret) > + return ret; > + > + init_completion(&priv->xfer_complete); > + spin_lock_init(&priv->lock); > + > + priv->rst = devm_reset_control_get(&pdev->dev, NULL); > + if (IS_ERR(priv->rst)) > + return dev_err_probe(priv->dev, PTR_ERR(priv->rst), > + "failed to get reset control\n"); > + > + ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv->rst); > + if (ret) > + return dev_err_probe(priv->dev, ret, "cannot deassert reset control\n"); > + > + priv->clk = devm_clk_get(priv->dev, NULL); > + if (IS_ERR(priv->clk)) > + return dev_err_probe(priv->dev, PTR_ERR(priv->clk), "failed to get clk\n"); > + > + ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); > + if (ret) > + return dev_err_probe(priv->dev, ret, "failed to enable clock\n"); > + > + aspeed_peci_property_setup(priv); aspeed_peci_bus_freq_setup(priv); > + > + aspeed_peci_init_regs(priv); > + > + controller = devm_peci_controller_add(priv->dev, &aspeed_ops); > + if (IS_ERR(controller)) > + return dev_err_probe(priv->dev, PTR_ERR(controller), > + "failed to add aspeed peci controller\n"); > + > + priv->controller = controller; > + > + return 0; > +} > + > +static const struct of_device_id aspeed_peci_of_table[] = { > + { .compatible = "aspeed,ast2400-peci", }, > + { .compatible = "aspeed,ast2500-peci", }, > + { .compatible = "aspeed,ast2600-peci", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); > + > +static struct platform_driver aspeed_peci_driver = { > + .probe = aspeed_peci_probe, > + .driver = { > + .name = "peci-aspeed", > + .of_match_table = aspeed_peci_of_table, > + }, > +}; > +module_platform_driver(aspeed_peci_driver); > + > +MODULE_AUTHOR("Ryan Chen "); > +MODULE_AUTHOR("Jae Hyun Yoo "); > +MODULE_DESCRIPTION("ASPEED PECI driver"); > +MODULE_LICENSE("GPL"); > +MODULE_IMPORT_NS(PECI); > -- > 2.31.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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9357CC433EF for ; Mon, 6 Dec 2021 05:27:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229765AbhLFFbR (ORCPT ); Mon, 6 Dec 2021 00:31:17 -0500 Received: from mail-eopbgr1300103.outbound.protection.outlook.com ([40.107.130.103]:28105 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229448AbhLFFbR (ORCPT ); Mon, 6 Dec 2021 00:31:17 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fK3PaCTOqhmOJUoA1xfYl4/78UcXOzHdew0+rJvtqueJt3SJJLBFa23/+TPUzo9+SZyiucPJNgZceSahckD0BlGgF/koUiPfp4G+3Be5Qw/C/zvQvqRVT2VXa0zR9EmKQ9sEuqZMj8VuOT8u/SteTdkCE78Uu7fwVCfHu5gN2VDk2Gp8/OP76e33LLDHkPmdbMeuDXrSEnv4JqeERlfPMbokHuopniQ5qhp9gXkHQxvTr0oCPQS/BypY53qhuMyAhcpEvG5B7QchykrAheFkqR62mQAyQDT7RsHnso8vjzEanaatvY0S4tzAJZYim8U/AHnVWycuftSyx6kcNGying== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BcR89AI0It8qsYGiFbGIKqCsrMa7lmACFbXFp+yjVIY=; b=aM8D2nuf0GpGYFcEqWkjGY/v2HpbO05cQDe+fmpp4l9Oqq8m27fPjxgP60hLo9d8aIhO4quo9oT7ZkhGyeKQ8hxGZ3YWpvhqCONEog5ZailBVP+D4EOSsoy2mG2X+KmoNDISbFAVMBhuWVSAMvrL7dhDx7qdBfDsVpJyoD4bejCxM9ipH2TJ4W+4NEGwZ6+95f+9Wboz9YscGXjLqHg0urmGWasLyMGsmp8am63hUg+OmhvChVhP4RmvEe3qs9axUHh0F3Gg1HJo4tbqOx9nUlWQ8HgYQFOMmkKrgma1539W6N8qHc1/2ux9soxju7Z3k6Ih/ugKdh6Hxj9TOubG8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BcR89AI0It8qsYGiFbGIKqCsrMa7lmACFbXFp+yjVIY=; b=Q9MTJbVnFIbnqB2n0HCtH0rbwD2ReM7JVjge1Y4n8q/Cy2L6G1kn9eS2+zH6LXmXWMwNqE1vjKu3sFYr92ukBiPILaAwpZwLtCxrWodamVlW4m6mPu579CKM6roIb0ubNmHXxPPxPmTo2X72ajjErIr/8pR8mKFIXVjTuPUIbTipIh0HXbKC81nAJmluT2ogODYKzrAysNYUWSaH3sRcgUI4sUNHReBVYpEmPIomPzNajLdTdgiHdno/EdSF8LgLMYiiUbz1y5TwOfFrIr5fua+WQKTo6uWN+9b1HDPmzXs9JhEjVisFbvGG7cEoiJGq7DhTk6WBT45/I1Fu1QhKLA== Received: from HK0PR06MB3362.apcprd06.prod.outlook.com (2603:1096:203:8b::10) by HK0PR06MB2131.apcprd06.prod.outlook.com (2603:1096:203:4d::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.11; Mon, 6 Dec 2021 05:27:44 +0000 Received: from HK0PR06MB3362.apcprd06.prod.outlook.com ([fe80::7941:2fad:3c82:52eb]) by HK0PR06MB3362.apcprd06.prod.outlook.com ([fe80::7941:2fad:3c82:52eb%3]) with mapi id 15.20.4755.021; Mon, 6 Dec 2021 05:27:44 +0000 From: Billy Tsai To: Iwona Winiarska , "linux-kernel@vger.kernel.org" , "openbmc@lists.ozlabs.org" , Greg Kroah-Hartman CC: "linux-aspeed@lists.ozlabs.org" , "linux-doc@vger.kernel.org" , Dave Hansen , Zev Weiss , Jae Hyun Yoo , Jonathan Corbet , Pierre-Louis Bossart , Guenter Roeck , "devicetree@vger.kernel.org" , Jean Delvare , Arnd Bergmann , Rob Herring , Borislav Petkov , Dan Williams , Andy Shevchenko , "linux-arm-kernel@lists.infradead.org" , "linux-hwmon@vger.kernel.org" , Tony Luck , Andrew Jeffery , Randy Dunlap , Olof Johansson Subject: Re: [PATCH v4 05/13] peci: Add peci-aspeed controller driver Thread-Topic: [PATCH v4 05/13] peci: Add peci-aspeed controller driver Thread-Index: AQHX4HQCKrBLVejdoE+1iQYtwHjqf6wliS8A Date: Mon, 6 Dec 2021 05:27:43 +0000 Message-ID: <71D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com> References: <20211123140706.2945700-1-iwona.winiarska@intel.com> <20211123140706.2945700-6-iwona.winiarska@intel.com> In-Reply-To: <20211123140706.2945700-6-iwona.winiarska@intel.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 28b7858c-52d8-438c-6fff-08d9b8792171 x-ms-traffictypediagnostic: HK0PR06MB2131: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:7691; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: UxUIND2oJkfuuyh43fakt1Yy44jNrU1Q1lX36UBcvgvZpE1dGr5vuW4a/B0guk6Hmah9aLnD0NpOCi9qFRTH7eIJchsaflDhUhzCPDLgEipbT0N+xaCKDZ+GecCqjo+XrsigRAe4b8FuGoBRitXAWcaglNzTChM2xaAWl8e29vJpoiFnBhGkcgTLcxUElDN8eSEksbv0vsqGt28Z45LhOKNq+gBalR9MW161J1sz0SW0hflZl1gfGIIIHg6/DoOSxiZiovXZrbQMKl3WXsqxuWNkZrwaXsXupoHzJKqyFmzgvrbm0PZGtj/KhpTC7iKVB1X2dNfEyJ1N677Gd+gQSZych6E+Y6umon0l7J9FogisBPeUfRGCM/NG4duIp5bu5eSqqzROY2UUs5cI14NMLBM9CvwSu8hU3NDjhNaGuScrDpfJeeImjvwtyAZTnF5KEGM4kFY1VkJV+IIT+vuzCL91rRvHbWpgoKq6I2sMD/3FwWEQpyXyZGS2ORnaCI5p+LovyAkKOiuuX0lzKoPFggmRJDAnbR9R4F+BV0520FaKst0vD7NRrHHCHPr7IxdZ4ljdBmHYbNw5E+rpC1u94bAn1b1dbO2HaW5p0EzuMSchNEuZm3yCaWYopOVNsH5Js35c8leEqi9Iqb1l//AFaF03gCO11XTgJSI/HeCzpuqhCjRbBNRbK+NQic0VfGNBP9zoOO7Cm/SybFMREaHkoBwxWIGcu6soVWN71g4jszI1bdIKKcTbldAHfnZGoEUC x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:HK0PR06MB3362.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(376002)(136003)(346002)(39840400004)(396003)(366004)(66476007)(2906002)(122000001)(66556008)(76116006)(33656002)(54906003)(86362001)(83380400001)(66446008)(30864003)(6512007)(110136005)(66946007)(64756008)(316002)(8936002)(36756003)(7416002)(4326008)(8676002)(26005)(6486002)(38070700005)(38100700002)(71200400001)(2616005)(508600001)(53546011)(6506007)(5660300002)(186003)(45980500001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?QzdVZjBZTFJJNHRoSDV0dzhkOUVYZlVONGR2cjNqV2hRMW85ZWc5VDNMMUNY?= =?utf-8?B?M0tEeU5IOVdNMzBVV2EybEEvYndHSEt3VUtETDJ6bURlTEJaTy9mRjRKVy83?= =?utf-8?B?MnN6WEUrMDhuNDRMS3YzcU9Ja1E1Q1dENHNRY1ZiRnJnNHNEWGoyRTAwcmV6?= =?utf-8?B?K3dJeG5ZWTIxK0MwZHRwTEVlVldvNFBtT2p2UWo4OFhyaEltTnNaTCtJOXlW?= =?utf-8?B?UHNlbmMxRjRxRC9YQ0dab2ZYL2ZKZmwwbVJDbTZyakZVWUtsZW5VU2VYRlpO?= =?utf-8?B?RFpyRm1qMEZMVE9NWXhSZDZ3NDd2Sk9wQ1ZDbVJsTmFreU0xZ2owa1ZDekpi?= =?utf-8?B?VzlrVTk0U3hYY0hEby9WTjBNcFZ2TGZ5ZmtkM1N2S3d6aEFKVHVaTEpvSUlP?= =?utf-8?B?ZmNCQ2VRSTlhSHFLOEF4T2RnbSsycVBSWk9pSm5KeCtMKzMwU3FReDZ2cGl4?= =?utf-8?B?Y2JmdmZnQzVxbzdrVTl4cnlrMHBPS3I3WnNqcERybExVZDVrUnlmbCs2amhy?= =?utf-8?B?TFpkM3pkd05NbkdZZVBPS0sxdDNEbml1VlVtQVBSbVZHUExKMzg1eWpSejRp?= =?utf-8?B?NFF5b3Z6RDgvK1E0aVRKbzFhcnc1T2QvbVFjR29CeHdGZksxTGEyVmd4QU1S?= =?utf-8?B?L3Z3eDlGKzdidUU1Y2FINWo2c1U2UXRMSXFRdVVXRGxzelk3bE9JcWNnN1Ix?= =?utf-8?B?eWN2M3ErSFc2MlRoQUNpRXBEQkJyeGhxRXRyNXFaN0U2WVhzZUhYNzloK2Rq?= =?utf-8?B?aTluTnJZYXc0OVlqK2hLWkpDcHNvcVl2bDZkdVFsSGFnV3pGNDF5MzYzbmRr?= =?utf-8?B?bm0zeHZFWVhOUXJpZVhGUlN1aENxUExPYVcrSkt3clVlTEIvb25PdGNaL3lR?= =?utf-8?B?NFgyNmFUYjNpWmloMHcyaWxHSWU1WEdKTTlqTlhUV1JmQTVSWkVsL3dmQWJo?= =?utf-8?B?aE5ISDRSTDlsSVloUWZrbWliTnI3OUVKTlF6MjVOMGNnbXlBbkkva3N4ZDVh?= =?utf-8?B?RHRycFF1RzhEUHZPRm5MdVNKVWxIcmRjSitqckhCM3gzOGl0VW9tMFArZXlO?= =?utf-8?B?dkN6aHNreHZ6R2lGS0xCUFc4ME1abERtT1pUbHVKREF2ZTN2Y3c0ZWZyanhN?= =?utf-8?B?OG8rMldrMUVudXhCVnJUUEtaZk1lWUVkZ2pjR2xDdzI3UVJ5OWFNSGFRMGQ3?= =?utf-8?B?SC9WN3M2bnJsdG1nVEpPZVNHOHZwTnhlNTJVT2dNYU8yeXQwYVRwUzVUalZs?= =?utf-8?B?em9SdTlwRkVKVXgzQUtHaDNxUklRY1pTMkdveGo0WGhyTk12anJKK3dPTE93?= =?utf-8?B?WmN2Z1FOdHZkbndMSEVpNVplYkpvMlJHTEFpcndndlQ0RkcxNzBIelM2NGFz?= =?utf-8?B?T0lWclg4TDBSZ2xzOHVscXpuVFZ5WTFJcjRSd1JkK2JUOGxabExPMWlxb0c5?= =?utf-8?B?YmtOSGVtOThHUWFudnprL0tWWW9iM2loclZzQ0dOY2xSOW5SZ2hnQVo3TmVo?= =?utf-8?B?Z0pRMEY1QjN2dHV0N0JTN1RqMnJFbmdlLzN6TitnTDFXRUh1aWZzMHp5SnBi?= =?utf-8?B?V1U5aWMzTzJFb1NCQmQ5QW5PQzVWcDNDQjZ4bFVFZG9pZmc1NTE3bkpmRjlm?= =?utf-8?B?YVZJR0J1M0pZeHB2TnRNZG90V0VsV2J2cXRSYjloR2g2dFN3a29SL2VocXdD?= =?utf-8?B?cVBkb1JpNlNOUmpEMlNwbU9QWnIvK2szOFVKaVRXQlIwZ0I1WC9UQTdTOU56?= =?utf-8?B?azRrR0hDcnVyaEJvR0xXWGwwdnFzRlNlZTZFRXFTbFpuLzh4RXUzeWRERjNR?= =?utf-8?B?WUJuYUlBbE1VTXNieTVpN2g5My8vMmdKZ3BZcHNCK3Jpa2t1SWFVU01ieUpP?= =?utf-8?B?SWFtNDNqR2UvNi9kYzBvR3d0M0hUOUxUMnZTVFhtK0tWVlp2MSt1Tkg4UUpI?= =?utf-8?B?a2F2anVhK25kdmVad1Z2dWFYbUtLSjJ1N0V4dTNPYTBiN0V1U0R4d3BzdkVp?= =?utf-8?B?TVJlSmhJbVBpVFd5MXhRZkNENFUyMWUvMm96c05WK0E2ZktxMGorUXcxOTBL?= =?utf-8?B?WnN5TG5kTzNqRGNJa3plRUZvOE12eExxZ3FDTEZYVHdQY1JJM0VOdHBFaHFh?= =?utf-8?B?SGZ3bGlwOU5CdmpzK2hNMkR4M3d2aGcyTXo2dmpTcjBKeEdQbTR2WWlmZ1Zp?= =?utf-8?B?b3VmSDlJQlI5S2FqcVJhenc3SG92a2dYb3lYSXB4NDNTTEdxNGVxNXlrd253?= =?utf-8?Q?JkMGYCS+ggYzmU4l3098j9nF3sPQvlkoD5K01hBcbg=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <8B4465647D56A94D95CFDE63A9974F3A@apcprd06.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: HK0PR06MB3362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 28b7858c-52d8-438c-6fff-08d9b8792171 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Dec 2021 05:27:43.9202 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: P9AyKL+x7asX3CIWmu1udcE2EnaX5MryMtjh31ns3azWyCEfBM1aTRNHF0KJUAC5hRBHclsfGn+fBC2Cp0S+NrlQKW9l/GnNBLQZ98itta4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK0PR06MB2131 Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org SGksDQoNCkFmdGVyIHJldmlld2luZyB0aGUgcGF0Y2gsIEkgaGF2ZSBzb21lIHN1Z2dlc3Rpb25z IGZvciB5b3UuIFBsZWFzZSBzZWUgdGhlIHJlcGx5IGlubGluZS4NCg0KT24gMjAyMS8xMS8yMywg MTA6MTEgUE0sICJvcGVuYm1jIG9uIGJlaGFsZiBvZiBJd29uYSBXaW5pYXJza2EiIDxvcGVuYm1j LWJvdW5jZXMrYmlsbHlfdHNhaT1hc3BlZWR0ZWNoLmNvbUBsaXN0cy5vemxhYnMub3JnIG9uIGJl aGFsZiBvZiBpd29uYS53aW5pYXJza2FAaW50ZWwuY29tPiB3cm90ZToNCg0KICAgID4gICBGcm9t OiBKYWUgSHl1biBZb28gPGphZS5oeXVuLnlvb0BsaW51eC5pbnRlbC5jb20+DQpBZGQgdGhlIGRl ZmluZSBmb3IgdGhlIGJ1cyBmcmVxdWVuY3kNCiAgICAgICAgI2RlZmluZSBBU1BFRURfUEVDSV9C VVNfRlJFUVVFTkNZX01JTgkJMjAwMA0KICAgICAgICAjZGVmaW5lIEFTUEVFRF9QRUNJX0JVU19G UkVRVUVOQ1lfREVGQVVMVAkyMDAwDQogICAgICAgICNkZWZpbmUgQVNQRUVEX1BFQ0lfQlVTX0ZS RVFVRU5DWV9NQVgJCTEwMDAwMDANCg0KICAgPiAgICtzdHJ1Y3QgYXNwZWVkX3BlY2kgew0KICAg ID4gICArCXN0cnVjdCBwZWNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7DQogICAgPiAgICsJc3Ry dWN0IGRldmljZSAqZGV2Ow0KICAgID4gICArCXZvaWQgX19pb21lbSAqYmFzZTsNCiAgICA+ICAg KwlzdHJ1Y3QgY2xrICpjbGs7DQogICAgPiAgICsJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJzdDsN CiAgICA+ICAgKwlpbnQgaXJxOw0KICAgID4gICArCXNwaW5sb2NrX3QgbG9jazsgLyogdG8gc3lu YyBjb21wbGV0aW9uIHN0YXR1cyBoYW5kbGluZyAqLw0KICAgID4gICArCXN0cnVjdCBjb21wbGV0 aW9uIHhmZXJfY29tcGxldGU7DQogICAgPiAgICsJdTMyIHN0YXR1czsNCiAgICA+ICAgKwl1MzIg Y21kX3RpbWVvdXRfbXM7DQogICAgPiAgICsJdTMyIG1zZ190aW1pbmc7DQogICAgPiAgICsJdTMy IGFkZHJfdGltaW5nOw0KICAgID4gICArCXUzMiByZF9zYW1wbGluZ19wb2ludDsNCiAgICA+ICAg Kwl1MzIgY2xrX2RpdjsNCg0KQWRkIHRoZSBwYXJlbWV0ZXIgdG8gc3RvcmUgdGhlIGJ1c19mcmVx IGZyb20gdGhlIGR0cyBwcm9wZXJ0eQ0KICAgICAgICB1MzIgYnVzX2ZyZXE7DQoNCiAgICA+ICAg K307DQogICAgPiAgICsNCiAgICA+ICAgK3N0YXRpYyB2b2lkIGFzcGVlZF9wZWNpX2luaXRfcmVn cyhzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXYpDQogICAgPiAgICt7DQogICAgPiAgICsJdTMyIHZh bDsNCiAgICA+ICAgKw0KICAgID4gICArCXZhbCA9IEZJRUxEX1BSRVAoQVNQRUVEX1BFQ0lfQ1RS TF9DTEtfRElWX01BU0ssIEFTUEVFRF9QRUNJX0NMS19ESVZfREVGQVVMVCk7DQogICAgPiAgICsJ dmFsIHw9IEFTUEVFRF9QRUNJX0NUUkxfUEVDSV9DTEtfRU47DQogICAgPiAgICsJd3JpdGVsKHZh bCwgcHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX0NUUkwpOw0KICAgID4gICArCS8qDQogICAgPiAg ICsJICogVGltaW5nIG5lZ290aWF0aW9uIHBlcmlvZCBzZXR0aW5nLg0KICAgID4gICArCSAqIFRo ZSB1bml0IG9mIHRoZSBwcm9ncmFtbWVkIHZhbHVlIGlzIDQgdGltZXMgb2YgUEVDSSBjbG9jayBw ZXJpb2QuDQogICAgPiAgICsJICovDQogICAgPiAgICsJdmFsID0gRklFTERfUFJFUChBU1BFRURf UEVDSV9UX05FR09fTVNHX01BU0ssIHByaXYtPm1zZ190aW1pbmcpOw0KICAgID4gICArCXZhbCB8 PSBGSUVMRF9QUkVQKEFTUEVFRF9QRUNJX1RfTkVHT19BRERSX01BU0ssIHByaXYtPmFkZHJfdGlt aW5nKTsNCiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfVElN SU5HX05FR09USUFUSU9OKTsNCiAgICA+ICAgKw0KICAgID4gICArCS8qIENsZWFyIGludGVycnVw dHMgKi8NCiAgICA+ICAgKwl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfSU5U X1NUUykgfCBBU1BFRURfUEVDSV9JTlRfTUFTSzsNCiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2 LT5iYXNlICsgQVNQRUVEX1BFQ0lfSU5UX1NUUyk7DQogICAgPiAgICsNCiAgICA+ICAgKwkvKiBT ZXQgdGltaW5nIG5lZ290aWF0aW9uIG1vZGUgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovDQogICAg PiAgICsJdmFsID0gRklFTERfUFJFUChBU1BFRURfUEVDSV9USU1JTkdfTkVHT19TRUxfTUFTSywg QVNQRUVEX1BFQ0lfMVNUX0JJVF9PRl9BRERSX05FR08pOw0KICAgID4gICArCXZhbCB8PSBBU1BF RURfUEVDSV9JTlRfTUFTSzsNCiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgQVNQ RUVEX1BFQ0lfSU5UX0NUUkwpOw0KICAgID4gICArDQogICAgPiAgICsJdmFsID0gRklFTERfUFJF UChBU1BFRURfUEVDSV9DVFJMX1NBTVBMSU5HX01BU0ssIHByaXYtPnJkX3NhbXBsaW5nX3BvaW50 KTsNCiAgICA+ICAgKwl2YWwgfD0gRklFTERfUFJFUChBU1BFRURfUEVDSV9DVFJMX0NMS19ESVZf TUFTSywgcHJpdi0+Y2xrX2Rpdik7DQogICAgPiAgICsJdmFsIHw9IEFTUEVFRF9QRUNJX0NUUkxf UEVDSV9FTjsNCiAgICA+ICAgKwl2YWwgfD0gQVNQRUVEX1BFQ0lfQ1RSTF9QRUNJX0NMS19FTjsN CiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfQ1RSTCk7DQog ICAgPiAgICt9DQogICAgPiAgICsNCiAgICA+ICAgK3N0YXRpYyBpbmxpbmUgaW50IGFzcGVlZF9w ZWNpX2NoZWNrX2lkbGUoc3RydWN0IGFzcGVlZF9wZWNpICpwcml2KQ0KICAgID4gICArew0KICAg ID4gICArCXUzMiBjbWRfc3RzID0gcmVhZGwocHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX0NNRCk7 DQogICAgPiAgICsNCiAgICA+ICAgKwlpZiAoRklFTERfR0VUKEFTUEVFRF9QRUNJX0NNRF9TVFNf TUFTSywgY21kX3N0cykgPT0gQVNQRUVEX1BFQ0lfQ01EX1NUU19BRERSX1RfTkVHTykNCiAgICA+ ICAgKwkJYXNwZWVkX3BlY2lfaW5pdF9yZWdzKHByaXYpOw0KDQpBcyBsb25nIGFzIHRoZSBzdGF0 ZSBpcyBub3QgaWRsZSwgdGhlIGNvbnRyb2xsZXIgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIFBF Q0kgcmVnaXN0ZXIgZm9yIHNvbHZpbmcgdGhlIFBFQ0kgY29udHJvbGxlciBoYW5nLg0KQmVmb3Jl IGFzdDI2MDBBMywgdGhlIGNvbnRyb2xsZXIgc2hvdWxkIGFzc2VydC9kZS1hc3NlcnQgdGhlIHJl c2V0IGZvciBzb2x2aW5nIHRoZSBoYW5nIGlzc3VlLg0KRm9yIGJhY2t3YXJkIGNvbXBhdGlibGUs IEkgc3VnZ2VzdCB0byBhZGQgdGhlIHJlc2V0IGFzc2VydC9kZS1hc3NlcnQgaW4gdGhpcyBwbGFj ZS4NCiAgICAgICAgaWYgKEZJRUxEX0dFVChBU1BFRURfUEVDSV9DTURfU1RTX01BU0ssIGNtZF9z dHMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXNldF9jb250cm9sX2Fzc2VydChwcml2 LT5yc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfY29udHJvbF9kZWFzc2VydChw cml2LT5yc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWVkX3BlY2lfaW5pdF9yZWdz KHByaXYpOw0KICAgICAgICB9DQoNCiAgICA+ICAgKwlyZXR1cm4gcmVhZGxfcG9sbF90aW1lb3V0 KHByaXYtPmJhc2UgKyBBU1BFRURfUEVDSV9DTUQsDQogICAgPiAgICsJCQkJICBjbWRfc3RzLA0K ICAgID4gICArCQkJCSAgIShjbWRfc3RzICYgQVNQRUVEX1BFQ0lfQ01EX0lETEVfTUFTSyksDQog ICAgPiAgICsJCQkJICBBU1BFRURfUEVDSV9JRExFX0NIRUNLX0lOVEVSVkFMX1VTLA0KICAgID4g ICArCQkJCSAgQVNQRUVEX1BFQ0lfSURMRV9DSEVDS19USU1FT1VUX1VTKTsNCiAgICA+ICAgK30N CiAgICA+ICAgKw0KICAgID4gICArc3RhdGljIGludCBhc3BlZWRfcGVjaV94ZmVyKHN0cnVjdCBw ZWNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsDQogICAgPiAgICsJCQkgICAgdTggYWRkciwgc3Ry dWN0IHBlY2lfcmVxdWVzdCAqcmVxKQ0KICAgID4gICArew0KICAgID4gICArCXN0cnVjdCBhc3Bl ZWRfcGVjaSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShjb250cm9sbGVyLT5kZXYucGFyZW50KTsN CiAgICA+ICAgKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHByaXYt PmNtZF90aW1lb3V0X21zKTsNCiAgICA+ICAgKwl1MzIgcGVjaV9oZWFkOw0KICAgID4gICArCWlu dCByZXQ7DQogICAgPiAgICsNCiAgICA+ICAgKwlpZiAocmVxLT50eC5sZW4gPiBBU1BFRURfUEVD SV9EQVRBX0JVRl9TSVpFX01BWCB8fA0KICAgID4gICArCSAgICByZXEtPnJ4LmxlbiA+IEFTUEVF RF9QRUNJX0RBVEFfQlVGX1NJWkVfTUFYKQ0KICAgID4gICArCQlyZXR1cm4gLUVJTlZBTDsNCiAg ICA+ICAgKw0KICAgID4gICArCS8qIENoZWNrIGNvbW1hbmQgc3RzIGFuZCBidXMgaWRsZSBzdGF0 ZSAqLw0KICAgID4gICArCXJldCA9IGFzcGVlZF9wZWNpX2NoZWNrX2lkbGUocHJpdik7DQogICAg PiAgICsJaWYgKHJldCkNCiAgICA+ICAgKwkJcmV0dXJuIHJldDsgLyogLUVUSU1FRE9VVCAqLw0K ICAgID4gICArDQogICAgPiAgICsJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7DQogICAgPiAg ICsJcmVpbml0X2NvbXBsZXRpb24oJnByaXYtPnhmZXJfY29tcGxldGUpOw0KICAgID4gICArDQog ICAgPiAgICsJcGVjaV9oZWFkID0gRklFTERfUFJFUChBU1BFRURfUEVDSV9UQVJHRVRfQUREUl9N QVNLLCBhZGRyKSB8DQogICAgPiAgICsJCSAgICBGSUVMRF9QUkVQKEFTUEVFRF9QRUNJX1dSX0xF Tl9NQVNLLCByZXEtPnR4LmxlbikgfA0KICAgID4gICArCQkgICAgRklFTERfUFJFUChBU1BFRURf UEVDSV9SRF9MRU5fTUFTSywgcmVxLT5yeC5sZW4pOw0KICAgID4gICArDQogICAgPiAgICsJd3Jp dGVsKHBlY2lfaGVhZCwgcHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX1JXX0xFTkdUSCk7DQogICAg PiAgICsNCiAgICA+ICAgKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfV1Jf REFUQTAsIHJlcS0+dHguYnVmLCBtaW5fdCh1OCwgcmVxLT50eC5sZW4sIDE2KSk7DQogICAgPiAg ICsJaWYgKHJlcS0+dHgubGVuID4gMTYpDQogICAgPiAgICsJCW1lbWNweV90b2lvKHByaXYtPmJh c2UgKyBBU1BFRURfUEVDSV9XUl9EQVRBNCwgcmVxLT50eC5idWYgKyAxNiwNCiAgICA+ICAgKwkJ CSAgICByZXEtPnR4LmxlbiAtIDE2KTsNCiAgICA+ICAgKw0KICAgID4gICArI2lmIElTX0VOQUJM RUQoQ09ORklHX0RZTkFNSUNfREVCVUcpDQogICAgPiAgICsJZGV2X2RiZyhwcml2LT5kZXYsICJI RUFEIDogJSMwOHhcbiIsIHBlY2lfaGVhZCk7DQogICAgPiAgICsJcHJpbnRfaGV4X2R1bXBfYnl0 ZXMoIlRYIDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgcmVxLT50eC5idWYsIHJlcS0+dHgubGVuKTsN CiAgICA+ICAgKyNlbmRpZg0KICAgID4gICArCXByaXYtPnN0YXR1cyA9IDA7DQogICAgPiAgICsJ d3JpdGVsKEFTUEVFRF9QRUNJX0NNRF9GSVJFLCBwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfQ01E KTsNCiAgICA+ICAgKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOw0KICAgID4gICArDQog ICAgPiAgICsJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQo JnByaXYtPnhmZXJfY29tcGxldGUsIHRpbWVvdXQpOw0KICAgID4gICArCWlmIChyZXQgPCAwKQ0K ICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAgID4gICArDQogICAgPiAgICsJaWYgKHJldCA9PSAw KSB7DQogICAgPiAgICsJCWRldl9kYmcocHJpdi0+ZGV2LCAiVGltZW91dCB3YWl0aW5nIGZvciBh IHJlc3BvbnNlIVxuIik7DQpkZXZfZXJyPw0KICAgID4gICArCQlyZXR1cm4gLUVUSU1FRE9VVDsN CiAgICA+ICAgKwl9DQogICAgPiAgICsNCiAgICA+ICAgKwlzcGluX2xvY2tfaXJxKCZwcml2LT5s b2NrKTsNCiAgICA+ICAgKw0KICAgID4gICArCWlmIChwcml2LT5zdGF0dXMgIT0gQVNQRUVEX1BF Q0lfSU5UX0NNRF9ET05FKSB7DQogICAgPiAgICsJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9j ayk7DQogICAgPiAgICsJCWRldl9kYmcocHJpdi0+ZGV2LCAiTm8gdmFsaWQgcmVzcG9uc2UsIHN0 YXR1czogJSMwMnhcbiIsIHByaXYtPnN0YXR1cyk7DQpkZXZfZXJyPw0KICAgID4gICArCQlyZXR1 cm4gLUVJTzsNCiAgICA+ICAgKwl9DQogICAgPiAgICsNCiAgICA+ICAgKwlzcGluX3VubG9ja19p cnEoJnByaXYtPmxvY2spOw0KICAgID4gICArDQogICAgPiAgICsJbWVtY3B5X2Zyb21pbyhyZXEt PnJ4LmJ1ZiwgcHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX1JEX0RBVEEwLCBtaW5fdCh1OCwgcmVx LT5yeC5sZW4sIDE2KSk7DQogICAgPiAgICsJaWYgKHJlcS0+cngubGVuID4gMTYpDQogICAgPiAg ICsJCW1lbWNweV9mcm9taW8ocmVxLT5yeC5idWYgKyAxNiwgcHJpdi0+YmFzZSArIEFTUEVFRF9Q RUNJX1JEX0RBVEE0LA0KICAgID4gICArCQkJICAgICAgcmVxLT5yeC5sZW4gLSAxNik7DQogICAg PiAgICsNCiAgICA+ICAgKyNpZiBJU19FTkFCTEVEKENPTkZJR19EWU5BTUlDX0RFQlVHKQ0KICAg ID4gICArCXByaW50X2hleF9kdW1wX2J5dGVzKCJSWCA6ICIsIERVTVBfUFJFRklYX05PTkUsIHJl cS0+cnguYnVmLCByZXEtPnJ4Lmxlbik7DQogICAgPiAgICsjZW5kaWYNCiAgICA+ICAgKwlyZXR1 cm4gMDsNCiAgICA+ICAgK30NCiAgICA+ICAgKw0KICAgID4gICArc3RhdGljIGlycXJldHVybl90 IGFzcGVlZF9wZWNpX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykNCiAgICA+ICAgK3sN CiAgICA+ICAgKwlzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXYgPSBhcmc7DQogICAgPiAgICsJdTMy IHN0YXR1czsNCiAgICA+ICAgKw0KICAgID4gICArCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7DQog ICAgPiAgICsJc3RhdHVzID0gcmVhZGwocHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX0lOVF9TVFMp Ow0KICAgID4gICArCXdyaXRlbChzdGF0dXMsIHByaXYtPmJhc2UgKyBBU1BFRURfUEVDSV9JTlRf U1RTKTsNCiAgICA+ICAgKwlwcml2LT5zdGF0dXMgfD0gKHN0YXR1cyAmIEFTUEVFRF9QRUNJX0lO VF9NQVNLKTsNCiAgICA+ICAgKw0KICAgID4gICArCS8qDQogICAgPiAgICsJICogQWxsIGNvbW1h bmRzIHNob3VsZCBiZSBlbmRlZCB1cCB3aXRoIGEgQVNQRUVEX1BFQ0lfSU5UX0NNRF9ET05FIGJp dA0KICAgID4gICArCSAqIHNldCBldmVuIGluIGFuIGVycm9yIGNhc2UuDQogICAgPiAgICsJICov DQogICAgPiAgICsJaWYgKHN0YXR1cyAmIEFTUEVFRF9QRUNJX0lOVF9DTURfRE9ORSkNCiAgICA+ ICAgKwkJY29tcGxldGUoJnByaXYtPnhmZXJfY29tcGxldGUpOw0KICAgID4gICArDQogICAgPiAg ICsJd3JpdGVsKDAsIHByaXYtPmJhc2UgKyBBU1BFRURfUEVDSV9DTUQpOw0KICAgID4gICArDQog ICAgPiAgICsJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOw0KICAgID4gICArDQogICAgPiAgICsJ cmV0dXJuIElSUV9IQU5ETEVEOw0KICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAgICtzdGF0 aWMgdm9pZCBhc3BlZWRfcGVjaV9wcm9wZXJ0eV9zYW5pdGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYs IGNvbnN0IGNoYXIgKnByb3BuYW1lLA0KICAgID4gICArCQkJCQkgIHUzMiBtaW4sIHUzMiBtYXgs IHUzMiBkZWZhdWx0X3ZhbCwgdTMyICpwcm9wdmFsKQ0KICAgID4gICArew0KICAgID4gICArCXUz MiB2YWw7DQogICAgPiAgICsJaW50IHJldDsNCiAgICA+ICAgKw0KICAgID4gICArCXJldCA9IGRl dmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsIHByb3BuYW1lLCAmdmFsKTsNCiAgICA+ICAgKwlp ZiAocmV0KSB7DQogICAgPiAgICsJCXZhbCA9IGRlZmF1bHRfdmFsOw0KICAgID4gICArCX0gZWxz ZSBpZiAodmFsID4gbWF4IHx8IHZhbCA8IG1pbikgew0KICAgID4gICArCQlkZXZfd2FybihkZXYs ICJJbnZhbGlkICVzOiAldSwgZmFsbGluZyBiYWNrIHRvOiAldVxuIiwNCiAgICA+ICAgKwkJCSBw cm9wbmFtZSwgdmFsLCBkZWZhdWx0X3ZhbCk7DQogICAgPiAgICsNCiAgICA+ICAgKwkJdmFsID0g ZGVmYXVsdF92YWw7DQogICAgPiAgICsJfQ0KICAgID4gICArDQogICAgPiAgICsJKnByb3B2YWwg PSB2YWw7DQogICAgPiAgICt9DQogICAgPiAgICsNCiAgICA+ICAgK3N0YXRpYyB2b2lkIGFzcGVl ZF9wZWNpX3Byb3BlcnR5X3NldHVwKHN0cnVjdCBhc3BlZWRfcGVjaSAqcHJpdikNCiAgICA+ICAg K3sNCiAgICA+ICAgKwlhc3BlZWRfcGVjaV9wcm9wZXJ0eV9zYW5pdGl6ZShwcml2LT5kZXYsICJh c3BlZWQsY2xvY2stZGl2aWRlciIsDQogICAgPiAgICsJCQkJICAgICAgMCwgQVNQRUVEX1BFQ0lf Q0xLX0RJVl9NQVgsDQogICAgPiAgICsJCQkJICAgICAgQVNQRUVEX1BFQ0lfQ0xLX0RJVl9ERUZB VUxULCAmcHJpdi0+Y2xrX2Rpdik7DQogICAgPiAgICsJYXNwZWVkX3BlY2lfcHJvcGVydHlfc2Fu aXRpemUocHJpdi0+ZGV2LCAiYXNwZWVkLG1zZy10aW1pbmciLA0KICAgID4gICArCQkJCSAgICAg IDAsIEFTUEVFRF9QRUNJX01TR19USU1JTkdfTUFYLA0KICAgID4gICArCQkJCSAgICAgIEFTUEVF RF9QRUNJX01TR19USU1JTkdfREVGQVVMVCwgJnByaXYtPm1zZ190aW1pbmcpOw0KICAgID4gICAr CWFzcGVlZF9wZWNpX3Byb3BlcnR5X3Nhbml0aXplKHByaXYtPmRldiwgImFzcGVlZCxhZGRyLXRp bWluZyIsDQogICAgPiAgICsJCQkJICAgICAgMCwgQVNQRUVEX1BFQ0lfQUREUl9USU1JTkdfTUFY LA0KICAgID4gICArCQkJCSAgICAgIEFTUEVFRF9QRUNJX0FERFJfVElNSU5HX0RFRkFVTFQsICZw cml2LT5hZGRyX3RpbWluZyk7DQoNClVzZSB0aGUgYnVzLWZyZXF1ZW5jeSB0byByZXBsYWNlIHRo ZSBwcm9wZXJ0eSBhYm92ZToNCiAgICAgICAgYXNwZWVkX3BlY2lfcHJvcGVydHlfc2FuaXRpemUo cHJpdi0+ZGV2LCAiYnVzLWZyZXF1ZW5jeSIsDQoJCQkJQVNQRUVEX1BFQ0lfQlVTX0ZSRVFVRU5D WV9NSU4sIEFTUEVFRF9QRUNJX0JVU19GUkVRVUVOQ1lfTUFYLA0KCQkJCUFTUEVFRF9QRUNJX0JV U19GUkVRVUVOQ1lfREVGQVVMVCwgJnByaXYtPmJ1c19mcmVxKTsNCg0KICAgID4gICArCWFzcGVl ZF9wZWNpX3Byb3BlcnR5X3Nhbml0aXplKHByaXYtPmRldiwgImFzcGVlZCxyZC1zYW1wbGluZy1w b2ludCIsDQogICAgPiAgICsJCQkJICAgICAgMCwgQVNQRUVEX1BFQ0lfUkRfU0FNUExJTkdfUE9J TlRfTUFYLA0KICAgID4gICArCQkJCSAgICAgIEFTUEVFRF9QRUNJX1JEX1NBTVBMSU5HX1BPSU5U X0RFRkFVTFQsDQogICAgPiAgICsJCQkJICAgICAgJnByaXYtPnJkX3NhbXBsaW5nX3BvaW50KTsN CiAgICA+ICAgKwlhc3BlZWRfcGVjaV9wcm9wZXJ0eV9zYW5pdGl6ZShwcml2LT5kZXYsICJjbWQt dGltZW91dC1tcyIsDQogICAgPiAgICsJCQkJICAgICAgMSwgQVNQRUVEX1BFQ0lfQ01EX1RJTUVP VVRfTVNfTUFYLA0KICAgID4gICArCQkJCSAgICAgIEFTUEVFRF9QRUNJX0NNRF9USU1FT1VUX01T X0RFRkFVTFQsICZwcml2LT5jbWRfdGltZW91dF9tcyk7DQogICAgPiAgICt9DQpBZGQgdGhlIGZ1 bmN0aW9uIG9mIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRpbmcgdGhlIHNldHRpbmdzIHRvIGFkYXB0 IHRvIHRoZSBidXMgZnJlcXVlbmN5Lg0KICAgICAgICBzdGF0aWMgdm9pZCBhc3BlZWRfcGVjaV9i dXNfZnJlcV9zZXR1cChzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXYpDQogICAgICAgIHsNCiAgICAg ICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNyY19jbGtfcmF0ZTsNCiAgICAgICAgICAgICAgICBp bnQgZGVsdGFfdmFsdWUsIGRlbHRhX3RtcCwgY2xrX2Rpdmlzb3IsIGNsa19kaXZpc29yX3RtcDsN CiAgICAgICAgICAgICAgICB1MzIgbXNnX3RpbWluZywgY2xrX2RpdjsNCg0KICAgICAgICAgICAg ICAgIHNyY19jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOw0KDQogICAgICAgICAg ICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQRUNJIGJ1cyBmcmVxICA9IChzb3VyY2UgY2xr IHJhdGUpIC8gKDQgKiAoUEVDSTA0WzE1OjhdKjQrMSkgKiAoMSA8PCBQRUNJMDBbMTA6OF0pKQ0K ICAgICAgICAgICAgICAgICAqICgxIDw8IFBFQ0kwMFsxMDo4XSkgKiAoUEVDSTA0WzE1OjhdKjQr MSkgPSAoc291cmNlIGNsayByYXRlKSAvICg0ICogUEVDSSBidXMgZnJlcSApDQogICAgICAgICAg ICAgICAgICovDQogICAgICAgICAgICAgICAgY2xrX2Rpdmlzb3IgPSBzcmNfY2xrX3JhdGUgLyAo NCAqIHByaXYtPmJ1c19mcmVxKTsNCiAgICAgICAgICAgICAgICBkZWx0YV92YWx1ZSA9IGNsa19k aXZpc29yOw0KICAgICAgICAgICAgICAgIC8qIEZpbmQgdGhlIGNsb3Nlc3QgZGl2aXNvciBmb3Ig YnVzLWZyZXF1ZW5jeSAqLw0KICAgICAgICAgICAgICAgIGZvciAobXNnX3RpbWluZyA9IDE7IG1z Z190aW1pbmcgPD0gMjU1OyBtc2dfdGltaW5nKyspDQogICAgICAgICAgICAgICAgICAgICAgICBm b3IgKGNsa19kaXYgPSAwOyBjbGtfZGl2IDwgNzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY2xrX2RpdisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsa19k aXZpc29yX3RtcCA9ICgxIDw8IGNsa19kaXYpICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChtc2dfdGltaW5nICogNCArIDEpOw0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZWx0YV90bXAgPSBhYnMoY2xrX2Rpdmlzb3IgLSBjbGtfZGl2 aXNvcl90bXApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFfdG1w IDwgZGVsdGFfdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBkZWx0YV92YWx1ZSA9IGRlbHRhX3RtcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcml2LT5tc2dfdGltaW5nID0gbXNnX3RpbWluZzsNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5hZGRyX3RpbWluZyA9IHByaXYtPm1zZ190 aW1pbmc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Y2xr X2RpdiA9IGNsa19kaXY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAg ICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgPiAgICsNCiAgICA+ICAgK3N0 YXRpYyBzdHJ1Y3QgcGVjaV9jb250cm9sbGVyX29wcyBhc3BlZWRfb3BzID0gew0KICAgID4gICAr CS54ZmVyID0gYXNwZWVkX3BlY2lfeGZlciwNCiAgICA+ICAgK307DQogICAgPiAgICsNCiAgICA+ ICAgK3N0YXRpYyB2b2lkIGFzcGVlZF9wZWNpX3Jlc2V0X2NvbnRyb2xfcmVsZWFzZSh2b2lkICpk YXRhKQ0KICAgID4gICArew0KICAgID4gICArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGRhdGEpOw0K ICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAgICtzdGF0aWMgaW50IGRldm1fYXNwZWVkX3Bl Y2lfcmVzZXRfY29udHJvbF9kZWFzc2VydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNl dF9jb250cm9sICpyc3QpDQogICAgPiAgICt7DQogICAgPiAgICsJaW50IHJldDsNCiAgICA+ICAg Kw0KICAgID4gICArCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocnN0KTsNCiAgICA+ICAg KwlpZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAgID4gICArDQogICAgPiAgICsJ cmV0dXJuIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGFzcGVlZF9wZWNpX3Jlc2V0X2Nv bnRyb2xfcmVsZWFzZSwgcnN0KTsNCiAgICA+ICAgK30NCiAgICA+ICAgKw0KICAgID4gICArc3Rh dGljIHZvaWQgYXNwZWVkX3BlY2lfY2xrX3JlbGVhc2Uodm9pZCAqZGF0YSkNCiAgICA+ICAgK3sN CiAgICA+ICAgKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YSk7DQogICAgPiAgICt9DQogICAg PiAgICsNCiAgICA+ICAgK3N0YXRpYyBpbnQgZGV2bV9hc3BlZWRfcGVjaV9jbGtfZW5hYmxlKHN0 cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGNsayAqY2xrKQ0KICAgID4gICArew0KICAgID4gICAr CWludCByZXQ7DQogICAgPiAgICsNCiAgICA+ICAgKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUo Y2xrKTsNCiAgICA+ICAgKwlpZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAgID4g ICArDQogICAgPiAgICsJcmV0dXJuIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGFzcGVl ZF9wZWNpX2Nsa19yZWxlYXNlLCBjbGspOw0KICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAg ICtzdGF0aWMgaW50IGFzcGVlZF9wZWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpDQogICAgPiAgICt7DQogICAgPiAgICsJc3RydWN0IHBlY2lfY29udHJvbGxlciAqY29udHJv bGxlcjsNCiAgICA+ICAgKwlzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXY7DQogICAgPiAgICsJaW50 IHJldDsNCiAgICA+ICAgKw0KICAgID4gICArCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRl diwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7DQogICAgPiAgICsJaWYgKCFwcml2KQ0KICAg ID4gICArCQlyZXR1cm4gLUVOT01FTTsNCiAgICA+ICAgKw0KICAgID4gICArCXByaXYtPmRldiA9 ICZwZGV2LT5kZXY7DQogICAgPiAgICsJZGV2X3NldF9kcnZkYXRhKHByaXYtPmRldiwgcHJpdik7 DQogICAgPiAgICsNCiAgICA+ICAgKwlwcml2LT5iYXNlID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFw X3Jlc291cmNlKHBkZXYsIDApOw0KICAgID4gICArCWlmIChJU19FUlIocHJpdi0+YmFzZSkpDQog ICAgPiAgICsJCXJldHVybiBQVFJfRVJSKHByaXYtPmJhc2UpOw0KICAgID4gICArDQogICAgPiAg ICsJcHJpdi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsNCiAgICA+ICAgKwlpZiAo IXByaXYtPmlycSkNCiAgICA+ICAgKwkJcmV0dXJuIHByaXYtPmlycTsNCiAgICA+ICAgKw0KICAg ID4gICArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcHJpdi0+aXJxLCBhc3Bl ZWRfcGVjaV9pcnFfaGFuZGxlciwNCiAgICA+ICAgKwkJCSAgICAgICAwLCAicGVjaS1hc3BlZWQi LCBwcml2KTsNCiAgICA+ICAgKwlpZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAg ID4gICArDQogICAgPiAgICsJaW5pdF9jb21wbGV0aW9uKCZwcml2LT54ZmVyX2NvbXBsZXRlKTsN CiAgICA+ICAgKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7DQogICAgPiAgICsNCiAgICA+ ICAgKwlwcml2LT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsIE5VTEwp Ow0KICAgID4gICArCWlmIChJU19FUlIocHJpdi0+cnN0KSkNCiAgICA+ICAgKwkJcmV0dXJuIGRl dl9lcnJfcHJvYmUocHJpdi0+ZGV2LCBQVFJfRVJSKHByaXYtPnJzdCksDQogICAgPiAgICsJCQkJ ICAgICAiZmFpbGVkIHRvIGdldCByZXNldCBjb250cm9sXG4iKTsNCiAgICA+ICAgKw0KICAgID4g ICArCXJldCA9IGRldm1fYXNwZWVkX3BlY2lfcmVzZXRfY29udHJvbF9kZWFzc2VydChwcml2LT5k ZXYsIHByaXYtPnJzdCk7DQogICAgPiAgICsJaWYgKHJldCkNCiAgICA+ICAgKwkJcmV0dXJuIGRl dl9lcnJfcHJvYmUocHJpdi0+ZGV2LCByZXQsICJjYW5ub3QgZGVhc3NlcnQgcmVzZXQgY29udHJv bFxuIik7DQogICAgPiAgICsNCiAgICA+ICAgKwlwcml2LT5jbGsgPSBkZXZtX2Nsa19nZXQocHJp di0+ZGV2LCBOVUxMKTsNCiAgICA+ICAgKwlpZiAoSVNfRVJSKHByaXYtPmNsaykpDQogICAgPiAg ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKHByaXYtPmRldiwgUFRSX0VSUihwcml2LT5jbGspLCAi ZmFpbGVkIHRvIGdldCBjbGtcbiIpOw0KICAgID4gICArDQogICAgPiAgICsJcmV0ID0gZGV2bV9h c3BlZWRfcGVjaV9jbGtfZW5hYmxlKHByaXYtPmRldiwgcHJpdi0+Y2xrKTsNCiAgICA+ICAgKwlp ZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShwcml2LT5kZXYsIHJldCwg ImZhaWxlZCB0byBlbmFibGUgY2xvY2tcbiIpOw0KICAgID4gICArDQogICAgPiAgICsJYXNwZWVk X3BlY2lfcHJvcGVydHlfc2V0dXAocHJpdik7DQoNCiAgICAgICAgYXNwZWVkX3BlY2lfYnVzX2Zy ZXFfc2V0dXAocHJpdik7DQoNCiAgICA+ICAgKw0KICAgID4gICArCWFzcGVlZF9wZWNpX2luaXRf cmVncyhwcml2KTsNCiAgICA+ICAgKw0KICAgID4gICArCWNvbnRyb2xsZXIgPSBkZXZtX3BlY2lf Y29udHJvbGxlcl9hZGQocHJpdi0+ZGV2LCAmYXNwZWVkX29wcyk7DQogICAgPiAgICsJaWYgKElT X0VSUihjb250cm9sbGVyKSkNCiAgICA+ICAgKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHJpdi0+ ZGV2LCBQVFJfRVJSKGNvbnRyb2xsZXIpLA0KICAgID4gICArCQkJCSAgICAgImZhaWxlZCB0byBh ZGQgYXNwZWVkIHBlY2kgY29udHJvbGxlclxuIik7DQogICAgPiAgICsNCiAgICA+ICAgKwlwcml2 LT5jb250cm9sbGVyID0gY29udHJvbGxlcjsNCiAgICA+ICAgKw0KICAgID4gICArCXJldHVybiAw Ow0KICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAgICtzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBhc3BlZWRfcGVjaV9vZl90YWJsZVtdID0gew0KICAgID4gICArCXsgLmNvbXBh dGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtcGVjaSIsIH0sDQogICAgPiAgICsJeyAuY29tcGF0aWJs ZSA9ICJhc3BlZWQsYXN0MjUwMC1wZWNpIiwgfSwNCiAgICA+ICAgKwl7IC5jb21wYXRpYmxlID0g ImFzcGVlZCxhc3QyNjAwLXBlY2kiLCB9LA0KICAgID4gICArCXsgfQ0KICAgID4gICArfTsNCiAg ICA+ICAgK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFzcGVlZF9wZWNpX29mX3RhYmxlKTsNCiAg ICA+ICAgKw0KICAgID4gICArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX3Bl Y2lfZHJpdmVyID0gew0KICAgID4gICArCS5wcm9iZSAgPSBhc3BlZWRfcGVjaV9wcm9iZSwNCiAg ICA+ICAgKwkuZHJpdmVyID0gew0KICAgID4gICArCQkubmFtZSAgICAgICAgICAgPSAicGVjaS1h c3BlZWQiLA0KICAgID4gICArCQkub2ZfbWF0Y2hfdGFibGUgPSBhc3BlZWRfcGVjaV9vZl90YWJs ZSwNCiAgICA+ICAgKwl9LA0KICAgID4gICArfTsNCiAgICA+ICAgK21vZHVsZV9wbGF0Zm9ybV9k cml2ZXIoYXNwZWVkX3BlY2lfZHJpdmVyKTsNCiAgICA+ICAgKw0KICAgID4gICArTU9EVUxFX0FV VEhPUigiUnlhbiBDaGVuIDxyeWFuX2NoZW5AYXNwZWVkdGVjaC5jb20+Iik7DQogICAgPiAgICtN T0RVTEVfQVVUSE9SKCJKYWUgSHl1biBZb28gPGphZS5oeXVuLnlvb0BsaW51eC5pbnRlbC5jb20+ Iik7DQogICAgPiAgICtNT0RVTEVfREVTQ1JJUFRJT04oIkFTUEVFRCBQRUNJIGRyaXZlciIpOw0K ICAgID4gICArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0KICAgID4gICArTU9EVUxFX0lNUE9SVF9O UyhQRUNJKTsNCiAgICA+ICAgLS0gDQogICAgPiAgIDIuMzEuMQ0KDQoNCg0K 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 Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 00823C433F5 for ; Mon, 6 Dec 2021 05:29:06 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4J6sRj1R5yz2ygC for ; Mon, 6 Dec 2021 16:29:05 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=aspeedtech.com header.i=@aspeedtech.com header.a=rsa-sha256 header.s=selector1 header.b=Q9MTJbVn; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=aspeedtech.com (client-ip=40.107.130.97; helo=apc01-hk2-obe.outbound.protection.outlook.com; envelope-from=billy_tsai@aspeedtech.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=aspeedtech.com header.i=@aspeedtech.com header.a=rsa-sha256 header.s=selector1 header.b=Q9MTJbVn; dkim-atps=neutral Received: from APC01-HK2-obe.outbound.protection.outlook.com (mail-eopbgr1300097.outbound.protection.outlook.com [40.107.130.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4J6sQf2bTsz2xrr; Mon, 6 Dec 2021 16:28:06 +1100 (AEDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fK3PaCTOqhmOJUoA1xfYl4/78UcXOzHdew0+rJvtqueJt3SJJLBFa23/+TPUzo9+SZyiucPJNgZceSahckD0BlGgF/koUiPfp4G+3Be5Qw/C/zvQvqRVT2VXa0zR9EmKQ9sEuqZMj8VuOT8u/SteTdkCE78Uu7fwVCfHu5gN2VDk2Gp8/OP76e33LLDHkPmdbMeuDXrSEnv4JqeERlfPMbokHuopniQ5qhp9gXkHQxvTr0oCPQS/BypY53qhuMyAhcpEvG5B7QchykrAheFkqR62mQAyQDT7RsHnso8vjzEanaatvY0S4tzAJZYim8U/AHnVWycuftSyx6kcNGying== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BcR89AI0It8qsYGiFbGIKqCsrMa7lmACFbXFp+yjVIY=; b=aM8D2nuf0GpGYFcEqWkjGY/v2HpbO05cQDe+fmpp4l9Oqq8m27fPjxgP60hLo9d8aIhO4quo9oT7ZkhGyeKQ8hxGZ3YWpvhqCONEog5ZailBVP+D4EOSsoy2mG2X+KmoNDISbFAVMBhuWVSAMvrL7dhDx7qdBfDsVpJyoD4bejCxM9ipH2TJ4W+4NEGwZ6+95f+9Wboz9YscGXjLqHg0urmGWasLyMGsmp8am63hUg+OmhvChVhP4RmvEe3qs9axUHh0F3Gg1HJo4tbqOx9nUlWQ8HgYQFOMmkKrgma1539W6N8qHc1/2ux9soxju7Z3k6Ih/ugKdh6Hxj9TOubG8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BcR89AI0It8qsYGiFbGIKqCsrMa7lmACFbXFp+yjVIY=; b=Q9MTJbVnFIbnqB2n0HCtH0rbwD2ReM7JVjge1Y4n8q/Cy2L6G1kn9eS2+zH6LXmXWMwNqE1vjKu3sFYr92ukBiPILaAwpZwLtCxrWodamVlW4m6mPu579CKM6roIb0ubNmHXxPPxPmTo2X72ajjErIr/8pR8mKFIXVjTuPUIbTipIh0HXbKC81nAJmluT2ogODYKzrAysNYUWSaH3sRcgUI4sUNHReBVYpEmPIomPzNajLdTdgiHdno/EdSF8LgLMYiiUbz1y5TwOfFrIr5fua+WQKTo6uWN+9b1HDPmzXs9JhEjVisFbvGG7cEoiJGq7DhTk6WBT45/I1Fu1QhKLA== Received: from HK0PR06MB3362.apcprd06.prod.outlook.com (2603:1096:203:8b::10) by HK0PR06MB2131.apcprd06.prod.outlook.com (2603:1096:203:4d::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.11; Mon, 6 Dec 2021 05:27:44 +0000 Received: from HK0PR06MB3362.apcprd06.prod.outlook.com ([fe80::7941:2fad:3c82:52eb]) by HK0PR06MB3362.apcprd06.prod.outlook.com ([fe80::7941:2fad:3c82:52eb%3]) with mapi id 15.20.4755.021; Mon, 6 Dec 2021 05:27:44 +0000 From: Billy Tsai To: Iwona Winiarska , "linux-kernel@vger.kernel.org" , "openbmc@lists.ozlabs.org" , Greg Kroah-Hartman Subject: Re: [PATCH v4 05/13] peci: Add peci-aspeed controller driver Thread-Topic: [PATCH v4 05/13] peci: Add peci-aspeed controller driver Thread-Index: AQHX4HQCKrBLVejdoE+1iQYtwHjqf6wliS8A Date: Mon, 6 Dec 2021 05:27:43 +0000 Message-ID: <71D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com> References: <20211123140706.2945700-1-iwona.winiarska@intel.com> <20211123140706.2945700-6-iwona.winiarska@intel.com> In-Reply-To: <20211123140706.2945700-6-iwona.winiarska@intel.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 28b7858c-52d8-438c-6fff-08d9b8792171 x-ms-traffictypediagnostic: HK0PR06MB2131: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:7691; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: UxUIND2oJkfuuyh43fakt1Yy44jNrU1Q1lX36UBcvgvZpE1dGr5vuW4a/B0guk6Hmah9aLnD0NpOCi9qFRTH7eIJchsaflDhUhzCPDLgEipbT0N+xaCKDZ+GecCqjo+XrsigRAe4b8FuGoBRitXAWcaglNzTChM2xaAWl8e29vJpoiFnBhGkcgTLcxUElDN8eSEksbv0vsqGt28Z45LhOKNq+gBalR9MW161J1sz0SW0hflZl1gfGIIIHg6/DoOSxiZiovXZrbQMKl3WXsqxuWNkZrwaXsXupoHzJKqyFmzgvrbm0PZGtj/KhpTC7iKVB1X2dNfEyJ1N677Gd+gQSZych6E+Y6umon0l7J9FogisBPeUfRGCM/NG4duIp5bu5eSqqzROY2UUs5cI14NMLBM9CvwSu8hU3NDjhNaGuScrDpfJeeImjvwtyAZTnF5KEGM4kFY1VkJV+IIT+vuzCL91rRvHbWpgoKq6I2sMD/3FwWEQpyXyZGS2ORnaCI5p+LovyAkKOiuuX0lzKoPFggmRJDAnbR9R4F+BV0520FaKst0vD7NRrHHCHPr7IxdZ4ljdBmHYbNw5E+rpC1u94bAn1b1dbO2HaW5p0EzuMSchNEuZm3yCaWYopOVNsH5Js35c8leEqi9Iqb1l//AFaF03gCO11XTgJSI/HeCzpuqhCjRbBNRbK+NQic0VfGNBP9zoOO7Cm/SybFMREaHkoBwxWIGcu6soVWN71g4jszI1bdIKKcTbldAHfnZGoEUC x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HK0PR06MB3362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(376002)(136003)(346002)(39840400004)(396003)(366004)(66476007)(2906002)(122000001)(66556008)(76116006)(33656002)(54906003)(86362001)(83380400001)(66446008)(30864003)(6512007)(110136005)(66946007)(64756008)(316002)(8936002)(36756003)(7416002)(4326008)(8676002)(26005)(6486002)(38070700005)(38100700002)(71200400001)(2616005)(508600001)(53546011)(6506007)(5660300002)(186003)(45980500001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?QzdVZjBZTFJJNHRoSDV0dzhkOUVYZlVONGR2cjNqV2hRMW85ZWc5VDNMMUNY?= =?utf-8?B?M0tEeU5IOVdNMzBVV2EybEEvYndHSEt3VUtETDJ6bURlTEJaTy9mRjRKVy83?= =?utf-8?B?MnN6WEUrMDhuNDRMS3YzcU9Ja1E1Q1dENHNRY1ZiRnJnNHNEWGoyRTAwcmV6?= =?utf-8?B?K3dJeG5ZWTIxK0MwZHRwTEVlVldvNFBtT2p2UWo4OFhyaEltTnNaTCtJOXlW?= =?utf-8?B?UHNlbmMxRjRxRC9YQ0dab2ZYL2ZKZmwwbVJDbTZyakZVWUtsZW5VU2VYRlpO?= =?utf-8?B?RFpyRm1qMEZMVE9NWXhSZDZ3NDd2Sk9wQ1ZDbVJsTmFreU0xZ2owa1ZDekpi?= =?utf-8?B?VzlrVTk0U3hYY0hEby9WTjBNcFZ2TGZ5ZmtkM1N2S3d6aEFKVHVaTEpvSUlP?= =?utf-8?B?ZmNCQ2VRSTlhSHFLOEF4T2RnbSsycVBSWk9pSm5KeCtMKzMwU3FReDZ2cGl4?= =?utf-8?B?Y2JmdmZnQzVxbzdrVTl4cnlrMHBPS3I3WnNqcERybExVZDVrUnlmbCs2amhy?= =?utf-8?B?TFpkM3pkd05NbkdZZVBPS0sxdDNEbml1VlVtQVBSbVZHUExKMzg1eWpSejRp?= =?utf-8?B?NFF5b3Z6RDgvK1E0aVRKbzFhcnc1T2QvbVFjR29CeHdGZksxTGEyVmd4QU1S?= =?utf-8?B?L3Z3eDlGKzdidUU1Y2FINWo2c1U2UXRMSXFRdVVXRGxzelk3bE9JcWNnN1Ix?= =?utf-8?B?eWN2M3ErSFc2MlRoQUNpRXBEQkJyeGhxRXRyNXFaN0U2WVhzZUhYNzloK2Rq?= =?utf-8?B?aTluTnJZYXc0OVlqK2hLWkpDcHNvcVl2bDZkdVFsSGFnV3pGNDF5MzYzbmRr?= =?utf-8?B?bm0zeHZFWVhOUXJpZVhGUlN1aENxUExPYVcrSkt3clVlTEIvb25PdGNaL3lR?= =?utf-8?B?NFgyNmFUYjNpWmloMHcyaWxHSWU1WEdKTTlqTlhUV1JmQTVSWkVsL3dmQWJo?= =?utf-8?B?aE5ISDRSTDlsSVloUWZrbWliTnI3OUVKTlF6MjVOMGNnbXlBbkkva3N4ZDVh?= =?utf-8?B?RHRycFF1RzhEUHZPRm5MdVNKVWxIcmRjSitqckhCM3gzOGl0VW9tMFArZXlO?= =?utf-8?B?dkN6aHNreHZ6R2lGS0xCUFc4ME1abERtT1pUbHVKREF2ZTN2Y3c0ZWZyanhN?= =?utf-8?B?OG8rMldrMUVudXhCVnJUUEtaZk1lWUVkZ2pjR2xDdzI3UVJ5OWFNSGFRMGQ3?= =?utf-8?B?SC9WN3M2bnJsdG1nVEpPZVNHOHZwTnhlNTJVT2dNYU8yeXQwYVRwUzVUalZs?= =?utf-8?B?em9SdTlwRkVKVXgzQUtHaDNxUklRY1pTMkdveGo0WGhyTk12anJKK3dPTE93?= =?utf-8?B?WmN2Z1FOdHZkbndMSEVpNVplYkpvMlJHTEFpcndndlQ0RkcxNzBIelM2NGFz?= =?utf-8?B?T0lWclg4TDBSZ2xzOHVscXpuVFZ5WTFJcjRSd1JkK2JUOGxabExPMWlxb0c5?= =?utf-8?B?YmtOSGVtOThHUWFudnprL0tWWW9iM2loclZzQ0dOY2xSOW5SZ2hnQVo3TmVo?= =?utf-8?B?Z0pRMEY1QjN2dHV0N0JTN1RqMnJFbmdlLzN6TitnTDFXRUh1aWZzMHp5SnBi?= =?utf-8?B?V1U5aWMzTzJFb1NCQmQ5QW5PQzVWcDNDQjZ4bFVFZG9pZmc1NTE3bkpmRjlm?= =?utf-8?B?YVZJR0J1M0pZeHB2TnRNZG90V0VsV2J2cXRSYjloR2g2dFN3a29SL2VocXdD?= =?utf-8?B?cVBkb1JpNlNOUmpEMlNwbU9QWnIvK2szOFVKaVRXQlIwZ0I1WC9UQTdTOU56?= =?utf-8?B?azRrR0hDcnVyaEJvR0xXWGwwdnFzRlNlZTZFRXFTbFpuLzh4RXUzeWRERjNR?= =?utf-8?B?WUJuYUlBbE1VTXNieTVpN2g5My8vMmdKZ3BZcHNCK3Jpa2t1SWFVU01ieUpP?= =?utf-8?B?SWFtNDNqR2UvNi9kYzBvR3d0M0hUOUxUMnZTVFhtK0tWVlp2MSt1Tkg4UUpI?= =?utf-8?B?a2F2anVhK25kdmVad1Z2dWFYbUtLSjJ1N0V4dTNPYTBiN0V1U0R4d3BzdkVp?= =?utf-8?B?TVJlSmhJbVBpVFd5MXhRZkNENFUyMWUvMm96c05WK0E2ZktxMGorUXcxOTBL?= =?utf-8?B?WnN5TG5kTzNqRGNJa3plRUZvOE12eExxZ3FDTEZYVHdQY1JJM0VOdHBFaHFh?= =?utf-8?B?SGZ3bGlwOU5CdmpzK2hNMkR4M3d2aGcyTXo2dmpTcjBKeEdQbTR2WWlmZ1Zp?= =?utf-8?B?b3VmSDlJQlI5S2FqcVJhenc3SG92a2dYb3lYSXB4NDNTTEdxNGVxNXlrd253?= =?utf-8?Q?JkMGYCS+ggYzmU4l3098j9nF3sPQvlkoD5K01hBcbg=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <8B4465647D56A94D95CFDE63A9974F3A@apcprd06.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: HK0PR06MB3362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 28b7858c-52d8-438c-6fff-08d9b8792171 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Dec 2021 05:27:43.9202 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: P9AyKL+x7asX3CIWmu1udcE2EnaX5MryMtjh31ns3azWyCEfBM1aTRNHF0KJUAC5hRBHclsfGn+fBC2Cp0S+NrlQKW9l/GnNBLQZ98itta4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK0PR06MB2131 X-BeenThere: openbmc@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development list for OpenBMC List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "linux-hwmon@vger.kernel.org" , "devicetree@vger.kernel.org" , Jae Hyun Yoo , Jean Delvare , Randy Dunlap , Arnd Bergmann , "linux-aspeed@lists.ozlabs.org" , Jonathan Corbet , Andrew Jeffery , "linux-doc@vger.kernel.org" , Pierre-Louis Bossart , Dave Hansen , Rob Herring , Borislav Petkov , "linux-arm-kernel@lists.infradead.org" , Tony Luck , Olof Johansson , Dan Williams , Andy Shevchenko , Guenter Roeck , Zev Weiss Errors-To: openbmc-bounces+openbmc=archiver.kernel.org@lists.ozlabs.org Sender: "openbmc" SGksDQoNCkFmdGVyIHJldmlld2luZyB0aGUgcGF0Y2gsIEkgaGF2ZSBzb21lIHN1Z2dlc3Rpb25z IGZvciB5b3UuIFBsZWFzZSBzZWUgdGhlIHJlcGx5IGlubGluZS4NCg0KT24gMjAyMS8xMS8yMywg MTA6MTEgUE0sICJvcGVuYm1jIG9uIGJlaGFsZiBvZiBJd29uYSBXaW5pYXJza2EiIDxvcGVuYm1j LWJvdW5jZXMrYmlsbHlfdHNhaT1hc3BlZWR0ZWNoLmNvbUBsaXN0cy5vemxhYnMub3JnIG9uIGJl aGFsZiBvZiBpd29uYS53aW5pYXJza2FAaW50ZWwuY29tPiB3cm90ZToNCg0KICAgID4gICBGcm9t OiBKYWUgSHl1biBZb28gPGphZS5oeXVuLnlvb0BsaW51eC5pbnRlbC5jb20+DQpBZGQgdGhlIGRl ZmluZSBmb3IgdGhlIGJ1cyBmcmVxdWVuY3kNCiAgICAgICAgI2RlZmluZSBBU1BFRURfUEVDSV9C VVNfRlJFUVVFTkNZX01JTgkJMjAwMA0KICAgICAgICAjZGVmaW5lIEFTUEVFRF9QRUNJX0JVU19G UkVRVUVOQ1lfREVGQVVMVAkyMDAwDQogICAgICAgICNkZWZpbmUgQVNQRUVEX1BFQ0lfQlVTX0ZS RVFVRU5DWV9NQVgJCTEwMDAwMDANCg0KICAgPiAgICtzdHJ1Y3QgYXNwZWVkX3BlY2kgew0KICAg ID4gICArCXN0cnVjdCBwZWNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7DQogICAgPiAgICsJc3Ry dWN0IGRldmljZSAqZGV2Ow0KICAgID4gICArCXZvaWQgX19pb21lbSAqYmFzZTsNCiAgICA+ICAg KwlzdHJ1Y3QgY2xrICpjbGs7DQogICAgPiAgICsJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJzdDsN CiAgICA+ICAgKwlpbnQgaXJxOw0KICAgID4gICArCXNwaW5sb2NrX3QgbG9jazsgLyogdG8gc3lu YyBjb21wbGV0aW9uIHN0YXR1cyBoYW5kbGluZyAqLw0KICAgID4gICArCXN0cnVjdCBjb21wbGV0 aW9uIHhmZXJfY29tcGxldGU7DQogICAgPiAgICsJdTMyIHN0YXR1czsNCiAgICA+ICAgKwl1MzIg Y21kX3RpbWVvdXRfbXM7DQogICAgPiAgICsJdTMyIG1zZ190aW1pbmc7DQogICAgPiAgICsJdTMy IGFkZHJfdGltaW5nOw0KICAgID4gICArCXUzMiByZF9zYW1wbGluZ19wb2ludDsNCiAgICA+ICAg Kwl1MzIgY2xrX2RpdjsNCg0KQWRkIHRoZSBwYXJlbWV0ZXIgdG8gc3RvcmUgdGhlIGJ1c19mcmVx IGZyb20gdGhlIGR0cyBwcm9wZXJ0eQ0KICAgICAgICB1MzIgYnVzX2ZyZXE7DQoNCiAgICA+ICAg K307DQogICAgPiAgICsNCiAgICA+ICAgK3N0YXRpYyB2b2lkIGFzcGVlZF9wZWNpX2luaXRfcmVn cyhzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXYpDQogICAgPiAgICt7DQogICAgPiAgICsJdTMyIHZh bDsNCiAgICA+ICAgKw0KICAgID4gICArCXZhbCA9IEZJRUxEX1BSRVAoQVNQRUVEX1BFQ0lfQ1RS TF9DTEtfRElWX01BU0ssIEFTUEVFRF9QRUNJX0NMS19ESVZfREVGQVVMVCk7DQogICAgPiAgICsJ dmFsIHw9IEFTUEVFRF9QRUNJX0NUUkxfUEVDSV9DTEtfRU47DQogICAgPiAgICsJd3JpdGVsKHZh bCwgcHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX0NUUkwpOw0KICAgID4gICArCS8qDQogICAgPiAg ICsJICogVGltaW5nIG5lZ290aWF0aW9uIHBlcmlvZCBzZXR0aW5nLg0KICAgID4gICArCSAqIFRo ZSB1bml0IG9mIHRoZSBwcm9ncmFtbWVkIHZhbHVlIGlzIDQgdGltZXMgb2YgUEVDSSBjbG9jayBw ZXJpb2QuDQogICAgPiAgICsJICovDQogICAgPiAgICsJdmFsID0gRklFTERfUFJFUChBU1BFRURf UEVDSV9UX05FR09fTVNHX01BU0ssIHByaXYtPm1zZ190aW1pbmcpOw0KICAgID4gICArCXZhbCB8 PSBGSUVMRF9QUkVQKEFTUEVFRF9QRUNJX1RfTkVHT19BRERSX01BU0ssIHByaXYtPmFkZHJfdGlt aW5nKTsNCiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfVElN SU5HX05FR09USUFUSU9OKTsNCiAgICA+ICAgKw0KICAgID4gICArCS8qIENsZWFyIGludGVycnVw dHMgKi8NCiAgICA+ICAgKwl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfSU5U X1NUUykgfCBBU1BFRURfUEVDSV9JTlRfTUFTSzsNCiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2 LT5iYXNlICsgQVNQRUVEX1BFQ0lfSU5UX1NUUyk7DQogICAgPiAgICsNCiAgICA+ICAgKwkvKiBT ZXQgdGltaW5nIG5lZ290aWF0aW9uIG1vZGUgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovDQogICAg PiAgICsJdmFsID0gRklFTERfUFJFUChBU1BFRURfUEVDSV9USU1JTkdfTkVHT19TRUxfTUFTSywg QVNQRUVEX1BFQ0lfMVNUX0JJVF9PRl9BRERSX05FR08pOw0KICAgID4gICArCXZhbCB8PSBBU1BF RURfUEVDSV9JTlRfTUFTSzsNCiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgQVNQ RUVEX1BFQ0lfSU5UX0NUUkwpOw0KICAgID4gICArDQogICAgPiAgICsJdmFsID0gRklFTERfUFJF UChBU1BFRURfUEVDSV9DVFJMX1NBTVBMSU5HX01BU0ssIHByaXYtPnJkX3NhbXBsaW5nX3BvaW50 KTsNCiAgICA+ICAgKwl2YWwgfD0gRklFTERfUFJFUChBU1BFRURfUEVDSV9DVFJMX0NMS19ESVZf TUFTSywgcHJpdi0+Y2xrX2Rpdik7DQogICAgPiAgICsJdmFsIHw9IEFTUEVFRF9QRUNJX0NUUkxf UEVDSV9FTjsNCiAgICA+ICAgKwl2YWwgfD0gQVNQRUVEX1BFQ0lfQ1RSTF9QRUNJX0NMS19FTjsN CiAgICA+ICAgKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfQ1RSTCk7DQog ICAgPiAgICt9DQogICAgPiAgICsNCiAgICA+ICAgK3N0YXRpYyBpbmxpbmUgaW50IGFzcGVlZF9w ZWNpX2NoZWNrX2lkbGUoc3RydWN0IGFzcGVlZF9wZWNpICpwcml2KQ0KICAgID4gICArew0KICAg ID4gICArCXUzMiBjbWRfc3RzID0gcmVhZGwocHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX0NNRCk7 DQogICAgPiAgICsNCiAgICA+ICAgKwlpZiAoRklFTERfR0VUKEFTUEVFRF9QRUNJX0NNRF9TVFNf TUFTSywgY21kX3N0cykgPT0gQVNQRUVEX1BFQ0lfQ01EX1NUU19BRERSX1RfTkVHTykNCiAgICA+ ICAgKwkJYXNwZWVkX3BlY2lfaW5pdF9yZWdzKHByaXYpOw0KDQpBcyBsb25nIGFzIHRoZSBzdGF0 ZSBpcyBub3QgaWRsZSwgdGhlIGNvbnRyb2xsZXIgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIFBF Q0kgcmVnaXN0ZXIgZm9yIHNvbHZpbmcgdGhlIFBFQ0kgY29udHJvbGxlciBoYW5nLg0KQmVmb3Jl IGFzdDI2MDBBMywgdGhlIGNvbnRyb2xsZXIgc2hvdWxkIGFzc2VydC9kZS1hc3NlcnQgdGhlIHJl c2V0IGZvciBzb2x2aW5nIHRoZSBoYW5nIGlzc3VlLg0KRm9yIGJhY2t3YXJkIGNvbXBhdGlibGUs IEkgc3VnZ2VzdCB0byBhZGQgdGhlIHJlc2V0IGFzc2VydC9kZS1hc3NlcnQgaW4gdGhpcyBwbGFj ZS4NCiAgICAgICAgaWYgKEZJRUxEX0dFVChBU1BFRURfUEVDSV9DTURfU1RTX01BU0ssIGNtZF9z dHMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXNldF9jb250cm9sX2Fzc2VydChwcml2 LT5yc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfY29udHJvbF9kZWFzc2VydChw cml2LT5yc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWVkX3BlY2lfaW5pdF9yZWdz KHByaXYpOw0KICAgICAgICB9DQoNCiAgICA+ICAgKwlyZXR1cm4gcmVhZGxfcG9sbF90aW1lb3V0 KHByaXYtPmJhc2UgKyBBU1BFRURfUEVDSV9DTUQsDQogICAgPiAgICsJCQkJICBjbWRfc3RzLA0K ICAgID4gICArCQkJCSAgIShjbWRfc3RzICYgQVNQRUVEX1BFQ0lfQ01EX0lETEVfTUFTSyksDQog ICAgPiAgICsJCQkJICBBU1BFRURfUEVDSV9JRExFX0NIRUNLX0lOVEVSVkFMX1VTLA0KICAgID4g ICArCQkJCSAgQVNQRUVEX1BFQ0lfSURMRV9DSEVDS19USU1FT1VUX1VTKTsNCiAgICA+ICAgK30N CiAgICA+ICAgKw0KICAgID4gICArc3RhdGljIGludCBhc3BlZWRfcGVjaV94ZmVyKHN0cnVjdCBw ZWNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsDQogICAgPiAgICsJCQkgICAgdTggYWRkciwgc3Ry dWN0IHBlY2lfcmVxdWVzdCAqcmVxKQ0KICAgID4gICArew0KICAgID4gICArCXN0cnVjdCBhc3Bl ZWRfcGVjaSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShjb250cm9sbGVyLT5kZXYucGFyZW50KTsN CiAgICA+ICAgKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHByaXYt PmNtZF90aW1lb3V0X21zKTsNCiAgICA+ICAgKwl1MzIgcGVjaV9oZWFkOw0KICAgID4gICArCWlu dCByZXQ7DQogICAgPiAgICsNCiAgICA+ICAgKwlpZiAocmVxLT50eC5sZW4gPiBBU1BFRURfUEVD SV9EQVRBX0JVRl9TSVpFX01BWCB8fA0KICAgID4gICArCSAgICByZXEtPnJ4LmxlbiA+IEFTUEVF RF9QRUNJX0RBVEFfQlVGX1NJWkVfTUFYKQ0KICAgID4gICArCQlyZXR1cm4gLUVJTlZBTDsNCiAg ICA+ICAgKw0KICAgID4gICArCS8qIENoZWNrIGNvbW1hbmQgc3RzIGFuZCBidXMgaWRsZSBzdGF0 ZSAqLw0KICAgID4gICArCXJldCA9IGFzcGVlZF9wZWNpX2NoZWNrX2lkbGUocHJpdik7DQogICAg PiAgICsJaWYgKHJldCkNCiAgICA+ICAgKwkJcmV0dXJuIHJldDsgLyogLUVUSU1FRE9VVCAqLw0K ICAgID4gICArDQogICAgPiAgICsJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7DQogICAgPiAg ICsJcmVpbml0X2NvbXBsZXRpb24oJnByaXYtPnhmZXJfY29tcGxldGUpOw0KICAgID4gICArDQog ICAgPiAgICsJcGVjaV9oZWFkID0gRklFTERfUFJFUChBU1BFRURfUEVDSV9UQVJHRVRfQUREUl9N QVNLLCBhZGRyKSB8DQogICAgPiAgICsJCSAgICBGSUVMRF9QUkVQKEFTUEVFRF9QRUNJX1dSX0xF Tl9NQVNLLCByZXEtPnR4LmxlbikgfA0KICAgID4gICArCQkgICAgRklFTERfUFJFUChBU1BFRURf UEVDSV9SRF9MRU5fTUFTSywgcmVxLT5yeC5sZW4pOw0KICAgID4gICArDQogICAgPiAgICsJd3Jp dGVsKHBlY2lfaGVhZCwgcHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX1JXX0xFTkdUSCk7DQogICAg PiAgICsNCiAgICA+ICAgKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfV1Jf REFUQTAsIHJlcS0+dHguYnVmLCBtaW5fdCh1OCwgcmVxLT50eC5sZW4sIDE2KSk7DQogICAgPiAg ICsJaWYgKHJlcS0+dHgubGVuID4gMTYpDQogICAgPiAgICsJCW1lbWNweV90b2lvKHByaXYtPmJh c2UgKyBBU1BFRURfUEVDSV9XUl9EQVRBNCwgcmVxLT50eC5idWYgKyAxNiwNCiAgICA+ICAgKwkJ CSAgICByZXEtPnR4LmxlbiAtIDE2KTsNCiAgICA+ICAgKw0KICAgID4gICArI2lmIElTX0VOQUJM RUQoQ09ORklHX0RZTkFNSUNfREVCVUcpDQogICAgPiAgICsJZGV2X2RiZyhwcml2LT5kZXYsICJI RUFEIDogJSMwOHhcbiIsIHBlY2lfaGVhZCk7DQogICAgPiAgICsJcHJpbnRfaGV4X2R1bXBfYnl0 ZXMoIlRYIDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgcmVxLT50eC5idWYsIHJlcS0+dHgubGVuKTsN CiAgICA+ICAgKyNlbmRpZg0KICAgID4gICArCXByaXYtPnN0YXR1cyA9IDA7DQogICAgPiAgICsJ d3JpdGVsKEFTUEVFRF9QRUNJX0NNRF9GSVJFLCBwcml2LT5iYXNlICsgQVNQRUVEX1BFQ0lfQ01E KTsNCiAgICA+ICAgKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOw0KICAgID4gICArDQog ICAgPiAgICsJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQo JnByaXYtPnhmZXJfY29tcGxldGUsIHRpbWVvdXQpOw0KICAgID4gICArCWlmIChyZXQgPCAwKQ0K ICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAgID4gICArDQogICAgPiAgICsJaWYgKHJldCA9PSAw KSB7DQogICAgPiAgICsJCWRldl9kYmcocHJpdi0+ZGV2LCAiVGltZW91dCB3YWl0aW5nIGZvciBh IHJlc3BvbnNlIVxuIik7DQpkZXZfZXJyPw0KICAgID4gICArCQlyZXR1cm4gLUVUSU1FRE9VVDsN CiAgICA+ICAgKwl9DQogICAgPiAgICsNCiAgICA+ICAgKwlzcGluX2xvY2tfaXJxKCZwcml2LT5s b2NrKTsNCiAgICA+ICAgKw0KICAgID4gICArCWlmIChwcml2LT5zdGF0dXMgIT0gQVNQRUVEX1BF Q0lfSU5UX0NNRF9ET05FKSB7DQogICAgPiAgICsJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9j ayk7DQogICAgPiAgICsJCWRldl9kYmcocHJpdi0+ZGV2LCAiTm8gdmFsaWQgcmVzcG9uc2UsIHN0 YXR1czogJSMwMnhcbiIsIHByaXYtPnN0YXR1cyk7DQpkZXZfZXJyPw0KICAgID4gICArCQlyZXR1 cm4gLUVJTzsNCiAgICA+ICAgKwl9DQogICAgPiAgICsNCiAgICA+ICAgKwlzcGluX3VubG9ja19p cnEoJnByaXYtPmxvY2spOw0KICAgID4gICArDQogICAgPiAgICsJbWVtY3B5X2Zyb21pbyhyZXEt PnJ4LmJ1ZiwgcHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX1JEX0RBVEEwLCBtaW5fdCh1OCwgcmVx LT5yeC5sZW4sIDE2KSk7DQogICAgPiAgICsJaWYgKHJlcS0+cngubGVuID4gMTYpDQogICAgPiAg ICsJCW1lbWNweV9mcm9taW8ocmVxLT5yeC5idWYgKyAxNiwgcHJpdi0+YmFzZSArIEFTUEVFRF9Q RUNJX1JEX0RBVEE0LA0KICAgID4gICArCQkJICAgICAgcmVxLT5yeC5sZW4gLSAxNik7DQogICAg PiAgICsNCiAgICA+ICAgKyNpZiBJU19FTkFCTEVEKENPTkZJR19EWU5BTUlDX0RFQlVHKQ0KICAg ID4gICArCXByaW50X2hleF9kdW1wX2J5dGVzKCJSWCA6ICIsIERVTVBfUFJFRklYX05PTkUsIHJl cS0+cnguYnVmLCByZXEtPnJ4Lmxlbik7DQogICAgPiAgICsjZW5kaWYNCiAgICA+ICAgKwlyZXR1 cm4gMDsNCiAgICA+ICAgK30NCiAgICA+ICAgKw0KICAgID4gICArc3RhdGljIGlycXJldHVybl90 IGFzcGVlZF9wZWNpX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykNCiAgICA+ICAgK3sN CiAgICA+ICAgKwlzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXYgPSBhcmc7DQogICAgPiAgICsJdTMy IHN0YXR1czsNCiAgICA+ICAgKw0KICAgID4gICArCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7DQog ICAgPiAgICsJc3RhdHVzID0gcmVhZGwocHJpdi0+YmFzZSArIEFTUEVFRF9QRUNJX0lOVF9TVFMp Ow0KICAgID4gICArCXdyaXRlbChzdGF0dXMsIHByaXYtPmJhc2UgKyBBU1BFRURfUEVDSV9JTlRf U1RTKTsNCiAgICA+ICAgKwlwcml2LT5zdGF0dXMgfD0gKHN0YXR1cyAmIEFTUEVFRF9QRUNJX0lO VF9NQVNLKTsNCiAgICA+ICAgKw0KICAgID4gICArCS8qDQogICAgPiAgICsJICogQWxsIGNvbW1h bmRzIHNob3VsZCBiZSBlbmRlZCB1cCB3aXRoIGEgQVNQRUVEX1BFQ0lfSU5UX0NNRF9ET05FIGJp dA0KICAgID4gICArCSAqIHNldCBldmVuIGluIGFuIGVycm9yIGNhc2UuDQogICAgPiAgICsJICov DQogICAgPiAgICsJaWYgKHN0YXR1cyAmIEFTUEVFRF9QRUNJX0lOVF9DTURfRE9ORSkNCiAgICA+ ICAgKwkJY29tcGxldGUoJnByaXYtPnhmZXJfY29tcGxldGUpOw0KICAgID4gICArDQogICAgPiAg ICsJd3JpdGVsKDAsIHByaXYtPmJhc2UgKyBBU1BFRURfUEVDSV9DTUQpOw0KICAgID4gICArDQog ICAgPiAgICsJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOw0KICAgID4gICArDQogICAgPiAgICsJ cmV0dXJuIElSUV9IQU5ETEVEOw0KICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAgICtzdGF0 aWMgdm9pZCBhc3BlZWRfcGVjaV9wcm9wZXJ0eV9zYW5pdGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYs IGNvbnN0IGNoYXIgKnByb3BuYW1lLA0KICAgID4gICArCQkJCQkgIHUzMiBtaW4sIHUzMiBtYXgs IHUzMiBkZWZhdWx0X3ZhbCwgdTMyICpwcm9wdmFsKQ0KICAgID4gICArew0KICAgID4gICArCXUz MiB2YWw7DQogICAgPiAgICsJaW50IHJldDsNCiAgICA+ICAgKw0KICAgID4gICArCXJldCA9IGRl dmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsIHByb3BuYW1lLCAmdmFsKTsNCiAgICA+ICAgKwlp ZiAocmV0KSB7DQogICAgPiAgICsJCXZhbCA9IGRlZmF1bHRfdmFsOw0KICAgID4gICArCX0gZWxz ZSBpZiAodmFsID4gbWF4IHx8IHZhbCA8IG1pbikgew0KICAgID4gICArCQlkZXZfd2FybihkZXYs ICJJbnZhbGlkICVzOiAldSwgZmFsbGluZyBiYWNrIHRvOiAldVxuIiwNCiAgICA+ICAgKwkJCSBw cm9wbmFtZSwgdmFsLCBkZWZhdWx0X3ZhbCk7DQogICAgPiAgICsNCiAgICA+ICAgKwkJdmFsID0g ZGVmYXVsdF92YWw7DQogICAgPiAgICsJfQ0KICAgID4gICArDQogICAgPiAgICsJKnByb3B2YWwg PSB2YWw7DQogICAgPiAgICt9DQogICAgPiAgICsNCiAgICA+ICAgK3N0YXRpYyB2b2lkIGFzcGVl ZF9wZWNpX3Byb3BlcnR5X3NldHVwKHN0cnVjdCBhc3BlZWRfcGVjaSAqcHJpdikNCiAgICA+ICAg K3sNCiAgICA+ICAgKwlhc3BlZWRfcGVjaV9wcm9wZXJ0eV9zYW5pdGl6ZShwcml2LT5kZXYsICJh c3BlZWQsY2xvY2stZGl2aWRlciIsDQogICAgPiAgICsJCQkJICAgICAgMCwgQVNQRUVEX1BFQ0lf Q0xLX0RJVl9NQVgsDQogICAgPiAgICsJCQkJICAgICAgQVNQRUVEX1BFQ0lfQ0xLX0RJVl9ERUZB VUxULCAmcHJpdi0+Y2xrX2Rpdik7DQogICAgPiAgICsJYXNwZWVkX3BlY2lfcHJvcGVydHlfc2Fu aXRpemUocHJpdi0+ZGV2LCAiYXNwZWVkLG1zZy10aW1pbmciLA0KICAgID4gICArCQkJCSAgICAg IDAsIEFTUEVFRF9QRUNJX01TR19USU1JTkdfTUFYLA0KICAgID4gICArCQkJCSAgICAgIEFTUEVF RF9QRUNJX01TR19USU1JTkdfREVGQVVMVCwgJnByaXYtPm1zZ190aW1pbmcpOw0KICAgID4gICAr CWFzcGVlZF9wZWNpX3Byb3BlcnR5X3Nhbml0aXplKHByaXYtPmRldiwgImFzcGVlZCxhZGRyLXRp bWluZyIsDQogICAgPiAgICsJCQkJICAgICAgMCwgQVNQRUVEX1BFQ0lfQUREUl9USU1JTkdfTUFY LA0KICAgID4gICArCQkJCSAgICAgIEFTUEVFRF9QRUNJX0FERFJfVElNSU5HX0RFRkFVTFQsICZw cml2LT5hZGRyX3RpbWluZyk7DQoNClVzZSB0aGUgYnVzLWZyZXF1ZW5jeSB0byByZXBsYWNlIHRo ZSBwcm9wZXJ0eSBhYm92ZToNCiAgICAgICAgYXNwZWVkX3BlY2lfcHJvcGVydHlfc2FuaXRpemUo cHJpdi0+ZGV2LCAiYnVzLWZyZXF1ZW5jeSIsDQoJCQkJQVNQRUVEX1BFQ0lfQlVTX0ZSRVFVRU5D WV9NSU4sIEFTUEVFRF9QRUNJX0JVU19GUkVRVUVOQ1lfTUFYLA0KCQkJCUFTUEVFRF9QRUNJX0JV U19GUkVRVUVOQ1lfREVGQVVMVCwgJnByaXYtPmJ1c19mcmVxKTsNCg0KICAgID4gICArCWFzcGVl ZF9wZWNpX3Byb3BlcnR5X3Nhbml0aXplKHByaXYtPmRldiwgImFzcGVlZCxyZC1zYW1wbGluZy1w b2ludCIsDQogICAgPiAgICsJCQkJICAgICAgMCwgQVNQRUVEX1BFQ0lfUkRfU0FNUExJTkdfUE9J TlRfTUFYLA0KICAgID4gICArCQkJCSAgICAgIEFTUEVFRF9QRUNJX1JEX1NBTVBMSU5HX1BPSU5U X0RFRkFVTFQsDQogICAgPiAgICsJCQkJICAgICAgJnByaXYtPnJkX3NhbXBsaW5nX3BvaW50KTsN CiAgICA+ICAgKwlhc3BlZWRfcGVjaV9wcm9wZXJ0eV9zYW5pdGl6ZShwcml2LT5kZXYsICJjbWQt dGltZW91dC1tcyIsDQogICAgPiAgICsJCQkJICAgICAgMSwgQVNQRUVEX1BFQ0lfQ01EX1RJTUVP VVRfTVNfTUFYLA0KICAgID4gICArCQkJCSAgICAgIEFTUEVFRF9QRUNJX0NNRF9USU1FT1VUX01T X0RFRkFVTFQsICZwcml2LT5jbWRfdGltZW91dF9tcyk7DQogICAgPiAgICt9DQpBZGQgdGhlIGZ1 bmN0aW9uIG9mIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRpbmcgdGhlIHNldHRpbmdzIHRvIGFkYXB0 IHRvIHRoZSBidXMgZnJlcXVlbmN5Lg0KICAgICAgICBzdGF0aWMgdm9pZCBhc3BlZWRfcGVjaV9i dXNfZnJlcV9zZXR1cChzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXYpDQogICAgICAgIHsNCiAgICAg ICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNyY19jbGtfcmF0ZTsNCiAgICAgICAgICAgICAgICBp bnQgZGVsdGFfdmFsdWUsIGRlbHRhX3RtcCwgY2xrX2Rpdmlzb3IsIGNsa19kaXZpc29yX3RtcDsN CiAgICAgICAgICAgICAgICB1MzIgbXNnX3RpbWluZywgY2xrX2RpdjsNCg0KICAgICAgICAgICAg ICAgIHNyY19jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOw0KDQogICAgICAgICAg ICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQRUNJIGJ1cyBmcmVxICA9IChzb3VyY2UgY2xr IHJhdGUpIC8gKDQgKiAoUEVDSTA0WzE1OjhdKjQrMSkgKiAoMSA8PCBQRUNJMDBbMTA6OF0pKQ0K ICAgICAgICAgICAgICAgICAqICgxIDw8IFBFQ0kwMFsxMDo4XSkgKiAoUEVDSTA0WzE1OjhdKjQr MSkgPSAoc291cmNlIGNsayByYXRlKSAvICg0ICogUEVDSSBidXMgZnJlcSApDQogICAgICAgICAg ICAgICAgICovDQogICAgICAgICAgICAgICAgY2xrX2Rpdmlzb3IgPSBzcmNfY2xrX3JhdGUgLyAo NCAqIHByaXYtPmJ1c19mcmVxKTsNCiAgICAgICAgICAgICAgICBkZWx0YV92YWx1ZSA9IGNsa19k aXZpc29yOw0KICAgICAgICAgICAgICAgIC8qIEZpbmQgdGhlIGNsb3Nlc3QgZGl2aXNvciBmb3Ig YnVzLWZyZXF1ZW5jeSAqLw0KICAgICAgICAgICAgICAgIGZvciAobXNnX3RpbWluZyA9IDE7IG1z Z190aW1pbmcgPD0gMjU1OyBtc2dfdGltaW5nKyspDQogICAgICAgICAgICAgICAgICAgICAgICBm b3IgKGNsa19kaXYgPSAwOyBjbGtfZGl2IDwgNzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY2xrX2RpdisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsa19k aXZpc29yX3RtcCA9ICgxIDw8IGNsa19kaXYpICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChtc2dfdGltaW5nICogNCArIDEpOw0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZWx0YV90bXAgPSBhYnMoY2xrX2Rpdmlzb3IgLSBjbGtfZGl2 aXNvcl90bXApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFfdG1w IDwgZGVsdGFfdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBkZWx0YV92YWx1ZSA9IGRlbHRhX3RtcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcml2LT5tc2dfdGltaW5nID0gbXNnX3RpbWluZzsNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5hZGRyX3RpbWluZyA9IHByaXYtPm1zZ190 aW1pbmc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Y2xr X2RpdiA9IGNsa19kaXY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAg ICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgPiAgICsNCiAgICA+ICAgK3N0 YXRpYyBzdHJ1Y3QgcGVjaV9jb250cm9sbGVyX29wcyBhc3BlZWRfb3BzID0gew0KICAgID4gICAr CS54ZmVyID0gYXNwZWVkX3BlY2lfeGZlciwNCiAgICA+ICAgK307DQogICAgPiAgICsNCiAgICA+ ICAgK3N0YXRpYyB2b2lkIGFzcGVlZF9wZWNpX3Jlc2V0X2NvbnRyb2xfcmVsZWFzZSh2b2lkICpk YXRhKQ0KICAgID4gICArew0KICAgID4gICArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGRhdGEpOw0K ICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAgICtzdGF0aWMgaW50IGRldm1fYXNwZWVkX3Bl Y2lfcmVzZXRfY29udHJvbF9kZWFzc2VydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNl dF9jb250cm9sICpyc3QpDQogICAgPiAgICt7DQogICAgPiAgICsJaW50IHJldDsNCiAgICA+ICAg Kw0KICAgID4gICArCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocnN0KTsNCiAgICA+ICAg KwlpZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAgID4gICArDQogICAgPiAgICsJ cmV0dXJuIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGFzcGVlZF9wZWNpX3Jlc2V0X2Nv bnRyb2xfcmVsZWFzZSwgcnN0KTsNCiAgICA+ICAgK30NCiAgICA+ICAgKw0KICAgID4gICArc3Rh dGljIHZvaWQgYXNwZWVkX3BlY2lfY2xrX3JlbGVhc2Uodm9pZCAqZGF0YSkNCiAgICA+ICAgK3sN CiAgICA+ICAgKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YSk7DQogICAgPiAgICt9DQogICAg PiAgICsNCiAgICA+ICAgK3N0YXRpYyBpbnQgZGV2bV9hc3BlZWRfcGVjaV9jbGtfZW5hYmxlKHN0 cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGNsayAqY2xrKQ0KICAgID4gICArew0KICAgID4gICAr CWludCByZXQ7DQogICAgPiAgICsNCiAgICA+ICAgKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUo Y2xrKTsNCiAgICA+ICAgKwlpZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAgID4g ICArDQogICAgPiAgICsJcmV0dXJuIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIGFzcGVl ZF9wZWNpX2Nsa19yZWxlYXNlLCBjbGspOw0KICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAg ICtzdGF0aWMgaW50IGFzcGVlZF9wZWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpDQogICAgPiAgICt7DQogICAgPiAgICsJc3RydWN0IHBlY2lfY29udHJvbGxlciAqY29udHJv bGxlcjsNCiAgICA+ICAgKwlzdHJ1Y3QgYXNwZWVkX3BlY2kgKnByaXY7DQogICAgPiAgICsJaW50 IHJldDsNCiAgICA+ICAgKw0KICAgID4gICArCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRl diwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7DQogICAgPiAgICsJaWYgKCFwcml2KQ0KICAg ID4gICArCQlyZXR1cm4gLUVOT01FTTsNCiAgICA+ICAgKw0KICAgID4gICArCXByaXYtPmRldiA9 ICZwZGV2LT5kZXY7DQogICAgPiAgICsJZGV2X3NldF9kcnZkYXRhKHByaXYtPmRldiwgcHJpdik7 DQogICAgPiAgICsNCiAgICA+ICAgKwlwcml2LT5iYXNlID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFw X3Jlc291cmNlKHBkZXYsIDApOw0KICAgID4gICArCWlmIChJU19FUlIocHJpdi0+YmFzZSkpDQog ICAgPiAgICsJCXJldHVybiBQVFJfRVJSKHByaXYtPmJhc2UpOw0KICAgID4gICArDQogICAgPiAg ICsJcHJpdi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsNCiAgICA+ICAgKwlpZiAo IXByaXYtPmlycSkNCiAgICA+ICAgKwkJcmV0dXJuIHByaXYtPmlycTsNCiAgICA+ICAgKw0KICAg ID4gICArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcHJpdi0+aXJxLCBhc3Bl ZWRfcGVjaV9pcnFfaGFuZGxlciwNCiAgICA+ICAgKwkJCSAgICAgICAwLCAicGVjaS1hc3BlZWQi LCBwcml2KTsNCiAgICA+ICAgKwlpZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gcmV0Ow0KICAg ID4gICArDQogICAgPiAgICsJaW5pdF9jb21wbGV0aW9uKCZwcml2LT54ZmVyX2NvbXBsZXRlKTsN CiAgICA+ICAgKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7DQogICAgPiAgICsNCiAgICA+ ICAgKwlwcml2LT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsIE5VTEwp Ow0KICAgID4gICArCWlmIChJU19FUlIocHJpdi0+cnN0KSkNCiAgICA+ICAgKwkJcmV0dXJuIGRl dl9lcnJfcHJvYmUocHJpdi0+ZGV2LCBQVFJfRVJSKHByaXYtPnJzdCksDQogICAgPiAgICsJCQkJ ICAgICAiZmFpbGVkIHRvIGdldCByZXNldCBjb250cm9sXG4iKTsNCiAgICA+ICAgKw0KICAgID4g ICArCXJldCA9IGRldm1fYXNwZWVkX3BlY2lfcmVzZXRfY29udHJvbF9kZWFzc2VydChwcml2LT5k ZXYsIHByaXYtPnJzdCk7DQogICAgPiAgICsJaWYgKHJldCkNCiAgICA+ICAgKwkJcmV0dXJuIGRl dl9lcnJfcHJvYmUocHJpdi0+ZGV2LCByZXQsICJjYW5ub3QgZGVhc3NlcnQgcmVzZXQgY29udHJv bFxuIik7DQogICAgPiAgICsNCiAgICA+ICAgKwlwcml2LT5jbGsgPSBkZXZtX2Nsa19nZXQocHJp di0+ZGV2LCBOVUxMKTsNCiAgICA+ICAgKwlpZiAoSVNfRVJSKHByaXYtPmNsaykpDQogICAgPiAg ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKHByaXYtPmRldiwgUFRSX0VSUihwcml2LT5jbGspLCAi ZmFpbGVkIHRvIGdldCBjbGtcbiIpOw0KICAgID4gICArDQogICAgPiAgICsJcmV0ID0gZGV2bV9h c3BlZWRfcGVjaV9jbGtfZW5hYmxlKHByaXYtPmRldiwgcHJpdi0+Y2xrKTsNCiAgICA+ICAgKwlp ZiAocmV0KQ0KICAgID4gICArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShwcml2LT5kZXYsIHJldCwg ImZhaWxlZCB0byBlbmFibGUgY2xvY2tcbiIpOw0KICAgID4gICArDQogICAgPiAgICsJYXNwZWVk X3BlY2lfcHJvcGVydHlfc2V0dXAocHJpdik7DQoNCiAgICAgICAgYXNwZWVkX3BlY2lfYnVzX2Zy ZXFfc2V0dXAocHJpdik7DQoNCiAgICA+ICAgKw0KICAgID4gICArCWFzcGVlZF9wZWNpX2luaXRf cmVncyhwcml2KTsNCiAgICA+ICAgKw0KICAgID4gICArCWNvbnRyb2xsZXIgPSBkZXZtX3BlY2lf Y29udHJvbGxlcl9hZGQocHJpdi0+ZGV2LCAmYXNwZWVkX29wcyk7DQogICAgPiAgICsJaWYgKElT X0VSUihjb250cm9sbGVyKSkNCiAgICA+ICAgKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHJpdi0+ ZGV2LCBQVFJfRVJSKGNvbnRyb2xsZXIpLA0KICAgID4gICArCQkJCSAgICAgImZhaWxlZCB0byBh ZGQgYXNwZWVkIHBlY2kgY29udHJvbGxlclxuIik7DQogICAgPiAgICsNCiAgICA+ICAgKwlwcml2 LT5jb250cm9sbGVyID0gY29udHJvbGxlcjsNCiAgICA+ICAgKw0KICAgID4gICArCXJldHVybiAw Ow0KICAgID4gICArfQ0KICAgID4gICArDQogICAgPiAgICtzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBhc3BlZWRfcGVjaV9vZl90YWJsZVtdID0gew0KICAgID4gICArCXsgLmNvbXBh dGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtcGVjaSIsIH0sDQogICAgPiAgICsJeyAuY29tcGF0aWJs ZSA9ICJhc3BlZWQsYXN0MjUwMC1wZWNpIiwgfSwNCiAgICA+ICAgKwl7IC5jb21wYXRpYmxlID0g ImFzcGVlZCxhc3QyNjAwLXBlY2kiLCB9LA0KICAgID4gICArCXsgfQ0KICAgID4gICArfTsNCiAg ICA+ICAgK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFzcGVlZF9wZWNpX29mX3RhYmxlKTsNCiAg ICA+ICAgKw0KICAgID4gICArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX3Bl Y2lfZHJpdmVyID0gew0KICAgID4gICArCS5wcm9iZSAgPSBhc3BlZWRfcGVjaV9wcm9iZSwNCiAg ICA+ICAgKwkuZHJpdmVyID0gew0KICAgID4gICArCQkubmFtZSAgICAgICAgICAgPSAicGVjaS1h c3BlZWQiLA0KICAgID4gICArCQkub2ZfbWF0Y2hfdGFibGUgPSBhc3BlZWRfcGVjaV9vZl90YWJs ZSwNCiAgICA+ICAgKwl9LA0KICAgID4gICArfTsNCiAgICA+ICAgK21vZHVsZV9wbGF0Zm9ybV9k cml2ZXIoYXNwZWVkX3BlY2lfZHJpdmVyKTsNCiAgICA+ICAgKw0KICAgID4gICArTU9EVUxFX0FV VEhPUigiUnlhbiBDaGVuIDxyeWFuX2NoZW5AYXNwZWVkdGVjaC5jb20+Iik7DQogICAgPiAgICtN T0RVTEVfQVVUSE9SKCJKYWUgSHl1biBZb28gPGphZS5oeXVuLnlvb0BsaW51eC5pbnRlbC5jb20+ Iik7DQogICAgPiAgICtNT0RVTEVfREVTQ1JJUFRJT04oIkFTUEVFRCBQRUNJIGRyaXZlciIpOw0K ICAgID4gICArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0KICAgID4gICArTU9EVUxFX0lNUE9SVF9O UyhQRUNJKTsNCiAgICA+ICAgLS0gDQogICAgPiAgIDIuMzEuMQ0KDQoNCg0K 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 768DEC433EF for ; Mon, 6 Dec 2021 05:30:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Content-ID:In-Reply-To: References:Message-ID:Date:Subject:CC:To:From:Reply-To:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=oS8yLjAGrd74ZIpgRJuKbhvUEGJiMXkvE2Bsm2O57hg=; b=wMMBMWhVHFEHcK yk51VOAgKNgApIVQ7GF9dWLy/mOLzgtByOWfnavofEx8g2QKozCftf2am7BEaLG2/tNRJa+iikai0 DYt4i5qEoO4BAUZCzuNZQmH7hW2qq8Pj/gCeBSEoZsyS7bW1sN9tGlCuKsYXeMi/BjbQID2IPI4sZ bOk55NpWVrnBni/pVTJO7n+qZZOw+5hPjWHr1tfuLi1jfZHGAEuoFfu6vb2KhC4Z7Ug2Wor0vg6zs F0iKlmGcApcsTPksTIL3ccQiUp3IxMiIkojsn9O5SDEtZSA9zAsdEb+SlFxJCsCyjOmc7L5VdCD3f b4eTqW+P9sPqcqAx5EQQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mu6Xe-002cwj-BQ; Mon, 06 Dec 2021 05:27:58 +0000 Received: from mail-eopbgr1300139.outbound.protection.outlook.com ([40.107.130.139] helo=APC01-HK2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mu6XW-002cvQ-Os for linux-arm-kernel@lists.infradead.org; Mon, 06 Dec 2021 05:27:56 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fK3PaCTOqhmOJUoA1xfYl4/78UcXOzHdew0+rJvtqueJt3SJJLBFa23/+TPUzo9+SZyiucPJNgZceSahckD0BlGgF/koUiPfp4G+3Be5Qw/C/zvQvqRVT2VXa0zR9EmKQ9sEuqZMj8VuOT8u/SteTdkCE78Uu7fwVCfHu5gN2VDk2Gp8/OP76e33LLDHkPmdbMeuDXrSEnv4JqeERlfPMbokHuopniQ5qhp9gXkHQxvTr0oCPQS/BypY53qhuMyAhcpEvG5B7QchykrAheFkqR62mQAyQDT7RsHnso8vjzEanaatvY0S4tzAJZYim8U/AHnVWycuftSyx6kcNGying== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BcR89AI0It8qsYGiFbGIKqCsrMa7lmACFbXFp+yjVIY=; b=aM8D2nuf0GpGYFcEqWkjGY/v2HpbO05cQDe+fmpp4l9Oqq8m27fPjxgP60hLo9d8aIhO4quo9oT7ZkhGyeKQ8hxGZ3YWpvhqCONEog5ZailBVP+D4EOSsoy2mG2X+KmoNDISbFAVMBhuWVSAMvrL7dhDx7qdBfDsVpJyoD4bejCxM9ipH2TJ4W+4NEGwZ6+95f+9Wboz9YscGXjLqHg0urmGWasLyMGsmp8am63hUg+OmhvChVhP4RmvEe3qs9axUHh0F3Gg1HJo4tbqOx9nUlWQ8HgYQFOMmkKrgma1539W6N8qHc1/2ux9soxju7Z3k6Ih/ugKdh6Hxj9TOubG8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BcR89AI0It8qsYGiFbGIKqCsrMa7lmACFbXFp+yjVIY=; b=Q9MTJbVnFIbnqB2n0HCtH0rbwD2ReM7JVjge1Y4n8q/Cy2L6G1kn9eS2+zH6LXmXWMwNqE1vjKu3sFYr92ukBiPILaAwpZwLtCxrWodamVlW4m6mPu579CKM6roIb0ubNmHXxPPxPmTo2X72ajjErIr/8pR8mKFIXVjTuPUIbTipIh0HXbKC81nAJmluT2ogODYKzrAysNYUWSaH3sRcgUI4sUNHReBVYpEmPIomPzNajLdTdgiHdno/EdSF8LgLMYiiUbz1y5TwOfFrIr5fua+WQKTo6uWN+9b1HDPmzXs9JhEjVisFbvGG7cEoiJGq7DhTk6WBT45/I1Fu1QhKLA== Received: from HK0PR06MB3362.apcprd06.prod.outlook.com (2603:1096:203:8b::10) by HK0PR06MB2131.apcprd06.prod.outlook.com (2603:1096:203:4d::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.11; Mon, 6 Dec 2021 05:27:44 +0000 Received: from HK0PR06MB3362.apcprd06.prod.outlook.com ([fe80::7941:2fad:3c82:52eb]) by HK0PR06MB3362.apcprd06.prod.outlook.com ([fe80::7941:2fad:3c82:52eb%3]) with mapi id 15.20.4755.021; Mon, 6 Dec 2021 05:27:44 +0000 From: Billy Tsai To: Iwona Winiarska , "linux-kernel@vger.kernel.org" , "openbmc@lists.ozlabs.org" , Greg Kroah-Hartman CC: "linux-aspeed@lists.ozlabs.org" , "linux-doc@vger.kernel.org" , Dave Hansen , Zev Weiss , Jae Hyun Yoo , Jonathan Corbet , Pierre-Louis Bossart , Guenter Roeck , "devicetree@vger.kernel.org" , Jean Delvare , Arnd Bergmann , Rob Herring , Borislav Petkov , Dan Williams , Andy Shevchenko , "linux-arm-kernel@lists.infradead.org" , "linux-hwmon@vger.kernel.org" , Tony Luck , Andrew Jeffery , Randy Dunlap , Olof Johansson Subject: Re: [PATCH v4 05/13] peci: Add peci-aspeed controller driver Thread-Topic: [PATCH v4 05/13] peci: Add peci-aspeed controller driver Thread-Index: AQHX4HQCKrBLVejdoE+1iQYtwHjqf6wliS8A Date: Mon, 6 Dec 2021 05:27:43 +0000 Message-ID: <71D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com> References: <20211123140706.2945700-1-iwona.winiarska@intel.com> <20211123140706.2945700-6-iwona.winiarska@intel.com> In-Reply-To: <20211123140706.2945700-6-iwona.winiarska@intel.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 28b7858c-52d8-438c-6fff-08d9b8792171 x-ms-traffictypediagnostic: HK0PR06MB2131: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:7691; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: UxUIND2oJkfuuyh43fakt1Yy44jNrU1Q1lX36UBcvgvZpE1dGr5vuW4a/B0guk6Hmah9aLnD0NpOCi9qFRTH7eIJchsaflDhUhzCPDLgEipbT0N+xaCKDZ+GecCqjo+XrsigRAe4b8FuGoBRitXAWcaglNzTChM2xaAWl8e29vJpoiFnBhGkcgTLcxUElDN8eSEksbv0vsqGt28Z45LhOKNq+gBalR9MW161J1sz0SW0hflZl1gfGIIIHg6/DoOSxiZiovXZrbQMKl3WXsqxuWNkZrwaXsXupoHzJKqyFmzgvrbm0PZGtj/KhpTC7iKVB1X2dNfEyJ1N677Gd+gQSZych6E+Y6umon0l7J9FogisBPeUfRGCM/NG4duIp5bu5eSqqzROY2UUs5cI14NMLBM9CvwSu8hU3NDjhNaGuScrDpfJeeImjvwtyAZTnF5KEGM4kFY1VkJV+IIT+vuzCL91rRvHbWpgoKq6I2sMD/3FwWEQpyXyZGS2ORnaCI5p+LovyAkKOiuuX0lzKoPFggmRJDAnbR9R4F+BV0520FaKst0vD7NRrHHCHPr7IxdZ4ljdBmHYbNw5E+rpC1u94bAn1b1dbO2HaW5p0EzuMSchNEuZm3yCaWYopOVNsH5Js35c8leEqi9Iqb1l//AFaF03gCO11XTgJSI/HeCzpuqhCjRbBNRbK+NQic0VfGNBP9zoOO7Cm/SybFMREaHkoBwxWIGcu6soVWN71g4jszI1bdIKKcTbldAHfnZGoEUC x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HK0PR06MB3362.apcprd06.prod.outlook.com; PTR:; CAT:NONE; SFS:(376002)(136003)(346002)(39840400004)(396003)(366004)(66476007)(2906002)(122000001)(66556008)(76116006)(33656002)(54906003)(86362001)(83380400001)(66446008)(30864003)(6512007)(110136005)(66946007)(64756008)(316002)(8936002)(36756003)(7416002)(4326008)(8676002)(26005)(6486002)(38070700005)(38100700002)(71200400001)(2616005)(508600001)(53546011)(6506007)(5660300002)(186003)(45980500001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?QzdVZjBZTFJJNHRoSDV0dzhkOUVYZlVONGR2cjNqV2hRMW85ZWc5VDNMMUNY?= =?utf-8?B?M0tEeU5IOVdNMzBVV2EybEEvYndHSEt3VUtETDJ6bURlTEJaTy9mRjRKVy83?= =?utf-8?B?MnN6WEUrMDhuNDRMS3YzcU9Ja1E1Q1dENHNRY1ZiRnJnNHNEWGoyRTAwcmV6?= =?utf-8?B?K3dJeG5ZWTIxK0MwZHRwTEVlVldvNFBtT2p2UWo4OFhyaEltTnNaTCtJOXlW?= =?utf-8?B?UHNlbmMxRjRxRC9YQ0dab2ZYL2ZKZmwwbVJDbTZyakZVWUtsZW5VU2VYRlpO?= =?utf-8?B?RFpyRm1qMEZMVE9NWXhSZDZ3NDd2Sk9wQ1ZDbVJsTmFreU0xZ2owa1ZDekpi?= =?utf-8?B?VzlrVTk0U3hYY0hEby9WTjBNcFZ2TGZ5ZmtkM1N2S3d6aEFKVHVaTEpvSUlP?= =?utf-8?B?ZmNCQ2VRSTlhSHFLOEF4T2RnbSsycVBSWk9pSm5KeCtMKzMwU3FReDZ2cGl4?= =?utf-8?B?Y2JmdmZnQzVxbzdrVTl4cnlrMHBPS3I3WnNqcERybExVZDVrUnlmbCs2amhy?= =?utf-8?B?TFpkM3pkd05NbkdZZVBPS0sxdDNEbml1VlVtQVBSbVZHUExKMzg1eWpSejRp?= =?utf-8?B?NFF5b3Z6RDgvK1E0aVRKbzFhcnc1T2QvbVFjR29CeHdGZksxTGEyVmd4QU1S?= =?utf-8?B?L3Z3eDlGKzdidUU1Y2FINWo2c1U2UXRMSXFRdVVXRGxzelk3bE9JcWNnN1Ix?= =?utf-8?B?eWN2M3ErSFc2MlRoQUNpRXBEQkJyeGhxRXRyNXFaN0U2WVhzZUhYNzloK2Rq?= =?utf-8?B?aTluTnJZYXc0OVlqK2hLWkpDcHNvcVl2bDZkdVFsSGFnV3pGNDF5MzYzbmRr?= =?utf-8?B?bm0zeHZFWVhOUXJpZVhGUlN1aENxUExPYVcrSkt3clVlTEIvb25PdGNaL3lR?= =?utf-8?B?NFgyNmFUYjNpWmloMHcyaWxHSWU1WEdKTTlqTlhUV1JmQTVSWkVsL3dmQWJo?= =?utf-8?B?aE5ISDRSTDlsSVloUWZrbWliTnI3OUVKTlF6MjVOMGNnbXlBbkkva3N4ZDVh?= =?utf-8?B?RHRycFF1RzhEUHZPRm5MdVNKVWxIcmRjSitqckhCM3gzOGl0VW9tMFArZXlO?= =?utf-8?B?dkN6aHNreHZ6R2lGS0xCUFc4ME1abERtT1pUbHVKREF2ZTN2Y3c0ZWZyanhN?= =?utf-8?B?OG8rMldrMUVudXhCVnJUUEtaZk1lWUVkZ2pjR2xDdzI3UVJ5OWFNSGFRMGQ3?= =?utf-8?B?SC9WN3M2bnJsdG1nVEpPZVNHOHZwTnhlNTJVT2dNYU8yeXQwYVRwUzVUalZs?= =?utf-8?B?em9SdTlwRkVKVXgzQUtHaDNxUklRY1pTMkdveGo0WGhyTk12anJKK3dPTE93?= =?utf-8?B?WmN2Z1FOdHZkbndMSEVpNVplYkpvMlJHTEFpcndndlQ0RkcxNzBIelM2NGFz?= =?utf-8?B?T0lWclg4TDBSZ2xzOHVscXpuVFZ5WTFJcjRSd1JkK2JUOGxabExPMWlxb0c5?= =?utf-8?B?YmtOSGVtOThHUWFudnprL0tWWW9iM2loclZzQ0dOY2xSOW5SZ2hnQVo3TmVo?= =?utf-8?B?Z0pRMEY1QjN2dHV0N0JTN1RqMnJFbmdlLzN6TitnTDFXRUh1aWZzMHp5SnBi?= =?utf-8?B?V1U5aWMzTzJFb1NCQmQ5QW5PQzVWcDNDQjZ4bFVFZG9pZmc1NTE3bkpmRjlm?= =?utf-8?B?YVZJR0J1M0pZeHB2TnRNZG90V0VsV2J2cXRSYjloR2g2dFN3a29SL2VocXdD?= =?utf-8?B?cVBkb1JpNlNOUmpEMlNwbU9QWnIvK2szOFVKaVRXQlIwZ0I1WC9UQTdTOU56?= =?utf-8?B?azRrR0hDcnVyaEJvR0xXWGwwdnFzRlNlZTZFRXFTbFpuLzh4RXUzeWRERjNR?= =?utf-8?B?WUJuYUlBbE1VTXNieTVpN2g5My8vMmdKZ3BZcHNCK3Jpa2t1SWFVU01ieUpP?= =?utf-8?B?SWFtNDNqR2UvNi9kYzBvR3d0M0hUOUxUMnZTVFhtK0tWVlp2MSt1Tkg4UUpI?= =?utf-8?B?a2F2anVhK25kdmVad1Z2dWFYbUtLSjJ1N0V4dTNPYTBiN0V1U0R4d3BzdkVp?= =?utf-8?B?TVJlSmhJbVBpVFd5MXhRZkNENFUyMWUvMm96c05WK0E2ZktxMGorUXcxOTBL?= =?utf-8?B?WnN5TG5kTzNqRGNJa3plRUZvOE12eExxZ3FDTEZYVHdQY1JJM0VOdHBFaHFh?= =?utf-8?B?SGZ3bGlwOU5CdmpzK2hNMkR4M3d2aGcyTXo2dmpTcjBKeEdQbTR2WWlmZ1Zp?= =?utf-8?B?b3VmSDlJQlI5S2FqcVJhenc3SG92a2dYb3lYSXB4NDNTTEdxNGVxNXlrd253?= =?utf-8?Q?JkMGYCS+ggYzmU4l3098j9nF3sPQvlkoD5K01hBcbg=3D?= Content-ID: <8B4465647D56A94D95CFDE63A9974F3A@apcprd06.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: HK0PR06MB3362.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 28b7858c-52d8-438c-6fff-08d9b8792171 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Dec 2021 05:27:43.9202 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: P9AyKL+x7asX3CIWmu1udcE2EnaX5MryMtjh31ns3azWyCEfBM1aTRNHF0KJUAC5hRBHclsfGn+fBC2Cp0S+NrlQKW9l/GnNBLQZ98itta4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK0PR06MB2131 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211205_212752_122567_8EF558C3 X-CRM114-Status: GOOD ( 17.74 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, After reviewing the patch, I have some suggestions for you. Please see the reply inline. On 2021/11/23, 10:11 PM, "openbmc on behalf of Iwona Winiarska" wrote: > From: Jae Hyun Yoo Add the define for the bus frequency #define ASPEED_PECI_BUS_FREQUENCY_MIN 2000 #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT 2000 #define ASPEED_PECI_BUS_FREQUENCY_MAX 1000000 > +struct aspeed_peci { > + struct peci_controller *controller; > + struct device *dev; > + void __iomem *base; > + struct clk *clk; > + struct reset_control *rst; > + int irq; > + spinlock_t lock; /* to sync completion status handling */ > + struct completion xfer_complete; > + u32 status; > + u32 cmd_timeout_ms; > + u32 msg_timing; > + u32 addr_timing; > + u32 rd_sampling_point; > + u32 clk_div; Add the paremeter to store the bus_freq from the dts property u32 bus_freq; > +}; > + > +static void aspeed_peci_init_regs(struct aspeed_peci *priv) > +{ > + u32 val; > + > + val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, ASPEED_PECI_CLK_DIV_DEFAULT); > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; > + writel(val, priv->base + ASPEED_PECI_CTRL); > + /* > + * Timing negotiation period setting. > + * The unit of the programmed value is 4 times of PECI clock period. > + */ > + val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv->msg_timing); > + val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv->addr_timing); > + writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); > + > + /* Clear interrupts */ > + val = readl(priv->base + ASPEED_PECI_INT_STS) | ASPEED_PECI_INT_MASK; > + writel(val, priv->base + ASPEED_PECI_INT_STS); > + > + /* Set timing negotiation mode and enable interrupts */ > + val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO); > + val |= ASPEED_PECI_INT_MASK; > + writel(val, priv->base + ASPEED_PECI_INT_CTRL); > + > + val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv->rd_sampling_point); > + val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv->clk_div); > + val |= ASPEED_PECI_CTRL_PECI_EN; > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; > + writel(val, priv->base + ASPEED_PECI_CTRL); > +} > + > +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) > +{ > + u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); > + > + if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == ASPEED_PECI_CMD_STS_ADDR_T_NEGO) > + aspeed_peci_init_regs(priv); As long as the state is not idle, the controller need to reinitialize the PECI register for solving the PECI controller hang. Before ast2600A3, the controller should assert/de-assert the reset for solving the hang issue. For backward compatible, I suggest to add the reset assert/de-assert in this place. if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { reset_control_assert(priv->rst); reset_control_deassert(priv->rst); aspeed_peci_init_regs(priv); } > + return readl_poll_timeout(priv->base + ASPEED_PECI_CMD, > + cmd_sts, > + !(cmd_sts & ASPEED_PECI_CMD_IDLE_MASK), > + ASPEED_PECI_IDLE_CHECK_INTERVAL_US, > + ASPEED_PECI_IDLE_CHECK_TIMEOUT_US); > +} > + > +static int aspeed_peci_xfer(struct peci_controller *controller, > + u8 addr, struct peci_request *req) > +{ > + struct aspeed_peci *priv = dev_get_drvdata(controller->dev.parent); > + unsigned long timeout = msecs_to_jiffies(priv->cmd_timeout_ms); > + u32 peci_head; > + int ret; > + > + if (req->tx.len > ASPEED_PECI_DATA_BUF_SIZE_MAX || > + req->rx.len > ASPEED_PECI_DATA_BUF_SIZE_MAX) > + return -EINVAL; > + > + /* Check command sts and bus idle state */ > + ret = aspeed_peci_check_idle(priv); > + if (ret) > + return ret; /* -ETIMEDOUT */ > + > + spin_lock_irq(&priv->lock); > + reinit_completion(&priv->xfer_complete); > + > + peci_head = FIELD_PREP(ASPEED_PECI_TARGET_ADDR_MASK, addr) | > + FIELD_PREP(ASPEED_PECI_WR_LEN_MASK, req->tx.len) | > + FIELD_PREP(ASPEED_PECI_RD_LEN_MASK, req->rx.len); > + > + writel(peci_head, priv->base + ASPEED_PECI_RW_LENGTH); > + > + memcpy_toio(priv->base + ASPEED_PECI_WR_DATA0, req->tx.buf, min_t(u8, req->tx.len, 16)); > + if (req->tx.len > 16) > + memcpy_toio(priv->base + ASPEED_PECI_WR_DATA4, req->tx.buf + 16, > + req->tx.len - 16); > + > +#if IS_ENABLED(CONFIG_DYNAMIC_DEBUG) > + dev_dbg(priv->dev, "HEAD : %#08x\n", peci_head); > + print_hex_dump_bytes("TX : ", DUMP_PREFIX_NONE, req->tx.buf, req->tx.len); > +#endif > + priv->status = 0; > + writel(ASPEED_PECI_CMD_FIRE, priv->base + ASPEED_PECI_CMD); > + spin_unlock_irq(&priv->lock); > + > + ret = wait_for_completion_interruptible_timeout(&priv->xfer_complete, timeout); > + if (ret < 0) > + return ret; > + > + if (ret == 0) { > + dev_dbg(priv->dev, "Timeout waiting for a response!\n"); dev_err? > + return -ETIMEDOUT; > + } > + > + spin_lock_irq(&priv->lock); > + > + if (priv->status != ASPEED_PECI_INT_CMD_DONE) { > + spin_unlock_irq(&priv->lock); > + dev_dbg(priv->dev, "No valid response, status: %#02x\n", priv->status); dev_err? > + return -EIO; > + } > + > + spin_unlock_irq(&priv->lock); > + > + memcpy_fromio(req->rx.buf, priv->base + ASPEED_PECI_RD_DATA0, min_t(u8, req->rx.len, 16)); > + if (req->rx.len > 16) > + memcpy_fromio(req->rx.buf + 16, priv->base + ASPEED_PECI_RD_DATA4, > + req->rx.len - 16); > + > +#if IS_ENABLED(CONFIG_DYNAMIC_DEBUG) > + print_hex_dump_bytes("RX : ", DUMP_PREFIX_NONE, req->rx.buf, req->rx.len); > +#endif > + return 0; > +} > + > +static irqreturn_t aspeed_peci_irq_handler(int irq, void *arg) > +{ > + struct aspeed_peci *priv = arg; > + u32 status; > + > + spin_lock(&priv->lock); > + status = readl(priv->base + ASPEED_PECI_INT_STS); > + writel(status, priv->base + ASPEED_PECI_INT_STS); > + priv->status |= (status & ASPEED_PECI_INT_MASK); > + > + /* > + * All commands should be ended up with a ASPEED_PECI_INT_CMD_DONE bit > + * set even in an error case. > + */ > + if (status & ASPEED_PECI_INT_CMD_DONE) > + complete(&priv->xfer_complete); > + > + writel(0, priv->base + ASPEED_PECI_CMD); > + > + spin_unlock(&priv->lock); > + > + return IRQ_HANDLED; > +} > + > +static void aspeed_peci_property_sanitize(struct device *dev, const char *propname, > + u32 min, u32 max, u32 default_val, u32 *propval) > +{ > + u32 val; > + int ret; > + > + ret = device_property_read_u32(dev, propname, &val); > + if (ret) { > + val = default_val; > + } else if (val > max || val < min) { > + dev_warn(dev, "Invalid %s: %u, falling back to: %u\n", > + propname, val, default_val); > + > + val = default_val; > + } > + > + *propval = val; > +} > + > +static void aspeed_peci_property_setup(struct aspeed_peci *priv) > +{ > + aspeed_peci_property_sanitize(priv->dev, "aspeed,clock-divider", > + 0, ASPEED_PECI_CLK_DIV_MAX, > + ASPEED_PECI_CLK_DIV_DEFAULT, &priv->clk_div); > + aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", > + 0, ASPEED_PECI_MSG_TIMING_MAX, > + ASPEED_PECI_MSG_TIMING_DEFAULT, &priv->msg_timing); > + aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", > + 0, ASPEED_PECI_ADDR_TIMING_MAX, > + ASPEED_PECI_ADDR_TIMING_DEFAULT, &priv->addr_timing); Use the bus-frequency to replace the property above: aspeed_peci_property_sanitize(priv->dev, "bus-frequency", ASPEED_PECI_BUS_FREQUENCY_MIN, ASPEED_PECI_BUS_FREQUENCY_MAX, ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv->bus_freq); > + aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling-point", > + 0, ASPEED_PECI_RD_SAMPLING_POINT_MAX, > + ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT, > + &priv->rd_sampling_point); > + aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", > + 1, ASPEED_PECI_CMD_TIMEOUT_MS_MAX, > + ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms); > +} Add the function of automatically calculating the settings to adapt to the bus frequency. static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) { unsigned long src_clk_rate; int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; u32 msg_timing, clk_div; src_clk_rate = clk_get_rate(priv->clk); /* * PECI bus freq = (source clk rate) / (4 * (PECI04[15:8]*4+1) * (1 << PECI00[10:8])) * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk rate) / (4 * PECI bus freq ) */ clk_divisor = src_clk_rate / (4 * priv->bus_freq); delta_value = clk_divisor; /* Find the closest divisor for bus-frequency */ for (msg_timing = 1; msg_timing <= 255; msg_timing++) for (clk_div = 0; clk_div < 7; clk_div++) { clk_divisor_tmp = (1 << clk_div) * (msg_timing * 4 + 1); delta_tmp = abs(clk_divisor - clk_divisor_tmp); if (delta_tmp < delta_value) { delta_value = delta_tmp; priv->msg_timing = msg_timing; priv->addr_timing = priv->msg_timing; priv->clk_div = clk_div; } } } > + > +static struct peci_controller_ops aspeed_ops = { > + .xfer = aspeed_peci_xfer, > +}; > + > +static void aspeed_peci_reset_control_release(void *data) > +{ > + reset_control_assert(data); > +} > + > +static int devm_aspeed_peci_reset_control_deassert(struct device *dev, struct reset_control *rst) > +{ > + int ret; > + > + ret = reset_control_deassert(rst); > + if (ret) > + return ret; > + > + return devm_add_action_or_reset(dev, aspeed_peci_reset_control_release, rst); > +} > + > +static void aspeed_peci_clk_release(void *data) > +{ > + clk_disable_unprepare(data); > +} > + > +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk *clk) > +{ > + int ret; > + > + ret = clk_prepare_enable(clk); > + if (ret) > + return ret; > + > + return devm_add_action_or_reset(dev, aspeed_peci_clk_release, clk); > +} > + > +static int aspeed_peci_probe(struct platform_device *pdev) > +{ > + struct peci_controller *controller; > + struct aspeed_peci *priv; > + int ret; > + > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + priv->dev = &pdev->dev; > + dev_set_drvdata(priv->dev, priv); > + > + priv->base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(priv->base)) > + return PTR_ERR(priv->base); > + > + priv->irq = platform_get_irq(pdev, 0); > + if (!priv->irq) > + return priv->irq; > + > + ret = devm_request_irq(&pdev->dev, priv->irq, aspeed_peci_irq_handler, > + 0, "peci-aspeed", priv); > + if (ret) > + return ret; > + > + init_completion(&priv->xfer_complete); > + spin_lock_init(&priv->lock); > + > + priv->rst = devm_reset_control_get(&pdev->dev, NULL); > + if (IS_ERR(priv->rst)) > + return dev_err_probe(priv->dev, PTR_ERR(priv->rst), > + "failed to get reset control\n"); > + > + ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv->rst); > + if (ret) > + return dev_err_probe(priv->dev, ret, "cannot deassert reset control\n"); > + > + priv->clk = devm_clk_get(priv->dev, NULL); > + if (IS_ERR(priv->clk)) > + return dev_err_probe(priv->dev, PTR_ERR(priv->clk), "failed to get clk\n"); > + > + ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); > + if (ret) > + return dev_err_probe(priv->dev, ret, "failed to enable clock\n"); > + > + aspeed_peci_property_setup(priv); aspeed_peci_bus_freq_setup(priv); > + > + aspeed_peci_init_regs(priv); > + > + controller = devm_peci_controller_add(priv->dev, &aspeed_ops); > + if (IS_ERR(controller)) > + return dev_err_probe(priv->dev, PTR_ERR(controller), > + "failed to add aspeed peci controller\n"); > + > + priv->controller = controller; > + > + return 0; > +} > + > +static const struct of_device_id aspeed_peci_of_table[] = { > + { .compatible = "aspeed,ast2400-peci", }, > + { .compatible = "aspeed,ast2500-peci", }, > + { .compatible = "aspeed,ast2600-peci", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); > + > +static struct platform_driver aspeed_peci_driver = { > + .probe = aspeed_peci_probe, > + .driver = { > + .name = "peci-aspeed", > + .of_match_table = aspeed_peci_of_table, > + }, > +}; > +module_platform_driver(aspeed_peci_driver); > + > +MODULE_AUTHOR("Ryan Chen "); > +MODULE_AUTHOR("Jae Hyun Yoo "); > +MODULE_DESCRIPTION("ASPEED PECI driver"); > +MODULE_LICENSE("GPL"); > +MODULE_IMPORT_NS(PECI); > -- > 2.31.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel