From nobody Wed Aug 26 14:38:04 2026 Received: from mail-wm2-f2.google.com (mail-wm2-f2.google.com [74.125.225.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AF28F41CB3F for ; Wed, 8 Jul 2026 15:38:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.130 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783525124; cv=none; b=VkJFobuQHNkmhkekAQpI1lhg3UXMx/6UYSRyzCqg966nyht1VPiIVHpPKiBx3V1mnmIW05KYLovyOt/WJc2Eil1BUPnzEmYcQZSkxITd+ghbo/iPTQA0Eg6MN41zRq0mRfWBt/eP70YIuhVrFQAXmYM0UOTqSESL5YXfLXMdNyQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783525124; c=relaxed/simple; bh=Cuf6+ZFpQj9as82hqAYL+jDoHowhB1w1fudH1PX2eog=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=neLuH8zFjxWngHR0oiMhK8TbcdkT2FJDbkraU6s6f7Zelg08V1VK4LUdjSCGUHzG2fieaQ6CsJsdyKE9TMkFxLpXks6/yl7Geb+lkEKPNluwh4hFlQbG8lpCzjI2NSzoL6Y9SOiYYnjjJTCaLX2c+0yjBy+tOlrpDa1FqN1N0Z8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=9elements.com; spf=pass smtp.mailfrom=9elements.com; dkim=pass (2048-bit key) header.d=9elements.com header.i=@9elements.com header.b=LB8LH953; arc=none smtp.client-ip=74.125.225.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=9elements.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=9elements.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=9elements.com header.i=@9elements.com header.b="LB8LH953" Received: by mail-wm2-f2.google.com with SMTP id 5b1f17b1804b1-49242309566so1415975e9.0 for ; Wed, 08 Jul 2026 08:38:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; t=1783525121; x=1784129921; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=f1Rm+ycDLzcJTW5brmAbfPnl/20w3yUac+m/GbIIsJs=; b=LB8LH953g6QNFsMNzHBHh2rZHbMGPJOZZogRPhXpQuARsnU66JCl8DZ7lSyW7xHJaH BlZ7TAznJABPdMUXiQtn5MskJsLWJBzFkl44uezqwGDuqxTxiQvECnsVUxqqhzKg+O93 yELc5OJ1SIOrdCNLN5nbodnLxl65K9jzZtltnXYbBuJvvdL2d9gzyvZygFpawpijlkrD qtE8llpJbn7SFEr11jzHYGi+Ubi0nI3n8vvu0oI0lPdd76jhG82H50C0i4uuSe2M1nM+ b3k8/cYWBJKWQTpb+9Zysk/TmAjlhMpzRwByZSIuV8rN2qt+HXWWv1TCFoHJVBDcLn5D L2GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783525121; x=1784129921; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=f1Rm+ycDLzcJTW5brmAbfPnl/20w3yUac+m/GbIIsJs=; b=rOszFzaaa8WRkSlOHX53BJ/dpH551UqdJI+CV6a5RKphiXo0hOOQbx+GeMZWCZZWTk v2ZJcIItdxzL9hojXBPTUbJYDELmbYQD5f9J5Ij0Hb9t8rL0cOAQLqm8g9tsqOr8LWP1 3L2HGMLZY80Sm5lcgnQYLDhJAmsKM4R3E6Dmc/J0rRX0JZjFHszp7+NUsFwI/ceerLyr 7PO3SZmtcZSTGbD3X/KCcHWJCisdrm13kutV9Bgp6EpEubcNDDgvgTIUAYGKImS/TvMK YyHpm+MmMtYTsUCm98ZjIv+OqLm07ZmevsKPko86cRl5XXoMfS1tbZ5vW9JL4bqAZ6hJ Dyhw== X-Forwarded-Encrypted: i=1; AHgh+Ro7djxhldLKq2KRJ1OTH+pmIt/dhLWshSilSKs5WXsEUgV8Y2qSKAm6dKb3NiRf3Pz1XyuGOjlLwzUUxq0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy56E0AZwdw0xr8U4N38AzJCM1no3PGChUNdH6lAYyQG1tA3glL TtdKKVuzfJ/NL2kOBZBa+wuYwZ4izW15Ev9CNXuYGYhzF7xXT4QQZhjlYp+dBHBRIuU= X-Gm-Gg: AfdE7cm0omzqpqk428nWhQ8V3fznJGZaum1Al/sslh0OsshWG+9GSCXoq6exDTMfQ+1 HWgpcXcsl0GCfGjebvRC53UEUJKjeXcGANRA+M8uqUPDO0QZkWABLDnurdPuw/N0NBvl9iNqcn2 Pm/wj0u7DVCFWm1yffpWJomKXLt8FZaOXn7xZWSKvjhgSsY0xx1XRJFlAxbgBE/Cil178yx0F1m FshdWjWnjrRpSSPbYNGeT0eFzaMQHwUij/9KrbUI8g8+NCx+0oYY/4YC5Q8yBrkxg48TnPKUqj2 eaBhahw3ZZ9d2qeRYHmsZxtp1yPGMPhfEgbZzLsR9ICEyYMju49+9bR6eBlG1HmnjUFyiX3b9Cu SlFFJyUD6auShaw9AivxFMMwdVpbSHs9WkNTQQEqU5ESjWjbFwiB/2ERT27rv8jtjOo59TpIrDA C/7LmaMIHJKHzenzLh2DAxkODp65UTgabS9wj66vXfOTgJ6QLkvOB59EoLJ9DtZEeEqKgifmRpE a50+8DTFP3PRiXHKu+NQliP4oQX X-Received: by 2002:a05:600c:8b72:b0:493:c634:952 with SMTP id 5b1f17b1804b1-493e69b0dc8mr29860325e9.7.1783525121089; Wed, 08 Jul 2026 08:38:41 -0700 (PDT) Received: from gregwork.sec.9e.network ([188.111.3.154]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47a9e4d8410sm44254136f8f.15.2026.07.08.08.38.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jul 2026 08:38:40 -0700 (PDT) From: =?UTF-8?q?Gr=C3=A9goire=20Layet?= To: joel@jms.id.au, andrew@codeconstruct.com.au, lkundrak@v3.sk, devicetree@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: andrew@lunn.ch, jacky_chou@aspeedtech.com, yh_chung@aspeedtech.com, ninad@linux.ibm.com, anirudhsriniv@gmail.com, linux-serial@vger.kernel.org, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Gr=C3=A9goire=20Layet?= Subject: [PATCH v4 5/7] soc: aspeed: add host-side PCIe BMC device driver Date: Wed, 8 Jul 2026 15:35:57 +0000 Message-ID: <51e455417bdcfe608270c6cb2806b1fd971fb998.1783524645.git.gregoire.layet@9elements.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add support for VUART over PCIe between BMC and host. Add the host side driver. Support only the AST2600. Taken from ASPEED 6.18 Kernel SDK and trimmed down. The host can't detect the VUART addresses, so force them to 0x3f8 and 0x2f8, as in the initial ASPEED driver. Change the MSI vector index of VUART2 from 15 to 17. The index 15 used in the initial driver was not working. Data path in both direction is tested on both VUART. This module is added in soc/aspeed as it's very soc specific. This is not added as a PCI 8250 UART device as this host module can be expanded upon for IPMI over KCS. It can also be used in the future for custom BMC<->host communication with shared memory and doorbell. This host module should be the entry point for setting up all features related to an AST2600 present on the PCI bus. Signed-off-by: Jacky Chou Signed-off-by: aspeedyh Signed-off-by: Gr=C3=A9goire Layet --- drivers/soc/aspeed/Kconfig | 15 ++ drivers/soc/aspeed/Makefile | 1 + drivers/soc/aspeed/aspeed-host-bmc-dev.c | 174 +++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 drivers/soc/aspeed/aspeed-host-bmc-dev.c diff --git a/drivers/soc/aspeed/Kconfig b/drivers/soc/aspeed/Kconfig index f579ee0b5afa..147a9033bdc4 100644 --- a/drivers/soc/aspeed/Kconfig +++ b/drivers/soc/aspeed/Kconfig @@ -55,3 +55,18 @@ config ASPEED_SOCINFO endmenu =20 endif + +menu "ASPEED host-side drivers" + depends on PCI + +config ASPEED_HOST_BMC_DEV + tristate "ASPEED host-side BMC PCIe device" + depends on SERIAL_8250 + help + Host-side driver for the ASPEED AST2600 BMC PCIe device found on + BMC expansion cards. Exposes two 8250-compatible VUART + ports. + + If unsure, say N. Choose M to build aspeed-host-bmc-dev. + +endmenu diff --git a/drivers/soc/aspeed/Makefile b/drivers/soc/aspeed/Makefile index b35d74592964..c515e163eab7 100644 --- a/drivers/soc/aspeed/Makefile +++ b/drivers/soc/aspeed/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only +obj-$(CONFIG_ASPEED_HOST_BMC_DEV) +=3D aspeed-host-bmc-dev.o obj-$(CONFIG_ASPEED_LPC_CTRL) +=3D aspeed-lpc-ctrl.o obj-$(CONFIG_ASPEED_LPC_SNOOP) +=3D aspeed-lpc-snoop.o obj-$(CONFIG_ASPEED_UART_ROUTING) +=3D aspeed-uart-routing.o diff --git a/drivers/soc/aspeed/aspeed-host-bmc-dev.c b/drivers/soc/aspeed/= aspeed-host-bmc-dev.c new file mode 100644 index 000000000000..e586d0505577 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-host-bmc-dev.c @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Copyright (C) ASPEED Technology Inc. + +#include +#include +#include +#include +#include +#include +#include + +#define BMC_MULTI_MSI 32 +#define PCI_BMC_DEVICE_ID 0x2402 + +#define DRIVER_NAME "aspeed-host-bmc-dev" + +enum aspeed_platform_id { + ASPEED, +}; + +static const int vuart_msi_index[2] =3D { 16, 17 }; +static const int vuart_port_addr[2] =3D {0x3f8, 0x2f8}; + +struct aspeed_pci_bmc_dev { + unsigned long message_bar_base; + + struct uart_8250_port uart[2]; + int uart_line[2]; +}; + +static int aspeed_pci_bmc_device_setup_vuart(struct pci_dev *pdev, int idx) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + struct device *dev =3D &pdev->dev; + struct uart_8250_port *uart =3D &pci_bmc_dev->uart[idx]; + u16 vuart_ioport; + int ret; + + /* Assign the line to non-exist device before everything is setup */ + pci_bmc_dev->uart_line[idx] =3D -ENOENT; + + vuart_ioport =3D vuart_port_addr[idx]; + /* ASPEED BMC device shift addresses by 2 to the left */ + vuart_ioport =3D vuart_ioport << 2; + + uart->port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; + uart->port.uartclk =3D 115200 * 16; + uart->port.irq =3D pci_irq_vector(pdev, vuart_msi_index[idx]); + uart->port.dev =3D dev; + uart->port.iotype =3D UPIO_MEM32; + uart->port.iobase =3D 0; + uart->port.mapbase =3D pci_bmc_dev->message_bar_base + vuart_ioport; + uart->port.membase =3D 0; + uart->port.type =3D PORT_16550A; + uart->port.flags |=3D (UPF_IOREMAP | UPF_FIXED_PORT | UPF_FIXED_TYPE); + uart->port.regshift =3D 2; + + ret =3D serial8250_register_8250_port(&pci_bmc_dev->uart[idx]); + if (ret < 0) { + dev_err_probe(dev, ret, "Can't setup PCIe VUART%d\n", idx); + return ret; + } + + pci_bmc_dev->uart_line[idx] =3D ret; + + return 0; +} + +static void aspeed_pci_host_bmc_device_release_vuart(struct pci_dev *pdev,= int idx) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + + if (pci_bmc_dev->uart_line[idx] >=3D 0) + serial8250_unregister_port(pci_bmc_dev->uart_line[idx]); +} + +static int aspeed_pci_host_setup(struct pci_dev *pdev) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + int rc =3D 0; + + pci_bmc_dev->message_bar_base =3D pci_resource_start(pdev, 1); + + if (pdev->revision =3D=3D 0x27) { + pr_err("AST2700 detected but not supported"); + return -ENODEV; + } + + rc =3D aspeed_pci_bmc_device_setup_vuart(pdev, 0); + if (rc) + return rc; + + rc =3D aspeed_pci_bmc_device_setup_vuart(pdev, 1); + if (rc) + goto out_free_VUART0; + + return 0; + +out_free_VUART0: + aspeed_pci_host_bmc_device_release_vuart(pdev, 0); + + return rc; +} + +static int aspeed_pci_host_bmc_device_probe(struct pci_dev *pdev, const st= ruct pci_device_id *ent) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev; + int rc =3D 0; + + pci_bmc_dev =3D devm_kzalloc(&pdev->dev, sizeof(*pci_bmc_dev), GFP_KERNEL= ); + if (!pci_bmc_dev) + return -ENOMEM; + + rc =3D pci_enable_device(pdev); + if (rc) { + dev_err(&pdev->dev, "pci_enable_device() returned error %d\n", rc); + return rc; + } + + pci_set_master(pdev); + pci_set_drvdata(pdev, pci_bmc_dev); + + rc =3D pci_alloc_irq_vectors(pdev, BMC_MULTI_MSI, BMC_MULTI_MSI, PCI_IRQ_= INTX | PCI_IRQ_MSI); + if (rc < 0) { + dev_err(&pdev->dev, "aspeed_pci_setup_irq_resource() returned error %d\n= ", rc); + goto disable_device; + } + + /* Setup BMC PCI device */ + rc =3D aspeed_pci_host_setup(pdev); + if (rc) { + dev_err(&pdev->dev, "ASPEED PCIe Host device returned error %d\n", rc); + goto free_irq; + } + + return 0; + +free_irq: + pci_free_irq_vectors(pdev); +disable_device: + pci_disable_device(pdev); + return rc; +} + +static void aspeed_pci_host_bmc_device_remove(struct pci_dev *pdev) +{ + aspeed_pci_host_bmc_device_release_vuart(pdev, 0); + aspeed_pci_host_bmc_device_release_vuart(pdev, 1); + + pci_free_irq_vectors(pdev); + pci_disable_device(pdev); +} + +static struct pci_device_id aspeed_host_bmc_dev_pci_ids[] =3D { + { PCI_DEVICE(PCI_VENDOR_ID_ASPEED, PCI_BMC_DEVICE_ID), + .class =3D 0xFF0000, .class_mask =3D 0xFFFF00, + .driver_data =3D ASPEED }, + { 0 } +}; + +MODULE_DEVICE_TABLE(pci, aspeed_host_bmc_dev_pci_ids); + +static struct pci_driver aspeed_host_bmc_dev_driver =3D { + .name =3D DRIVER_NAME, + .id_table =3D aspeed_host_bmc_dev_pci_ids, + .probe =3D aspeed_pci_host_bmc_device_probe, + .remove =3D aspeed_pci_host_bmc_device_remove, +}; + +module_driver(aspeed_host_bmc_dev_driver, pci_register_driver, pci_unregis= ter_driver); + +MODULE_AUTHOR("Ryan Chen "); +MODULE_DESCRIPTION("ASPEED Host BMC DEVICE Driver"); +MODULE_LICENSE("GPL"); --=20 2.54.0