|
@@ -76,3 +76,142 @@ extern spinlock_t sal_lock;
|
|
|
ia64_save_scratch_fpregs(__ia64_scs_fr); \
|
|
|
preempt_disable(); \
|
|
|
__IA64_FW_CALL(ia64_sal, result, args); \
|
|
|
+ preempt_enable(); \
|
|
|
+ ia64_load_scratch_fpregs(__ia64_scs_fr); \
|
|
|
+} while (0)
|
|
|
+
|
|
|
+#define SAL_SET_VECTORS 0x01000000
|
|
|
+#define SAL_GET_STATE_INFO 0x01000001
|
|
|
+#define SAL_GET_STATE_INFO_SIZE 0x01000002
|
|
|
+#define SAL_CLEAR_STATE_INFO 0x01000003
|
|
|
+#define SAL_MC_RENDEZ 0x01000004
|
|
|
+#define SAL_MC_SET_PARAMS 0x01000005
|
|
|
+#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006
|
|
|
+
|
|
|
+#define SAL_CACHE_FLUSH 0x01000008
|
|
|
+#define SAL_CACHE_INIT 0x01000009
|
|
|
+#define SAL_PCI_CONFIG_READ 0x01000010
|
|
|
+#define SAL_PCI_CONFIG_WRITE 0x01000011
|
|
|
+#define SAL_FREQ_BASE 0x01000012
|
|
|
+#define SAL_PHYSICAL_ID_INFO 0x01000013
|
|
|
+
|
|
|
+#define SAL_UPDATE_PAL 0x01000020
|
|
|
+
|
|
|
+struct ia64_sal_retval {
|
|
|
+ /*
|
|
|
+ * A zero status value indicates call completed without error.
|
|
|
+ * A negative status value indicates reason of call failure.
|
|
|
+ * A positive status value indicates success but an
|
|
|
+ * informational value should be printed (e.g., "reboot for
|
|
|
+ * change to take effect").
|
|
|
+ */
|
|
|
+ long status;
|
|
|
+ unsigned long v0;
|
|
|
+ unsigned long v1;
|
|
|
+ unsigned long v2;
|
|
|
+};
|
|
|
+
|
|
|
+typedef struct ia64_sal_retval (*ia64_sal_handler) (u64, ...);
|
|
|
+
|
|
|
+enum {
|
|
|
+ SAL_FREQ_BASE_PLATFORM = 0,
|
|
|
+ SAL_FREQ_BASE_INTERVAL_TIMER = 1,
|
|
|
+ SAL_FREQ_BASE_REALTIME_CLOCK = 2
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * The SAL system table is followed by a variable number of variable
|
|
|
+ * length descriptors. The structure of these descriptors follows
|
|
|
+ * below.
|
|
|
+ * The defininition follows SAL specs from July 2000
|
|
|
+ */
|
|
|
+struct ia64_sal_systab {
|
|
|
+ u8 signature[4]; /* should be "SST_" */
|
|
|
+ u32 size; /* size of this table in bytes */
|
|
|
+ u8 sal_rev_minor;
|
|
|
+ u8 sal_rev_major;
|
|
|
+ u16 entry_count; /* # of entries in variable portion */
|
|
|
+ u8 checksum;
|
|
|
+ u8 reserved1[7];
|
|
|
+ u8 sal_a_rev_minor;
|
|
|
+ u8 sal_a_rev_major;
|
|
|
+ u8 sal_b_rev_minor;
|
|
|
+ u8 sal_b_rev_major;
|
|
|
+ /* oem_id & product_id: terminating NUL is missing if string is exactly 32 bytes long. */
|
|
|
+ u8 oem_id[32];
|
|
|
+ u8 product_id[32]; /* ASCII product id */
|
|
|
+ u8 reserved2[8];
|
|
|
+};
|
|
|
+
|
|
|
+enum sal_systab_entry_type {
|
|
|
+ SAL_DESC_ENTRY_POINT = 0,
|
|
|
+ SAL_DESC_MEMORY = 1,
|
|
|
+ SAL_DESC_PLATFORM_FEATURE = 2,
|
|
|
+ SAL_DESC_TR = 3,
|
|
|
+ SAL_DESC_PTC = 4,
|
|
|
+ SAL_DESC_AP_WAKEUP = 5
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * Entry type: Size:
|
|
|
+ * 0 48
|
|
|
+ * 1 32
|
|
|
+ * 2 16
|
|
|
+ * 3 32
|
|
|
+ * 4 16
|
|
|
+ * 5 16
|
|
|
+ */
|
|
|
+#define SAL_DESC_SIZE(type) "\060\040\020\040\020\020"[(unsigned) type]
|
|
|
+
|
|
|
+typedef struct ia64_sal_desc_entry_point {
|
|
|
+ u8 type;
|
|
|
+ u8 reserved1[7];
|
|
|
+ u64 pal_proc;
|
|
|
+ u64 sal_proc;
|
|
|
+ u64 gp;
|
|
|
+ u8 reserved2[16];
|
|
|
+}ia64_sal_desc_entry_point_t;
|
|
|
+
|
|
|
+typedef struct ia64_sal_desc_memory {
|
|
|
+ u8 type;
|
|
|
+ u8 used_by_sal; /* needs to be mapped for SAL? */
|
|
|
+ u8 mem_attr; /* current memory attribute setting */
|
|
|
+ u8 access_rights; /* access rights set up by SAL */
|
|
|
+ u8 mem_attr_mask; /* mask of supported memory attributes */
|
|
|
+ u8 reserved1;
|
|
|
+ u8 mem_type; /* memory type */
|
|
|
+ u8 mem_usage; /* memory usage */
|
|
|
+ u64 addr; /* physical address of memory */
|
|
|
+ u32 length; /* length (multiple of 4KB pages) */
|
|
|
+ u32 reserved2;
|
|
|
+ u8 oem_reserved[8];
|
|
|
+} ia64_sal_desc_memory_t;
|
|
|
+
|
|
|
+typedef struct ia64_sal_desc_platform_feature {
|
|
|
+ u8 type;
|
|
|
+ u8 feature_mask;
|
|
|
+ u8 reserved1[14];
|
|
|
+} ia64_sal_desc_platform_feature_t;
|
|
|
+
|
|
|
+typedef struct ia64_sal_desc_tr {
|
|
|
+ u8 type;
|
|
|
+ u8 tr_type; /* 0 == instruction, 1 == data */
|
|
|
+ u8 regnum; /* translation register number */
|
|
|
+ u8 reserved1[5];
|
|
|
+ u64 addr; /* virtual address of area covered */
|
|
|
+ u64 page_size; /* encoded page size */
|
|
|
+ u8 reserved2[8];
|
|
|
+} ia64_sal_desc_tr_t;
|
|
|
+
|
|
|
+typedef struct ia64_sal_desc_ptc {
|
|
|
+ u8 type;
|
|
|
+ u8 reserved1[3];
|
|
|
+ u32 num_domains; /* # of coherence domains */
|
|
|
+ u64 domain_info; /* physical address of domain info table */
|
|
|
+} ia64_sal_desc_ptc_t;
|
|
|
+
|
|
|
+typedef struct ia64_sal_ptc_domain_info {
|
|
|
+ u64 proc_count; /* number of processors in domain */
|
|
|
+ u64 proc_list; /* physical address of LID array */
|
|
|
+} ia64_sal_ptc_domain_info_t;
|
|
|
+
|