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>
This commit is contained in:
Ricardo Ribalda Delgado
2016-12-20 10:08:45 +01:00
committed by Martin Roth
parent e38f85915f
commit b2bb6ad2a7

View File

@@ -15,6 +15,7 @@
#include <AGESA.h> #include <AGESA.h>
#include <cbfs.h> #include <cbfs.h>
#include <delay.h>
#include <cpu/amd/pi/s3_resume.h> #include <cpu/amd/pi/s3_resume.h>
#include <cpu/x86/mtrr.h> #include <cpu/x86/mtrr.h>
#include <cpuRegisters.h> #include <cpuRegisters.h>
@@ -107,6 +108,12 @@ AGESA_STATUS agesawrapper_amdinitearly(void)
AmdEarlyParamsPtr->GnbConfig.PsppPolicy = PsppDisabled; AmdEarlyParamsPtr->GnbConfig.PsppPolicy = PsppDisabled;
status = AmdInitEarly ((AMD_EARLY_PARAMS *)AmdParamStruct.NewStructPtr); 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); if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);
AmdReleaseStruct (&AmdParamStruct); AmdReleaseStruct (&AmdParamStruct);