3 * Copyright (C) 2008 Advanced Micro Devices, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * @section intro Introduction
33 * libpayload is a small BSD-licensed static library (a lightweight
34 * implementation of common and useful functions) intended to be used
35 * as a basis for coreboot payloads.
37 * @section example Example
38 * Here is an example of a very simple payload:
39 * @include sample/hello.c
46 #include <libpayload-config.h>
49 #include <commonlib/helpers.h>
51 #include <commonlib/bsd/helpers.h>
53 #include <commonlib/bsd/elog.h>
54 #include <commonlib/bsd/fmap_serialized.h>
55 #include <commonlib/bsd/ipchksum.h>
56 #include <commonlib/bsd/mem_chip_info.h>
68 #include <sys/types.h>
69 #include <arch/types.h>
71 #include <arch/virtual.h>
77 #define BIT(x) (1ul << (x))
79 static inline u32
div_round_up(u32 n
, u32 d
) { return (n
+ d
- 1) / d
; }
81 #define LITTLE_ENDIAN 1234
82 #define BIG_ENDIAN 4321
84 #define EXIT_SUCCESS 0
85 #define EXIT_FAILURE 1
87 #define RAND_MAX 0x7fffffff
89 #define MAX_ARGC_COUNT 32
92 * @defgroup nvram NVRAM and RTC functions
96 #define NVRAM_RTC_SECONDS 0 /**< RTC Seconds offset in CMOS */
97 #define NVRAM_RTC_MINUTES 2 /**< RTC Minutes offset in CMOS */
98 #define NVRAM_RTC_HOURS 4 /**< RTC Hours offset in CMOS */
99 #define NVRAM_RTC_DAY 7 /**< RTC Days offset in CMOS */
100 #define NVRAM_RTC_MONTH 8 /**< RTC Month offset in CMOS */
101 #define NVRAM_RTC_YEAR 9 /**< RTC Year offset in CMOS */
102 #define NVRAM_RTC_FREQ_SELECT 10 /**< RTC Update Status Register */
103 #define NVRAM_RTC_UIP 0x80
104 #define NVRAM_RTC_STATUSB 11 /**< RTC Status Register B */
105 #define NVRAM_RTC_FORMAT_24HOUR 0x02
106 #define NVRAM_RTC_FORMAT_BINARY 0x04
108 /** Broken down time structure */
110 int tm_sec
; /**< Number of seconds after the minute */
111 int tm_min
; /**< Number of minutes after the hour */
112 int tm_hour
; /**< Number of hours past midnight */
113 int tm_mday
; /**< The day of the month */
114 int tm_mon
; /**< The month of the year */
115 int tm_year
; /**< The number of years since 1900 */
116 int tm_wday
; /**< The day of the week */
117 int tm_yday
; /**< The number of days since January 1 */
118 int tm_isdst
; /**< A flag indicating daylight savings time */
121 u8
nvram_read(u8 addr
);
122 void nvram_write(u8 val
, u8 addr
);
123 int nvram_updating(void);
124 void rtc_read_clock(struct tm
*tm
);
125 void rtc_write_clock(const struct tm
*tm
);
129 * @defgroup storage driver functions
132 void storage_initialize(void);
136 * @defgroup usb USB functions
139 int usb_initialize(void);
141 int usbhid_havechar(void);
142 int usbhid_getchar(void);
143 int usbhid_getmodifiers(void);
147 * @defgroup input Device functions
151 extern void (*reset_handler
)(void);
152 int add_reset_handler(void (*new_handler
)(void));
155 * @defgroup keyboard Keyboard functions
159 void keyboard_init(void);
160 void keyboard_disconnect(void);
161 bool keyboard_havechar(void);
162 unsigned char keyboard_get_scancode(void);
163 int keyboard_getchar(void);
164 int keyboard_set_layout(char *country
);
165 int keyboard_getmodifier(void);
166 void initialize_keyboard_media_key_mapping_callback(int (*media_key_mapper
)(char));
168 enum KEYBOARD_MODIFIERS
{
169 KB_MOD_SHIFT
= (1 << 0),
170 KB_MOD_ALT
= (1 << 1),
171 KB_MOD_CTRL
= (1 << 2),
172 KB_MOD_CAPSLOCK
= (1 << 3),
177 * @defgroup mouse Mouse cursor functions
181 void mouse_cursor_poll(void);
182 void mouse_cursor_get_rel(int *x
, int *y
, int *z
);
183 u32
mouse_cursor_get_buttons(void);
184 void mouse_cursor_set_speed(u32 val
);
185 u32
mouse_cursor_get_speed(void);
186 void mouse_cursor_set_acceleration(u8 val
);
187 u8
mouse_cursor_get_acceleration(void);
191 * @defgroup i8042 controller functions
195 size_t i8042_has_ps2(void);
196 size_t i8042_has_aux(void);
198 u8
i8042_probe(void);
199 void i8042_close(void);
201 int i8042_cmd(u8 cmd
);
202 void i8042_write_data(u8 data
);
204 u8
i8042_data_ready_ps2(void);
205 u8
i8042_data_ready_aux(void);
207 u8
i8042_read_data_ps2(void);
208 u8
i8042_peek_data_ps2(void);
209 u8
i8042_read_data_aux(void);
211 int i8042_wait_read_ps2(void);
212 int i8042_wait_read_aux(void);
214 int i8042_get_kbd_translation(void);
215 int i8042_set_kbd_translation(bool xlate
);
220 * @defgroup i8042 PS2 Mouse functions
224 void i8042_mouse_init(void);
225 void i8042_mouse_disconnect(void);
229 * @defgroup serial Serial functions
233 void serial_init(void);
234 void serial_console_init(void);
235 void serial_putchar(unsigned int c
);
236 int serial_havechar(void);
237 int serial_getchar(void);
238 void serial_clear(void);
239 void serial_start_bold(void);
240 void serial_end_bold(void);
241 void serial_start_reverse(void);
242 void serial_end_reverse(void);
243 void serial_start_altcharset(void);
244 void serial_end_altcharset(void);
245 void serial_set_color(short fg
, short bg
);
246 void serial_cursor_enable(int state
);
247 void serial_set_cursor(int y
, int x
);
251 * @defgroup speaker Speaker functions
255 void speaker_enable(u16 freq
);
256 void speaker_disable(void);
257 void speaker_tone(u16 freq
, unsigned int duration
);
261 * @defgroup video Video functions
265 int video_init(void);
266 int video_console_init(void);
267 void video_get_rows_cols(unsigned int *rows
, unsigned int *cols
);
268 void video_console_putchar(unsigned int ch
);
269 void video_console_putc(u8 row
, u8 col
, unsigned int ch
);
270 void video_console_clear(void);
271 void video_console_cursor_enable(int state
);
272 void video_console_get_cursor(unsigned int *x
, unsigned int *y
, unsigned int *en
);
273 void video_console_set_cursor(unsigned int cursorx
, unsigned int cursory
);
274 void video_console_move_cursor(int x
, int y
);
276 * print characters on video console with colors. note that there is a size
277 * restriction for the internal buffer. so, output string can be truncated.
279 enum video_printf_align
{
280 VIDEO_PRINTF_ALIGN_KEEP
= 0,
281 VIDEO_PRINTF_ALIGN_LEFT
,
282 VIDEO_PRINTF_ALIGN_CENTER
,
283 VIDEO_PRINTF_ALIGN_RIGHT
,
285 void video_printf(int foreground
, int background
, enum video_printf_align align
,
286 const char *fmt
, ...);
290 * @defgroup cbmem_console CBMEM memory console.
294 void cbmem_console_init(void);
295 void cbmem_console_write(const void *buffer
, size_t count
);
297 * Take a snapshot of the CBMEM memory console. This function will allocate a
298 * range of memory. Callers must free the returned buffer by themselves.
300 * @return The allocated buffer on success, NULL on failure.
302 char *cbmem_console_snapshot(void);
305 /* drivers/option.c */
306 struct nvram_accessor
{
308 void (*write
)(u8 val
, u8 reg
);
311 extern u8
*mem_accessor_base
;
312 extern struct nvram_accessor
*use_nvram
, *use_mem
;
314 struct cb_cmos_option_table
*get_system_option_table(void);
315 int options_checksum_valid(const struct nvram_accessor
*nvram
);
316 void fix_options_checksum_with(const struct nvram_accessor
*nvram
);
317 void fix_options_checksum(void);
319 struct cb_cmos_entries
*first_cmos_entry(struct cb_cmos_option_table
*option_table
);
320 struct cb_cmos_entries
*next_cmos_entry(struct cb_cmos_entries
*cur
);
322 struct cb_cmos_enums
*first_cmos_enum(struct cb_cmos_option_table
*option_table
);
323 struct cb_cmos_enums
*next_cmos_enum(struct cb_cmos_enums
*cmos_enum
);
324 struct cb_cmos_enums
*first_cmos_enum_of_id(struct cb_cmos_option_table
*option_table
, int id
);
325 struct cb_cmos_enums
*next_cmos_enum_of_id(struct cb_cmos_enums
*cmos_enum
, int id
);
327 int get_option_with(const struct nvram_accessor
*nvram
, struct cb_cmos_option_table
*option_table
, void *dest
, const char *name
);
328 int get_option_from(struct cb_cmos_option_table
*option_table
, void *dest
, const char *name
);
329 int get_option(void *dest
, const char *name
);
330 int set_option_with(const struct nvram_accessor
*nvram
, struct cb_cmos_option_table
*option_table
, const void *value
, const char *name
);
331 int set_option(const void *value
, const char *name
);
332 int get_option_as_string(const struct nvram_accessor
*nvram
, struct cb_cmos_option_table
*option_table
, char **dest
, const char *name
);
333 int set_option_from_string(const struct nvram_accessor
*nvram
, struct cb_cmos_option_table
*option_table
, const char *value
, const char *name
);
336 * @defgroup console Console functions
340 CONSOLE_INPUT_TYPE_UNKNOWN
= 0,
341 CONSOLE_INPUT_TYPE_USB
,
342 CONSOLE_INPUT_TYPE_EC
,
343 CONSOLE_INPUT_TYPE_UART
,
344 CONSOLE_INPUT_TYPE_GPIO
,
345 } console_input_type
;
347 void console_init(void);
348 void console_write(const void *buffer
, size_t count
);
349 int putchar(unsigned int c
);
350 int puts(const char *s
);
353 int getchar_timeout(int *ms
);
354 console_input_type
last_key_input_type(void);
356 extern int last_putchar
;
358 struct console_input_driver
;
359 struct console_input_driver
{
360 struct console_input_driver
*next
;
361 int (*havekey
) (void);
362 int (*getchar
) (void);
363 console_input_type input_type
;
366 struct console_output_driver
;
367 struct console_output_driver
{
368 struct console_output_driver
*next
;
369 void (*putchar
) (unsigned int);
370 void (*write
) (const void *, size_t);
373 void console_add_output_driver(struct console_output_driver
*out
);
374 void console_add_input_driver(struct console_input_driver
*in
);
375 int console_remove_output_driver(void *function
);
377 #define havechar havekey
381 * @defgroup mouse_cursor Mouse cursor functions
385 CURSOR_INPUT_TYPE_UNKNOWN
= 0,
386 CURSOR_INPUT_TYPE_USB
,
387 CURSOR_INPUT_TYPE_PS2
,
390 void mouse_cursor_init(void);
392 struct mouse_cursor_input_driver
;
393 struct mouse_cursor_input_driver
{
394 struct mouse_cursor_input_driver
*next
;
395 /* X,Y,Z axis and buttons */
396 void (*get_state
)(int *, int *, int *, u32
*);
397 cursor_input_type input_type
;
400 void mouse_cursor_add_input_driver(struct mouse_cursor_input_driver
*in
);
405 * @defgroup exec Execution functions
408 int exec(long addr
, int argc
, char **argv
);
411 * reboot() handles reboot requests made by libpayload. It has weak implementation
412 * which should be overridden by payload.
414 void __noreturn
reboot(void);
419 * @defgroup misc Misc functions
426 void hexdump(const void *memory
, size_t length
);
427 void fatal(const char *msg
) __attribute__((noreturn
));
429 /* Population Count: number of bits that are one */
430 static inline int popcnt(u32 x
) { return __builtin_popcount(x
); }
431 /* Count Leading Zeroes: clz(0) == 32, clz(0xf) == 28, clz(1 << 31) == 0 */
432 static inline int clz(u32 x
)
434 return x
? __builtin_clz(x
) : (int)sizeof(x
) * 8;
436 /* Integer binary logarithm (rounding down): log2(0) == -1, log2(5) == 2 */
437 static inline int log2(u32 x
) { return (int)sizeof(x
) * 8 - clz(x
) - 1; }
438 /* Find First Set: __ffs(0xf) == 0, __ffs(0) == -1, __ffs(1 << 31) == 31 */
439 static inline int __ffs(u32 x
) { return log2(x
& (u32
)(-(s32
)x
)); }
440 /* Find Last Set: __fls(1) == 0, __fls(5) == 2, __fls(1 << 31) == 31 */
441 static inline int __fls(u32 x
) { return log2(x
); }
443 static inline int popcnt64(u64 x
) { return __builtin_popcountll(x
); }
444 static inline int clz64(u64 x
)
446 return x
? __builtin_clzll(x
) : sizeof(x
) * 8;
449 static inline int log2_64(u64 x
) { return sizeof(x
) * 8 - clz64(x
) - 1; }
450 static inline int __ffs64(u64 x
) { return log2_64(x
& (u64
)(-(s64
)x
)); }
451 static inline int __fls64(u64 x
) { return log2_64(x
); }
455 * @defgroup mmio MMIO helper functions
458 void buffer_from_fifo32(void *buffer
, size_t size
, void *fifo
,
459 int fifo_stride
, int fifo_width
);
460 void buffer_to_fifo32_prefix(const void *buffer
, u32 prefix
, int prefsz
, size_t size
,
461 void *fifo
, int fifo_stride
, int fifo_width
);
462 static inline void buffer_to_fifo32(const void *buffer
, size_t size
, void *fifo
,
463 int fifo_stride
, int fifo_width
)
465 buffer_to_fifo32_prefix(buffer
, 0, 0, size
, fifo
,
466 fifo_stride
, fifo_width
);
471 * @defgroup hash Hashing functions
474 #define SHA1_BLOCK_LENGTH 64
475 #define SHA1_DIGEST_LENGTH 20
479 u8 buffer
[SHA1_BLOCK_LENGTH
];
481 void SHA1Init(SHA1_CTX
*context
);
482 void SHA1Transform(u32 state
[5], const u8 buffer
[SHA1_BLOCK_LENGTH
]);
483 void SHA1Update(SHA1_CTX
*context
, const u8
*data
, size_t len
);
484 void SHA1Pad(SHA1_CTX
*context
);
485 void SHA1Final(u8 digest
[SHA1_DIGEST_LENGTH
], SHA1_CTX
*context
);
486 u8
*sha1(const u8
*data
, size_t len
, u8
*buf
);
490 * @defgroup info System information functions
491 * This module contains functions that return information about the system
495 int sysinfo_have_multiboot(unsigned long *addr
);
499 * @defgroup arch Architecture specific functions
500 * This module contains global architecture specific functions.
501 * All architectures are expected to define these functions.
504 int get_coreboot_info(struct sysinfo_t
*info
);
505 int get_multiboot_info(struct sysinfo_t
*info
);
506 void *get_cb_header_ptr(void);
508 int lib_get_sysinfo(void);
509 void lib_sysinfo_get_memranges(struct memrange
**ranges
,
512 /* Timer functions. */
513 /* Defined by each architecture. */
514 uint64_t timer_hz(void);
515 uint64_t timer_raw_value(void);
516 uint64_t timer_us(uint64_t base
);
520 * @defgroup readline Readline functions
521 * This interface provides a simple implementation of the standard readline()
522 * and getline() functions. They read a line of input from the console.
525 char *readline(const char *prompt
);
526 int getline(char *buffer
, int len
);
529 /* Defined in arch/${ARCH}/selfboot.c */
530 void selfboot(void *entry
);
532 /* Enter remote GDB mode. Will initialize connection if not already up. */
533 void gdb_enter(void);
534 /* Disconnect existing GDB connection if one exists. */
535 void gdb_exit(s8 exit_status
);
537 void __noreturn
halt(void);
538 #if CONFIG(LP_REMOTEGDB)
539 /* Override abort()/halt() to trap into GDB if it is enabled. */
540 #define halt() do { gdb_enter(); halt(); } while (0)