1c8a311d9SSimon Glass /* 2c8a311d9SSimon Glass * Copyright (c) 2013 The Chromium OS Authors. 3c8a311d9SSimon Glass * 41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 5c8a311d9SSimon Glass */ 6c8a311d9SSimon Glass 7c8a311d9SSimon Glass #include <common.h> 8c8a311d9SSimon Glass #include <initcall.h> 9*f134ed7dSSimon Glass #include <efi.h> 10c8a311d9SSimon Glass 112f43f854SSimon Glass DECLARE_GLOBAL_DATA_PTR; 122f43f854SSimon Glass 132f43f854SSimon Glass int initcall_run_list(const init_fnc_t init_sequence[]) 14c8a311d9SSimon Glass { 152f43f854SSimon Glass const init_fnc_t *init_fnc_ptr; 16c8a311d9SSimon Glass 17c8a311d9SSimon Glass for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { 182f43f854SSimon Glass unsigned long reloc_ofs = 0; 19aacc6c5dSSimon Glass int ret; 202f43f854SSimon Glass 212f43f854SSimon Glass if (gd->flags & GD_FLG_RELOC) 222f43f854SSimon Glass reloc_ofs = gd->reloc_off; 23*f134ed7dSSimon Glass #ifdef CONFIG_EFI_APP 24*f134ed7dSSimon Glass reloc_ofs = (unsigned long)image_base; 25*f134ed7dSSimon Glass #endif 26e38d1cb2SAlexey Brodkin debug("initcall: %p", (char *)*init_fnc_ptr - reloc_ofs); 27e38d1cb2SAlexey Brodkin if (gd->flags & GD_FLG_RELOC) 28e38d1cb2SAlexey Brodkin debug(" (relocated to %p)\n", (char *)*init_fnc_ptr); 29e38d1cb2SAlexey Brodkin else 30e38d1cb2SAlexey Brodkin debug("\n"); 31aacc6c5dSSimon Glass ret = (*init_fnc_ptr)(); 32aacc6c5dSSimon Glass if (ret) { 33aacc6c5dSSimon Glass printf("initcall sequence %p failed at call %p (err=%d)\n", 342f43f854SSimon Glass init_sequence, 35aacc6c5dSSimon Glass (char *)*init_fnc_ptr - reloc_ofs, ret); 36c8a311d9SSimon Glass return -1; 37c8a311d9SSimon Glass } 38c8a311d9SSimon Glass } 39c8a311d9SSimon Glass return 0; 40c8a311d9SSimon Glass } 41