From: Sinan Kaya <hidden> Date: 2018-05-16 18:24:05
A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.
pci_bus 0000:00: root bus resource [mem 0x80100100000-0x8011fffffff window] (bus address [0x00100000-0x1fffffff])
pci 0000:02:00.0: reg 0x10: [mem 0x8011e000000-0x8011effffff]
When a VGA device is behind such a host bridge and the resource is
translated efifb driver is trying to do ioremap against bus address
rather than the resource address and is failing to probe.
efifb driver is having difficulty locating the base address from BAR
address when
efifb: probing for efifb
efifb: cannot reserve video memory at 0x1e000000
efifb: framebuffer at 0x1e000000, using 1920k, total 1875k
efifb: mode is 800x600x32, linelength200, pages=1
efifb: scrolling: redraw
efifb: Truecolor: size=8:8:8:8, shift$:16:8:0
Use the host bridge offset information to convert bus address to
resource address in the fixup.
Signed-off-by: Sinan Kaya <redacted>
---
drivers/video/fbdev/efifb.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
From: Sinan Kaya <hidden> Date: 2018-05-16 18:30:25
On 5/16/2018 2:23 PM, Sinan Kaya wrote:
+ if (win_start <= base && win_end >= base + win_size - 1) {
+ base += window->offset;
+ break;
+ }
I should probably add window->offset!=0 to the if statement in order not to
break non-translating case.
Any other comments?
--
Sinan Kaya
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Use resource_size() instead.
--
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
Technologies, Inc. Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
Can you guarantee that window->res->start is always >= window->offset?
Resource offset is generally 0 when not translating or a positive number
that you subtract from the resource start to reach to the translating window.
Having a bigger offset than resource start should be considered a BIOS bug.
I'll fix it.
--
Sinan Kaya
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
From: Robin Murphy <robin.murphy@arm.com> Date: 2018-05-17 10:17:31
On 16/05/18 19:23, Sinan Kaya wrote:
quoted hunk
A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.
pci_bus 0000:00: root bus resource [mem 0x80100100000-0x8011fffffff window] (bus address [0x00100000-0x1fffffff])
pci 0000:02:00.0: reg 0x10: [mem 0x8011e000000-0x8011effffff]
When a VGA device is behind such a host bridge and the resource is
translated efifb driver is trying to do ioremap against bus address
rather than the resource address and is failing to probe.
efifb driver is having difficulty locating the base address from BAR
address when
efifb: probing for efifb
efifb: cannot reserve video memory at 0x1e000000
efifb: framebuffer at 0x1e000000, using 1920k, total 1875k
efifb: mode is 800x600x32, linelength200, pages=1
efifb: scrolling: redraw
efifb: Truecolor: size=8:8:8:8, shift$:16:8:0
Use the host bridge offset information to convert bus address to
resource address in the fixup.
Signed-off-by: Sinan Kaya <redacted>
---
drivers/video/fbdev/efifb.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
From: Sinan Kaya <hidden> Date: 2018-05-17 13:05:35
On 5/17/2018 6:17 AM, Robin Murphy wrote:
quoted
+ }
+
Is this not pretty much just pcibios_bus_to_resource()?
Agreed, let me convert the code to use pcibios_bus_to_resource() API.
I wasn't aware of its existence.
Robin.
--
Sinan Kaya
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.