mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-27 22:56:49 +08:00
Pull request efi-2023-04-rc1-3
Documentation: * Improve the sl-mx8mm documenation * Clean up README, move some section to HTML * Man-pages for the mtime and sleep command * Description of reducible builds * Document dynamic event handlers UEFI: * Support scrolling in eficonfig command Other: * fix mtest on 64 bit systems -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEbcT5xx8ppvoGt20zxIHbvCwFGsQFAmPUIOwACgkQxIHbvCwF GsR+txAAhrFDZcQrXpdtaP0ywx6T7zdrbEjYItywDTY2Luun9EAcLI/UUbBwQjxL Mumou2umY1ff+HqV8eCYA9UyVm5ztg8vpJo4oDMiUlS5o4dHLSJ1CUvsl4r25I8J NfGyE/iyRyHhDanjGo1gGnRbeXnz4pigtEXa9XOcaSlFezV2UeXWw8LWSo0iTQK+ 94+yJsCe+ZIOfpRX20trPb2VtbDPWHIjo+cb+HG3xdgUvL5kUZR/9NvG3npshJBy lcclRHc2jL405GGuZGtzKDNigkLBQn1NhA8NluD+SATXQnWdg2zMyc15D6UV2V3u 82N33eNr/vobRtvt5cSVm7IP91PFAxNkA/rPRTShOluSa5MCZSDBF8esKOv1OngK HQLHEvV80H6qU6cWsG1L7INc2kSTRO71vDcsASnfh4gGTHwczOUUEo3oeiaEy5HA m6U02ymVdtXWuzA0XbrhbjGXHUp9TthdZT2UKDxGFrfPFO+gEtyVeINTBYgNkopc inqHdV0eDyTVl24TcimVoEEt/16W9MYa9K+hu0FLHshRR0mpRDlhC058SwRseZCL 6qfuqmF5W0y5vFTWXPAiN1HmyusklTl3XIMrV/LX1bKJBZdOB71V+9OMbRirqiWS a7H05IPYili4l/1iSEoPRsxTP+rWcXKP21AAjIk1CtXW9OeOu8w= =FY9O -----END PGP SIGNATURE----- Merge tag 'efi-2023-04-rc1-3' of https://source.denx.de/u-boot/custodians/u-boot-efi Pull request efi-2023-04-rc1-3 Documentation: * Improve the sl-mx8mm documenation * Clean up README, move some section to HTML * Man-pages for the mtime and sleep command * Description of reducible builds * Document dynamic event handlers UEFI: * Support scrolling in eficonfig command Other: * fix mtest on 64 bit systems
This commit is contained in:
commit
aa7c61f629
296
README
296
README
@ -28,20 +28,16 @@ load and run it dynamically.
|
||||
Status:
|
||||
=======
|
||||
|
||||
In general, all boards for which a configuration option exists in the
|
||||
Makefile have been tested to some extent and can be considered
|
||||
In general, all boards for which a default configuration file exists in the
|
||||
configs/ directory have been tested to some extent and can be considered
|
||||
"working". In fact, many of them are used in production systems.
|
||||
|
||||
In case of problems see the CHANGELOG file to find out who contributed
|
||||
the specific port. In addition, there are various MAINTAINERS files
|
||||
scattered throughout the U-Boot source identifying the people or
|
||||
companies responsible for various boards and subsystems.
|
||||
In case of problems you can use
|
||||
|
||||
Note: As of August, 2010, there is no longer a CHANGELOG file in the
|
||||
actual U-Boot source tree; however, it can be created dynamically
|
||||
from the Git log using:
|
||||
scripts/get_maintainer.pl <path>
|
||||
|
||||
make CHANGELOG
|
||||
to identify the people or companies responsible for various boards and
|
||||
subsystems. Or have a look at the git log.
|
||||
|
||||
|
||||
Where to get help:
|
||||
@ -109,60 +105,6 @@ the string "u_boot" or on "U_BOOT". Example:
|
||||
IH_OS_U_BOOT u_boot_hush_start
|
||||
|
||||
|
||||
Versioning:
|
||||
===========
|
||||
|
||||
Starting with the release in October 2008, the names of the releases
|
||||
were changed from numerical release numbers without deeper meaning
|
||||
into a time stamp based numbering. Regular releases are identified by
|
||||
names consisting of the calendar year and month of the release date.
|
||||
Additional fields (if present) indicate release candidates or bug fix
|
||||
releases in "stable" maintenance trees.
|
||||
|
||||
Examples:
|
||||
U-Boot v2009.11 - Release November 2009
|
||||
U-Boot v2009.11.1 - Release 1 in version November 2009 stable tree
|
||||
U-Boot v2010.09-rc1 - Release candidate 1 for September 2010 release
|
||||
|
||||
|
||||
Directory Hierarchy:
|
||||
====================
|
||||
|
||||
/arch Architecture-specific files
|
||||
/arc Files generic to ARC architecture
|
||||
/arm Files generic to ARM architecture
|
||||
/m68k Files generic to m68k architecture
|
||||
/microblaze Files generic to microblaze architecture
|
||||
/mips Files generic to MIPS architecture
|
||||
/nios2 Files generic to Altera NIOS2 architecture
|
||||
/powerpc Files generic to PowerPC architecture
|
||||
/riscv Files generic to RISC-V architecture
|
||||
/sandbox Files generic to HW-independent "sandbox"
|
||||
/sh Files generic to SH architecture
|
||||
/x86 Files generic to x86 architecture
|
||||
/xtensa Files generic to Xtensa architecture
|
||||
/api Machine/arch-independent API for external apps
|
||||
/board Board-dependent files
|
||||
/boot Support for images and booting
|
||||
/cmd U-Boot commands functions
|
||||
/common Misc architecture-independent functions
|
||||
/configs Board default configuration files
|
||||
/disk Code for disk drive partition handling
|
||||
/doc Documentation (a mix of ReST and READMEs)
|
||||
/drivers Device drivers
|
||||
/dts Makefile for building internal U-Boot fdt.
|
||||
/env Environment support
|
||||
/examples Example code for standalone applications, etc.
|
||||
/fs Filesystem code (cramfs, ext2, jffs2, etc.)
|
||||
/include Header Files
|
||||
/lib Library routines generic to all architectures
|
||||
/Licenses Various license files
|
||||
/net Networking code
|
||||
/post Power On Self Test
|
||||
/scripts Various build scripts and Makefiles
|
||||
/test Various unit test files
|
||||
/tools Tools to build and sign FIT images, etc.
|
||||
|
||||
Software Configuration:
|
||||
=======================
|
||||
|
||||
@ -189,7 +131,7 @@ board. This allows feature development which is not board- or architecture-
|
||||
specific to be undertaken on a native platform. The sandbox is also used to
|
||||
run some of U-Boot's tests.
|
||||
|
||||
See doc/arch/sandbox.rst for more details.
|
||||
See doc/arch/sandbox/sandbox.rst for more details.
|
||||
|
||||
|
||||
Board Initialisation Flow:
|
||||
@ -1717,17 +1659,6 @@ This firmware often needs to be loaded during U-Boot booting.
|
||||
- CONFIG_SYS_MC_RSV_MEM_ALIGN
|
||||
Define alignment of reserved memory MC requires
|
||||
|
||||
Reproducible builds
|
||||
-------------------
|
||||
|
||||
In order to achieve reproducible builds, timestamps used in the U-Boot build
|
||||
process have to be set to a fixed value.
|
||||
|
||||
This is done using the SOURCE_DATE_EPOCH environment variable.
|
||||
SOURCE_DATE_EPOCH is to be set on the build host's shell, not as a configuration
|
||||
option for U-Boot or an environment variable in U-Boot.
|
||||
|
||||
SOURCE_DATE_EPOCH should be set to a number of seconds since the epoch, in UTC.
|
||||
|
||||
Building the Software:
|
||||
======================
|
||||
@ -2526,35 +2457,6 @@ configuration to your "File transfer protocols" section:
|
||||
Y kermit /usr/bin/kermit -i -l %l -r N D Y N N
|
||||
|
||||
|
||||
NetBSD Notes:
|
||||
=============
|
||||
|
||||
Starting at version 0.9.2, U-Boot supports NetBSD both as host
|
||||
(build U-Boot) and target system (boots NetBSD/mpc8xx).
|
||||
|
||||
Building requires a cross environment; it is known to work on
|
||||
NetBSD/i386 with the cross-powerpc-netbsd-1.3 package (you will also
|
||||
need gmake since the Makefiles are not compatible with BSD make).
|
||||
Note that the cross-powerpc package does not install include files;
|
||||
attempting to build U-Boot will fail because <machine/ansi.h> is
|
||||
missing. This file has to be installed and patched manually:
|
||||
|
||||
# cd /usr/pkg/cross/powerpc-netbsd/include
|
||||
# mkdir powerpc
|
||||
# ln -s powerpc machine
|
||||
# cp /usr/src/sys/arch/powerpc/include/ansi.h powerpc/ansi.h
|
||||
# ${EDIT} powerpc/ansi.h ## must remove __va_list, _BSD_VA_LIST
|
||||
|
||||
Native builds *don't* work due to incompatibilities between native
|
||||
and U-Boot include files.
|
||||
|
||||
Booting assumes that (the first part of) the image booted is a
|
||||
stage-2 loader which in turn loads and then invokes the kernel
|
||||
proper. Loader sources will eventually appear in the NetBSD source
|
||||
tree (probably in sys/arc/mpc8xx/stand/u-boot_stage2/); in the
|
||||
meantime, see ftp://ftp.denx.de/pub/u-boot/ppcboot_stage2.tar.gz
|
||||
|
||||
|
||||
Implementation Internals:
|
||||
=========================
|
||||
|
||||
@ -2788,182 +2690,10 @@ running from ROM, and because the code will have to be relocated to a
|
||||
new address in RAM.
|
||||
|
||||
|
||||
U-Boot Porting Guide:
|
||||
----------------------
|
||||
Contributing
|
||||
============
|
||||
|
||||
[Based on messages by Jerry Van Baren in the U-Boot-Users mailing
|
||||
list, October 2002]
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
sighandler_t no_more_time;
|
||||
|
||||
signal(SIGALRM, no_more_time);
|
||||
alarm(PROJECT_DEADLINE - toSec (3 * WEEK));
|
||||
|
||||
if (available_money > available_manpower) {
|
||||
Pay consultant to port U-Boot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Download latest U-Boot source;
|
||||
|
||||
Subscribe to u-boot mailing list;
|
||||
|
||||
if (clueless)
|
||||
email("Hi, I am new to U-Boot, how do I get started?");
|
||||
|
||||
while (learning) {
|
||||
Read the README file in the top level directory;
|
||||
Read https://www.denx.de/wiki/bin/view/DULG/Manual;
|
||||
Read applicable doc/README.*;
|
||||
Read the source, Luke;
|
||||
/* find . -name "*.[chS]" | xargs grep -i <keyword> */
|
||||
}
|
||||
|
||||
if (available_money > toLocalCurrency ($2500))
|
||||
Buy a BDI3000;
|
||||
else
|
||||
Add a lot of aggravation and time;
|
||||
|
||||
if (a similar board exists) { /* hopefully... */
|
||||
cp -a board/<similar> board/<myboard>
|
||||
cp include/configs/<similar>.h include/configs/<myboard>.h
|
||||
} else {
|
||||
Create your own board support subdirectory;
|
||||
Create your own board include/configs/<myboard>.h file;
|
||||
}
|
||||
Edit new board/<myboard> files
|
||||
Edit new include/configs/<myboard>.h
|
||||
|
||||
while (!accepted) {
|
||||
while (!running) {
|
||||
do {
|
||||
Add / modify source code;
|
||||
} until (compiles);
|
||||
Debug;
|
||||
if (clueless)
|
||||
email("Hi, I am having problems...");
|
||||
}
|
||||
Send patch file to the U-Boot email list;
|
||||
if (reasonable critiques)
|
||||
Incorporate improvements from email list code review;
|
||||
else
|
||||
Defend code as written;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void no_more_time (int sig)
|
||||
{
|
||||
hire_a_guru();
|
||||
}
|
||||
|
||||
|
||||
Coding Standards:
|
||||
-----------------
|
||||
|
||||
All contributions to U-Boot should conform to the Linux kernel
|
||||
coding style; see the kernel coding style guide at
|
||||
https://www.kernel.org/doc/html/latest/process/coding-style.html, and the
|
||||
script "scripts/Lindent" in your Linux kernel source directory.
|
||||
|
||||
Source files originating from a different project (for example the
|
||||
MTD subsystem) are generally exempt from these guidelines and are not
|
||||
reformatted to ease subsequent migration to newer versions of those
|
||||
sources.
|
||||
|
||||
Please note that U-Boot is implemented in C (and to some small parts in
|
||||
Assembler); no C++ is used, so please do not use C++ style comments (//)
|
||||
in your code.
|
||||
|
||||
Please also stick to the following formatting rules:
|
||||
- remove any trailing white space
|
||||
- use TAB characters for indentation and vertical alignment, not spaces
|
||||
- make sure NOT to use DOS '\r\n' line feeds
|
||||
- do not add more than 2 consecutive empty lines to source files
|
||||
- do not add trailing empty lines to source files
|
||||
|
||||
Submissions which do not conform to the standards may be returned
|
||||
with a request to reformat the changes.
|
||||
|
||||
|
||||
Submitting Patches:
|
||||
-------------------
|
||||
|
||||
Since the number of patches for U-Boot is growing, we need to
|
||||
establish some rules. Submissions which do not conform to these rules
|
||||
may be rejected, even when they contain important and valuable stuff.
|
||||
|
||||
Please see https://www.denx.de/wiki/U-Boot/Patches for details.
|
||||
|
||||
Patches shall be sent to the u-boot mailing list <u-boot@lists.denx.de>;
|
||||
see https://lists.denx.de/listinfo/u-boot
|
||||
|
||||
When you send a patch, please include the following information with
|
||||
it:
|
||||
|
||||
* For bug fixes: a description of the bug and how your patch fixes
|
||||
this bug. Please try to include a way of demonstrating that the
|
||||
patch actually fixes something.
|
||||
|
||||
* For new features: a description of the feature and your
|
||||
implementation.
|
||||
|
||||
* For major contributions, add a MAINTAINERS file with your
|
||||
information and associated file and directory references.
|
||||
|
||||
* When you add support for a new board, don't forget to add a
|
||||
maintainer e-mail address to the boards.cfg file, too.
|
||||
|
||||
* If your patch adds new configuration options, don't forget to
|
||||
document these in the README file.
|
||||
|
||||
* The patch itself. If you are using git (which is *strongly*
|
||||
recommended) you can easily generate the patch using the
|
||||
"git format-patch". If you then use "git send-email" to send it to
|
||||
the U-Boot mailing list, you will avoid most of the common problems
|
||||
with some other mail clients.
|
||||
|
||||
If you cannot use git, use "diff -purN OLD NEW". If your version of
|
||||
diff does not support these options, then get the latest version of
|
||||
GNU diff.
|
||||
|
||||
The current directory when running this command shall be the parent
|
||||
directory of the U-Boot source tree (i. e. please make sure that
|
||||
your patch includes sufficient directory information for the
|
||||
affected files).
|
||||
|
||||
We prefer patches as plain text. MIME attachments are discouraged,
|
||||
and compressed attachments must not be used.
|
||||
|
||||
* If one logical set of modifications affects or creates several
|
||||
files, all these changes shall be submitted in a SINGLE patch file.
|
||||
|
||||
* Changesets that contain different, unrelated modifications shall be
|
||||
submitted as SEPARATE patches, one patch per changeset.
|
||||
|
||||
|
||||
Notes:
|
||||
|
||||
* Before sending the patch, run the buildman script on your patched
|
||||
source tree and make sure that no errors or warnings are reported
|
||||
for any of the boards.
|
||||
|
||||
* Keep your modifications to the necessary minimum: A patch
|
||||
containing several unrelated changes or arbitrary reformats will be
|
||||
returned with a request to re-formatting / split it.
|
||||
|
||||
* If you modify existing code, make sure that your new code does not
|
||||
add to the memory footprint of the code ;-) Small is beautiful!
|
||||
When adding new features, these should compile conditionally only
|
||||
(using #ifdef), and the resulting code with the new feature
|
||||
disabled must not need more memory than the old code without your
|
||||
modification.
|
||||
|
||||
* Remember that there is a size limit of 100 kB per message on the
|
||||
u-boot mailing list. Bigger patches will be moderated. If they are
|
||||
reasonable and not too big, they will be acknowledged. But patches
|
||||
bigger than the size limit should be avoided.
|
||||
The U-Boot projects depends on contributions from the user community.
|
||||
If you want to participate, please, have a look at the 'General'
|
||||
section of https://u-boot.readthedocs.io/en/latest/develop/index.html
|
||||
where we describe coding standards and the patch submission process.
|
||||
|
401
cmd/eficonfig.c
401
cmd/eficonfig.c
@ -22,9 +22,21 @@
|
||||
#include <linux/delay.h>
|
||||
|
||||
static struct efi_simple_text_input_protocol *cin;
|
||||
const char *eficonfig_menu_desc =
|
||||
" Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit";
|
||||
|
||||
static const char *eficonfig_change_boot_order_desc =
|
||||
" Press UP/DOWN to move, +/- to change orde\n"
|
||||
" Press SPACE to activate or deactivate the entry\n"
|
||||
" Select [Save] to complete, ESC/CTRL+C to quit";
|
||||
|
||||
static struct efi_simple_text_output_protocol *cout;
|
||||
static int avail_row;
|
||||
|
||||
#define EFICONFIG_DESCRIPTION_MAX 32
|
||||
#define EFICONFIG_OPTIONAL_DATA_MAX 64
|
||||
#define EFICONFIG_MENU_HEADER_ROW_NUM 3
|
||||
#define EFICONFIG_MENU_DESC_ROW_NUM 5
|
||||
|
||||
/**
|
||||
* struct eficonfig_filepath_info - structure to be used to store file path
|
||||
@ -104,6 +116,41 @@ struct eficonfig_boot_order_data {
|
||||
bool active;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct eficonfig_save_boot_order_data - structure to be used to change boot order
|
||||
*
|
||||
* @efi_menu: pointer to efimenu structure
|
||||
* @selected: flag to indicate user selects "Save" entry
|
||||
*/
|
||||
struct eficonfig_save_boot_order_data {
|
||||
struct efimenu *efi_menu;
|
||||
bool selected;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct eficonfig_menu_adjust - update start and end entry index
|
||||
*
|
||||
* @efi_menu: pointer to efimenu structure
|
||||
* @add: flag to add or substract the index
|
||||
*/
|
||||
static void eficonfig_menu_adjust(struct efimenu *efi_menu, bool add)
|
||||
{
|
||||
if (add)
|
||||
++efi_menu->active;
|
||||
else
|
||||
--efi_menu->active;
|
||||
|
||||
if (add && efi_menu->end < efi_menu->active) {
|
||||
efi_menu->start++;
|
||||
efi_menu->end++;
|
||||
} else if (!add && efi_menu->start > efi_menu->active) {
|
||||
efi_menu->start--;
|
||||
efi_menu->end--;
|
||||
}
|
||||
}
|
||||
#define eficonfig_menu_up(_a) eficonfig_menu_adjust(_a, false)
|
||||
#define eficonfig_menu_down(_a) eficonfig_menu_adjust(_a, true)
|
||||
|
||||
/**
|
||||
* eficonfig_print_msg() - print message
|
||||
*
|
||||
@ -134,23 +181,21 @@ void eficonfig_print_msg(char *msg)
|
||||
*
|
||||
* @data: pointer to the data associated with each menu entry
|
||||
*/
|
||||
static void eficonfig_print_entry(void *data)
|
||||
void eficonfig_print_entry(void *data)
|
||||
{
|
||||
struct eficonfig_entry *entry = data;
|
||||
int reverse = (entry->efi_menu->active == entry->num);
|
||||
bool reverse = (entry->efi_menu->active == entry->num);
|
||||
|
||||
/* TODO: support scroll or page for many entries */
|
||||
if (entry->efi_menu->start > entry->num || entry->efi_menu->end < entry->num)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Move cursor to line where the entry will be drawn (entry->num)
|
||||
* First 3 lines(menu header) + 1 empty line
|
||||
*/
|
||||
printf(ANSI_CURSOR_POSITION, entry->num + 4, 7);
|
||||
printf(ANSI_CURSOR_POSITION, (entry->num - entry->efi_menu->start) +
|
||||
EFICONFIG_MENU_HEADER_ROW_NUM + 1, 7);
|
||||
|
||||
if (reverse)
|
||||
puts(ANSI_COLOR_REVERSE);
|
||||
|
||||
printf("%s", entry->title);
|
||||
printf(ANSI_CLEAR_LINE "%s", entry->title);
|
||||
|
||||
if (reverse)
|
||||
puts(ANSI_COLOR_RESET);
|
||||
@ -161,7 +206,7 @@ static void eficonfig_print_entry(void *data)
|
||||
*
|
||||
* @m: pointer to the menu structure
|
||||
*/
|
||||
static void eficonfig_display_statusline(struct menu *m)
|
||||
void eficonfig_display_statusline(struct menu *m)
|
||||
{
|
||||
struct eficonfig_entry *entry;
|
||||
|
||||
@ -171,10 +216,10 @@ static void eficonfig_display_statusline(struct menu *m)
|
||||
printf(ANSI_CURSOR_POSITION
|
||||
"\n%s\n"
|
||||
ANSI_CURSOR_POSITION ANSI_CLEAR_LINE ANSI_CURSOR_POSITION
|
||||
" Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit"
|
||||
ANSI_CLEAR_LINE_TO_END ANSI_CURSOR_POSITION ANSI_CLEAR_LINE,
|
||||
1, 1, entry->efi_menu->menu_header, entry->efi_menu->count + 5, 1,
|
||||
entry->efi_menu->count + 6, 1, entry->efi_menu->count + 7, 1);
|
||||
"%s"
|
||||
ANSI_CLEAR_LINE_TO_END,
|
||||
1, 1, entry->efi_menu->menu_header, avail_row + 4, 1,
|
||||
avail_row + 5, 1, entry->efi_menu->menu_desc);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -183,7 +228,7 @@ static void eficonfig_display_statusline(struct menu *m)
|
||||
* @data: pointer to the efimenu structure
|
||||
* Return: key string to identify the selected entry
|
||||
*/
|
||||
static char *eficonfig_choice_entry(void *data)
|
||||
char *eficonfig_choice_entry(void *data)
|
||||
{
|
||||
struct cli_ch_state s_cch, *cch = &s_cch;
|
||||
struct list_head *pos, *n;
|
||||
@ -199,12 +244,14 @@ static char *eficonfig_choice_entry(void *data)
|
||||
switch (key) {
|
||||
case BKEY_UP:
|
||||
if (efi_menu->active > 0)
|
||||
--efi_menu->active;
|
||||
eficonfig_menu_up(efi_menu);
|
||||
|
||||
/* no menu key selected, regenerate menu */
|
||||
return NULL;
|
||||
case BKEY_DOWN:
|
||||
if (efi_menu->active < efi_menu->count - 1)
|
||||
++efi_menu->active;
|
||||
eficonfig_menu_down(efi_menu);
|
||||
|
||||
/* no menu key selected, regenerate menu */
|
||||
return NULL;
|
||||
case BKEY_SELECT:
|
||||
@ -361,9 +408,17 @@ out:
|
||||
*
|
||||
* @efi_menu: pointer to the efimenu structure
|
||||
* @menu_header: pointer to the menu header string
|
||||
* @menu_desc: pointer to the menu description
|
||||
* @display_statusline: function pointer to draw statusline
|
||||
* @item_data_print: function pointer to draw the menu item
|
||||
* @item_choice: function pointer to handle the key press
|
||||
* Return: status code
|
||||
*/
|
||||
efi_status_t eficonfig_process_common(struct efimenu *efi_menu, char *menu_header)
|
||||
efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
|
||||
char *menu_header, const char *menu_desc,
|
||||
void (*display_statusline)(struct menu *),
|
||||
void (*item_data_print)(void *),
|
||||
char *(*item_choice)(void *))
|
||||
{
|
||||
struct menu *menu;
|
||||
void *choice = NULL;
|
||||
@ -376,16 +431,19 @@ efi_status_t eficonfig_process_common(struct efimenu *efi_menu, char *menu_heade
|
||||
|
||||
efi_menu->delay = -1;
|
||||
efi_menu->active = 0;
|
||||
efi_menu->start = 0;
|
||||
efi_menu->end = avail_row - 1;
|
||||
|
||||
if (menu_header) {
|
||||
efi_menu->menu_header = strdup(menu_header);
|
||||
if (!efi_menu->menu_header)
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
if (menu_desc)
|
||||
efi_menu->menu_desc = menu_desc;
|
||||
|
||||
menu = menu_create(NULL, 0, 1, eficonfig_display_statusline,
|
||||
eficonfig_print_entry, eficonfig_choice_entry,
|
||||
efi_menu);
|
||||
menu = menu_create(NULL, 0, 1, display_statusline, item_data_print,
|
||||
item_choice, efi_menu);
|
||||
if (!menu)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
@ -644,7 +702,12 @@ static efi_status_t eficonfig_select_volume(struct eficonfig_select_file_info *f
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto out;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, " ** Select Volume **");
|
||||
ret = eficonfig_process_common(efi_menu, " ** Select Volume **",
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
|
||||
out:
|
||||
efi_free_pool(volume_handles);
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
@ -819,7 +882,11 @@ static efi_status_t eficonfig_show_file_selection(struct eficonfig_select_file_i
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto err;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, " ** Select File **");
|
||||
ret = eficonfig_process_common(efi_menu, " ** Select File **",
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
err:
|
||||
EFI_CALL(f->close(f));
|
||||
eficonfig_destroy(efi_menu);
|
||||
@ -980,7 +1047,11 @@ efi_status_t eficonfig_process_show_file_option(void *data)
|
||||
if (!efi_menu)
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, " ** Update File **");
|
||||
ret = eficonfig_process_common(efi_menu, " ** Update File **",
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
if (ret != EFI_SUCCESS) /* User selects "Clear" or "Quit" */
|
||||
ret = EFI_NOT_READY;
|
||||
|
||||
@ -1326,7 +1397,12 @@ static efi_status_t eficonfig_show_boot_option(struct eficonfig_boot_option *bo,
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto out;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, header_str);
|
||||
ret = eficonfig_process_common(efi_menu, header_str,
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
|
||||
out:
|
||||
eficonfig_destroy(efi_menu);
|
||||
|
||||
@ -1745,7 +1821,11 @@ static efi_status_t eficonfig_show_boot_selection(unsigned int *selected)
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto out;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, " ** Select Boot Option **");
|
||||
ret = eficonfig_process_common(efi_menu, " ** Select Boot Option **",
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
out:
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
@ -1810,63 +1890,48 @@ out:
|
||||
}
|
||||
|
||||
/**
|
||||
* eficonfig_display_change_boot_order() - display the BootOrder list
|
||||
* eficonfig_print_change_boot_order_entry() - print the boot option entry
|
||||
*
|
||||
* @efi_menu: pointer to the efimenu structure
|
||||
* Return: status code
|
||||
* @data: pointer to the data associated with each menu entry
|
||||
*/
|
||||
static void eficonfig_display_change_boot_order(struct efimenu *efi_menu)
|
||||
static void eficonfig_print_change_boot_order_entry(void *data)
|
||||
{
|
||||
bool reverse;
|
||||
struct list_head *pos, *n;
|
||||
struct eficonfig_entry *entry;
|
||||
struct eficonfig_entry *entry = data;
|
||||
bool reverse = (entry->efi_menu->active == entry->num);
|
||||
|
||||
printf(ANSI_CLEAR_CONSOLE ANSI_CURSOR_POSITION
|
||||
"\n ** Change Boot Order **\n"
|
||||
ANSI_CURSOR_POSITION
|
||||
" Press UP/DOWN to move, +/- to change order"
|
||||
ANSI_CURSOR_POSITION
|
||||
" Press SPACE to activate or deactivate the entry"
|
||||
ANSI_CURSOR_POSITION
|
||||
" Select [Save] to complete, ESC/CTRL+C to quit"
|
||||
ANSI_CURSOR_POSITION ANSI_CLEAR_LINE,
|
||||
1, 1, efi_menu->count + 5, 1, efi_menu->count + 6, 1,
|
||||
efi_menu->count + 7, 1, efi_menu->count + 8, 1);
|
||||
if (entry->efi_menu->start > entry->num || entry->efi_menu->end < entry->num)
|
||||
return;
|
||||
|
||||
/* draw boot option list */
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
reverse = (entry->num == efi_menu->active);
|
||||
printf(ANSI_CURSOR_POSITION ANSI_CLEAR_LINE,
|
||||
(entry->num - entry->efi_menu->start) + EFICONFIG_MENU_HEADER_ROW_NUM + 1, 7);
|
||||
|
||||
printf(ANSI_CURSOR_POSITION, entry->num + 4, 7);
|
||||
if (reverse)
|
||||
puts(ANSI_COLOR_REVERSE);
|
||||
|
||||
if (reverse)
|
||||
puts(ANSI_COLOR_REVERSE);
|
||||
|
||||
if (entry->num < efi_menu->count - 2) {
|
||||
if (((struct eficonfig_boot_order_data *)entry->data)->active)
|
||||
printf("[*] ");
|
||||
else
|
||||
printf("[ ] ");
|
||||
}
|
||||
|
||||
printf("%s", entry->title);
|
||||
|
||||
if (reverse)
|
||||
puts(ANSI_COLOR_RESET);
|
||||
if (entry->num < entry->efi_menu->count - 2) {
|
||||
if (((struct eficonfig_boot_order_data *)entry->data)->active)
|
||||
printf("[*] ");
|
||||
else
|
||||
printf("[ ] ");
|
||||
}
|
||||
|
||||
printf("%s", entry->title);
|
||||
|
||||
if (reverse)
|
||||
puts(ANSI_COLOR_RESET);
|
||||
}
|
||||
|
||||
/**
|
||||
* eficonfig_choice_change_boot_order() - handle the BootOrder update
|
||||
* eficonfig_choice_change_boot_order() - user key input handler
|
||||
*
|
||||
* @efi_menu: pointer to the efimenu structure
|
||||
* Return: status code
|
||||
* @data: pointer to the menu entry
|
||||
* Return: key string to identify the selected entry
|
||||
*/
|
||||
static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
||||
char *eficonfig_choice_change_boot_order(void *data)
|
||||
{
|
||||
struct cli_ch_state s_cch, *cch = &s_cch;
|
||||
struct list_head *pos, *n;
|
||||
struct efimenu *efi_menu = data;
|
||||
enum bootmenu_key key = BKEY_NONE;
|
||||
struct eficonfig_entry *entry, *tmp;
|
||||
|
||||
@ -1876,7 +1941,8 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
||||
|
||||
switch (key) {
|
||||
case BKEY_PLUS:
|
||||
if (efi_menu->active > 0) {
|
||||
if (efi_menu->active > 0 &&
|
||||
efi_menu->active < efi_menu->count - 2) {
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
if (entry->num == efi_menu->active)
|
||||
@ -1887,12 +1953,15 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
||||
tmp->num++;
|
||||
list_del(&tmp->list);
|
||||
list_add(&tmp->list, &entry->list);
|
||||
|
||||
eficonfig_menu_up(efi_menu);
|
||||
}
|
||||
fallthrough;
|
||||
return NULL;
|
||||
case BKEY_UP:
|
||||
if (efi_menu->active > 0)
|
||||
--efi_menu->active;
|
||||
return EFI_NOT_READY;
|
||||
eficonfig_menu_up(efi_menu);
|
||||
|
||||
return NULL;
|
||||
case BKEY_MINUS:
|
||||
if (efi_menu->active < efi_menu->count - 3) {
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
@ -1906,22 +1975,32 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
||||
list_del(&entry->list);
|
||||
list_add(&entry->list, &tmp->list);
|
||||
|
||||
++efi_menu->active;
|
||||
eficonfig_menu_down(efi_menu);
|
||||
}
|
||||
return EFI_NOT_READY;
|
||||
return NULL;
|
||||
case BKEY_DOWN:
|
||||
if (efi_menu->active < efi_menu->count - 1)
|
||||
++efi_menu->active;
|
||||
return EFI_NOT_READY;
|
||||
eficonfig_menu_down(efi_menu);
|
||||
|
||||
return NULL;
|
||||
case BKEY_SELECT:
|
||||
/* "Save" */
|
||||
if (efi_menu->active == efi_menu->count - 2)
|
||||
return EFI_SUCCESS;
|
||||
|
||||
if (efi_menu->active == efi_menu->count - 2) {
|
||||
list_for_each_prev_safe(pos, n, &efi_menu->list) {
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
if (entry->num == efi_menu->active)
|
||||
break;
|
||||
}
|
||||
return entry->key;
|
||||
}
|
||||
/* "Quit" */
|
||||
if (efi_menu->active == efi_menu->count - 1)
|
||||
return EFI_ABORTED;
|
||||
|
||||
if (efi_menu->active == efi_menu->count - 1) {
|
||||
entry = list_last_entry(&efi_menu->list,
|
||||
struct eficonfig_entry,
|
||||
list);
|
||||
return entry->key;
|
||||
}
|
||||
/* Pressed key is not valid, wait next key press */
|
||||
break;
|
||||
case BKEY_SPACE:
|
||||
if (efi_menu->active < efi_menu->count - 2) {
|
||||
@ -1931,20 +2010,84 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
||||
struct eficonfig_boot_order_data *data = entry->data;
|
||||
|
||||
data->active = !data->active;
|
||||
return EFI_NOT_READY;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Pressed key is not valid, wait next key press */
|
||||
break;
|
||||
case BKEY_QUIT:
|
||||
return EFI_ABORTED;
|
||||
entry = list_last_entry(&efi_menu->list,
|
||||
struct eficonfig_entry, list);
|
||||
return entry->key;
|
||||
default:
|
||||
/* Pressed key is not valid, no need to regenerate the menu */
|
||||
/* Pressed key is not valid, wait next key press */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eficonfig_process_save_boot_order() - callback function for "Save" entry
|
||||
*
|
||||
* @data: pointer to the data
|
||||
* Return: status code
|
||||
*/
|
||||
static efi_status_t eficonfig_process_save_boot_order(void *data)
|
||||
{
|
||||
u32 count = 0;
|
||||
efi_status_t ret;
|
||||
efi_uintn_t size;
|
||||
struct list_head *pos, *n;
|
||||
u16 *new_bootorder;
|
||||
struct efimenu *efi_menu;
|
||||
struct eficonfig_entry *entry;
|
||||
struct eficonfig_save_boot_order_data *save_data = data;
|
||||
|
||||
efi_menu = save_data->efi_menu;
|
||||
|
||||
/*
|
||||
* The change boot order menu always has "Save" and "Quit" entries.
|
||||
* !(efi_menu->count - 2) means there is no user defined boot option.
|
||||
*/
|
||||
if (!(efi_menu->count - 2))
|
||||
return EFI_SUCCESS;
|
||||
|
||||
new_bootorder = calloc(1, (efi_menu->count - 2) * sizeof(u16));
|
||||
if (!new_bootorder) {
|
||||
ret = EFI_OUT_OF_RESOURCES;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* create new BootOrder */
|
||||
count = 0;
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
struct eficonfig_boot_order_data *data;
|
||||
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
/* exit the loop when iteration reaches "Save" */
|
||||
if (!strncmp(entry->title, "Save", strlen("Save")))
|
||||
break;
|
||||
|
||||
data = entry->data;
|
||||
if (data->active)
|
||||
new_bootorder[count++] = data->boot_index;
|
||||
}
|
||||
|
||||
size = count * sizeof(u16);
|
||||
ret = efi_set_variable_int(u"BootOrder", &efi_global_variable_guid,
|
||||
EFI_VARIABLE_NON_VOLATILE |
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
size, new_bootorder, false);
|
||||
|
||||
save_data->selected = true;
|
||||
out:
|
||||
free(new_bootorder);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* eficonfig_add_change_boot_order_entry() - add boot order entry
|
||||
*
|
||||
@ -2020,6 +2163,7 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
|
||||
efi_status_t ret;
|
||||
u16 *var_name16 = NULL;
|
||||
efi_uintn_t size, buf_size;
|
||||
struct eficonfig_save_boot_order_data *save_data;
|
||||
|
||||
/* list the load option in the order of BootOrder variable */
|
||||
for (i = 0; i < num; i++) {
|
||||
@ -2070,7 +2214,17 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = eficonfig_append_menu_entry(efi_menu, title, NULL, NULL);
|
||||
save_data = malloc(sizeof(struct eficonfig_save_boot_order_data));
|
||||
if (!save_data) {
|
||||
ret = EFI_OUT_OF_RESOURCES;
|
||||
goto out;
|
||||
}
|
||||
save_data->efi_menu = efi_menu;
|
||||
save_data->selected = false;
|
||||
|
||||
ret = eficonfig_append_menu_entry(efi_menu, title,
|
||||
eficonfig_process_save_boot_order,
|
||||
save_data);
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto out;
|
||||
|
||||
@ -2093,7 +2247,6 @@ out:
|
||||
*/
|
||||
static efi_status_t eficonfig_process_change_boot_order(void *data)
|
||||
{
|
||||
u32 count;
|
||||
u16 *bootorder;
|
||||
efi_status_t ret;
|
||||
efi_uintn_t num, size;
|
||||
@ -2114,47 +2267,24 @@ static efi_status_t eficonfig_process_change_boot_order(void *data)
|
||||
goto out;
|
||||
|
||||
while (1) {
|
||||
eficonfig_display_change_boot_order(efi_menu);
|
||||
|
||||
ret = eficonfig_choice_change_boot_order(efi_menu);
|
||||
if (ret == EFI_SUCCESS) {
|
||||
u16 *new_bootorder;
|
||||
|
||||
new_bootorder = calloc(1, (efi_menu->count - 2) * sizeof(u16));
|
||||
if (!new_bootorder) {
|
||||
ret = EFI_OUT_OF_RESOURCES;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* create new BootOrder */
|
||||
count = 0;
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
struct eficonfig_boot_order_data *data;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu,
|
||||
" ** Change Boot Order **",
|
||||
eficonfig_change_boot_order_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_change_boot_order_entry,
|
||||
eficonfig_choice_change_boot_order);
|
||||
/* exit from the menu if user selects the "Save" entry. */
|
||||
if (ret == EFI_SUCCESS && efi_menu->active == (efi_menu->count - 2)) {
|
||||
list_for_each_prev_safe(pos, n, &efi_menu->list) {
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
/* exit the loop when iteration reaches "Save" */
|
||||
if (!strncmp(entry->title, "Save", strlen("Save")))
|
||||
if (entry->num == efi_menu->active)
|
||||
break;
|
||||
|
||||
data = entry->data;
|
||||
if (data->active)
|
||||
new_bootorder[count++] = data->boot_index;
|
||||
}
|
||||
|
||||
size = count * sizeof(u16);
|
||||
ret = efi_set_variable_int(u"BootOrder", &efi_global_variable_guid,
|
||||
EFI_VARIABLE_NON_VOLATILE |
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
size, new_bootorder, false);
|
||||
|
||||
free(new_bootorder);
|
||||
goto out;
|
||||
} else if (ret == EFI_NOT_READY) {
|
||||
continue;
|
||||
} else {
|
||||
goto out;
|
||||
if (((struct eficonfig_save_boot_order_data *)entry->data)->selected)
|
||||
break;
|
||||
}
|
||||
if (ret != EFI_SUCCESS)
|
||||
break;
|
||||
}
|
||||
out:
|
||||
free(bootorder);
|
||||
@ -2500,6 +2630,7 @@ static efi_status_t eficonfig_init(void)
|
||||
efi_status_t ret = EFI_SUCCESS;
|
||||
static bool init;
|
||||
struct efi_handler *handler;
|
||||
unsigned long columns, rows;
|
||||
|
||||
if (!init) {
|
||||
ret = efi_search_protocol(efi_root, &efi_guid_text_input_protocol, &handler);
|
||||
@ -2510,6 +2641,23 @@ static efi_status_t eficonfig_init(void)
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
ret = efi_search_protocol(efi_root, &efi_guid_text_output_protocol, &handler);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
|
||||
ret = efi_protocol_open(handler, (void **)&cout, efi_root, NULL,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
|
||||
cout->query_mode(cout, cout->mode->mode, &columns, &rows);
|
||||
avail_row = rows - (EFICONFIG_MENU_HEADER_ROW_NUM +
|
||||
EFICONFIG_MENU_DESC_ROW_NUM);
|
||||
if (avail_row <= 0) {
|
||||
eficonfig_print_msg("Console size is too small!");
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
/* TODO: Should we check the minimum column size? */
|
||||
}
|
||||
|
||||
init = true;
|
||||
@ -2567,7 +2715,12 @@ static int do_eficonfig(struct cmd_tbl *cmdtp, int flag, int argc, char *const a
|
||||
if (!efi_menu)
|
||||
return CMD_RET_FAILURE;
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, " ** UEFI Maintenance Menu **");
|
||||
ret = eficonfig_process_common(efi_menu,
|
||||
" ** UEFI Maintenance Menu **",
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
eficonfig_destroy(efi_menu);
|
||||
|
||||
if (ret == EFI_ABORTED)
|
||||
|
@ -410,7 +410,10 @@ static efi_status_t enumerate_and_show_signature_database(void *varname)
|
||||
goto out;
|
||||
|
||||
snprintf(buf, sizeof(buf), " ** Show Signature Database (%ls) **", (u16 *)varname);
|
||||
ret = eficonfig_process_common(efi_menu, buf);
|
||||
ret = eficonfig_process_common(efi_menu, buf, eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
out:
|
||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||
@ -472,7 +475,11 @@ static efi_status_t eficonfig_process_set_secure_boot_key(void *data)
|
||||
efi_menu = eficonfig_create_fixed_menu(key_config_menu_items,
|
||||
ARRAY_SIZE(key_config_menu_items));
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, header_str);
|
||||
ret = eficonfig_process_common(efi_menu, header_str,
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
eficonfig_destroy(efi_menu);
|
||||
|
||||
if (ret == EFI_ABORTED)
|
||||
@ -518,7 +525,12 @@ efi_status_t eficonfig_process_secure_boot_config(void *data)
|
||||
break;
|
||||
}
|
||||
|
||||
ret = eficonfig_process_common(efi_menu, header_str);
|
||||
ret = eficonfig_process_common(efi_menu, header_str,
|
||||
eficonfig_menu_desc,
|
||||
eficonfig_display_statusline,
|
||||
eficonfig_print_entry,
|
||||
eficonfig_choice_entry);
|
||||
|
||||
eficonfig_destroy(efi_menu);
|
||||
|
||||
if (ret == EFI_ABORTED)
|
||||
|
26
cmd/mem.c
26
cmd/mem.c
@ -818,8 +818,8 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr,
|
||||
*
|
||||
* Returns: 0 if the test succeeds, 1 if the test fails.
|
||||
*/
|
||||
pattern = (vu_long) 0xaaaaaaaa;
|
||||
anti_pattern = (vu_long) 0x55555555;
|
||||
pattern = (vu_long)0xaaaaaaaaaaaaaaaa;
|
||||
anti_pattern = (vu_long)0x5555555555555555;
|
||||
|
||||
debug("%s:%d: length = 0x%.8lx\n", __func__, __LINE__, num_words);
|
||||
/*
|
||||
@ -970,7 +970,7 @@ static ulong test_bitflip_comparison(volatile unsigned long *bufa,
|
||||
|
||||
max = sizeof(unsigned long) * 8;
|
||||
for (k = 0; k < max; k++) {
|
||||
q = 0x00000001L << k;
|
||||
q = 1UL << k;
|
||||
for (j = 0; j < 8; j++) {
|
||||
schedule();
|
||||
q = ~q;
|
||||
@ -1009,6 +1009,7 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
|
||||
ulong errs = 0;
|
||||
ulong incr, length;
|
||||
ulong val, readback;
|
||||
const int plen = 2 * sizeof(ulong);
|
||||
|
||||
/* Alternate the pattern */
|
||||
incr = 1;
|
||||
@ -1020,17 +1021,17 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
|
||||
* the "negative" patterns and increment the "positive"
|
||||
* patterns to preserve this feature.
|
||||
*/
|
||||
if (pattern & 0x80000000)
|
||||
if (pattern > (ulong)LONG_MAX)
|
||||
pattern = -pattern; /* complement & increment */
|
||||
else
|
||||
pattern = ~pattern;
|
||||
}
|
||||
length = (end_addr - start_addr) / sizeof(ulong);
|
||||
end = buf + length;
|
||||
printf("\rPattern %08lX Writing..."
|
||||
printf("\rPattern %0*lX Writing..."
|
||||
"%12s"
|
||||
"\b\b\b\b\b\b\b\b\b\b",
|
||||
pattern, "");
|
||||
plen, pattern, "");
|
||||
|
||||
for (addr = buf, val = pattern; addr < end; addr++) {
|
||||
schedule();
|
||||
@ -1046,10 +1047,9 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
|
||||
if (readback != val) {
|
||||
ulong offset = addr - buf;
|
||||
|
||||
printf("\nMem error @ 0x%08X: "
|
||||
"found %08lX, expected %08lX\n",
|
||||
(uint)(uintptr_t)(start_addr + offset*sizeof(vu_long)),
|
||||
readback, val);
|
||||
printf("\nMem error @ 0x%0*lX: found %0*lX, expected %0*lX\n",
|
||||
plen, start_addr + offset * sizeof(vu_long),
|
||||
plen, readback, plen, val);
|
||||
errs++;
|
||||
if (ctrlc())
|
||||
return -1;
|
||||
@ -1135,11 +1135,7 @@ static int do_mem_mtest(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||
|
||||
unmap_sysmem((void *)buf);
|
||||
|
||||
if (errs == -1UL) {
|
||||
/* Memory test was aborted - write a newline to finish off */
|
||||
putc('\n');
|
||||
}
|
||||
printf("Tested %d iteration(s) with %lu errors.\n", iteration, count);
|
||||
printf("\nTested %d iteration(s) with %lu errors.\n", iteration, count);
|
||||
|
||||
return errs != 0;
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ with an i.MX8M-Mini SoC, 1/2/4 GB LPDDR4 RAM, SPI NOR, eMMC and PMIC.
|
||||
The matching evaluation boards (Board-Line, BL) have two Ethernet ports,
|
||||
USB 2.0, HDMI/LVDS, SD card, CAN, RS485, RS232 and much more.
|
||||
|
||||
The OSM-S i.MX8MM is compliant to the Open Standard Module (OSM) 1.0
|
||||
The OSM-S i.MX8MM is compliant to the Open Standard Module (OSM) 1.1
|
||||
specification, size S (https://sget.org/standards/osm).
|
||||
|
||||
Quick Start
|
||||
@ -20,25 +20,38 @@ Quick Start
|
||||
- Build U-Boot
|
||||
- Boot
|
||||
|
||||
.. note::
|
||||
|
||||
To build on a x86-64 host machine, you need a GNU cross toolchain for the
|
||||
target architecture (aarch64). Check your distros package manager or
|
||||
download and install the necessary tools (``aarch64-linux-gnu-*``) manually.
|
||||
|
||||
Get and Build the Trusted Firmware-A (TF-A)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Note: builddir is U-Boot build directory (source directory for in-tree builds)
|
||||
|
||||
There are two sources for the TF-A. Mainline and NXP. Get the one you prefer
|
||||
(support and features might differ).
|
||||
|
||||
.. note::
|
||||
|
||||
If you are using GCC 12 and you get compiler/linker errors, try to add the
|
||||
following arguments to your make command as workaround:
|
||||
``CFLAGS="-Wno-array-bounds" LDFLAGS="--no-warn-rwx-segments"``
|
||||
|
||||
**NXP's imx-atf**
|
||||
|
||||
1. Get TF-A from: https://source.codeaurora.org/external/imx/imx-atf, branch: imx_5.4.70_2.3.0
|
||||
2. Apply the patch to select the correct UART for the console, otherwise the TF-A will lock up during boot.
|
||||
3. Build
|
||||
1. Get TF-A from: https://github.com/nxp-imx/imx-atf, branch: lf_v2.6
|
||||
2. Build
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ make PLAT=imx8mm bl31
|
||||
$ make PLAT=imx8mm CROSS_COMPILE=aarch64-linux-gnu- IMX_BOOT_UART_BASE="0x30880000" bl31
|
||||
$ cp build/imx8mm/release/bl31.bin $(builddir)
|
||||
|
||||
.. note::
|
||||
|
||||
*builddir* is U-Boot's build directory (source directory for in-tree builds)
|
||||
|
||||
**Mainline TF-A**
|
||||
|
||||
1. Get TF-A from: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/, tag: v2.4
|
||||
@ -54,10 +67,13 @@ Get the DDR firmware
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.9.bin
|
||||
$ chmod +x firmware-imx-8.9.bin
|
||||
$ ./firmware-imx-8.9.bin
|
||||
$ cp firmware-imx-8.9/firmware/ddr/synopsys/lpddr4*.bin $(builddir)
|
||||
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.18.bin
|
||||
$ chmod +x firmware-imx-8.18.bin
|
||||
$ ./firmware-imx-8.18.bin
|
||||
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_1d_imem.bin $(builddir)
|
||||
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_1d_dmem.bin $(builddir)
|
||||
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_2d_imem.bin $(builddir)
|
||||
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_2d_dmem.bin $(builddir)
|
||||
|
||||
Build U-Boot
|
||||
^^^^^^^^^^^^
|
||||
@ -65,9 +81,9 @@ Build U-Boot
|
||||
.. code-block:: bash
|
||||
|
||||
$ make kontron-sl-mx8mm_defconfig
|
||||
$ make
|
||||
$ make CROSS_COMPILE=aarch64-linux-gnu-
|
||||
|
||||
Burn the flash.bin to SD card at an offset of 33 KiB:
|
||||
Copy the flash.bin to SD card at an offset of 33 KiB:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@ -76,7 +92,39 @@ Burn the flash.bin to SD card at an offset of 33 KiB:
|
||||
Boot
|
||||
^^^^
|
||||
|
||||
Put the SD card in the slot on the board and apply power.
|
||||
Put the SD card in the slot on the board and apply power. Check the serial
|
||||
console for output.
|
||||
|
||||
Flash the Bootloader to SPI NOR
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
1. Determine and note the exact size of the ``flash.bin`` image in bytes (e.g.
|
||||
by running ``ls -l flash.bin``)
|
||||
|
||||
2. On the U-Boot CLI copy the bootloader from SD card to RAM:
|
||||
|
||||
.. code-block::
|
||||
|
||||
mmc dev 1
|
||||
mmc read $loadaddr 0x42 0x1000
|
||||
|
||||
3. Erase the SPI NOR flash:
|
||||
|
||||
.. code-block::
|
||||
|
||||
sf probe
|
||||
sf erase 0x0 0x200000
|
||||
|
||||
4. Copy the bootloader from RAM to SPI NOR. For the last parameter of the
|
||||
command, use the size determined in step 1 in **hexadecimal notation**:
|
||||
|
||||
.. code-block::
|
||||
|
||||
sf write $loadaddr 0x400 0x13B6F0
|
||||
|
||||
.. note::
|
||||
|
||||
To be able to boot from SPI NOR the OTP fuses need to be set accordingly.
|
||||
|
||||
Further Information
|
||||
-------------------
|
||||
|
@ -478,7 +478,8 @@ or:
|
||||
+-------+--------+---------+------------------------+------------------------+
|
||||
|
||||
And the 4th partition (Rootfs) is marked bootable with a file extlinux.conf
|
||||
following the Generic Distribution feature (doc/develop/distro.rst for use).
|
||||
following the Generic Distribution feature (see :doc:`../../develop/distro` for
|
||||
use).
|
||||
|
||||
The size of fip or ssbl partition must be enough for the associated binary file,
|
||||
4MB and 2MB are default values.
|
||||
|
1
doc/build/index.rst
vendored
1
doc/build/index.rst
vendored
@ -9,6 +9,7 @@ Build U-Boot
|
||||
source
|
||||
gcc
|
||||
clang
|
||||
reproducible
|
||||
docker
|
||||
tools
|
||||
buildman
|
||||
|
25
doc/build/reproducible.rst
vendored
Normal file
25
doc/build/reproducible.rst
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
Reproducible builds
|
||||
===================
|
||||
|
||||
In order to achieve reproducible builds, timestamps used in the U-Boot build
|
||||
process have to be set to a fixed value.
|
||||
|
||||
This is done using the SOURCE_DATE_EPOCH environment variable which specifies
|
||||
the number of seconds since 1970-01-01T00:00:00Z.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
To build the sandbox with 2023-01-01T00:00:00Z as timestamp we can use:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
make sandbox_defconfig
|
||||
SOURCE_DATE_EPOCH=1672531200 make
|
||||
|
||||
This date is shown when we launch U-Boot:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
./u-boot -T
|
||||
U-Boot 2023.01 (Jan 01 2023 - 00:00:00 +0000)
|
76
doc/develop/directories.rst
Normal file
76
doc/develop/directories.rst
Normal file
@ -0,0 +1,76 @@
|
||||
Directory hierarchy
|
||||
===================
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
|
||||
* - Directory path
|
||||
- Usage
|
||||
* - /arch
|
||||
- Architecture-specific files
|
||||
* - /arch/arc
|
||||
- Files relating to ARC architecture
|
||||
* - /arch/arm
|
||||
- Files relating to ARM architecture
|
||||
* - /arch/m68k
|
||||
- Files relating to m68k architecture
|
||||
* - /arch/microblaze
|
||||
- Files relating to microblaze architecture
|
||||
* - /arch/mips
|
||||
- Files relating to MIPS architecture
|
||||
* - /arch/nios2
|
||||
- Files relating to Altera NIOS2 architecture
|
||||
* - /arch/powerpc
|
||||
- Files relating to PowerPC architecture
|
||||
* - /arch/riscv
|
||||
- Files relating to RISC-V architecture
|
||||
* - /arch/sandbox
|
||||
- Files relating to HW-independent "sandbox"
|
||||
* - /arch/sh
|
||||
- Files relating to SH architecture
|
||||
* - /arch/x86
|
||||
- Files relating to x86 architecture
|
||||
* - /arch/xtensa
|
||||
- Files relating to Xtensa architecture
|
||||
* - /api
|
||||
- Machine/arch-independent API for external apps
|
||||
* - /board
|
||||
- Board-dependent files
|
||||
* - /boot
|
||||
- Support for images and booting
|
||||
* - /cmd
|
||||
- U-Boot commands functions
|
||||
* - /common
|
||||
- Misc architecture-independent functions
|
||||
* - /configs
|
||||
- Board default configuration files
|
||||
* - /disk
|
||||
- Code for disk drive partition handling
|
||||
* - /doc
|
||||
- Documentation (a mix of ReST and READMEs)
|
||||
* - /drivers
|
||||
- Device drivers
|
||||
* - /dts
|
||||
- Makefile for building internal U-Boot fdt.
|
||||
* - /env
|
||||
- Environment support
|
||||
* - /examples
|
||||
- Example code for standalone applications, etc.
|
||||
* - /fs
|
||||
- Filesystem code (cramfs, ext2, jffs2, etc.)
|
||||
* - /include
|
||||
- Header Files
|
||||
* - /lib
|
||||
- Library routines relating to all architectures
|
||||
* - /Licenses
|
||||
- Various license files
|
||||
* - /net
|
||||
- Networking code
|
||||
* - /post
|
||||
- Power On Self Test
|
||||
* - /scripts
|
||||
- Various build scripts and Makefiles
|
||||
* - /test
|
||||
- Various unit test files
|
||||
* - /tools
|
||||
- Tools to build and sign FIT images, etc.
|
@ -64,3 +64,26 @@ in an image, use $(CROSS_COMPILE)nm::
|
||||
|
||||
nm u-boot |grep evspy |grep list
|
||||
00000000002d6300 D _u_boot_list_2_evspy_info_2_EVT_MISC_INIT_F
|
||||
|
||||
Logging is also available. Events use category `LOGC_EVENT`, so you can enable
|
||||
logging on that, or add `#define LOG_DEBUG` to the top of `common/event.c` to
|
||||
see events being sent.
|
||||
|
||||
|
||||
Dynamic events
|
||||
--------------
|
||||
|
||||
Static events provide a way of dealing with events known at build time. In some
|
||||
cases we want to attach an event handler at runtime. For example, we may wish
|
||||
to be notified when a particular device is probed or removed.
|
||||
|
||||
This can be handled by enabling `CONFIG_EVENT_DYNAMIC`. It is then possible to
|
||||
call `event_register()` to register a new handler for a particular event.
|
||||
|
||||
Dynamic event handlers are called after all the static event spy handlers have
|
||||
been processed. Of course, since dynamic event handlers are created at runtime
|
||||
it is not possible to use the `event_dump.py` to see them.
|
||||
|
||||
At present there is no way to list dynamic event handlers from the command line,
|
||||
nor to deregister a dynamic event handler. These features can be added when
|
||||
needed.
|
||||
|
@ -24,6 +24,7 @@ Implementation
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
directories
|
||||
bloblist
|
||||
bootstd
|
||||
ci_testing
|
||||
|
@ -11,22 +11,23 @@ mkeficapsule \- Generate EFI capsule file for U-Boot
|
||||
.RI [ options ] " " [ image-blob ] " " capsule-file
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
The
|
||||
.B mkeficapsule
|
||||
command is used to create an EFI capsule file for use with the U-Boot
|
||||
EFI capsule update.
|
||||
A capsule file may contain various type of firmware blobs which
|
||||
are to be applied to the system and must be placed in the specific
|
||||
directory on the UEFI system partition.
|
||||
An update will be automatically executed at next reboot.
|
||||
command is used to create an EFI capsule file to be used by U-Boot for firmware
|
||||
updates.
|
||||
A capsule file may contain various types of firmware blobs which are to be
|
||||
applied to the system.
|
||||
If a capsule file is placed in the /EFI/CapusuleUpdate directory of the EFI
|
||||
system partition, U-Boot will try to execute the update at the next reboot.
|
||||
|
||||
Optionally, a capsule file can be signed with a given private key.
|
||||
In this case, the update will be authenticated by verifying the signature
|
||||
before applying.
|
||||
|
||||
Additionally, an empty capsule file can be generated for acceptance or
|
||||
rejection of firmware images by a governing component like an Operating
|
||||
System. The empty capsules do not require an image-blob input file.
|
||||
|
||||
Additionally, an empty capsule file can be generated to indicate the acceptance
|
||||
or rejection of firmware images by a governing component like an operating
|
||||
system.
|
||||
Empty capsules do not require an image-blob input file.
|
||||
|
||||
.B mkeficapsule
|
||||
takes any type of image files when generating non empty capsules, including:
|
||||
|
@ -17,7 +17,7 @@ Description
|
||||
The *bdinfo* command prints information about the board.
|
||||
|
||||
Example
|
||||
=======
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
|
@ -12,33 +12,27 @@ Synopis
|
||||
font select <name> [<size>]
|
||||
font size <size>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The *font* command allows selection of the font to use on the video console.
|
||||
This is available when the Truetype console is in use. This is the case when
|
||||
`CONFIG_CONSOLE_TRUETYPE` is enabled.
|
||||
|
||||
This is available when the TrueType console is in use.
|
||||
|
||||
font list
|
||||
~~~~~~~~~
|
||||
|
||||
This lists the available fonts, using the name of the font file in the build.
|
||||
|
||||
|
||||
font select
|
||||
~~~~~~~~~~~
|
||||
|
||||
This selects a new font and optionally changes the size.
|
||||
|
||||
|
||||
font size
|
||||
~~~~~~~~~
|
||||
|
||||
This changes the font size only.
|
||||
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
@ -50,3 +44,14 @@ Examples
|
||||
=> font size 40
|
||||
=> font select cantoraone_regular 20
|
||||
=>
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
The command is only available if CONFIG_CONSOLE_TRUETYPE=y.
|
||||
|
||||
Return value
|
||||
------------
|
||||
|
||||
The return value $? is 0 (true) if the command completes.
|
||||
The return value is 1 (false) if the command fails.
|
||||
|
66
doc/usage/cmd/mtest.rst
Normal file
66
doc/usage/cmd/mtest.rst
Normal file
@ -0,0 +1,66 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
.. Copyright 2022, Heinrich Schuchardt <xypron.glpk@gmx.de>
|
||||
|
||||
mtest command
|
||||
=============
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
mtest [start [end [pattern [iterations]]]]
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The *mtest* command tests the random access memory. It writes long values, reads
|
||||
them back and checks for differences. The test can be interrupted with CTRL+C.
|
||||
|
||||
The default test uses *pattern* as first value to be written and varies it
|
||||
between memory addresses.
|
||||
|
||||
An alternative test can be selected with CONFIG_SYS_ALT_MEMTEST=y. It uses
|
||||
multiple hard coded bit patterns.
|
||||
|
||||
With CONFIGSYS_ALT_MEMTEST_BITFLIP=y a further test is executed. It writes long
|
||||
values offset by half the size of long and checks if writing to the one address
|
||||
causes bit flips at the other address.
|
||||
|
||||
start
|
||||
start address of the memory range tested, defaults to
|
||||
CONFIG_SYS_MEMTEST_START
|
||||
|
||||
end
|
||||
end address of the memory range tested, defaults to
|
||||
CONFIG_SYS_MEMTEST_END. If CONFIGSYS_ALT_MEMTEST_BITFLIP=y, a value will
|
||||
be written to this address. Otherwise it is excluded from the range.
|
||||
|
||||
pattern
|
||||
pattern to be written to memory. This is a 64bit value on 64bit systems
|
||||
and a 32bit value on 32bit systems. It defaults to 0. The value is
|
||||
ignored if CONFIG_SYS_ALT_MEMTEST=y.
|
||||
|
||||
iterations
|
||||
number of test repetitions. If the value is not provided the test will
|
||||
not terminate automatically. Enter CTRL+C instead.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
=> mtest 1000 2000 0x55aa55aa55aa55aa 10
|
||||
Testing 00001000 ... 00002000:
|
||||
Pattern AA55AA55AA55AA55 Writing... Reading...
|
||||
Tested 16 iteration(s) with 0 errors.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
The mtest command is enabled by CONFIG_CMD_MEMTEST=y.
|
||||
|
||||
Return value
|
||||
------------
|
||||
|
||||
The return value $? is 0 (true) if the command succeeds, 1 (false) otherwise.
|
45
doc/usage/cmd/sleep.rst
Normal file
45
doc/usage/cmd/sleep.rst
Normal file
@ -0,0 +1,45 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
.. Copyright 2023, Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
|
||||
|
||||
sleep command
|
||||
=============
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
sleep <delay>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The *sleep* command waits for *delay* seconds. It can be interrupted by
|
||||
CTRL+C.
|
||||
|
||||
delay
|
||||
delay in seconds. The value is decimal and can be fractional.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
The current data and time is display before and after sleeping for 3.2
|
||||
seconds:
|
||||
|
||||
::
|
||||
|
||||
=> date; sleep 3.2; date
|
||||
Date: 2023-01-21 (Saturday) Time: 16:02:41
|
||||
Date: 2023-01-21 (Saturday) Time: 16:02:44
|
||||
=>
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
The command is only available if CONFIG_CMD_SLEEP=y.
|
||||
|
||||
Return value
|
||||
------------
|
||||
|
||||
The return value $? is 0 (true) if the command completes.
|
||||
The return value is 1 (false) if the command is interrupted by CTRL+C.
|
@ -63,6 +63,7 @@ Shell commands
|
||||
cmd/mbr
|
||||
cmd/md
|
||||
cmd/mmc
|
||||
cmd/mtest
|
||||
cmd/part
|
||||
cmd/pause
|
||||
cmd/pinmux
|
||||
@ -76,6 +77,7 @@ Shell commands
|
||||
cmd/scp03
|
||||
cmd/setexpr
|
||||
cmd/size
|
||||
cmd/sleep
|
||||
cmd/sound
|
||||
cmd/source
|
||||
cmd/temperature
|
||||
|
@ -9,12 +9,14 @@
|
||||
#define _EFI_CONFIG_H
|
||||
|
||||
#include <efi_loader.h>
|
||||
#include <menu.h>
|
||||
|
||||
#define EFICONFIG_ENTRY_NUM_MAX 99
|
||||
#define EFICONFIG_ENTRY_NUM_MAX INT_MAX
|
||||
#define EFICONFIG_VOLUME_PATH_MAX 512
|
||||
#define EFICONFIG_FILE_PATH_MAX 512
|
||||
#define EFICONFIG_FILE_PATH_BUF_SIZE (EFICONFIG_FILE_PATH_MAX * sizeof(u16))
|
||||
|
||||
extern const char *eficonfig_menu_desc;
|
||||
typedef efi_status_t (*eficonfig_entry_func)(void *data);
|
||||
|
||||
/**
|
||||
@ -45,14 +47,20 @@ struct eficonfig_entry {
|
||||
* @active: active menu entry index
|
||||
* @count: total count of menu entry
|
||||
* @menu_header: menu header string
|
||||
* @menu_desc: menu description string
|
||||
* @list: menu entry list structure
|
||||
* @start: top menu index to draw
|
||||
* @end: bottom menu index to draw
|
||||
*/
|
||||
struct efimenu {
|
||||
int delay;
|
||||
int active;
|
||||
int count;
|
||||
char *menu_header;
|
||||
const char *menu_desc;
|
||||
struct list_head list;
|
||||
int start;
|
||||
int end;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -86,9 +94,16 @@ struct eficonfig_select_file_info {
|
||||
};
|
||||
|
||||
void eficonfig_print_msg(char *msg);
|
||||
void eficonfig_print_entry(void *data);
|
||||
void eficonfig_display_statusline(struct menu *m);
|
||||
char *eficonfig_choice_entry(void *data);
|
||||
void eficonfig_destroy(struct efimenu *efi_menu);
|
||||
efi_status_t eficonfig_process_quit(void *data);
|
||||
efi_status_t eficonfig_process_common(struct efimenu *efi_menu, char *menu_header);
|
||||
efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
|
||||
char *menu_header, const char *menu_desc,
|
||||
void (*display_statusline)(struct menu *),
|
||||
void (*item_data_print)(void *),
|
||||
char *(*item_choice)(void *));
|
||||
efi_status_t eficonfig_process_select_file(void *data);
|
||||
efi_status_t eficonfig_get_unused_bootoption(u16 *buf,
|
||||
efi_uintn_t buf_size, u32 *index);
|
||||
|
@ -328,6 +328,7 @@ extern const efi_guid_t efi_esrt_guid;
|
||||
extern const efi_guid_t smbios_guid;
|
||||
/*GUID of console */
|
||||
extern const efi_guid_t efi_guid_text_input_protocol;
|
||||
extern const efi_guid_t efi_guid_text_output_protocol;
|
||||
|
||||
extern char __efi_runtime_start[], __efi_runtime_stop[];
|
||||
extern char __efi_runtime_rel_start[], __efi_runtime_rel_stop[];
|
||||
|
@ -535,7 +535,7 @@ const char *spl_board_loader_name(u32 boot_device);
|
||||
void __noreturn jump_to_image_linux(struct spl_image_info *spl_image);
|
||||
|
||||
/**
|
||||
* jump_to_image_linux() - Jump to OP-TEE OS from SPL
|
||||
* jump_to_image_optee() - Jump to OP-TEE OS from SPL
|
||||
*
|
||||
* This jumps into OP-TEE OS using the information in @spl_image.
|
||||
*
|
||||
|
@ -1949,6 +1949,7 @@ efi_status_t efi_load_image_from_path(bool boot_policy,
|
||||
efi_uintn_t buffer_size;
|
||||
uint64_t addr, pages;
|
||||
const efi_guid_t *guid;
|
||||
struct efi_handler *handler;
|
||||
|
||||
/* In case of failure nothing is returned */
|
||||
*buffer = NULL;
|
||||
@ -1970,11 +1971,11 @@ efi_status_t efi_load_image_from_path(bool boot_policy,
|
||||
}
|
||||
if (ret != EFI_SUCCESS)
|
||||
return EFI_NOT_FOUND;
|
||||
ret = EFI_CALL(efi_handle_protocol(device, guid,
|
||||
(void **)&load_file_protocol));
|
||||
ret = efi_search_protocol(device, guid, &handler);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return EFI_NOT_FOUND;
|
||||
buffer_size = 0;
|
||||
load_file_protocol = handler->protocol_interface;
|
||||
ret = EFI_CALL(load_file_protocol->load_file(
|
||||
load_file_protocol, rem, boot_policy,
|
||||
&buffer_size, NULL));
|
||||
|
@ -115,7 +115,7 @@ efi_status_t efi_esrt_allocate_install(u32 num_entries)
|
||||
u32 size = efi_esrt_entries_to_size(num_entries);
|
||||
efi_guid_t esrt_guid = efi_esrt_guid;
|
||||
|
||||
/* Reserve num_pages for ESRT */
|
||||
/* Reserve memory for ESRT */
|
||||
ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, size,
|
||||
(void **)&new_esrt);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user