From nobody Mon Aug 24 03:17:13 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (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 D5CCA41CB29 for ; Wed, 8 Jul 2026 15:38:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783525121; cv=none; b=KbzrNmAL+NBs94PTtAvHRFw8cU05YRr/QjbQN1NFs4w79pV993aobGaYwFnwdRedGKYgIYvHSgzRIYN4YZeRtA75CH5pwsO6QaZfuCUqkxmBTYQ8bgiJdwbIJTFjbZKm94Ihy8biV3+qOJN3TFEu89MhOiY/ZadbgFgSlBZO6DA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783525121; c=relaxed/simple; bh=emLy3nV6PTOWJ5S8ZLEZtJdphacSFAURIEjAbHUF4OE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qJ8EphgxMRG5KXfBGXRIenNBr9AXHveIKFCZSBBHPX1M9ADIBPhNOdNQlBAEyXm4UPZpko5M00R4QXOQl3iFEDjBIcmxm53Y31K/ooAIoX+7aFLVFGbyaRvTJB23EaM7lMTekVENYJOnOWAFvSwcT06dnLOU5N3A6F34Lwvwq3k= 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=CSIx4Rev; arc=none smtp.client-ip=209.85.221.44 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="CSIx4Rev" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-471eeac43bfso858794f8f.3 for ; Wed, 08 Jul 2026 08:38:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; t=1783525118; x=1784129918; 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=uZx0CqGWbyzDUzo0/NyEFqDoVb8LDJ7NHysAd8cbbL8=; b=CSIx4Rev4a+a+2Q0Q5c4FsqT05z/aesIljlgXbIazd4L7VT6u62Fzp88V3uilbsVrn ceDu5ZReFxBhy7Dl8ia6eQqbDIETAJxX6/JDqICFkEVAWTWOY5X5NM2DykpoqjwxRii0 tdtKVDK6AJrxuLRGPB1n/XAgkzaGl5OQi87a4krs7tbcWOQoWDAPMAkZhd7X/qdTijZi K1x3ww0mahqlikO2CHDwZXQU9sr/vb1cb0It1wxl+hl9ToQXIsWj4rC7YrojjHzW3QNQ 6ZZ+Lw42f9W4qVsN9/4VTkzSIBh9ofZApP57uEVuuZCWfTAyK0petT49dpd95hh2XE8V xFLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783525118; x=1784129918; 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=uZx0CqGWbyzDUzo0/NyEFqDoVb8LDJ7NHysAd8cbbL8=; b=JRmquuNTKxEQxJaaSItoDnJyb/omiYUF7vDu6har6KRxfNQxaLlBzGfFOJ2c7sfe47 5vnvCRc1SxCLkEOFkrclT/sQHOJH3TSngkQik+p1wbyYOc4D6ZKTEsCq4aZhD12QSXmM kcVXvNbsadQaJWn1cKtCvDBNs5RhTwpblJ7LvB7KnQS3gJlfLWaAAoBJjnDcpSHk2FMh KYCuZCUSYMUbxb4RmXW1sgm0D3CIjhxtLzaSfAgwKW4TRqO+7MSjiZRLy71+Wd6qzvY+ xRjSV8Jdft/GLYGZEk7kdtxQt/f28BeWqcyqqbc1CDJJN5OdZsMrEA0MximzQpVUGUFI 2ueg== X-Forwarded-Encrypted: i=1; AHgh+Rr6LRhBZGwmZaLFpB3nivfi0curiJNa9H9wuabiVIioN+Rey8yEfwVlObdRdptoaTrFZGzzq3zWOPdzjoU=@vger.kernel.org X-Gm-Message-State: AOJu0Yzup6ZTZhpys5tNEHlqCREYf+KDHTiPkL3z4Hd3xibGg83SEZI3 eCh+nP+1HS/GKLglu0b8QP4iDNm7TP9qtvMEpPL4M3lZhlCzMR1iG2+gklgPIRG9KAs= X-Gm-Gg: AfdE7ck1KqjrUskFdhRBWdQSrtoUFaspRNzTroF456vOLMbjuRlI7SZV6NDsgFiQ+DA UIUofI1UQFjwgAjDpt1O3EmU/7+0n097ym59ZDOEv9pmno+3v7XkDJQPnmsa7Q1iilq2MgdKbRq UlP77HV9poBEDrHk9LLblb5y6yWoR49Sue6QFmS8Ou4UtX+T3HKJ0pK+pJG7ualW2ervylb1/M8 jPu+HOmwptbdh4tKA57R/pcPtDxVQFJRZ20w4VRlK5okKovpByM/MZKZLH3JT0Oa8WHf3t1nL6w OFzG/E5f3LTiIyTlOoEBfmYrtT6DGdH2qezp1TetmkelGL1l4963UJbRFkJLwmGdsee+SIVkJ/j KKWVenfSE9yf7Vzg9XSWyrZJF9N3KobdEVcxe0bbtg6hjkqseNrjdhRn3ck5fseflZJ8A3Sc9tT WaoRhcErMTF+qfjHCsgrVBzQF2uKgIABSGtEliD0ltgOdFRDRISVopqpei3VeCydw2DUXGr3YaT /s+Ius6RujRYXjgfVWHWvB0Q1VRJdy2pF8Ew3c= X-Received: by 2002:a5d:5846:0:b0:472:edc7:b4c9 with SMTP id ffacd0b85a97d-47df07896demr3174799f8f.38.1783525118187; Wed, 08 Jul 2026 08:38:38 -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.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jul 2026 08:38:37 -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 4/7] serial: 8250_aspeed_vuart: add VUART over PCI Date: Wed, 8 Jul 2026 15:35:56 +0000 Message-ID: <28c6e7c493559feffc7e6231b0a2f0b73b7fda41.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 Enable the VUART over PCI for the AST2600. Activate it only if the 'aspeed,vuart-over-pci' property flag is set on an 'ast2600-vuart' compatible node. The AST2600 has 2 VUART that are usable over PCI. These are already defined= as the VUART3 and VUART4 in the 'aspeed-g6.dtsi'. Sets the BMC PCI device enable bits, sets the PCI class code to unassgined/device specific, and configures MSI interrupts. There is no disable function. Removing this driver should not disable the BMC PCI device, as other drivers could use it. However, if all the drivers using it are removed, the BMC PCI device will still be activated, which is not ideal. But in reality, this is not a use case for a BMC, the drivers will never be removed. This is useful on PCIe BMC expansion cards that use the AST2600, such as the ASUS Kommando IPMI Expansion Card. Register initialisation taken from ASPEED 6.18 Kernel SDK. Add return code checks to each register write. Simplify the code and add macros. The ASPEED_SCUC24 regmap update is missing a macro for 'BIT(14)'. I was unable to determine the purpose of this bit. In the AST2600 A3 datasheet it is marked as 'reserved'. It is only used on the other revision. As I only have the AST2600A3, I was unable to try this code path. This BIT14 was set in the ASPEED SDK so I kept it. I can remove it and the untested path if necessary. Signed-off-by: Jacky Chou Signed-off-by: aspeedyh Signed-off-by: Gr=C3=A9goire Layet --- drivers/tty/serial/8250/8250_aspeed_vuart.c | 86 +++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/seri= al/8250/8250_aspeed_vuart.c index 6afa2f4057e1..4d09c04cb972 100644 --- a/drivers/tty/serial/8250/8250_aspeed_vuart.c +++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c @@ -32,6 +32,26 @@ #define ASPEED_VUART_DEFAULT_SIRQ 4 #define ASPEED_VUART_DEFAULT_SIRQ_POLARITY IRQ_TYPE_LEVEL_LOW =20 +#define ASPEED_SCU_SILICON_REVISION_ID 0x04 +#define AST2600A3_REVISION_ID 0x05030303 + +#define ASPEED_SCUC24 0xC24 +#define ASPEED_SCUC24_MSI_ROUTING_MASK GENMASK(11, 10) +#define ASPEED_SCUC24_MSI_ROUTING_PCIE2LPC_PCIDEV1 (0x2 << 10) +#define ASPEED_SCUC24_PCIDEV1_INTX_MSI_HOST2BMC_EN BIT(18) +#define ASPEED_SCUC24_PCIDEV1_INTX_MSI_SCU560_EN BIT(17) + +#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_PCIE_BUS_MASTER 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_vuart { struct device *dev; int line; @@ -412,6 +432,63 @@ static int aspeed_vuart_map_irq_polarity(u32 dt) } } =20 +static int aspeed_ast2600_vuart_over_pci_set_enabled(struct platform_devic= e *pdev) +{ + struct device *dev =3D &pdev->dev; + u32 silicon_revision_id; + struct regmap *scu; + int rc; + + 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_MSI | + SCU_PCIE_CONF_BMC_DEV_EN_PCIE_BUS_MASTER | + SCU_PCIE_CONF_BMC_DEV_EN_E2L | + SCU_PCIE_CONF_BMC_DEV_EN_LPC_DECODE | + SCU_PCIE_CONF_BMC_DEV_EN; + + scu =3D syscon_regmap_lookup_by_phandle(dev->of_node, "syscon"); + if (IS_ERR(scu)) { + dev_err(&pdev->dev, "failed to find SCU regmap\n"); + return PTR_ERR(scu); + } + + /* update class code to be an Unassigned/device specific class device */ + if (regmap_write(scu, ASPEED_SCU_BMC_DEV_CLASS, 0xff000000)) { + dev_err(dev, "could not set PCI class code\n"); + return -EIO; + } + + if (regmap_update_bits(scu, ASPEED_SCU_PCIE_CONF_CTRL, + pcie_config_ctl, pcie_config_ctl)) { + dev_err(dev, "could not set PCIe configuration\n"); + return -EIO; + } + + if (regmap_read(scu, ASPEED_SCU_SILICON_REVISION_ID, &silicon_revision_id= )) { + dev_err(dev, "could not read silicon revision\n"); + return -EIO; + } + + if (silicon_revision_id =3D=3D AST2600A3_REVISION_ID) + rc =3D regmap_update_bits(scu, ASPEED_SCUC24, + ASPEED_SCUC24_PCIDEV1_INTX_MSI_HOST2BMC_EN | ASPEED_SCUC24_MSI_ROUTIN= G_MASK, + ASPEED_SCUC24_PCIDEV1_INTX_MSI_HOST2BMC_EN | ASPEED_SCUC24_MSI_ROUTIN= G_PCIE2LPC_PCIDEV1); + else + rc =3D regmap_update_bits(scu, ASPEED_SCUC24, + /** + * The bit 14 is reserved in the Datasheet. + */ + ASPEED_SCUC24_PCIDEV1_INTX_MSI_SCU560_EN | BIT(14) | ASPEED_SCUC24_MS= I_ROUTING_MASK, + ASPEED_SCUC24_PCIDEV1_INTX_MSI_SCU560_EN | BIT(14) | ASPEED_SCUC24_MS= I_ROUTING_PCIE2LPC_PCIDEV1); + if (rc) { + dev_err(dev, "could not set PCI device 1 MSI interrupt routing\n"); + return -EIO; + } + + return 0; +} + static int aspeed_vuart_probe(struct platform_device *pdev) { struct of_phandle_args sirq_polarity_sense_args; @@ -540,6 +617,15 @@ static int aspeed_vuart_probe(struct platform_device *= pdev) aspeed_vuart_set_host_tx_discard(vuart, true); platform_set_drvdata(pdev, vuart); =20 + if (of_device_is_compatible(dev->of_node, "aspeed,ast2600-vuart") && + of_property_read_bool(dev->of_node, "aspeed,vuart-over-pci")) { + rc =3D aspeed_ast2600_vuart_over_pci_set_enabled(pdev); + if (rc < 0) { + dev_err_probe(dev, rc, "could not enable VUART over PCI\n"); + goto err_sysfs_remove; + } + } + return 0; =20 err_sysfs_remove: --=20 2.54.0