efi_stub.c revision 119880
1110211Smarcel/*
2110211Smarcel * Copyright (c) 2003 Marcel Moolenaar
3110211Smarcel * All rights reserved.
4110211Smarcel *
5110211Smarcel * Redistribution and use in source and binary forms, with or without
6110211Smarcel * modification, are permitted provided that the following conditions
7110211Smarcel * are met:
8110211Smarcel *
9110211Smarcel * 1. Redistributions of source code must retain the above copyright
10110211Smarcel *    notice, this list of conditions and the following disclaimer.
11110211Smarcel * 2. Redistributions in binary form must reproduce the above copyright
12110211Smarcel *    notice, this list of conditions and the following disclaimer in the
13110211Smarcel *    documentation and/or other materials provided with the distribution.
14110211Smarcel *
15110211Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16110211Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17110211Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18110211Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19110211Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20110211Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21110211Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22110211Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23110211Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24110211Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25110211Smarcel */
26110211Smarcel
27119880Sobrien#include <sys/cdefs.h>
28119880Sobrien__FBSDID("$FreeBSD: head/sys/boot/ia64/ski/efi_stub.c 119880 2003-09-08 09:11:32Z obrien $");
29119880Sobrien
30110211Smarcel#include <sys/types.h>
31110211Smarcel#include <machine/bootinfo.h>
32110211Smarcel#include <efi.h>
33110211Smarcel#include <stand.h>
34110211Smarcel#include "libski.h"
35110211Smarcel
36110211Smarcelextern void acpi_root;
37110211Smarcelextern void sal_systab;
38110211Smarcel
39110211Smarcelextern void acpi_stub_init(void);
40110211Smarcelextern void sal_stub_init(void);
41110211Smarcel
42110211SmarcelEFI_CONFIGURATION_TABLE efi_cfgtab[] = {
43110211Smarcel	{ ACPI_20_TABLE_GUID,		&acpi_root },
44110211Smarcel	{ SAL_SYSTEM_TABLE_GUID,	&sal_systab }
45110211Smarcel};
46110211Smarcel
47110211Smarcel
48110211Smarcelstatic EFI_STATUS GetTime(EFI_TIME *, EFI_TIME_CAPABILITIES *);
49110211Smarcelstatic EFI_STATUS SetTime(EFI_TIME *);
50110211Smarcelstatic EFI_STATUS GetWakeupTime(BOOLEAN *, BOOLEAN *, EFI_TIME *);
51110211Smarcelstatic EFI_STATUS SetWakeupTime(BOOLEAN, EFI_TIME *);
52110211Smarcel
53110211Smarcelstatic EFI_STATUS SetVirtualAddressMap(UINTN, UINTN, UINT32,
54110211Smarcel    EFI_MEMORY_DESCRIPTOR*);
55110211Smarcelstatic EFI_STATUS ConvertPointer(UINTN, VOID **);
56110211Smarcel
57110211Smarcelstatic EFI_STATUS GetVariable(CHAR16 *, EFI_GUID *, UINT32 *, UINTN *, VOID *);
58110211Smarcelstatic EFI_STATUS GetNextVariableName(UINTN *, CHAR16 *, EFI_GUID *);
59110211Smarcelstatic EFI_STATUS SetVariable(CHAR16 *, EFI_GUID *, UINT32, UINTN, VOID *);
60110211Smarcel
61110211Smarcelstatic EFI_STATUS GetNextHighMonotonicCount(UINT32 *);
62110211Smarcelstatic EFI_STATUS ResetSystem(EFI_RESET_TYPE, EFI_STATUS, UINTN, CHAR16 *);
63110211Smarcel
64110211SmarcelEFI_RUNTIME_SERVICES efi_rttab = {
65110211Smarcel	/* Header. */
66110211Smarcel	{	EFI_RUNTIME_SERVICES_SIGNATURE,
67110211Smarcel		EFI_RUNTIME_SERVICES_REVISION,
68110211Smarcel		0,			/* XXX HeaderSize */
69110211Smarcel		0,			/* XXX CRC32 */
70110211Smarcel	},
71110211Smarcel
72110211Smarcel	/* Time services */
73110211Smarcel	GetTime,
74110211Smarcel	SetTime,
75110211Smarcel	GetWakeupTime,
76110211Smarcel	SetWakeupTime,
77110211Smarcel
78110211Smarcel	/* Virtual memory services */
79110211Smarcel	SetVirtualAddressMap,
80110211Smarcel	ConvertPointer,
81110211Smarcel
82110211Smarcel	/* Variable services */
83110211Smarcel	GetVariable,
84110211Smarcel	GetNextVariableName,
85110211Smarcel	SetVariable,
86110211Smarcel
87110211Smarcel	/* Misc */
88110211Smarcel	GetNextHighMonotonicCount,
89110211Smarcel	ResetSystem
90110211Smarcel};
91110211Smarcel
92110211SmarcelEFI_SYSTEM_TABLE efi_systab = {
93110211Smarcel	/* Header. */
94110211Smarcel	{	EFI_SYSTEM_TABLE_SIGNATURE,
95110211Smarcel		EFI_SYSTEM_TABLE_REVISION,
96110211Smarcel		0,	/* XXX HeaderSize */
97110211Smarcel		0,	/* XXX CRC32 */
98110211Smarcel	},
99110211Smarcel
100110211Smarcel	/* Firmware info. */
101110211Smarcel	L"FreeBSD", 0,
102110211Smarcel
103110211Smarcel	/* Console stuff. */
104110211Smarcel	NULL, NULL,
105110211Smarcel	NULL, NULL,
106110211Smarcel	NULL, NULL,
107110211Smarcel
108110211Smarcel	/* Services (runtime first). */
109110211Smarcel	&efi_rttab,
110110211Smarcel	NULL,
111110211Smarcel
112110211Smarcel	/* Configuration tables. */
113110211Smarcel	sizeof(efi_cfgtab)/sizeof(EFI_CONFIGURATION_TABLE),
114110211Smarcel	efi_cfgtab
115110211Smarcel};
116110211Smarcel
117110211Smarcelstatic EFI_STATUS
118110211Smarcelunsupported(const char *func)
119110211Smarcel{
120110211Smarcel	printf("EFI: %s not supported\n", func);
121110211Smarcel	return (EFI_UNSUPPORTED);
122110211Smarcel}
123110211Smarcel
124110211Smarcelstatic EFI_STATUS
125110211SmarcelGetTime(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps)
126110211Smarcel{
127110211Smarcel	UINT32 comps[8];
128110211Smarcel
129110211Smarcel	ssc((UINT64)comps, 0, 0, 0, SSC_GET_RTC);
130110211Smarcel	time->Year = comps[0] + 1900;
131110211Smarcel	time->Month = comps[1] + 1;
132110211Smarcel	time->Day = comps[2];
133110211Smarcel	time->Hour = comps[3];
134110211Smarcel	time->Minute = comps[4];
135110211Smarcel	time->Second = comps[5];
136110211Smarcel	time->Pad1 = time->Pad2 = 0;
137110211Smarcel	time->Nanosecond = 0;
138110211Smarcel	time->TimeZone = 0;
139110211Smarcel	time->Daylight = 0;
140110211Smarcel	return (EFI_SUCCESS);
141110211Smarcel}
142110211Smarcel
143110211Smarcelstatic EFI_STATUS
144110211SmarcelSetTime(EFI_TIME *time)
145110211Smarcel{
146110211Smarcel	return (EFI_SUCCESS);
147110211Smarcel}
148110211Smarcel
149110211Smarcelstatic EFI_STATUS
150110211SmarcelGetWakeupTime(BOOLEAN *enabled, BOOLEAN *pending, EFI_TIME *time)
151110211Smarcel{
152110211Smarcel	return (unsupported(__func__));
153110211Smarcel}
154110211Smarcel
155110211Smarcelstatic EFI_STATUS
156110211SmarcelSetWakeupTime(BOOLEAN enable, EFI_TIME *time)
157110211Smarcel{
158110211Smarcel	return (unsupported(__func__));
159110211Smarcel}
160110211Smarcel
161110211Smarcelstatic void
162110211SmarcelReloc(void *addr, UINT64 delta)
163110211Smarcel{
164110211Smarcel	UINT64 **fpp = addr;
165110211Smarcel
166110211Smarcel	*fpp[0] += delta;
167110211Smarcel	*fpp[1] += delta;
168110211Smarcel	*fpp += delta >> 3;
169110211Smarcel}
170110211Smarcel
171110211Smarcelstatic EFI_STATUS
172110211SmarcelSetVirtualAddressMap(UINTN mapsz, UINTN descsz, UINT32 version,
173110211Smarcel    EFI_MEMORY_DESCRIPTOR *memmap)
174110211Smarcel{
175110211Smarcel	UINT64 delta;
176110211Smarcel
177110211Smarcel	delta = memmap->VirtualStart - memmap->PhysicalStart;
178110211Smarcel	Reloc(&efi_rttab.GetTime, delta);
179110211Smarcel	Reloc(&efi_rttab.SetTime, delta);
180110211Smarcel	return (EFI_SUCCESS);		/* Hah... */
181110211Smarcel}
182110211Smarcel
183110211Smarcelstatic EFI_STATUS
184110211SmarcelConvertPointer(UINTN debug, VOID **addr)
185110211Smarcel{
186110211Smarcel	return (unsupported(__func__));
187110211Smarcel}
188110211Smarcel
189110211Smarcelstatic EFI_STATUS
190110211SmarcelGetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 *attrs, UINTN *datasz,
191110211Smarcel    VOID *data)
192110211Smarcel{
193110211Smarcel	return (unsupported(__func__));
194110211Smarcel}
195110211Smarcel
196110211Smarcelstatic EFI_STATUS
197110211SmarcelGetNextVariableName(UINTN *namesz, CHAR16 *name, EFI_GUID *vendor)
198110211Smarcel{
199110211Smarcel	return (unsupported(__func__));
200110211Smarcel}
201110211Smarcel
202110211Smarcelstatic EFI_STATUS
203110211SmarcelSetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 attrs, UINTN datasz,
204110211Smarcel    VOID *data)
205110211Smarcel{
206110211Smarcel	return (unsupported(__func__));
207110211Smarcel}
208110211Smarcel
209110211Smarcelstatic EFI_STATUS
210110211SmarcelGetNextHighMonotonicCount(UINT32 *high)
211110211Smarcel{
212110211Smarcel	static UINT32 counter = 0;
213110211Smarcel
214110211Smarcel	*high = counter++;
215110211Smarcel	return (EFI_SUCCESS);
216110211Smarcel}
217110211Smarcel
218110211Smarcelstatic EFI_STATUS
219110211SmarcelResetSystem(EFI_RESET_TYPE type, EFI_STATUS status, UINTN datasz,
220110211Smarcel    CHAR16 *data)
221110211Smarcel{
222110211Smarcel	return (unsupported(__func__));
223110211Smarcel}
224110211Smarcel
225110211Smarcelint
226110211Smarcelski_init_stubs(struct bootinfo *bi)
227110211Smarcel{
228110211Smarcel	EFI_MEMORY_DESCRIPTOR *memp;
229110211Smarcel
230110211Smarcel	/* Describe the SKI memory map. */
231110211Smarcel	bi->bi_memmap = (u_int64_t)(bi + 1);
232110211Smarcel	bi->bi_memmap_size = 4 * sizeof(EFI_MEMORY_DESCRIPTOR);
233110211Smarcel	bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR);
234110211Smarcel	bi->bi_memdesc_version = 1;
235110211Smarcel
236110211Smarcel	memp = (EFI_MEMORY_DESCRIPTOR *)bi->bi_memmap;
237110211Smarcel
238110211Smarcel	memp[0].Type = EfiPalCode;
239110211Smarcel	memp[0].PhysicalStart = 0x100000;
240110211Smarcel	memp[0].VirtualStart = 0;
241110211Smarcel	memp[0].NumberOfPages = (4L*1024*1024)>>12;
242110211Smarcel	memp[0].Attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME;
243110211Smarcel
244110211Smarcel	memp[1].Type = EfiConventionalMemory;
245110211Smarcel	memp[1].PhysicalStart = 5L*1024*1024;
246110211Smarcel	memp[1].VirtualStart = 0;
247110211Smarcel	memp[1].NumberOfPages = (128L*1024*1024)>>12;
248110211Smarcel	memp[1].Attribute = EFI_MEMORY_WB;
249110211Smarcel
250110211Smarcel	memp[2].Type = EfiConventionalMemory;
251110211Smarcel	memp[2].PhysicalStart = 4L*1024*1024*1024;
252110211Smarcel	memp[2].VirtualStart = 0;
253110211Smarcel	memp[2].NumberOfPages = (64L*1024*1024)>>12;
254110211Smarcel	memp[2].Attribute = EFI_MEMORY_WB;
255110211Smarcel
256110211Smarcel	memp[3].Type = EfiMemoryMappedIOPortSpace;
257110211Smarcel	memp[3].PhysicalStart = 0xffffc000000;
258110211Smarcel	memp[3].VirtualStart = 0;
259110211Smarcel	memp[3].NumberOfPages = (64L*1024*1024)>>12;
260110211Smarcel	memp[3].Attribute = EFI_MEMORY_UC;
261110211Smarcel
262110211Smarcel	bi->bi_systab = (u_int64_t)&efi_systab;
263110211Smarcel
264110211Smarcel	sal_stub_init();
265110211Smarcel	acpi_stub_init();
266110211Smarcel
267110211Smarcel	return (0);
268110211Smarcel}
269