From nobody Sat Jun 27 16:00:35 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (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 832093EDAC1 for ; Mon, 8 Jun 2026 14:54:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780930467; cv=none; b=Wi7+8RwrhMI91UqFv5henC/o/c9GuCvkmrIM6QbXOBXzq4auhf7ttxaoUBtKqijer4UOCCQsHzU0TMzOiOEO1LPiM3JWRnJB/W0xzu1QKOJvDV3p4mFc6/tbGic6GbbXyZyTr2YaKp66o5fRNS3iXTeYQ2cplwJOv/vEExXPTyM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780930467; c=relaxed/simple; bh=NYQQ4Wf9Sles51/OLT/hGLthNWtllu1wxdPI/xJQZBU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hRd119V9S0egPGsayE6q4D+ANpD8uwFC5KvQdBlkw+SyO+F6cslvUWcdV9ZsZRsry5zqB0ovrTCzPzqsmP6cxgUTJfDTWqwyiPXGtZCIqYC6rafhuEO+x0blF9F00auwLJqCviu2NCTP8Hah0sV8sqaWK0lD+pa8MJr1u1nQx84= 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=eOd0YKL9; arc=none smtp.client-ip=209.85.128.54 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="eOd0YKL9" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-490c1915793so27707895e9.2 for ; Mon, 08 Jun 2026 07:54:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; t=1780930464; x=1781535264; darn=vger.kernel.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=Sl5xhQEQ5jJjs9NVyTu44PT+PkxvqNJiAQ/dgYRRiPE=; b=eOd0YKL98Z1E+u4zDUPN4pv6o4flMbMgMEoXeqyAwvKKK2qHZk/2cUcgxfStrXfvY9 ATZnTIu35vTURovly7dPvJkewGuNDmZW0fqW+tYfc/eLs0MzN9r6HJYNJqcEFcLH7O2u vOVYt5UEwzQ1pmuypInSavel3q28RmP+V2+lg2btMbgR4PXvQS5HxATXkP1ROk/W9yOZ 832bDpTArQyU9DiF0VEMJouEPPIRitORP1hdS55b1NkNvf3mALon7SbbiNazvsnd2xVW l+WnDkesW2sqIOH+JvPJMBepR2nugQlHUZBFgRDC+jBx6rTJ0dgnzuveaos6G6ujDaem ICaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780930464; x=1781535264; h=content-transfer-encoding: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; bh=Sl5xhQEQ5jJjs9NVyTu44PT+PkxvqNJiAQ/dgYRRiPE=; b=mleksB+kylosgnBjGSe1i2X1G8EH/nfspSO62GTexs/d/4DgsiLt6wJUSvj+vwRwJa xi0z/9QIogo+d4UzwRqzdCZKOQH2K+AjUpujHQ078hcZBPJXSmDBTAmwrok+9j1HOIAr 5V0Mhon6R/BsWZY0hfjZOpjVX2OwUqOwWfEgp0nTWetI2YzgNKys94KyC2fLi59tyOdf RFUIB+cb2yI7f2PCy8xAJnXOcHhjMx92srSglqbl0loybrN86M7QgR8muUdv8WoMcwvO qvlvcK1lvoPlI1wAOihmYJ+LqKU/8hls0pHdQHoL4Fu8+UuUKJH5KpJgZNMOkx+zVrsc XZUA== X-Forwarded-Encrypted: i=1; AFNElJ9C/xOSp8reUIhLyp44E/8sbtxAYnyma0RYq2scl2nL6I9jxXZJDSntfoDMl1DdqZ7od+CnAHlyMMiMiWY=@vger.kernel.org X-Gm-Message-State: AOJu0YyzrJUOJ3oj+1ruQQFUU92pdrbVE6S1pze4jahad4aA5Fq8Dbjc KJPm8HYdhHLMKvdihauUoN6iSExfUvIonMEcewgdsXfFDSVwi/6PijUaJJRzKmyrPTY= X-Gm-Gg: Acq92OFZzENg9bFDYrHSHMMX3UYqu3qg7Y+juPzp/RCo/66qLKg+MKFFsMcDsQK3Bal r2gJakY9KlrrELy/4GIER9YbrvxHYieU4m8mq2SiWKHlukVrE1pD/EqGH4pHyWq2fIruTuUyI6v Sq8YSRCF82kor9S5/5w0/YdiPsDo7dbT0D65HerAew06yW1fg4Sz70IAMw5P59cvIAexM3DrRNN 3DrCvKnf2eHEQywQvW+b4VE1E6L+34brvDRAUwxoy54I1rW5qFZQvPMhBVir/4ArSGyROxFlOdS BKLzNskR31DAkLi11JfuMG5IvqZIbnDQVYkQMNzIAzk3rgjBAks6uBpgw1OMIPf3UT3Ulikvzvm DHh/rzLUZ8gpUK/AT6rh73LIArvOML0GzZWAib2Qqc1U9wLAz7JojMrn89aDRD3vaOTf8edBg4x Npl3Ph0CZ+LL813F1FRFge7V+N2n7xTkgLmYMr5GVNOukRM5jDuLNW0/Iwje7XZlaRsWesAGo= X-Received: by 2002:a05:600c:870f:b0:490:44eb:c1e7 with SMTP id 5b1f17b1804b1-490c2624a03mr258100705e9.30.1780930463932; Mon, 08 Jun 2026 07:54:23 -0700 (PDT) Received: from gregwork.sec.9e.network ([188.111.3.154]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4601f360bd6sm56927851f8f.36.2026.06.08.07.54.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Jun 2026 07:54:23 -0700 (PDT) From: =?UTF-8?q?Gr=C3=A9goire=20Layet?= To: joel@jms.id.au, andrew@codeconstruct.com.au Cc: andrew@lunn.ch, jacky_chou@aspeedtech.com, yh_chung@aspeedtech.com, ninad@linux.ibm.com, 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 v2 1/2] soc: aspeed: add BMC-side PCIe BMC device driver Date: Mon, 8 Jun 2026 14:51:22 +0000 Message-ID: X-Mailer: git-send-email 2.51.2 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 Taken from ASPEED 6.18 Kernel SDK Add support for VUART over PCIe between BMC and host. This add BMC side driver. Signed-off-by: Jacky Chou Signed-off-by: aspeedyh Signed-off-by: Gr=C3=A9goire Layet Tested-by: Gr=C3=A9goire Layet --- drivers/soc/aspeed/Kconfig | 7 ++ drivers/soc/aspeed/Makefile | 1 + drivers/soc/aspeed/aspeed-bmc-dev.c | 187 ++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 drivers/soc/aspeed/aspeed-bmc-dev.c diff --git a/drivers/soc/aspeed/Kconfig b/drivers/soc/aspeed/Kconfig index f579ee0b5afa..3e1fcf3c3268 100644 --- a/drivers/soc/aspeed/Kconfig +++ b/drivers/soc/aspeed/Kconfig @@ -4,6 +4,13 @@ if ARCH_ASPEED || COMPILE_TEST =20 menu "ASPEED SoC drivers" =20 +config ASPEED_BMC_DEV + tristate "ASPEED BMC Device" + default n + help + Enable support for the ASPEED AST2600 BMC Device. + This exposes the PCIe-to-LPC bridge of the BMC to the host over PCIe. + config ASPEED_LPC_CTRL tristate "ASPEED LPC firmware cycle control" select REGMAP diff --git a/drivers/soc/aspeed/Makefile b/drivers/soc/aspeed/Makefile index b35d74592964..fab0d247df66 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_BMC_DEV) +=3D aspeed-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-bmc-dev.c b/drivers/soc/aspeed/aspee= d-bmc-dev.c new file mode 100644 index 000000000000..7a204b543c97 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-bmc-dev.c @@ -0,0 +1,187 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Copyright (C) ASPEED Technology Inc. + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#define SCU_TRIGGER_MSI + +/* AST2600 SCU */ +#define ASPEED_SCU04 0x04 +#define AST2600A3_SCU04 0x05030303 +#define ASPEED_SCUC20 0xC20 +#define ASPEED_SCUC24 0xC24 +#define MSI_ROUTING_MASK GENMASK(11, 10) +#define PCIDEV1_INTX_MSI_HOST2BMC_EN BIT(18) +#define MSI_ROUTING_PCIe2LPC_PCIDEV0 (0x1 << 10) +#define MSI_ROUTING_PCIe2LPC_PCIDEV1 (0x2 << 10) + +#define ASPEED_SCU_PCIE_CONF_CTRL 0xC20 +#define SCU_PCIE_CONF_BMC_DEV_EN BIT(8) +#define SCU_PCIE_CONF_BMC_DEV_EN_MMIO BIT(9) +#define SCU_PCIE_CONF_BMC_DEV_EN_MSI BIT(11) +#define SCU_PCIE_CONF_BMC_DEV_EN_IRQ BIT(13) +#define SCU_PCIE_CONF_BMC_DEV_EN_DMA BIT(14) +#define SCU_PCIE_CONF_BMC_DEV_EN_E2L BIT(15) +#define SCU_PCIE_CONF_BMC_DEV_EN_LPC_DECODE BIT(21) + +#define ASPEED_SCU_BMC_DEV_CLASS 0xC68 + + +struct aspeed_platform { + int (*init)(struct platform_device *pdev); +}; + +struct aspeed_bmc_device { + struct device *dev; + int id; + void __iomem *reg_base; + + int pcie2lpc; + int irq; + + const struct aspeed_platform *platform; + + struct regmap *scu; + int pcie_irq; +}; + + +static int aspeed_ast2600_init(struct platform_device *pdev) +{ + struct aspeed_bmc_device *bmc_device =3D platform_get_drvdata(pdev); + struct device *dev =3D &pdev->dev; + u32 pcie_config_ctl =3D SCU_PCIE_CONF_BMC_DEV_EN_IRQ | + SCU_PCIE_CONF_BMC_DEV_EN_MMIO | SCU_PCIE_CONF_BMC_DEV_EN; + u32 scu_id; + + bmc_device->scu =3D syscon_regmap_lookup_by_phandle(dev->of_node, "aspeed= ,scu"); + if (IS_ERR(bmc_device->scu)) { + dev_err(&pdev->dev, "failed to find SCU regmap\n"); + return PTR_ERR(bmc_device->scu); + } + + if (bmc_device->pcie2lpc) + pcie_config_ctl |=3D SCU_PCIE_CONF_BMC_DEV_EN_E2L | + SCU_PCIE_CONF_BMC_DEV_EN_LPC_DECODE; + + regmap_update_bits(bmc_device->scu, ASPEED_SCU_PCIE_CONF_CTRL, + pcie_config_ctl, pcie_config_ctl); + + /* update class code to others as it is a MFD device */ + regmap_write(bmc_device->scu, ASPEED_SCU_BMC_DEV_CLASS, 0xff000000); + +#ifdef SCU_TRIGGER_MSI + //SCUC24[17]: Enable PCI device 1 INTx/MSI from SCU560[15]. Will be added= in next version + regmap_update_bits(bmc_device->scu, ASPEED_SCUC20, BIT(11) | BIT(14), BIT= (11) | BIT(14)); + + regmap_read(bmc_device->scu, ASPEED_SCU04, &scu_id); + if (scu_id =3D=3D AST2600A3_SCU04) + regmap_update_bits(bmc_device->scu, ASPEED_SCUC24, + PCIDEV1_INTX_MSI_HOST2BMC_EN | MSI_ROUTING_MASK, + PCIDEV1_INTX_MSI_HOST2BMC_EN | MSI_ROUTING_PCIe2LPC_PCIDEV1); + else + regmap_update_bits(bmc_device->scu, ASPEED_SCUC24, + BIT(17) | BIT(14) | BIT(11), BIT(17) | BIT(14) | BIT(11)); +#else + //SCUC24[18]: Enable PCI device 1 INTx/MSI from Host-to-BMC controller. + regmap_update_bits(bmc_device->scu, 0xc24, BIT(18) | BIT(14), BIT(18) | B= IT(14)); +#endif + + + return 0; +} + + +static struct aspeed_platform ast2600_plaform =3D { + .init =3D aspeed_ast2600_init +}; + + +static const struct of_device_id aspeed_bmc_device_of_matches[] =3D { + { .compatible =3D "aspeed,ast2600-bmc-device", .data =3D &ast2600_plaform= }, + {}, +}; +MODULE_DEVICE_TABLE(of, aspeed_bmc_device_of_matches); + +static int aspeed_bmc_device_probe(struct platform_device *pdev) +{ + struct aspeed_bmc_device *bmc_device; + struct device *dev =3D &pdev->dev; + const void *md =3D of_device_get_match_data(dev); + int ret =3D 0; + + if (!md) + return -ENODEV; + + bmc_device =3D devm_kzalloc(&pdev->dev, sizeof(struct aspeed_bmc_device),= GFP_KERNEL); + if (!bmc_device) + return -ENOMEM; + dev_set_drvdata(dev, bmc_device); + + bmc_device->platform =3D md; + + bmc_device->id =3D of_alias_get_id(dev->of_node, "bmcdev"); + if (bmc_device->id < 0) + bmc_device->id =3D 0; + + bmc_device->dev =3D dev; + bmc_device->reg_base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(bmc_device->reg_base)) + return PTR_ERR(bmc_device->reg_base); + + bmc_device->irq =3D platform_get_irq(pdev, 0); + if (bmc_device->irq < 0) { + dev_err(&pdev->dev, "platform get of irq[=3D%d] failed!\n", bmc_device->= irq); + return bmc_device->irq; + } + + if (of_property_read_bool(dev->of_node, "pcie2lpc")) + bmc_device->pcie2lpc =3D 1; + + ret =3D bmc_device->platform->init(pdev); + if (ret) { + dev_err(dev, "Initialize bmc device failed\n"); + goto out; + } + + dev_info(dev, "aspeed bmc device: driver successfully loaded.\n"); + + return 0; + +out: + dev_warn(dev, "aspeed bmc device: driver init failed (ret=3D%d)!\n", ret); + return ret; +} + +static void aspeed_bmc_device_remove(struct platform_device *pdev) +{ + struct aspeed_bmc_device *bmc_device =3D platform_get_drvdata(pdev); + + devm_free_irq(&pdev->dev, bmc_device->irq, bmc_device); + devm_kfree(&pdev->dev, bmc_device); +} + +static struct platform_driver aspeed_bmc_device_driver =3D { + .probe =3D aspeed_bmc_device_probe, + .remove =3D aspeed_bmc_device_remove, + .driver =3D { + .name =3D KBUILD_MODNAME, + .of_match_table =3D aspeed_bmc_device_of_matches, + }, +}; + +module_platform_driver(aspeed_bmc_device_driver); + +MODULE_AUTHOR("Ryan Chen "); +MODULE_DESCRIPTION("ASPEED BMC DEVICE Driver"); +MODULE_LICENSE("GPL"); \ No newline at end of file --=20 2.51.2 From nobody Sat Jun 27 16:00:35 2026 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (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 7DAF23EDAC9 for ; Mon, 8 Jun 2026 14:54:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780930470; cv=none; b=ZGcGoPWxN6eXOzevOyJ4TM8ngDblVFPYB68NYQIhzbnm6BVttxTeBr2z596YPUN39uP2JpNPs/wti2h7BNgljkZe4vab4/pTMHfUZT3iLpSuxSuACCb9fUy0CpakMlMm/hgqlvJHvHae86g1TFokMmYTiRRqLqi6rwGF5EDDdoU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780930470; c=relaxed/simple; bh=CTHMt/B3hZ9wl4xdhOpPKNeqdvRixYOTNiivosaaMuw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZXtOQjoJVgzHLlG2w2mxUX01P94VH+Jn+4lDcPS0OXnZoeX38oJdHmDgrWjSRgIGazcX9Sxm+8oxZKbPc7k0YRi1txOymO3KQopVGizqNAf5i/bHk38FQfZheTzfoMiln19zh0KqqpsWtI++xZl4/bDUwWazas4sxUBeGryTsq4= 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=Jl5t4e/z; arc=none smtp.client-ip=209.85.221.52 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="Jl5t4e/z" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-45ef1198766so2521202f8f.0 for ; Mon, 08 Jun 2026 07:54:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; t=1780930467; x=1781535267; darn=vger.kernel.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=oSKKlCPm41pvMUdMrmydhlLiUs0iGWjoDgYMRyPMrdw=; b=Jl5t4e/z+FRwY4DV8NbJt5Fwo0X7RP3Oc99Yxji1GXGB+BZokW0IdWCR3pDbOXXLqC V3Q3eRBUsXFa5wauI6/xOX6SqUqmAFPzcWe3c3I4stcSLFMuwlXuk3/w7l6pfg2i3YPo v2p6vk3pQQH9APrx7s57aFc50amiHZunoONFCbsl6k2KK2DWUGMfNFdo6D+6FM8zDBR9 Hy7tyTElhTW4s399QntVhIoAXfSO2W7fKHbR6Ug0+ghLg+N/AlFnEW1OxhwgqUp1cAfa 7OEzea/N7RBt/tHoq1w8QOQsOckvqHoMz1SmN38MfXAwHQQgg8j4RlYcYDaAsiw8x8vg 5Slw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780930467; x=1781535267; h=content-transfer-encoding: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; bh=oSKKlCPm41pvMUdMrmydhlLiUs0iGWjoDgYMRyPMrdw=; b=df+MAzBDD71JyKv80q6hoAmi6ep1R/f9L8JpfvqL4IkfX51o5GHDbJluK1/8oUjXTL y3c8ptrhWhOCyytOPgetkdv8ibdT94wygWHTB0a9wrGipGvT6Or6Ydhnq1YQKdfIs725 L3q2PjAyWyApVEF3mLhmnn5BdB4Y6dGRBjmxaPv24llAc2NOprGVPzzG6n+TPyBRNrL7 YVUpT9RBqMlPcj6f7OZZjsK971rcdzEQFsLalt8Td4Twz+nDZwzH05v46mU1f65+ZyNR izlal9Q4cq1pXrUWIsuv9O75vLCsCd6ZAQp9KKGSas3B06fVGxnTq1FgJfpXlPE211mJ LBQw== X-Forwarded-Encrypted: i=1; AFNElJ//j3ouM/mekDoOlyVHLWx66fHTLXjxCum6cimuhXdgGs5o8qBEswBg7pHiBlej+KnE4+XXqSwPXokz6kk=@vger.kernel.org X-Gm-Message-State: AOJu0YwJfOoffi+G2ENL1Eqso70cT4ajVT34SfjXltKX74mCvmb8SQsK W16JMMKeFlzhNs5vc+r5wHvowgV/zfr6NVjlbFStNsvvarPX5hKJDWpkMm4fEExe3LKfoklRT9t dJMQ/ X-Gm-Gg: Acq92OGEf8H/6fj46oJfqUpONW6grC5FpwDBOt9CSOXt5mMV6LG4sPMjXfncd5zEYn+ ZgESDBd9poOyNlzk4R15hvw4oO2IM6ZEdnQCz0HDUSGaHEp5gDu0trzng9n6/XBAZEuK4VUnIV+ dc6Sz4n65c33FwYQ+gE3kldArhaMAiALWokEacD7EfEe07Md0PoQtXm/kloFXv249pvstYXixkW fWecwei0ig0idlsmyBJBfZHZsLv72JDbquVg6FvlxV46sBkxXe4HNRScHl32iHe4o3mu8axqOD3 hVFOWiQWXoMkjOkinOt3702vnOzCPFq54oVlvEu6W0AbzIYBnY3k/2qev+ETHWAGfTy48D5k6ir 25wjgre9EgzJUWM3owbzW53a0rvsLjwlpqgz5LmBQ4FNrIL6T9Wc8x+AL7Ul5hWKVk03QeNYQ+q nE1hC/IQb90pEZAbvg2E5eDdsQ29DY7jDJBPOT5eIJR6Dna0XFlo8vQhnb0wcN X-Received: by 2002:a05:6000:4024:b0:45e:f7ae:d599 with SMTP id ffacd0b85a97d-46032dbeb2emr22113309f8f.25.1780930466854; Mon, 08 Jun 2026 07:54:26 -0700 (PDT) Received: from gregwork.sec.9e.network ([188.111.3.154]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4601f360bd6sm56927851f8f.36.2026.06.08.07.54.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Jun 2026 07:54:26 -0700 (PDT) From: =?UTF-8?q?Gr=C3=A9goire=20Layet?= To: joel@jms.id.au, andrew@codeconstruct.com.au Cc: andrew@lunn.ch, jacky_chou@aspeedtech.com, yh_chung@aspeedtech.com, ninad@linux.ibm.com, 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 v2 2/2] soc: aspeed: add host-side PCIe BMC device driver Date: Mon, 8 Jun 2026 14:51:23 +0000 Message-ID: <13d18d25f53e0a084a8c17219804b305d4667c6b.1780929570.git.gregoire.layet@9elements.com> X-Mailer: git-send-email 2.51.2 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 Taken from ASPEED 6.18 Kernel SDK Add support for VUART over PCIe between BMC and host. This add host side driver. Signed-off-by: Jacky Chou Signed-off-by: aspeedyh Signed-off-by: Gr=C3=A9goire Layet Tested-by: Gr=C3=A9goire Layet --- drivers/soc/aspeed/Kconfig | 8 + drivers/soc/aspeed/Makefile | 1 + drivers/soc/aspeed/aspeed-host-bmc-dev.c | 249 +++++++++++++++++++++++ 3 files changed, 258 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 3e1fcf3c3268..5deefb64e8c7 100644 --- a/drivers/soc/aspeed/Kconfig +++ b/drivers/soc/aspeed/Kconfig @@ -11,6 +11,14 @@ config ASPEED_BMC_DEV Enable support for the ASPEED AST2600 BMC Device. This exposes the PCIe-to-LPC bridge of the BMC to the host over PCIe. =20 +config ASPEED_HOST_BMC_DEV + tristate "ASPEED Host BMC Device" + depends on PCI + depends on SERIAL_8250 + help + Enable support for the ASPEED AST2600 BMC Device on the Host. + This configure the PCIe and setup two 8250 compatible VUART ports. + config ASPEED_LPC_CTRL tristate "ASPEED LPC firmware cycle control" select REGMAP diff --git a/drivers/soc/aspeed/Makefile b/drivers/soc/aspeed/Makefile index fab0d247df66..3fd3f6d8d36e 100644 --- a/drivers/soc/aspeed/Makefile +++ b/drivers/soc/aspeed/Makefile @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_ASPEED_BMC_DEV) +=3D aspeed-bmc-dev.o +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..7cb52a770fb6 --- /dev/null +++ b/drivers/soc/aspeed/aspeed-host-bmc-dev.c @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Copyright (C) ASPEED Technology Inc. + +#include +#include +#include +#include +#include +#include +#include +#include + +static DEFINE_IDA(bmc_device_ida); + +#define VUART_MAX_PARMS 2 +#define MAX_MSI_NUM 8 +#define BMC_MULTI_MSI 32 + +#define DRIVER_NAME "aspeed-host-bmc-dev" + +enum aspeed_platform_id { + ASPEED, +}; + +enum msi_index { + VUART0_MSI, + VUART1_MSI, +}; + +/* Match msi_index */ +static int ast2600_msi_idx_table[MAX_MSI_NUM] =3D { 16, 15 }; + +struct aspeed_platform { + int (*setup)(struct pci_dev *pdev); +}; + +struct aspeed_pci_bmc_dev { + struct device *dev; + struct aspeed_platform *platform; + kernel_ulong_t driver_data; + int id; + + unsigned long message_bar_base; + unsigned long message_bar_size; + void __iomem *msg_bar_reg; + + struct uart_8250_port uart[VUART_MAX_PARMS]; + int uart_line[VUART_MAX_PARMS]; + + /* Interrupt + * The index of array is using to enum msi_index + */ + int *msi_idx_table; +}; + +static void aspeed_pci_setup_irq_resource(struct pci_dev *pdev) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + + /* Assign static msi index table by platform */ + pci_bmc_dev->msi_idx_table =3D ast2600_msi_idx_table; + + if (pci_alloc_irq_vectors(pdev, 1, BMC_MULTI_MSI, PCI_IRQ_INTX | PCI_IRQ_= MSI) <=3D 1) + /* Set all msi index to the first vector */ + memset(pci_bmc_dev->msi_idx_table, 0, sizeof(int) * MAX_MSI_NUM); +} + +static int aspeed_pci_bmc_device_setup_vuart(struct pci_dev *pdev) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + struct device *dev =3D &pdev->dev; + u16 vuart_ioport; + int ret, i; + + for (i =3D 0; i < VUART_MAX_PARMS; i++) { + /* Assign the line to non-exist device */ + pci_bmc_dev->uart_line[i] =3D -ENOENT; + vuart_ioport =3D 0x3F8 - (i * 0x100); + pci_bmc_dev->uart[i].port.flags =3D UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | = UPF_SHARE_IRQ; + pci_bmc_dev->uart[i].port.uartclk =3D 115200 * 16; + pci_bmc_dev->uart[i].port.irq =3D + pci_irq_vector(pdev, pci_bmc_dev->msi_idx_table[VUART0_MSI + i]); + pci_bmc_dev->uart[i].port.dev =3D dev; + pci_bmc_dev->uart[i].port.iotype =3D UPIO_MEM32; + pci_bmc_dev->uart[i].port.iobase =3D 0; + pci_bmc_dev->uart[i].port.mapbase =3D + pci_bmc_dev->message_bar_base + (vuart_ioport << 2); + pci_bmc_dev->uart[i].port.membase =3D 0; + pci_bmc_dev->uart[i].port.type =3D PORT_16550A; + pci_bmc_dev->uart[i].port.flags |=3D (UPF_IOREMAP | UPF_FIXED_PORT | UPF= _FIXED_TYPE); + pci_bmc_dev->uart[i].port.regshift =3D 2; + ret =3D serial8250_register_8250_port(&pci_bmc_dev->uart[i]); + if (ret < 0) { + dev_err_probe(dev, ret, "Can't setup PCIe VUART\n"); + return ret; + } + pci_bmc_dev->uart_line[i] =3D ret; + } + return 0; +} + +static void aspeed_pci_host_bmc_device_release_vuart(struct pci_dev *pdev) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + int i; + + for (i =3D 0; i < VUART_MAX_PARMS; i++) { + if (pci_bmc_dev->uart_line[i] >=3D 0) + serial8250_unregister_port(pci_bmc_dev->uart_line[i]); + } +} + +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; + + /* Get Message BAR */ + pci_bmc_dev->message_bar_base =3D pci_resource_start(pdev, 1); + pci_bmc_dev->message_bar_size =3D pci_resource_len(pdev, 1); + pci_bmc_dev->msg_bar_reg =3D pci_ioremap_bar(pdev, 1); + if (!pci_bmc_dev->msg_bar_reg) + return -ENOMEM; + + if (pdev->revision < 0x27) { + /* AST2600 ERRTA40: dummy read */ + (void)__raw_readl((void __iomem *)pci_bmc_dev->msg_bar_reg); + } else { + /* AST2700 not supported */ + pr_err("AST2700 detected but not supported"); + goto out_free0; + } + + rc =3D aspeed_pci_bmc_device_setup_vuart(pdev); + if (rc) { + pr_err("Cannot setup Virtual UART"); + goto out_free0; + } + + return 0; + +out_free0: + pci_iounmap(pdev, pci_bmc_dev->msg_bar_reg); + + return rc; +} + +static struct aspeed_platform aspeed_pcie_host[] =3D { + { .setup =3D aspeed_pci_host_setup }, + { 0 } +}; + +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; + + pr_info("ASPEED BMC PCI ID %04x:%04x, IRQ=3D%u\n", pdev->vendor, pdev->de= vice, pdev->irq); + + pci_bmc_dev =3D devm_kzalloc(&pdev->dev, sizeof(*pci_bmc_dev), GFP_KERNEL= ); + if (!pci_bmc_dev) + return -ENOMEM; + + /* Get platform id */ + pci_bmc_dev->driver_data =3D ent->driver_data; + pci_bmc_dev->platform =3D &aspeed_pcie_host[ent->driver_data]; + + pci_bmc_dev->id =3D ida_alloc(&bmc_device_ida, GFP_KERNEL); + if (pci_bmc_dev->id < 0) + return pci_bmc_dev->id; + + 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); + + /* Prepare IRQ resource */ + aspeed_pci_setup_irq_resource(pdev); + + /* Setup BMC PCI device */ + rc =3D pci_bmc_dev->platform->setup(pdev); + if (rc) { + dev_err(&pdev->dev, "ASPEED PCIe Host device returned error %d\n", rc); + pci_free_irq_vectors(pdev); + pci_disable_device(pdev); + return rc; + } + + return 0; +} + +static void aspeed_pci_host_bmc_device_remove(struct pci_dev *pdev) +{ + struct aspeed_pci_bmc_dev *pci_bmc_dev =3D pci_get_drvdata(pdev); + + if (pci_bmc_dev->driver_data =3D=3D ASPEED) + aspeed_pci_host_bmc_device_release_vuart(pdev); + + ida_free(&bmc_device_ida, pci_bmc_dev->id); + + pci_iounmap(pdev, pci_bmc_dev->msg_bar_reg); + + pci_free_irq_vectors(pdev); + pci_disable_device(pdev); +} + +/** + * This table holds the list of (VendorID,DeviceID) supported by this driv= er + * + */ +static struct pci_device_id aspeed_host_bmc_dev_pci_ids[] =3D { + /* ASPEED BMC Device */ + { PCI_DEVICE(0x1A03, 0x2402), .class =3D 0xFF0000, .class_mask =3D 0xFFFF= 00, + .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, +}; + +static int __init aspeed_host_bmc_device_init(void) +{ + return pci_register_driver(&aspeed_host_bmc_dev_driver); +} + +static void aspeed_host_bmc_device_exit(void) +{ + /* unregister pci driver */ + pci_unregister_driver(&aspeed_host_bmc_dev_driver); +} + +late_initcall(aspeed_host_bmc_device_init); +module_exit(aspeed_host_bmc_device_exit); + +MODULE_AUTHOR("Ryan Chen "); +MODULE_DESCRIPTION("ASPEED Host BMC DEVICE Driver"); +MODULE_LICENSE("GPL"); --=20 2.51.2