|
@@ -1324,3 +1324,149 @@ ia64_pal_mc_register_mem (u64 physical_addr, u64 size, u64 *req_size)
|
|
}
|
|
}
|
|
|
|
|
|
/* Restore minimal architectural processor state, set CMC interrupt if necessary
|
|
/* Restore minimal architectural processor state, set CMC interrupt if necessary
|
|
|
|
+ * and resume execution
|
|
|
|
+ */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_mc_resume (u64 set_cmci, u64 save_ptr)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_MC_RESUME, set_cmci, save_ptr, 0);
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Return the memory attributes implemented by the processor */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_mem_attrib (u64 *mem_attrib)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_MEM_ATTRIB, 0, 0, 0);
|
|
|
|
+ if (mem_attrib)
|
|
|
|
+ *mem_attrib = iprv.v0 & 0xff;
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Return the amount of memory needed for second phase of processor
|
|
|
|
+ * self-test and the required alignment of memory.
|
|
|
|
+ */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_mem_for_test (u64 *bytes_needed, u64 *alignment)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_MEM_FOR_TEST, 0, 0, 0);
|
|
|
|
+ if (bytes_needed)
|
|
|
|
+ *bytes_needed = iprv.v0;
|
|
|
|
+ if (alignment)
|
|
|
|
+ *alignment = iprv.v1;
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+typedef union pal_perf_mon_info_u {
|
|
|
|
+ u64 ppmi_data;
|
|
|
|
+ struct {
|
|
|
|
+ u64 generic : 8,
|
|
|
|
+ width : 8,
|
|
|
|
+ cycles : 8,
|
|
|
|
+ retired : 8,
|
|
|
|
+ reserved : 32;
|
|
|
|
+ } pal_perf_mon_info_s;
|
|
|
|
+} pal_perf_mon_info_u_t;
|
|
|
|
+
|
|
|
|
+/* Return the performance monitor information about what can be counted
|
|
|
|
+ * and how to configure the monitors to count the desired events.
|
|
|
|
+ */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_perf_mon_info (u64 *pm_buffer, pal_perf_mon_info_u_t *pm_info)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_PERF_MON_INFO, (unsigned long) pm_buffer, 0, 0);
|
|
|
|
+ if (pm_info)
|
|
|
|
+ pm_info->ppmi_data = iprv.v0;
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Specifies the physical address of the processor interrupt block
|
|
|
|
+ * and I/O port space.
|
|
|
|
+ */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_platform_addr (u64 type, u64 physical_addr)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_PLATFORM_ADDR, type, physical_addr, 0);
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Set the SAL PMI entrypoint in memory */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_pmi_entrypoint (u64 sal_pmi_entry_addr)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_PMI_ENTRYPOINT, sal_pmi_entry_addr, 0, 0);
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct pal_features_s;
|
|
|
|
+/* Provide information about configurable processor features */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_proc_get_features (u64 *features_avail,
|
|
|
|
+ u64 *features_status,
|
|
|
|
+ u64 *features_control,
|
|
|
|
+ u64 features_set)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL_PHYS(iprv, PAL_PROC_GET_FEATURES, 0, features_set, 0);
|
|
|
|
+ if (iprv.status == 0) {
|
|
|
|
+ *features_avail = iprv.v0;
|
|
|
|
+ *features_status = iprv.v1;
|
|
|
|
+ *features_control = iprv.v2;
|
|
|
|
+ }
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Enable/disable processor dependent features */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_proc_set_features (u64 feature_select)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL_PHYS(iprv, PAL_PROC_SET_FEATURES, feature_select, 0, 0);
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Put everything in a struct so we avoid the global offset table whenever
|
|
|
|
+ * possible.
|
|
|
|
+ */
|
|
|
|
+typedef struct ia64_ptce_info_s {
|
|
|
|
+ unsigned long base;
|
|
|
|
+ u32 count[2];
|
|
|
|
+ u32 stride[2];
|
|
|
|
+} ia64_ptce_info_t;
|
|
|
|
+
|
|
|
|
+/* Return the information required for the architected loop used to purge
|
|
|
|
+ * (initialize) the entire TC
|
|
|
|
+ */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_get_ptce (ia64_ptce_info_t *ptce)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+
|
|
|
|
+ if (!ptce)
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ PAL_CALL(iprv, PAL_PTCE_INFO, 0, 0, 0);
|
|
|
|
+ if (iprv.status == 0) {
|
|
|
|
+ ptce->base = iprv.v0;
|
|
|
|
+ ptce->count[0] = iprv.v1 >> 32;
|
|
|
|
+ ptce->count[1] = iprv.v1 & 0xffffffff;
|
|
|
|
+ ptce->stride[0] = iprv.v2 >> 32;
|
|
|
|
+ ptce->stride[1] = iprv.v2 & 0xffffffff;
|
|
|
|
+ }
|
|
|
|
+ return iprv.status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Return info about implemented application and control registers. */
|
|
|
|
+static inline s64
|
|
|
|
+ia64_pal_register_info (u64 info_request, u64 *reg_info_1, u64 *reg_info_2)
|
|
|
|
+{
|
|
|
|
+ struct ia64_pal_retval iprv;
|
|
|
|
+ PAL_CALL(iprv, PAL_REGISTER_INFO, info_request, 0, 0);
|
|
|
|
+ if (reg_info_1)
|