text: /* $NoKeywords:$ */
  /**
   * @file
   *
   * mrn.c
   *
   * Common Northbridge  functions for Recovery
   *
   * @xrefitem bom "File Content Label" "Release Content"
   * @e project: AGESA
   * @e sub-project: (Proc/Recovery/Mem/NB)
   * @e \$Revision: 44324 $ @e \$Date: 2010-12-22 02:16:51 -0700 (Wed, 22 Dec 2010) $
   *
   **/
  /*****************************************************************************
  *
  * Copyright (C) 2012 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.
  *
  * ***************************************************************************
  *
  */
  
  /*
   *----------------------------------------------------------------------------
   *                                MODULES USED
   *
   *----------------------------------------------------------------------------
   */
  
  
  
  #include "AGESA.h"
  #include "amdlib.h"
  #include "Ids.h"
  #include "cpuFamRegisters.h"
  #include "cpuRegisters.h"
  #include "cpuFamilyTranslation.h"
  #include "mm.h"
  #include "mn.h"
  #include "Filecode.h"
  #define FILECODE PROC_RECOVERY_MEM_NB_MRN_FILECODE
  /*----------------------------------------------------------------------------
   *                          DEFINITIONS AND MACROS
   *
   *----------------------------------------------------------------------------
   */
  
  #define MAX_DCTS_PER_DIE 2
  #define SPLIT_CHANNEL   0x20000000
  #define CHANNEL_SELECT  0x10000000
  #define MAX_DELAYS    9   /* 8 data bytes + 1 ECC byte */
  #define MAX_DIMMS     4   /* 4 DIMMs per channel */
  
  /*----------------------------------------------------------------------------
   *                           TYPEDEFS AND STRUCTURES
   *
   *----------------------------------------------------------------------------
   */
  
  /*----------------------------------------------------------------------------
   *                        PROTOTYPES OF LOCAL FUNCTIONS
   *
   *----------------------------------------------------------------------------
   */
  
  /*----------------------------------------------------------------------------
   *                            EXPORTED FUNCTIONS
   *
   *----------------------------------------------------------------------------
   */
  
  /* -----------------------------------------------------------------------------*/
  /**
   *
   *   This function gets a bit field from PCI register
   *
   *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
   *     @param[in]   FieldName - Field name
   *
   *     @return      Bit field value
   */
  
  UINT32
  MemRecNGetBitFieldNb (
    IN OUT   MEM_NB_BLOCK *NBPtr,
    IN       BIT_FIELD_NAME FieldName
    )
  {
    return NBPtr->MemRecNCmnGetSetFieldNb (NBPtr, 0, FieldName, 0);
  }
  
  
  
  /* -----------------------------------------------------------------------------*/
  /**
   *
   *   This function sets a bit field from PCI register
   *
   *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
   *     @param[in]   FieldName - Field name
   *     @param[in]   Field - Value to be stored in PCT register
   *
   */
  
  VOID
  MemRecNSetBitFieldNb (
    IN OUT   MEM_NB_BLOCK *NBPtr,
    IN       BIT_FIELD_NAME FieldName,
    IN       UINT32 Field
    )
  {
    NBPtr->MemRecNCmnGetSetFieldNb (NBPtr, 1, FieldName, Field);
  }
  
  /* -----------------------------------------------------------------------------*/
  /**
   *
   *   This function gets a delay value a PCI register during training
   *
   *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
   *     @param[in]   TrnDly - type of delay to be set
   *     @param[in]   DrbnVar - encoding of Dimm-Rank-Byte-Nibble to be accessed
   *                  (use either DIMM_BYTE_ACCESS(dimm,byte) or CS_NBBL_ACCESS(cs,nibble) to use this encoding
   *
   *     @return      Value read
   */
  
  UINT32
  MemRecNGetTrainDlyNb (
    IN OUT   MEM_NB_BLOCK *NBPtr,
    IN       TRN_DLY_TYPE TrnDly,
    IN       DRBN DrbnVar
    )
  {
    return NBPtr->MemRecNcmnGetSetTrainDlyNb (NBPtr, 0, TrnDly, DrbnVar, 0);
  }
  
  /* -----------------------------------------------------------------------------*/
  /**
   *
   *   This function gets a delay value a PCI register during training
   *
   *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
   *     @param[in]   TrnDly - type of delay to be set
   *     @param[in]   DrbnVar - encoding of Dimm-Rank-Byte-Nibble to be accessed
   *                  (use either DIMM_BYTE_ACCESS(dimm,byte) or CS_NBBL_ACCESS(cs,nibble) to use this encoding
   *     @param[in]   Field - Value to be programmed
   *
   */
  
  VOID
  MemRecNSetTrainDlyNb (
    IN OUT   MEM_NB_BLOCK *NBPtr,
    IN       TRN_DLY_TYPE TrnDly,
    IN       DRBN DrbnVar,
    IN       UINT16 Field
    )
  {
    NBPtr->MemRecNcmnGetSetTrainDlyNb (NBPtr, 1, TrnDly, DrbnVar, Field);
  }
  /*----------------------------------------------------------------------------
   *                              LOCAL FUNCTIONS
   *
   *----------------------------------------------------------------------------
   */
  
  