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 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; |
