coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
raminit_read_write_training.c File Reference
#include <stdint.h>
#include <device/mmio.h>
#include <pc80/mc146818rtc.h>
#include <console/console.h>
#include "gm45.h"
Include dependency graph for raminit_read_write_training.c:

Go to the source code of this file.

Data Structures

struct  address_bunch_t
 
struct  read_timing_t
 
struct  write_timing_t
 

Macros

#define CxRDTy_MCHBAR(ch, bl)   (0x14b0 + ((ch) * 0x0100) + ((7 - (bl)) * 4))
 
#define CxRDTy_T_SHIFT   20
 
#define CxRDTy_T_MASK   (0xf << CxRDTy_T_SHIFT)
 
#define CxRDTy_T(t)   (((t) << CxRDTy_T_SHIFT) & CxRDTy_T_MASK)
 
#define CxRDTy_P_SHIFT   16
 
#define CxRDTy_P_MASK   (0x7 << CxRDTy_P_SHIFT)
 
#define CxRDTy_P(p)   (((p) << CxRDTy_P_SHIFT) & CxRDTy_P_MASK)
 
#define READ_TIMING_P_SHIFT   3
 
#define READ_TIMING_P_BOUND   (1 << READ_TIMING_P_SHIFT)
 
#define READ_TIMING_T_BOUND   14
 
#define CxWRTy_T_SHIFT   28
 
#define CxWRTy_T_MASK   (0xf << CxWRTy_T_SHIFT)
 
#define CxWRTy_T(t)   (((t) << CxWRTy_T_SHIFT) & CxWRTy_T_MASK)
 
#define CxWRTy_P_SHIFT   24
 
#define CxWRTy_P_MASK   (0x7 << CxWRTy_P_SHIFT)
 
#define CxWRTy_P(p)   (((p) << CxWRTy_P_SHIFT) & CxWRTy_P_MASK)
 
#define CxWRTy_F_SHIFT   18
 
#define CxWRTy_F_MASK   (0x3 << CxWRTy_F_SHIFT)
 
#define CxWRTy_F(f)   (((f) << CxWRTy_F_SHIFT) & CxWRTy_F_MASK)
 
#define CxWRTy_D_SHIFT   16
 
#define CxWRTy_D_MASK   (0x3 << CxWRTy_D_SHIFT)
 
#define CxWRTy_BELOW_D   (0x3 << CxWRTy_D_SHIFT)
 
#define CxWRTy_ABOVE_D   (0x1 << CxWRTy_D_SHIFT)
 
#define WRITE_TIMING_P_SHIFT   3
 
#define WRITE_TIMING_P_BOUND   (1 << WRITE_TIMING_P_SHIFT)
 
#define WRITE_TIMING_F_BOUND   4
 

Functions

static void print_read_timing (const int msg_lvl, const char *const msg, const int lane, const int channel, const read_timing_t *const timing)
 
static int normalize_read_timing (read_timing_t *const timing)
 
static int program_read_timing (const int ch, const int lane, read_timing_t *const timing)
 
static int read_training_test (const int channel, const int lane, const address_bunch_t *const addresses)
 
static int read_training_find_lower (const int channel, const int lane, const address_bunch_t *const addresses, read_timing_t *const lower)
 
static int read_training_find_upper (const int channel, const int lane, const address_bunch_t *const addresses, read_timing_t *const upper)
 
static void read_training_per_lane (const int channel, const int lane, const address_bunch_t *const addresses)
 
static void perform_read_training (const dimminfo_t *const dimms)
 
static void read_training_store_results (void)
 
static void read_training_restore_results (void)
 
void raminit_read_training (const dimminfo_t *const dimms, const int s3resume)
 
static void print_write_timing (const int msg_lvl, const char *const msg, const int group, const int channel, const write_timing_t *const timing)
 
static int normalize_write_timing (write_timing_t *const timing)
 
static int program_write_timing (const int ch, const int group, write_timing_t *const timing, int memclk1067)
 
static int write_training_test (const address_bunch_t *const addresses, const u32 *const masks)
 
static int write_training_find_lower (const int ch, const int group, const address_bunch_t *const addresses, const u32 masks[][2], const int memclk1067, write_timing_t *const lower)
 
static int write_training_find_upper (const int ch, const int group, const address_bunch_t *const addresses, const u32 masks[][2], const int memclk1067, write_timing_t *const upper)
 
