xref: /rk3399_rockchip-uboot/lib/initcall.c (revision f134ed7df1167c6b2f0a62e3765abedced3feacc)
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