From patchwork Tue Mar 19 09:34:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manojkiran Eda X-Patchwork-Id: 1913475 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=J/5/7QVf; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=RBPBgQ31; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TzRRY4m8bz23sG for ; Tue, 19 Mar 2024 20:35:53 +1100 (AEDT) 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:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ByyKTl09iIBnenMzJIbFW0ncxuPdMk9CDbOkzwZMkZQ=; b=J/5/7QVfxGkSA4 d3fxAH8loeCPaT6me/v0APOLTs4uv89ysICQIpZeWKHQFwK8fkMafXihckEnztkMv9zPEpLId+PNQ 1A6AMs+gTA92qrkoPgYh9z160da2YEA/g2aITZHVqt6TWyOsp5jz0aUZ43BiCUBLyS1LRWzHYsIuh t6bBTOk0+TVSTLPtL8fwYdBwImtrGC7y0QcFBGVBsX58idth16T8u8SUgUyhtgbo+rHXBtXc1sFYQ 0EPCgFGIt15cZbps8Qtgbx3KYE57etStV7u1yqFXmGEJLUrv6Mv3Em4/ebdv5qAInPGACvSug0SaE 3xSGZTtptz7fgpz8U0Pw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVsh-0000000C6vc-1F8p; Tue, 19 Mar 2024 09:35:39 +0000 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVsW-0000000C6q5-3tBX; Tue, 19 Mar 2024 09:35:32 +0000 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-1e0189323b4so15335055ad.1; Tue, 19 Mar 2024 02:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710840927; x=1711445727; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/MXxJB8PKQSVoedYGBCRVO5DK3W3cY0ONtFwPc++/B0=; b=RBPBgQ317uHOs5ZNyw6qnWF8MGmeGTKK3p7t9XMKbDrwUMIPijKW4j5mjoSUqkNh3V 9jDBdKv40hEwMoP8nn7P6SzC5y9MunCVbCnFPCIqbk5ped5ZEHRNUPCi50IM4WkyfVa9 FlTRKsx2fmJIuJNoecfEZ2RnNLmlQzOqqHwidVai23cAyDdpKEmV/9cpWzJnU2RdIBrD 5gMOu+lOEgQIevymzaFX7Kaanguq+ppMga9+h1CmAmrFdDc+HjFhlMbe/Iz62bkg4EZR LzNEKjGqrB3W+M6Sxmgp+mXthKhjhArw8cWxONmLvONdK0AoA6PNFnYb+OFBxrImiJ2f VfHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710840927; x=1711445727; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/MXxJB8PKQSVoedYGBCRVO5DK3W3cY0ONtFwPc++/B0=; b=f3FXtzxRkWlWcXTRHvxbnSGBXKHYcV+BiXtvxnvM6inkDS2eRghXNMuvN2wDxs0eXq FVWmMC3U1IamA2bNS+v+NuaBAoP2JDNjuoh/Jl9BctgtNQEw+oRuqkgsv8kUErGIggiK NADO8s4D/V1M+f67tq1Wtfwa9dgSndpO50pGjU62bFtr2mRxcgLoA/r7n3Hw+KUyg1PJ 3JYcU2f4bZdBQGx9XVwaw8DAj+KnlkqPUjhc/d/aJul4IS0JHlhLPZU8HP230roUVRTB +WUipb4g9/oGQszQJhoaJ4TD+AuoVQWHSHNiREe43tQcPJ3xL2UiS3y7YsNEQafE7zE9 PMBQ== X-Forwarded-Encrypted: i=1; AJvYcCXIThxfPNhFPEnBc6kjNmo1r1RbHaykynuXx/p4H0TRy850yc3LrKCS4D5EL71Izn7nGVzXK/kybT5GBppvTlnRdYebLUeyIDTeN/p4ZWV02c+jzwC6YZEcjq1nYU8CTloYlR62JZh0E/sKviDVM971eloe X-Gm-Message-State: AOJu0Yw8YAc8sCw/0E/CHK4Lcaw/BBU/5vfxdDVXEfhrJJZy0umATOOl Mt3aWG8+5yBIdre4kU4eBTlhHtA7WBjd2K0p2dCqo0w0gawwrvsj X-Google-Smtp-Source: AGHT+IHWsc9Bt7xqpubWV7WTMRBUCiitonSBRTjiTvdsCl34cE99jFd6nOA1EEyOLOZiRjGNlukrlQ== X-Received: by 2002:a17:903:40c1:b0:1de:fbc3:8e59 with SMTP id t1-20020a17090340c100b001defbc38e59mr13300726pld.21.1710840926821; Tue, 19 Mar 2024 02:35:26 -0700 (PDT) Received: from localhost.localdomain ([129.41.58.3]) by smtp.gmail.com with ESMTPSA id n5-20020a170903110500b001ddc0bc5934sm10942432plh.249.2024.03.19.02.35.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 02:35:26 -0700 (PDT) From: Manojkiran Eda To: patrick.rudolph@9elements.com, chiawei_wang@aspeedtech.com, ryan_chen@aspeedtech.com, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, joel@jms.id.au, andrew@codeconstruct.com.au, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, manojkiran.eda@gmail.com, jk@codeconstruct.com.au, openbmc@lists.ozlabs.org Subject: [PATCH v2 1/4] Add eSPI device driver (flash channel) Date: Tue, 19 Mar 2024 15:04:02 +0530 Message-Id: <20240319093405.39833-2-manojkiran.eda@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240319093405.39833-1-manojkiran.eda@gmail.com> References: <20240319093405.39833-1-manojkiran.eda@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240319_023529_049865_19A259DF X-CRM114-Status: GOOD ( 29.99 ) X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: This patch adds the driver support for the eSPI controller of Aspeed 5/6th generation SoCs. This controller is a slave device communicating with a master over Enhanced Serial Peripheral Interface (eSP [...] Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:62f listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [manojkiran.eda(at)gmail.com] -0.0 T_SCC_BODY_TEXT_LINE No description available. X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This patch adds the driver support for the eSPI controller of Aspeed 5/6th generation SoCs. This controller is a slave device communicating with a master over Enhanced Serial Peripheral Interface (eSPI). eSPI supports 4 channels, namely peripheral, virtual wire, out-of-band, and flash, and operates at max frequency of 66MHz. But at the moment, this patch set only supports the mafs mode (master attached flash sharing mode) in the flash channel. Signed-off-by: Manojkiran Eda --- drivers/soc/aspeed/Kconfig | 38 ++ drivers/soc/aspeed/Makefile | 2 + drivers/soc/aspeed/aspeed-espi-ctrl.c | 197 +++++++++ drivers/soc/aspeed/aspeed-espi-ctrl.h | 169 +++++++ drivers/soc/aspeed/aspeed-espi-flash-mafs.c | 467 ++++++++++++++++++++ drivers/soc/aspeed/aspeed-espi-flash.h | 71 +++ 6 files changed, 944 insertions(+) create mode 100644 drivers/soc/aspeed/aspeed-espi-ctrl.c create mode 100644 drivers/soc/aspeed/aspeed-espi-ctrl.h create mode 100644 drivers/soc/aspeed/aspeed-espi-flash-mafs.c create mode 100644 drivers/soc/aspeed/aspeed-espi-flash.h diff --git a/drivers/soc/aspeed/Kconfig b/drivers/soc/aspeed/Kconfig index f579ee0b5afa..c300ee8fe33a 100644 --- a/drivers/soc/aspeed/Kconfig +++ b/drivers/soc/aspeed/Kconfig @@ -52,6 +52,44 @@ config ASPEED_SOCINFO help Say yes to support decoding of ASPEED BMC information. +menu "ASPEED eSPI Support" + +config ASPEED_ESPI + bool "ASPEED eSPI slave driver" + select REGMAP + select MFD_SYSCON + depends on ASPEED_ESPI_FLASH + default n + help + Enable driver support for the Aspeed eSPI engine. The eSPI engine + plays as a slave device in BMC to communicate with the Host over + the eSPI interface. + +menu "ASPEED eSPI Flash channel support" + +config ASPEED_ESPI_FLASH + bool "ASPEED eSPI flash channel support" + default n + depends on ASPEED_ESPI_FLASH_MAFS + select ASPEED_ESPI + help + Enable eSPI flash channel support. + +menu "ASPEED eSPI flash modes" + +config ASPEED_ESPI_FLASH_MAFS + bool "Master attached flash sharing (MAFS) support in eSPI" + default n + select ASPEED_ESPI_FLASH + help + Select this option if you have a Master attached flash connected to + the eSPI controller. + +endmenu # eSPI Flash Modes +endmenu # eSPI Flash Channel support +endmenu # eSPI Support + + endmenu endif diff --git a/drivers/soc/aspeed/Makefile b/drivers/soc/aspeed/Makefile index b35d74592964..cecbba700071 100644 --- a/drivers/soc/aspeed/Makefile +++ b/drivers/soc/aspeed/Makefile @@ -4,3 +4,5 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o obj-$(CONFIG_ASPEED_UART_ROUTING) += aspeed-uart-routing.o obj-$(CONFIG_ASPEED_P2A_CTRL) += aspeed-p2a-ctrl.o obj-$(CONFIG_ASPEED_SOCINFO) += aspeed-socinfo.o +obj-$(CONFIG_ASPEED_ESPI) += aspeed-espi-ctrl.o +obj-$(CONFIG_ASPEED_ESPI_FLASH_MAFS) += aspeed-espi-flash-mafs.o diff --git a/drivers/soc/aspeed/aspeed-espi-ctrl.c b/drivers/soc/aspeed/aspeed-espi-ctrl.c new file mode 100644 index 000000000000..7e2b86849fd0 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-espi-ctrl.c @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2024 Aspeed Technology Inc. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aspeed-espi-ctrl.h" +#include "aspeed-espi-flash.h" + +/** + * aspeed_espi_ctrl_isr - function to handle various interrupts + * @irq: interrupt line + * @arg: pointer to access device registers + * + * Returns IRQ_HANDLED + */ +static irqreturn_t aspeed_espi_ctrl_isr(int irq, void *arg) +{ + uint32_t sts; + struct aspeed_espi_ctrl *espi_ctrl = (struct aspeed_espi_ctrl *)arg; + + regmap_read(espi_ctrl->map, ESPI_INT_STS, &sts); + + if (sts & ESPI_INT_STS_FLASH_BITS) { + aspeed_espi_flash_event(sts, espi_ctrl->flash); + regmap_write(espi_ctrl->map, ESPI_INT_STS, + sts & ESPI_INT_STS_FLASH_BITS); + } + + if (sts & ESPI_INT_STS_HW_RST_DEASSERT) { + aspeed_espi_flash_enable(espi_ctrl->flash); + + regmap_write(espi_ctrl->map, ESPI_SYSEVT_INT_T0, 0x0); + regmap_write(espi_ctrl->map, ESPI_SYSEVT_INT_T1, 0x0); + regmap_write(espi_ctrl->map, ESPI_SYSEVT_INT_EN, 0xffffffff); + + regmap_write(espi_ctrl->map, ESPI_SYSEVT1_INT_T0, 0x1); + regmap_write(espi_ctrl->map, ESPI_SYSEVT1_INT_EN, 0x1); + + regmap_update_bits(espi_ctrl->map, ESPI_INT_EN, + ESPI_INT_EN_HW_RST_DEASSERT, + ESPI_INT_EN_HW_RST_DEASSERT); + + regmap_update_bits( + espi_ctrl->map, ESPI_SYSEVT, + ESPI_SYSEVT_SLV_BOOT_STS | ESPI_SYSEVT_SLV_BOOT_DONE, + ESPI_SYSEVT_SLV_BOOT_STS | ESPI_SYSEVT_SLV_BOOT_DONE); + + regmap_write(espi_ctrl->map, ESPI_INT_STS, + ESPI_INT_STS_HW_RST_DEASSERT); + } + + return IRQ_HANDLED; +} + +/** + * aspeed_espi_ctrl_probe - function to probe the platform driver + * @pdev: platform device + * + * Returns 0 on success, -ENOMEM on error + */ +static int aspeed_espi_ctrl_probe(struct platform_device *pdev) +{ + int rc = 0; + struct aspeed_espi_ctrl *espi_ctrl; + struct device *dev = &pdev->dev; + + espi_ctrl = devm_kzalloc(dev, sizeof(*espi_ctrl), GFP_KERNEL); + if (!espi_ctrl) + return -ENOMEM; + + espi_ctrl->model = of_device_get_match_data(dev); + + espi_ctrl->map = syscon_node_to_regmap(dev->parent->of_node); + if (IS_ERR(espi_ctrl->map)) { + dev_err(dev, "cannot get remap\n"); + return PTR_ERR(espi_ctrl->map); + } + + espi_ctrl->irq = platform_get_irq(pdev, 0); + if (espi_ctrl->irq < 0) + return espi_ctrl->irq; + + espi_ctrl->clk = devm_clk_get(dev, NULL); + if (IS_ERR(espi_ctrl->clk)) { + dev_err(dev, "cannot get clock\n"); + return PTR_ERR(espi_ctrl->clk); + } + + rc = clk_prepare_enable(espi_ctrl->clk); + if (rc) { + dev_err(dev, "cannot enable clock\n"); + return rc; + } + + /* + * This takes care of deferred probe , incase the mtd core + * subsystem is not probed yet. + */ + espi_ctrl->flash = aspeed_espi_flash_alloc(dev, espi_ctrl); + if (IS_ERR(espi_ctrl->flash)) { + dev_err(dev, "failed to allocate flash channel\n"); + pr_info("flash alloc failed with return code %ld\n", + PTR_ERR(espi_ctrl->flash)); + return PTR_ERR(espi_ctrl->flash); + } + + regmap_write(espi_ctrl->map, ESPI_SYSEVT_INT_T0, 0x0); + regmap_write(espi_ctrl->map, ESPI_SYSEVT_INT_T1, 0x0); + regmap_write(espi_ctrl->map, ESPI_SYSEVT_INT_EN, 0xffffffff); + + regmap_write(espi_ctrl->map, ESPI_SYSEVT1_INT_T0, 0x1); + regmap_write(espi_ctrl->map, ESPI_SYSEVT1_INT_EN, 0x1); + + rc = devm_request_irq(dev, espi_ctrl->irq, aspeed_espi_ctrl_isr, 0, + DEVICE_NAME, espi_ctrl); + if (rc) { + dev_err(dev, "failed to request IRQ\n"); + return rc; + } + + // clear the interrupt enable register + regmap_write(espi_ctrl->map, ESPI_INT_EN_CLR, 0x7fffffff); + + // Disable the interrupts in all channels except flash channel + regmap_update_bits(espi_ctrl->map, ESPI_INT_EN, + ESPI_INT_EN_FLASH_BITS | ESPI_INT_EN_HW_RST_DEASSERT, + ESPI_INT_EN_FLASH_BITS | + ESPI_INT_STS_HW_RST_DEASSERT); + + dev_set_drvdata(dev, espi_ctrl); + + dev_info(dev, "module loaded\n"); + + return 0; +} + +/** + * aspeed_espi_ctrl_remove - Release the driver + * @pdev: the platform device + * + * Returns 0 + */ +static int aspeed_espi_ctrl_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct aspeed_espi_ctrl *espi_ctrl = dev_get_drvdata(dev); + + aspeed_espi_flash_free(dev, espi_ctrl->flash); + + return 0; +} + +static const struct aspeed_espi_model ast2500_model = { + .version = ESPI_AST2500, +}; + +static const struct aspeed_espi_model ast2600_model = { + .version = ESPI_AST2600, +}; + +static const struct of_device_id aspeed_espi_ctrl_of_matches[] = { + { .compatible = "aspeed,ast2500-espi-ctrl", .data = &ast2500_model }, + { .compatible = "aspeed,ast2600-espi-ctrl", .data = &ast2600_model }, + {}, +}; +MODULE_DEVICE_TABLE(of, aspeed_espi_ctrl_of_matches); + +static struct platform_driver aspeed_espi_ctrl_driver = { + .driver = { + .name = DEVICE_NAME, + .of_match_table = aspeed_espi_ctrl_of_matches, + }, + .probe = aspeed_espi_ctrl_probe, + .remove = aspeed_espi_ctrl_remove, +}; + +module_platform_driver(aspeed_espi_ctrl_driver); + +MODULE_AUTHOR("Manojkiran Eda "); +MODULE_AUTHOR("Patrick Rudolph "); +MODULE_AUTHOR("Chia-Wei Wang "); +MODULE_AUTHOR("Ryan Chen "); +MODULE_DESCRIPTION("Control of Aspeed eSPI Slave Device"); +MODULE_LICENSE("GPL"); diff --git a/drivers/soc/aspeed/aspeed-espi-ctrl.h b/drivers/soc/aspeed/aspeed-espi-ctrl.h new file mode 100644 index 000000000000..5c4950c84b01 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-espi-ctrl.h @@ -0,0 +1,169 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2024 Aspeed Technology Inc. + */ +#ifndef _ASPEED_ESPI_CTRL_H_ +#define _ASPEED_ESPI_CTRL_H_ + +#include + +#define DEVICE_NAME "aspeed-espi-ctrl" + +/** + * enum aspeed_espi_version - Enumeration to capture aspeed versions that this + * driver supports + * @ESPI_AST2500: eSPI for AST2500 Model + * @ESPI_AST2600: eSPI for AST2600 Model + * + * This enumeration captures various aspeed models that this driver supports + */ + +enum aspeed_espi_version { + ESPI_AST2500, + ESPI_AST2600, +}; + +/** + * struct aspeed_espi_model - structure to capture version of espi + * @version: espi version + * + * Structure to capture version of eSPI + */ +struct aspeed_espi_model { + uint32_t version; +}; + +/** + * struct aspeed_espi_ctrl - structure to group various channels of the driver + * @dev: platform device pointer + * @map: register map for the device + * @clk: clock for the device + * @irq: interrupt request + * @flash: pointer to flash channel of eSPI + * @model: pointer to version of eSPI + * + * Structure to capture version of eSPI + */ +struct aspeed_espi_ctrl { + struct device *dev; + struct regmap *map; + struct clk *clk; + int irq; + struct aspeed_espi_flash *flash; + const struct aspeed_espi_model *model; +}; + +/* eSPI register offset */ +#define ESPI_CTRL 0x000 +#define ESPI_CTRL_FLASH_TX_DMA_EN BIT(23) +#define ESPI_CTRL_FLASH_RX_DMA_EN BIT(22) +#define ESPI_CTRL_FLASH_SW_MODE_MASK GENMASK(11, 10) +#define ESPI_CTRL_FLASH_SW_MODE_SHIFT 10 +#define ESPI_CTRL_FLASH_SW_RDY BIT(7) + +#define ESPI_STS 0x004 +#define ESPI_CTRL_FLASH_CHAN_RDY BIT(6) + +#define ESPI_INT_STS 0x008 +#define ESPI_INT_STS_HW_RST_DEASSERT BIT(31) +#define ESPI_INT_STS_FLASH_TX_ERR BIT(21) +#define ESPI_INT_STS_FLASH_TX_ABT BIT(19) +#define ESPI_INT_STS_FLASH_RX_ABT BIT(15) +#define ESPI_INT_STS_FLASH_TX_CMPLT BIT(7) +#define ESPI_INT_STS_FLASH_RX_CMPLT BIT(6) +#define ESPI_INT_EN 0x00c +#define ESPI_INT_EN_HW_RST_DEASSERT BIT(31) +#define ESPI_INT_EN_FLASH_TX_ERR BIT(21) +#define ESPI_INT_EN_FLASH_TX_ABT BIT(19) +#define ESPI_INT_EN_FLASH_RX_ABT BIT(15) +#define ESPI_INT_EN_FLASH_TX_CMPLT BIT(7) +#define ESPI_INT_EN_FLASH_RX_CMPLT BIT(6) +#define ESPI_INT_EN_CLR 0x0fc +#define ESPI_FLASH_RX_DMA 0x060 +#define ESPI_FLASH_RX_CTRL 0x064 +#define ESPI_FLASH_RX_CTRL_PEND_SERV BIT(31) +#define ESPI_FLASH_RX_CTRL_LEN_MASK GENMASK(23, 12) +#define ESPI_FLASH_RX_CTRL_LEN_SHIFT 12 +#define ESPI_FLASH_RX_CTRL_TAG_MASK GENMASK(11, 8) +#define ESPI_FLASH_RX_CTRL_TAG_SHIFT 8 +#define ESPI_FLASH_RX_CTRL_CYC_MASK GENMASK(7, 0) +#define ESPI_FLASH_RX_CTRL_CYC_SHIFT 0 +#define ESPI_FLASH_RX_PORT 0x068 +#define ESPI_FLASH_TX_DMA 0x070 +#define ESPI_FLASH_TX_CTRL 0x074 +#define ESPI_FLASH_TX_CTRL_TRIGGER BIT(31) +#define ESPI_FLASH_TX_CTRL_LEN_MASK GENMASK(23, 12) +#define ESPI_FLASH_TX_CTRL_LEN_SHIFT 12 +#define ESPI_FLASH_TX_CTRL_TAG_MASK GENMASK(11, 8) +#define ESPI_FLASH_TX_CTRL_TAG_SHIFT 8 +#define ESPI_FLASH_TX_CTRL_CYC_MASK GENMASK(7, 0) +#define ESPI_FLASH_TX_CTRL_CYC_SHIFT 0 +#define ESPI_FLASH_TX_PORT 0x078 +#define ESPI_CTRL2 0x080 +#define ESPI_CTRL2_MEMCYC_RD_DIS BIT(6) +#define ESPI_CTRL2_MEMCYC_WR_DIS BIT(4) +#define ESPI_SYSEVT_INT_EN 0x094 +#define ESPI_SYSEVT 0x098 +#define ESPI_SYSEVT_HOST_RST_ACK BIT(27) +#define ESPI_SYSEVT_RST_CPU_INIT BIT(26) +#define ESPI_SYSEVT_SLV_BOOT_STS BIT(23) +#define ESPI_SYSEVT_NON_FATAL_ERR BIT(22) +#define ESPI_SYSEVT_FATAL_ERR BIT(21) +#define ESPI_SYSEVT_SLV_BOOT_DONE BIT(20) +#define ESPI_SYSEVT_NMI_OUT BIT(10) +#define ESPI_SYSEVT_SMI_OUT BIT(9) +#define ESPI_SYSEVT_HOST_RST_WARN BIT(8) +#define ESPI_SYSEVT_PLTRSTN BIT(5) +#define ESPI_SYSEVT_SUSPEND BIT(4) +#define ESPI_SYSEVT_S5_SLEEP BIT(2) +#define ESPI_SYSEVT_S4_SLEEP BIT(1) +#define ESPI_SYSEVT_S3_SLEEP BIT(0) +#define ESPI_GEN_CAP_N_CONF 0x0a0 +#define ESPI_CH0_CAP_N_CONF 0x0a4 +#define ESPI_CH1_CAP_N_CONF 0x0a8 +#define ESPI_CH2_CAP_N_CONF 0x0ac +#define ESPI_CH3_CAP_N_CONF 0x0b0 +#define ESPI_CH3_CAP_N_CONF_ERASE_MASK GENMASK(4, 2) +#define ESPI_CH3_CAP_N_CONF_ERASE_SHIFT 2 +#define ESPI_CH3_CAP_N_CONF_ERASE_SIZE_4KB 1 +#define ESPI_CH3_CAP_N_CONF_ERASE_SIZE_64KB 2 +#define ESPI_CH3_CAP_N_CONF_ERASE_SIZE_4KB_64KB 3 +#define ESPI_CH3_CAP_N_CONF_ERASE_SIZE_128KB 4 +#define ESPI_CH3_CAP_N_CONF_ERASE_SIZE_256KB 5 +#define ESPI_CH3_CAP_N_CONF2 0x0b4 +#define ESPI_SYSEVT1_INT_EN 0x100 +#define ESPI_SYSEVT1 0x104 +#define ESPI_SYSEVT1_SUSPEND_ACK BIT(20) +#define ESPI_SYSEVT1_SUSPEND_WARN BIT(0) +#define ESPI_SYSEVT_INT_T0 0x110 +#define ESPI_SYSEVT_INT_T1 0x114 +#define ESPI_SYSEVT_INT_T2 0x118 +#define ESPI_SYSEVT_INT_T2_HOST_RST_WARN ESPI_SYSEVT_HOST_RST_WARN +#define ESPI_SYSEVT_INT_STS 0x11c +#define ESPI_SYSEVT_INT_STS_NMI_OUT ESPI_SYSEVT_NMI_OUT +#define ESPI_SYSEVT_INT_STS_SMI_OUT ESPI_SYSEVT_SMI_OUT +#define ESPI_SYSEVT_INT_STS_HOST_RST_WARN ESPI_SYSEVT_HOST_RST_WARN +#define ESPI_SYSEVT_INT_STS_PLTRSTN ESPI_SYSEVT_PLTRSTN +#define ESPI_SYSEVT_INT_STS_SUSPEND ESPI_SYSEVT_SUSPEND +#define ESPI_SYSEVT_INT_STS_S5_SLEEP ESPI_SYSEVT_INT_S5_SLEEP +#define ESPI_SYSEVT_INT_STS_S4_SLEEP ESPI_SYSEVT_INT_S4_SLEEP +#define ESPI_SYSEVT_INT_STS_S3_SLEEP ESPI_SYSEVT_INT_S3_SLEEP +#define ESPI_SYSEVT1_INT_T0 0x120 +#define ESPI_SYSEVT1_INT_T1 0x124 +#define ESPI_SYSEVT1_INT_T2 0x128 +#define ESPI_SYSEVT1_INT_STS 0x12c +#define ESPI_SYSEVT1_INT_STS_SUSPEND_WARN ESPI_SYSEVT1_SUSPEND_WARN + +/* collect ESPI_INT_STS bits of eSPI channels for convenience */ +#define ESPI_INT_STS_FLASH_BITS \ + (ESPI_INT_STS_FLASH_TX_ERR | ESPI_INT_STS_FLASH_TX_ABT | \ + ESPI_INT_STS_FLASH_RX_ABT | ESPI_INT_STS_FLASH_TX_CMPLT | \ + ESPI_INT_STS_FLASH_RX_CMPLT) + +/* collect ESPI_INT_EN bits of eSPI channels for convenience */ +#define ESPI_INT_EN_FLASH_BITS \ + (ESPI_INT_EN_FLASH_TX_ERR | ESPI_INT_EN_FLASH_TX_ABT | \ + ESPI_INT_EN_FLASH_RX_ABT | ESPI_INT_EN_FLASH_TX_CMPLT | \ + ESPI_INT_EN_FLASH_RX_CMPLT) + +#endif diff --git a/drivers/soc/aspeed/aspeed-espi-flash-mafs.c b/drivers/soc/aspeed/aspeed-espi-flash-mafs.c new file mode 100644 index 000000000000..ac5d55833109 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-espi-flash-mafs.c @@ -0,0 +1,467 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyrigt 2024 Aspeed Technology Inc. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aspeed-espi-ctrl.h" +#include "aspeed-espi-flash.h" + +static long aspeed_espi_flash_rx(uint8_t *cyc, uint16_t *len, uint32_t *addr, + uint8_t *pkt, size_t *pkt_len, + struct aspeed_espi_flash *espi_flash) +{ + unsigned long flags; + uint32_t reg, rx_pkt_len, addr_be; + struct aspeed_espi_ctrl *espi_ctrl = espi_flash->ctrl; + void *rx_virt_ptr; + ulong to; + int ret; + + spin_lock_irqsave(&espi_flash->spinlock, flags); + + to = msecs_to_jiffies(100); + ret = wait_event_interruptible_lock_irq_timeout( + espi_flash->wq, espi_flash->rx_sts, espi_flash->spinlock, to); + + spin_unlock_irqrestore(&espi_flash->spinlock, flags); + + if (ret == -ERESTARTSYS) + return -EINTR; + else if (!ret) + return -ETIMEDOUT; + else if (espi_flash->rx_sts & ESPI_INT_STS_FLASH_RX_ABT) + return -EFAULT; + else + ret = 0; + + /* common header (i.e. cycle type, tag, and length) is taken by HW */ + regmap_read(espi_ctrl->map, ESPI_FLASH_RX_CTRL, ®); + *cyc = (reg & ESPI_FLASH_RX_CTRL_CYC_MASK) >> + ESPI_FLASH_RX_CTRL_CYC_SHIFT; + *len = (reg & ESPI_FLASH_RX_CTRL_LEN_MASK) >> + ESPI_FLASH_RX_CTRL_LEN_SHIFT; + + /* + * calculate the length of the rest part of the + * eSPI packet to be read from HW and copied to + * user space. + */ + switch (*cyc) { + case ESPI_FLASH_READ: + case ESPI_FLASH_WRITE: + case ESPI_FLASH_ERASE: + rx_virt_ptr = espi_flash->dma.rx_virt + sizeof(addr_be); + rx_pkt_len = (*len) ? *len : ESPI_PLD_LEN_MAX; + + if (addr) { + memcpy(&addr_be, espi_flash->dma.rx_virt, + sizeof(addr_be)); + *addr = ntohl(addr_be); + } + + break; + case ESPI_FLASH_SUC_CMPLT_D_MIDDLE: + case ESPI_FLASH_SUC_CMPLT_D_FIRST: + case ESPI_FLASH_SUC_CMPLT_D_LAST: + case ESPI_FLASH_SUC_CMPLT_D_ONLY: + rx_pkt_len = (*len) ? *len : ESPI_PLD_LEN_MAX; + rx_virt_ptr = espi_flash->dma.rx_virt; + break; + case ESPI_FLASH_SUC_CMPLT: + case ESPI_FLASH_UNSUC_CMPLT: + case ESPI_FLASH_UNSUC_CMPLT_ONLY: + /* No data received */ + rx_pkt_len = 0; + rx_virt_ptr = NULL; + break; + default: + rx_pkt_len = 0; + ret = -EFAULT; + } + if (pkt_len) + *pkt_len = rx_pkt_len; + + if (rx_pkt_len && pkt_len && pkt) { + if (*pkt_len >= rx_pkt_len) + memcpy(pkt, rx_virt_ptr, rx_pkt_len); + else + ret = -EINVAL; + } + + spin_lock_irqsave(&espi_flash->spinlock, flags); + + regmap_write_bits(espi_ctrl->map, ESPI_FLASH_RX_CTRL, + ESPI_FLASH_RX_CTRL_PEND_SERV, + ESPI_FLASH_RX_CTRL_PEND_SERV); + + espi_flash->rx_sts = 0; + + spin_unlock_irqrestore(&espi_flash->spinlock, flags); + return ret; +} + +static long +aspeed_espi_flash_rx_get_completion(struct aspeed_espi_flash *espi_flash) +{ + uint8_t cyc; + uint16_t len; + int ret; + + ret = aspeed_espi_flash_rx(&cyc, &len, NULL, NULL, 0, espi_flash); + if (ret) + return ret; + + if (cyc != ESPI_FLASH_SUC_CMPLT) { + dev_notice(espi_flash->ctrl->dev, "eSPI Rx response was not successful\n"); + return -EFAULT; + } + return 0; +} + +static long aspeed_espi_flash_put_tx(uint8_t cyc, uint16_t len, uint32_t addr, + const uint8_t *pkt, size_t pkt_len, + struct aspeed_espi_flash *espi_flash) +{ + struct aspeed_espi_ctrl *espi_ctrl = espi_flash->ctrl; + unsigned long flags; + uint32_t reg, addr_be; + ulong to; + int ret = 0; + + /* Test if flash channel is ready */ + regmap_read(espi_ctrl->map, ESPI_STS, ®); + if (!(reg & ESPI_CTRL_FLASH_CHAN_RDY)) { + dev_notice(espi_flash->ctrl->dev, "eSPI flash channel not ready\n"); + return -EIO; + } + + /* Test if TX ready */ + regmap_read(espi_ctrl->map, ESPI_FLASH_TX_CTRL, ®); + if (reg & ESPI_FLASH_TX_CTRL_TRIGGER) { + dev_notice(espi_flash->ctrl->dev, "eSPI Tx operation still pending\n"); + return -EBUSY; + } + + /* + * common header (i.e. cycle type, tag, and length) + * part is written to HW registers + */ + addr_be = htonl(addr); + memcpy(espi_flash->dma.tx_virt, &addr_be, sizeof(addr_be)); + if (pkt && pkt_len) + memcpy(espi_flash->dma.tx_virt + sizeof(addr_be), pkt, pkt_len); + + dma_wmb(); + + spin_lock_irqsave(&espi_flash->spinlock, flags); + espi_flash->tx_sts = 0; + espi_flash->rx_sts = 0; + + reg = ((cyc << ESPI_FLASH_TX_CTRL_CYC_SHIFT) & + ESPI_FLASH_TX_CTRL_CYC_MASK) | + ((len << ESPI_FLASH_TX_CTRL_LEN_SHIFT) & + ESPI_FLASH_TX_CTRL_LEN_MASK) | + ESPI_FLASH_TX_CTRL_TRIGGER; + + regmap_write(espi_ctrl->map, ESPI_FLASH_TX_CTRL, reg); + + to = msecs_to_jiffies(100); + ret = wait_event_interruptible_lock_irq_timeout( + espi_flash->wq, espi_flash->tx_sts, espi_flash->spinlock, to); + if (ret == -ERESTARTSYS) + ret = -EINTR; + else if (!ret) { + dev_notice(espi_flash->ctrl->dev, "eSPI Tx operation not processed within 100msec\n"); + ret = -ETIMEDOUT; + } else if (espi_flash->tx_sts & + (ESPI_INT_STS_FLASH_TX_ERR | ESPI_INT_STS_FLASH_TX_ABT)) { + dev_notice(espi_flash->ctrl->dev, "eSPI Tx operation declined by remote\n"); + + ret = -EFAULT; + } else + ret = 0; + + spin_unlock_irqrestore(&espi_flash->spinlock, flags); + return ret; +} + +void aspeed_espi_flash_event(uint32_t sts, struct aspeed_espi_flash *espi_flash) +{ + unsigned long flags; + + if (!(sts & ESPI_INT_STS_FLASH_BITS)) + return; + + spin_lock_irqsave(&espi_flash->spinlock, flags); + espi_flash->rx_sts |= + sts & (ESPI_INT_STS_FLASH_RX_ABT | ESPI_INT_STS_FLASH_RX_CMPLT); + espi_flash->tx_sts |= + sts & (ESPI_INT_STS_FLASH_TX_ERR | ESPI_INT_STS_FLASH_TX_ABT | + ESPI_INT_STS_FLASH_TX_CMPLT); + spin_unlock_irqrestore(&espi_flash->spinlock, flags); + wake_up_interruptible(&espi_flash->wq); +} + +static int aspeed_espi_flash_erase(struct mtd_info *mtd, + struct erase_info *instr) +{ + struct aspeed_espi_flash *espi_flash = mtd->priv; + int ret = 0; + + /* Sanity checks */ + if ((uint32_t)instr->len % espi_flash->mtd.erasesize) + return -EINVAL; + + if ((uint32_t)instr->addr % espi_flash->mtd.erasesize) + return -EINVAL; + + mutex_lock(&espi_flash->lock); + + while (instr->len) { + ret = aspeed_espi_flash_put_tx(ESPI_FLASH_ERASE, + espi_flash->erase_mask, + instr->addr, NULL, 0, + espi_flash); + if (ret) + goto unlock_mtx_n_out; + + ret = aspeed_espi_flash_rx_get_completion(espi_flash); + if (ret) + goto unlock_mtx_n_out; + + instr->len -= espi_flash->mtd.erasesize; + instr->addr += espi_flash->mtd.erasesize; + } + +unlock_mtx_n_out: + instr->fail_addr = instr->addr; + + mutex_unlock(&espi_flash->lock); + return ret; +} + +static int aspeed_espi_flash_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + struct aspeed_espi_flash *espi_flash = mtd->priv; + uint16_t len_pt, len_rx; + size_t pkt_len; + uint8_t cyc; + int ret = 0; + + mutex_lock(&espi_flash->lock); + + while (len) { + len_pt = (len > ESPI_PLD_LEN_MIN) ? ESPI_PLD_LEN_MIN : len; + + ret = aspeed_espi_flash_put_tx(ESPI_FLASH_READ, len_pt, from, + NULL, 0, espi_flash); + if (ret) + goto unlock_mtx_n_out; + + pkt_len = len_pt; + len_rx = 0; + cyc = 0; + ret = aspeed_espi_flash_rx(&cyc, &len_rx, NULL, buf, &pkt_len, + espi_flash); + if (ret) + goto unlock_mtx_n_out; + + if (cyc != ESPI_FLASH_SUC_CMPLT_D_ONLY) { + dev_notice(espi_flash->ctrl->dev, "eSPI Rx response was not successful\n"); + ret = -EFAULT; + goto unlock_mtx_n_out; + } + if (pkt_len != len_pt) { + dev_notice(espi_flash->ctrl->dev, + "eSPI Rx response has unexpected data length\n"); + ret = -ENODATA; + goto unlock_mtx_n_out; + } + + len -= len_pt; + buf += len_pt; + from += len_pt; + *retlen += len_pt; + } + +unlock_mtx_n_out: + mutex_unlock(&espi_flash->lock); + return ret; +} + +static int aspeed_espi_flash_write(struct mtd_info *mtd, loff_t to, size_t len, + size_t *retlen, const u_char *buf) +{ + struct aspeed_espi_flash *espi_flash = mtd->priv; + uint16_t len_pt; + int ret = 0; + + mutex_lock(&espi_flash->lock); + + while (len) { + len_pt = (len > ESPI_PLD_LEN_MIN) ? ESPI_PLD_LEN_MIN : len; + + ret = aspeed_espi_flash_put_tx(ESPI_FLASH_WRITE, len_pt, to, + buf, len_pt, espi_flash); + if (ret) + goto unlock_mtx_n_out; + + ret = aspeed_espi_flash_rx_get_completion(espi_flash); + if (ret) + goto unlock_mtx_n_out; + + len -= len_pt; + buf += len_pt; + to += len_pt; + *retlen += len_pt; + } + +unlock_mtx_n_out: + mutex_unlock(&espi_flash->lock); + return ret; +} + +void aspeed_espi_flash_enable(struct aspeed_espi_flash *espi_flash) +{ + struct aspeed_espi_flash_dma *dma = &espi_flash->dma; + struct aspeed_espi_ctrl *espi_ctrl = espi_flash->ctrl; + + regmap_update_bits(espi_ctrl->map, ESPI_CTRL, + ESPI_CTRL_FLASH_SW_MODE_MASK, 0); + + /* Enable DMA transfers */ + regmap_write(espi_ctrl->map, ESPI_FLASH_TX_DMA, dma->tx_addr); + regmap_write(espi_ctrl->map, ESPI_FLASH_RX_DMA, dma->rx_addr); + regmap_update_bits( + espi_ctrl->map, ESPI_CTRL, + ESPI_CTRL_FLASH_TX_DMA_EN | ESPI_CTRL_FLASH_RX_DMA_EN, + ESPI_CTRL_FLASH_TX_DMA_EN | ESPI_CTRL_FLASH_RX_DMA_EN); + + /* Enable interrupts */ + regmap_write(espi_ctrl->map, ESPI_INT_STS, ESPI_INT_STS_FLASH_BITS); + + regmap_update_bits(espi_ctrl->map, ESPI_INT_EN, ESPI_INT_EN_FLASH_BITS, + ESPI_INT_EN_FLASH_BITS); + + /* Set Flash Channel Software Ready */ + regmap_update_bits(espi_ctrl->map, ESPI_CTRL, ESPI_CTRL_FLASH_SW_RDY, + ESPI_CTRL_FLASH_SW_RDY); +} + +void *aspeed_espi_flash_alloc(struct device *dev, + struct aspeed_espi_ctrl *espi_ctrl) +{ + int ret, index; + struct aspeed_espi_flash_dma *dma; + struct mtd_info *mtd; + struct aspeed_espi_flash *espi_flash; + struct resource res; + u32 reg; + + espi_flash = + devm_kzalloc(dev, sizeof(struct aspeed_espi_flash), GFP_KERNEL); + if (!espi_flash) + return ERR_PTR(-ENOMEM); + + espi_flash->ctrl = espi_ctrl; + + /* Bus lock */ + mutex_init(&espi_flash->lock); + + init_waitqueue_head(&espi_flash->wq); + + spin_lock_init(&espi_flash->spinlock); + + dma = &espi_flash->dma; + + dma->tx_virt = + dma_alloc_coherent(dev, PAGE_SIZE, &dma->tx_addr, GFP_KERNEL); + if (!dma->tx_virt) { + dev_err(dev, "cannot allocate DMA TX buffer\n"); + return ERR_PTR(-ENOMEM); + } + + dma->rx_virt = + dma_alloc_coherent(dev, PAGE_SIZE, &dma->rx_addr, GFP_KERNEL); + if (!dma->rx_virt) { + dev_err(dev, "cannot allocate DMA RX buffer\n"); + return ERR_PTR(-ENOMEM); + } + index = of_property_match_string(dev->of_node, "reg-names", + "espi_flash"); + ret = of_address_to_resource(dev->of_node, index, &res); + if (ret < 0) { + dev_err(dev, + "Could not find espi_flash resource block size in devtree\n"); + return ERR_PTR(-ENODEV); + } + reg = resource_size(&res); + mtd = &espi_flash->mtd; + mtd->dev.parent = dev; + mtd->size = reg; + mtd->flags = MTD_CAP_NORFLASH; + mtd->_erase = aspeed_espi_flash_erase; + mtd->_read = aspeed_espi_flash_read; + mtd->_write = aspeed_espi_flash_write; + mtd->type = MTD_NORFLASH; + mtd->name = "espi-flash-mafs"; + + regmap_read(espi_ctrl->map, ESPI_CH3_CAP_N_CONF, ®); + reg = (reg & ESPI_CH3_CAP_N_CONF_ERASE_MASK) >> + ESPI_CH3_CAP_N_CONF_ERASE_SHIFT; + espi_flash->erase_mask = reg; + switch (reg) { + case ESPI_CH3_CAP_N_CONF_ERASE_SIZE_4KB: + case ESPI_CH3_CAP_N_CONF_ERASE_SIZE_4KB_64KB: + mtd->erasesize = 0x1000; + espi_flash->erase_mask = 1; + break; + case ESPI_CH3_CAP_N_CONF_ERASE_SIZE_64KB: + mtd->erasesize = 0x10000; + break; + case ESPI_CH3_CAP_N_CONF_ERASE_SIZE_128KB: + mtd->erasesize = 0x20000; + break; + case ESPI_CH3_CAP_N_CONF_ERASE_SIZE_256KB: + mtd->erasesize = 0x40000; + break; + default: + dev_notice(dev, "Unknown erase size %x\n", reg); + return ERR_PTR(-ENODEV); + } + + mtd->writesize = 1; + mtd->owner = THIS_MODULE; + mtd->priv = espi_flash; + + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_notice(dev, "aspeed-espi-mtd: Failed to register mtd device\n"); + return ERR_PTR(ret); + } + + aspeed_espi_flash_enable(espi_flash); + return espi_flash; +} + +void aspeed_espi_flash_free(struct device *dev, + struct aspeed_espi_flash *espi_flash) +{ + struct aspeed_espi_flash_dma *dma = &espi_flash->dma; + + dma_free_coherent(dev, PAGE_SIZE, dma->tx_virt, dma->tx_addr); + dma_free_coherent(dev, PAGE_SIZE, dma->rx_virt, dma->rx_addr); + + mtd_device_unregister(&espi_flash->mtd); +} diff --git a/drivers/soc/aspeed/aspeed-espi-flash.h b/drivers/soc/aspeed/aspeed-espi-flash.h new file mode 100644 index 000000000000..08d0a79796e2 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-espi-flash.h @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2024 Aspeed Technology Inc. + */ +#ifndef _ASPEED_ESPI_FLASH_H_ +#define _ASPEED_ESPI_FLASH_H_ + +#include + +/* + * eSPI cycle type encoding + * + * Section 5.1 Cycle Types and Packet Format, + * Intel eSPI Interface Base Specification, Rev 1.0, Jan. 2016. + */ +#define ESPI_FLASH_READ 0x00 +#define ESPI_FLASH_WRITE 0x01 +#define ESPI_FLASH_ERASE 0x02 +#define ESPI_FLASH_SUC_CMPLT 0x06 +#define ESPI_FLASH_SUC_CMPLT_D_MIDDLE 0x09 +#define ESPI_FLASH_SUC_CMPLT_D_FIRST 0x0b +#define ESPI_FLASH_SUC_CMPLT_D_LAST 0x0d +#define ESPI_FLASH_SUC_CMPLT_D_ONLY 0x0f +#define ESPI_FLASH_UNSUC_CMPLT 0x0c +#define ESPI_FLASH_UNSUC_CMPLT_ONLY 0x0e + +/* + * we choose the longest header and the max payload size + * based on the Intel specification to define the maximum + * eSPI packet length + */ +#define ESPI_PLD_LEN_MIN (1UL << 6) +#define ESPI_PLD_LEN_MAX (1UL << 12) + + +enum aspeed_espi_flash_safs_mode { + SAFS_MODE_MIX, + SAFS_MODE_SW, + SAFS_MODE_HW, + SAFS_MODES, +}; + +struct aspeed_espi_flash_dma { + void *tx_virt; + dma_addr_t tx_addr; + void *rx_virt; + dma_addr_t rx_addr; +}; + +struct aspeed_espi_flash { + + unsigned short page_offset; /* offset in flash address */ + unsigned int page_size; /* of bytes per page */ + struct mutex lock; + struct aspeed_espi_flash_dma dma; + struct mtd_info mtd; + struct aspeed_espi_ctrl *ctrl; + uint8_t erase_mask; + uint32_t tx_sts; + uint32_t rx_sts; + wait_queue_head_t wq; + spinlock_t spinlock; +}; + +void aspeed_espi_flash_event(uint32_t sts, struct aspeed_espi_flash *espi_flash); +void aspeed_espi_flash_enable(struct aspeed_espi_flash *espi_flash); +void *aspeed_espi_flash_alloc(struct device *dev, struct aspeed_espi_ctrl *espi_ctrl); +void aspeed_espi_flash_free(struct device *dev, struct aspeed_espi_flash *espi_flash); + +#endif + From patchwork Tue Mar 19 09:34:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manojkiran Eda X-Patchwork-Id: 1913476 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=xjjp7TKi; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=HnzpqLeP; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TzRRr6Zhqz23sG for ; Tue, 19 Mar 2024 20:36:08 +1100 (AEDT) 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:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=kzkw4lki4Yq8zxA+XLO4vZzmiiewoIV0kSNxVwBzmAg=; b=xjjp7TKiIvYKFe 5Ivck1T4412qPPDVheudEBWy6ti/ie5pycpQL8LU2yJTcXzYRmXEcjmhQk0HTBCOp+1vTRWiKFzo/ +8CNvLVdzfmdAtLE7B5urLZPP58kathF2xRHmZAeSOgxTyDk2Fy8+ptHjjBtgz+oVNnc1RrtC92W+ DJHqmOFlvmITyIi1nawVN00ugrFqQsg5XcOW4bJda0nNfL9sgSQjxiNrzkYx/tVEUCZjr7YqO8sve iWhsIEMcSbdCJ0VbgFCygpM+G/BaEDlLDdKKPjGhteCLTLe0Q2HoHcjDsu+YP9Mxgsw4VNFeVmKJ5 +cWoc54SzwOBukQANvBg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVsx-0000000C766-10eB; Tue, 19 Mar 2024 09:35:55 +0000 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVsb-0000000C6ro-0lWF; Tue, 19 Mar 2024 09:35:35 +0000 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-1dc29f1956cso31368175ad.0; Tue, 19 Mar 2024 02:35:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710840932; x=1711445732; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=e94g+9vzH11aUQZhgMcMoQcXNPU48KmdzBLfG1dsEIk=; b=HnzpqLePyEFWC3PPJZ5hRfareH75Wbhl/eFH/53gVisj2r1oT6Rp3392ZSdzknmLdI 9NkgCC1P01hGZYCuDyC5e993RHuNYMhlblYZUAxtFKPBcDM2LG5Z7gYJFNmfoXgKTkQ9 Ynr90WNf+L+92F8O8pP9wMMUIUCVvXZnM9G6tVU/MFlYNqPs8xrsyivT2qzIRQO5oEA0 0dK2MMBSNln1xiNN/UXUq5syh1NYeXfZrk2Nx0v64vD2Kam1rVSZV32rmq4isPe9ZO6y /+6hDRKrt7TraEIXDI0t8cd0ypKLa9I75thcZsnjeVdNpWtbECzhI5lKB9hzxSvVK2mv utjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710840932; x=1711445732; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=e94g+9vzH11aUQZhgMcMoQcXNPU48KmdzBLfG1dsEIk=; b=FBslhEs0Zh7HXmdK44P5ty+DGRNaPIy3KGwRR0VkyDYD4g8cW4rkXSZNn7YtZV99Wh 0UE9r32HjdYp0JzBissNrXMh2T3ivZeq2GbhWS2lLkd/bBpGCR0Q/9xZH1aAnW7hgoob xh9NbzhKLB0BemNE6qTXZVoZooh4k9njB1go7wrcw5HrKIXCtw01f3DZi36bT1R3f0qg uM8tRie/jIT3fB8hxBf3OUzpQ1nOohCYJe+kMDlEKIm56hXkN7eWwty257aEb9hAx8OI 0nIp1/2U2zU9wq8KPfhZ+BNxPrqdSn0anzDayFSSIsTqRxqt2TX/To1YWyxUCnMxFPIu K5LA== X-Forwarded-Encrypted: i=1; AJvYcCXVveUtB1iH5y/jpM9L8xEgwGdhgrgKaPqhOLPnZgqpFpHS7VvkVM7joC1jygkErMjMUU7QVCE3IMCIf6zOyvG1Snl5VlFZeEE5VkT9wJhs6yirkv4SMBNtADUQSZG9giS0RSJ0h0bK9AwD/CosVMHH7jXA X-Gm-Message-State: AOJu0Yw/pV6Hwmev8dKzDW7DaODr7u1PhmyzLLXbUsQXc0DVlKzvrFqc sD7GFpiyPgGQPhcceiHMx57w9Z8ZWjeYx+WK1tSVqB8d0MDIOSji X-Google-Smtp-Source: AGHT+IGRQerkxhBoo9SgQmB9rahSKXo6Kh9y5bn7m0LW33X3wWAr2V/9ZSigvft5pwucY8WqXpU8Zg== X-Received: by 2002:a17:902:ea08:b0:1db:55cc:d226 with SMTP id s8-20020a170902ea0800b001db55ccd226mr12398549plg.66.1710840932208; Tue, 19 Mar 2024 02:35:32 -0700 (PDT) Received: from localhost.localdomain ([129.41.58.3]) by smtp.gmail.com with ESMTPSA id n5-20020a170903110500b001ddc0bc5934sm10942432plh.249.2024.03.19.02.35.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 02:35:31 -0700 (PDT) From: Manojkiran Eda To: patrick.rudolph@9elements.com, chiawei_wang@aspeedtech.com, ryan_chen@aspeedtech.com, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, joel@jms.id.au, andrew@codeconstruct.com.au, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, manojkiran.eda@gmail.com, jk@codeconstruct.com.au, openbmc@lists.ozlabs.org Subject: [PATCH v2 2/4] mtd: Replace module_init with subsys_initcall Date: Tue, 19 Mar 2024 15:04:03 +0530 Message-Id: <20240319093405.39833-3-manojkiran.eda@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240319093405.39833-1-manojkiran.eda@gmail.com> References: <20240319093405.39833-1-manojkiran.eda@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240319_023533_264266_F1812864 X-CRM114-Status: GOOD ( 12.98 ) X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: While engaged in development on the espi kernel device driver[1], I noticed that the espi flash driver, utilizing the mtd subsystem, appears to initialize before the mtdcore subsystem registers the mt [...] Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:633 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [manojkiran.eda(at)gmail.com] -0.0 T_SCC_BODY_TEXT_LINE No description available. X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org While engaged in development on the espi kernel device driver[1], I noticed that the espi flash driver, utilizing the mtd subsystem, appears to initialize before the mtdcore subsystem registers the mtd_class. As a result, although the mtd device for espi is created, it does not populate within the /sys/class/mtd hierarchy. Given that mtd serves as a subsystem upon which numerous other drivers rely for infrastructure, it appears logical to adjust the module_init() call to an alternative priority initcall, subsys_initcall(), thereby ensuring that the mtd core subsystem is probed prior to the drivers utilizing its infrastructure. Although this adjustment alters the initialization ordering, there exists a slight risk of uncovering implicit initialization ordering issues. However, I believe it is preferable to prioritize it reasonably rather than having module_init() in order to maintain the exact old ordering. Link : [1] https://lore.kernel.org/openbmc/20240213-espi_driver-v1-1-92741c812843@gmail.com Signed-off-by: Manojkiran Eda --- drivers/mtd/mtdcore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index e451b28840d5..cc51c9fb2c1e 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -2560,7 +2560,7 @@ static void __exit cleanup_mtd(void) idr_destroy(&mtd_idr); } -module_init(init_mtd); +subsys_initcall(init_mtd); module_exit(cleanup_mtd); MODULE_LICENSE("GPL"); From patchwork Tue Mar 19 09:34:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manojkiran Eda X-Patchwork-Id: 1913477 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=2dAh47Tf; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=SuuS6Ct5; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TzRS12Jg0z23sG for ; Tue, 19 Mar 2024 20:36:17 +1100 (AEDT) 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:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Uw64ObE/r4dUAF0D8uFaBpl1D+zFeNubrHgdu3M1/h0=; b=2dAh47Tf/KUgVc MqNEZBjfhhZLp/xKUaFZJrha+M1s+Y+7Ax9eBWYVfhe1+SU8Nm5j6+DrcXsO56yKMC3BP40x8vDAW ei8qZsu73EI9WHb/2PukCg7oaoZWEWDazIAE2C1KVfvMxLjMgK9Xs3PcDdeBxBacw3n42DsufUGV9 abHi2DQRHMF6bHXmMjVQ/iTtLEmeRmJR4n9g0YF3NL2D9+eWQ5byDvuP4gRPW9ZvghEAE7/gnSZch R3e35lqdpYDslmokKdqx8ZoiiGgAT8AVqxwwlUUnGYNvwtHZDkgz4q2Cvq6BNw6/8Bee/TXdTUJXK XoAz0JOBn6tuJRLv+ESQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVt4-0000000C7BF-3ulA; Tue, 19 Mar 2024 09:36:02 +0000 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVsh-0000000C6uw-2uTy; Tue, 19 Mar 2024 09:35:44 +0000 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-1def142ae7bso35128865ad.3; Tue, 19 Mar 2024 02:35:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710840937; x=1711445737; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=O8lLJjV9sz++A3S70yTL0kgzPdOoYGF0BKRxiCCU5iY=; b=SuuS6Ct5fsj/UnKnHlUOOKFp8kggPaQVcUK+acKPNvlBR7ftiFKU1SyW7hJ5scV7Md SjTVgNrJvcmytXbYsYQ/PJNuUam7BeUlXMSPSTfIkOBN/23i6DvKtZDumyDPFqmB/RB5 eULpNjJkj2/Ue/sPaj2gHgdqLWxkQY4l/y4J5e9/PCx+nzQLruN8jdVrtlEAXGOikEAZ c3I+lk/wHKxxjhsSxkQuXEo1UHL4hpQTALgm4UANooaD9Ou7HacITAPrvjtz4siLrIyd Vl7Tdd7oawE+HiMQ82EOjT9ZREIgC+tdKEy95iaPASOS/oXc9xZDylU4vzxLoHQ59JYw xxlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710840937; x=1711445737; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=O8lLJjV9sz++A3S70yTL0kgzPdOoYGF0BKRxiCCU5iY=; b=vq+wnd8+ZaShKw/sKv1Q49CUJiHER++msfSbagJc3gaoDUEjF4yTGEs9PtYhWS6Q4z rmexM0OjIu2ymtEIJyDrnjb+yFwzMy8sUB/pfL1FUzQgulB5v7qPNf1jc7r9QKYMM4nv WC9pClR2urgsWUQhemqGSaWvWxsHDLF4h3WBXjlUP+NuotMQ2+VSOzxF+ZEjcIejMhtn Vdw7eKAj568jr0yZzcGNI5QClJ76Rr3Mb/ZzOMXronkynjB3Qd10eObz3QfqpLkn4MJ3 bnbr5zs/ux2wHv0jNGKcT71tLnqaXsbcKDQo5ByzxKvKNwIJ9SrltFTnaF5rS6EjfoEn SWrw== X-Forwarded-Encrypted: i=1; AJvYcCVkH9D4kVbM0AmowxlUsQV4w/nwJa+bLAzBYixAee4EjUQ35MKDPzYeHWQa+4qH21Pczb9a8MesyXgUuVCzxRBeL8wYHeNkJbK8ZAYNyC8mJ5GGxvQiKHtwxxEhDz2RRfwEuXDWxSM6+xrV66Pf32OuUTgc X-Gm-Message-State: AOJu0YxrLi6kMn/tH4bG6MTkPugP7fl6IsJ6B2Wo9wZU6CyG+yzXqWqf Hu4z9wOFPJdqBNS5w2at0r5DhDl9DdFgTi4eKz1Rmm2H7Y7V+usahjRnGgQJXAQ= X-Google-Smtp-Source: AGHT+IGMXcgzPbiRbAaZnXiJWR2s96AphzV/ePKBVZUQDbytucyVA3PArFmkTCYWRUbf042LO6gbGA== X-Received: by 2002:a17:902:cecc:b0:1dd:8bc5:afe3 with SMTP id d12-20020a170902cecc00b001dd8bc5afe3mr18719900plg.1.1710840937439; Tue, 19 Mar 2024 02:35:37 -0700 (PDT) Received: from localhost.localdomain ([129.41.58.3]) by smtp.gmail.com with ESMTPSA id n5-20020a170903110500b001ddc0bc5934sm10942432plh.249.2024.03.19.02.35.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 02:35:37 -0700 (PDT) From: Manojkiran Eda To: patrick.rudolph@9elements.com, chiawei_wang@aspeedtech.com, ryan_chen@aspeedtech.com, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, joel@jms.id.au, andrew@codeconstruct.com.au, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, manojkiran.eda@gmail.com, jk@codeconstruct.com.au, openbmc@lists.ozlabs.org Subject: [PATCH v2 3/4] ARM: dts: aspeed: Add eSPI node Date: Tue, 19 Mar 2024 15:04:04 +0530 Message-Id: <20240319093405.39833-4-manojkiran.eda@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240319093405.39833-1-manojkiran.eda@gmail.com> References: <20240319093405.39833-1-manojkiran.eda@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240319_023539_967859_6CCB9A34 X-CRM114-Status: UNSURE ( 9.61 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: This commit adds eSPI to the device tree for aspeed 5/6th generation SoCs. Signed-off-by: Manojkiran Eda --- arch/arm/boot/dts/aspeed/aspeed-g5.dtsi | 19 +++++++++++++++++++ arch/arm/boot/dts/aspeed/aspeed-g6.dtsi | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:62e listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [manojkiran.eda(at)gmail.com] -0.0 T_SCC_BODY_TEXT_LINE No description available. X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This commit adds eSPI to the device tree for aspeed 5/6th generation SoCs. Signed-off-by: Manojkiran Eda --- arch/arm/boot/dts/aspeed/aspeed-g5.dtsi | 19 +++++++++++++++++++ arch/arm/boot/dts/aspeed/aspeed-g6.dtsi | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/arch/arm/boot/dts/aspeed/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed/aspeed-g5.dtsi index 04f98d1dbb97..eaf7d82b6f46 100644 --- a/arch/arm/boot/dts/aspeed/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed/aspeed-g5.dtsi @@ -343,6 +343,25 @@ sdhci1: sdhci@200 { status = "disabled"; }; }; + espi: espi@1e6ee000 { + compatible = "aspeed,ast2500-espi", "simple-mfd", "syscon"; + reg = <0x1e6ee000 0x1000>; + + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x1e6ee000 0x1000>; + + espi_ctrl: espi-ctrl@0 { + compatible = "aspeed,ast2500-espi-ctrl"; + reg = <0x0 0x800>,<0x0 0x4000000>; + reg-names = "espi_ctrl","espi_flash"; + interrupts = <23>; + clocks = <&syscon ASPEED_CLK_GATE_ESPICLK>; + status = "disabled"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_espi_default>; + }; + }; gpio: gpio@1e780000 { #gpio-cells = <2>; diff --git a/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi index c4d1faade8be..094e14442101 100644 --- a/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi +++ b/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi @@ -454,6 +454,26 @@ video: video@1e700000 { status = "disabled"; }; + espi: espi@1e6ee000 { + compatible = "aspeed,ast2500-espi", "simple-mfd", "syscon"; + reg = <0x1e6ee000 0x1000>; + + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x1e6ee000 0x1000>; + + espi_ctrl: espi-ctrl@0 { + compatible = "aspeed,ast2500-espi-ctrl"; + reg = <0x0 0x800>,<0x0 0x4000000>; + reg-names = "espi_ctrl","espi_flash"; + interrupts = <23>; + clocks = <&syscon ASPEED_CLK_GATE_ESPICLK>; + status = "disabled"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_espi_default>; + }; + }; + gpio0: gpio@1e780000 { #gpio-cells = <2>; gpio-controller; From patchwork Tue Mar 19 09:34:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manojkiran Eda X-Patchwork-Id: 1913478 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=pEbzfMF3; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=mWPKKi+g; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TzRSG4sfgz23sG for ; Tue, 19 Mar 2024 20:36:30 +1100 (AEDT) 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:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=S6oOc67XyJBf+Z5/VVr9YPso2ej/XCqsRVOmX2yfOno=; b=pEbzfMF3Lv/otw 8vqbB8j+BnoR8hqmfQxTC4qB6PrAfZyuV4NRUnrpxaRrJv7qnxaLppHHazTGIzSPjCpzjUYoqM6jQ 4bwMwYAl1OHT4D4dFpTI5hs5jCsLTcVWATnma5LjamzgocfpNK5IDd+TPErI48rN7Wh/PPEAkWa3a V3lEbSsspRtb+LWqjRX+bsn4IPg39kbmV9XLqAaAlQxeIjQVQ6jSHUTiEzAiA8/8UsllCHfXuTylS J4Ly+RXT8aCuLYHiQ1DAJaYo3Fy9z4Seo+1BlxiQ4YUaXS/LD0j9bKcm0VS1AHjUldatY16c+1FAu eHarYrXe3ZayFT6GgtGA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVtG-0000000C7K1-3GqU; Tue, 19 Mar 2024 09:36:14 +0000 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmVsn-0000000C6z4-0wpd; Tue, 19 Mar 2024 09:35:48 +0000 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1dee5daa236so35447415ad.0; Tue, 19 Mar 2024 02:35:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710840943; x=1711445743; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HpO3XyTMYrNp26rIW9VgOyOw5H/JJ52pteRLCcl6qlU=; b=mWPKKi+gp73Wv7Cm7krkhRCMCeQNSuI58xcemVWtmPOv7E8EweS1V3VsJNRx+hnING foN3NIkMLVpeGn4R2xycr7b4ILojcWfM5lNLoNP//ne+yvjDkVOO65c5rsndBgP2i80g CUGrEMCREPVfbAzYyRa+tk5UnK3PgL15ynRvjsui/4cZuAAOpXww4mhs7Fx12vUFGugU C6OEgV8OF5QVA2+Br6hKKRHRTKhhFvtu8kzJm1cxnUPWWZXg4tGSkyfAogA/0vS3008t 94+y1z8M9ab+2/JyKOHWLnsKPhI6X5dPvkW3SRAMZqNfazTuteYyFII4AG7HDGbGrxS1 gXGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710840943; x=1711445743; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HpO3XyTMYrNp26rIW9VgOyOw5H/JJ52pteRLCcl6qlU=; b=VxshWIMqbZcpB9qc44j7tTqca81vcAyAiKjyZLIEyNP5bWgukuIcNvmYtTFUXY56Re s16bfxBCHOSSqNJM6prPP6a387VPGttNJmG9JD6tbbramZ9mXK8BCANslzyfmZLt2ZsK IEk9qnIK88yzALpwU+Gdzew4eq9PKu0jeb8s2wffuOumdSuW2OYoS/fshyAHbvJYHCj+ WDc9XgvzNg1sTkrF1rQmH+BWTnbP9lF+EMS1bvckr04CmaLORY8aseVww3++DAJw3fgU iFfiIFXKbBV4nwNAtaL7FHBtCeBLQ+LDVN+1tQWRMo811qMjsVtPUzJ1scjimg7kzKvk h1MQ== X-Forwarded-Encrypted: i=1; AJvYcCXrpYG561oXo/qlPNfXRVnUcU5uqv907pgW5kN/ZnJqqzg1pWtDIjjoFBakuuNEaIiULaDBAD67g/WlaU+L8wwwx2HPdiKiLvrXVJyVDZSFttCgRWbY4Nr0+nTRpkPWMV2/Iaw0ZfALxx9iy4PEcp/OL8oF X-Gm-Message-State: AOJu0Yy+CrdCEZz5g4XtDHvWmk8XasiHuQLsDyDo3qbUAx2KgEccA7rB +OB6aYfDvs0tJ+eCDuE1pami6WDBy6rnj3ASGq5gaEKq/GPdxg9Z X-Google-Smtp-Source: AGHT+IHryBKHJ+MSwjp/1byfMt0hDod5YQF/OmkAgxcU2UHV4h3fLG6PWHn1lTiV9EhL0mWJM96Kow== X-Received: by 2002:a17:902:e88a:b0:1e0:2c80:2aaf with SMTP id w10-20020a170902e88a00b001e02c802aafmr5518425plg.44.1710840942841; Tue, 19 Mar 2024 02:35:42 -0700 (PDT) Received: from localhost.localdomain ([129.41.58.3]) by smtp.gmail.com with ESMTPSA id n5-20020a170903110500b001ddc0bc5934sm10942432plh.249.2024.03.19.02.35.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 02:35:42 -0700 (PDT) From: Manojkiran Eda To: patrick.rudolph@9elements.com, chiawei_wang@aspeedtech.com, ryan_chen@aspeedtech.com, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, joel@jms.id.au, andrew@codeconstruct.com.au, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, manojkiran.eda@gmail.com, jk@codeconstruct.com.au, openbmc@lists.ozlabs.org Subject: [PATCH v2 4/4] dt-bindings: aspeed: Add eSPI controller Date: Tue, 19 Mar 2024 15:04:05 +0530 Message-Id: <20240319093405.39833-5-manojkiran.eda@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240319093405.39833-1-manojkiran.eda@gmail.com> References: <20240319093405.39833-1-manojkiran.eda@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240319_023545_483088_C6660E49 X-CRM114-Status: GOOD ( 13.99 ) X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: This commit adds the device tree bindings for aspeed eSPI controller. Although aspeed eSPI hardware supports 4 different channels, this commit only adds the support for flash channel, the bindings for other channels could be upstreamed when the driver support for those [...] Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:630 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [manojkiran.eda(at)gmail.com] -0.0 T_SCC_BODY_TEXT_LINE No description available. X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This commit adds the device tree bindings for aspeed eSPI controller. Although aspeed eSPI hardware supports 4 different channels, this commit only adds the support for flash channel, the bindings for other channels could be upstreamed when the driver support for those are added. Signed-off-by: Manojkiran Eda --- .../bindings/soc/aspeed/aspeed,espi.yaml | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Documentation/devicetree/bindings/soc/aspeed/aspeed,espi.yaml diff --git a/Documentation/devicetree/bindings/soc/aspeed/aspeed,espi.yaml b/Documentation/devicetree/bindings/soc/aspeed/aspeed,espi.yaml new file mode 100644 index 000000000000..3d3ad528e3b3 --- /dev/null +++ b/Documentation/devicetree/bindings/soc/aspeed/aspeed,espi.yaml @@ -0,0 +1,94 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# # Copyright (c) 2024 IBM Corporation. +# # Copyright (c) 2021 Aspeed Technology Inc. +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/soc/aspeed/aspeed,espi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Aspeed eSPI Controller + +maintainers: + - Manojkiran Eda + - Patrick Rudolph + - Chia-Wei Wang + - Ryan Chen + +description: + Aspeed eSPI controller implements a device side eSPI endpoint device + supporting the flash channel. + +properties: + compatible: + items: + - enum: + - aspeed,ast2500-espi + - aspeed,ast2600-espi + - const: simple-mfd + - const: syscon + + reg: + maxItems: 1 + + "#address-cells": + const: 1 + + "#size-cells": + const: 1 + + ranges: true + +patternProperties: + "^espi-ctrl@[0-9a-f]+$": + type: object + + description: Controls the flash channel of eSPI hardware + + properties: + compatible: + items: + - enum: + - aspeed,ast2500-espi-ctrl + - aspeed,ast2600-espi-ctrl + + interrupts: + maxItems: 1 + + clocks: + maxItems: 1 + + required: + - compatible + - interrupts + - clocks + +required: + - compatible + - reg + - "#address-cells" + - "#size-cells" + - ranges + +additionalProperties: false + +examples: + - | + #include + #include + + espi: espi@1e6ee000 { + compatible = "aspeed,ast2600-espi", "simple-mfd", "syscon"; + reg = <0x1e6ee000 0x1000>; + + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x1e6ee000 0x1000>; + + espi_ctrl: espi-ctrl@0 { + compatible = "aspeed,ast2600-espi-ctrl"; + reg = <0x0 0x800>,<0x0 0x4000000>; + reg-names = "espi_ctrl","espi_flash"; + interrupts = ; + clocks = <&syscon ASPEED_CLK_GATE_ESPICLK>; + }; + };