Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-18 Thread Sinan Kaya
On 5/18/2018 6:42 AM, Robin Murphy wrote:
> 
> FWIW, now that I've actually gone and looked, it appears you could simplify 
> the whole function quite a bit by getting rid of these and just using the new 
> local resource directly, especially since the only actual use of size is an 
> open-coded resource_contains().

Posted V2 a minute ago. I did the simplification on a prior patch in order not 
to
mix the issues.

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


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-18 Thread Sinan Kaya
On 5/18/2018 6:42 AM, Robin Murphy wrote:
> 
> FWIW, now that I've actually gone and looked, it appears you could simplify 
> the whole function quite a bit by getting rid of these and just using the new 
> local resource directly, especially since the only actual use of size is an 
> open-coded resource_contains().

Posted V2 a minute ago. I did the simplification on a prior patch in order not 
to
mix the issues.

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


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-18 Thread Robin Murphy

On 17/05/18 14:22, Sinan Kaya wrote:

A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.

pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
  drivers/video/fbdev/efifb.c | 10 ++
  1 file changed, 10 insertions(+)

diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
index 46a4484..ea68d5c 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;


FWIW, now that I've actually gone and looked, it appears you could 
simplify the whole function quite a bit by getting rid of these and just 
using the new local resource directly, especially since the only actual 
use of size is an open-coded resource_contains().



+   struct pci_bus_region region;
+   struct resource res;
int i;
  
  	if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)

@@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
if (!base)
return;
  
+	region.start = base;

+   region.end = base + size - 1;
+   res.start = 0;
+   res.flags = IORESOURCE_MEM;
+   pcibios_bus_to_resource(dev->bus, , );
+   if (res.start)
+   base = res.start;
+
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
struct resource *res = >resource[i];


The inadvertent name shadowing here is a bit yuck, though, and I think 
sparse will whinge about it, so it's probably worth renaming one or the 
other.


Robin.


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-18 Thread Robin Murphy

On 17/05/18 14:22, Sinan Kaya wrote:

A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.

pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
  drivers/video/fbdev/efifb.c | 10 ++
  1 file changed, 10 insertions(+)

diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
index 46a4484..ea68d5c 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;


FWIW, now that I've actually gone and looked, it appears you could 
simplify the whole function quite a bit by getting rid of these and just 
using the new local resource directly, especially since the only actual 
use of size is an open-coded resource_contains().



+   struct pci_bus_region region;
+   struct resource res;
int i;
  
  	if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)

@@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
if (!base)
return;
  
+	region.start = base;

+   region.end = base + size - 1;
+   res.start = 0;
+   res.flags = IORESOURCE_MEM;
+   pcibios_bus_to_resource(dev->bus, , );
+   if (res.start)
+   base = res.start;
+
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
struct resource *res = >resource[i];


The inadvertent name shadowing here is a bit yuck, though, and I think 
sparse will whinge about it, so it's probably worth renaming one or the 
other.


Robin.


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Ard Biesheuvel
On 17 May 2018 at 16:55, Peter Jones  wrote:
> On Thu, May 17, 2018 at 09:22:23AM -0400, Sinan Kaya wrote:
>> A host bridge is allowed to remap BAR addresses using _TRA attribute in
>> _CRS windows.
>>
>> pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
>> (bus address [0x0010-0x1fff])
>> pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]
>>
>> 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 0x1e00
>> efifb: framebuffer at 0x1e00, 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 
>
> Looks reasonable to me - Ard, do you want to take this up through the
> EFI tree?
>

Sure

> Signed-off-by: Peter Jones 
>

I'll take that as a reviewed-by, thanks.

>> ---
>>  drivers/video/fbdev/efifb.c | 10 ++
>>  1 file changed, 10 insertions(+)
>>
>> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
>> index 46a4484..ea68d5c 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_bus_region region;
>> + struct resource res;
>>   int i;
>>
>>   if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
>> @@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
>>   if (!base)
>>   return;
>>
>> + region.start = base;
>> + region.end = base + size - 1;
>> + res.start = 0;
>> + res.flags = IORESOURCE_MEM;
>> + pcibios_bus_to_resource(dev->bus, , );
>> + if (res.start)
>> + base = res.start;
>> +
>>   for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
>>   struct resource *res = >resource[i];
>>
>> --
>> 2.7.4
>>
>
> --
>   Peter


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Ard Biesheuvel
On 17 May 2018 at 16:55, Peter Jones  wrote:
> On Thu, May 17, 2018 at 09:22:23AM -0400, Sinan Kaya wrote:
>> A host bridge is allowed to remap BAR addresses using _TRA attribute in
>> _CRS windows.
>>
>> pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
>> (bus address [0x0010-0x1fff])
>> pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]
>>
>> 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 0x1e00
>> efifb: framebuffer at 0x1e00, 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 
>
> Looks reasonable to me - Ard, do you want to take this up through the
> EFI tree?
>

Sure

> Signed-off-by: Peter Jones 
>

I'll take that as a reviewed-by, thanks.

