linux/drivers/gpu/drm/nouveau/nvkm/subdev
Mikel Rychliski 72e0ef0e5f PCI: Use ioremap(), not phys_to_virt() for platform ROM
On some EFI systems, the video BIOS is provided by the EFI firmware.  The
boot stub code stores the physical address of the ROM image in pdev->rom.
Currently we attempt to access this pointer using phys_to_virt(), which
doesn't work with CONFIG_HIGHMEM.

On these systems, attempting to load the radeon module on a x86_32 kernel
can result in the following:

  BUG: unable to handle page fault for address: 3e8ed03c
  #PF: supervisor read access in kernel mode
  #PF: error_code(0x0000) - not-present page
  *pde = 00000000
  Oops: 0000 [#1] PREEMPT SMP
  CPU: 0 PID: 317 Comm: systemd-udevd Not tainted 5.6.0-rc3-next-20200228 #2
  Hardware name: Apple Computer, Inc. MacPro1,1/Mac-F4208DC8, BIOS     MP11.88Z.005C.B08.0707021221 07/02/07
  EIP: radeon_get_bios+0x5ed/0xe50 [radeon]
  Code: 00 00 84 c0 0f 85 12 fd ff ff c7 87 64 01 00 00 00 00 00 00 8b 47 08 8b 55 b0 e8 1e 83 e1 d6 85 c0 74 1a 8b 55 c0 85 d2 74 13 <80> 38 55 75 0e 80 78 01 aa 0f 84 a4 03 00 00 8d 74 26 00 68 dc 06
  EAX: 3e8ed03c EBX: 00000000 ECX: 3e8ed03c EDX: 00010000
  ESI: 00040000 EDI: eec04000 EBP: eef3fc60 ESP: eef3fbe0
  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 EFLAGS: 00010206
  CR0: 80050033 CR2: 3e8ed03c CR3: 2ec77000 CR4: 000006d0
  Call Trace:
   r520_init+0x26/0x240 [radeon]
   radeon_device_init+0x533/0xa50 [radeon]
   radeon_driver_load_kms+0x80/0x220 [radeon]
   drm_dev_register+0xa7/0x180 [drm]
   radeon_pci_probe+0x10f/0x1a0 [radeon]
   pci_device_probe+0xd4/0x140

Fix the issue by updating all drivers which can access a platform provided
ROM. Instead of calling the helper function pci_platform_rom() which uses
phys_to_virt(), call ioremap() directly on the pdev->rom.

radeon_read_platform_bios() previously directly accessed an __iomem
pointer. Avoid this by calling memcpy_fromio() instead of kmemdup().

pci_platform_rom() now has no remaining callers, so remove it.

Link: https://lore.kernel.org/r/20200319021623.5426-1-mikel@mikelr.com
Signed-off-by: Mikel Rychliski <mikel@mikelr.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
2020-03-30 09:52:23 -05:00
..
acr drm/nouveau/acr: return error when registering LSF if ACR not supported 2020-01-29 15:49:56 +10:00
bar drm/nouveau/bar/gm20b: Avoid BAR1 teardown during init 2019-09-17 14:50:16 +10:00
bios PCI: Use ioremap(), not phys_to_virt() for platform ROM 2020-03-30 09:52:23 -05:00
bus drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
clk drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
devinit drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
fault drm/nouveau/fault/gv100-: fix memory leak on module unload 2020-01-15 10:50:25 +10:00
fb drm/nouveau/fb/gp102-: allow module to load even when scrubber binary is missing 2020-01-29 15:49:56 +10:00
fuse drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
gpio drm/nouveau/gpio: check function 76 in the power check as well 2019-08-23 12:55:34 +10:00
gsp drm/nouveau/flcn: reset sec2/gsp falcons harder 2020-01-15 10:50:28 +10:00
i2c drm/nouveau: Don't retry infinitely when receiving no data on i2c over AUX 2019-08-23 12:42:43 +10:00
ibus drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
iccsense drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
instmem drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
ltc drm/nouveau/ltc/gp10b: Add custom L2 cache implementation 2020-01-15 10:49:59 +10:00
mc drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
mmu drm/nouveau/mmu: Add correct turing page kinds 2020-01-15 10:49:59 +10:00
mxm drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
pci drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
pmu drm/nouveau/pmu/gm20b,gp10b: Fix Falcon bootstrapping 2020-01-23 08:56:51 +10:00
therm drm/nouveau/therm: don't attempt fan control where PMU is already managing it 2019-08-23 12:55:33 +10:00
timer drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
top drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
volt drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
Kbuild drm/nouveau/secboot: remove 2020-01-15 10:50:30 +10:00