blob: db7c558bde5efc9fbf03b33298936614e6a61bf3 [file] [log] [blame]
Simon Glassc8a311d2013-03-05 14:39:40 +00001/*
2 * Copyright (c) 2013 The Chromium OS Authors.
3 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02004 * SPDX-License-Identifier: GPL-2.0+
Simon Glassc8a311d2013-03-05 14:39:40 +00005 */
6
7#include <common.h>
8#include <initcall.h>
Simon Glassf134ed72015-07-31 09:31:38 -06009#include <efi.h>
Simon Glassc8a311d2013-03-05 14:39:40 +000010
Simon Glass2f43f852014-05-20 06:01:43 -060011DECLARE_GLOBAL_DATA_PTR;
12
13int initcall_run_list(const init_fnc_t init_sequence[])
Simon Glassc8a311d2013-03-05 14:39:40 +000014{
Simon Glass2f43f852014-05-20 06:01:43 -060015 const init_fnc_t *init_fnc_ptr;
Simon Glassc8a311d2013-03-05 14:39:40 +000016
17 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
Simon Glass2f43f852014-05-20 06:01:43 -060018 unsigned long reloc_ofs = 0;
Simon Glassaacc6c52014-10-01 19:57:22 -060019 int ret;
Simon Glass2f43f852014-05-20 06:01:43 -060020
21 if (gd->flags & GD_FLG_RELOC)
22 reloc_ofs = gd->reloc_off;
Simon Glassf134ed72015-07-31 09:31:38 -060023#ifdef CONFIG_EFI_APP
24 reloc_ofs = (unsigned long)image_base;
25#endif
Alexey Brodkine38d1cb2014-12-28 01:35:57 +030026 debug("initcall: %p", (char *)*init_fnc_ptr - reloc_ofs);
27 if (gd->flags & GD_FLG_RELOC)
28 debug(" (relocated to %p)\n", (char *)*init_fnc_ptr);
29 else
30 debug("\n");
Simon Glassaacc6c52014-10-01 19:57:22 -060031 ret = (*init_fnc_ptr)();
32 if (ret) {
33 printf("initcall sequence %p failed at call %p (err=%d)\n",
Simon Glass2f43f852014-05-20 06:01:43 -060034 init_sequence,
Simon Glassaacc6c52014-10-01 19:57:22 -060035 (char *)*init_fnc_ptr - reloc_ofs, ret);
Simon Glassc8a311d2013-03-05 14:39:40 +000036 return -1;
37 }
38 }
39 return 0;
40}