From 9c494cb4952d900f5ac0333c0b4d05484b96b121 Mon Sep 17 00:00:00 2001 From: leoliu-oc Date: Thu, 25 Dec 2025 18:12:42 +0800 Subject: [PATCH] anolis: Add platform-specific quirks for ZX-200 device ANBZ: #28528 Adds platform-specific handling for Zhaoxin ZX-200 in both AHCI and xHCI drivers. For non-Zhaoxin CPU platforms, it applies the following quirks: 1. In AHCI driver (ahci.c): - Sets AHCI_HFLAG_32BIT_ONLY flag to restrict DMA operations to 32-bit addressing 2. In xHCI driver (xhci-pci.c): - Sets XHCI_RESET_ON_RESUME quirk to handle device resume issues - Sets XHCI_NO_64BIT_SUPPORT quirk to disable 64-bit DMA addressing These changes ensure proper functionality and compatibility of Zhaoxin ZX-200 on third-party platforms. Reviewed-by: Tony W. Wang Tested-by: Lyle Li Signed-off-by: leoliu-oc --- drivers/ata/ahci.c | 13 +++++++++++++ drivers/usb/host/xhci-pci.c | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 5888a3d030bd..0bcc3ed9c13e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -80,6 +80,16 @@ enum board_ids { board_ahci_mcp79 = board_ahci_mcp77, }; +static bool is_zhaoxin_cpu(void) +{ +#ifdef CONFIG_X86 + if (boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN || + boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR) + return true; +#endif + return false; +} + static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); static void ahci_remove_one(struct pci_dev *dev); static void ahci_shutdown_one(struct pci_dev *dev); @@ -1784,6 +1794,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) if (ahci_sb600_enable_64bit(pdev)) hpriv->flags &= ~AHCI_HFLAG_32BIT_ONLY; + if (pdev->vendor == PCI_VENDOR_ID_ZHAOXIN && !is_zhaoxin_cpu()) + hpriv->flags |= AHCI_HFLAG_32BIT_ONLY; + hpriv->mmio = pcim_iomap_table(pdev)[ahci_pci_bar]; /* detect remapped nvme devices */ diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 0a3f26b66b23..a1ff3f61fca5 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -111,6 +111,16 @@ static int xhci_pci_reinit(struct xhci_hcd *xhci, struct pci_dev *pdev) return 0; } +static bool is_zhaoxin_cpu(void) +{ +#ifdef CONFIG_X86 + if (boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN || + boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR) + return true; +#endif + return false; +} + static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) { struct pci_dev *pdev = to_pci_dev(dev); @@ -341,6 +351,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241) xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7; + if (pdev->vendor == PCI_VENDOR_ID_ZHAOXIN && !is_zhaoxin_cpu()) { + xhci->quirks |= XHCI_NO_64BIT_SUPPORT; + if (pdev->device == 0x9203) + xhci->quirks |= XHCI_RESET_ON_RESUME; + } + if ((pdev->vendor == PCI_VENDOR_ID_BROADCOM || pdev->vendor == PCI_VENDOR_ID_CAVIUM) && pdev->device == 0x9026) -- Gitee