blob: 6d6d623be4d0bfdb25478a8676e3022896848b49 [file] [log] [blame]
Andrey Petrov9de55cc2016-02-25 14:19:07 -08001/*
2 * This file is part of the coreboot project.
3 *
Lee Leahy47bd2d92016-07-24 18:12:16 -07004 * Copyright (C) 2015-2016 Intel Corp.
Andrey Petrov9de55cc2016-02-25 14:19:07 -08005 * (Written by Andrey Petrov <andrey.petrov@intel.com> for Intel Corp.)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 */
12
13#include <arch/cpu.h>
Lee Leahy806fa242016-08-01 13:55:02 -070014#include <bootstate.h>
Aaron Durbin64031672018-04-21 14:45:32 -060015#include <compiler.h>
Andrey Petrov9de55cc2016-02-25 14:19:07 -080016#include <console/console.h>
Andrey Petrov9de55cc2016-02-25 14:19:07 -080017#include <fsp/util.h>
Lee Leahy806fa242016-08-01 13:55:02 -070018#include <soc/intel/common/util.h>
Andrey Petrov9de55cc2016-02-25 14:19:07 -080019#include <string.h>
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070020#include <timestamp.h>
Andrey Petrov9de55cc2016-02-25 14:19:07 -080021
Lee Leahy806fa242016-08-01 13:55:02 -070022static void fsp_notify(enum fsp_notify_phase phase)
Andrey Petrov9de55cc2016-02-25 14:19:07 -080023{
Brandon Breitensteinc31ba0e2016-07-27 17:34:45 -070024 uint32_t ret;
Andrey Petrov9de55cc2016-02-25 14:19:07 -080025 fsp_notify_fn fspnotify;
26 struct fsp_notify_params notify_params = { .phase = phase };
27
Lee Leahy9671faa2016-07-24 18:18:52 -070028 if (!fsps_hdr.notify_phase_entry_offset)
29 die("Notify_phase_entry_offset is zero!\n");
Andrey Petrov9de55cc2016-02-25 14:19:07 -080030
Lee Leahy27de7682017-03-10 08:33:16 -080031 fspnotify = (void *) (fsps_hdr.image_base +
Andrey Petrov9de55cc2016-02-25 14:19:07 -080032 fsps_hdr.notify_phase_entry_offset);
Lee Leahy672df162016-07-24 18:21:13 -070033 fsp_before_debug_notify(fspnotify, &notify_params);
Andrey Petrov9de55cc2016-02-25 14:19:07 -080034
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070035 if (phase == AFTER_PCI_ENUM) {
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070036 timestamp_add_now(TS_FSP_BEFORE_ENUMERATE);
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070037 post_code(POST_FSP_NOTIFY_BEFORE_ENUMERATE);
38 } else if (phase == READY_TO_BOOT) {
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070039 timestamp_add_now(TS_FSP_BEFORE_FINALIZE);
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070040 post_code(POST_FSP_NOTIFY_BEFORE_FINALIZE);
Aaron Durbin96b3c6f2016-11-10 21:09:25 -060041 } else if (phase == END_OF_FIRMWARE) {
42 timestamp_add_now(TS_FSP_BEFORE_END_OF_FIRMWARE);
43 post_code(POST_FSP_NOTIFY_BEFORE_END_OF_FIRMWARE);
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070044 }
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070045
46 ret = fspnotify(&notify_params);
47
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070048 if (phase == AFTER_PCI_ENUM) {
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070049 timestamp_add_now(TS_FSP_AFTER_ENUMERATE);
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070050 post_code(POST_FSP_NOTIFY_BEFORE_ENUMERATE);
51 } else if (phase == READY_TO_BOOT) {
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070052 timestamp_add_now(TS_FSP_AFTER_FINALIZE);
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070053 post_code(POST_FSP_NOTIFY_BEFORE_FINALIZE);
Aaron Durbin96b3c6f2016-11-10 21:09:25 -060054 } else if (phase == END_OF_FIRMWARE) {
55 timestamp_add_now(TS_FSP_AFTER_END_OF_FIRMWARE);
56 post_code(POST_FSP_NOTIFY_AFTER_END_OF_FIRMWARE);
Alexandru Gagniucc4ea8f72016-05-23 12:16:58 -070057 }
Lee Leahy672df162016-07-24 18:21:13 -070058 fsp_debug_after_notify(ret);
Alexandru Gagniuc010225c2016-05-06 08:22:45 -070059
Lee Leahy9671faa2016-07-24 18:18:52 -070060 /* Handle any errors returned by FspNotify */
61 fsp_handle_reset(ret);
62 if (ret != FSP_SUCCESS) {
63 printk(BIOS_SPEW, "FspNotify returned 0x%08x\n", ret);
64 die("FspNotify returned an error!\n");
65 }
Lee Leahy806fa242016-08-01 13:55:02 -070066
67 /* Allow the platform to run something after FspNotify */
68 platform_fsp_notify_status(phase);
69}
70
71static void fsp_notify_dummy(void *arg)
72{
73 enum fsp_notify_phase phase = (uint32_t)arg;
74
75 /* Display the MTRRs */
76 if (IS_ENABLED(CONFIG_DISPLAY_MTRRS))
77 soc_display_mtrrs();
78
79 fsp_notify(phase);
80 if (phase == READY_TO_BOOT)
81 fsp_notify(END_OF_FIRMWARE);
82}
83
Subrata Banik3f3025d2017-08-18 15:05:05 +053084BOOT_STATE_INIT_ENTRY(BS_DEV_ENABLE, BS_ON_ENTRY, fsp_notify_dummy,
Lee Leahy806fa242016-08-01 13:55:02 -070085 (void *) AFTER_PCI_ENUM);
86BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, fsp_notify_dummy,
87 (void *) READY_TO_BOOT);
88BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, fsp_notify_dummy,
89 (void *) READY_TO_BOOT);
90
Aaron Durbin64031672018-04-21 14:45:32 -060091__weak void platform_fsp_notify_status(
Lee Leahy806fa242016-08-01 13:55:02 -070092 enum fsp_notify_phase phase)
93{
Andrey Petrov9de55cc2016-02-25 14:19:07 -080094}