Home | History | Annotate | Download | only in Pei
      1 /** @file
      2 The interface layer for memory controller access.
      3 It is supporting both real hardware platform and simulation environment.
      4 
      5 Copyright (c) 2013-2015 Intel Corporation.
      6 
      7 This program and the accompanying materials
      8 are licensed and made available under the terms and conditions of the BSD License
      9 which accompanies this distribution.  The full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 #include "mrc.h"
     17 #include "memory_options.h"
     18 #include "meminit_utils.h"
     19 #include "io.h"
     20 
     21 #ifdef SIM
     22 
     23 void SimMmio32Write (
     24     uint32_t be,
     25     uint32_t address,
     26     uint32_t data );
     27 
     28 void SimMmio32Read (
     29     uint32_t be,
     30     uint32_t address,
     31     uint32_t *data );
     32 
     33 void SimDelayClk (
     34     uint32_t x2clk );
     35 
     36 // This is a simple delay function.
     37 // It takes "nanoseconds" as a parameter.
     38 void delay_n(uint32_t nanoseconds)
     39 {
     40   SimDelayClk( 800*nanoseconds/1000);
     41 }
     42 #endif
     43 
     44 /****
     45  *
     46  ***/
     47 uint32_t Rd32(
     48     uint32_t unit,
     49     uint32_t addr)
     50 {
     51   uint32_t data;
     52 
     53   switch (unit)
     54   {
     55   case MEM:
     56     case MMIO:
     57 #ifdef SIM
     58     SimMmio32Read( 1, addr, &data);
     59 #else
     60     data = *PTR32(addr);
     61 #endif
     62     break;
     63 
     64   case MCU:
     65     case HOST_BRIDGE:
     66     case MEMORY_MANAGER:
     67     case HTE:
     68     // Handle case addr bigger than 8bit
     69     pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);
     70     addr &= 0x00FF;
     71 
     72     pciwrite32(0, 0, 0, SB_PACKET_REG,
     73         SB_COMMAND(SB_REG_READ_OPCODE, unit, addr));
     74     data = pciread32(0, 0, 0, SB_DATA_REG);
     75     break;
     76 
     77   case DDRPHY:
     78     // Handle case addr bigger than 8bit
     79     pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);
     80     addr &= 0x00FF;
     81 
     82     pciwrite32(0, 0, 0, SB_PACKET_REG,
     83         SB_COMMAND(SB_DDRIO_REG_READ_OPCODE, unit, addr));
     84     data = pciread32(0, 0, 0, SB_DATA_REG);
     85     break;
     86 
     87   default:
     88     DEAD_LOOP()
     89     ;
     90   }
     91 
     92   if (unit < MEM)
     93     DPF(D_REGRD, "RD32 %03X %08X %08X\n", unit, addr, data);
     94 
     95   return data;
     96 }
     97 
     98 /****
     99  *
    100  ***/
    101 void Wr32(
    102     uint32_t unit,
    103     uint32_t addr,
    104     uint32_t data)
    105 {
    106   if (unit < MEM)
    107     DPF(D_REGWR, "WR32 %03X %08X %08X\n", unit, addr, data);
    108 
    109   switch (unit)
    110   {
    111   case MEM:
    112     case MMIO:
    113 #ifdef SIM
    114     SimMmio32Write( 1, addr, data);
    115 #else
    116     *PTR32(addr) = data;
    117 #endif
    118     break;
    119 
    120   case MCU:
    121     case HOST_BRIDGE:
    122     case MEMORY_MANAGER:
    123     case HTE:
    124     // Handle case addr bigger than 8bit
    125     pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);
    126     addr &= 0x00FF;
    127 
    128     pciwrite32(0, 0, 0, SB_DATA_REG, data);
    129     pciwrite32(0, 0, 0, SB_PACKET_REG,
    130         SB_COMMAND(SB_REG_WRITE_OPCODE, unit, addr));
    131     break;
    132 
    133   case DDRPHY:
    134     // Handle case addr bigger than 8bit
    135     pciwrite32(0, 0, 0, SB_HADR_REG, addr & 0xFFF00);
    136     addr &= 0x00FF;
    137 
    138     pciwrite32(0, 0, 0, SB_DATA_REG, data);
    139     pciwrite32(0, 0, 0, SB_PACKET_REG,
    140         SB_COMMAND(SB_DDRIO_REG_WRITE_OPCODE, unit, addr));
    141     break;
    142 
    143   case DCMD:
    144     pciwrite32(0, 0, 0, SB_HADR_REG, 0);
    145     pciwrite32(0, 0, 0, SB_DATA_REG, data);
    146     pciwrite32(0, 0, 0, SB_PACKET_REG,
    147         SB_COMMAND(SB_DRAM_CMND_OPCODE, MCU, 0));
    148     break;
    149 
    150   default:
    151     DEAD_LOOP()
    152     ;
    153   }
    154 }
    155 
    156 /****
    157  *
    158  ***/
    159 void WrMask32(
    160     uint32_t unit,
    161     uint32_t addr,
    162     uint32_t data,
    163     uint32_t mask)
    164 {
    165   Wr32(unit, addr, ((Rd32(unit, addr) & ~mask) | (data & mask)));
    166 }
    167 
    168 /****
    169  *
    170  ***/
    171 void pciwrite32(
    172     uint32_t bus,
    173     uint32_t dev,
    174     uint32_t fn,
    175     uint32_t reg,
    176     uint32_t data)
    177 {
    178   Wr32(MMIO, PCIADDR(bus,dev,fn,reg), data);
    179 }
    180 
    181 /****
    182  *
    183  ***/
    184 uint32_t pciread32(
    185     uint32_t bus,
    186     uint32_t dev,
    187     uint32_t fn,
    188     uint32_t reg)
    189 {
    190   return Rd32(MMIO, PCIADDR(bus,dev,fn,reg));
    191 }
    192 
    193