Hook up libhwbase in ramstage

It's hidden behind a configuration option `CONFIG_RAMSTAGE_LIBHWBASE`.

This also adds some glue code to use the coreboot console for debug
output and our monotonic timer framework as timer backend.

v2: Also update 3rdparty/libhwbase to the latest master commit.

Change-Id: I8e8d50271b46aac1141f95ab55ad323ac0889a8d
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/16951
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Nico Huber 2016-10-05 17:46:49 +02:00 committed by Nico Huber
parent 079b5c65c3
commit c83239eabc
9 changed files with 165 additions and 2 deletions

2
3rdparty/libhwbase vendored

@ -1 +1 @@
Subproject commit 5e9b1b50e7ac90f68ca2ea798ef656ac863c2851 Subproject commit aab715f166bf1b54cfbd6982e8df49248ea544d8

View File

@ -1262,3 +1262,12 @@ config RAMSTAGE_ADA
def_bool n def_bool n
help help
Selected by features that use Ada code in ramstage. Selected by features that use Ada code in ramstage.
config RAMSTAGE_LIBHWBASE
def_bool n
select RAMSTAGE_ADA
help
Selected by features that require `libhwbase` in ramstage.
config HWBASE_DYNAMIC_MMIO
def_bool y

View File

@ -399,4 +399,13 @@ config NO_EARLY_BOOTBLOCK_POSTCODES
POST codes that go out before the chipset's bootblock initialization POST codes that go out before the chipset's bootblock initialization
can happen. This option suppresses those POST codes. can happen. This option suppresses those POST codes.
config HWBASE_DEBUG_CB
bool
default y if DEFAULT_CONSOLE_LOGLEVEL_7 || DEFAULT_CONSOLE_LOGLEVEL_8
default n
config HWBASE_DEBUG_NULL
def_bool y
depends on !HWBASE_DEBUG_CB
endmenu endmenu

View File

@ -2,6 +2,10 @@ ramstage-y += vtxprintf.c printk.c vsprintf.c
ramstage-y += init.c console.c ramstage-y += init.c console.c
ramstage-y += post.c ramstage-y += post.c
ramstage-y += die.c ramstage-y += die.c
ifeq ($(CONFIG_HWBASE_DEBUG_CB),y)
ramstage-$(CONFIG_RAMSTAGE_LIBHWBASE) += hw-debug_sink.ads
ramstage-$(CONFIG_RAMSTAGE_LIBHWBASE) += hw-debug_sink.adb
endif
smm-$(CONFIG_DEBUG_SMI) += init.c console.c vtxprintf.c printk.c smm-$(CONFIG_DEBUG_SMI) += init.c console.c vtxprintf.c printk.c
smm-$(CONFIG_SMM_TSEG) += die.c smm-$(CONFIG_SMM_TSEG) += die.c

View File

@ -0,0 +1,59 @@
--
-- This file is part of the coreboot project.
--
-- Copyright (C) 2015 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; version 2 of the License.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
with Interfaces.C;
use type Interfaces.C.int;
package body HW.Debug_Sink is
Sink_Enabled : Boolean;
procedure console_tx_byte (chr : Interfaces.C.char);
pragma Import (C, console_tx_byte, "console_tx_byte");
procedure Put (Item : String) is
begin
if Sink_Enabled then
for Idx in Item'Range loop
console_tx_byte (Interfaces.C.To_C (Item (Idx)));
end loop;
end if;
end Put;
procedure Put_Char (Item : Character) is
begin
if Sink_Enabled then
console_tx_byte (Interfaces.C.To_C (Item));
end if;
end Put_Char;
procedure New_Line is
begin
Put_Char (Character'Val (16#0a#));
end New_Line;
----------------------------------------------------------------------------
function console_log_level
(msg_level : Interfaces.C.int)
return Interfaces.C.int;
pragma Import (C, console_log_level, "console_log_level");
Msg_Level_BIOS_DEBUG : constant := 7;
begin
Sink_Enabled := console_log_level (Msg_Level_BIOS_DEBUG) /= 0;
end HW.Debug_Sink;

View File

@ -0,0 +1,24 @@
--
-- This file is part of the coreboot project.
--
-- Copyright (C) 2015 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; version 2 of the License.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
package HW.Debug_Sink is
procedure Put (Item : String);
procedure Put_Char (Item : Character);
procedure New_Line;
end HW.Debug_Sink;

View File

@ -269,3 +269,13 @@ $(objcbfs)/%.debug.rmod: $(objcbfs)/%.debug | $(RMODTOOL)
$(obj)/%.elf.rmod: $(obj)/%.elf | $(RMODTOOL) $(obj)/%.elf.rmod: $(obj)/%.elf | $(RMODTOOL)
$(RMODTOOL) -i $< -o $@ $(RMODTOOL) -i $< -o $@
ifeq ($(CONFIG_RAMSTAGE_LIBHWBASE),y)
$(call add-special-class,hw)
hw-handler = $(eval ramstage-srcs += $$(addprefix $(1),$(2)))
subdirs-y += ../../3rdparty/libhwbase
ramstage-$(CONFIG_HAVE_MONOTONIC_TIMER) += hw-time-timer.adb
endif # CONFIG_RAMSTAGE_LIBHWBASE

View File

@ -62,5 +62,5 @@ $(foreach arch,$(standard-archs), \
$(eval $(call libgnat-template,$(arch)))) $(eval $(call libgnat-template,$(arch))))
ifeq ($(CONFIG_RAMSTAGE_ADA),y) ifeq ($(CONFIG_RAMSTAGE_ADA),y)
ramstage-libs += $$(obj)/libgnat-$(ARCH-ramstage-y)/libgnat.a ramstage-libs += $(obj)/libgnat-$(ARCH-ramstage-y)/libgnat.a
endif endif

48
src/lib/hw-time-timer.adb Normal file
View File

@ -0,0 +1,48 @@
--
-- This file is part of the coreboot project.
--
-- Copyright (C) 2016 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; version 2 of the License.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
with Interfaces.C;
package body HW.Time.Timer
with Refined_State => (Timer_State => null,
Abstract_Time => null)
is
procedure Timer_Monotonic_Get (MT : out Interfaces.C.long);
pragma Import (C, Timer_Monotonic_Get, "timer_monotonic_get");
function Raw_Value_Min return T
with
SPARK_Mode => Off
is
Microseconds : Interfaces.C.long;
begin
Timer_Monotonic_Get (Microseconds);
return T (Microseconds);
end Raw_Value_Min;
function Raw_Value_Max return T
is
begin
return Raw_Value_Min + 1;
end Raw_Value_Max;
function Hz return T
is
begin
return 1_000_000;
end Hz;
end HW.Time.Timer;