static void write_training_per_group (const int ch, const int group, const address_bunch_t *const addresses, const u32 masks[][2], const int memclk1067)
 
static void perform_write_training (const int memclk1067, const dimminfo_t *const dimms)
 
static void write_training_store_results (void)
 
static void write_training_restore_results (const int memclk1067)
 
void raminit_write_training (const mem_clock_t ddr3clock, const dimminfo_t *const dimms, const int s3resume)
 

Variables

static const u32 read_training_schedule []
 
static const u32 write_training_schedule []
 
static const u32 write_training_bytelane_masks_abc [2][4][2]
 
static const u32 write_training_bytelane_masks_f [4][2]
 

Macro Definition Documentation

◆ CxRDTy_MCHBAR

#define CxRDTy_MCHBAR (   ch,
  bl 
)    (0x14b0 + ((ch) * 0x0100) + ((7 - (bl)) * 4))

Definition at line 15 of file raminit_read_write_training.c.

◆ CxRDTy_P

#define CxRDTy_P (   p)    (((p) << CxRDTy_P_SHIFT) & CxRDTy_P_MASK)

Definition at line 21 of file raminit_read_write_training.c.

◆ CxRDTy_P_MASK

#define CxRDTy_P_MASK   (0x7 << CxRDTy_P_SHIFT)

Definition at line 20 of file raminit_read_write_training.c.

◆ CxRDTy_P_SHIFT

#define CxRDTy_P_SHIFT   16

Definition at line 19 of file raminit_read_write_training.c.

◆ CxRDTy_T

#define CxRDTy_T (   t)    (((t) << CxRDTy_T_SHIFT) & CxRDTy_T_MASK)

Definition at line 18 of file raminit_read_write_training.c.

◆ CxRDTy_T_MASK

#define CxRDTy_T_MASK   (0xf << CxRDTy_T_SHIFT)

Definition at line 17 of file raminit_read_write_training.c.

◆ CxRDTy_T_SHIFT

#define CxRDTy_T_SHIFT   20

Definition at line 16 of file raminit_read_write_training.c.

◆ CxWRTy_ABOVE_D

#define CxWRTy_ABOVE_D   (0x1 << CxWRTy_D_SHIFT)

Definition at line 289 of file raminit_read_write_training.c.

◆ CxWRTy_BELOW_D

#define CxWRTy_BELOW_D   (0x3 << CxWRTy_D_SHIFT)

Definition at line 288 of file raminit_read_write_training.c.

◆ CxWRTy_D_MASK

#define CxWRTy_D_MASK   (0x3 << CxWRTy_D_SHIFT)

Definition at line 287 of file raminit_read_write_training.c.

◆ CxWRTy_D_SHIFT

#define CxWRTy_D_SHIFT   16

Definition at line 286 of file raminit_read_write_training.c.

◆ CxWRTy_F

#define CxWRTy_F (   f)    (((f) << CxWRTy_F_SHIFT) & CxWRTy_F_MASK)

Definition at line 285 of file raminit_read_write_training.c.

◆ CxWRTy_F_MASK

#define CxWRTy_F_MASK   (0x3 << CxWRTy_F_SHIFT)

Definition at line 284 of file raminit_read_write_training.c.

◆ CxWRTy_F_SHIFT

#define CxWRTy_F_SHIFT   18

Definition at line 283 of file raminit_read_write_training.c.

◆ CxWRTy_P

#define CxWRTy_P (   p)    (((p) << CxWRTy_P_SHIFT) & CxWRTy_P_MASK)

Definition at line 282 of file raminit_read_write_training.c.

◆ CxWRTy_P_MASK

#define CxWRTy_P_MASK   (0x7 << CxWRTy_P_SHIFT)

Definition at line 281 of file raminit_read_write_training.c.

◆ CxWRTy_P_SHIFT

#define CxWRTy_P_SHIFT   24

Definition at line 280 of file raminit_read_write_training.c.

◆ CxWRTy_T

#define CxWRTy_T (   t)    (((t) << CxWRTy_T_SHIFT) & CxWRTy_T_MASK)

Definition at line 279 of file raminit_read_write_training.c.

◆ CxWRTy_T_MASK

#define CxWRTy_T_MASK   (0xf << CxWRTy_T_SHIFT)

