[PATCH] edac: mpc85xx: add support for mpc83xx memory controller

Kumar Gala galak at kernel.crashing.org
Fri Jul 10 03:58:53 EST 2009


> Hello Kumar,
>
> I must not understand something going on here. Your proposed code
> doesn't work at all on my board. The
> /sys/devices/system/edac/mc/mc0/size_mb doesn't come out correctly.

What does it come out as?  How much memory do you have in the system?

> The attached patch DOES work on my board, but I'm confident that it  
> does
> NOT work on a system with PAGE_SIZE != 4096. Any idea what I did  
> wrong?
>
> If I'm reading things correctly:
> csrow->first_page	full address of the first page (NOT pfn)
> csrow->last_page	full address of the last  page (NOT pfn)
> csrow->nr_pages		number of pages
>
> The EDAC subsystem does csrow->nr_pages * PAGE_SIZE to get the size_mb
> sysfs value.
>
> If csrow->first_page and csrow->last_page ARE supposed to be the pfn,
> then I think the original code got it wrong, and the calculation for
> csrow->nr_pages needs to be changed.
>
> Thanks,
> Ira

[snip]

> /************************ MC SYSFS parts  
> ***********************************/
>
> @@ -790,18 +792,19 @@ static void __devinit  
> mpc85xx_init_csrows(struct mem_ctl_info *mci)
> 		csrow = &mci->csrows[index];
> 		cs_bnds = in_be32(pdata->mc_vbase + MPC85XX_MC_CS_BNDS_0 +
> 				  (index * MPC85XX_MC_CS_BNDS_OFS));
> -		start = (cs_bnds & 0xfff0000) << 4;
> -		end = ((cs_bnds & 0xfff) << 20);
> -		if (start)
> -			start |= 0xfffff;
> -		if (end)
> -			end |= 0xfffff;

can you printk what cs_bnds values are in your setup.

> +
> +		start = (cs_bnds & 0xffff0000) >> 16;
> +		end   = (cs_bnds & 0x0000ffff);
>
> 		if (start == end)
> 			continue;	/* not populated */
>
> -		csrow->first_page = start >> PAGE_SHIFT;
> -		csrow->last_page = end >> PAGE_SHIFT;
> +		start <<= PAGE_SHIFT;
> +		end   <<= PAGE_SHIFT;
> +		end    |= (1 << PAGE_SHIFT) - 1;
> +
> +		csrow->first_page = start;
> +		csrow->last_page = end;

This seems odd to me... I can't believe this is working out properly.

>
> 		csrow->nr_pages = csrow->last_page + 1 - csrow->first_page;
> 		csrow->grain = 8;
> 		csrow->mtype = mtype;
>

Lets get some real values on the table for your system so I can get a  
sense of what's really going on.

- k



More information about the Linuxppc-dev mailing list