linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge
@ 2018-05-16 18:23 Sinan Kaya
  2018-05-16 18:30 ` Sinan Kaya
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Sinan Kaya @ 2018-05-16 18:23 UTC (permalink / raw)
  To: linux-pci, timur
  Cc: linux-arm-msm, linux-arm-kernel, Sinan Kaya, Peter Jones,
	Bartlomiej Zolnierkiewicz, open list:EFIFB FRAMEBUFFER DRIVER,
	open list:FRAMEBUFFER LAYER, open list

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, linelength=3200, pages=1
efifb: scrolling: redraw
efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0

Use the host bridge offset information to convert bus address to
resource address in the fixup.

Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
---
 drivers/video/fbdev/efifb.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
index 46a4484..feef02b 100644
--- a/drivers/video/fbdev/efifb.c
+++ b/drivers/video/fbdev/efifb.c
@@ -428,6 +428,8 @@ static void efifb_fixup_resources(struct pci_dev *dev)
 {
 	u64 base = screen_info.lfb_base;
 	u64 size = screen_info.lfb_size;
+	struct pci_host_bridge *bridge;
+	struct resource_entry *window;
 	int i;
 
 	if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
@@ -439,6 +441,27 @@ static void efifb_fixup_resources(struct pci_dev *dev)
 	if (!base)
 		return;
 
+	bridge = pci_find_host_bridge(dev->bus);
+	if (!bridge)
+		return;
+
+	resource_list_for_each_entry(window, &bridge->windows) {
+		phys_addr_t win_start;
+		phys_addr_t win_end;
+		size_t win_size;
+
+		if (resource_type(window->res) != IORESOURCE_MEM)
+			continue;
+
+		win_start = window->res->start - window->offset;
+		win_end = window->res->end - window->offset;
+		win_size = window->res->end - window->res->start + 1;
+		if (win_start <= base && win_end >= base + win_size - 1) {
+			base += window->offset;
+			break;
+		}
+	}
+
 	for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
 		struct resource *res = &dev->resource[i];
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge
  2018-05-16 18:23 [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge Sinan Kaya
@ 2018-05-16 18:30 ` Sinan Kaya
  2018-05-16 18:31 ` Timur Tabi
  2018-05-17 10:17 ` Robin Murphy
  2 siblings, 0 replies; 6+ messages in thread
