mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-08 22:03:22 +09:00
![Stefan Roese](/assets/img/avatar_default.png)
This patch adds the DDR3 setup and training code taken from the Marvell U-Boot repository. This code used to be included as a binary (bin_hdr) into the Armada A38x boot image. Not linked with the main U-Boot. With this code addition and the serdes/PHY setup code, the Armada A38x support in mainline U-Boot is finally self-contained. So the complete image for booting can be built from mainline U-Boot. Without any additional external inclusion. Note: This code has undergone many hours (days!) of coding-style cleanup and refactoring. It still is not checkpatch clean though, I'm afraid. As the factoring of the code has so many levels of indentation that many lines are longer than 80 chars. Signed-off-by: Stefan Roese <sr@denx.de>
174 lines
3.4 KiB
C
174 lines
3.4 KiB
C
/*
|
|
* Copyright (C) Marvell International Ltd. and its affiliates
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0
|
|
*/
|
|
|
|
#ifndef _DDR3_TRAINING_IP_DEF_H
|
|
#define _DDR3_TRAINING_IP_DEF_H
|
|
|
|
#include "silicon_if.h"
|
|
|
|
#define PATTERN_55 0x55555555
|
|
#define PATTERN_AA 0xaaaaaaaa
|
|
#define PATTERN_80 0x80808080
|
|
#define PATTERN_20 0x20202020
|
|
#define PATTERN_01 0x01010101
|
|
#define PATTERN_FF 0xffffffff
|
|
#define PATTERN_00 0x00000000
|
|
|
|
/* 16bit bus width patterns */
|
|
#define PATTERN_55AA 0x5555aaaa
|
|
#define PATTERN_00FF 0x0000ffff
|
|
#define PATTERN_0080 0x00008080
|
|
|
|
#define INVALID_VALUE 0xffffffff
|
|
#define MAX_NUM_OF_DUNITS 32
|
|
/*
|
|
* length *2 = length in words of pattern, first low address,
|
|
* second high address
|
|
*/
|
|
#define TEST_PATTERN_LENGTH 4
|
|
#define KILLER_PATTERN_DQ_NUMBER 8
|
|
#define SSO_DQ_NUMBER 4
|
|
#define PATTERN_MAXIMUM_LENGTH 64
|
|
#define ADLL_TX_LENGTH 64
|
|
#define ADLL_RX_LENGTH 32
|
|
|
|
#define PARAM_NOT_CARE 0
|
|
|
|
#define READ_LEVELING_PHY_OFFSET 2
|
|
#define WRITE_LEVELING_PHY_OFFSET 0
|
|
|
|
#define MASK_ALL_BITS 0xffffffff
|
|
|
|
#define CS_BIT_MASK 0xf
|
|
|
|
/* DFX access */
|
|
#define BROADCAST_ID 28
|
|
#define MULTICAST_ID 29
|
|
|
|
#define XSB_BASE_ADDR 0x00004000
|
|
#define XSB_CTRL_0_REG 0x00000000
|
|
#define XSB_CTRL_1_REG 0x00000004
|
|
#define XSB_CMD_REG 0x00000008
|
|
#define XSB_ADDRESS_REG 0x0000000c
|
|
#define XSB_DATA_REG 0x00000010
|
|
#define PIPE_ENABLE_ADDR 0x000f8000
|
|
#define ENABLE_DDR_TUNING_ADDR 0x000f829c
|
|
|
|
#define CLIENT_BASE_ADDR 0x00002000
|
|
#define CLIENT_CTRL_REG 0x00000000
|
|
|
|
#define TARGET_INT 0x1801
|
|
#define TARGET_EXT 0x180e
|
|
#define BYTE_EN 0
|
|
#define CMD_READ 0
|
|
#define CMD_WRITE 1
|
|
|
|
#define INTERNAL_ACCESS_PORT 1
|
|
#define EXECUTING 1
|
|
#define ACCESS_EXT 1
|
|
#define CS2_EXIST_BIT 2
|
|
#define TRAINING_ID 0xf
|
|
#define EXT_TRAINING_ID 1
|
|
#define EXT_MODE 0x4
|
|
|
|
#define GET_RESULT_STATE(res) (res)
|
|
#define SET_RESULT_STATE(res, state) (res = state)
|
|
|
|
#define _1K 0x00000400
|
|
#define _4K 0x00001000
|
|
#define _8K 0x00002000
|
|
#define _16K 0x00004000
|
|
#define _32K 0x00008000
|
|
#define _64K 0x00010000
|
|
#define _128K 0x00020000
|
|
#define _256K 0x00040000
|
|
#define _512K 0x00080000
|
|
|
|
#define _1M 0x00100000
|
|
#define _2M 0x00200000
|
|
#define _4M 0x00400000
|
|
#define _8M 0x00800000
|
|
#define _16M 0x01000000
|
|
#define _32M 0x02000000
|
|
#define _64M 0x04000000
|
|
#define _128M 0x08000000
|
|
#define _256M 0x10000000
|
|
#define _512M 0x20000000
|
|
|
|
#define _1G 0x40000000
|
|
#define _2G 0x80000000
|
|
|
|
#define ADDR_SIZE_512MB 0x04000000
|
|
#define ADDR_SIZE_1GB 0x08000000
|
|
#define ADDR_SIZE_2GB 0x10000000
|
|
#define ADDR_SIZE_4GB 0x20000000
|
|
#define ADDR_SIZE_8GB 0x40000000
|
|
|
|
enum hws_edge_compare {
|
|
EDGE_PF,
|
|
EDGE_FP,
|
|
EDGE_FPF,
|
|
EDGE_PFP
|
|
};
|
|
|
|
enum hws_control_element {
|
|
HWS_CONTROL_ELEMENT_ADLL, /* per bit 1 edge */
|
|
HWS_CONTROL_ELEMENT_DQ_SKEW,
|
|
HWS_CONTROL_ELEMENT_DQS_SKEW
|
|
};
|
|
|
|
enum hws_search_dir {
|
|
HWS_LOW2HIGH,
|
|
HWS_HIGH2LOW,
|
|
HWS_SEARCH_DIR_LIMIT
|
|
};
|
|
|
|
enum hws_page_size {
|
|
PAGE_SIZE_1K,
|
|
PAGE_SIZE_2K
|
|
};
|
|
|
|
enum hws_operation {
|
|
OPERATION_READ = 0,
|
|
OPERATION_WRITE = 1
|
|
};
|
|
|
|
enum hws_training_ip_stat {
|
|
HWS_TRAINING_IP_STATUS_FAIL,
|
|
HWS_TRAINING_IP_STATUS_SUCCESS,
|
|
HWS_TRAINING_IP_STATUS_TIMEOUT
|
|
};
|
|
|
|
enum hws_ddr_cs {
|
|
CS_SINGLE,
|
|
CS_NON_SINGLE
|
|
};
|
|
|
|
enum hws_ddr_phy {
|
|
DDR_PHY_DATA = 0,
|
|
DDR_PHY_CONTROL = 1
|
|
};
|
|
|
|
enum hws_dir {
|
|
OPER_WRITE,
|
|
OPER_READ,
|
|
OPER_WRITE_AND_READ
|
|
};
|
|
|
|
enum hws_wl_supp {
|
|
PHASE_SHIFT,
|
|
CLOCK_SHIFT,
|
|
ALIGN_SHIFT
|
|
};
|
|
|
|
struct reg_data {
|
|
u32 reg_addr;
|
|
u32 reg_data;
|
|
u32 reg_mask;
|
|
};
|
|
|
|
#endif /* _DDR3_TRAINING_IP_DEF_H */
|