Subject: Re: pci issue - wrong detection of pci ressources

From: Sergei Shtylyov <[email-masked]>
Date: Tue, 22 Apr 2008 17:31:07 +0400

Hello.

Christian Ehrhardt wrote:

>>>    Ah, that's what happens -- BAR0 in functions 0/1 takes up the 
>>> whole 265 MiB of the PCI memory space (128+128), so no place is left 
>>> for other memory BARs.

>>    What's interesting, the Sequoia/Rainier board user manual says that 
>> PCI memory is 0x80000000 thru 0xbfffffff (i.e. 1 GiB), while the Linux 
>> code seem to always have assumed only 0x[1]800000000 thru 
>> 0x[1]8fffffff...

> Thanks to all your help I saw that the detected spaces on boot are wrong 
> because of the dts file.

> PCI host bridge /plb/pci@1ec000000 (primary) ranges:
> MEM 0x0000000180000000..0x000000018fffffff -> 0x0000000080000000    => 256M
>  IO 0x00000001e8000000..0x00000001e80fffff -> 0x0000000000000000    => 1M

    Yeah, I/O space should be 64K according to what arch/ppc/ had (well, I'm 
looking at the out-of-tree source code :-).

> The Documentation of the 440EPx core lists these spaces:
> PCI 1 Memory     1 8000 0000     1 BFFF FFFF     1GB
> I/O              1 E800 0000     1 E800 FFFF     64KB
> I/O              1 E880 0000     1 EBFF FFFF     56MB

    Having 2 I/O spaces looks just wrong. Actually, PCs do well with only 64K 
of I/O space.

> I modified the dts file and now it shows this on boot which is what the 
> user manual lists as mem/io space:

> PCI host bridge /plb/pci@1ec000000 (primary) ranges:
> MEM 0x0000000180000000..0x00000001bfffffff -> 0x0000000080000000
>  IO 0x00000001e8000000..0x00000001e800ffff -> 0x0000000000000000
>  IO 0x00000001e8800000..0x00000001ebffffff -> 0x0000000000000000
> \--> Skipped (too many) !
> 4xx PCI DMA offset set to 0x00000000

> The detected sizes look good compared to the processor documentation.
> But I never modified a dts file before and I only found a ranges 
> documentation speaking of three elemnts in the ranges element.
> So feel free to correct the dts if I wrote something bad without knowing 
> it (e.g. that skipped message).

> The issue that let me start debugging this was the initialization of the 
> radeonfb driver and with that patch it works:
> radeonfb_pci_register BEGIN
> radeonfb (0000:00:0a.0): Cannot match card to OF node !
> aper_base: 80000000 MC_FB_LOC to: 87ff8000, MC_AGP_LOC to: ffff9000
> radeonfb (0000:00:0a.0): Found 131072k of DDR 64 bits wide videoram
> radeonfb (0000:00:0a.0): mapped 16384k videoram
> radeonfb: Found Intel x86 BIOS ROM Image
> radeonfb: Retrieved PLL infos from BIOS
> radeonfb: Reference=27.00 MHz (RefDiv=12) Memory=240.00 Mhz, 
> System=200.00 MHz
> radeonfb: PLL min 20000 max 40000
> 1 chips in connector info
> - chip 1 has 2 connectors
>  * connector 0 of type 2 (CRT) : 2300
>  * connector 1 of type 3 (DVI-I) : 3201
> Starting monitor auto detection...
> radeonfb: I2C (port 1) ... not found
> radeonfb: I2C (port 2) ... found TMDS panel
> radeonfb: I2C (port 3) ... found CRT display
> i2c-adapter i2c-3: unable to read EDID block.
> i2c-adapter i2c-3: unable to read EDID block.
> i2c-adapter i2c-3: unable to read EDID block.
> radeonfb: I2C (port 4) ... not found
> radeon_probe_OF_head
> radeonfb: I2C (port 2) ... found TMDS panel
> radeon_probe_OF_head
> radeonfb: I2C (port 3) ... found CRT display
> radeonfb: Monitor 1 type DFP found
> radeonfb: EDID probed
> radeonfb: Monitor 2 type CRT found
> radeonfb: EDID probed
> Parsing EDID data for panel info
> Setting up default mode based on panel info
> radeonfb (0000:00:0a.0): ATI Radeon Y`

    Hm, what's that Y`?

> radeonfb_pci_register END

> And btw. now we really need the change of the radeonfb.h to use the 
> correct resource_size_t type, otherwise it fails with:

    Of course.

> I attached the patch I used to get it working now for further discussion 
> e.g. because I don't really know dts syntax ;-)
> I hope both changes find their way into the kernel once you are all 
> agreeing with the new dts content.

> I still have issues with my X11, but thats another story.

> ------------------------------------------------------------------------
> 
> Subject: [PATCH][dts][radeonfb]: fix pci mem in dts and radeonfb resource variables

> From: Christian Ehrhardt <[email-masked]>

> This patch is fixing the sequoia.dts device tree file to the values defined
> in the 440Epx data sheet from amcc.
> That fixes an issue where my graphic card could not initialize because the pci
> resource space was not big enough.
> The related mail thread about the backgrounds of this has the subject "pci
> issue - wrong detection of pci ressources"
> After these values were fixed another modification that came up in the mail
> thread was needed to prevent an error. This change fixes the type of the
> resource vaiables in the radeon frame buffer driver (We might want to split
> that into two patches).

> Signed-off-by: Christian Ehrhardt <[email-masked]>

> diff --git a/arch/powerpc/boot/dts/sequoia.dts b/arch/powerpc/boot/dts/sequoia.dts
> --- a/arch/powerpc/boot/dts/sequoia.dts
> +++ b/arch/powerpc/boot/dts/sequoia.dts
> @@ -344,9 +344,14 @@
>  			/* Outbound ranges, one memory and one IO,
>  			 * later cannot be changed. Chip supports a second
>  			 * IO range but we don't use it for now
> +			 * From the 440EPx user manual:
> +			 * PCI 1 Memory     1 8000 0000     1 BFFF FFFF     1GB
> +			 * I/O              1 E800 0000     1 E800 FFFF     64KB
> +			 * I/O              1 E880 0000     1 EBFF FFFF     56MB
>  			 */
> -			ranges = <02000000 0 80000000 1 80000000 0 10000000
> -				01000000 0 00000000 1 e8000000 0 00100000>;
> +			ranges = <02000000 0 80000000 1 80000000 0 40000000
> +				01000000 0 00000000 1 e8000000 0 00010000
> +				01000000 0 00000000 1 e8800000 0 03800000>;

   I don't think 56 MiB of I/O space make sense, so might as well skip the 3rg 
range...

>  
>  			/* Inbound 2GB range starting at 0 */
>  			dma-ranges = <42000000 0 0 0 0 0 80000000>;
> diff --git a/drivers/video/aty/radeonfb.h b/drivers/video/aty/radeonfb.h
> --- a/drivers/video/aty/radeonfb.h
> +++ b/drivers/video/aty/radeonfb.h
> @@ -287,8 +287,8 @@ struct radeonfb_info {
>  
>  	char			name[DEVICE_NAME_SIZE];
>  
> -	unsigned long		mmio_base_phys;
> -	unsigned long		fb_base_phys;
> +	resource_size_t		mmio_base_phys;
> +	resource_size_t		fb_base_phys;
>  
>  	void __iomem		*mmio_base;
>  	void __iomem		*fb_base;

    I think you'd better use Ben's patch that he's just posted:

http://patchwork.ozlabs.org/linuxppc/patch?id=18034

WBR, Sergei