From: Sinan Kaya @ 2018-05-16 18:30 UTC (permalink / raw)
  To: linux-pci, timur
  Cc: open list:EFIFB FRAMEBUFFER DRIVER, Bartlomiej Zolnierkiewicz,
	linux-arm-msm, open list, open list:FRAMEBUFFER LAYER,
	Peter Jones, linux-arm-kernel

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.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge
  2018-05-16 18:23 [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge Sinan Kaya
  2018-05-16 18:30 ` Sinan Kaya
@ 2018-05-16 18:31 ` Timur Tabi
  2018-05-16 18:41   ` Sinan Kaya
  2018-05-17 10:17 ` Robin Murphy
  2 siblings, 1 reply; 6+ messages in thread
From: Timur Tabi @ 2018-05-16 18:31 UTC (permalink / raw)
  To: Sinan Kaya, linux-pci
  Cc: open list:EFIFB FRAMEBUFFER DRIVER, Bartlomiej Zolnierkiewicz,
	linux-arm-msm, open list, open list:FRAMEBUFFER LAYER,
	Peter Jones, linux-arm-kernel

On 05/16/2018 01:23 PM, Sinan Kaya wrote:
> +		win_start = window->res->start - window->offset;

Can you guarantee that window->res->start is always >= window->offset?

> +		win_size = window->res->end - window->res->start + 1;

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.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge
  2018-05-16 18:31 ` Timur Tabi
@ 2018-05-16 18:41   ` Sinan Kaya
  0 siblings, 0 replies; 6+ messages in thread
From: Sinan Kaya @ 2018-05-16 18:41 UTC (permalink / raw)
  To: Timur Tabi, linux-pci
  Cc: open list:EFIFB FRAMEBUFFER DRIVER, Bartlomiej Zolnierkiewicz,
	linux-arm-msm, open list, open list:FRAMEBUFFER LAYER,
	Peter Jones, linux-arm-kernel

T24gNS8xNi8yMDE4IDI6MzEgUE0sIFRpbXVyIFRhYmkgd3JvdGU6Cj4gT24gMDUvMTYvMjAxOCAw
MToyMyBQTSwgU2luYW4gS2F5YSB3cm90ZToKPj4gK8KgwqDCoMKgwqDCoMKgIHdpbl9zdGFydCA9
IHdpbmRvdy0+cmVzLT5zdGFydCAtIHdpbmRvdy0+b2Zmc2V0Owo+IAo+IENhbiB5b3UgZ3VhcmFu
dGVlIHRoYXQgd2luZG93LT5yZXMtPnN0YXJ0IGlzIGFsd2F5cyA+PSB3aW5kb3ctPm9mZnNldD8K
PiAKClJlc291cmNlIG9mZnNldCBpcyBnZW5lcmFsbHkgMCB3aGVuIG5vdCB0cmFuc2xhdGluZyBv
ciBhIHBvc2l0aXZlIG51bWJlcgp0aGF0IHlvdSBzdWJ0cmFjdCBmcm9tIHRoZSByZXNvdXJjZSBz
dGFydCB0byByZWFjaCB0byB0aGUgdHJhbnNsYXRpbmcgd2luZG93LgoKSGF2aW5nIGEgYmlnZ2Vy
IG9mZnNldCB0aGFuIHJlc291cmNlIHN0YXJ0IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgQklPUyBi
dWcuCgo+PiArwqDCoMKgwqDCoMKgwqAgd2luX3NpemUgPSB3aW5kb3ctPnJlcy0+ZW5kIC0gd2lu
ZG93LT5yZXMtPnN0YXJ0ICsgMTsKPiAKPiBVc2UgcmVzb3VyY2Vfc2l6ZSgpIGluc3RlYWQuCj4g
CgpJJ2xsIGZpeCBpdC4KCi0tIApTaW5hbiBLYXlhClF1YWxjb21tIERhdGFjZW50ZXIgVGVjaG5v
bG9naWVzLCBJbmMuIGFzIGFuIGFmZmlsaWF0ZSBvZiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIElu
Yy4KUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIGlzIGEgbWVtYmVyIG9mIHRoZSBDb2RlIEF1
cm9yYSBGb3J1bSwgYSBMaW51eCBGb3VuZGF0aW9uIENvbGxhYm9yYXRpdmUgUHJvamVjdC4KCl9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r
ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo
dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu
ZWwK

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge
  2018-05-16 18:23 [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge Sinan Kaya
  2018-05-16 18:30 ` Sinan Kaya
  2018-05-16 18:31 ` Timur Tabi
@ 2018-05-17 10:17 ` Robin Murphy
  2018-05-17 13:05   ` Sinan Kaya
  2 siblings, 1 reply; 6+ messages in thread
From: Robin Murphy @ 2018-05-17 10:17 UTC (permalink / raw)
  To: Sinan Kaya, linux-pci, timur
  Cc: open list:EFIFB FRAMEBUFFER DRIVER, Bartlomiej Zolnierkiewicz,
	linux-arm-msm, open list, open list:FRAMEBUFFER LAYER,
	Peter Jones, linux-arm-kernel

On 16/05/18 19:23, Sinan Kaya wrote:
> 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, linelength=3200, pages=1
> efifb: scrolling: redraw
> efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
> 
> Use the host bridge offset information to convert bus address to
> resource address in the fixup.
> 
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
> ---
>   drivers/video/fbdev/efifb.c | 23 +++++++++++++++++++++++
>   1 file changed, 23 insertions(+)
> 
> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
> index 46a4484..feef02b 100644
> --- a/drivers/video/fbdev/efifb.c
> +++ b/drivers/video/fbdev/efifb.c
> @@ -428,6 +428,8 @@ static void efifb_fixup_resources(struct pci_dev *dev)
>   {
>   	u64 base = screen_info.lfb_base;
>   	u64 size = screen_info.lfb_size;
> +	struct pci_host_bridge *bridge;
> +	struct resource_entry *window;
>   	int i;
>   
>   	if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
> @@ -439,6 +441,27 @@ static void efifb_fixup_resources(struct pci_dev *dev)
>   	if (!base)
>   		return;
>   
> +	bridge = pci_find_host_bridge(dev->bus);
> +	if (!bridge)
> +		return;
> +
> +	resource_list_for_each_entry(window, &bridge->windows) {
> +		phys_addr_t win_start;
> +		phys_addr_t win_end;
> +		size_t win_size;
> +
> +		if (resource_type(window->res) != IORESOURCE_MEM)
> +			continue;
> +
> +		win_start = window->res->start - window->offset;
> +		win_end = window->res->end - window->offset;
> +		win_size = window->res->end - window->res->start + 1;
> +		if (win_start <= base && win_end >= base + win_size - 1) {
> +			base += window->offset;
> +			break;
> +		}
> +	}
> +

Is this not pretty much just pcibios_bus_to_resource()?

Robin.

>   	for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
>   		struct resource *res = &dev->resource[i];
>   
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge
  2018-05-17 10:17 ` Robin Murphy
@ 2018-05-17 13:05   ` Sinan Kaya
  0 siblings, 0 replies; 6+ messages in thread
From: Sinan Kaya @ 2018-05-17 13:05 UTC (permalink / raw)
  To: Robin Murphy, linux-pci, timur
  Cc: open list:EFIFB FRAMEBUFFER DRIVER, Bartlomiej Zolnierkiewicz,
	linux-arm-msm, open list, open list:FRAMEBUFFER LAYER,
	Peter Jones, linux-arm-kernel

T24gNS8xNy8yMDE4IDY6MTcgQU0sIFJvYmluIE11cnBoeSB3cm90ZToKPj4gK8KgwqDCoCB9Cj4+
ICsKPiAKPiBJcyB0aGlzIG5vdCBwcmV0dHkgbXVjaCBqdXN0IHBjaWJpb3NfYnVzX3RvX3Jlc291
cmNlKCk/Cj4KCkFncmVlZCwgbGV0IG1lIGNvbnZlcnQgdGhlIGNvZGUgdG8gdXNlIHBjaWJpb3Nf
YnVzX3RvX3Jlc291cmNlKCkgQVBJLgpJIHdhc24ndCBhd2FyZSBvZiBpdHMgZXhpc3RlbmNlLgog
Cj4gUm9iaW4uCgoKLS0gClNpbmFuIEtheWEKUXVhbGNvbW0gRGF0YWNlbnRlciBUZWNobm9sb2dp
ZXMsIEluYy4gYXMgYW4gYWZmaWxpYXRlIG9mIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLgpR
dWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gaXMgYSBtZW1iZXIgb2YgdGhlIENvZGUgQXVyb3Jh
IEZvcnVtLCBhIExpbnV4IEZvdW5kYXRpb24gQ29sbGFib3JhdGl2ZSBQcm9qZWN0LgoKX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l
bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6
Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-05-17 13:05 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-05-16 18:23 [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge Sinan Kaya
2018-05-16 18:30 ` Sinan Kaya
2018-05-16 18:31 ` Timur Tabi
2018-05-16 18:41   ` Sinan Kaya
2018-05-17 10:17 ` Robin Murphy
2018-05-17 13:05   ` Sinan Kaya

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).