|
@@ -51,15 +51,66 @@ enum {
|
|
|
BIOS_STATUS_UNAVAIL = -EBUSY
|
|
|
};
|
|
|
|
|
|
+/* Address map parameters */
|
|
|
+struct uv_gam_parameters {
|
|
|
+ u64 mmr_base;
|
|
|
+ u64 gru_base;
|
|
|
+ u8 mmr_shift; /* Convert PNode to MMR space offset */
|
|
|
+ u8 gru_shift; /* Convert PNode to GRU space offset */
|
|
|
+ u8 gpa_shift; /* Size of offset field in GRU phys addr */
|
|
|
+ u8 unused1;
|
|
|
+};
|
|
|
+
|
|
|
+/* UV_TABLE_GAM_RANGE_ENTRY values */
|
|
|
+#define UV_GAM_RANGE_TYPE_UNUSED 0 /* End of table */
|
|
|
+#define UV_GAM_RANGE_TYPE_RAM 1 /* Normal RAM */
|
|
|
+#define UV_GAM_RANGE_TYPE_NVRAM 2 /* Non-volatile memory */
|
|
|
+#define UV_GAM_RANGE_TYPE_NV_WINDOW 3 /* NVMDIMM block window */
|
|
|
+#define UV_GAM_RANGE_TYPE_NV_MAILBOX 4 /* NVMDIMM mailbox */
|
|
|
+#define UV_GAM_RANGE_TYPE_HOLE 5 /* Unused address range */
|
|
|
+#define UV_GAM_RANGE_TYPE_MAX 6
|
|
|
+
|
|
|
+/* The structure stores PA bits 56:26, for 64MB granularity */
|
|
|
+#define UV_GAM_RANGE_SHFT 26 /* 64MB */
|
|
|
+
|
|
|
+struct uv_gam_range_entry {
|
|
|
+ char type; /* Entry type: GAM_RANGE_TYPE_UNUSED, etc. */
|
|
|
+ char unused1;
|
|
|
+ u16 nasid; /* HNasid */
|
|
|
+ u16 sockid; /* Socket ID, high bits of APIC ID */
|
|
|
+ u16 pnode; /* Index to MMR and GRU spaces */
|
|
|
+ u32 pxm; /* ACPI proximity domain number */
|
|
|
+ u32 limit; /* PA bits 56:26 (UV_GAM_RANGE_SHFT) */
|
|
|
+};
|
|
|
+
|
|
|
+#define UV_SYSTAB_SIG "UVST"
|
|
|
+#define UV_SYSTAB_VERSION_1 1 /* UV1/2/3 BIOS version */
|
|
|
+#define UV_SYSTAB_VERSION_UV4 0x400 /* UV4 BIOS base version */
|
|
|
+#define UV_SYSTAB_VERSION_UV4_1 0x401 /* + gpa_shift */
|
|
|
+#define UV_SYSTAB_VERSION_UV4_2 0x402 /* + TYPE_NVRAM/WINDOW/MBOX */
|
|
|
+#define UV_SYSTAB_VERSION_UV4_LATEST UV_SYSTAB_VERSION_UV4_2
|
|
|
+
|
|
|
+#define UV_SYSTAB_TYPE_UNUSED 0 /* End of table (offset == 0) */
|
|
|
+#define UV_SYSTAB_TYPE_GAM_PARAMS 1 /* GAM PARAM conversions */
|
|
|
+#define UV_SYSTAB_TYPE_GAM_RNG_TBL 2 /* GAM entry table */
|
|
|
+#define UV_SYSTAB_TYPE_MAX 3
|
|
|
+
|
|
|
/*
|
|
|
* The UV system table describes specific firmware
|
|
|
* capabilities available to the Linux kernel at runtime.
|
|
|
*/
|
|
|
struct uv_systab {
|
|
|
- char signature[4]; /* must be "UVST" */
|
|
|
+ char signature[4]; /* must be UV_SYSTAB_SIG */
|
|
|
u32 revision; /* distinguish different firmware revs */
|
|
|
u64 function; /* BIOS runtime callback function ptr */
|
|
|
+ u32 size; /* systab size (starting with _VERSION_UV4) */
|
|
|
+ struct {
|
|
|
+ u32 type:8; /* type of entry */
|
|
|
+ u32 offset:24; /* byte offset from struct start to entry */
|
|
|
+ } entry[1]; /* additional entries follow */
|
|
|
};
|
|
|
+extern struct uv_systab *uv_systab;
|
|
|
+/* (... end of definitions from UV BIOS ...) */
|
|
|
|
|
|
enum {
|
|
|
BIOS_FREQ_BASE_PLATFORM = 0,
|
|
@@ -99,7 +150,11 @@ extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect);
|
|
|
extern s64 uv_bios_reserved_page_pa(u64, u64 *, u64 *, u64 *);
|
|
|
extern int uv_bios_set_legacy_vga_target(bool decode, int domain, int bus);
|
|
|
|
|
|
+#ifdef CONFIG_EFI
|
|
|
extern void uv_bios_init(void);
|
|
|
+#else
|
|
|
+void uv_bios_init(void) { }
|
|
|
+#endif
|
|
|
|
|
|
extern unsigned long sn_rtc_cycles_per_second;
|
|
|
extern int uv_type;
|
|
@@ -107,7 +162,7 @@ extern long sn_partition_id;
|
|
|
extern long sn_coherency_id;
|
|
|
extern long sn_region_size;
|
|
|
extern long system_serial_number;
|
|
|
-#define partition_coherence_id() (sn_coherency_id)
|
|
|
+#define uv_partition_coherence_id() (sn_coherency_id)
|
|
|
|
|
|
extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */
|
|
|
|