diff options
| author | David S. Miller <davem@davemloft.net> | 2012-09-06 19:01:25 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-09-06 19:01:25 -0700 | 
| commit | ce33fdc52ad50043eef07d11473bc51e225565bd (patch) | |
| tree | b2c9e53f3a8f269c7fc5a16e0ebdaf8cea48fdb1 /arch/sparc/kernel/mdesc.c | |
| parent | 4f93d21d2563353df813ee049f6489f340389aab (diff) | |
sparc64: Probe cpu page size support more portably.
On sun4v, interrogate the machine description.  This code is extremely
defensive in nature, and a lot of the checks can probably be removed.
On sun4u things are a lot simpler.  There are the page sizes all chips
support, and then Panther adds 32MB and 256MB pages.
Report the probed value in /proc/cpuinfo
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/mdesc.c')
| -rw-r--r-- | arch/sparc/kernel/mdesc.c | 24 | 
1 files changed, 24 insertions, 0 deletions
| diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index 6dc796280589..831c001604e8 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c @@ -817,6 +817,30 @@ void __cpuinit mdesc_populate_present_mask(cpumask_t *mask)  	mdesc_iterate_over_cpus(record_one_cpu, NULL, mask);  } +static void * __init check_one_pgsz(struct mdesc_handle *hp, u64 mp, int cpuid, void *arg) +{ +	const u64 *pgsz_prop = mdesc_get_property(hp, mp, "mmu-page-size-list", NULL); +	unsigned long *pgsz_mask = arg; +	u64 val; + +	val = (HV_PGSZ_MASK_8K | HV_PGSZ_MASK_64K | +	       HV_PGSZ_MASK_512K | HV_PGSZ_MASK_4MB); +	if (pgsz_prop) +		val = *pgsz_prop; + +	if (!*pgsz_mask) +		*pgsz_mask = val; +	else +		*pgsz_mask &= val; +	return NULL; +} + +void __init mdesc_get_page_sizes(cpumask_t *mask, unsigned long *pgsz_mask) +{ +	*pgsz_mask = 0; +	mdesc_iterate_over_cpus(check_one_pgsz, pgsz_mask, mask); +} +  static void * __cpuinit fill_in_one_cpu(struct mdesc_handle *hp, u64 mp, int cpuid, void *arg)  {  	const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL); | 
