From nobody Fri Jan 2 13:27:42 2026 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 B3057CD6E5B for ; Wed, 11 Oct 2023 11:02:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346641AbjJKLCT (ORCPT ); Wed, 11 Oct 2023 07:02:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44264 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346329AbjJKLCN (ORCPT ); Wed, 11 Oct 2023 07:02:13 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4880898 for ; Wed, 11 Oct 2023 04:02:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697022132; x=1728558132; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=jX49b7tx6A7Zo7jAUVrcHlfA6tQul/wKjIem8aDMzX0=; b=UPzaMpsvTLrfxBDZRT7mvEKvkBH2tK8E5V93SW+4u+Ik1oBtuJXYMH/z hIyqbVm5A5NxfwNjkj9mlU9IlSqZrAq5EVrUDk/g01elFAFDvlJbYKd/D nm0EjTSgxs+ltd+6b17xcByn+DU1gWOU84LezMCRxoPx8co0e3fZH0M+V aRu2Muv1jpTz5bldHe8WgRmoDBychLvZQ4+cD0ynMPZ/P9oyMx38SLdnq cM7k6p8bSuS+qri3kONH7GieI55YtFPMKP789tASXaIZ+OETxbx4wae5N rCLUsvwTCRfzzO5XmYeBzbuWjBjG8PWj73mzhkx5yjpvMikUIAjBhZuUj A==; X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="369696904" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="369696904" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="788960271" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="788960271" Received: from twinkler-lnx.jer.intel.com ([10.12.231.216]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:09 -0700 From: Tomas Winkler To: Greg Kroah-Hartman Cc: Alexander Usyskin , Vitaly Lubart , linux-kernel@vger.kernel.org, Alan Previn , Tomas Winkler Subject: [char-misc-next 1/4] mei: bus: add send and recv api with timeout Date: Wed, 11 Oct 2023 14:01:54 +0300 Message-ID: <20231011110157.247552-2-tomas.winkler@intel.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231011110157.247552-1-tomas.winkler@intel.com> References: <20231011110157.247552-1-tomas.winkler@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Alexander Usyskin Add variation of the send and recv functions on bus that define timeout. Caller can use such functions in flow that can stuck to bail out and not to put down the whole system. Signed-off-by: Alexander Usyskin Signed-off-by: Alan Previn Signed-off-by: Tomas Winkler --- drivers/misc/mei/bus.c | 88 +++++++++++++++++++++++++++++++++++++- include/linux/mei_cl_bus.h | 8 ++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 67557c67bd214415b8dc6747..f9bcff197615128d72f17590 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c @@ -257,7 +257,7 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_= t length, u8 *vtag, } =20 /** - * mei_cldev_send_vtag - me device send with vtag (write) + * mei_cldev_send_vtag - me device send with vtag (write) * * @cldev: me client device * @buf: buffer to send @@ -278,6 +278,29 @@ ssize_t mei_cldev_send_vtag(struct mei_cl_device *clde= v, const u8 *buf, } EXPORT_SYMBOL_GPL(mei_cldev_send_vtag); =20 +/** + * mei_cldev_send_vtag_timeout - me device send with vtag and timeout (wri= te) + * + * @cldev: me client device + * @buf: buffer to send + * @length: buffer length + * @vtag: virtual tag + * @timeout: send timeout in milliseconds, 0 for infinite timeout + * + * Return: + * * written size in bytes + * * < 0 on error + */ + +ssize_t mei_cldev_send_vtag_timeout(struct mei_cl_device *cldev, const u8 = *buf, + size_t length, u8 vtag, unsigned long timeout) +{ + struct mei_cl *cl =3D cldev->cl; + + return __mei_cl_send_timeout(cl, buf, length, vtag, MEI_CL_IO_TX_BLOCKING= , timeout); +} +EXPORT_SYMBOL_GPL(mei_cldev_send_vtag_timeout); + /** * mei_cldev_recv_vtag - client receive with vtag (read) * @@ -323,7 +346,49 @@ ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_dev= ice *cldev, u8 *buf, EXPORT_SYMBOL_GPL(mei_cldev_recv_nonblock_vtag); =20 /** - * mei_cldev_send - me device send (write) + * mei_cldev_recv_timeout - client receive with timeout (read) + * + * @cldev: me client device + * @buf: buffer to receive + * @length: buffer length + * @timeout: send timeout in milliseconds, 0 for infinite timeout + * + * Return: + * * read size in bytes + * * < 0 on error + */ +ssize_t mei_cldev_recv_timeout(struct mei_cl_device *cldev, u8 *buf, size_= t length, + unsigned long timeout) +{ + return mei_cldev_recv_vtag_timeout(cldev, buf, length, NULL, timeout); +} +EXPORT_SYMBOL_GPL(mei_cldev_recv_timeout); + +/** + * mei_cldev_recv_vtag_timeout - client receive with vtag (read) + * + * @cldev: me client device + * @buf: buffer to receive + * @length: buffer length + * @vtag: virtual tag + * @timeout: recv timeout in milliseconds, 0 for infinite timeout + * + * Return: + * * read size in bytes + * * < 0 on error + */ + +ssize_t mei_cldev_recv_vtag_timeout(struct mei_cl_device *cldev, u8 *buf, = size_t length, + u8 *vtag, unsigned long timeout) +{ + struct mei_cl *cl =3D cldev->cl; + + return __mei_cl_recv(cl, buf, length, vtag, 0, timeout); +} +EXPORT_SYMBOL_GPL(mei_cldev_recv_vtag_timeout); + +/** + * mei_cldev_send - me device send (write) * * @cldev: me client device * @buf: buffer to send @@ -339,6 +404,25 @@ ssize_t mei_cldev_send(struct mei_cl_device *cldev, co= nst u8 *buf, size_t length } EXPORT_SYMBOL_GPL(mei_cldev_send); =20 +/** + * mei_cldev_send_timeout - me device send with timeout (write) + * + * @cldev: me client device + * @buf: buffer to send + * @length: buffer length + * @timeout: send timeout in milliseconds, 0 for infinite timeout + * + * Return: + * * written size in bytes + * * < 0 on error + */ +ssize_t mei_cldev_send_timeout(struct mei_cl_device *cldev, const u8 *buf,= size_t length, + unsigned long timeout) +{ + return mei_cldev_send_vtag_timeout(cldev, buf, length, 0, timeout); +} +EXPORT_SYMBOL_GPL(mei_cldev_send_timeout); + /** * mei_cldev_recv - client receive (read) * diff --git a/include/linux/mei_cl_bus.h b/include/linux/mei_cl_bus.h index c9af62e54577033bf9bae0e4..b38a56a13f39277f948c53b8 100644 --- a/include/linux/mei_cl_bus.h +++ b/include/linux/mei_cl_bus.h @@ -94,15 +94,23 @@ void mei_cldev_driver_unregister(struct mei_cl_driver *= cldrv); =20 ssize_t mei_cldev_send(struct mei_cl_device *cldev, const u8 *buf, size_t length); +ssize_t mei_cldev_send_timeout(struct mei_cl_device *cldev, const u8 *buf, + size_t length, unsigned long timeout); ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length= ); ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf, size_t length); +ssize_t mei_cldev_recv_timeout(struct mei_cl_device *cldev, u8 *buf, size_= t length, + unsigned long timeout); ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, const u8 *buf, size_t length, u8 vtag); +ssize_t mei_cldev_send_vtag_timeout(struct mei_cl_device *cldev, const u8 = *buf, + size_t length, u8 vtag, unsigned long timeout); ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t l= ength, u8 *vtag); ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length, u8 *vtag); +ssize_t mei_cldev_recv_vtag_timeout(struct mei_cl_device *cldev, u8 *buf, = size_t length, + u8 *vtag, unsigned long timeout); =20 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t r= x_cb); int mei_cldev_register_notif_cb(struct mei_cl_device *cldev, --=20 2.41.0 From nobody Fri Jan 2 13:27:42 2026 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 3D34ECD6E5B for ; Wed, 11 Oct 2023 11:02:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346329AbjJKLCX (ORCPT ); Wed, 11 Oct 2023 07:02:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346600AbjJKLCP (ORCPT ); Wed, 11 Oct 2023 07:02:15 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0AB23C9 for ; Wed, 11 Oct 2023 04:02:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697022134; x=1728558134; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CyglcibgiNb0VhODVxX7aqzQHuGwSaBbHCQgN+Wjg8o=; b=QeZInN7qH+x0OHCKGIK1r57f+5M6kbsCWbr+/O5sIdHGW8wo4JYa1xeN l2qwX03cGGohpCUi7bcTH3oSrQFYfw46PFQSPyHS3o8CpODog+edhfWsl P028Ec+ZX3ZL1V05tdfv23EiekILaHOZ6bY398RjJL591d8EQnMo5hBkc EBvkXmDD0imd2jD/53hfMYxmUXpgGvwT/Pp462USyENjm75E/bsY0IkGO 8hc6voMQ43VXRkBNG0Ws+fD2ihvnUs0jH0LQhTLlT7UOUd+1qcQ/61qwa aIpaQquKrzuC+oIKhPV+/8YA3Qwg6X4Sn8FsXQa9mYlaJ5gUdQqK9LQX1 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="369696908" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="369696908" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="788960280" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="788960280" Received: from twinkler-lnx.jer.intel.com ([10.12.231.216]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:11 -0700 From: Tomas Winkler To: Greg Kroah-Hartman Cc: Alexander Usyskin , Vitaly Lubart , linux-kernel@vger.kernel.org, Alan Previn , Tomas Winkler Subject: [char-misc-next 2/4] mei: pxp: recover from recv fail under memory pressure Date: Wed, 11 Oct 2023 14:01:55 +0300 Message-ID: <20231011110157.247552-3-tomas.winkler@intel.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231011110157.247552-1-tomas.winkler@intel.com> References: <20231011110157.247552-1-tomas.winkler@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Alexander Usyskin Under memory pressure recv fails due to kmalloc failure, and if drivers(pxp) retry send/receive, send blocks indefinitely. Send without recv leaves the channel in a bad state. Retry send attempt after small timeout and reset the channel if the retry failed on kmalloc failure too. Signed-off-by: Alexander Usyskin Signed-off-by: Alan Previn Signed-off-by: Tomas Winkler --- drivers/misc/mei/pxp/mei_pxp.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/drivers/misc/mei/pxp/mei_pxp.c b/drivers/misc/mei/pxp/mei_pxp.c index 2dcb9169e404c3bcbbccc7b4..c6cdd6a47308ebcc72f34c38 100644 --- a/drivers/misc/mei/pxp/mei_pxp.c +++ b/drivers/misc/mei/pxp/mei_pxp.c @@ -11,6 +11,7 @@ * negotiation messages to ME FW command payloads and vice versa. */ =20 +#include #include #include #include @@ -61,16 +62,38 @@ mei_pxp_receive_message(struct device *dev, void *buffe= r, size_t size) { struct mei_cl_device *cldev; ssize_t byte; + bool retry =3D false; =20 if (!dev || !buffer) return -EINVAL; =20 cldev =3D to_mei_cl_device(dev); =20 +retry: byte =3D mei_cldev_recv(cldev, buffer, size); if (byte < 0) { dev_dbg(dev, "mei_cldev_recv failed. %zd\n", byte); - return byte; + if (byte !=3D -ENOMEM) + return byte; + + /* Retry the read when pages are reclaimed */ + msleep(20); + if (!retry) { + retry =3D true; + goto retry; + } else { + dev_warn(dev, "No memory on data receive after retry, trying to reset t= he channel...\n"); + byte =3D mei_cldev_disable(cldev); + if (byte < 0) + dev_warn(dev, "mei_cldev_disable failed. %zd\n", byte); + /* + * Explicitly ignoring disable failure, + * enable may fix the states and succeed + */ + byte =3D mei_cldev_enable(cldev); + if (byte < 0) + dev_err(dev, "mei_cldev_enable failed. %zd\n", byte); + } } =20 return byte; --=20 2.41.0 From nobody Fri Jan 2 13:27:42 2026 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 79CE1CD6E5A for ; Wed, 11 Oct 2023 11:02:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346716AbjJKLCb (ORCPT ); Wed, 11 Oct 2023 07:02:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346572AbjJKLCR (ORCPT ); Wed, 11 Oct 2023 07:02:17 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 98ADC98 for ; Wed, 11 Oct 2023 04:02:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697022135; x=1728558135; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=uD4MYHG5qvyyAF6HKIr6E+xlIfaGIPkL5F9+Pwgm4B4=; b=nCoUNbiQM9684QLAYT9MP1QNhP6+xfsxUoqLAdeb/up/GlGXb7HN0hLN pDp2qNG5vDDnvrWkYLDuvNby2JEZeZxCyLbnsOsCzgaRXlJnXc0HJCh8u 4qmTj3Ep0VPF8fvy9Cq+URPnJPy4mcQxEpuCEEZfXWBw2v2VhoKOT9v8Q x10gMnwMJZXtKcOMGkaP4pXCBMKCL1+6zbHnD8XG7Eu9F0uc7UkCVn657 sQNXCUntMHdqRfYDEdypI1f4IW2I1PL23KfbFK0pOiF/rZbFNTbr7pdIl C3XLj80nNAbvLnib39UZeUTS2368jlJqw3KiTz0I6qWms/PMqupceq+Qm Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="369696912" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="369696912" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="788960297" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="788960297" Received: from twinkler-lnx.jer.intel.com ([10.12.231.216]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:13 -0700 From: Tomas Winkler To: Greg Kroah-Hartman Cc: Alexander Usyskin , Vitaly Lubart , linux-kernel@vger.kernel.org, Tomas Winkler Subject: [char-misc-next 3/4] mei: pxp: re-enable client on errors Date: Wed, 11 Oct 2023 14:01:56 +0300 Message-ID: <20231011110157.247552-4-tomas.winkler@intel.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231011110157.247552-1-tomas.winkler@intel.com> References: <20231011110157.247552-1-tomas.winkler@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Alexander Usyskin Disable and enable mei-pxp client on errors to clean the internal state. Signed-off-by: Alexander Usyskin Signed-off-by: Tomas Winkler --- drivers/misc/mei/pxp/mei_pxp.c | 70 +++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/drivers/misc/mei/pxp/mei_pxp.c b/drivers/misc/mei/pxp/mei_pxp.c index c6cdd6a47308ebcc72f34c38..9875d16445bb03efcfb31cd9 100644 --- a/drivers/misc/mei/pxp/mei_pxp.c +++ b/drivers/misc/mei/pxp/mei_pxp.c @@ -23,6 +23,24 @@ =20 #include "mei_pxp.h" =20 +static inline int mei_pxp_reenable(const struct device *dev, struct mei_cl= _device *cldev) +{ + int ret; + + dev_warn(dev, "Trying to reset the channel...\n"); + ret =3D mei_cldev_disable(cldev); + if (ret < 0) + dev_warn(dev, "mei_cldev_disable failed. %d\n", ret); + /* + * Explicitly ignoring disable failure, + * enable may fix the states and succeed + */ + ret =3D mei_cldev_enable(cldev); + if (ret < 0) + dev_err(dev, "mei_cldev_enable failed. %d\n", ret); + return ret; +} + /** * mei_pxp_send_message() - Sends a PXP message to ME FW. * @dev: device corresponding to the mei_cl_device @@ -35,6 +53,7 @@ mei_pxp_send_message(struct device *dev, const void *mess= age, size_t size) { struct mei_cl_device *cldev; ssize_t byte; + int ret; =20 if (!dev || !message) return -EINVAL; @@ -44,10 +63,20 @@ mei_pxp_send_message(struct device *dev, const void *me= ssage, size_t size) byte =3D mei_cldev_send(cldev, message, size); if (byte < 0) { dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); - return byte; + switch (byte) { + case -ENOMEM: + fallthrough; + case -ENODEV: + fallthrough; + case -ETIME: + ret =3D mei_pxp_reenable(dev, cldev); + if (ret) + byte =3D ret; + break; + } } =20 - return 0; + return byte; } =20 /** @@ -63,6 +92,7 @@ mei_pxp_receive_message(struct device *dev, void *buffer,= size_t size) struct mei_cl_device *cldev; ssize_t byte; bool retry =3D false; + int ret; =20 if (!dev || !buffer) return -EINVAL; @@ -73,26 +103,22 @@ mei_pxp_receive_message(struct device *dev, void *buff= er, size_t size) byte =3D mei_cldev_recv(cldev, buffer, size); if (byte < 0) { dev_dbg(dev, "mei_cldev_recv failed. %zd\n", byte); - if (byte !=3D -ENOMEM) - return byte; - - /* Retry the read when pages are reclaimed */ - msleep(20); - if (!retry) { - retry =3D true; - goto retry; - } else { - dev_warn(dev, "No memory on data receive after retry, trying to reset t= he channel...\n"); - byte =3D mei_cldev_disable(cldev); - if (byte < 0) - dev_warn(dev, "mei_cldev_disable failed. %zd\n", byte); - /* - * Explicitly ignoring disable failure, - * enable may fix the states and succeed - */ - byte =3D mei_cldev_enable(cldev); - if (byte < 0) - dev_err(dev, "mei_cldev_enable failed. %zd\n", byte); + switch (byte) { + case -ENOMEM: + /* Retry the read when pages are reclaimed */ + msleep(20); + if (!retry) { + retry =3D true; + goto retry; + } + fallthrough; + case -ENODEV: + fallthrough; + case -ETIME: + ret =3D mei_pxp_reenable(dev, cldev); + if (ret) + byte =3D ret; + break; } } =20 --=20 2.41.0 From nobody Fri Jan 2 13:27:42 2026 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 04210CD6E5B for ; Wed, 11 Oct 2023 11:02:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346719AbjJKLCf (ORCPT ); Wed, 11 Oct 2023 07:02:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346674AbjJKLCU (ORCPT ); Wed, 11 Oct 2023 07:02:20 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9491A9 for ; Wed, 11 Oct 2023 04:02:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697022137; x=1728558137; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AX4VHlWO9XCZX/4XDdhwVkemO2KD/0VLOBZhVIMd1zE=; b=lbA/JU3IXl+cjgVq7KSe/6BdZDn6+f3dcX114HkGocuz4L1kTxF/uQtx gh4F2EUR8gYomae20U+gLrtt5tOcyxAtoO/gJlGTvteRMmI/F8HkGfPC4 NRJK1ypImF6uiCOgxvXjsGNu6xYqrQQphVo/YnVY3mDovBkwSgQMPL5Eg BUAlalEZrIc94WHkMmnwveZNdf7nbiGKW5v6X98zGkoHNy9yYJ/9KpUVK PIPuVrWr41BcPjk+huA9Q/4vWVzqw/rkukKtFvJr8SEPKPmJYFjRqDJrr bmXeYR88DiIwSUHGxAUVDPPgOv8yry1wZtTUvDFi7fQFb10OaDmTUVIoi A==; X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="369696917" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="369696917" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10859"; a="788960311" X-IronPort-AV: E=Sophos;i="6.03,214,1694761200"; d="scan'208";a="788960311" Received: from twinkler-lnx.jer.intel.com ([10.12.231.216]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 04:02:15 -0700 From: Tomas Winkler To: Greg Kroah-Hartman Cc: Alexander Usyskin , Vitaly Lubart , linux-kernel@vger.kernel.org, Alan Previn , Tomas Winkler Subject: [char-misc-next 4/4] mei: update mei-pxp's component interface with timeouts Date: Wed, 11 Oct 2023 14:01:57 +0300 Message-ID: <20231011110157.247552-5-tomas.winkler@intel.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231011110157.247552-1-tomas.winkler@intel.com> References: <20231011110157.247552-1-tomas.winkler@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Alan Previn In debugging platform or firmware related MEI-PXP connection issues, having a timeout when clients (such as i915) calling into mei-pxp's send/receive functions have proven useful as opposed to blocking forever until the kernel triggers a watchdog panic (when platform issues are experienced). Update the mei-pxp component interface send and receive functions to take in timeouts. Signed-off-by: Alan Previn Signed-off-by: Alexander Usyskin Signed-off-by: Tomas Winkler --- drivers/gpu/drm/i915/pxp/intel_pxp_tee.c | 8 ++++-- drivers/misc/mei/pxp/mei_pxp.c | 33 +++++++++++++++++++----- include/drm/i915_pxp_tee_interface.h | 6 +++-- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c b/drivers/gpu/drm/i91= 5/pxp/intel_pxp_tee.c index 80bb0018986525f16d410e56..dfc2878426fc2226ccb55270 100644 --- a/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c @@ -20,6 +20,8 @@ #include "intel_pxp_tee.h" #include "intel_pxp_types.h" =20 +#define PXP_TRANSPORT_TIMEOUT_MS 5000 /* 5 sec */ + static bool is_fw_err_platform_config(u32 type) { @@ -71,13 +73,15 @@ static int intel_pxp_tee_io_message(struct intel_pxp *p= xp, goto unlock; } =20 - ret =3D pxp_component->ops->send(pxp_component->tee_dev, msg_in, msg_in_s= ize); + ret =3D pxp_component->ops->send(pxp_component->tee_dev, msg_in, msg_in_s= ize, + PXP_TRANSPORT_TIMEOUT_MS); if (ret) { drm_err(&i915->drm, "Failed to send PXP TEE message\n"); goto unlock; } =20 - ret =3D pxp_component->ops->recv(pxp_component->tee_dev, msg_out, msg_out= _max_size); + ret =3D pxp_component->ops->recv(pxp_component->tee_dev, msg_out, msg_out= _max_size, + PXP_TRANSPORT_TIMEOUT_MS); if (ret < 0) { drm_err(&i915->drm, "Failed to receive PXP TEE message\n"); goto unlock; diff --git a/drivers/misc/mei/pxp/mei_pxp.c b/drivers/misc/mei/pxp/mei_pxp.c index 9875d16445bb03efcfb31cd9..f77d78fa50549e69f0a0873b 100644 --- a/drivers/misc/mei/pxp/mei_pxp.c +++ b/drivers/misc/mei/pxp/mei_pxp.c @@ -46,10 +46,20 @@ static inline int mei_pxp_reenable(const struct device = *dev, struct mei_cl_devic * @dev: device corresponding to the mei_cl_device * @message: a message buffer to send * @size: size of the message - * Return: 0 on Success, <0 on Failure + * @timeout_ms: timeout in milliseconds, zero means wait indefinitely. + * + * Returns: 0 on Success, <0 on Failure with the following defined failure= s. + * -ENODEV: Client was not connected. + * Caller may attempt to try again immediately. + * -ENOMEM: Internal memory allocation failure experienced. + * Caller may sleep to allow kernel reclaim before retryi= ng. + * -EINTR : Calling thread received a signal. Caller may choose + * to abandon with the same thread id. + * -ETIME : Request is timed out. + * Caller may attempt to try again immediately. */ static int -mei_pxp_send_message(struct device *dev, const void *message, size_t size) +mei_pxp_send_message(struct device *dev, const void *message, size_t size,= unsigned long timeout_ms) { struct mei_cl_device *cldev; ssize_t byte; @@ -60,7 +70,7 @@ mei_pxp_send_message(struct device *dev, const void *mess= age, size_t size) =20 cldev =3D to_mei_cl_device(dev); =20 - byte =3D mei_cldev_send(cldev, message, size); + byte =3D mei_cldev_send_timeout(cldev, message, size, timeout_ms); if (byte < 0) { dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); switch (byte) { @@ -84,10 +94,21 @@ mei_pxp_send_message(struct device *dev, const void *me= ssage, size_t size) * @dev: device corresponding to the mei_cl_device * @buffer: a message buffer to contain the received message * @size: size of the buffer - * Return: bytes sent on Success, <0 on Failure + * @timeout_ms: timeout in milliseconds, zero means wait indefinitely. + * + * Returns: number of bytes send on Success, <0 on Failure with the follow= ing defined failures. + * -ENODEV: Client was not connected. + * Caller may attempt to try again from send immediately. + * -ENOMEM: Internal memory allocation failure experienced. + * Caller may sleep to allow kernel reclaim before retryi= ng. + * -EINTR : Calling thread received a signal. Caller will need to = repeat calling + * (with a different owning thread) to retrieve existing = unclaimed response + * (and may discard it). + * -ETIME : Request is timed out. + * Caller may attempt to try again from send immediately. */ static int -mei_pxp_receive_message(struct device *dev, void *buffer, size_t size) +mei_pxp_receive_message(struct device *dev, void *buffer, size_t size, uns= igned long timeout_ms) { struct mei_cl_device *cldev; ssize_t byte; @@ -100,7 +121,7 @@ mei_pxp_receive_message(struct device *dev, void *buffe= r, size_t size) cldev =3D to_mei_cl_device(dev); =20 retry: - byte =3D mei_cldev_recv(cldev, buffer, size); + byte =3D mei_cldev_recv_timeout(cldev, buffer, size, timeout_ms); if (byte < 0) { dev_dbg(dev, "mei_cldev_recv failed. %zd\n", byte); switch (byte) { diff --git a/include/drm/i915_pxp_tee_interface.h b/include/drm/i915_pxp_te= e_interface.h index a702b6ec17f7ca95eda7d225..7d96985f2d05327151b0dfc1 100644 --- a/include/drm/i915_pxp_tee_interface.h +++ b/include/drm/i915_pxp_tee_interface.h @@ -22,8 +22,10 @@ struct i915_pxp_component_ops { */ struct module *owner; =20 - int (*send)(struct device *dev, const void *message, size_t size); - int (*recv)(struct device *dev, void *buffer, size_t size); + int (*send)(struct device *dev, const void *message, size_t size, + unsigned long timeout_ms); + int (*recv)(struct device *dev, void *buffer, size_t size, + unsigned long timeout_ms); ssize_t (*gsc_command)(struct device *dev, u8 client_id, u32 fence_id, struct scatterlist *sg_in, size_t total_in_len, struct scatterlist *sg_out); --=20 2.41.0