Definition at line 278 of file raminit_read_write_training.c.

◆ CxWRTy_T_SHIFT

#define CxWRTy_T_SHIFT   28

Definition at line 277 of file raminit_read_write_training.c.

◆ READ_TIMING_P_BOUND

#define READ_TIMING_P_BOUND   (1 << READ_TIMING_P_SHIFT)

Definition at line 35 of file raminit_read_write_training.c.

◆ READ_TIMING_P_SHIFT

#define READ_TIMING_P_SHIFT   3

Definition at line 34 of file raminit_read_write_training.c.

◆ READ_TIMING_T_BOUND

#define READ_TIMING_T_BOUND   14

Definition at line 36 of file raminit_read_write_training.c.

◆ WRITE_TIMING_F_BOUND

#define WRITE_TIMING_F_BOUND   4

Definition at line 330 of file raminit_read_write_training.c.

◆ WRITE_TIMING_P_BOUND

#define WRITE_TIMING_P_BOUND   (1 << WRITE_TIMING_P_SHIFT)

Definition at line 329 of file raminit_read_write_training.c.

◆ WRITE_TIMING_P_SHIFT

#define WRITE_TIMING_P_SHIFT   3

Definition at line 328 of file raminit_read_write_training.c.

Function Documentation

◆ normalize_read_timing()

static int normalize_read_timing ( read_timing_t *const  timing)
static

Definition at line 49 of file raminit_read_write_training.c.

References BIOS_WARNING, read_timing_t::p, printk, READ_TIMING_P_BOUND, READ_TIMING_T_BOUND, and read_timing_t::t.

Referenced by program_read_timing().

Here is the caller graph for this function:

◆ normalize_write_timing()

static int normalize_write_timing ( write_timing_t *const  timing)
static

◆ perform_read_training()

static void perform_read_training ( const dimminfo_t *const  dimms)
static

Definition at line 200 of file raminit_read_write_training.c.

References address_bunch_t::addr, ch, address_bunch_t::count, FOR_EACH_POPULATED_CHANNEL, FOR_EACH_POPULATED_RANK_IN_CHANNEL, offset, raminit_get_rank_addr(), read_training_per_lane(), read_training_schedule, and write32().

Referenced by raminit_read_training().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ perform_write_training()

static void perform_write_training ( const int  memclk1067,
const dimminfo_t *const  dimms 
)
static

Definition at line 550 of file raminit_read_write_training.c.

References addr, dimminfo_t::card_type, ch, count, FOR_EACH_CHANNEL, FOR_EACH_POPULATED_RANK, raminit_get_rank_addr(), write_training_bytelane_masks_abc, write_training_bytelane_masks_f, and write_training_per_group().

Referenced by raminit_write_training().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_read_timing()

static void print_read_timing ( const int  msg_lvl,
const char *const  msg,
const int  lane,
const int  channel,
const read_timing_t *const  timing 
)
static

Definition at line 41 of file raminit_read_write_training.c.

References read_timing_t::p, printk, and read_timing_t::t.

Referenced by read_training_per_lane().

Here is the caller graph for this function:

◆ print_write_timing()

static void print_write_timing ( const int  msg_lvl,
const char *const  msg,
const int  group,
const int  channel,
const write_timing_t *const  timing 
)
static

Definition at line 337 of file raminit_read_write_training.c.

References write_timing_t::f, write_timing_t::p, printk, and write_timing_t::t.

Referenced by write_training_per_group().

Here is the caller graph for this function:

◆ program_read_timing()

static int program_read_timing ( const int  ch,
const int  lane,
read_timing_t *const  timing 
)
static

Definition at line 74 of file raminit_read_write_training.c.

References ch, CxRDTy_MCHBAR, CxRDTy_P, CxRDTy_P_MASK, CxRDTy_T, CxRDTy_T_MASK, mchbar_read32(), mchbar_write32(), normalize_read_timing(), read_timing_t::p, and read_timing_t::t.

Referenced by read_training_find_lower(), read_training_find_upper(), and read_training_per_lane().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ program_write_timing()

static int program_write_timing ( const int  ch,
const int  group,
write_timing_t *const  timing,
int  memclk1067 
)
static

◆ raminit_read_training()

void raminit_read_training ( const dimminfo_t *const  dimms,
const int  s3resume 
)

Definition at line 265 of file raminit_read_write_training.c.