>> ---
>>  drivers/video/fbdev/efifb.c | 10 ++
>>  1 file changed, 10 insertions(+)
>>
>> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
>> index 46a4484..ea68d5c 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_bus_region region;
>> + struct resource res;
>>   int i;
>>
>>   if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
>> @@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
>>   if (!base)
>>   return;
>>
>> + region.start = base;
>> + region.end = base + size - 1;
>> + res.start = 0;
>> + res.flags = IORESOURCE_MEM;
>> + pcibios_bus_to_resource(dev->bus, , );
>> + if (res.start)
>> + base = res.start;
>> +
>>   for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
>>   struct resource *res = >resource[i];
>>
>> --
>> 2.7.4
>>
>
> --
>   Peter


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Peter Jones
On Thu, May 17, 2018 at 09:22:23AM -0400, Sinan Kaya wrote:
> A host bridge is allowed to remap BAR addresses using _TRA attribute in
> _CRS windows.
> 
> pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
> (bus address [0x0010-0x1fff])
> pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]
> 
> 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 0x1e00
> efifb: framebuffer at 0x1e00, 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 

Looks reasonable to me - Ard, do you want to take this up through the
EFI tree?

Signed-off-by: Peter Jones 

> ---
>  drivers/video/fbdev/efifb.c | 10 ++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
> index 46a4484..ea68d5c 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_bus_region region;
> + struct resource res;
>   int i;
>  
>   if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
> @@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
>   if (!base)
>   return;
>  
> + region.start = base;
> + region.end = base + size - 1;
> + res.start = 0;
> + res.flags = IORESOURCE_MEM;
> + pcibios_bus_to_resource(dev->bus, , );
> + if (res.start)
> + base = res.start;
> +
>   for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
>   struct resource *res = >resource[i];
>  
> -- 
> 2.7.4
> 

-- 
  Peter


Re: [PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Peter Jones
On Thu, May 17, 2018 at 09:22:23AM -0400, Sinan Kaya wrote:
> A host bridge is allowed to remap BAR addresses using _TRA attribute in
> _CRS windows.
> 
> pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
> (bus address [0x0010-0x1fff])
> pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]
> 
> 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 0x1e00
> efifb: framebuffer at 0x1e00, 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 

Looks reasonable to me - Ard, do you want to take this up through the
EFI tree?

Signed-off-by: Peter Jones 

> ---
>  drivers/video/fbdev/efifb.c | 10 ++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
> index 46a4484..ea68d5c 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_bus_region region;
> + struct resource res;
>   int i;
>  
>   if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
> @@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
>   if (!base)
>   return;
>  
> + region.start = base;
> + region.end = base + size - 1;
> + res.start = 0;
> + res.flags = IORESOURCE_MEM;
> + pcibios_bus_to_resource(dev->bus, , );
> + if (res.start)
> + base = res.start;
> +
>   for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
>   struct resource *res = >resource[i];
>  
> -- 
> 2.7.4
> 

-- 
  Peter


[PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Sinan Kaya
A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.

pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
 drivers/video/fbdev/efifb.c | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
index 46a4484..ea68d5c 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_bus_region region;
+   struct resource res;
int i;
 
if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
@@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
if (!base)
return;
 
+   region.start = base;
+   region.end = base + size - 1;
+   res.start = 0;
+   res.flags = IORESOURCE_MEM;
+   pcibios_bus_to_resource(dev->bus, , );
+   if (res.start)
+   base = res.start;
+
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
struct resource *res = >resource[i];
 
-- 
2.7.4



[PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Sinan Kaya
A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.

pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
 drivers/video/fbdev/efifb.c | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
index 46a4484..ea68d5c 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_bus_region region;
+   struct resource res;
int i;
 
if (efifb_pci_dev || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
@@ -439,6 +441,14 @@ static void efifb_fixup_resources(struct pci_dev *dev)
if (!base)
return;
 
+   region.start = base;
+   region.end = base + size - 1;
+   res.start = 0;
+   res.flags = IORESOURCE_MEM;
+   pcibios_bus_to_resource(dev->bus, , );
+   if (res.start)
+   base = res.start;
+
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
struct resource *res = >resource[i];
 
-- 
2.7.4



Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Sinan Kaya
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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Sinan Kaya
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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Robin Murphy

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 :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
  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, >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 = >resource[i];
  



Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-17 Thread Robin Murphy

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 :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
  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, >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 = >resource[i];
  



Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Sinan Kaya
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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Sinan Kaya
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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Timur Tabi

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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Timur Tabi

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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Sinan Kaya
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.


Re: [RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Sinan Kaya
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.


[RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Sinan Kaya
A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.

pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
 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, >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 = >resource[i];
 
-- 
2.7.4



[RFC PATCH] efi/fb: Convert PCI bus address to resource if translated by the bridge

2018-05-16 Thread Sinan Kaya
A host bridge is allowed to remap BAR addresses using _TRA attribute in
_CRS windows.

pci_bus :00: root bus resource [mem 0x8010010-0x8011fff window] 
(bus address [0x0010-0x1fff])
pci :02:00.0: reg 0x10: [mem 0x8011e00-0x8011eff]

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 0x1e00
efifb: framebuffer at 0x1e00, 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 
---
 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, >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 = >resource[i];
 
-- 
2.7.4