linux-kernel.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: linux-arm-msm, linux-arm-kernel, Peter Jones,
	Bartlomiej Zolnierkiewicz, open list:EFIFB FRAMEBUFFER DRIVER,
	open list:FRAMEBUFFER LAYER, open list

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.

^ 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: linux-arm-msm, linux-arm-kernel, Peter Jones,
	Bartlomiej Zolnierkiewicz, open list:EFIFB FRAMEBUFFER DRIVER,
	open list:FRAMEBUFFER LAYER, open list

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.

^ 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: linux-arm-msm, linux-arm-kernel, Peter Jones,
	Bartlomiej Zolnierkiewicz, open list:EFIFB FRAMEBUFFER DRIVER,
	open list:FRAMEBUFFER LAYER, open list

On 5/16/2018 2:31 PM, Timur Tabi wrote:
> 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?
> 

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.

>> +        win_size = window->res->end - window->res->start + 1;
> 
> Use resource_size() instead.
> 

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.

^ 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];
>   
> 

^ 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

On 5/17/2018 6:17 AM, Robin Murphy wrote:
>> +    }
>> +
> 
> 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.

^ 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).