S3 code in vendorcode folder.
Change the ExecuteFinalHltInstruction to assembly code. so we can make sure the code can run stackless. Change-Id: I783ced6cf7c5bc29c12a37aef29077e610d8957d Signed-off-by: Zheng Bao <zheng.bao@amd.com> Signed-off-by: zbao <fishbaozi@gmail.com> Reviewed-on: http://review.coreboot.org/622 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
		@@ -113,6 +113,7 @@ agesa_lib_src += $(AGESA_ROOT)/Proc/GNB/Gfx/GfxInitAtMidPost.c
 | 
				
			|||||||
agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/Family/0x14/cpuF14CacheDefaults.c
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/Family/0x14/cpuF14CacheDefaults.c
 | 
				
			||||||
agesa_lib_src += $(AGESA_ROOT)/Proc/Mem/Ps/ON/mpuon3.c
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/Mem/Ps/ON/mpuon3.c
 | 
				
			||||||
agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/cahalt.c
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/cahalt.c
 | 
				
			||||||
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/cahaltasm.S
 | 
				
			||||||
agesa_lib_src += $(AGESA_ROOT)/Proc/Mem/Tech/mt.c
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/Mem/Tech/mt.c
 | 
				
			||||||
agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/Family/0x14/ON/F14OnMicrocodePatchTables.c
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/Family/0x14/ON/F14OnMicrocodePatchTables.c
 | 
				
			||||||
agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/Family/0x14/ON/F14OnPciTables.c
 | 
					agesa_lib_src += $(AGESA_ROOT)/Proc/CPU/Family/0x14/ON/F14OnPciTables.c
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -305,7 +305,9 @@ static __inline__ __attribute__((always_inline)) unsigned long __readcr0(void)
 | 
				
			|||||||
  unsigned long value;
 | 
					  unsigned long value;
 | 
				
			||||||
  __asm__ __volatile__ (
 | 
					  __asm__ __volatile__ (
 | 
				
			||||||
    "mov %%cr0, %[value]" 
 | 
					    "mov %%cr0, %[value]" 
 | 
				
			||||||
    : [value] "=a" (value));
 | 
					    : [value] "=a" (value)
 | 
				
			||||||
 | 
					    :
 | 
				
			||||||
 | 
					    : "memory");
 | 
				
			||||||
  return value;
 | 
					  return value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -379,6 +381,7 @@ static __inline__ __attribute__((always_inline)) void __writecr0(unsigned long D
 | 
				
			|||||||
    "mov %%eax, %%cr0"
 | 
					    "mov %%eax, %%cr0"
 | 
				
			||||||
    : 
 | 
					    : 
 | 
				
			||||||
    : "a" (Data)
 | 
					    : "a" (Data)
 | 
				
			||||||
 | 
					    : "memory"
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -508,13 +511,16 @@ static __inline__ __attribute__((always_inline)) void __debugbreak(void)
 | 
				
			|||||||
  __asm__ __volatile__ ("int3");
 | 
					  __asm__ __volatile__ ("int3");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static __inline__ __attribute__((always_inline)) void __invd(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  __asm__ __volatile__ ("invd");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static __inline__ __attribute__((always_inline)) void __wbinvd(void)
 | 
					static __inline__ __attribute__((always_inline)) void __wbinvd(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  __asm__ __volatile__ ("wbinvd");
 | 
					  __asm__ __volatile__ ("wbinvd");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static __inline__ __attribute__((always_inline)) void __lidt(void *Source)
 | 
					static __inline__ __attribute__((always_inline)) void __lidt(void *Source)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  __asm__ __volatile__("lidt %0" : : "m"(*(short*)Source));
 | 
					  __asm__ __volatile__("lidt %0" : : "m"(*(short*)Source));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,149 +106,16 @@ ExecuteWbinvdInstruction (
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//----------------------------------------------------------------------------
 | 
					/* see cahaltasm.S
 | 
				
			||||||
 | 
					 | 
				
			||||||
STATIC
 | 
					 | 
				
			||||||
VOID
 | 
					 | 
				
			||||||
PrimaryCoreFunctions (AP_MTRR_SETTINGS  *ApMtrrSettingsList)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
   UINT64 data;
 | 
					 | 
				
			||||||
   UINT32 msrno;
 | 
					 | 
				
			||||||
   // Configure the MTRRs on the AP so
 | 
					 | 
				
			||||||
   // when it runs remote code it will execute
 | 
					 | 
				
			||||||
   // out of RAM instead of ROM.
 | 
					 | 
				
			||||||
   // Disable MTRRs and turn on modification enable bit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   data = __readmsr (0xC0010010);         // MTRR_SYS_CFG
 | 
					 | 
				
			||||||
   data &= ~(1 << 18);                    // MtrrFixDramEn
 | 
					 | 
				
			||||||
   data &= ~(1 << 20);                    // MtrrVarDramEn
 | 
					 | 
				
			||||||
   data |= (1 << 19);                     // MtrrFixDramModEn
 | 
					 | 
				
			||||||
   data |= (1 << 17);                     // SysUcLockEn
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   __writemsr (0xC0010010, data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Set 7FFFh-00000h and 9FFFFh-80000h as WB DRAM
 | 
					 | 
				
			||||||
   __writemsr (0x250, 0x1E1E1E1E1E1E1E1E); // AMD_MTRR_FIX64k_00000
 | 
					 | 
				
			||||||
   __writemsr (0x258, 0x1E1E1E1E1E1E1E1E); // AMD_MTRR_FIX16k_80000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Set BFFFFh-A0000h, DFFFFh-C0000h as Uncacheable Memory-mapped IO
 | 
					 | 
				
			||||||
   __writemsr (0x259, 0);                 // AMD_AP_MTRR_FIX16k_A0000
 | 
					 | 
				
			||||||
   __writemsr (0x268, 0);                 // AMD_MTRR_FIX4k_C0000
 | 
					 | 
				
			||||||
   __writemsr (0x269, 0);                 // AMD_MTRR_FIX4k_C8000
 | 
					 | 
				
			||||||
   __writemsr (0x26A, 0);                 // AMD_MTRR_FIX4k_D0000
 | 
					 | 
				
			||||||
   __writemsr (0x26B, 0);                 // AMD_MTRR_FIX4k_D8000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Set FFFFFh-E0000h as Uncacheable Memory
 | 
					 | 
				
			||||||
   for (msrno = 0x26C; msrno <= 0x26F; msrno++)
 | 
					 | 
				
			||||||
      __writemsr (msrno, 0x1818181818181818);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // If IBV provided settings for Fixed-Sized MTRRs,
 | 
					 | 
				
			||||||
   // overwrite the default settings.
 | 
					 | 
				
			||||||
   if ((uintptr_t) ApMtrrSettingsList != 0 && (uintptr_t) ApMtrrSettingsList != 0xFFFFFFFF)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
      int index;
 | 
					 | 
				
			||||||
      for (index = 0; ApMtrrSettingsList [index].MsrAddr != CPU_LIST_TERMINAL; index++)
 | 
					 | 
				
			||||||
         __writemsr (ApMtrrSettingsList [index].MsrAddr, ApMtrrSettingsList [index].MsrData);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // restore variable MTTR6 and MTTR7 to default states
 | 
					 | 
				
			||||||
   for (msrno = 0x20F; msrno <= 0x20C; msrno--)  // decrement so that the pair is disable before the base is cleared
 | 
					 | 
				
			||||||
      __writemsr (msrno, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Enable fixed-range and variable-range MTRRs
 | 
					 | 
				
			||||||
   // Set Fixed-Range Enable (FE) and MTRR Enable (E) bits
 | 
					 | 
				
			||||||
   __writemsr (0x2FF, __readmsr (0x2FF) | 0xC00);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Enable Top-of-Memory setting
 | 
					 | 
				
			||||||
   // Enable use of RdMem/WrMem bits attributes
 | 
					 | 
				
			||||||
   data = __readmsr (0xC0010010);         // MTRR_SYS_CFG
 | 
					 | 
				
			||||||
   data |= (1 << 18);                     // MtrrFixDramEn
 | 
					 | 
				
			||||||
   data |= (1 << 20);                     // MtrrVarDramEn
 | 
					 | 
				
			||||||
   data &= ~(1 << 19);                    // MtrrFixDramModEn
 | 
					 | 
				
			||||||
   __writemsr (0xC0010010, data);
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ExecuteFinalHltInstruction (
 | 
					ExecuteFinalHltInstruction (
 | 
				
			||||||
  IN       UINT32 SharedCore,
 | 
					  IN       UINT32 HaltFlags,
 | 
				
			||||||
  IN       AP_MTRR_SETTINGS  *ApMtrrSettingsList,
 | 
					  IN       AP_MTRR_SETTINGS  *ApMtrrSettingsList,
 | 
				
			||||||
  IN       AMD_CONFIG_PARAMS *StdHeader
 | 
					  IN       AMD_CONFIG_PARAMS *StdHeader
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int abcdRegs [4];
 | 
					 | 
				
			||||||
   UINT32 cr0val;
 | 
					 | 
				
			||||||
   UINT64 data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   cr0val = __readcr0 ();
 | 
					 | 
				
			||||||
   if (SharedCore & 2)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
      // set CombineCr0Cd and enable cache in CR0
 | 
					 | 
				
			||||||
      __writemsr (MSR_CU_CFG3, __readmsr (MSR_CU_CFG3) | 1ULL << 49);
 | 
					 | 
				
			||||||
      __writecr0 (cr0val & ~0x60000000);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
   else
 | 
					 | 
				
			||||||
      __writecr0 (cr0val | 0x60000000);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (SharedCore & 1) PrimaryCoreFunctions (ApMtrrSettingsList);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Make sure not to touch any Shared MSR from this point on
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Restore settings that were temporarily overridden for the cache as ram phase
 | 
					 | 
				
			||||||
   data = __readmsr (0xC0011022);      // MSR_DC_CFG
 | 
					 | 
				
			||||||
   data &= ~(1 << 4);                  // DC_DIS_SPEC_TLB_RLD
 | 
					 | 
				
			||||||
   data &= ~(1 << 8);                  // DIS_CLR_WBTOL2_SMC_HIT
 | 
					 | 
				
			||||||
   data &= ~(1 << 13);                 // DIS_HW_PF
 | 
					 | 
				
			||||||
   __writemsr (0xC0011022, data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   data = __readmsr (0xC0011021);      // MSR_IC_CFG - C001_1021
 | 
					 | 
				
			||||||
   data &= ~(1 << 9);                  // IC_DIS_SPEC_TLB_RLD
 | 
					 | 
				
			||||||
   __writemsr (0xC0011021, data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // AMD_DISABLE_STACK_FAMILY_HOOK
 | 
					 | 
				
			||||||
   __cpuid (abcdRegs, 1);
 | 
					 | 
				
			||||||
   if ((abcdRegs [0] >> 20) == 1) //-----family 10h (Hydra) only-----
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
      data = __readmsr (0xC0011022);
 | 
					 | 
				
			||||||
      data &= ~(1 << 4);
 | 
					 | 
				
			||||||
      data &= ~(1 << 8);
 | 
					 | 
				
			||||||
      data &= ~(1 << 13);
 | 
					 | 
				
			||||||
      __writemsr (0xC0011022, data);
 | 
					 | 
				
			||||||
      
 | 
					 | 
				
			||||||
      data = __readmsr (0xC0011021);
 | 
					 | 
				
			||||||
      data &= ~(1 << 14);
 | 
					 | 
				
			||||||
      data &= ~(1 << 9);
 | 
					 | 
				
			||||||
      __writemsr (0xC0011021, data);
 | 
					 | 
				
			||||||
      
 | 
					 | 
				
			||||||
      data = __readmsr (0xC001102A);
 | 
					 | 
				
			||||||
      data &= ~(1 << 15);
 | 
					 | 
				
			||||||
      data &= ~(1ull << 35);
 | 
					 | 
				
			||||||
      __writemsr (0xC001102A, data);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
   else if ((abcdRegs [0] >> 20) == 6) //-----family 15h (Orochi) only-----
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
      data = __readmsr (0xC0011020);
 | 
					 | 
				
			||||||
      data &= ~(1 << 28);
 | 
					 | 
				
			||||||
      __writemsr (0xC0011020, data);
 | 
					 | 
				
			||||||
      
 | 
					 | 
				
			||||||
      data = __readmsr (0xC0011021);
 | 
					 | 
				
			||||||
      data &= ~(1 << 9);
 | 
					 | 
				
			||||||
      __writemsr (0xC0011021, data);
 | 
					 | 
				
			||||||
      
 | 
					 | 
				
			||||||
      data = __readmsr (0xC0011022);
 | 
					 | 
				
			||||||
      data &= ~(1 << 4);
 | 
					 | 
				
			||||||
      data &= ~(1l << 13);
 | 
					 | 
				
			||||||
      __writemsr (0xC0011022, data);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   for (;;)
 | 
					 | 
				
			||||||
     {
 | 
					 | 
				
			||||||
     _disable ();
 | 
					 | 
				
			||||||
     __halt ();
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//----------------------------------------------------------------------------
 | 
					//----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										203
									
								
								src/vendorcode/amd/agesa/f14/Proc/CPU/cahaltasm.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								src/vendorcode/amd/agesa/f14/Proc/CPU/cahaltasm.S
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,203 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2011, Advanced Micro Devices, Inc.
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					 *     * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *       notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *     * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *       notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *       documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *     * Neither the name of Advanced Micro Devices, Inc. nor the names of
 | 
				
			||||||
 | 
					 *       its contributors may be used to endorse or promote products derived
 | 
				
			||||||
 | 
					 *       from this software without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					 * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.include "src/vendorcode/amd/agesa/f14/gcccar.inc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.code32
 | 
				
			||||||
 | 
					.align 4
 | 
				
			||||||
 | 
					.globl ExecuteFinalHltInstruction
 | 
				
			||||||
 | 
					    .type   ExecuteFinalHltInstruction, @function
 | 
				
			||||||
 | 
					/* ExecuteFinalHltInstruction (
 | 
				
			||||||
 | 
					  IN       UINT32 HaltFlags,
 | 
				
			||||||
 | 
					  IN       AP_MTRR_SETTINGS  *ApMtrrSettingsList,
 | 
				
			||||||
 | 
					  IN       AMD_CONFIG_PARAMS *StdHeader
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This function disables CAR. We don't care about the stack on this CPU */
 | 
				
			||||||
 | 
					ExecuteFinalHltInstruction:
 | 
				
			||||||
 | 
					  movl 4(%esp),  %esi               /* HaltFlags*/
 | 
				
			||||||
 | 
					  movl 8(%esp),  %edi               /* ApMtrrSettingList */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  Do these special steps in case if the core is part of a compute unit
 | 
				
			||||||
 | 
					 *  Note: The following bits are family specific flags, that gets set during build time,
 | 
				
			||||||
 | 
					 *           and indicates things like "family cache control methodology", etc.
 | 
				
			||||||
 | 
					 *  esi bit0 = 0  -> not a Primary core
 | 
				
			||||||
 | 
					 *  esi bit0 = 1  -> Primary core
 | 
				
			||||||
 | 
					 *  esi bit1 = 0  -> Cache disable
 | 
				
			||||||
 | 
					 *  esi bit1 = 1  -> Cache enable
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bt $1, %esi                     /* .if (esi & 2h) */
 | 
				
			||||||
 | 
					  jz  0f
 | 
				
			||||||
 | 
					    /* Set CombineCr0Cd bit */
 | 
				
			||||||
 | 
					    movl $CU_CFG3,  %ecx
 | 
				
			||||||
 | 
					    rdmsr
 | 
				
			||||||
 | 
					    bts $(COMBINE_CR0_CD - 32),  %edx
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					    /* Clear the CR0.CD bit */
 | 
				
			||||||
 | 
					    movl %cr0,  %eax                /* Make sure cache is enabled for all APs */
 | 
				
			||||||
 | 
					    btr $CR0_CD,  %eax
 | 
				
			||||||
 | 
					    btr $CR0_NW,  %eax
 | 
				
			||||||
 | 
					    mov %eax,  %cr0                 /*  Write back to CR0 */
 | 
				
			||||||
 | 
					    jmp 1f                          /* .else */
 | 
				
			||||||
 | 
					0:
 | 
				
			||||||
 | 
					    movl %cr0,  %eax                /* Make sure cache is disabled for all APs */
 | 
				
			||||||
 | 
					    bts $CR0_CD,  %eax              /* Disable cache */
 | 
				
			||||||
 | 
					    bts $CR0_NW,  %eax
 | 
				
			||||||
 | 
					    movl %eax,  %cr0                /* Write back to CR0 */
 | 
				
			||||||
 | 
					1:                                  /* .endif */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bt $0,  %esi                     /* .if (esi & 1h) */
 | 
				
			||||||
 | 
					  jz  2f
 | 
				
			||||||
 | 
					    /* This core is a primary core and needs to do all the MTRRs, including shared MTRRs. */
 | 
				
			||||||
 | 
					    movl %edi,  %esi                /* Get ApMtrrSettingList */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Configure the MTRRs on the AP so
 | 
				
			||||||
 | 
					     * when it runs remote code it will execute
 | 
				
			||||||
 | 
					     * out of RAM instead of ROM.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable MTRRs and turn on modification enable bit */
 | 
				
			||||||
 | 
					    movl $MTRR_SYS_CFG, %ecx
 | 
				
			||||||
 | 
					    rdmsr
 | 
				
			||||||
 | 
					    btr $MTRR_VAR_DRAM_EN,  %eax      /* Disable */
 | 
				
			||||||
 | 
					    bts $MTRR_FIX_DRAM_MOD_EN,  %eax  /* Enable */
 | 
				
			||||||
 | 
					    btr $MTRR_FIX_DRAM_EN,  %eax      /* Disable */
 | 
				
			||||||
 | 
					    bts $SYS_UC_LOCK_EN,  %eax
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Setup default values for Fixed-Sized MTRRs */
 | 
				
			||||||
 | 
					    /* Set 7FFFh-00000h as WB */
 | 
				
			||||||
 | 
					    movl $AMD_AP_MTRR_FIX64k_00000,  %ecx
 | 
				
			||||||
 | 
					    movl $0x1E1E1E1E,  %eax
 | 
				
			||||||
 | 
					    movl %eax,  %edx
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set 9FFFFh-80000h also as WB */
 | 
				
			||||||
 | 
					    movl $AMD_AP_MTRR_FIX16k_80000,  %ecx
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set BFFFFh-A0000h as Uncacheable Memory-mapped IO */
 | 
				
			||||||
 | 
					    movl $AMD_AP_MTRR_FIX16k_A0000,  %ecx
 | 
				
			||||||
 | 
					    xorl %eax,  %eax
 | 
				
			||||||
 | 
					    xorl %edx,  %edx
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set DFFFFh-C0000h as Uncacheable Memory-mapped IO */
 | 
				
			||||||
 | 
					    xorl %eax,  %eax
 | 
				
			||||||
 | 
					    xorl %edx,  %edx
 | 
				
			||||||
 | 
					    movl $AMD_AP_MTRR_FIX4k_C0000,  %ecx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CDLoop:
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					    inc %ecx
 | 
				
			||||||
 | 
					    cmp $AMD_AP_MTRR_FIX4k_D8000,  %ecx
 | 
				
			||||||
 | 
					    jbe CDLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set FFFFFh-E0000h as Uncacheable Memory */
 | 
				
			||||||
 | 
					    movl $0x18181818,  %eax
 | 
				
			||||||
 | 
					    movl %eax,  %edx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mov $AMD_AP_MTRR_FIX4k_E0000, %ecx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EFLoop:
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					    inc %ecx
 | 
				
			||||||
 | 
					    cmp $AMD_AP_MTRR_FIX4k_F8000, %ecx
 | 
				
			||||||
 | 
					    jbe EFLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* If IBV provided settings for Fixed-Sized MTRRs,
 | 
				
			||||||
 | 
					     * overwrite the default settings. */
 | 
				
			||||||
 | 
					    cmp $0,  %esi           /*.if ((esi != 0) && (esi != 0FFFFFFFFh)) */
 | 
				
			||||||
 | 
					    jz 4f
 | 
				
			||||||
 | 
					    cmp $0xFFFFFFFF,  %esi
 | 
				
			||||||
 | 
					    jz 4f
 | 
				
			||||||
 | 
					      5:
 | 
				
			||||||
 | 
					      mov (%esi),  %ecx         /* (AP_MTRR_SETTINGS ptr [esi]).MsrAddr */
 | 
				
			||||||
 | 
					      /* While we are not at the end of the list */
 | 
				
			||||||
 | 
					      cmp $CPU_LIST_TERMINAL,  %ecx /* .while (ecx != CPU_LIST_TERMINAL)*/
 | 
				
			||||||
 | 
					      je 4f
 | 
				
			||||||
 | 
					        /* TODO - coreboot isn't checking for valid data.
 | 
				
			||||||
 | 
					         * Ensure that the MSR address is valid for Fixed-Sized MTRRs */
 | 
				
			||||||
 | 
					        /*.if ( ((ecx >= AMD_AP_MTRR_FIX4k_C0000) && (ecx <= AMD_AP_MTRR_FIX4k_F8000)) || \
 | 
				
			||||||
 | 
					               (ecx == AMD_AP_MTRR_FIX64k_00000) || (ecx == AMD_AP_MTRR_FIX16k_80000 ) || \
 | 
				
			||||||
 | 
					               (ecx == AMD_AP_MTRR_FIX16k_A0000))
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					          mov 4(%esi),  %eax                /* MsrData */
 | 
				
			||||||
 | 
					          mov 8(%esi),  %edx                /* MsrData */
 | 
				
			||||||
 | 
					          wrmsr
 | 
				
			||||||
 | 
					        /* .endif */
 | 
				
			||||||
 | 
					        add $12,  %esi                   /* sizeof (AP_MTRR_SETTINGS) */
 | 
				
			||||||
 | 
					        jmp 5b                               /* .endw */
 | 
				
			||||||
 | 
					    4: /* .endif */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* restore variable MTTR6 and MTTR7 to default states */
 | 
				
			||||||
 | 
					    movl $AMD_MTRR_VARIABLE_BASE6,  %ecx  /* clear MTRRPhysBase6 MTRRPhysMask6 */
 | 
				
			||||||
 | 
					    xor %eax,  %eax                         /* and MTRRPhysBase7 MTRRPhysMask7 */
 | 
				
			||||||
 | 
					    xor %edx,  %edx
 | 
				
			||||||
 | 
					    cmp $10,  %ecx                      /* .while (cl < 010h) */
 | 
				
			||||||
 | 
					    jge 6f
 | 
				
			||||||
 | 
					      wrmsr
 | 
				
			||||||
 | 
					      inc %ecx
 | 
				
			||||||
 | 
					    6:                                  /* .endw */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable fixed-range and variable-range MTRRs */
 | 
				
			||||||
 | 
					    mov $AMD_MTRR_DEFTYPE,  %ecx
 | 
				
			||||||
 | 
					    rdmsr
 | 
				
			||||||
 | 
					    bts $MTRR_DEF_TYPE_EN,  %eax      /* MtrrDefTypeEn */
 | 
				
			||||||
 | 
					    bts $MTRR_DEF_TYPE_FIX_EN,  %eax  /* MtrrDefTypeFixEn */
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable Top-of-Memory setting */
 | 
				
			||||||
 | 
					    /* Enable use of RdMem/WrMem bits attributes */
 | 
				
			||||||
 | 
					    mov $MTRR_SYS_CFG,  %ecx
 | 
				
			||||||
 | 
					    rdmsr
 | 
				
			||||||
 | 
					    bts $MTRR_VAR_DRAM_EN,  %eax       /* Enable */
 | 
				
			||||||
 | 
					    btr $MTRR_FIX_DRAM_MOD_EN,  %eax   /* Disable */
 | 
				
			||||||
 | 
					    bts $MTRR_FIX_DRAM_EN,  %eax       /* Enable */
 | 
				
			||||||
 | 
					    wrmsr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bts $FLAG_IS_PRIMARY,  %esi
 | 
				
			||||||
 | 
					    jmp 3f /* .else                            ; end if primary core */
 | 
				
			||||||
 | 
					  2:
 | 
				
			||||||
 | 
					    xor %esi,  %esi
 | 
				
			||||||
 | 
					  3: /* .endif*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Make sure not to touch any Shared MSR from this point on */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AMD_DISABLE_STACK_FAMILY_HOOK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  xor  %eax,  %eax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					7:
 | 
				
			||||||
 | 
					  cli
 | 
				
			||||||
 | 
					  hlt
 | 
				
			||||||
 | 
					  jmp 7b  /* ExecuteHltInstruction */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .size   ExecuteFinalHltInstruction, .-ExecuteFinalHltInstruction
 | 
				
			||||||
@@ -245,7 +245,7 @@ AmdS3Save (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          HeapStatus = AmdS3SaveParams->StdHeader.HeapStatus;
 | 
					          HeapStatus = AmdS3SaveParams->StdHeader.HeapStatus;
 | 
				
			||||||
          AmdS3SaveParams->StdHeader.HeapStatus = HEAP_S3_RESUME;
 | 
					          AmdS3SaveParams->StdHeader.HeapStatus = HEAP_S3_RESUME;
 | 
				
			||||||
          AmdS3SaveParams->StdHeader.HeapBasePtr = (UINT64) HeapPtr;
 | 
					          AmdS3SaveParams->StdHeader.HeapBasePtr = (VOID *) HeapPtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          for (i = 0; i < S3LATE_TABLE_SIZE; i++) {
 | 
					          for (i = 0; i < S3LATE_TABLE_SIZE; i++) {
 | 
				
			||||||
            if (HeapPtrs[i] != NULL) {
 | 
					            if (HeapPtrs[i] != NULL) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -259,30 +259,30 @@ MemFS3GetDeviceList (
 | 
				
			|||||||
  (*DeviceBlockHdrPtr)->RelativeOrMaskOffset = (UINT16) AllocHeapParams.RequestedBufferSize;
 | 
					  (*DeviceBlockHdrPtr)->RelativeOrMaskOffset = (UINT16) AllocHeapParams.RequestedBufferSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Copy device list on the stack to the heap.
 | 
					  // Copy device list on the stack to the heap.
 | 
				
			||||||
  BufferOffset = sizeof (DEVICE_BLOCK_HEADER) + (UINT64) AllocHeapParams.BufferPtr;
 | 
					  BufferOffset = sizeof (DEVICE_BLOCK_HEADER) + (UINT64) (UINT32) AllocHeapParams.BufferPtr;
 | 
				
			||||||
  for (Die = 0; Die < DieCount; Die ++) {
 | 
					  for (Die = 0; Die < DieCount; Die ++) {
 | 
				
			||||||
    for (i = PRESELFREF; i <= POSTSELFREF; i ++) {
 | 
					    for (i = PRESELFREF; i <= POSTSELFREF; i ++) {
 | 
				
			||||||
      // Copy PCI device descriptor to the heap if it exists.
 | 
					      // Copy PCI device descriptor to the heap if it exists.
 | 
				
			||||||
      if (DeviceDescript[Die].PCIDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
					      if (DeviceDescript[Die].PCIDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
				
			||||||
        LibAmdMemCopy ((VOID *) BufferOffset, &(DeviceDescript[Die].PCIDevice[i]), sizeof (PCI_DEVICE_DESCRIPTOR), StdHeader);
 | 
					        LibAmdMemCopy ((VOID *)(UINT32) BufferOffset, &(DeviceDescript[Die].PCIDevice[i]), sizeof (PCI_DEVICE_DESCRIPTOR), StdHeader);
 | 
				
			||||||
        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
					        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
				
			||||||
        BufferOffset += sizeof (PCI_DEVICE_DESCRIPTOR);
 | 
					        BufferOffset += sizeof (PCI_DEVICE_DESCRIPTOR);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      // Copy conditional PCI device descriptor to the heap if it exists.
 | 
					      // Copy conditional PCI device descriptor to the heap if it exists.
 | 
				
			||||||
      if (DeviceDescript[Die].CPCIDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
					      if (DeviceDescript[Die].CPCIDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
				
			||||||
        LibAmdMemCopy ((VOID *) BufferOffset, &(DeviceDescript[Die].CPCIDevice[i]), sizeof (CONDITIONAL_PCI_DEVICE_DESCRIPTOR), StdHeader);
 | 
					        LibAmdMemCopy ((VOID *)(UINT32) BufferOffset, &(DeviceDescript[Die].CPCIDevice[i]), sizeof (CONDITIONAL_PCI_DEVICE_DESCRIPTOR), StdHeader);
 | 
				
			||||||
        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
					        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
				
			||||||
        BufferOffset += sizeof (CONDITIONAL_PCI_DEVICE_DESCRIPTOR);
 | 
					        BufferOffset += sizeof (CONDITIONAL_PCI_DEVICE_DESCRIPTOR);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      // Copy MSR device descriptor to the heap if it exists.
 | 
					      // Copy MSR device descriptor to the heap if it exists.
 | 
				
			||||||
      if (DeviceDescript[Die].MSRDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
					      if (DeviceDescript[Die].MSRDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
				
			||||||
        LibAmdMemCopy ((VOID *) BufferOffset, &(DeviceDescript[Die].MSRDevice[i]), sizeof (MSR_DEVICE_DESCRIPTOR), StdHeader);
 | 
					        LibAmdMemCopy ((VOID *)(UINT32) BufferOffset, &(DeviceDescript[Die].MSRDevice[i]), sizeof (MSR_DEVICE_DESCRIPTOR), StdHeader);
 | 
				
			||||||
        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
					        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
				
			||||||
        BufferOffset += sizeof (MSR_DEVICE_DESCRIPTOR);
 | 
					        BufferOffset += sizeof (MSR_DEVICE_DESCRIPTOR);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      // Copy conditional MSR device descriptor to the heap if it exists.
 | 
					      // Copy conditional MSR device descriptor to the heap if it exists.
 | 
				
			||||||
      if (DeviceDescript[Die].CMSRDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
					      if (DeviceDescript[Die].CMSRDevice[i].RegisterListID != 0xFFFFFFFF) {
 | 
				
			||||||
        LibAmdMemCopy ((VOID *) BufferOffset, &(DeviceDescript[Die].PCIDevice[i]), sizeof (CONDITIONAL_MSR_DEVICE_DESCRIPTOR), StdHeader);
 | 
					        LibAmdMemCopy ((VOID *)(UINT32) BufferOffset, &(DeviceDescript[Die].PCIDevice[i]), sizeof (CONDITIONAL_MSR_DEVICE_DESCRIPTOR), StdHeader);
 | 
				
			||||||
        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
					        (*DeviceBlockHdrPtr)->NumDevices ++;
 | 
				
			||||||
        BufferOffset += sizeof (CONDITIONAL_MSR_DEVICE_DESCRIPTOR);
 | 
					        BufferOffset += sizeof (CONDITIONAL_MSR_DEVICE_DESCRIPTOR);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,6 +61,20 @@ AMD_MTRR_FIX4k_E8000     =      0x026D
 | 
				
			|||||||
AMD_MTRR_FIX4k_F0000     =      0x026E
 | 
					AMD_MTRR_FIX4k_F0000     =      0x026E
 | 
				
			||||||
AMD_MTRR_FIX4k_F8000     =      0x026F
 | 
					AMD_MTRR_FIX4k_F8000     =      0x026F
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Reproduced from AGESA.h */
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX64k_00000  =  0x00000250
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX16k_80000  =  0x00000258
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX16k_A0000  =  0x00000259
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_C0000   =  0x00000268
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_C8000   =  0x00000269
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_D0000   =  0x0000026A
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_D8000   =  0x0000026B
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_E0000   =  0x0000026C
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_E8000   =  0x0000026D
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_F0000   =  0x0000026E
 | 
				
			||||||
 | 
					AMD_AP_MTRR_FIX4k_F8000   =  0x0000026F
 | 
				
			||||||
 | 
					CPU_LIST_TERMINAL         =  0xFFFFFFFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AMD_MTRR_DEFTYPE         =      0x02FF
 | 
					AMD_MTRR_DEFTYPE         =      0x02FF
 | 
				
			||||||
    WB_DRAM_TYPE         =      0x1E             /* MemType - memory type */
 | 
					    WB_DRAM_TYPE         =      0x1E             /* MemType - memory type */
 | 
				
			||||||
    MTRR_DEF_TYPE_EN     =      11               /* MtrrDefTypeEn - variable and fixed MTRRs default enabled */
 | 
					    MTRR_DEF_TYPE_EN     =      11               /* MtrrDefTypeEn - variable and fixed MTRRs default enabled */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user