mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-08 13:53:21 +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>
108 lines
4.5 KiB
C
108 lines
4.5 KiB
C
/*
|
|
* Copyright (C) Marvell International Ltd. and its affiliates
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0
|
|
*/
|
|
|
|
#ifndef _DDR3_TRAINING_IP_PRV_IF_H
|
|
#define _DDR3_TRAINING_IP_PRV_IF_H
|
|
|
|
#include "ddr3_training_ip.h"
|
|
#include "ddr3_training_ip_flow.h"
|
|
#include "ddr3_training_ip_bist.h"
|
|
|
|
enum hws_static_config_type {
|
|
WRITE_LEVELING_STATIC,
|
|
READ_LEVELING_STATIC
|
|
};
|
|
|
|
struct ddr3_device_info {
|
|
u32 device_id;
|
|
u32 ck_delay;
|
|
};
|
|
|
|
typedef int (*HWS_TIP_DUNIT_MUX_SELECT_FUNC_PTR)(u8 dev_num, int enable);
|
|
typedef int (*HWS_TIP_DUNIT_REG_READ_FUNC_PTR)(
|
|
u8 dev_num, enum hws_access_type interface_access, u32 if_id,
|
|
u32 offset, u32 *data, u32 mask);
|
|
typedef int (*HWS_TIP_DUNIT_REG_WRITE_FUNC_PTR)(
|
|
u8 dev_num, enum hws_access_type interface_access, u32 if_id,
|
|
u32 offset, u32 data, u32 mask);
|
|
typedef int (*HWS_TIP_GET_FREQ_CONFIG_INFO)(
|
|
u8 dev_num, enum hws_ddr_freq freq,
|
|
struct hws_tip_freq_config_info *freq_config_info);
|
|
typedef int (*HWS_TIP_GET_DEVICE_INFO)(
|
|
u8 dev_num, struct ddr3_device_info *info_ptr);
|
|
typedef int (*HWS_GET_CS_CONFIG_FUNC_PTR)(
|
|
u8 dev_num, u32 cs_mask, struct hws_cs_config_info *cs_info);
|
|
typedef int (*HWS_SET_FREQ_DIVIDER_FUNC_PTR)(
|
|
u8 dev_num, u32 if_id, enum hws_ddr_freq freq);
|
|
typedef int (*HWS_GET_INIT_FREQ)(u8 dev_num, enum hws_ddr_freq *freq);
|
|
typedef int (*HWS_TRAINING_IP_IF_WRITE_FUNC_PTR)(
|
|
u32 dev_num, enum hws_access_type access_type, u32 dunit_id,
|
|
u32 reg_addr, u32 data, u32 mask);
|
|
typedef int (*HWS_TRAINING_IP_IF_READ_FUNC_PTR)(
|
|
u32 dev_num, enum hws_access_type access_type, u32 dunit_id,
|
|
u32 reg_addr, u32 *data, u32 mask);
|
|
typedef int (*HWS_TRAINING_IP_BUS_WRITE_FUNC_PTR)(
|
|
u32 dev_num, enum hws_access_type dunit_access_type, u32 if_id,
|
|
enum hws_access_type phy_access_type, u32 phy_id,
|
|
enum hws_ddr_phy phy_type, u32 reg_addr, u32 data);
|
|
typedef int (*HWS_TRAINING_IP_BUS_READ_FUNC_PTR)(
|
|
u32 dev_num, u32 if_id, enum hws_access_type phy_access_type,
|
|
u32 phy_id, enum hws_ddr_phy phy_type, u32 reg_addr, u32 *data);
|
|
typedef int (*HWS_TRAINING_IP_ALGO_RUN_FUNC_PTR)(
|
|
u32 dev_num, enum hws_algo_type algo_type);
|
|
typedef int (*HWS_TRAINING_IP_SET_FREQ_FUNC_PTR)(
|
|
u32 dev_num, enum hws_access_type access_type, u32 if_id,
|
|
enum hws_ddr_freq frequency);
|
|
typedef int (*HWS_TRAINING_IP_INIT_CONTROLLER_FUNC_PTR)(
|
|
u32 dev_num, struct init_cntr_param *init_cntr_prm);
|
|
typedef int (*HWS_TRAINING_IP_PBS_RX_FUNC_PTR)(u32 dev_num);
|
|
typedef int (*HWS_TRAINING_IP_PBS_TX_FUNC_PTR)(u32 dev_num);
|
|
typedef int (*HWS_TRAINING_IP_SELECT_CONTROLLER_FUNC_PTR)(
|
|
u32 dev_num, int enable);
|
|
typedef int (*HWS_TRAINING_IP_TOPOLOGY_MAP_LOAD_FUNC_PTR)(
|
|
u32 dev_num, struct hws_topology_map *topology_map);
|
|
typedef int (*HWS_TRAINING_IP_STATIC_CONFIG_FUNC_PTR)(
|
|
u32 dev_num, enum hws_ddr_freq frequency,
|
|
enum hws_static_config_type static_config_type, u32 if_id);
|
|
typedef int (*HWS_TRAINING_IP_EXTERNAL_READ_PTR)(
|
|
u32 dev_num, u32 if_id, u32 ddr_addr, u32 num_bursts, u32 *data);
|
|
typedef int (*HWS_TRAINING_IP_EXTERNAL_WRITE_PTR)(
|
|
u32 dev_num, u32 if_id, u32 ddr_addr, u32 num_bursts, u32 *data);
|
|
typedef int (*HWS_TRAINING_IP_BIST_ACTIVATE)(
|
|
u32 dev_num, enum hws_pattern pattern, enum hws_access_type access_type,
|
|
u32 if_num, enum hws_dir direction,
|
|
enum hws_stress_jump addr_stress_jump,
|
|
enum hws_pattern_duration duration,
|
|
enum hws_bist_operation oper_type, u32 offset, u32 cs_num,
|
|
u32 pattern_addr_length);
|
|
typedef int (*HWS_TRAINING_IP_BIST_READ_RESULT)(
|
|
u32 dev_num, u32 if_id, struct bist_result *pst_bist_result);
|
|
typedef int (*HWS_TRAINING_IP_LOAD_TOPOLOGY)(u32 dev_num, u32 config_num);
|
|
typedef int (*HWS_TRAINING_IP_READ_LEVELING)(u32 dev_num, u32 config_num);
|
|
typedef int (*HWS_TRAINING_IP_WRITE_LEVELING)(u32 dev_num, u32 config_num);
|
|
typedef u32 (*HWS_TRAINING_IP_GET_TEMP)(u8 dev_num);
|
|
|
|
struct hws_tip_config_func_db {
|
|
HWS_TIP_DUNIT_MUX_SELECT_FUNC_PTR tip_dunit_mux_select_func;
|
|
HWS_TIP_DUNIT_REG_READ_FUNC_PTR tip_dunit_read_func;
|
|
HWS_TIP_DUNIT_REG_WRITE_FUNC_PTR tip_dunit_write_func;
|
|
HWS_TIP_GET_FREQ_CONFIG_INFO tip_get_freq_config_info_func;
|
|
HWS_TIP_GET_DEVICE_INFO tip_get_device_info_func;
|
|
HWS_SET_FREQ_DIVIDER_FUNC_PTR tip_set_freq_divider_func;
|
|
HWS_GET_CS_CONFIG_FUNC_PTR tip_get_cs_config_info;
|
|
HWS_TRAINING_IP_GET_TEMP tip_get_temperature;
|
|
};
|
|
|
|
int ddr3_tip_init_config_func(u32 dev_num,
|
|
struct hws_tip_config_func_db *config_func);
|
|
int ddr3_tip_register_xsb_info(u32 dev_num,
|
|
struct hws_xsb_info *xsb_info_table);
|
|
enum hws_result *ddr3_tip_get_result_ptr(u32 stage);
|
|
int ddr3_set_freq_config_info(struct hws_tip_freq_config_info *table);
|
|
int print_device_info(u8 dev_num);
|
|
|
|
#endif /* _DDR3_TRAINING_IP_PRV_IF_H */
|