diff options
| author | Michael Neuling <mikey@neuling.org> | 2018-01-09 11:07:15 -0500 |
|---|---|---|
| committer | Michael Ellerman <mpe@ellerman.id.au> | 2018-01-10 05:27:15 -0500 |
| commit | 8989d56878a7735dfdb234707a2fee6faf631085 (patch) | |
| tree | 3cabbc56af3b5db1301910ba49ed16d9d06be485 | |
| parent | bc9c9304a45480797e13a8e1df96ffcf44fb62fe (diff) | |
powerpc/pseries: Query hypervisor for RFI flush settings
A new hypervisor call is available which tells the guest settings
related to the RFI flush. Use it to query the appropriate flush
instruction(s), and whether the flush is required.
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
| -rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index a8531e012658..ae4f596273b5 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
| @@ -459,6 +459,39 @@ static void __init find_and_init_phbs(void) | |||
| 459 | of_pci_check_probe_only(); | 459 | of_pci_check_probe_only(); |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | static void pseries_setup_rfi_flush(void) | ||
| 463 | { | ||
| 464 | struct h_cpu_char_result result; | ||
| 465 | enum l1d_flush_type types; | ||
| 466 | bool enable; | ||
| 467 | long rc; | ||
| 468 | |||
| 469 | /* Enable by default */ | ||
| 470 | enable = true; | ||
| 471 | |||
| 472 | rc = plpar_get_cpu_characteristics(&result); | ||
| 473 | if (rc == H_SUCCESS) { | ||
| 474 | types = L1D_FLUSH_NONE; | ||
| 475 | |||
| 476 | if (result.character & H_CPU_CHAR_L1D_FLUSH_TRIG2) | ||
| 477 | types |= L1D_FLUSH_MTTRIG; | ||
| 478 | if (result.character & H_CPU_CHAR_L1D_FLUSH_ORI30) | ||
| 479 | types |= L1D_FLUSH_ORI; | ||
| 480 | |||
| 481 | /* Use fallback if nothing set in hcall */ | ||
| 482 | if (types == L1D_FLUSH_NONE) | ||
| 483 | types = L1D_FLUSH_FALLBACK; | ||
| 484 | |||
| 485 | if (!(result.behaviour & H_CPU_BEHAV_L1D_FLUSH_PR)) | ||
| 486 | enable = false; | ||
| 487 | } else { | ||
| 488 | /* Default to fallback if case hcall is not available */ | ||
| 489 | types = L1D_FLUSH_FALLBACK; | ||
| 490 | } | ||
| 491 | |||
| 492 | setup_rfi_flush(types, enable); | ||
| 493 | } | ||
| 494 | |||
| 462 | static void __init pSeries_setup_arch(void) | 495 | static void __init pSeries_setup_arch(void) |
| 463 | { | 496 | { |
| 464 | set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT); | 497 | set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT); |
| @@ -476,6 +509,8 @@ static void __init pSeries_setup_arch(void) | |||
| 476 | 509 | ||
| 477 | fwnmi_init(); | 510 | fwnmi_init(); |
| 478 | 511 | ||
| 512 | pseries_setup_rfi_flush(); | ||
| 513 | |||
| 479 | /* By default, only probe PCI (can be overridden by rtas_pci) */ | 514 | /* By default, only probe PCI (can be overridden by rtas_pci) */ |
| 480 | pci_add_flags(PCI_PROBE_ONLY); | 515 | pci_add_flags(PCI_PROBE_ONLY); |
| 481 | 516 | ||
