|
@@ -1198,3 +1198,129 @@ ia64_pal_halt_light (void)
|
|
|
*/
|
|
|
static inline s64
|
|
|
ia64_pal_mc_clear_log (u64 *pending_vector)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_CLEAR_LOG, 0, 0, 0);
|
|
|
+ if (pending_vector)
|
|
|
+ *pending_vector = iprv.v0;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Ensure that all outstanding transactions in a processor are completed or that any
|
|
|
+ * MCA due to thes outstanding transaction is taken.
|
|
|
+ */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_drain (void)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_DRAIN, 0, 0, 0);
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Return the machine check dynamic processor state */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_dynamic_state (u64 info_type, u64 dy_buffer, u64 *size)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_DYNAMIC_STATE, info_type, dy_buffer, 0);
|
|
|
+ if (size)
|
|
|
+ *size = iprv.v0;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Return processor machine check information */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_error_info (u64 info_index, u64 type_index, u64 *size, u64 *error_info)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_ERROR_INFO, info_index, type_index, 0);
|
|
|
+ if (size)
|
|
|
+ *size = iprv.v0;
|
|
|
+ if (error_info)
|
|
|
+ *error_info = iprv.v1;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Injects the requested processor error or returns info on
|
|
|
+ * supported injection capabilities for current processor implementation
|
|
|
+ */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_error_inject_phys (u64 err_type_info, u64 err_struct_info,
|
|
|
+ u64 err_data_buffer, u64 *capabilities, u64 *resources)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL_PHYS_STK(iprv, PAL_MC_ERROR_INJECT, err_type_info,
|
|
|
+ err_struct_info, err_data_buffer);
|
|
|
+ if (capabilities)
|
|
|
+ *capabilities= iprv.v0;
|
|
|
+ if (resources)
|
|
|
+ *resources= iprv.v1;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_error_inject_virt (u64 err_type_info, u64 err_struct_info,
|
|
|
+ u64 err_data_buffer, u64 *capabilities, u64 *resources)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL_STK(iprv, PAL_MC_ERROR_INJECT, err_type_info,
|
|
|
+ err_struct_info, err_data_buffer);
|
|
|
+ if (capabilities)
|
|
|
+ *capabilities= iprv.v0;
|
|
|
+ if (resources)
|
|
|
+ *resources= iprv.v1;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Inform PALE_CHECK whether a machine check is expected so that PALE_CHECK willnot
|
|
|
+ * attempt to correct any expected machine checks.
|
|
|
+ */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_expected (u64 expected, u64 *previous)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_EXPECTED, expected, 0, 0);
|
|
|
+ if (previous)
|
|
|
+ *previous = iprv.v0;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+typedef union pal_hw_tracking_u {
|
|
|
+ u64 pht_data;
|
|
|
+ struct {
|
|
|
+ u64 itc :4, /* Instruction cache tracking */
|
|
|
+ dct :4, /* Date cache tracking */
|
|
|
+ itt :4, /* Instruction TLB tracking */
|
|
|
+ ddt :4, /* Data TLB tracking */
|
|
|
+ reserved:48;
|
|
|
+ } pal_hw_tracking_s;
|
|
|
+} pal_hw_tracking_u_t;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Hardware tracking status.
|
|
|
+ */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_hw_tracking (u64 *status)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_HW_TRACKING, 0, 0, 0);
|
|
|
+ if (status)
|
|
|
+ *status = iprv.v0;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Register a platform dependent location with PAL to which it can save
|
|
|
+ * minimal processor state in the event of a machine check or initialization
|
|
|
+ * event.
|
|
|
+ */
|
|
|
+static inline s64
|
|
|
+ia64_pal_mc_register_mem (u64 physical_addr, u64 size, u64 *req_size)
|
|
|
+{
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
+ PAL_CALL(iprv, PAL_MC_REGISTER_MEM, physical_addr, size, 0);
|
|
|
+ if (req_size)
|
|
|
+ *req_size = iprv.v0;
|
|
|
+ return iprv.status;
|
|
|
+}
|
|
|
+
|
|
|
+/* Restore minimal architectural processor state, set CMC interrupt if necessary
|