References perform_read_training(), raminit_reset_readwrite_pointers(), read_training_restore_results(), and read_training_store_results().

Referenced by raminit().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ raminit_write_training()

void raminit_write_training ( const mem_clock_t  ddr3clock,
const dimminfo_t *const  dimms,
const int  s3resume 
)

Definition at line 634 of file raminit_read_write_training.c.

References MEM_CLOCK_1067MT, perform_write_training(), raminit_reset_readwrite_pointers(), write_training_restore_results(), and write_training_store_results().

Referenced by raminit().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_training_find_lower()

static int read_training_find_lower ( const int  channel,
const int  lane,
const address_bunch_t *const  addresses,
read_timing_t *const  lower 
)
static

Definition at line 107 of file raminit_read_write_training.c.

References read_timing_t::p, program_read_timing(), read_training_test(), and read_timing_t::t.

Referenced by read_training_per_lane().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_training_find_upper()

static int read_training_find_upper ( const int  channel,
const int  lane,
const address_bunch_t *const  addresses,
read_timing_t *const  upper 
)
static

Definition at line 134 of file raminit_read_write_training.c.

References BIOS_WARNING, read_timing_t::p, printk, program_read_timing(), read_training_test(), and read_timing_t::t.

Referenced by read_training_per_lane().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_training_per_lane()

static void read_training_per_lane ( const int  channel,
const int  lane,
const address_bunch_t *const  addresses 
)
static

◆ read_training_restore_results()

static void read_training_restore_results ( void  )
static

Definition at line 242 of file raminit_read_write_training.c.

References BIOS_DEBUG, ch, cmos_read(), CMOS_READ_TRAINING, CxRDTy_MCHBAR, CxRDTy_P, CxRDTy_P_MASK, CxRDTy_T, CxRDTy_T_MASK, FOR_EACH_CHANNEL, mchbar_read32(), mchbar_write32(), printk, and TOTAL_CHANNELS.

Referenced by raminit_read_training().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_training_store_results()

static void read_training_store_results ( void  )
static

Definition at line 222 of file raminit_read_write_training.c.

References ch, CMOS_READ_TRAINING, cmos_write(), CxRDTy_MCHBAR, CxRDTy_P_MASK, CxRDTy_P_SHIFT, CxRDTy_T_MASK, CxRDTy_T_SHIFT, FOR_EACH_CHANNEL, mchbar_read32(), and TOTAL_CHANNELS.

Referenced by raminit_read_training().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_training_test()

static int read_training_test ( const int  channel,
const int  lane,
const address_bunch_t *const  addresses 
)
static

Definition at line 88 of file raminit_read_write_training.c.

References address_bunch_t::addr, address_bunch_t::count, offset, read32(), and read_training_schedule.

Referenced by read_training_find_lower(), and read_training_find_upper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write_training_find_lower()

static int write_training_find_lower ( const int  ch,
const int  group,
const address_bunch_t *const  addresses,
const u32  masks[][2],
const int  memclk1067,
write_timing_t *const  lower 
)
static

Definition at line 446 of file raminit_read_write_training.c.

References ch, write_timing_t::f, write_timing_t::p, program_write_timing(), write_timing_t::t, and write_training_test().

Referenced by write_training_per_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write_training_find_upper()

static int write_training_find_upper ( const int  ch,
const int  group,
const address_bunch_t *const  addresses,
const u32  masks[][2],
const int  memclk1067,
write_timing_t *const  upper 
)
static

Definition at line 473 of file raminit_read_write_training.c.

References BIOS_WARNING, ch, write_timing_t::p, printk, program_write_timing(), write_timing_t::t, and write_training_test().

Referenced by write_training_per_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write_training_per_group()

static void write_training_per_group ( const int  ch,
const int  group,
const address_bunch_t *const  addresses,
const u32  masks[][2],
const int  memclk1067 
)
static

◆ write_training_restore_results()

static void write_training_restore_results ( const int  memclk1067)
static

Definition at line 609 of file raminit_read_write_training.c.

References BIOS_DEBUG, ch, cmos_read(), CMOS_WRITE_TRAINING, write_timing_t::f, FOR_EACH_CHANNEL, write_timing_t::p, printk, program_write_timing(), write_timing_t::t, and TOTAL_CHANNELS.

Referenced by raminit_write_training().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write_training_store_results()

