1/*	$NetBSD$	*/
2
3#ifndef _SAL_PROC_H
4#define _SAL_PROC_H
5//
6//
7//Copyright (c) 1999  Intel Corporation
8//
9//Module Name:
10//
11//    SalProc.h
12//
13//Abstract:
14//
15//    Main SAL interface routins for IA-64 calls.
16//
17//
18//Revision History
19//
20//
21
22//  return value that mimicks r8,r9,r10 & r11 registers
23typedef struct {
24    UINT64     p0;
25    UINT64     p1;
26    UINT64     p2;
27    UINT64     p3;
28} rArg;
29
30#define  SAL_PCI_CONFIG_READ                    0x01000010
31#define  SAL_PCI_CONFIG_WRITE                   0x01000011
32
33typedef VOID (*PFN)();
34typedef rArg (*PFN_SAL_PROC)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
35typedef rArg (*PFN_SAL_CALLBACK)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
36
37typedef struct _PLABEL {
38   UINT64 ProcEntryPoint;
39   UINT64 GP;
40} PLABEL;
41
42typedef struct tagIA32_BIOS_REGISTER_STATE {
43
44    // general registers
45    UINT32 eax;
46    UINT32 ecx;
47    UINT32 edx;
48    UINT32 ebx;
49
50    // stack registers
51    UINT32 esp;
52    UINT32 ebp;
53    UINT32 esi;
54    UINT32 edi;
55
56    // eflags
57    UINT32 eflags;
58
59    // instruction pointer
60    UINT32 eip;
61
62    UINT16 cs;
63    UINT16 ds;
64    UINT16 es;
65    UINT16 fs;
66    UINT16 gs;
67    UINT16 ss;
68
69    // Reserved
70    UINT32 Reserved1;
71    UINT64 Reserved2;
72} IA32_BIOS_REGISTER_STATE;
73
74VOID EFIInitMsg(VOID);
75
76EFI_STATUS
77PlRegisterAndStartTimer(
78    IN UINTN Period
79    );
80
81EFI_STATUS
82PlDeRegisterAndCancelTimer(VOID);
83
84VOID
85SalProc (
86    IN  UINT64    Arg1,
87    IN  UINT64    Arg2,
88    IN  UINT64    Arg3,
89    IN  UINT64    Arg4,
90    IN  UINT64    Arg5,
91    IN  UINT64    Arg6,
92    IN  UINT64    Arg7,
93    IN  UINT64    Arg8,
94    OUT rArg      *Results  OPTIONAL
95    );
96
97VOID
98SalCallBack (
99    IN  UINT64    Arg1,
100    IN  UINT64    Arg2,
101    IN  UINT64    Arg3,
102    IN  UINT64    Arg4,
103    IN  UINT64    Arg5,
104    IN  UINT64    Arg6,
105    IN  UINT64    Arg7,
106    IN  UINT64    Arg8,
107    OUT rArg      *Results  OPTIONAL
108    );
109
110VOID
111RUNTIMEFUNCTION
112RtSalCallBack (
113    IN  UINT64    Arg1,
114    IN  UINT64    Arg2,
115    IN  UINT64    Arg3,
116    IN  UINT64    Arg4,
117    IN  UINT64    Arg5,
118    IN  UINT64    Arg6,
119    IN  UINT64    Arg7,
120    IN  UINT64    Arg8,
121    OUT rArg      *Results  OPTIONAL
122    );
123
124
125extern PLABEL   RtGlobalSalProcEntry;
126extern PLABEL   RtGlobalSALCallBack;
127
128#pragma pack(1)
129//
130// SAL System Table
131//
132typedef struct {
133    UINT32 Signature;
134    UINT32 Length;
135    UINT16 Revision;
136    UINT16 EntryCount;
137    UINT8  CheckSum;
138    UINT8  Reserved[7];
139    UINT16 SALA_Ver;
140    UINT16 SALB_Ver;
141    UINT8  OemId[32];
142    UINT8  ProductID[32];
143    UINT8  Reserved2[8];
144} SAL_SYSTEM_TABLE_HDR;
145
146#define SAL_ST_ENTRY_POINT          0
147#define SAL_ST_MEMORY_DESCRIPTOR    1
148#define SAL_ST_PLATFORM_FEATURES    2
149#define SAL_ST_TR_USAGE             3
150#define SAL_ST_PTC                  4
151#define SAL_ST_AP_WAKEUP            5
152
153typedef struct {
154    UINT8   Type;   //  Type == 0
155    UINT8   Reserved[7];
156    UINT64  PalProcEntry;
157    UINT64  SalProcEntry;
158    UINT64  GlobalDataPointer;
159    UINT64  Reserved2[2];
160} SAL_ST_ENTRY_POINT_DESCRIPTOR;
161
162typedef struct {
163    UINT8   Type;   //  Type == 1
164    UINT8   NeedVirtualRegistration;
165    UINT8   MemoryAttributes;
166    UINT8   PageAccessRights;
167    UINT8   SupportedAttributes;
168    UINT8   Reserved;
169    UINT16  MemoryType;
170    UINT64  PhysicalMemoryAddress;
171    UINT32  Length;
172    UINT32  Reserved1;
173    UINT64  OemReserved;
174} SAL_ST_MEMORY_DESCRIPTOR_ENTRY;
175
176//
177// MemoryType info
178//
179#define SAL_SAPIC_IPI_BLOCK 0x0002
180#define SAL_IO_PORT_MAPPING 0x0003
181
182typedef struct {
183    UINT8   Type;   // Type == 2
184    UINT8   PlatformFeatures;
185    UINT8   Reserved[14];
186} SAL_ST_MEMORY_DECRIPTOR;
187
188typedef struct {
189    UINT8   Type;   // Type == 3
190    UINT8   TRType;
191    UINT8   TRNumber;
192    UINT8   Reserved[5];
193    UINT64  VirtualAddress;
194    UINT64  EncodedPageSize;
195    UINT64  Reserved1;
196} SAL_ST_TR_DECRIPTOR;
197
198typedef struct {
199    UINT64  NumberOfProcessors;
200    UINT64  LocalIDRegister;
201} SAL_COHERENCE_DOMAIN_INFO;
202
203typedef struct {
204    UINT8                       Type;   // Type == 4
205    UINT8                       Reserved[3];
206    UINT32                      NumberOfDomains;
207    SAL_COHERENCE_DOMAIN_INFO  *DomainInformation;
208} SAL_ST_CACHE_COHERENCE_DECRIPTOR;
209
210typedef struct {
211    UINT8   Type;   // Type == 5
212    UINT8   WakeUpType;
213    UINT8   Reserved[6];
214    UINT64  ExternalInterruptVector;
215} SAL_ST_AP_WAKEUP_DECRIPTOR;
216
217typedef struct {
218    SAL_SYSTEM_TABLE_HDR            Header;
219    SAL_ST_ENTRY_POINT_DESCRIPTOR   Entry0;
220} SAL_SYSTEM_TABLE_ASCENDING_ORDER;
221
222#define     FIT_ENTRY_PTR       (0x100000000 - 32)  // 4GB - 24
223#define     FIT_PALA_ENTRY      (0x100000000 - 48)  // 4GB - 32
224#define     FIT_PALB_TYPE       01
225
226typedef struct {
227    UINT64  Address;
228    UINT8   Size[3];
229    UINT8   Reserved;
230    UINT16  Revision;
231    UINT8   Type:7;
232    UINT8   CheckSumValid:1;
233    UINT8   CheckSum;
234} FIT_ENTRY;
235
236#pragma pack()
237
238typedef
239 rArg
240(*CALL_SAL_PROC)(
241    IN  UINT64    Arg1,
242    IN  UINT64    Arg2,
243    IN  UINT64    Arg3,
244    IN  UINT64    Arg4,
245    IN  UINT64    Arg5,
246    IN  UINT64    Arg6,
247    IN  UINT64    Arg7,
248    IN  UINT64    Arg8
249    );
250
251typedef
252 rArg
253(*CALL_PAL_PROC)(
254    IN  UINT64    Arg1,
255    IN  UINT64    Arg2,
256    IN  UINT64    Arg3,
257    IN  UINT64    Arg4
258    );
259
260extern CALL_SAL_PROC   GlobalSalProc;
261extern CALL_PAL_PROC   GlobalPalProc;
262extern PLABEL   SalProcPlabel;
263extern PLABEL   PalProcPlabel;
264
265#endif
266
267