diff options
-rw-r--r-- | arch/sparc/include/asm/elf_64.h | 9 | ||||
-rw-r--r-- | arch/sparc/include/asm/pstate.h | 14 | ||||
-rw-r--r-- | arch/sparc/kernel/setup_64.c | 67 |
3 files changed, 78 insertions, 12 deletions
diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h index 7df8b7f544d4..370ca1e71ffb 100644 --- a/arch/sparc/include/asm/elf_64.h +++ b/arch/sparc/include/asm/elf_64.h | |||
@@ -86,6 +86,15 @@ | |||
86 | #define AV_SPARC_IMA 0x00400000 /* integer multiply-add */ | 86 | #define AV_SPARC_IMA 0x00400000 /* integer multiply-add */ |
87 | #define AV_SPARC_ASI_CACHE_SPARING \ | 87 | #define AV_SPARC_ASI_CACHE_SPARING \ |
88 | 0x00800000 /* cache sparing ASIs available */ | 88 | 0x00800000 /* cache sparing ASIs available */ |
89 | #define AV_SPARC_PAUSE 0x01000000 /* PAUSE available */ | ||
90 | #define AV_SPARC_CBCOND 0x02000000 /* CBCOND insns available */ | ||
91 | |||
92 | /* Solaris decided to enumerate every single crypto instruction type | ||
93 | * in the AT_HWCAP bits. This is wasteful, since if crypto is present, | ||
94 | * you still need to look in the CFR register to see if the opcode is | ||
95 | * really available. So we simply advertise only "crypto" support. | ||
96 | */ | ||
97 | #define HWCAP_SPARC_CRYPTO 0x04000000 /* CRYPTO insns available */ | ||
89 | 98 | ||
90 | #define CORE_DUMP_USE_REGSET | 99 | #define CORE_DUMP_USE_REGSET |
91 | 100 | ||
diff --git a/arch/sparc/include/asm/pstate.h b/arch/sparc/include/asm/pstate.h index a26a53777bb0..6dfa8f8c9749 100644 --- a/arch/sparc/include/asm/pstate.h +++ b/arch/sparc/include/asm/pstate.h | |||
@@ -88,4 +88,18 @@ | |||
88 | #define VERS_MAXTL _AC(0x000000000000ff00,UL) /* Max Trap Level. */ | 88 | #define VERS_MAXTL _AC(0x000000000000ff00,UL) /* Max Trap Level. */ |
89 | #define VERS_MAXWIN _AC(0x000000000000001f,UL) /* Max RegWindow Idx.*/ | 89 | #define VERS_MAXWIN _AC(0x000000000000001f,UL) /* Max RegWindow Idx.*/ |
90 | 90 | ||
91 | /* Compatability Feature Register (%asr26), SPARC-T4 and later */ | ||
92 | #define CFR_AES _AC(0x0000000000000001,UL) /* Supports AES opcodes */ | ||
93 | #define CFR_DES _AC(0x0000000000000002,UL) /* Supports DES opcodes */ | ||
94 | #define CFR_KASUMI _AC(0x0000000000000004,UL) /* Supports KASUMI opcodes */ | ||
95 | #define CFR_CAMELIA _AC(0x0000000000000008,UL) /* Supports CAMELIA opcodes */ | ||
96 | #define CFR_MD5 _AC(0x0000000000000010,UL) /* Supports MD5 opcodes */ | ||
97 | #define CFR_SHA1 _AC(0x0000000000000020,UL) /* Supports SHA1 opcodes */ | ||
98 | #define CFR_SHA256 _AC(0x0000000000000040,UL) /* Supports SHA256 opcodes */ | ||
99 | #define CFR_SHA512 _AC(0x0000000000000080,UL) /* Supports SHA512 opcodes */ | ||
100 | #define CFR_MPMUL _AC(0x0000000000000100,UL) /* Supports MPMUL opcodes */ | ||
101 | #define CFR_MONTMUL _AC(0x0000000000000200,UL) /* Supports MONTMUL opcodes */ | ||
102 | #define CFR_MONTSQR _AC(0x0000000000000400,UL) /* Supports MONTSQR opcodes */ | ||
103 | #define CFR_CRC32C _AC(0x0000000000000800,UL) /* Supports CRC32C opcodes */ | ||
104 | |||
91 | #endif /* !(_SPARC64_PSTATE_H) */ | 105 | #endif /* !(_SPARC64_PSTATE_H) */ |
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 1414d16712b2..0800e71d8a88 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c | |||
@@ -340,7 +340,12 @@ static const char *hwcaps[] = { | |||
340 | */ | 340 | */ |
341 | "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2", | 341 | "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2", |
342 | "ASIBlkInit", "fmaf", "vis3", "hpc", "random", "trans", "fjfmau", | 342 | "ASIBlkInit", "fmaf", "vis3", "hpc", "random", "trans", "fjfmau", |
343 | "ima", "cspare", | 343 | "ima", "cspare", "pause", "cbcond", |
344 | }; | ||
345 | |||
346 | static const char *crypto_hwcaps[] = { | ||
347 | "aes", "des", "kasumi", "camellia", "md5", "sha1", "sha256", | ||
348 | "sha512", "mpmul", "montmul", "montsqr", "crc32c", | ||
344 | }; | 349 | }; |
345 | 350 | ||
346 | void cpucap_info(struct seq_file *m) | 351 | void cpucap_info(struct seq_file *m) |
@@ -357,27 +362,61 @@ void cpucap_info(struct seq_file *m) | |||
357 | printed++; | 362 | printed++; |
358 | } | 363 | } |
359 | } | 364 | } |
365 | if (caps & HWCAP_SPARC_CRYPTO) { | ||
366 | unsigned long cfr; | ||
367 | |||
368 | __asm__ __volatile__("rd %%asr26, %0" : "=r" (cfr)); | ||
369 | for (i = 0; i < ARRAY_SIZE(crypto_hwcaps); i++) { | ||
370 | unsigned long bit = 1UL << i; | ||
371 | if (cfr & bit) { | ||
372 | seq_printf(m, "%s%s", | ||
373 | printed ? "," : "", crypto_hwcaps[i]); | ||
374 | printed++; | ||
375 | } | ||
376 | } | ||
377 | } | ||
360 | seq_putc(m, '\n'); | 378 | seq_putc(m, '\n'); |
361 | } | 379 | } |
362 | 380 | ||
381 | static void __init report_one_hwcap(int *printed, const char *name) | ||
382 | { | ||
383 | if ((*printed) == 0) | ||
384 | printk(KERN_INFO "CPU CAPS: ["); | ||
385 | printk(KERN_CONT "%s%s", | ||
386 | (*printed) ? "," : "", name); | ||
387 | if (++(*printed) == 8) { | ||
388 | printk(KERN_CONT "]\n"); | ||
389 | *printed = 0; | ||
390 | } | ||
391 | } | ||
392 | |||
393 | static void __init report_crypto_hwcaps(int *printed) | ||
394 | { | ||
395 | unsigned long cfr; | ||
396 | int i; | ||
397 | |||
398 | __asm__ __volatile__("rd %%asr26, %0" : "=r" (cfr)); | ||
399 | |||
400 | for (i = 0; i < ARRAY_SIZE(crypto_hwcaps); i++) { | ||
401 | unsigned long bit = 1UL << i; | ||
402 | if (cfr & bit) | ||
403 | report_one_hwcap(printed, crypto_hwcaps[i]); | ||
404 | } | ||
405 | } | ||
406 | |||
363 | static void __init report_hwcaps(unsigned long caps) | 407 | static void __init report_hwcaps(unsigned long caps) |
364 | { | 408 | { |
365 | int i, printed = 0; | 409 | int i, printed = 0; |
366 | 410 | ||
367 | printk(KERN_INFO "CPU CAPS: ["); | ||
368 | for (i = 0; i < ARRAY_SIZE(hwcaps); i++) { | 411 | for (i = 0; i < ARRAY_SIZE(hwcaps); i++) { |
369 | unsigned long bit = 1UL << i; | 412 | unsigned long bit = 1UL << i; |
370 | if (caps & bit) { | 413 | if (caps & bit) |
371 | printk(KERN_CONT "%s%s", | 414 | report_one_hwcap(&printed, hwcaps[i]); |
372 | printed ? "," : "", hwcaps[i]); | ||
373 | if (++printed == 8) { | ||
374 | printk(KERN_CONT "]\n"); | ||
375 | printk(KERN_INFO "CPU CAPS: ["); | ||
376 | printed = 0; | ||
377 | } | ||
378 | } | ||
379 | } | 415 | } |
380 | printk(KERN_CONT "]\n"); | 416 | if (caps & HWCAP_SPARC_CRYPTO) |
417 | report_crypto_hwcaps(&printed); | ||
418 | if (printed != 0) | ||
419 | printk(KERN_CONT "]\n"); | ||
381 | } | 420 | } |
382 | 421 | ||
383 | static unsigned long __init mdesc_cpu_hwcap_list(void) | 422 | static unsigned long __init mdesc_cpu_hwcap_list(void) |
@@ -411,6 +450,10 @@ static unsigned long __init mdesc_cpu_hwcap_list(void) | |||
411 | break; | 450 | break; |
412 | } | 451 | } |
413 | } | 452 | } |
453 | for (i = 0; i < ARRAY_SIZE(crypto_hwcaps); i++) { | ||
454 | if (!strcmp(prop, crypto_hwcaps[i])) | ||
455 | caps |= HWCAP_SPARC_CRYPTO; | ||
456 | } | ||
414 | 457 | ||
415 | plen = strlen(prop) + 1; | 458 | plen = strlen(prop) + 1; |
416 | prop += plen; | 459 | prop += plen; |