From: Bjorn Helgaas <helgaas@kernel.org>
To: Anirudh Srinivasan <asrinivasan@oss.tenstorrent.com>
Cc: "Bjorn Helgaas" <bhelgaas@google.com>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
joelsmith@tenstorrent.com,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: Re: [PATCH 2/2] PCI: quirks: Drop unassignable 32 GiB BAR 4 on Tenstorrent Blackhole
Date: Wed, 26 Aug 2026 14:55:03 -0500 [thread overview]
Message-ID: <20260826195503.GA1554946@bhelgaas> (raw)
In-Reply-To: <20260824-blackhole_quirk-v1-2-fc004672cdbd@oss.tenstorrent.com>
[+cc Ilpo]
On Mon, Aug 24, 2026 at 11:57:07AM -0500, Anirudh Srinivasan wrote:
> Tenstorrent Blackhole cards expose a 32 GiB BAR 4 that is unused by most
> software talking to the card. This BAR cannot be assigned on hosts whose
> PCI aperture is smaller than 32 GiB (e.g some ARM/RISC-V systems). This
> failure also results in BAR 0 (256 MiB) and 2 (2 MiB) being unassigned
> because bridge windows are sized as the sum of all enabled child BARs.
> This makes the card completely unusable on such systems.
>
> spacemit-k1-pcie 80000000.pcie: PCI host bridge to bus 0000:00
> pci_bus 0000:00: root bus resource [bus 00-ff]
> pci_bus 0000:00: root bus resource [io 0x100000-0x1fffff] (bus address [0x10000-0x10ffff])
> pci_bus 0000:00: root bus resource [mem 0x1100110000-0x117fffffff] (bus address [0x00110000-0x7fffffff])
> pci_bus 0000:00: root bus resource [mem 0x1800000000-0x18ffffffff pref]
>
> <snip>
>
> pci 0000:01:00.0: [1e52:b140] type 00 class 0x120000 PCIe Endpoint
> pci 0000:01:00.0: BAR 0 [mem 0x00000000-0x1fffffff 64bit pref]
> pci 0000:01:00.0: BAR 2 [mem 0x1120000000-0x11200fffff 64bit pref]
> pci 0000:01:00.0: BAR 4 [mem 0xfffffff800000000-0xffffffffffffffff 64bit pref]
>
> <snip>
>
> pci 0000:00:00.0: bridge window [mem size 0x820100000 64bit pref]: can't assign; no space
> pci 0000:00:00.0: bridge window [mem size 0x820100000 64bit pref]: failed to assign
> pci 0000:00:00.0: BAR 0 [mem 0x1108000000-0x110fffffff]: assigned
> pci 0000:00:00.0: BAR 1 [mem 0x1110000000-0x1117ffffff]: assigned
> pci 0000:00:00.0: BAR 0 [mem 0x1108000000-0x110fffffff]: releasing
> pci 0000:00:00.0: BAR 1 [mem 0x1110000000-0x1117ffffff]: releasing
> pci 0000:00:00.0: bridge window [mem size 0x820100000 64bit pref]: can't assign; no space
> pci 0000:00:00.0: bridge window [mem size 0x820100000 64bit pref]: failed to assign
> pci 0000:00:00.0: BAR 0 [mem 0x1108000000-0x110fffffff]: assigned
> pci 0000:00:00.0: BAR 1 [mem 0x1110000000-0x1117ffffff]: assigned
> pci 0000:01:00.0: BAR 4 [mem size 0x800000000 64bit pref]: can't assign; no space
> pci 0000:01:00.0: BAR 4 [mem size 0x800000000 64bit pref]: failed to assign
> pci 0000:01:00.0: BAR 0 [mem size 0x20000000 64bit pref]: can't assign; no space
> pci 0000:01:00.0: BAR 0 [mem size 0x20000000 64bit pref]: failed to assign
> pci 0000:01:00.0: BAR 2 [mem size 0x00100000 64bit pref]: can't assign; no space
> pci 0000:01:00.0: BAR 2 [mem size 0x00100000 64bit pref]: failed to assign
> pci 0000:01:00.0: BAR 4 [mem size 0x800000000 64bit pref]: can't assign; no space
> pci 0000:01:00.0: BAR 4 [mem size 0x800000000 64bit pref]: failed to assign
> pci 0000:01:00.0: BAR 0 [mem size 0x20000000 64bit pref]: can't assign; no space
> pci 0000:01:00.0: BAR 0 [mem size 0x20000000 64bit pref]: failed to assign
> pci 0000:01:00.0: BAR 2 [mem size 0x00100000 64bit pref]: can't assign; no space
> pci 0000:01:00.0: BAR 2 [mem size 0x00100000 64bit pref]: failed to assign
>
> Add a header fixup that walks the root-bus apertures and drops BAR 4
> when it is larger than every root-bus aperture. Resource assignment
> skips resources with zero flags (pdev_resource_assignable()), so the
> bridge window then sizes to BARs 0/2 and succeeds. This was tested on a
> Spacemit-K3 RISC-V board that has only 4GiB of BAR space. tt-smi and
> tt-bh-linux are able to run on the card.
>
> Signed-off-by: Anirudh Srinivasan <asrinivasan@oss.tenstorrent.com>
> ---
> drivers/pci/quirks.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index b09f27f7846fc..df54e379c116b 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -6415,3 +6415,35 @@ static void pci_mask_replay_timer_timeout(struct pci_dev *pdev)
> DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_GLI, 0x9750, pci_mask_replay_timer_timeout);
> DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_GLI, 0x9755, pci_mask_replay_timer_timeout);
> #endif
> +
> +/*
> + * Drop unused 32 GiB BAR 4 on Tenstorrent Blackhole cards so the card is
> + * usable on systems with smaller host bridge apertures.
> + */
> +static void quirk_tenstorrent_blackhole_bar4(struct pci_dev *pdev)
> +{
> + struct resource *res = &pdev->resource[4];
> + struct pci_bus *bus = pdev->bus;
> + struct resource *win;
> +
> + if (!(res->flags & IORESOURCE_MEM))
> + return;
> +
> + /* Find the root bus; its resource list holds the host apertures */
> + while (bus->parent)
> + bus = bus->parent;
> +
> + pci_bus_for_each_resource(bus, win) {
> + if (!win || !(win->flags & IORESOURCE_MEM))
> + continue;
> + if (resource_size(res) <= resource_size(win))
> + return;
> + }
> +
> + pci_info(pdev, "BAR 4 %pR larger than every host bridge aperture, dropping it\n",
> + res);
> + res->start = 0;
> + res->end = 0;
> + res->flags = 0;
This seems problematic because the hardware BAR still exists even if
we zero out res->flags.
This is a problem because pci_enable_device() will successfully enable
a device and turn on PCI_COMMAND_MEMORY even though the hardware BAR
may contain junk. And if a driver ioremaps this BAR, it is
ioremapping physical address 0, which doesn't end well.
I know this from bitter experience :)
If you have some device-specific way to actually disable the BAR in
the hardware, that could work.
> +}
> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TENSTORRENT, 0xb140, quirk_tenstorrent_blackhole_bar4);
>
> --
> 2.43.0
>
next prev parent reply other threads:[~2026-08-26 19:55 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-24 16:57 [PATCH 0/2] Add PCI quirk for Tenstorrent Blackhole to work on systems without enough host bridge aperture space Anirudh Srinivasan
2026-08-24 16:57 ` [PATCH 1/2] PCI: Add Tenstorrent vendor ID to linux/pci_ids.h Anirudh Srinivasan
2026-08-24 16:59 ` sashiko-bot
2026-08-24 16:57 ` [PATCH 2/2] PCI: quirks: Drop unassignable 32 GiB BAR 4 on Tenstorrent Blackhole Anirudh Srinivasan
2026-08-24 17:04 ` sashiko-bot
2026-08-26 19:55 ` Bjorn Helgaas [this message]
2026-08-26 20:16 ` Anirudh Srinivasan
2026-08-26 20:49 ` Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260826195503.GA1554946@bhelgaas \
--to=helgaas@kernel.org \
--cc=asrinivasan@oss.tenstorrent.com \
--cc=bhelgaas@google.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=joelsmith@tenstorrent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox