| From 527a1d1ede98479bf90c31a64822107ac7e6d276 Mon Sep 17 00:00:00 2001 |
| From: Helge Deller <deller@gmx.de> |
| Date: Mon, 27 May 2019 21:20:00 +0200 |
| Subject: parisc: Fix crash due alternative coding for NP iopdir_fdc bit |
| |
| From: Helge Deller <deller@gmx.de> |
| |
| commit 527a1d1ede98479bf90c31a64822107ac7e6d276 upstream. |
| |
| According to the found documentation, data cache flushes and sync |
| instructions are needed on the PCX-U+ (PA8200, e.g. C200/C240) |
| platforms, while PCX-W (PA8500, e.g. C360) platforms aparently don't |
| need those flushes when changing the IO PDIR data structures. |
| |
| We have no documentation for PCX-W+ (PA8600) and PCX-W2 (PA8700) CPUs, |
| but Carlo Pisani reported that his C3600 machine (PA8600, PCX-W+) fails |
| when the fdc instructions were removed. His firmware didn't set the NIOP |
| bit, so one may assume it's a firmware bug since other C3750 machines |
| had the bit set. |
| |
| Even if documentation (as mentioned above) states that PCX-W (PA8500, |
| e.g. J5000) does not need fdc flushes, Sven could show that an Adaptec |
| 29320A PCI-X SCSI controller reliably failed on a dd command during the |
| first five minutes in his J5000 when fdc flushes were missing. |
| |
| Going forward, we will now NOT replace the fdc and sync assembler |
| instructions by NOPS if: |
| a) the NP iopdir_fdc bit was set by firmware, or |
| b) we find a CPU up to and including a PCX-W+ (PA8600). |
| |
| This fixes the HPMC crashes on a C240 and C36XX machines. For other |
| machines we rely on the firmware to set the bit when needed. |
| |
| In case one finds HPMC issues, people could try to boot their machines |
| with the "no-alternatives" kernel option to turn off any alternative |
| patching. |
| |
| Reported-by: Sven Schnelle <svens@stackframe.org> |
| Reported-by: Carlo Pisani <carlojpisani@gmail.com> |
| Tested-by: Sven Schnelle <svens@stackframe.org> |
| Fixes: 3847dab77421 ("parisc: Add alternative coding infrastructure") |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Cc: stable@vger.kernel.org # 5.0+ |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/parisc/kernel/alternative.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/parisc/kernel/alternative.c |
| +++ b/arch/parisc/kernel/alternative.c |
| @@ -56,7 +56,8 @@ void __init_or_module apply_alternatives |
| * time IO-PDIR is changed in Ike/Astro. |
| */ |
| if ((cond & ALT_COND_NO_IOC_FDC) && |
| - (boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC)) |
| + ((boot_cpu_data.cpu_type <= pcxw_) || |
| + (boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC))) |
| continue; |
| |
| /* Want to replace pdtlb by a pdtlb,l instruction? */ |