diff options
Diffstat (limited to 'arch/sparc/kernel/setup_64.c')
| -rw-r--r-- | arch/sparc/kernel/setup_64.c | 67 | 
1 files changed, 55 insertions, 12 deletions
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 1414d16712b..0800e71d8a8 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c @@ -340,7 +340,12 @@ static const char *hwcaps[] = {  	 */  	"mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2",  	"ASIBlkInit", "fmaf", "vis3", "hpc", "random", "trans", "fjfmau", -	"ima", "cspare", +	"ima", "cspare", "pause", "cbcond", +}; + +static const char *crypto_hwcaps[] = { +	"aes", "des", "kasumi", "camellia", "md5", "sha1", "sha256", +	"sha512", "mpmul", "montmul", "montsqr", "crc32c",  };  void cpucap_info(struct seq_file *m) @@ -357,27 +362,61 @@ void cpucap_info(struct seq_file *m)  			printed++;  		}  	} +	if (caps & HWCAP_SPARC_CRYPTO) { +		unsigned long cfr; + +		__asm__ __volatile__("rd %%asr26, %0" : "=r" (cfr)); +		for (i = 0; i < ARRAY_SIZE(crypto_hwcaps); i++) { +			unsigned long bit = 1UL << i; +			if (cfr & bit) { +				seq_printf(m, "%s%s", +					   printed ? "," : "", crypto_hwcaps[i]); +				printed++; +			} +		} +	}  	seq_putc(m, '\n');  } +static void __init report_one_hwcap(int *printed, const char *name) +{ +	if ((*printed) == 0) +		printk(KERN_INFO "CPU CAPS: ["); +	printk(KERN_CONT "%s%s", +	       (*printed) ? "," : "", name); +	if (++(*printed) == 8) { +		printk(KERN_CONT "]\n"); +		*printed = 0; +	} +} + +static void __init report_crypto_hwcaps(int *printed) +{ +	unsigned long cfr; +	int i; + +	__asm__ __volatile__("rd %%asr26, %0" : "=r" (cfr)); + +	for (i = 0; i < ARRAY_SIZE(crypto_hwcaps); i++) { +		unsigned long bit = 1UL << i; +		if (cfr & bit) +			report_one_hwcap(printed, crypto_hwcaps[i]); +	} +} +  static void __init report_hwcaps(unsigned long caps)  {  	int i, printed = 0; -	printk(KERN_INFO "CPU CAPS: [");  	for (i = 0; i < ARRAY_SIZE(hwcaps); i++) {  		unsigned long bit = 1UL << i; -		if (caps & bit) { -			printk(KERN_CONT "%s%s", -			       printed ? "," : "", hwcaps[i]); -			if (++printed == 8) { -				printk(KERN_CONT "]\n"); -				printk(KERN_INFO "CPU CAPS: ["); -				printed = 0; -			} -		} +		if (caps & bit) +			report_one_hwcap(&printed, hwcaps[i]);  	} -	printk(KERN_CONT "]\n"); +	if (caps & HWCAP_SPARC_CRYPTO) +		report_crypto_hwcaps(&printed); +	if (printed != 0) +		printk(KERN_CONT "]\n");  }  static unsigned long __init mdesc_cpu_hwcap_list(void) @@ -411,6 +450,10 @@ static unsigned long __init mdesc_cpu_hwcap_list(void)  				break;  			}  		} +		for (i = 0; i < ARRAY_SIZE(crypto_hwcaps); i++) { +			if (!strcmp(prop, crypto_hwcaps[i])) +				caps |= HWCAP_SPARC_CRYPTO; +		}  		plen = strlen(prop) + 1;  		prop += plen;  |