static void write_training_store_results ( void  )
static

Definition at line 586 of file raminit_read_write_training.c.

References ch, cmos_write(), CMOS_WRITE_TRAINING, CxWRTy_F_MASK, CxWRTy_F_SHIFT, CxWRTy_MCHBAR, CxWRTy_P_MASK, CxWRTy_P_SHIFT, CxWRTy_T_MASK, CxWRTy_T_SHIFT, FOR_EACH_CHANNEL, mchbar_read32(), and TOTAL_CHANNELS.

Referenced by raminit_write_training().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write_training_test()

static int write_training_test ( const address_bunch_t *const  addresses,
const u32 *const  masks 
)
static

Variable Documentation

◆ read_training_schedule

const u32 read_training_schedule[]
static
Initial value:
= {
0xfefefefe, 0x7f7f7f7f, 0xbebebebe, 0xdfdfdfdf,
0xeeeeeeee, 0xf7f7f7f7, 0xfafafafa, 0xfdfdfdfd,
0x00000000, 0x81818181, 0x40404040, 0x21212121,
0x10101010, 0x09090909, 0x04040404, 0x03030303,
0x10101010, 0x11111111, 0xeeeeeeee, 0xefefefef,
0x10101010, 0x11111111, 0xeeeeeeee, 0xefefefef,
0x10101010, 0xefefefef, 0x10101010, 0xefefefef,
0x10101010, 0xefefefef, 0x10101010, 0xefefefef,
0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
0x00000000, 0xffffffff, 0x00000000, 0x00000000,
}

Definition at line 22 of file raminit_read_write_training.c.

Referenced by perform_read_training(), and read_training_test().

◆ write_training_bytelane_masks_abc

const u32 write_training_bytelane_masks_abc[2][4][2]
static
Initial value:
= {
{
{ 0xffffffff, 0x00000000 }, { 0x00000000, 0x00000000 },
{ 0x00000000, 0xffffffff }, { 0x00000000, 0x00000000 },
},
{
{ 0x0000ffff, 0x00000000 }, { 0xffff0000, 0x00000000 },
{ 0x00000000, 0x0000ffff }, { 0x00000000, 0xffff0000 },
},
}

Definition at line 313 of file raminit_read_write_training.c.

Referenced by perform_write_training().

◆ write_training_bytelane_masks_f

const u32 write_training_bytelane_masks_f[4][2]
static
Initial value:
= {
{ 0xff00ff00, 0x00000000 }, { 0x00ff00ff, 0x00000000 },
{ 0x00000000, 0xff00ff00 }, { 0x00000000, 0x00ff00ff },
}

Definition at line 324 of file raminit_read_write_training.c.

Referenced by perform_write_training().

◆ write_training_schedule

const u32 write_training_schedule[]
static
Initial value:
= {
0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
0xffffffff, 0x00000000, 0xffffffff, 0x00000000,
0xefefefef, 0x10101010, 0xefefefef, 0x10101010,
0xefefefef, 0x10101010, 0xefefefef, 0x10101010,
0xefefefef, 0x10101010, 0xefefefef, 0x10101010,
0xefefefef, 0x10101010, 0xefefefef, 0x10101010,
0xefefefef, 0xeeeeeeee, 0x11111111, 0x10101010,
0xefefefef, 0xeeeeeeee, 0x11111111, 0x10101010,
0xefefefef, 0xeeeeeeee, 0x11111111, 0x10101010,
0xefefefef, 0xeeeeeeee, 0x11111111, 0x10101010,
0x03030303, 0x04040404, 0x09090909, 0x10101010,
0x21212121, 0x40404040, 0x81818181, 0x00000000,
0x03030303, 0x04040404, 0x09090909, 0x10101010,
0x21212121, 0x40404040, 0x81818181, 0x00000000,
0xfdfdfdfd, 0xfafafafa, 0xf7f7f7f7, 0xeeeeeeee,
0xdfdfdfdf, 0xbebebebe, 0x7f7f7f7f, 0xfefefefe,
0xfdfdfdfd, 0xfafafafa, 0xf7f7f7f7, 0xeeeeeeee,
0xdfdfdfdf, 0xbebebebe, 0x7f7f7f7f, 0xfefefefe,
}

Definition at line 290 of file raminit_read_write_training.c.

Referenced by write_training_test().