diff options
author | Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | 2016-12-20 10:08:45 +0100 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2017-03-02 22:04:43 +0100 |
commit | b2bb6ad2a72a926796a7eaede06ef8acd556c472 (patch) | |
tree | ecde01e2e8a87bfe54c5c35cbd20995b7b03daa6 /src | |
parent | e38f85915f7681f9e52970682f7c476791eb2301 (diff) |
agesawrapper: Fix endless loop on bettong
AGESA AmdInitEarly() reconfigures the lapic timer in a way that
conflicts with lapic/apic_timer.
This results in an endless loop when printk() is called after
AmdInitEarly() and before the apic_timer is initialized.
This patch forces a reconfiguration of the timer after
AmdInitEarly() is called.
Codepath of the endless loop:
printk()->
(...)->
uart_tx_byte->
uart8250_mem_tx_byte->
udelay()->
start = lapic_read(LAPIC_TMCCT);
do {
value = lapic_read(LAPIC_TMCCT);
} while ((start - value) < ticks);
[lapic_read returns the same value after AmdInitEarly()]
Change-Id: I1a08789c89401b2bf6d11846ad7c376bfc68801b
Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Reviewed-on: https://review.coreboot.org/17924
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/northbridge/amd/pi/agesawrapper.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/northbridge/amd/pi/agesawrapper.c b/src/northbridge/amd/pi/agesawrapper.c index 0fe8eab01c..2e79f47ac6 100644 --- a/src/northbridge/amd/pi/agesawrapper.c +++ b/src/northbridge/amd/pi/agesawrapper.c @@ -15,6 +15,7 @@ #include <AGESA.h> #include <cbfs.h> +#include <delay.h> #include <cpu/amd/pi/s3_resume.h> #include <cpu/x86/mtrr.h> #include <cpuRegisters.h> @@ -107,6 +108,12 @@ AGESA_STATUS agesawrapper_amdinitearly(void) AmdEarlyParamsPtr->GnbConfig.PsppPolicy = PsppDisabled; status = AmdInitEarly ((AMD_EARLY_PARAMS *)AmdParamStruct.NewStructPtr); + /* + * init_timer() needs to be called on CZ PI, because AGESA resets the LAPIC reload value + * on the AMD_INIT_EARLY call + */ + if (IS_ENABLED(CONFIG_CPU_AMD_PI_00660F01)) + init_timer(); if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus); AmdReleaseStruct (&AmdParamStruct); |