1
2
3
4
5
6#include <common.h>
7#include <spl.h>
8#include <asm/io.h>
9#include <asm/arch/cpu.h>
10#include <asm/arch/soc.h>
11
12#include "high_speed_env_spec.h"
13#include "sys_env_lib.h"
14
15u8 selectors_serdes_rev1_map[LAST_SERDES_TYPE][MAX_SERDES_LANES] = {
16
17 {0x1, 0x1, NA, NA, NA, NA},
18 {NA, 0x2, 0x1, NA, 0x1, NA},
19 {NA, NA, 0x2, NA, NA, 0x1},
20 {NA, NA, NA, 0x1, NA, NA},
21 {0x2, 0x3, NA, NA, NA, NA},
22 {NA, NA, 0x3, NA, 0x2, NA},
23 {NA, NA, NA, NA, 0x6, 0x2},
24 {NA, NA, NA, 0x3, NA, NA},
25 {0x3, 0x4, NA, NA, NA, NA},
26 {NA, 0x5, 0x4, NA, 0x3, NA},
27 {NA, NA, NA, 0x4, NA, 0x3},
28 {NA, 0x7, NA, NA, NA, NA},
29 {NA, 0x6, NA, NA, 0x4, NA},
30 {NA, NA, NA, 0x5, NA, 0x4},
31 {NA, NA, NA, 0x6, 0x5, 0x5},
32 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
33};
34
35int hws_serdes_seq_init(void)
36{
37 DEBUG_INIT_FULL_S("\n### serdes_seq_init ###\n");
38
39 if (hws_serdes_seq_db_init() != MV_OK) {
40 printf("hws_serdes_seq_init: Error: Serdes initialization fail\n");
41 return MV_FAIL;
42 }
43
44 return MV_OK;
45}
46
47int serdes_power_up_ctrl_ext(u32 serdes_num, int serdes_power_up,
48 enum serdes_type serdes_type,
49 enum serdes_speed baud_rate,
50 enum serdes_mode serdes_mode,
51 enum ref_clock ref_clock)
52{
53 return MV_NOT_SUPPORTED;
54}
55
56u32 hws_serdes_silicon_ref_clock_get(void)
57{
58 DEBUG_INIT_FULL_S("\n### hws_serdes_silicon_ref_clock_get ###\n");
59
60 return REF_CLOCK_25MHZ;
61}
62
63u32 hws_serdes_get_max_lane(void)
64{
65 switch (sys_env_device_id_get()) {
66 case MV_6811:
67 return 4;
68 case MV_6810:
69 return 5;
70 case MV_6820:
71 case MV_6828:
72 return 6;
73 default:
74 printf("%s: Device ID Error, using 4 SerDes lanes\n",
75 __func__);
76 return 4;
77 }
78 return 6;
79}
80
81int hws_is_serdes_active(u8 lane_num)
82{
83 int ret = 1;
84
85
86 if (lane_num > 6)
87 ret = 0;
88
89
90 if (sys_env_device_id_get() == MV_6810 && lane_num == 4) {
91 printf("%s: Error: Lane#4 on Device 6810 is not Active.\n",
92 __func__);
93 return 0;
94 }
95
96
97
98
99
100 if (sys_env_device_id_get() == MV_6810 && lane_num == 5)
101 return 1;
102
103 if (lane_num >= hws_serdes_get_max_lane())
104 ret = 0;
105
106 return ret;
107}
108
109int hws_get_ext_base_addr(u32 serdes_num, u32 base_addr, u32 unit_base_offset,
110 u32 *unit_base_reg, u32 *unit_offset)
111{
112 *unit_base_reg = base_addr;
113 *unit_offset = unit_base_offset;
114
115 return MV_OK;
116}
117
118
119
120
121
122
123
124
125
126
127
128
129u32 hws_serdes_get_phy_selector_val(int serdes_num,
130 enum serdes_type serdes_type)
131{
132 if (serdes_type >= LAST_SERDES_TYPE)
133 return 0xff;
134
135 if (hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2) {
136 return selectors_serdes_rev1_map
137 [serdes_type][serdes_num];
138 } else
139 return selectors_serdes_rev2_map
140 [serdes_type][serdes_num];
141}
142
143u32 hws_get_physical_serdes_num(u32 serdes_num)
144{
145 if ((serdes_num == 4) && (sys_env_device_id_get() == MV_6810)) {
146
147
148
149
150 return 5;
151 } else {
152 return serdes_num;
153 }
154}
155