1 /*	$NetBSD: salproc.h,v 1.1.1.1 2014/04/01 16:16:07 jakllsch Exp $	*/
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
23 typedef 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 
33 typedef VOID (*PFN)();
34 typedef rArg (*PFN_SAL_PROC)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
35 typedef rArg (*PFN_SAL_CALLBACK)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
36 
37 typedef struct _PLABEL {
38    UINT64 ProcEntryPoint;
39    UINT64 GP;
40 } PLABEL;
41 
42 typedef 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 
74 VOID EFIInitMsg(VOID);
75 
76 EFI_STATUS
77 PlRegisterAndStartTimer(
78     IN UINTN Period
79     );
80 
81 EFI_STATUS
82 PlDeRegisterAndCancelTimer(VOID);
83 
84 VOID
85 SalProc (
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 
97 VOID
98 SalCallBack (
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 
110 VOID
111 RUNTIMEFUNCTION
112 RtSalCallBack (
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 
125 extern PLABEL   RtGlobalSalProcEntry;
126 extern PLABEL   RtGlobalSALCallBack;
127 
128 #pragma pack(1)
129 //
130 // SAL System Table
131 //
132 typedef 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 
153 typedef 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 
162 typedef 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 
182 typedef struct {
183     UINT8   Type;   // Type == 2
184     UINT8   PlatformFeatures;
185     UINT8   Reserved[14];
186 } SAL_ST_MEMORY_DECRIPTOR;
187 
188 typedef 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 
198 typedef struct {
199     UINT64  NumberOfProcessors;
200     UINT64  LocalIDRegister;
201 } SAL_COHERENCE_DOMAIN_INFO;
202 
203 typedef 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 
210 typedef struct {
211     UINT8   Type;   // Type == 5
212     UINT8   WakeUpType;
213     UINT8   Reserved[6];
214     UINT64  ExternalInterruptVector;
215 } SAL_ST_AP_WAKEUP_DECRIPTOR;
216 
217 typedef 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 
226 typedef 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 
238 typedef
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 
251 typedef
252  rArg
253 (*CALL_PAL_PROC)(
254     IN  UINT64    Arg1,
255     IN  UINT64    Arg2,
256     IN  UINT64    Arg3,
257     IN  UINT64    Arg4
258     );
259 
260 extern CALL_SAL_PROC   GlobalSalProc;
261 extern CALL_PAL_PROC   GlobalPalProc;
262 extern PLABEL   SalProcPlabel;
263 extern PLABEL   PalProcPlabel;
264 
265 #endif
266 
267