mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-25 20:43:32 +00:00
83d290c56f
When U-Boot started using SPDX tags we were among the early adopters and there weren't a lot of other examples to borrow from. So we picked the area of the file that usually had a full license text and replaced it with an appropriate SPDX-License-Identifier: entry. Since then, the Linux Kernel has adopted SPDX tags and they place it as the very first line in a file (except where shebangs are used, then it's second line) and with slightly different comment styles than us. In part due to community overlap, in part due to better tag visibility and in part for other minor reasons, switch over to that style. This commit changes all instances where we have a single declared license in the tag as both the before and after are identical in tag contents. There's also a few places where I found we did not have a tag and have introduced one. Signed-off-by: Tom Rini <trini@konsulko.com>
186 lines
5.2 KiB
C
186 lines
5.2 KiB
C
/* SPDX-License-Identifier: Intel */
|
|
/*
|
|
* Copyright (C) 2013, Intel Corporation
|
|
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
|
|
*
|
|
* Ported from Intel released Quark UEFI BIOS
|
|
* QuarkSocPkg/QuarkNorthCluster/MemoryInit/Pei
|
|
*/
|
|
|
|
#ifndef _MRC_H_
|
|
#define _MRC_H_
|
|
|
|
#define MRC_VERSION 0x0111
|
|
|
|
/* architectural definitions */
|
|
#define NUM_CHANNELS 1 /* number of channels */
|
|
#define NUM_RANKS 2 /* number of ranks per channel */
|
|
#define NUM_BYTE_LANES 4 /* number of byte lanes per channel */
|
|
|
|
/* software limitations */
|
|
#define MAX_CHANNELS 1
|
|
#define MAX_RANKS 2
|
|
#define MAX_BYTE_LANES 4
|
|
|
|
#define MAX_SOCKETS 1
|
|
#define MAX_SIDES 1
|
|
#define MAX_ROWS (MAX_SIDES * MAX_SOCKETS)
|
|
|
|
/* Specify DRAM and channel width */
|
|
enum {
|
|
X8, /* DRAM width */
|
|
X16, /* DRAM width & Channel Width */
|
|
X32 /* Channel Width */
|
|
};
|
|
|
|
/* Specify DRAM speed */
|
|
enum {
|
|
DDRFREQ_800,
|
|
DDRFREQ_1066
|
|
};
|
|
|
|
/* Specify DRAM type */
|
|
enum {
|
|
DDR3,
|
|
DDR3L
|
|
};
|
|
|
|
/*
|
|
* density: 0=512Mb, 1=Gb, 2=2Gb, 3=4Gb
|
|
* cl: DRAM CAS Latency in clocks
|
|
* ras: ACT to PRE command period
|
|
* wtr: Delay from start of internal write transaction to internal read command
|
|
* rrd: ACT to ACT command period (JESD79 specific to page size 1K/2K)
|
|
* faw: Four activate window (JESD79 specific to page size 1K/2K)
|
|
*
|
|
* ras/wtr/rrd/faw timings are in picoseconds
|
|
*
|
|
* Refer to JEDEC spec (or DRAM datasheet) when changing these values.
|
|
*/
|
|
struct dram_params {
|
|
uint8_t density;
|
|
uint8_t cl;
|
|
uint32_t ras;
|
|
uint32_t wtr;
|
|
uint32_t rrd;
|
|
uint32_t faw;
|
|
};
|
|
|
|
/*
|
|
* Delay configuration for individual signals
|
|
* Vref setting
|
|
* Scrambler seed
|
|
*/
|
|
struct mrc_timings {
|
|
uint32_t rcvn[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
|
|
uint32_t rdqs[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
|
|
uint32_t wdqs[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
|
|
uint32_t wdq[NUM_CHANNELS][NUM_RANKS][NUM_BYTE_LANES];
|
|
uint32_t vref[NUM_CHANNELS][NUM_BYTE_LANES];
|
|
uint32_t wctl[NUM_CHANNELS][NUM_RANKS];
|
|
uint32_t wcmd[NUM_CHANNELS];
|
|
uint32_t scrambler_seed;
|
|
/* need to save for the case of frequency change */
|
|
uint8_t ddr_speed;
|
|
};
|
|
|
|
/* Boot mode defined as bit mask (1<<n) */
|
|
enum {
|
|
BM_UNKNOWN,
|
|
BM_COLD = 1, /* full training */
|
|
BM_FAST = 2, /* restore timing parameters */
|
|
BM_S3 = 4, /* resume from S3 */
|
|
BM_WARM = 8
|
|
};
|
|
|
|
/* MRC execution status */
|
|
#define MRC_SUCCESS 0 /* initialization ok */
|
|
#define MRC_E_MEMTEST 1 /* memtest failed */
|
|
|
|
/*
|
|
* Memory Reference Code parameters
|
|
*
|
|
* It includes 3 parts:
|
|
* - input parameters like boot mode and DRAM parameters
|
|
* - context parameters for MRC internal state
|
|
* - output parameters like initialization result and memory size
|
|
*/
|
|
struct mrc_params {
|
|
/* Input parameters */
|
|
uint32_t boot_mode; /* BM_COLD, BM_FAST, BM_WARM, BM_S3 */
|
|
/* DRAM parameters */
|
|
uint8_t dram_width; /* x8, x16 */
|
|
uint8_t ddr_speed; /* DDRFREQ_800, DDRFREQ_1066 */
|
|
uint8_t ddr_type; /* DDR3, DDR3L */
|
|
uint8_t ecc_enables; /* 0, 1 (memory size reduced to 7/8) */
|
|
uint8_t scrambling_enables; /* 0, 1 */
|
|
/* 1, 3 (1'st rank has to be populated if 2'nd rank present) */
|
|
uint32_t rank_enables;
|
|
uint32_t channel_enables; /* 1 only */
|
|
uint32_t channel_width; /* x16 only */
|
|
/* 0, 1, 2 (mode 2 forced if ecc enabled) */
|
|
uint32_t address_mode;
|
|
/* REFRESH_RATE: 1=1.95us, 2=3.9us, 3=7.8us, others=RESERVED */
|
|
uint8_t refresh_rate;
|
|
/* SR_TEMP_RANGE: 0=normal, 1=extended, others=RESERVED */
|
|
uint8_t sr_temp_range;
|
|
/*
|
|
* RON_VALUE: 0=34ohm, 1=40ohm, others=RESERVED
|
|
* (select MRS1.DIC driver impedance control)
|
|
*/
|
|
uint8_t ron_value;
|
|
/* RTT_NOM_VALUE: 0=40ohm, 1=60ohm, 2=120ohm, others=RESERVED */
|
|
uint8_t rtt_nom_value;
|
|
/* RD_ODT_VALUE: 0=off, 1=60ohm, 2=120ohm, 3=180ohm, others=RESERVED */
|
|
uint8_t rd_odt_value;
|
|
struct dram_params params;
|
|
/* Internally used context parameters */
|
|
uint32_t board_id; /* board layout (use x8 or x16 memory) */
|
|
uint32_t hte_setup; /* when set hte reconfiguration requested */
|
|
uint32_t menu_after_mrc;
|
|
uint32_t power_down_disable;
|
|
uint32_t tune_rcvn;
|
|
uint32_t channel_size[NUM_CHANNELS];
|
|
uint32_t column_bits[NUM_CHANNELS];
|
|
uint32_t row_bits[NUM_CHANNELS];
|
|
uint32_t mrs1; /* register content saved during training */
|
|
uint8_t first_run;
|
|
/* Output parameters */
|
|
/* initialization result (non zero specifies error code) */
|
|
uint32_t status;
|
|
/* total memory size in bytes (excludes ECC banks) */
|
|
uint32_t mem_size;
|
|
/* training results (also used on input) */
|
|
struct mrc_timings timings;
|
|
};
|
|
|
|
/*
|
|
* MRC memory initialization structure
|
|
*
|
|
* post_code: a 16-bit post code of a specific initialization routine
|
|
* boot_path: bitwise or of BM_COLD, BM_FAST, BM_WARM and BM_S3
|
|
* init_fn: real memory initialization routine
|
|
*/
|
|
struct mem_init {
|
|
uint16_t post_code;
|
|
uint16_t boot_path;
|
|
void (*init_fn)(struct mrc_params *mrc_params);
|
|
};
|
|
|
|
/* MRC platform data flags */
|
|
#define MRC_FLAG_ECC_EN 0x00000001
|
|
#define MRC_FLAG_SCRAMBLE_EN 0x00000002
|
|
#define MRC_FLAG_MEMTEST_EN 0x00000004
|
|
/* 0b DDR "fly-by" topology else 1b DDR "tree" topology */
|
|
#define MRC_FLAG_TOP_TREE_EN 0x00000008
|
|
/* If set ODR signal is asserted to DRAM devices on writes */
|
|
#define MRC_FLAG_WR_ODT_EN 0x00000010
|
|
|
|
/**
|
|
* mrc_init - Memory Reference Code initialization entry routine
|
|
*
|
|
* @mrc_params: parameters for MRC
|
|
*/
|
|
void mrc_init(struct mrc_params *mrc_params);
|
|
|
|
#endif /* _MRC_H_ */
|