Merge tag 'pm-5.11-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / arch / powerpc / kernel / mce.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Machine check exception handling.
4  *
5  * Copyright 2013 IBM Corporation
6  * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
7  */
8
9 #undef DEBUG
10 #define pr_fmt(fmt) "mce: " fmt
11
12 #include <linux/hardirq.h>
13 #include <linux/types.h>
14 #include <linux/ptrace.h>
15 #include <linux/percpu.h>
16 #include <linux/export.h>
17 #include <linux/irq_work.h>
18 #include <linux/extable.h>
19 #include <linux/ftrace.h>
20
21 #include <asm/machdep.h>
22 #include <asm/mce.h>
23 #include <asm/nmi.h>
24
25 static DEFINE_PER_CPU(int, mce_nest_count);
26 static DEFINE_PER_CPU(struct machine_check_event[MAX_MC_EVT], mce_event);
27
28 /* Queue for delayed MCE events. */
29 static DEFINE_PER_CPU(int, mce_queue_count);
30 static DEFINE_PER_CPU(struct machine_check_event[MAX_MC_EVT], mce_event_queue);
31
32 /* Queue for delayed MCE UE events. */
33 static DEFINE_PER_CPU(int, mce_ue_count);
34 static DEFINE_PER_CPU(struct machine_check_event[MAX_MC_EVT],
35                                         mce_ue_event_queue);
36
37 static void machine_check_process_queued_event(struct irq_work *work);
38 static void machine_check_ue_irq_work(struct irq_work *work);
39 static void machine_check_ue_event(struct machine_check_event *evt);
40 static void machine_process_ue_event(struct work_struct *work);
41
42 static struct irq_work mce_event_process_work = {
43         .func = machine_check_process_queued_event,
44 };
45
46 static struct irq_work mce_ue_event_irq_work = {
47         .func = machine_check_ue_irq_work,
48 };
49
50 DECLARE_WORK(mce_ue_event_work, machine_process_ue_event);
51
52 static BLOCKING_NOTIFIER_HEAD(mce_notifier_list);
53
54 int mce_register_notifier(struct notifier_block *nb)
55 {
56         return blocking_notifier_chain_register(&mce_notifier_list, nb);
57 }
58 EXPORT_SYMBOL_GPL(mce_register_notifier);
59
60 int mce_unregister_notifier(struct notifier_block *nb)
61 {
62         return blocking_notifier_chain_unregister(&mce_notifier_list, nb);
63 }
64 EXPORT_SYMBOL_GPL(mce_unregister_notifier);
65
66 static void mce_set_error_info(struct machine_check_event *mce,
67                                struct mce_error_info *mce_err)
68 {
69         mce->error_type = mce_err->error_type;
70         switch (mce_err->error_type) {
71         case MCE_ERROR_TYPE_UE:
72                 mce->u.ue_error.ue_error_type = mce_err->u.ue_error_type;
73                 break;
74         case MCE_ERROR_TYPE_SLB:
75                 mce->u.slb_error.slb_error_type = mce_err->u.slb_error_type;
76                 break;
77         case MCE_ERROR_TYPE_ERAT:
78                 mce->u.erat_error.erat_error_type = mce_err->u.erat_error_type;
79                 break;
80         case MCE_ERROR_TYPE_TLB:
81                 mce->u.tlb_error.tlb_error_type = mce_err->u.tlb_error_type;
82                 break;
83         case MCE_ERROR_TYPE_USER:
84                 mce->u.user_error.user_error_type = mce_err->u.user_error_type;
85                 break;
86         case MCE_ERROR_TYPE_RA:
87                 mce->u.ra_error.ra_error_type = mce_err->u.ra_error_type;
88                 break;
89         case MCE_ERROR_TYPE_LINK:
90                 mce->u.link_error.link_error_type = mce_err->u.link_error_type;
91                 break;
92         case MCE_ERROR_TYPE_UNKNOWN:
93         default:
94                 break;
95         }
96 }
97
98 /*
99  * Decode and save high level MCE information into per cpu buffer which
100  * is an array of machine_check_event structure.
101  */
102 void save_mce_event(struct pt_regs *regs, long handled,
103                     struct mce_error_info *mce_err,
104                     uint64_t nip, uint64_t addr, uint64_t phys_addr)
105 {
106         int index = __this_cpu_inc_return(mce_nest_count) - 1;
107         struct machine_check_event *mce = this_cpu_ptr(&mce_event[index]);
108
109         /*
110          * Return if we don't have enough space to log mce event.
111          * mce_nest_count may go beyond MAX_MC_EVT but that's ok,
112          * the check below will stop buffer overrun.
113          */
114         if (index >= MAX_MC_EVT)
115                 return;
116
117         /* Populate generic machine check info */
118         mce->version = MCE_V1;
119         mce->srr0 = nip;
120         mce->srr1 = regs->msr;
121         mce->gpr3 = regs->gpr[3];
122         mce->in_use = 1;
123         mce->cpu = get_paca()->paca_index;
124
125         /* Mark it recovered if we have handled it and MSR(RI=1). */
126         if (handled && (regs->msr & MSR_RI))
127                 mce->disposition = MCE_DISPOSITION_RECOVERED;
128         else
129                 mce->disposition = MCE_DISPOSITION_NOT_RECOVERED;
130
131         mce->initiator = mce_err->initiator;
132         mce->severity = mce_err->severity;
133         mce->sync_error = mce_err->sync_error;
134         mce->error_class = mce_err->error_class;
135
136         /*
137          * Populate the mce error_type and type-specific error_type.
138          */
139         mce_set_error_info(mce, mce_err);
140
141         if (!addr)
142                 return;
143
144         if (mce->error_type == MCE_ERROR_TYPE_TLB) {
145                 mce->u.tlb_error.effective_address_provided = true;
146                 mce->u.tlb_error.effective_address = addr;
147         } else if (mce->error_type == MCE_ERROR_TYPE_SLB) {
148                 mce->u.slb_error.effective_address_provided = true;
149                 mce->u.slb_error.effective_address = addr;
150         } else if (mce->error_type == MCE_ERROR_TYPE_ERAT) {
151                 mce->u.erat_error.effective_address_provided = true;
152                 mce->u.erat_error.effective_address = addr;
153         } else if (mce->error_type == MCE_ERROR_TYPE_USER) {
154                 mce->u.user_error.effective_address_provided = true;
155                 mce->u.user_error.effective_address = addr;
156         } else if (mce->error_type == MCE_ERROR_TYPE_RA) {
157                 mce->u.ra_error.effective_address_provided = true;
158                 mce->u.ra_error.effective_address = addr;
159         } else if (mce->error_type == MCE_ERROR_TYPE_LINK) {
160                 mce->u.link_error.effective_address_provided = true;
161                 mce->u.link_error.effective_address = addr;
162         } else if (mce->error_type == MCE_ERROR_TYPE_UE) {
163                 mce->u.ue_error.effective_address_provided = true;
164                 mce->u.ue_error.effective_address = addr;
165                 if (phys_addr != ULONG_MAX) {
166                         mce->u.ue_error.physical_address_provided = true;
167                         mce->u.ue_error.physical_address = phys_addr;
168                         mce->u.ue_error.ignore_event = mce_err->ignore_event;
169                         machine_check_ue_event(mce);
170                 }
171         }
172         return;
173 }
174
175 /*
176  * get_mce_event:
177  *      mce     Pointer to machine_check_event structure to be filled.
178  *      release Flag to indicate whether to free the event slot or not.
179  *              0 <= do not release the mce event. Caller will invoke
180  *                   release_mce_event() once event has been consumed.
181  *              1 <= release the slot.
182  *
183  *      return  1 = success
184  *              0 = failure
185  *
186  * get_mce_event() will be called by platform specific machine check
187  * handle routine and in KVM.
188  * When we call get_mce_event(), we are still in interrupt context and
189  * preemption will not be scheduled until ret_from_expect() routine
190  * is called.
191  */
192 int get_mce_event(struct machine_check_event *mce, bool release)
193 {
194         int index = __this_cpu_read(mce_nest_count) - 1;
195         struct machine_check_event *mc_evt;
196         int ret = 0;
197
198         /* Sanity check */
199         if (index < 0)
200                 return ret;
201
202         /* Check if we have MCE info to process. */
203         if (index < MAX_MC_EVT) {
204                 mc_evt = this_cpu_ptr(&mce_event[index]);
205                 /* Copy the event structure and release the original */
206                 if (mce)
207                         *mce = *mc_evt;
208                 if (release)
209                         mc_evt->in_use = 0;
210                 ret = 1;
211         }
212         /* Decrement the count to free the slot. */
213         if (release)
214                 __this_cpu_dec(mce_nest_count);
215
216         return ret;
217 }
218
219 void release_mce_event(void)
220 {
221         get_mce_event(NULL, true);
222 }
223
224 static void machine_check_ue_irq_work(struct irq_work *work)
225 {
226         schedule_work(&mce_ue_event_work);
227 }
228
229 /*
230  * Queue up the MCE event which then can be handled later.
231  */
232 static void machine_check_ue_event(struct machine_check_event *evt)
233 {
234         int index;
235
236         index = __this_cpu_inc_return(mce_ue_count) - 1;
237         /* If queue is full, just return for now. */
238         if (index >= MAX_MC_EVT) {
239                 __this_cpu_dec(mce_ue_count);
240                 return;
241         }
242         memcpy(this_cpu_ptr(&mce_ue_event_queue[index]), evt, sizeof(*evt));
243
244         /* Queue work to process this event later. */
245         irq_work_queue(&mce_ue_event_irq_work);
246 }
247
248 /*
249  * Queue up the MCE event which then can be handled later.
250  */
251 void machine_check_queue_event(void)
252 {
253         int index;
254         struct machine_check_event evt;
255
256         if (!get_mce_event(&evt, MCE_EVENT_RELEASE))
257                 return;
258
259         index = __this_cpu_inc_return(mce_queue_count) - 1;
260         /* If queue is full, just return for now. */
261         if (index >= MAX_MC_EVT) {
262                 __this_cpu_dec(mce_queue_count);
263                 return;
264         }
265         memcpy(this_cpu_ptr(&mce_event_queue[index]), &evt, sizeof(evt));
266
267         /* Queue irq work to process this event later. */
268         irq_work_queue(&mce_event_process_work);
269 }
270
271 void mce_common_process_ue(struct pt_regs *regs,
272                            struct mce_error_info *mce_err)
273 {
274         const struct exception_table_entry *entry;
275
276         entry = search_kernel_exception_table(regs->nip);
277         if (entry) {
278                 mce_err->ignore_event = true;
279                 regs->nip = extable_fixup(entry);
280         }
281 }
282
283 /*
284  * process pending MCE event from the mce event queue. This function will be
285  * called during syscall exit.
286  */
287 static void machine_process_ue_event(struct work_struct *work)
288 {
289         int index;
290         struct machine_check_event *evt;
291
292         while (__this_cpu_read(mce_ue_count) > 0) {
293                 index = __this_cpu_read(mce_ue_count) - 1;
294                 evt = this_cpu_ptr(&mce_ue_event_queue[index]);
295                 blocking_notifier_call_chain(&mce_notifier_list, 0, evt);
296 #ifdef CONFIG_MEMORY_FAILURE
297                 /*
298                  * This should probably queued elsewhere, but
299                  * oh! well
300                  *
301                  * Don't report this machine check because the caller has a
302                  * asked us to ignore the event, it has a fixup handler which
303                  * will do the appropriate error handling and reporting.
304                  */
305                 if (evt->error_type == MCE_ERROR_TYPE_UE) {
306                         if (evt->u.ue_error.ignore_event) {
307                                 __this_cpu_dec(mce_ue_count);
308                                 continue;
309                         }
310
311                         if (evt->u.ue_error.physical_address_provided) {
312                                 unsigned long pfn;
313
314                                 pfn = evt->u.ue_error.physical_address >>
315                                         PAGE_SHIFT;
316                                 memory_failure(pfn, 0);
317                         } else
318                                 pr_warn("Failed to identify bad address from "
319                                         "where the uncorrectable error (UE) "
320                                         "was generated\n");
321                 }
322 #endif
323                 __this_cpu_dec(mce_ue_count);
324         }
325 }
326 /*
327  * process pending MCE event from the mce event queue. This function will be
328  * called during syscall exit.
329  */
330 static void machine_check_process_queued_event(struct irq_work *work)
331 {
332         int index;
333         struct machine_check_event *evt;
334
335         add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
336
337         /*
338          * For now just print it to console.
339          * TODO: log this error event to FSP or nvram.
340          */
341         while (__this_cpu_read(mce_queue_count) > 0) {
342                 index = __this_cpu_read(mce_queue_count) - 1;
343                 evt = this_cpu_ptr(&mce_event_queue[index]);
344
345                 if (evt->error_type == MCE_ERROR_TYPE_UE &&
346                     evt->u.ue_error.ignore_event) {
347                         __this_cpu_dec(mce_queue_count);
348                         continue;
349                 }
350                 machine_check_print_event_info(evt, false, false);
351                 __this_cpu_dec(mce_queue_count);
352         }
353 }
354
355 void machine_check_print_event_info(struct machine_check_event *evt,
356                                     bool user_mode, bool in_guest)
357 {
358         const char *level, *sevstr, *subtype, *err_type, *initiator;
359         uint64_t ea = 0, pa = 0;
360         int n = 0;
361         char dar_str[50];
362         char pa_str[50];
363         static const char *mc_ue_types[] = {
364                 "Indeterminate",
365                 "Instruction fetch",
366                 "Page table walk ifetch",
367                 "Load/Store",
368                 "Page table walk Load/Store",
369         };
370         static const char *mc_slb_types[] = {
371                 "Indeterminate",
372                 "Parity",
373                 "Multihit",
374         };
375         static const char *mc_erat_types[] = {
376                 "Indeterminate",
377                 "Parity",
378                 "Multihit",
379         };
380         static const char *mc_tlb_types[] = {
381                 "Indeterminate",
382                 "Parity",
383                 "Multihit",
384         };
385         static const char *mc_user_types[] = {
386                 "Indeterminate",
387                 "tlbie(l) invalid",
388                 "scv invalid",
389         };
390         static const char *mc_ra_types[] = {
391                 "Indeterminate",
392                 "Instruction fetch (bad)",
393                 "Instruction fetch (foreign)",
394                 "Page table walk ifetch (bad)",
395                 "Page table walk ifetch (foreign)",
396                 "Load (bad)",
397                 "Store (bad)",
398                 "Page table walk Load/Store (bad)",
399                 "Page table walk Load/Store (foreign)",
400                 "Load/Store (foreign)",
401         };
402         static const char *mc_link_types[] = {
403                 "Indeterminate",
404                 "Instruction fetch (timeout)",
405                 "Page table walk ifetch (timeout)",
406                 "Load (timeout)",
407                 "Store (timeout)",
408                 "Page table walk Load/Store (timeout)",
409         };
410         static const char *mc_error_class[] = {
411                 "Unknown",
412                 "Hardware error",
413                 "Probable Hardware error (some chance of software cause)",
414                 "Software error",
415                 "Probable Software error (some chance of hardware cause)",
416         };
417
418         /* Print things out */
419         if (evt->version != MCE_V1) {
420                 pr_err("Machine Check Exception, Unknown event version %d !\n",
421                        evt->version);
422                 return;
423         }
424         switch (evt->severity) {
425         case MCE_SEV_NO_ERROR:
426                 level = KERN_INFO;
427                 sevstr = "Harmless";
428                 break;
429         case MCE_SEV_WARNING:
430                 level = KERN_WARNING;
431                 sevstr = "Warning";
432                 break;
433         case MCE_SEV_SEVERE:
434                 level = KERN_ERR;
435                 sevstr = "Severe";
436                 break;
437         case MCE_SEV_FATAL:
438         default:
439                 level = KERN_ERR;
440                 sevstr = "Fatal";
441                 break;
442         }
443
444         switch(evt->initiator) {
445         case MCE_INITIATOR_CPU:
446                 initiator = "CPU";
447                 break;
448         case MCE_INITIATOR_PCI:
449                 initiator = "PCI";
450                 break;
451         case MCE_INITIATOR_ISA:
452                 initiator = "ISA";
453                 break;
454         case MCE_INITIATOR_MEMORY:
455                 initiator = "Memory";
456                 break;
457         case MCE_INITIATOR_POWERMGM:
458                 initiator = "Power Management";
459                 break;
460         case MCE_INITIATOR_UNKNOWN:
461         default:
462                 initiator = "Unknown";
463                 break;
464         }
465
466         switch (evt->error_type) {
467         case MCE_ERROR_TYPE_UE:
468                 err_type = "UE";
469                 subtype = evt->u.ue_error.ue_error_type <
470                         ARRAY_SIZE(mc_ue_types) ?
471                         mc_ue_types[evt->u.ue_error.ue_error_type]
472                         : "Unknown";
473                 if (evt->u.ue_error.effective_address_provided)
474                         ea = evt->u.ue_error.effective_address;
475                 if (evt->u.ue_error.physical_address_provided)
476                         pa = evt->u.ue_error.physical_address;
477                 break;
478         case MCE_ERROR_TYPE_SLB:
479                 err_type = "SLB";
480                 subtype = evt->u.slb_error.slb_error_type <
481                         ARRAY_SIZE(mc_slb_types) ?
482                         mc_slb_types[evt->u.slb_error.slb_error_type]
483                         : "Unknown";
484                 if (evt->u.slb_error.effective_address_provided)
485                         ea = evt->u.slb_error.effective_address;
486                 break;
487         case MCE_ERROR_TYPE_ERAT:
488                 err_type = "ERAT";
489                 subtype = evt->u.erat_error.erat_error_type <
490                         ARRAY_SIZE(mc_erat_types) ?
491                         mc_erat_types[evt->u.erat_error.erat_error_type]
492                         : "Unknown";
493                 if (evt->u.erat_error.effective_address_provided)
494                         ea = evt->u.erat_error.effective_address;
495                 break;
496         case MCE_ERROR_TYPE_TLB:
497                 err_type = "TLB";
498                 subtype = evt->u.tlb_error.tlb_error_type <
499                         ARRAY_SIZE(mc_tlb_types) ?
500                         mc_tlb_types[evt->u.tlb_error.tlb_error_type]
501                         : "Unknown";
502                 if (evt->u.tlb_error.effective_address_provided)
503                         ea = evt->u.tlb_error.effective_address;
504                 break;
505         case MCE_ERROR_TYPE_USER:
506                 err_type = "User";
507                 subtype = evt->u.user_error.user_error_type <
508                         ARRAY_SIZE(mc_user_types) ?
509                         mc_user_types[evt->u.user_error.user_error_type]
510                         : "Unknown";
511                 if (evt->u.user_error.effective_address_provided)
512                         ea = evt->u.user_error.effective_address;
513                 break;
514         case MCE_ERROR_TYPE_RA:
515                 err_type = "Real address";
516                 subtype = evt->u.ra_error.ra_error_type <
517                         ARRAY_SIZE(mc_ra_types) ?
518                         mc_ra_types[evt->u.ra_error.ra_error_type]
519                         : "Unknown";
520                 if (evt->u.ra_error.effective_address_provided)
521                         ea = evt->u.ra_error.effective_address;
522                 break;
523         case MCE_ERROR_TYPE_LINK:
524                 err_type = "Link";
525                 subtype = evt->u.link_error.link_error_type <
526                         ARRAY_SIZE(mc_link_types) ?
527                         mc_link_types[evt->u.link_error.link_error_type]
528                         : "Unknown";
529                 if (evt->u.link_error.effective_address_provided)
530                         ea = evt->u.link_error.effective_address;
531                 break;
532         case MCE_ERROR_TYPE_DCACHE:
533                 err_type = "D-Cache";
534                 subtype = "Unknown";
535                 break;
536         case MCE_ERROR_TYPE_ICACHE:
537                 err_type = "I-Cache";
538                 subtype = "Unknown";
539                 break;
540         default:
541         case MCE_ERROR_TYPE_UNKNOWN:
542                 err_type = "Unknown";
543                 subtype = "";
544                 break;
545         }
546
547         dar_str[0] = pa_str[0] = '\0';
548         if (ea && evt->srr0 != ea) {
549                 /* Load/Store address */
550                 n = sprintf(dar_str, "DAR: %016llx ", ea);
551                 if (pa)
552                         sprintf(dar_str + n, "paddr: %016llx ", pa);
553         } else if (pa) {
554                 sprintf(pa_str, " paddr: %016llx", pa);
555         }
556
557         printk("%sMCE: CPU%d: machine check (%s) %s %s %s %s[%s]\n",
558                 level, evt->cpu, sevstr, in_guest ? "Guest" : "",
559                 err_type, subtype, dar_str,
560                 evt->disposition == MCE_DISPOSITION_RECOVERED ?
561                 "Recovered" : "Not recovered");
562
563         if (in_guest || user_mode) {
564                 printk("%sMCE: CPU%d: PID: %d Comm: %s %sNIP: [%016llx]%s\n",
565                         level, evt->cpu, current->pid, current->comm,
566                         in_guest ? "Guest " : "", evt->srr0, pa_str);
567         } else {
568                 printk("%sMCE: CPU%d: NIP: [%016llx] %pS%s\n",
569                         level, evt->cpu, evt->srr0, (void *)evt->srr0, pa_str);
570         }
571
572         printk("%sMCE: CPU%d: Initiator %s\n", level, evt->cpu, initiator);
573
574         subtype = evt->error_class < ARRAY_SIZE(mc_error_class) ?
575                 mc_error_class[evt->error_class] : "Unknown";
576         printk("%sMCE: CPU%d: %s\n", level, evt->cpu, subtype);
577
578 #ifdef CONFIG_PPC_BOOK3S_64
579         /* Display faulty slb contents for SLB errors. */
580         if (evt->error_type == MCE_ERROR_TYPE_SLB && !in_guest)
581                 slb_dump_contents(local_paca->mce_faulty_slbs);
582 #endif
583 }
584 EXPORT_SYMBOL_GPL(machine_check_print_event_info);
585
586 /*
587  * This function is called in real mode. Strictly no printk's please.
588  *
589  * regs->nip and regs->msr contains srr0 and ssr1.
590  */
591 long notrace machine_check_early(struct pt_regs *regs)
592 {
593         long handled = 0;
594         u8 ftrace_enabled = this_cpu_get_ftrace_enabled();
595
596         this_cpu_set_ftrace_enabled(0);
597         /* Do not use nmi_enter/exit for pseries hpte guest */
598         if (radix_enabled() || !firmware_has_feature(FW_FEATURE_LPAR))
599                 nmi_enter();
600
601         hv_nmi_check_nonrecoverable(regs);
602
603         /*
604          * See if platform is capable of handling machine check.
605          */
606         if (ppc_md.machine_check_early)
607                 handled = ppc_md.machine_check_early(regs);
608
609         if (radix_enabled() || !firmware_has_feature(FW_FEATURE_LPAR))
610                 nmi_exit();
611
612         this_cpu_set_ftrace_enabled(ftrace_enabled);
613
614         return handled;
615 }
616
617 /* Possible meanings for HMER_DEBUG_TRIG bit being set on POWER9 */
618 static enum {
619         DTRIG_UNKNOWN,
620         DTRIG_VECTOR_CI,        /* need to emulate vector CI load instr */
621         DTRIG_SUSPEND_ESCAPE,   /* need to escape from TM suspend mode */
622 } hmer_debug_trig_function;
623
624 static int init_debug_trig_function(void)
625 {
626         int pvr;
627         struct device_node *cpun;
628         struct property *prop = NULL;
629         const char *str;
630
631         /* First look in the device tree */
632         preempt_disable();
633         cpun = of_get_cpu_node(smp_processor_id(), NULL);
634         if (cpun) {
635                 of_property_for_each_string(cpun, "ibm,hmi-special-triggers",
636                                             prop, str) {
637                         if (strcmp(str, "bit17-vector-ci-load") == 0)
638                                 hmer_debug_trig_function = DTRIG_VECTOR_CI;
639                         else if (strcmp(str, "bit17-tm-suspend-escape") == 0)
640                                 hmer_debug_trig_function = DTRIG_SUSPEND_ESCAPE;
641                 }
642                 of_node_put(cpun);
643         }
644         preempt_enable();
645
646         /* If we found the property, don't look at PVR */
647         if (prop)
648                 goto out;
649
650         pvr = mfspr(SPRN_PVR);
651         /* Check for POWER9 Nimbus (scale-out) */
652         if ((PVR_VER(pvr) == PVR_POWER9) && (pvr & 0xe000) == 0) {
653                 /* DD2.2 and later */
654                 if ((pvr & 0xfff) >= 0x202)
655                         hmer_debug_trig_function = DTRIG_SUSPEND_ESCAPE;
656                 /* DD2.0 and DD2.1 - used for vector CI load emulation */
657                 else if ((pvr & 0xfff) >= 0x200)
658                         hmer_debug_trig_function = DTRIG_VECTOR_CI;
659         }
660
661  out:
662         switch (hmer_debug_trig_function) {
663         case DTRIG_VECTOR_CI:
664                 pr_debug("HMI debug trigger used for vector CI load\n");
665                 break;
666         case DTRIG_SUSPEND_ESCAPE:
667                 pr_debug("HMI debug trigger used for TM suspend escape\n");
668                 break;
669         default:
670                 break;
671         }
672         return 0;
673 }
674 __initcall(init_debug_trig_function);
675
676 /*
677  * Handle HMIs that occur as a result of a debug trigger.
678  * Return values:
679  * -1 means this is not a HMI cause that we know about
680  *  0 means no further handling is required
681  *  1 means further handling is required
682  */
683 long hmi_handle_debugtrig(struct pt_regs *regs)
684 {
685         unsigned long hmer = mfspr(SPRN_HMER);
686         long ret = 0;
687
688         /* HMER_DEBUG_TRIG bit is used for various workarounds on P9 */
689         if (!((hmer & HMER_DEBUG_TRIG)
690               && hmer_debug_trig_function != DTRIG_UNKNOWN))
691                 return -1;
692                 
693         hmer &= ~HMER_DEBUG_TRIG;
694         /* HMER is a write-AND register */
695         mtspr(SPRN_HMER, ~HMER_DEBUG_TRIG);
696
697         switch (hmer_debug_trig_function) {
698         case DTRIG_VECTOR_CI:
699                 /*
700                  * Now to avoid problems with soft-disable we
701                  * only do the emulation if we are coming from
702                  * host user space
703                  */
704                 if (regs && user_mode(regs))
705                         ret = local_paca->hmi_p9_special_emu = 1;
706
707                 break;
708
709         default:
710                 break;
711         }
712
713         /*
714          * See if any other HMI causes remain to be handled
715          */
716         if (hmer & mfspr(SPRN_HMEER))
717                 return -1;
718
719         return ret;
720 }
721
722 /*
723  * Return values:
724  */
725 long hmi_exception_realmode(struct pt_regs *regs)
726 {       
727         int ret;
728
729         local_paca->hmi_irqs++;
730
731         ret = hmi_handle_debugtrig(regs);
732         if (ret >= 0)
733                 return ret;
734
735         wait_for_subcore_guest_exit();
736
737         if (ppc_md.hmi_exception_early)
738                 ppc_md.hmi_exception_early(regs);
739
740         wait_for_tb_resync();
741
742         return 1;
743 }