* [PATCH 0/7] sparc64: add Fujitsu M3000 support @ 2026-10-02 16:14 Magnus Lindholm 2026-10-02 16:14 ` [PATCH 6/7] tg3: normalize inherited M3000 register byte order Magnus Lindholm 0 siblings, 1 reply; 4+ messages in thread From: Magnus Lindholm @ 2026-10-02 16:14 UTC (permalink / raw) To: sparclinux, David S . Miller, Andreas Larsson Cc: linux-kernel, Magnus Lindholm, netdev, linux-serial Several years ago I salvaged an M3000 SPARC Enterprise box being decommissioned at work. The box has been sitting ever since, it did not run Linux. It did not seem impossible to get Linux running but my earlier attempts failed. I recently found some documentation; "SPARC JPS2: Common Specification" and the "Fujitsu SPARC64 II Extensions", which gave me some of the missingpieces. Getting this up and running required extensive testing, some kernel instrumentation, debug printouts and many reboot iterations. For thisi, Codex proved very helpful. Along the way, I stumbled upon some generic sparc and driver bugs that this series addresses as well. This series adds support for the Fujitsu SPARC Enterprise M3000, with SPARC64 VII+, Oberon PCIe, BCM5718 networking and a firmware hvc console. It applies to Linux v7.3-rc1, base cee9395acd8043be0644b25c34bfa86623f2b935. Patches 1-3 fix existing sparc64 defects in generic clear_page, secondary queued-spinlock acquisition and sun4u kernel huge-PUD mappings. Each has a Fixes tag. Patches 4-7 add the CPU/MMU/SMP path, PCIe bridge, narrowly matched tg3 firmware-state correction and console. They form one series so the complete port can be built without collecting prerequisites. VII context-write and demap synchronization follows the cited JPS2 and SPARC64 VII manual sections. Existing Cheetah routines are unchanged: similar assembly does not establish the same hardware requirement there. The final tree includes the demap-all instruction synchronization in the CPU/MMU patch. All seven cumulative prefixes build. The exact final image boots Gentoo/OpenRC and SSH with eight threads; kernel taint is zero. HugeTLB/THP, CPU offlining, Oberon MSI and complete RAS recovery remain unsupported. Firmware console calls cannot be bounded if firmware stalls. SPARC64 VII/VII+ support is currently opt-in through Kconfig while the new CPU/MMU/SMP paths receive broader testing. The option also excludes HugeTLB and THP configurations, which this implementation does not yet support. The longer-term aim is to rely on runtime CPU detection once unsupported huge-page configurations can be handled safely. Magnus Lindholm (7): sparc64: return from the generic clear_page implementation sparc64: honor queued spinlock layout in secondary startup sparc64: avoid huge kernel PUD mappings on sun4u sparc64: add SPARC64 VII CPU, MMU and SMP support sparc64: add M3000 Oberon PCIe support tg3: normalize inherited M3000 register byte order hvc: add an M3000 firmware console backend MAINTAINERS | 6 + arch/sparc/Kconfig | 19 +++ arch/sparc/include/asm/head_64.h | 15 ++ arch/sparc/include/asm/iommu_64.h | 1 + arch/sparc/include/asm/irq_64.h | 1 + arch/sparc/include/asm/setup.h | 5 + arch/sparc/include/asm/smp_64.h | 4 + arch/sparc/include/asm/spitfire.h | 1 + arch/sparc/include/asm/trap_block.h | 6 + arch/sparc/kernel/cpu.c | 3 + arch/sparc/kernel/entry.h | 2 + arch/sparc/kernel/head_64.S | 18 +++ arch/sparc/kernel/helpers.S | 41 +++++ arch/sparc/kernel/iommu.c | 44 ++++++ arch/sparc/kernel/irq_64.c | 50 ++++-- arch/sparc/kernel/pci_fire.c | 31 +++- arch/sparc/kernel/pci_impl.h | 1 + arch/sparc/kernel/prom_64.c | 6 + arch/sparc/kernel/prom_irqtrans.c | 7 + arch/sparc/kernel/ptrace_64.c | 7 + arch/sparc/kernel/setup_64.c | 55 +++++++ arch/sparc/kernel/smp_64.c | 82 +++++++++- arch/sparc/kernel/trampoline_64.S | 53 ++++++- arch/sparc/kernel/traps_64.c | 27 ++++ arch/sparc/lib/GENpage.S | 3 + arch/sparc/mm/init_64.c | 110 ++++++++++++- arch/sparc/mm/tsb.c | 19 ++- arch/sparc/mm/ultra.S | 236 ++++++++++++++++++++++++++++ drivers/net/ethernet/broadcom/tg3.c | 91 ++++++++++- drivers/tty/hvc/Kconfig | 10 ++ drivers/tty/hvc/Makefile | 2 + drivers/tty/hvc/hvc_m3000.c | 167 ++++++++++++++++++++ 32 files changed, 1088 insertions(+), 35 deletions(-) create mode 100644 drivers/tty/hvc/hvc_m3000.c base-commit: cee9395acd8043be0644b25c34bfa86623f2b935 -- 2.43.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 6/7] tg3: normalize inherited M3000 register byte order 2026-10-02 16:14 [PATCH 0/7] sparc64: add Fujitsu M3000 support Magnus Lindholm @ 2026-10-02 16:14 ` Magnus Lindholm 2026-10-08 16:58 ` Jakub Kicinski 0 siblings, 1 reply; 4+ messages in thread From: Magnus Lindholm @ 2026-10-02 16:14 UTC (permalink / raw) To: sparclinux, David S . Miller, Andreas Larsson Cc: linux-kernel, Magnus Lindholm, Pavan Chebbi, Michael Chan, Andrew Lunn, Eric Dumazet, Jakub Kicinski, Paolo Abeni, netdev M3000 firmware can leave BCM5718 vendor registers byte-swapped while standard PCI fields retain normal byte order. Match the Fujitsu 10cf:165a subsystem, IKKAKU model and swapped revision/product signature before restoring host control; reject failed PCI accesses or register readbacks. Keep this in probe so failures can abort initialization; SPARC firmware enumeration skips PCI_FIXUP_EARLY. Normal rebinds and other platforms retain their existing path. Use tg3.h's MISC_HOST_CTRL_BYTE_SWAP and TG3PCI_GEN2_PRODID_ASICREV; the inherited state was observed on M3000 hardware. Signed-off-by: Magnus Lindholm <linmag7@gmail.com> --- drivers/net/ethernet/broadcom/tg3.c | 91 ++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 73a4b569b03e..9335bcc0d8d3 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -56,6 +56,7 @@ #include <linux/hwmon-sysfs.h> #include <linux/crc32.h> #include <linux/dmi.h> +#include <linux/of.h> #include <net/checksum.h> #include <net/gso.h> @@ -16248,6 +16249,83 @@ static bool tg3_10_100_only_device(struct tg3 *tp, return false; } +/* M3000 firmware can leave the on-board BCM5718 registers byte-swapped. */ +static bool tg3_is_m3000(struct pci_dev *pdev) +{ + struct device_node *root; + const char *model; + bool match; + + if (pdev->vendor != PCI_VENDOR_ID_BROADCOM || + pdev->device != TG3PCI_DEVICE_TIGON3_5718 || + pdev->subsystem_vendor != 0x10cf || + pdev->subsystem_device != 0x165a) + return false; + + root = of_find_node_by_path("/"); + match = !of_property_read_string(root, "model", &model) && + !strcmp(model, "IKKAKU"); + of_node_put(root); + return match; +} + +static int tg3_m3000_fw_byteorder(struct tg3 *tp, u32 *misc_ctrl_reg) +{ + struct pci_dev *pdev = tp->pdev; + u32 prodid, expected_prodid, normalized, readback; + int reg, err; + + if (!tg3_is_m3000(pdev) || + (swab32(*misc_ctrl_reg) >> 28) != ASIC_REV_USE_PROD_ID_REG || + !(swab32(*misc_ctrl_reg) & MISC_HOST_CTRL_BYTE_SWAP)) + return 0; + + /* Standard PCI fields are normal; verify the swapped vendor registers. */ + reg = TG3PCI_GEN2_PRODID_ASICREV; + err = pci_read_config_dword(pdev, reg, &prodid); + if (err) + goto config_error; + expected_prodid = swab32(prodid); + if ((expected_prodid >> 12) != ASIC_REV_5717) { + dev_err(&pdev->dev, "M3000: unexpected swapped product ID %08x\n", + prodid); + return -ENODEV; + } + + normalized = (swab32(*misc_ctrl_reg) & MISC_HOST_CTRL_CHIPREV) | + tp->misc_host_ctrl; + reg = TG3PCI_MISC_HOST_CTRL; + err = pci_write_config_dword(pdev, reg, swab32(normalized)); + if (err) + goto config_error; + err = pci_read_config_dword(pdev, reg, &readback); + if (err) + goto config_error; + if (readback != normalized) { + dev_err(&pdev->dev, "M3000: host-control readback mismatch %08x\n", + readback); + return -EIO; + } + + reg = TG3PCI_GEN2_PRODID_ASICREV; + err = pci_read_config_dword(pdev, reg, &prodid); + if (err) + goto config_error; + if (prodid != expected_prodid) { + dev_err(&pdev->dev, "M3000: product-ID readback mismatch %08x\n", + prodid); + return -EIO; + } + *misc_ctrl_reg = readback; + dev_info(&pdev->dev, "M3000: normalized firmware register byte order\n"); + return 0; + +config_error: + dev_err(&pdev->dev, "M3000: PCI config access at %#x failed (%d)\n", + reg, err); + return pcibios_err_to_errno(err); +} + static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent) { u32 misc_ctrl_reg; @@ -16272,8 +16350,17 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent) * sure that indirect register accesses are enabled before * the first operation. */ - pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, - &misc_ctrl_reg); + err = pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, + &misc_ctrl_reg); + if (err && tg3_is_m3000(tp->pdev)) { + dev_err(&tp->pdev->dev, "PCI host-control read failed (%d)\n", + err); + return pcibios_err_to_errno(err); + } + err = tg3_m3000_fw_byteorder(tp, &misc_ctrl_reg); + if (err) + return err; + tp->misc_host_ctrl |= (misc_ctrl_reg & MISC_HOST_CTRL_CHIPREV); pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 6/7] tg3: normalize inherited M3000 register byte order 2026-10-02 16:14 ` [PATCH 6/7] tg3: normalize inherited M3000 register byte order Magnus Lindholm @ 2026-10-08 16:58 ` Jakub Kicinski 2026-10-08 18:23 ` Magnus Lindholm 0 siblings, 1 reply; 4+ messages in thread From: Jakub Kicinski @ 2026-10-08 16:58 UTC (permalink / raw) To: Magnus Lindholm Cc: sparclinux, David S . Miller, Andreas Larsson, linux-kernel, Pavan Chebbi, Michael Chan, Andrew Lunn, Eric Dumazet, Paolo Abeni, netdev On Fri, 2 Oct 2026 18:14:28 +0200 Magnus Lindholm wrote: > M3000 firmware can leave BCM5718 vendor registers byte-swapped while > standard PCI fields retain normal byte order. Match the Fujitsu 10cf:165a > subsystem, IKKAKU model and swapped revision/product signature before > restoring host control; reject failed PCI accesses or register readbacks. Is there any dependency on other patches in the series? if not please send this patch out separately -- pw-bot: cr ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 6/7] tg3: normalize inherited M3000 register byte order 2026-10-08 16:58 ` Jakub Kicinski @ 2026-10-08 18:23 ` Magnus Lindholm 0 siblings, 0 replies; 4+ messages in thread From: Magnus Lindholm @ 2026-10-08 18:23 UTC (permalink / raw) To: Jakub Kicinski Cc: sparclinux, David S . Miller, Andreas Larsson, linux-kernel, Pavan Chebbi, Michael Chan, Andrew Lunn, Eric Dumazet, Paolo Abeni, netdev Hi Jakub, On Thu, Oct 8, 2026 at 6:58 PM Jakub Kicinski <kuba@kernel.org> wrote: > > On Fri, 2 Oct 2026 18:14:28 +0200 Magnus Lindholm wrote: > > M3000 firmware can leave BCM5718 vendor registers byte-swapped while > > standard PCI fields retain normal byte order. Match the Fujitsu 10cf:165a > > subsystem, IKKAKU model and swapped revision/product signature before > > restoring host control; reject failed PCI accesses or register readbacks. > > Is there any dependency on other patches in the series? > if not please send this patch out separately > -- There are no code dependencies on the other patches, so this can go through the netdev tree independently. It applies to v7.3-rc1. Booting the M3000 to test it requires platform support from the rest of the series. I'll send this patch separately as requested, dropping it from the full series as I send out its v2. Thanks, Magnus ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-10-08 18:23 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-02 16:14 [PATCH 0/7] sparc64: add Fujitsu M3000 support Magnus Lindholm 2026-10-02 16:14 ` [PATCH 6/7] tg3: normalize inherited M3000 register byte order Magnus Lindholm 2026-10-08 16:58 ` Jakub Kicinski 2026-10-08 18:23 ` Magnus Lindholm
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox