From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EBE032931C3 for ; Mon, 5 Oct 2026 08:12:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791187947; cv=none; b=OgLNIQQiLlHbC7e1tZgXcdGGE+ek3MAjEM+g8qYPyKcu0NdYvblSW7GSVQxBujCKFQKTWvam6fvvWGeWrC8wZ5SB5RL9azkUeRz12ZopeAEJ+2pGu+SFO1UFJGaSLO5HkWHV7KmqDEeXD5wEMPHM1ATNM+ZSgbVk/AeE493dSQ4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791187947; c=relaxed/simple; bh=WXze5l23ss62nuB8A6mQWEJNGXEQPf46nDUtmjibv1U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NqIcUgOstIYrXJM9JIsjTx0Kl64CH6YdG5FBjjhYmZWxtnimhaxkmOjPoV8wzkPpG1CSVunm7sPb7wA/tSU1VHcdYt1chuicHJa0J+QjlVUP7kCKgLhi5+Lsmy/7PBiSyDI8yI3Ys1syIlkndDM7OI5DJqLlUPHOtV0KQU5uTN0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=2HGIfdor; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="2HGIfdor" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 7D7CE4E41190; Mon, 5 Oct 2026 08:12:23 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B961604FE; Mon, 5 Oct 2026 08:12:23 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D52671033063D; Mon, 5 Oct 2026 10:12:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1791187942; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding:in-reply-to:references; bh=tY98A2BYr6LRCOyMToXlNKtz1WF3lP1tVdRhJE2ACEE=; b=2HGIfdorT5MeWmqbHkDBF6LROvE8d419L5sbGdlKLWfTtCi+1j8e2wrEsHSTPsjWqaE7yL Wjid74rrFHA4HLFjgNgsIoZD7hirAg1Cat8mG8PjsfqIl8XXOpEjvjzn9C3jsGyTbdEnCk Ce8zXo1SrNQxQT96LBugFVIOEORarF01+8Le/PqYsm3TyTTyF0o/m2U3c1swpnyV06FDTE t79ZUTTwCMRZSwCvrVovzcgoZuw6SgA9pVEqnDMdtge64jXm3CXMzTPFvQ6xDR8eJLTyMK TaiAFQbrB3EewF4fluoJP5VEU5DvYD3YXj+ZBgpVrwpeLDLrQDa9kJ0h67f8WA== From: Paul Cercueil To: Pratyush Yadav , Michael Walle , Takahiro Kuwano , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Mark Brown , Thomas Petazzoni Cc: Kees Cook , Tony Luck , "Guilherme G . Piccoli" , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, Tanmay Jagdale , Paul Cercueil Subject: [PATCH 1/5] spi: spi-mem: Add support for panic mem writes Date: Mon, 5 Oct 2026 10:11:36 +0200 Message-ID: <20261005081141.33688-2-paul.cercueil@bootlin.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261005081141.33688-1-paul.cercueil@bootlin.com> References: <20261005081141.33688-1-paul.cercueil@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Last-TLS-Session-Version: TLSv1.3 From: Tanmay Jagdale Add a 'panic_write' flag to the controller's capabilities struct. When set, the SPI controller indicates that it will be able to send commands to a connected NOR or NAND memory in the context of a kernel panic, which means without sleeping and without relying on IRQs. Whether or not a given memory operation is a panic mem write is given by the spi_mem_op.panic_write flag. Signed-off-by: Tanmay Jagdale Co-developed-by: Paul Cercueil Signed-off-by: Paul Cercueil --- drivers/spi/spi-mem.c | 25 +++++++++++++++++++++++++ include/linux/spi/spi-mem.h | 5 +++++ 2 files changed, 30 insertions(+) diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c index b94680b60af9..89710f9f555e 100644 --- a/drivers/spi/spi-mem.c +++ b/drivers/spi/spi-mem.c @@ -398,6 +398,31 @@ int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op) u8 *tmpbuf; int ret; + if (op->panic_write) { + if (!spi_mem_controller_is_capable(ctlr, panic_write)) + return -EOPNOTSUPP; + + /* + * Only support panic writes if we'll go through .exec_op(). + * The regular SPI path (spi_sync(), etc.) explicitly mentions + * that it can only be used from a context that may sleep, which + * is not the case on a kernel panic. + * If this changes in the future, this could be reworked, but + * for now this will have to do. + */ + if (WARN_ON_ONCE(!ctlr->mem_ops || !ctlr->mem_ops->exec_op)) + return -EOPNOTSUPP; + + if (spi_get_csgpiod(mem->spi, 0)) + return -EPERM; + + /* On panic IRQs are disabled so we cannot wait on locks */ + if (mutex_is_locked(&ctlr->bus_lock_mutex) || + mutex_is_locked(&ctlr->io_mutex)) { + return -EPERM; + } + } + /* Make sure the operation frequency is correct before going futher */ spi_mem_adjust_op_freq(mem, (struct spi_mem_op *)op); diff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h index 0cce6b57242a..2633307bfad5 100644 --- a/include/linux/spi/spi-mem.h +++ b/include/linux/spi/spi-mem.h @@ -169,6 +169,7 @@ enum spi_mem_data_dir { * operation does not involve transferring data * @data.buf.in: input buffer (must be DMA-able) * @data.buf.out: output buffer (must be DMA-able) + * @panic_write: The command is executed in the context of a kernel panic * @max_freq: frequency limitation wrt this operation. 0 means there is no * specific constraint and the highest achievable frequency can be * attempted. @@ -211,6 +212,7 @@ struct spi_mem_op { } buf; } data; + bool panic_write; unsigned int max_freq; }; @@ -392,6 +394,8 @@ struct spi_controller_mem_ops { * is a pause in the transfer (eg. internal bus contention or * DMA arbitration on an interconnect). Features such as NAND * continuous reads shall not be leveraged. + * @panic_write: Set to true if the controller driver supports writing to a + * connected NAND/NOR memory in a kernel panic context */ struct spi_controller_mem_caps { bool dtr; @@ -400,6 +404,7 @@ struct spi_controller_mem_caps { bool per_op_freq; bool secondary_op_tmpl; bool no_cs_assertion; + bool panic_write; }; #define spi_mem_controller_is_capable(ctlr, cap) \ -- 2.47.3