11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _ASM_IA64_SAL_H 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _ASM_IA64_SAL_H 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * System Abstraction Layer definitions. 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is based on version 2.5 of the manual "IA-64 System 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Abstraction Layer". 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2001 Intel 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2002 Jenna Hall <jenna.s.hall@intel.com> 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2001 Fred Lewis <frederick.v.lewis@intel.com> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1998, 1999, 2001, 2003 Hewlett-Packard Co 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * David Mosberger-Tang <davidm@hpl.hp.com> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Srinivasa Prasad Thirumalachar <sprasad@sprasad.engr.sgi.com> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 02/01/04 J. Hall Updated Error Record Structures to conform to July 2001 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * revision of the SAL spec. 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 01/01/03 fvlewis Updated Error Record Structures to conform with Nov. 2000 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * revision of the SAL spec. 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 99/09/29 davidm Updated for SAL 2.6. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 00/03/29 cfleck Updated SAL Error Logging info for processor (SAL 2.6) 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (plus examples of platform error info structures from smariset @ Intel) 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT 0 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT 1 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT 2 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT 3 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK (1<<IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT) 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT (1<<IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT) 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT (1<<IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT) 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT (1<<IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT) 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASSEMBLY__ 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bcd.h> 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/spinlock.h> 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/efi.h> 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pal.h> 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/fpu.h> 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern spinlock_t sal_lock; 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SAL spec _requires_ eight args for each call. */ 48edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas#define __IA64_FW_CALL(entry,result,a0,a1,a2,a3,a4,a5,a6,a7) \ 49edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas result = (*entry)(a0,a1,a2,a3,a4,a5,a6,a7) 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 51edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas# define IA64_FW_CALL(entry,result,args...) do { \ 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long __ia64_sc_flags; \ 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_fpreg __ia64_sc_fr[6]; \ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ia64_save_scratch_fpregs(__ia64_sc_fr); \ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \ 56edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas __IA64_FW_CALL(entry, result, args); \ 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \ 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ia64_load_scratch_fpregs(__ia64_sc_fr); \ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} while (0) 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 61edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas# define SAL_CALL(result,args...) \ 62edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas IA64_FW_CALL(ia64_sal, result, args); 63edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define SAL_CALL_NOLOCK(result,args...) do { \ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long __ia64_scn_flags; \ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_fpreg __ia64_scn_fr[6]; \ 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ia64_save_scratch_fpregs(__ia64_scn_fr); \ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_save(__ia64_scn_flags); \ 69edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas __IA64_FW_CALL(ia64_sal, result, args); \ 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_restore(__ia64_scn_flags); \ 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ia64_load_scratch_fpregs(__ia64_scn_fr); \ 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} while (0) 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define SAL_CALL_REENTRANT(result,args...) do { \ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_fpreg __ia64_scs_fr[6]; \ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ia64_save_scratch_fpregs(__ia64_scs_fr); \ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds preempt_disable(); \ 78edbe7075d144b35e8232ca32f373c1e0c26ff085Bjorn Helgaas __IA64_FW_CALL(ia64_sal, result, args); \ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds preempt_enable(); \ 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ia64_load_scratch_fpregs(__ia64_scs_fr); \ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} while (0) 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_SET_VECTORS 0x01000000 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_GET_STATE_INFO 0x01000001 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_GET_STATE_INFO_SIZE 0x01000002 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_CLEAR_STATE_INFO 0x01000003 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_MC_RENDEZ 0x01000004 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_MC_SET_PARAMS 0x01000005 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_CACHE_FLUSH 0x01000008 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_CACHE_INIT 0x01000009 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PCI_CONFIG_READ 0x01000010 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PCI_CONFIG_WRITE 0x01000011 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_FREQ_BASE 0x01000012 96e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha#define SAL_PHYSICAL_ID_INFO 0x01000013 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_UPDATE_PAL 0x01000020 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ia64_sal_retval { 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A zero status value indicates call completed without error. 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A negative status value indicates reason of call failure. 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A positive status value indicates success but an 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * informational value should be printed (e.g., "reboot for 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * change to take effect"). 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 108e088a4ad7fa53c3dc3c29f930025f41ccf01953eMatthew Wilcox long status; 109e088a4ad7fa53c3dc3c29f930025f41ccf01953eMatthew Wilcox unsigned long v0; 110e088a4ad7fa53c3dc3c29f930025f41ccf01953eMatthew Wilcox unsigned long v1; 111e088a4ad7fa53c3dc3c29f930025f41ccf01953eMatthew Wilcox unsigned long v2; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_retval (*ia64_sal_handler) (u64, ...); 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_FREQ_BASE_PLATFORM = 0, 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_FREQ_BASE_INTERVAL_TIMER = 1, 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_FREQ_BASE_REALTIME_CLOCK = 2 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The SAL system table is followed by a variable number of variable 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * length descriptors. The structure of these descriptors follows 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * below. 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The defininition follows SAL specs from July 2000 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ia64_sal_systab { 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 signature[4]; /* should be "SST_" */ 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 size; /* size of this table in bytes */ 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sal_rev_minor; 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sal_rev_major; 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 entry_count; /* # of entries in variable portion */ 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 checksum; 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1[7]; 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sal_a_rev_minor; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sal_a_rev_major; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sal_b_rev_minor; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sal_b_rev_major; 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* oem_id & product_id: terminating NUL is missing if string is exactly 32 bytes long. */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_id[32]; 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 product_id[32]; /* ASCII product id */ 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved2[8]; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum sal_systab_entry_type { 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_DESC_ENTRY_POINT = 0, 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_DESC_MEMORY = 1, 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_DESC_PLATFORM_FEATURE = 2, 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_DESC_TR = 3, 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_DESC_PTC = 4, 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_DESC_AP_WAKEUP = 5 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Entry type: Size: 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0 48 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1 32 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2 16 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3 32 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4 16 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5 16 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_DESC_SIZE(type) "\060\040\020\040\020\020"[(unsigned) type] 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_desc_entry_point { 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 type; 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1[7]; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 pal_proc; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 sal_proc; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 gp; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved2[16]; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}ia64_sal_desc_entry_point_t; 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_desc_memory { 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 type; 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 used_by_sal; /* needs to be mapped for SAL? */ 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 mem_attr; /* current memory attribute setting */ 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 access_rights; /* access rights set up by SAL */ 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 mem_attr_mask; /* mask of supported memory attributes */ 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 mem_type; /* memory type */ 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 mem_usage; /* memory usage */ 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 addr; /* physical address of memory */ 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 length; /* length (multiple of 4KB pages) */ 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 reserved2; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_reserved[8]; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_desc_memory_t; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_desc_platform_feature { 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 type; 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 feature_mask; 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1[14]; 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_desc_platform_feature_t; 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_desc_tr { 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 type; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tr_type; /* 0 == instruction, 1 == data */ 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 regnum; /* translation register number */ 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1[5]; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 addr; /* virtual address of area covered */ 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 page_size; /* encoded page size */ 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved2[8]; 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_desc_tr_t; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_desc_ptc { 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 type; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1[3]; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 num_domains; /* # of coherence domains */ 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 domain_info; /* physical address of domain info table */ 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_desc_ptc_t; 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_ptc_domain_info { 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 proc_count; /* number of processors in domain */ 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 proc_list; /* physical address of LID array */ 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_ptc_domain_info_t; 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_ptc_domain_proc_entry { 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 id : 8; /* id of processor */ 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 eid : 8; /* eid of processor */ 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_ptc_domain_proc_entry_t; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_AP_EXTERNAL_INT 0 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ia64_sal_desc_ap_wakeup { 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 type; 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 mechanism; /* 0 == external interrupt */ 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved1[6]; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 vector; /* interrupt vector in range 0x10-0xff */ 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_sal_desc_ap_wakeup_t ; 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern ia64_sal_handler ia64_sal; 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct ia64_sal_desc_ptc *ia64_ptc_domain_info; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned short sal_revision; /* supported SAL spec revision */ 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned short sal_version; /* SAL version; OEM dependent */ 238430ac5ba9c74f236ddd695b1282a889630cb4f91Adrian Bunk#define SAL_VERSION_CODE(major, minor) ((bin2bcd(major) << 8) | bin2bcd(minor)) 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern const char *ia64_sal_strerror (long status); 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ia64_sal_init (struct ia64_sal_systab *sal_systab); 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SAL information type encodings */ 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_INFO_TYPE_MCA = 0, /* Machine check abort information */ 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_INFO_TYPE_INIT = 1, /* Init information */ 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_INFO_TYPE_CMC = 2, /* Corrected machine check information */ 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_INFO_TYPE_CPE = 3 /* Corrected platform error information */ 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Encodings for machine check parameter types */ 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_MC_PARAM_RENDEZ_INT = 1, /* Rendezvous interrupt */ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_MC_PARAM_RENDEZ_WAKEUP = 2, /* Wakeup */ 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_MC_PARAM_CPE_INT = 3 /* Corrected Platform Error Int */ 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Encodings for rendezvous mechanisms */ 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_MC_PARAM_MECHANISM_INT = 1, /* Use interrupt */ 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_MC_PARAM_MECHANISM_MEM = 2 /* Use memory synchronization variable*/ 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Encodings for vectors which can be registered by the OS with SAL */ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_VECTOR_OS_MCA = 0, 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_VECTOR_OS_INIT = 1, 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_VECTOR_OS_BOOT_RENDEZ = 2 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Encodings for mca_opt parameter sent to SAL_MC_SET_PARAMS */ 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_MC_PARAM_RZ_ALWAYS 0x1 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_MC_PARAM_BINIT_ESCALATE 0x10 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Definition of the SAL Error Log from the SAL spec 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SAL Error Record Section GUID Definitions */ 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PROC_DEV_ERR_SECT_GUID \ 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf1, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_MEM_DEV_ERR_SECT_GUID \ 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf2, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_SEL_DEV_ERR_SECT_GUID \ 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf3, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_PCI_BUS_ERR_SECT_GUID \ 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf4, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID \ 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf5, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_PCI_COMP_ERR_SECT_GUID \ 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf6, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_SPECIFIC_ERR_SECT_GUID \ 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf7, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_HOST_CTLR_ERR_SECT_GUID \ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf8, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_PLAT_BUS_ERR_SECT_GUID \ 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EFI_GUID(0xe429faf9, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) 2982046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu#define PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID \ 2992046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu EFI_GUID(0x6cb0a200, 0x893a, 0x11da, 0x96, 0xd2, 0x0, 0x10, 0x83, 0xff, \ 3002046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu 0xca, 0x4d) 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_CACHE_ERRORS 6 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_TLB_ERRORS 6 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_BUS_ERRORS 1 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Definition of version according to SAL spec for logging purposes */ 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_revision { 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 minor; /* BCD (0..99) */ 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 major; /* BCD (0..99) */ 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_revision_t; 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Definition of timestamp according to SAL spec for logging purposes */ 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_timestamp { 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_second; /* Second (0..59) */ 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_minute; /* Minute (0..59) */ 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_hour; /* Hour (0..23) */ 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_reserved; 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_day; /* Day (1..31) */ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_month; /* Month (1..12) */ 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_year; /* Year (00..99) */ 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 slh_century; /* Century (19, 20, 21, ...) */ 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_timestamp_t; 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Definition of log record header structures */ 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_record_header { 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 id; /* Unique monotonically increasing ID */ 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_revision_t revision; /* Major and Minor revision of header */ 328eed66cfcbbea851c97e287440d940286fce3f829Tony Luck u8 severity; /* Error Severity */ 329eed66cfcbbea851c97e287440d940286fce3f829Tony Luck u8 validation_bits; /* 0: platform_guid, 1: !timestamp */ 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 len; /* Length of this error log in bytes */ 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_timestamp_t timestamp; /* Timestamp */ 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds efi_guid_t platform_guid; /* Unique OEM Platform ID */ 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_record_header_t; 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sal_log_severity_recoverable 0 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sal_log_severity_fatal 1 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define sal_log_severity_corrected 2 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 339d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson/* 340d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson * Error Recovery Info (ERI) bit decode. From SAL Spec section B.2.2 Table B-3 341d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson * Error Section Error_Recovery_Info Field Definition. 342d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson */ 343d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_NOT_VALID 0x0 /* Error Recovery Field is not valid */ 344d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_NOT_ACCESSIBLE 0x30 /* Resource not accessible */ 345d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_CONTAINMENT_WARN 0x22 /* Corrupt data propagated */ 346d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_UNCORRECTED_ERROR 0x20 /* Uncorrected error */ 347d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_COMPONENT_RESET 0x24 /* Component must be reset */ 348d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_CORR_ERROR_LOG 0x21 /* Corrected error, needs logging */ 349d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson#define ERI_CORR_ERROR_THRESH 0x29 /* Corrected error threshold exceeded */ 350d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Definition of log section header structures */ 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_sec_header { 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds efi_guid_t guid; /* Unique Section ID */ 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_revision_t revision; /* Major and Minor revision of Section */ 355d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson u8 error_recovery_info; /* Platform error recovery status */ 356d6e15199d1784df90b7535e625f7617bd343d202Russ Anderson u8 reserved; 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 len; /* Section length */ 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_section_hdr_t; 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_mod_error_info { 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 check_info : 1, 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds requestor_identifier : 1, 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds responder_identifier : 1, 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_identifier : 1, 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds precise_ip : 1, 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 59; 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 check_info; 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 requestor_identifier; 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 responder_identifier; 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 target_identifier; 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 precise_ip; 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_mod_error_info_t; 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_processor_static_info { 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 minstate : 1, 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds br : 1, 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cr : 1, 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ar : 1, 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rr : 1, 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fr : 1, 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 58; 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pal_min_state_area_t min_state_area; 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 br[8]; 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 cr[128]; 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 ar[128]; 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 rr[8]; 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_fpreg __attribute__ ((packed)) fr[128]; 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_processor_static_info_t; 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct sal_cpuid_info { 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 regs[5]; 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 reserved; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_processor_info { 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 proc_error_map : 1, 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds proc_state_param : 1, 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds proc_cr_lid : 1, 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds psi_static_struct : 1, 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_cache_check : 4, 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_tlb_check : 4, 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_bus_check : 4, 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_reg_file_check : 4, 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_ms_check : 4, 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpuid_info : 1, 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved1 : 39; 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 proc_error_map; 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 proc_state_parameter; 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 proc_cr_lid; 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The rest of this structure consists of variable-length arrays, which can't be 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * expressed in C. 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_mod_error_info_t info[0]; 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is what the rest looked like if C supported variable-length arrays: 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sal_log_mod_error_info_t cache_check_info[.valid.num_cache_check]; 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sal_log_mod_error_info_t tlb_check_info[.valid.num_tlb_check]; 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sal_log_mod_error_info_t bus_check_info[.valid.num_bus_check]; 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sal_log_mod_error_info_t reg_file_check_info[.valid.num_reg_file_check]; 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sal_log_mod_error_info_t ms_check_info[.valid.num_ms_check]; 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * struct sal_cpuid_info cpuid_info; 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sal_processor_static_info_t processor_static_info; 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_processor_info_t; 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Given a sal_log_processor_info_t pointer, return a pointer to the processor_static_info: */ 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAL_LPI_PSI_INFO(l) \ 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds({ sal_log_processor_info_t *_l = (l); \ 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((sal_processor_static_info_t *) \ 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((char *) _l->info + ((_l->valid.num_cache_check + _l->valid.num_tlb_check \ 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds + _l->valid.num_bus_check + _l->valid.num_reg_file_check \ 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds + _l->valid.num_ms_check) * sizeof(sal_log_mod_error_info_t) \ 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds + sizeof(struct sal_cpuid_info)))); \ 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}) 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* platform error log structures */ 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_mem_dev_err_info { 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 error_status : 1, 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physical_addr : 1, 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds addr_mask : 1, 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds node : 1, 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card : 1, 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds module : 1, 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bank : 1, 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device : 1, 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds row : 1, 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds column : 1, 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bit_position : 1, 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds requestor_id : 1, 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds responder_id : 1, 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_id : 1, 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_spec_data : 1, 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_id : 1, 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_data : 1, 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 47; 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 error_status; 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 physical_addr; 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 addr_mask; 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 node; 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 card; 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 module; 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 bank; 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 device; 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 row; 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 column; 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 bit_position; 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 requestor_id; 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 responder_id; 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 target_id; 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 bus_spec_data; 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_id[16]; 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data[1]; /* Variable length data */ 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_mem_dev_err_info_t; 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_sel_dev_err_info { 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 record_id : 1, 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds record_type : 1, 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds generator_id : 1, 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds evm_rev : 1, 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sensor_type : 1, 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sensor_num : 1, 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds event_dir : 1, 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds event_data1 : 1, 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds event_data2 : 1, 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds event_data3 : 1, 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 54; 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 record_id; 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 record_type; 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 timestamp[4]; 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 generator_id; 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 evm_rev; 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sensor_type; 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 sensor_num; 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 event_dir; 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 event_data1; 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 event_data2; 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 event_data3; 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_sel_dev_err_info_t; 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_pci_bus_err_info { 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status : 1, 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err_type : 1, 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_id : 1, 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_address : 1, 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_data : 1, 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_cmd : 1, 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds requestor_id : 1, 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds responder_id : 1, 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_id : 1, 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_data : 1, 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 54; 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status; 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 err_type; 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 bus_id; 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 reserved; 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 bus_address; 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 bus_data; 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 bus_cmd; 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 requestor_id; 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 responder_id; 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 target_id; 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data[1]; /* Variable length data */ 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_pci_bus_err_info_t; 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_smbios_dev_err_info { 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 event_type : 1, 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds length : 1, 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds time_stamp : 1, 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data : 1, 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved1 : 60; 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 event_type; 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 length; 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 time_stamp[6]; 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[1]; /* data of variable length, length == slsmb_length */ 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_smbios_dev_err_info_t; 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_pci_comp_err_info { 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status : 1, 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds comp_info : 1, 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_mem_regs : 1, 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds num_io_regs : 1, 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reg_data_pairs : 1, 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_data : 1, 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 58; 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status; 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 vendor_id; 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 device_id; 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 class_code[3]; 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 func_num; 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 dev_num; 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 bus_num; 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 seg_num; 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved[5]; 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } comp_info; 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 num_mem_regs; 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 num_io_regs; 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 reg_data_pairs[1]; 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * array of address/data register pairs is num_mem_regs + num_io_regs elements 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * long. Each array element consists of a u64 address followed by a u64 data 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * value. The oem_data array immediately follows the reg_data_pairs array 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data[1]; /* Variable length data */ 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_pci_comp_err_info_t; 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_plat_specific_err_info { 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status : 1, 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds guid : 1, 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_data : 1, 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 61; 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status; 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds efi_guid_t guid; 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data[1]; /* platform specific variable length data */ 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_plat_specific_err_info_t; 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_host_ctlr_err_info { 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status : 1, 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds requestor_id : 1, 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds responder_id : 1, 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_id : 1, 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_spec_data : 1, 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_data : 1, 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 58; 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status; 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 requestor_id; 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 responder_id; 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 target_id; 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 bus_spec_data; 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data[1]; /* Variable length OEM data */ 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_host_ctlr_err_info_t; 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct sal_log_plat_bus_err_info { 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_section_hdr_t header; 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status : 1, 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds requestor_id : 1, 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds responder_id : 1, 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_id : 1, 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bus_spec_data : 1, 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds oem_data : 1, 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reserved : 58; 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } valid; 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 err_status; 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 requestor_id; 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 responder_id; 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 target_id; 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 bus_spec_data; 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data[1]; /* Variable length OEM data */ 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_plat_bus_err_info_t; 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Overall platform error section structure */ 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef union sal_log_platform_err_info { 6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_mem_dev_err_info_t mem_dev_err; 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_sel_dev_err_info_t sel_dev_err; 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_pci_bus_err_info_t pci_bus_err; 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_smbios_dev_err_info_t smbios_dev_err; 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_pci_comp_err_info_t pci_comp_err; 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_plat_specific_err_info_t plat_specific_err; 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_host_ctlr_err_info_t host_ctlr_err; 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_plat_bus_err_info_t plat_bus_err; 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sal_log_platform_err_info_t; 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SAL log over-all, multi-section error record structure (processor+platform) */ 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct err_rec { 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_record_header_t sal_elog_header; 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_processor_info_t proc_err; 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_log_platform_err_info_t plat_err; 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 oem_data_pad[1024]; 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ia64_err_rec_t; 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Now define a couple of inline functions for improved type checking 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and convenience. 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 668a58786917ce23c2a26c3e099c3cdba32a35eecebBjorn Helgaasextern s64 ia64_sal_cache_flush (u64 cache_type); 669fa1d19e5d9a94120f31e5783ab44758f46892d94Troy Heberextern void __init check_sal_cache_flush (void); 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Initialize all the processor and platform level instruction and data caches */ 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_cache_init (void) 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_CACHE_INIT, 0, 0, 0, 0, 0, 0, 0); 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Clear the processor and platform information logged by SAL with respect to the machine 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * state at the time of MCA's, INITs, CMCs, or CPEs. 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_clear_state_info (u64 sal_info_type) 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL_REENTRANT(isrv, SAL_CLEAR_STATE_INFO, sal_info_type, 0, 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, 0, 0, 0, 0); 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Get the processor and platform information logged by SAL with respect to the machine 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * state at the time of the MCAs, INITs, CMCs, or CPEs. 6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u64 6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_get_state_info (u64 sal_info_type, u64 *sal_info) 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0, 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sal_info, 0, 0, 0, 0); 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (isrv.status) 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.v0; 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Get the maximum size of the information logged by SAL with respect to the machine state 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * at the time of MCAs, INITs, CMCs, or CPEs. 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u64 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_get_state_info_size (u64 sal_info_type) 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO_SIZE, sal_info_type, 0, 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, 0, 0, 0, 0); 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (isrv.status) 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.v0; 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Causes the processor to go into a spin loop within SAL where SAL awaits a wakeup from 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the monarch processor. Must not lock, because it will not return on any cpu until the 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * monarch processor sends a wake up. 7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_mc_rendez (void) 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL_NOLOCK(isrv, SAL_MC_RENDEZ, 0, 0, 0, 0, 0, 0, 0); 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allow the OS to specify the interrupt number to be used by SAL to interrupt OS during 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the machine check rendezvous sequence as well as the mechanism to wake up the 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * non-monarch processor at the end of machine check processing. 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns the complete ia64_sal_retval because some calls return more than just a status 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * value. 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline struct ia64_sal_retval 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_mc_set_params (u64 param_type, u64 i_or_m, u64 i_or_m_val, u64 timeout, u64 rz_always) 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_MC_SET_PARAMS, param_type, i_or_m, i_or_m_val, 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds timeout, rz_always, 0, 0); 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv; 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Read from PCI configuration space */ 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_pci_config_read (u64 pci_config_addr, int type, u64 size, u64 *value) 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_PCI_CONFIG_READ, pci_config_addr, size, type, 0, 0, 0, 0); 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (value) 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *value = isrv.v0; 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Write to PCI configuration space */ 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_pci_config_write (u64 pci_config_addr, int type, u64 size, u64 value) 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_PCI_CONFIG_WRITE, pci_config_addr, size, value, 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds type, 0, 0, 0); 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Register physical addresses of locations needed by SAL when SAL procedures are invoked 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in virtual mode. 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_register_physical_addr (u64 phys_entry, u64 phys_addr) 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_REGISTER_PHYSICAL_ADDR, phys_entry, phys_addr, 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, 0, 0, 0, 0); 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Register software dependent code locations within SAL. These locations are handlers or 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * entry points where SAL will pass control for the specified event. These event handlers 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are for the bott rendezvous, MCAs and INIT scenarios. 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_set_vectors (u64 vector_type, 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 handler_addr1, u64 gp1, u64 handler_len1, 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 handler_addr2, u64 gp2, u64 handler_len2) 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_SET_VECTORS, vector_type, 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds handler_addr1, gp1, handler_len1, 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds handler_addr2, gp2, handler_len2); 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Update the contents of PAL block in the non-volatile storage device */ 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s64 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_sal_update_pal (u64 param_buf, u64 scratch_buf, u64 scratch_buf_size, 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 *error_code, u64 *scratch_buf_size_needed) 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ia64_sal_retval isrv; 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SAL_CALL(isrv, SAL_UPDATE_PAL, param_buf, scratch_buf, scratch_buf_size, 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, 0, 0, 0); 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (error_code) 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *error_code = isrv.v0; 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (scratch_buf_size_needed) 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *scratch_buf_size_needed = isrv.v1; 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return isrv.status; 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 820e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha/* Get physical processor die mapping in the platform. */ 821e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddhastatic inline s64 822e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddhaia64_sal_physical_id_info(u16 *splid) 823e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha{ 824e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha struct ia64_sal_retval isrv; 8256ed0dc5ba811ce682f48988bf114669265e1120dAlex Chiang 8266ed0dc5ba811ce682f48988bf114669265e1120dAlex Chiang if (sal_revision < SAL_VERSION_CODE(3,2)) 8276ed0dc5ba811ce682f48988bf114669265e1120dAlex Chiang return -1; 8286ed0dc5ba811ce682f48988bf114669265e1120dAlex Chiang 829e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha SAL_CALL(isrv, SAL_PHYSICAL_ID_INFO, 0, 0, 0, 0, 0, 0, 0); 830e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha if (splid) 831e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha *splid = isrv.v0; 832e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha return isrv.status; 833e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha} 834e927ecb05e1ce4bbb1e10f57008c94994e2160f5Suresh Siddha 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned long sal_platform_features; 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int (*salinfo_platform_oemdata)(const u8 *, u8 **, u64 *); 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct sal_ret_values { 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds long r8; long r9; long r10; long r11; 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_OEMFUNC_MIN 0x02000000 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IA64_SAL_OEMFUNC_MAX 0x03ffffff 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int ia64_sal_oemcall(struct ia64_sal_retval *, u64, u64, u64, u64, u64, 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64, u64, u64); 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int ia64_sal_oemcall_nolock(struct ia64_sal_retval *, u64, u64, u64, 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64, u64, u64, u64, u64); 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int ia64_sal_oemcall_reentrant(struct ia64_sal_retval *, u64, u64, u64, 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64, u64, u64, u64, u64); 852a7d57ecf4216ed29328f8e701bd65ebb66a0284cZhang, Xiantaoextern long 853a7d57ecf4216ed29328f8e701bd65ebb66a0284cZhang, Xiantaoia64_sal_freq_base (unsigned long which, unsigned long *ticks_per_second, 854a7d57ecf4216ed29328f8e701bd65ebb66a0284cZhang, Xiantao unsigned long *drift_info); 855b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj#ifdef CONFIG_HOTPLUG_CPU 856b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj/* 857b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj * System Abstraction Layer Specification 858b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj * Section 3.2.5.1: OS_BOOT_RENDEZ to SAL return State. 859b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj * Note: region regs are stored first in head.S _start. Hence they must 860b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj * stay up front. 861b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj */ 862b8d8b883e6f029e99c35c88f853501740e322131Ashok Rajstruct sal_to_os_boot { 863b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 rr[8]; /* Region Registers */ 864860abe8f7254208074cef83dc9ebc4d70ae277a9Horms u64 br[6]; /* br0: 865860abe8f7254208074cef83dc9ebc4d70ae277a9Horms * return addr into SAL boot rendez routine */ 866b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 gr1; /* SAL:GP */ 867b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 gr12; /* SAL:SP */ 868b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 gr13; /* SAL: Task Pointer */ 869b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 fpsr; 870860abe8f7254208074cef83dc9ebc4d70ae277a9Horms u64 pfs; 871b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 rnat; 872b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 unat; 873b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 bspstore; 874b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 dcr; /* Default Control Register */ 875b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 iva; 876b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 pta; 877b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 itv; 878b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 pmv; 879b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 cmcv; 880b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 lrr[2]; 881b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 gr[4]; 882b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 pr; /* Predicate registers */ 883b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj u64 lc; /* Loop Count */ 884b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj struct ia64_fpreg fp[20]; 885b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj}; 886b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj 887b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj/* 888b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj * Global array allocated for NR_CPUS at boot time 889b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj */ 890b8d8b883e6f029e99c35c88f853501740e322131Ashok Rajextern struct sal_to_os_boot sal_boot_rendez_state[NR_CPUS]; 891b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj 892b8d8b883e6f029e99c35c88f853501740e322131Ashok Rajextern void ia64_jump_to_sal(struct sal_to_os_boot *); 893b8d8b883e6f029e99c35c88f853501740e322131Ashok Raj#endif 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ia64_sal_handler_init(void *entry_point, void *gpval); 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8972046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu#define PALO_MAX_TLB_PURGES 0xFFFF 8982046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu#define PALO_SIG "PALO" 8992046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu 9002046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yustruct palo_table { 9012046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u8 signature[4]; /* Should be "PALO" */ 9022046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u32 length; 9032046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u8 minor_revision; 9042046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u8 major_revision; 9052046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u8 checksum; 9062046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u8 reserved1[5]; 9072046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u16 max_tlb_purges; 9082046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu u8 reserved2[6]; 9092046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu}; 9102046b94e7c4fce92eb8165c2c36c6478f4927178Fenghua Yu 911a6c75b86ce9f01db4ea9912877b526c2dc4d2f0aFenghua Yu#define NPTCG_FROM_PAL 0 912a6c75b86ce9f01db4ea9912877b526c2dc4d2f0aFenghua Yu#define NPTCG_FROM_PALO 1 913a6c75b86ce9f01db4ea9912877b526c2dc4d2f0aFenghua Yu#define NPTCG_FROM_KERNEL_PARAMETER 2 914a6c75b86ce9f01db4ea9912877b526c2dc4d2f0aFenghua Yu 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __ASSEMBLY__ */ 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _ASM_IA64_SAL_H */ 918