linux/arch/sparc/kernel
Ilpo Järvinen fb08fec721 sparc/PCI: Correct 64-bit non-pref -> pref BAR resources
[ Upstream commit bdb32359ea ]

SPARC T5-2 dts describes some PCI BARs as 64-bit resources without the
pref(etchable) bit (0x83... vs 0xc3... in assigned-addresses) for address
ranges above the 4G threshold. Such resources cannot be placed into a
non-prefetchable PCI bridge window that is capable only of 32-bit
addressing. As such, it looks like the platform is improperly described by
the dts.

The kernel detects this problem (see the IORESOURCE_PREFETCH check in
pci_find_parent_resource()) and fails to assign these BAR resources to the
resource tree due to lack of a compatible bridge window.

Prior to 754babaaf3 ("sparc/PCI: Remove pcibios_enable_device() as they
do nothing extra") SPARC arch code did not test whether device resources
were successfully in the resource tree when enabling a device, effectively
hiding the problem. After removing the arch-specific enable code,
pci_enable_resources() refuses to enable the device when it finds not all
mem resources are assigned, and therefore mpt3sas can't be enabled:

  pci 0001:04:00.0: reg 0x14: [mem 0x801110000000-0x80111000ffff 64bit]
  pci 0001:04:00.0: reg 0x1c: [mem 0x801110040000-0x80111007ffff 64bit]
  pci 0001:04:00.0: BAR 1 [mem 0x801110000000-0x80111000ffff 64bit]: can't claim; no compatible bridge window
  pci 0001:04:00.0: BAR 3 [mem 0x801110040000-0x80111007ffff 64bit]: can't claim; no compatible bridge window
  mpt3sas 0001:04:00.0: BAR 1 [mem size 0x00010000 64bit]: not assigned; can't enable device

For clarity, this filtered log only shows failures for one mpt3sas device
but other devices fail similarly. In the reported case, the end result with
all the failures is an unbootable system.

Things appeared to "work" before 754babaaf3 ("sparc/PCI: Remove
pcibios_enable_device() as they do nothing extra") because the resource
tree is agnostic to whether PCI BAR resources are properly in the tree or
not. So as long as there was a parent resource (e.g. a root bus resource)
that contains the address range, the resource tree code just places
resource request underneath it without any consideration to the
intermediate BAR resource. While it worked, it's incorrect setup still.

Add an OF fixup to set the IORESOURCE_PREFETCH flag for a 64-bit PCI
resource that has the end address above 4G requiring placement into the
prefetchable window. Also log the issue.

Fixes: 754babaaf3 ("sparc/PCI: Remove pcibios_enable_device() as they do nothing extra")
Reported-by: Nathaniel Roach <nroach44@gmail.com>
Closes: https://github.com/sparclinux/issues/issues/22
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Nathaniel Roach <nroach44@gmail.com>
Link: https://patch.msgid.link/20251124170411.3709-1-ilpo.jarvinen@linux.intel.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2026-01-17 16:35:29 +01:00
..
syscalls fs: introduce file_getattr and file_setattr syscalls 2025-07-02 17:05:17 +02:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
adi_64.c sparc64: Remove redundant __GFP_NOWARN 2025-09-19 20:26:39 +02:00
apc.c sparc: kernel: apc: Remove macro APC_MINOR definition 2025-08-19 12:41:18 +02:00
asm-offsets.c arch: Add the macro COMPILE_OFFSETS to all the asm-offsets.c 2025-09-25 09:57:15 +02:00
audit.c audit: add support for the openat2 syscall 2021-10-01 16:52:48 -04:00
auxio_32.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
auxio_64.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
btext.c sparc: Use shared font data 2024-02-16 16:49:58 +01:00
central.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
cherrs.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
chmc.c Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
compat_audit.c audit: add support for the openat2 syscall 2021-10-01 16:52:48 -04:00
cpu.c mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
cpumap.c sparc: Annotate struct cpuinfo_tree with __counted_by 2023-10-06 13:25:17 -07:00
cpumap.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
devices.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ds.c sparc: Replace deprecated strcpy() with strscpy() in domain services driver 2025-09-26 17:27:18 +02:00
dtlb_miss.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dtlb_prot.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ebus.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
entry.h sparc64: Add support for ADI register fields, ASIs and traps 2018-03-18 07:38:45 -07:00
entry.S sparc: replace #include <asm/export.h> with #include <linux/export.h> 2023-08-22 18:12:25 +09:00
etrap_32.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
etrap_64.S sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
fpu_traps.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ftrace.c ftrace: Cleanup ftrace_dyn_arch_init() 2021-10-08 19:41:39 -04:00
getsetcc.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
head_32.S sparc32: Fix truncated relocation errors when linking large kernels 2024-07-11 15:58:18 +02:00
head_64.S sparc: replace #include <asm/export.h> with #include <linux/export.h> 2023-08-22 18:12:25 +09:00
helpers.S treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00
hvapi.c sparc64: Oracle DAX infrastructure 2018-01-22 08:17:15 -08:00
hvcalls.S sparc64: Oracle DAX infrastructure 2018-01-22 08:17:15 -08:00
hvtramp.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
idprom.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
iommu-common.c dma-mapping: introduce dma_get_seg_boundary_nr_pages() 2020-09-03 18:12:15 +02:00
iommu.c sparc/iommu: don't set failed sg dma_address to DMA_MAPPING_ERROR 2021-08-09 17:13:06 +02:00
iommu_common.h sparc: remove the mapping_error dma_map_ops method 2018-12-06 06:56:40 -08:00
ioport.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
irq.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
irq_32.c sparc/irq: use seq_put_decimal_ull_width() for decimal values 2025-01-17 16:33:06 +01:00
irq_64.c sparc/irq: Remove unneeded if check in sun4v_cookie_only_virqs() 2025-01-17 16:33:48 +01:00
itlb_miss.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ivec.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
jump_label.c jump_label: move 'asm goto' support test to Kconfig 2019-01-06 09:46:51 +09:00
kernel.h sparc64: Fix prototype warning for uprobe_trap 2024-04-22 15:33:06 +02:00
kgdb_32.c sparc32: Fix build with trapbase 2024-03-08 21:20:23 +01:00
kgdb_64.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
kprobes.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
kstack.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ktlb.S mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
ldc.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
led.c treewide: Switch/rename to timer_delete[_sync]() 2025-04-05 10:30:12 +02:00
leon_kernel.c sparc/leon: Remove on-stack cpumask var 2024-05-08 19:42:16 +02:00
leon_pci.c sparc/PCI: Remove pcibios_enable_device() as they do nothing extra 2025-09-16 11:18:44 -05:00
leon_pci_grpci1.c sparc32: Fix section mismatch in leon_pci_grpci 2024-03-08 21:21:00 +01:00
leon_pci_grpci2.c sparc32: Fix section mismatch in leon_pci_grpci 2024-03-08 21:21:00 +01:00
leon_pmc.c arch/idle: Change arch_cpu_idle() behavior: always exit with IRQs disabled 2023-01-13 11:48:15 +01:00
leon_smp.c sparc32: Fix build with trapbase 2024-03-08 21:20:23 +01:00
Makefile sparc: Drop the "-ansi" from the asflags 2025-09-26 16:55:21 +02:00
mdesc.c sparc: avoid stringop-overread errors 2021-09-15 13:42:33 -07:00
misctrap.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
module.c sparc/module: Make it clear that relocation numbers are shown in hex 2025-09-19 20:23:09 +02:00
nmi.c sparc64: NMI watchdog: fix return value of __setup handler 2024-02-16 16:50:25 +01:00
of_device_32.c sparc: fix error handling in scan_one_device() 2025-09-22 07:52:35 +02:00
of_device_64.c sparc: fix error handling in scan_one_device() 2025-09-22 07:52:35 +02:00
of_device_common.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
of_device_common.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pci.c sparc/PCI: Correct 64-bit non-pref -> pref BAR resources 2026-01-17 16:35:29 +01:00
pci_common.c sparc/PCI: Update reference to devm_of_pci_get_host_bridge_resources() 2025-01-15 15:27:22 -06:00
pci_fire.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
pci_impl.h sparc: Fix typos 2024-02-16 16:50:25 +01:00
pci_msi.c sparc/pci_msi: Remove on-stack cpumask var 2024-05-08 19:42:15 +02:00
pci_psycho.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
pci_sabre.c sparc: Use device_get_match_data() 2024-01-19 08:08:53 -06:00
pci_schizo.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
pci_sun4v.c sparc64: Fix prototype warning for dma_4v_iotsb_bind 2024-04-22 15:33:06 +02:00
pci_sun4v.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pci_sun4v_asm.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pcic.c pci-v6.18-changes 2025-10-06 10:41:03 -07:00
pcr.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
perf_event.c sparc/perf: Remove driver-specific throttle support 2025-05-21 13:57:46 +02:00
pmc.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
power.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
process.c sparc: switch to kernel_clone() 2020-08-20 13:12:58 +02:00
process_32.c arch: copy_thread: pass clone_flags as u64 2025-09-01 15:31:34 +02:00
process_64.c arch: copy_thread: pass clone_flags as u64 2025-09-01 15:31:34 +02:00
prom.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
prom_32.c sparc: Replace deprecated strcpy() with strscpy() in prom_32.c 2025-09-26 17:27:35 +02:00
prom_64.c sparc64: Replace deprecated strcpy() with strscpy() in build_path_component() 2025-09-26 17:27:35 +02:00
prom_common.c sparc: Replace deprecated strcpy() with strscpy() in handle_nextprop_quirks() 2025-09-26 17:27:35 +02:00
prom_irqtrans.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
psycho_common.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
psycho_common.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ptrace_32.c sparc: ptrace: Use USER_REGSET_NOTE_TYPE() to specify regset note names 2025-07-14 22:27:48 -07:00
ptrace_64.c sparc: ptrace: Use USER_REGSET_NOTE_TYPE() to specify regset note names 2025-07-14 22:27:48 -07:00
reboot.c sparc: Use device_type helpers to access the node type 2018-11-18 13:35:21 -08:00
rtrap_32.S sparc32: Preserve clone syscall flags argument for restarts due to signals 2021-02-18 16:15:11 -08:00
rtrap_64.S context_tracking: Split user tracking Kconfig 2022-06-29 17:04:09 -07:00
sbus.c sparc: Explicitly include correct DT includes 2023-08-28 13:30:57 -05:00
setup.c sparc: mv sparc sysctls into their own file under arch/sparc/kernel 2025-04-09 13:32:16 +02:00
setup_32.c sparc32: Fix build with trapbase 2024-03-08 21:20:23 +01:00
setup_64.c sparc64: Fix number of online CPUs 2024-04-22 15:33:07 +02:00
signal32.c x86/shstk: Add user control-protection fault handler 2023-08-02 15:01:50 -07:00
signal_32.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
signal_64.c sparc: Fix typos 2024-02-16 16:50:25 +01:00
sigutil.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sigutil_32.c Remove 'type' argument from access_ok() function 2019-01-03 18:57:57 -08:00
sigutil_64.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
smp_32.c treewide: Trace IPIs sent via smp_send_reschedule() 2023-03-24 11:01:28 +01:00
smp_64.c sparc: Replace one-element array with flexible array member 2024-11-16 09:54:12 +01:00
sparc_ksyms.c sparc: move exports to definitions 2016-08-07 23:55:43 -04:00
spiterrs.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sstate.c kernel.h: split out panic and oops helpers 2021-07-01 11:06:04 -07:00
stacktrace.c treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00
starfire.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sun4d_irq.c sparc: Use of_node_name_eq for node name comparisons 2018-11-18 13:35:21 -08:00
sun4d_smp.c sparc: Unbreak the build 2022-09-29 19:21:10 -07:00
sun4m_irq.c mm: remove unneeded includes of <asm/pgalloc.h> 2020-08-07 11:33:26 -07:00
sun4m_smp.c sparc: Unbreak the build 2022-09-29 19:21:10 -07:00
sun4v_ivec.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sun4v_mcd.S treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 482 2019-06-19 17:09:52 +02:00
sun4v_tlb_miss.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sys32.S sparc: fix compat recv/recvfrom syscalls 2024-06-25 15:57:25 +02:00
sys_sparc32.c sparc: remove unused header file nfs_fs.h 2020-06-02 18:41:48 -07:00
sys_sparc_32.c arch/sparc: teach arch_get_unmapped_area{_topdown} to handle hugetlb mappings 2024-11-06 20:11:10 -08:00
sys_sparc_64.c mm: constify arch_pick_mmap_layout() for improved const-correctness 2025-09-21 14:22:14 -07:00
syscalls.S sparc64: enable HAVE_COPY_THREAD_TLS 2020-06-23 10:49:54 +02:00
sysfs.c drivers/base/node: consolidate node device subsystem initialization in node_dev_init() 2022-03-22 15:57:10 -07:00
systbls.h sparc: get rid of asm wrapper for nis_syscall() 2018-03-20 12:05:17 -04:00
systbls_32.S sparc: syscalls: switch to generic syscalltbl.sh 2021-05-02 00:43:34 +09:00
systbls_64.S sparc: syscalls: switch to generic syscalltbl.sh 2021-05-02 00:43:34 +09:00
termios.c termios: start unifying non-UAPI parts of asm/termios.h 2022-09-09 10:44:34 +02:00
time_32.c rtc: m48t59: Use platform_data struct for year offset value 2024-11-18 14:31:57 +01:00
time_64.c rtc: m48t59: Use platform_data struct for year offset value 2024-11-18 14:31:57 +01:00
trampoline_32.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
trampoline_64.S mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
traps_32.c arch: include linux/cpu.h for trap_init() prototype 2023-11-23 11:32:31 +01:00
traps_64.c sparc64: Fix prototype warnings in traps_64.c 2024-04-22 15:33:06 +02:00
tsb.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ttable_32.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ttable_64.S sparc64: Add support for ADI register fields, ASIs and traps 2018-03-18 07:38:45 -07:00
una_asm_32.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
una_asm_64.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
unaligned_32.c signal/sparc: si_trapno is only used with SIGILL ILL_ILLTRP 2021-07-23 13:08:57 -05:00
unaligned_64.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
uprobes.c sparc64: Fix prototype warning for uprobe_trap 2024-04-22 15:33:06 +02:00
urtt_fill.S sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
utrap.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
vdso.c locking/seqlock, headers: Untangle the spaghetti monster 2020-08-06 16:13:13 +02:00
vio.c driver core: Constify API device_find_child() and adapt for various usages 2025-01-03 11:19:35 +01:00
viohs.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
visemul.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
vmlinux.lds.S vmlinux.lds.h: Adjust symbol ordering in text output section 2024-11-27 09:38:27 +09:00
windows.c signal: Replace force_fatal_sig with force_exit_sig when in doubt 2021-11-19 09:15:58 -06:00
winfixup.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
wof.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
wuf.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00