xref: /rk3399_ARM-atf/drivers/marvell/mci.c (revision c3cf06f1a3a9b9ee8ac7a0ae505f95c45f7dca84)
1 /*
2  * Copyright (C) 2018 Marvell International Ltd.
3  *
4  * SPDX-License-Identifier:     BSD-3-Clause
5  * https://spdx.org/licenses
6  */
7 
8 /* MCI bus driver for Marvell ARMADA 8K and 8K+ SoCs */
9 
10 #include <debug.h>
11 #include <delay_timer.h>
12 #include <mmio.h>
13 #include <mci.h>
14 #include <mvebu.h>
15 #include <mvebu_def.h>
16 #include <plat_marvell.h>
17 
18 /* /HB /Units /Direct_regs /Direct regs
19  * /Configuration Register Write/Read Data Register
20  */
21 #define MCI_WRITE_READ_DATA_REG(mci_index)	\
22 					MVEBU_MCI_REG_BASE_REMAP(mci_index)
23 /* /HB /Units /Direct_regs /Direct regs
24  * /Configuration Register Access Command Register
25  */
26 #define MCI_ACCESS_CMD_REG(mci_index)		\
27 				(MVEBU_MCI_REG_BASE_REMAP(mci_index) + 0x4)
28 
29 /* Access Command fields :
30  * bit[3:0]   - Sub command: 1 => Peripheral Config Register Read,
31  *			     0 => Peripheral Config Register Write,
32  *			     2 => Peripheral Assign ID request,
33  *			     3 => Circular Config Write
34  * bit[5]     - 1 => Local (same chip access) 0 => Remote
35  * bit[15:8]  - Destination hop ID. Put Global ID (GID) here (see scheme below).
36  * bit[23:22] - 0x3 IHB PHY REG address space, 0x0 IHB Controller space
37  * bit[21:16] - Low 6 bits of offset. Hight 2 bits are taken from bit[28:27]
38  *		of IHB_PHY_CTRL
39  *		(must be set before any PHY register access occurs):
40  *		/IHB_REG /IHB_REGInterchip Hopping Bus Registers
41  *		/IHB Version Control Register
42  *
43  *		ixi_ihb_top		IHB PHY
44  *  AXI -----------------------------   -------------
45  *   <--| axi_hb_top | ihb_pipe_top |-->|           |
46  *   -->|   GID=1    |     GID=0    |<--|           |
47  *      -----------------------------   -------------
48  */
49 #define MCI_INDIRECT_CTRL_READ_CMD		0x1
50 #define MCI_INDIRECT_CTRL_ASSIGN_CMD		0x2
51 #define MCI_INDIRECT_CTRL_CIRCULAR_CMD		0x3
52 #define MCI_INDIRECT_CTRL_LOCAL_PKT		(1 << 5)
53 #define MCI_INDIRECT_CTRL_CMD_DONE_OFFSET	6
54 #define MCI_INDIRECT_CTRL_CMD_DONE		\
55 				(1 << MCI_INDIRECT_CTRL_CMD_DONE_OFFSET)
56 #define MCI_INDIRECT_CTRL_DATA_READY_OFFSET	7
57 #define MCI_INDIRECT_CTRL_DATA_READY		\
58 				(1 << MCI_INDIRECT_CTRL_DATA_READY_OFFSET)
59 #define MCI_INDIRECT_CTRL_HOPID_OFFSET		8
60 #define MCI_INDIRECT_CTRL_HOPID(id)		\
61 			(((id) & 0xFF) << MCI_INDIRECT_CTRL_HOPID_OFFSET)
62 #define MCI_INDIRECT_CTRL_REG_CHIPID_OFFSET	16
63 #define MCI_INDIRECT_REG_CTRL_ADDR(reg_num)	\
64 			(reg_num << MCI_INDIRECT_CTRL_REG_CHIPID_OFFSET)
65 
66 /* Hop ID values */
67 #define GID_IHB_PIPE					0
68 #define GID_AXI_HB					1
69 #define GID_IHB_EXT					2
70 
71 #define MCI_DID_GLOBAL_ASSIGNMENT_REQUEST_REG		0x2
72 /* Target MCi Local ID (LID, which is = self DID) */
73 #define MCI_DID_GLOBAL_ASSIGN_REQ_MCI_LOCAL_ID(val)	(((val) & 0xFF) << 16)
74 /* Bits [15:8]: Number of MCis on chip of target MCi */
75 #define MCI_DID_GLOBAL_ASSIGN_REQ_MCI_COUNT(val)	(((val) & 0xFF) << 8)
76 /* Bits [7:0]: Number of hops on chip of target MCi */
77 #define MCI_DID_GLOBAL_ASSIGN_REQ_HOPS_NUM(val)		(((val) & 0xFF) << 0)
78 
79 /* IHB_REG domain registers */
80 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers/
81  * Rx Memory Configuration Register (RX_MEM_CFG)
82  */
83 #define MCI_CTRL_RX_MEM_CFG_REG_NUM			0x0
84 #define MCI_CTRL_RX_TX_MEM_CFG_RQ_THRESH(val)		(((val) & 0xFF) << 24)
85 #define MCI_CTRL_RX_TX_MEM_CFG_PQ_THRESH(val)		(((val) & 0xFF) << 16)
86 #define MCI_CTRL_RX_TX_MEM_CFG_NQ_THRESH(val)		(((val) & 0xFF) << 8)
87 #define MCI_CTRL_RX_TX_MEM_CFG_DELTA_THRESH(val)	(((val) & 0xF) << 4)
88 #define MCI_CTRL_RX_TX_MEM_CFG_RTC(val)			(((val) & 0x3) << 2)
89 #define MCI_CTRL_RX_TX_MEM_CFG_WTC(val)			(((val) & 0x3) << 0)
90 #define MCI_CTRL_RX_MEM_CFG_REG_DEF_CP_VAL		\
91 				(MCI_CTRL_RX_TX_MEM_CFG_RQ_THRESH(0x07) | \
92 				MCI_CTRL_RX_TX_MEM_CFG_PQ_THRESH(0x3f) | \
93 				MCI_CTRL_RX_TX_MEM_CFG_NQ_THRESH(0x3f) | \
94 				MCI_CTRL_RX_TX_MEM_CFG_DELTA_THRESH(0xf) | \
95 				MCI_CTRL_RX_TX_MEM_CFG_RTC(1) | \
96 				MCI_CTRL_RX_TX_MEM_CFG_WTC(1))
97 
98 #define MCI_CTRL_RX_MEM_CFG_REG_DEF_AP_VAL		\
99 				(MCI_CTRL_RX_TX_MEM_CFG_RQ_THRESH(0x3f) | \
100 				MCI_CTRL_RX_TX_MEM_CFG_PQ_THRESH(0x03) | \
101 				MCI_CTRL_RX_TX_MEM_CFG_NQ_THRESH(0x3f) | \
102 				MCI_CTRL_RX_TX_MEM_CFG_DELTA_THRESH(0xf) | \
103 				MCI_CTRL_RX_TX_MEM_CFG_RTC(1) | \
104 				MCI_CTRL_RX_TX_MEM_CFG_WTC(1))
105 
106 
107 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers/
108  * Tx Memory Configuration Register (TX_MEM_CFG)
109  */
110 #define MCI_CTRL_TX_MEM_CFG_REG_NUM			0x1
111 /* field mapping for TX mem config register
112  * are the same as for RX register - see register above
113  */
114 #define MCI_CTRL_TX_MEM_CFG_REG_DEF_VAL			\
115 				(MCI_CTRL_RX_TX_MEM_CFG_RQ_THRESH(0x20) | \
116 				MCI_CTRL_RX_TX_MEM_CFG_PQ_THRESH(0x20) | \
117 				MCI_CTRL_RX_TX_MEM_CFG_NQ_THRESH(0x20) | \
118 				MCI_CTRL_RX_TX_MEM_CFG_DELTA_THRESH(2) | \
119 				MCI_CTRL_RX_TX_MEM_CFG_RTC(1) | \
120 				MCI_CTRL_RX_TX_MEM_CFG_WTC(1))
121 
122 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers
123  * /IHB Link CRC Control
124  */
125 /* MCi Link CRC Control Register (MCi_CRC_CTRL) */
126 #define MCI_LINK_CRC_CTRL_REG_NUM			0x4
127 
128 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers
129  * /IHB Status Register
130  */
131 /* MCi Status Register (MCi_STS) */
132 #define MCI_CTRL_STATUS_REG_NUM				0x5
133 #define MCI_CTRL_STATUS_REG_PHY_READY			(1 << 12)
134 #define MCI_CTRL_STATUS_REG_LINK_PRESENT		(1 << 15)
135 #define MCI_CTRL_STATUS_REG_PHY_CID_VIO_OFFSET		24
136 #define MCI_CTRL_STATUS_REG_PHY_CID_VIO_MASK		\
137 				(0xF << MCI_CTRL_STATUS_REG_PHY_CID_VIO_OFFSET)
138 /* Expected successful Link result, including reserved bit */
139 #define MCI_CTRL_PHY_READY		(MCI_CTRL_STATUS_REG_PHY_READY | \
140 					MCI_CTRL_STATUS_REG_LINK_PRESENT | \
141 					MCI_CTRL_STATUS_REG_PHY_CID_VIO_MASK)
142 
143 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers/
144  * MCi PHY Speed Settings Register (MCi_PHY_SETTING)
145  */
146 #define MCI_CTRL_MCI_PHY_SETTINGS_REG_NUM		0x8
147 #define MCI_CTRL_MCI_PHY_SET_DLO_FIFO_FULL_TRESH(val)	(((val) & 0xF) << 28)
148 #define MCI_CTRL_MCI_PHY_SET_PHY_MAX_SPEED(val)		(((val) & 0xF) << 12)
149 #define MCI_CTRL_MCI_PHY_SET_PHYCLK_SEL(val)		(((val) & 0xF) << 8)
150 #define MCI_CTRL_MCI_PHY_SET_REFCLK_FREQ_SEL(val)	(((val) & 0xF) << 4)
151 #define MCI_CTRL_MCI_PHY_SET_AUTO_LINK_EN(val)		(((val) & 0x1) << 1)
152 #define MCI_CTRL_MCI_PHY_SET_REG_DEF_VAL		\
153 			(MCI_CTRL_MCI_PHY_SET_DLO_FIFO_FULL_TRESH(0x3) | \
154 			MCI_CTRL_MCI_PHY_SET_PHY_MAX_SPEED(0x3) | \
155 			MCI_CTRL_MCI_PHY_SET_PHYCLK_SEL(0x2) | \
156 			MCI_CTRL_MCI_PHY_SET_REFCLK_FREQ_SEL(0x1))
157 #define MCI_CTRL_MCI_PHY_SET_REG_DEF_VAL2		\
158 			(MCI_CTRL_MCI_PHY_SET_DLO_FIFO_FULL_TRESH(0x3) | \
159 			MCI_CTRL_MCI_PHY_SET_PHY_MAX_SPEED(0x3) | \
160 			MCI_CTRL_MCI_PHY_SET_PHYCLK_SEL(0x5) | \
161 			MCI_CTRL_MCI_PHY_SET_REFCLK_FREQ_SEL(0x1))
162 
163 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers
164  * /IHB Mode Config
165  */
166 #define MCI_CTRL_IHB_MODE_CFG_REG_NUM			0x25
167 #define MCI_CTRL_IHB_MODE_HBCLK_DIV(val)		((val) & 0xFF)
168 #define MCI_CTRL_IHB_MODE_CHUNK_MOD_OFFSET		8
169 #define MCI_CTRL_IHB_MODE_CHUNK_MOD			\
170 				(1 << MCI_CTRL_IHB_MODE_CHUNK_MOD_OFFSET)
171 #define MCI_CTRL_IHB_MODE_FWD_MOD_OFFSET		9
172 #define MCI_CTRL_IHB_MODE_FWD_MOD			\
173 				(1 << MCI_CTRL_IHB_MODE_FWD_MOD_OFFSET)
174 #define MCI_CTRL_IHB_MODE_SEQFF_FINE_MOD(val)		(((val) & 0xF) << 12)
175 #define MCI_CTRL_IHB_MODE_RX_COMB_THRESH(val)		(((val) & 0xFF) << 16)
176 #define MCI_CTRL_IHB_MODE_TX_COMB_THRESH(val)		(((val) & 0xFF) << 24)
177 
178 #define MCI_CTRL_IHB_MODE_CFG_REG_DEF_VAL		\
179 				(MCI_CTRL_IHB_MODE_HBCLK_DIV(6) | \
180 				MCI_CTRL_IHB_MODE_FWD_MOD | \
181 				MCI_CTRL_IHB_MODE_SEQFF_FINE_MOD(0xF) | \
182 				MCI_CTRL_IHB_MODE_RX_COMB_THRESH(0x3f) | \
183 				MCI_CTRL_IHB_MODE_TX_COMB_THRESH(0x40))
184 /* AXI_HB registers */
185 #define MCI_AXI_ACCESS_DATA_REG_NUM			0x0
186 #define MCI_AXI_ACCESS_PCIE_MODE			1
187 #define MCI_AXI_ACCESS_CACHE_CHECK_OFFSET		5
188 #define MCI_AXI_ACCESS_CACHE_CHECK			\
189 				(1 << MCI_AXI_ACCESS_CACHE_CHECK_OFFSET)
190 #define MCI_AXI_ACCESS_FORCE_POST_WR_OFFSET		6
191 #define MCI_AXI_ACCESS_FORCE_POST_WR			\
192 				(1 << MCI_AXI_ACCESS_FORCE_POST_WR_OFFSET)
193 #define MCI_AXI_ACCESS_DISABLE_CLK_GATING_OFFSET	9
194 #define MCI_AXI_ACCESS_DISABLE_CLK_GATING		\
195 				(1 << MCI_AXI_ACCESS_DISABLE_CLK_GATING_OFFSET)
196 
197 /* /HB /Units /HB_REG /HB_REGHopping Bus Registers
198  * /Window 0 Address Mask Register
199  */
200 #define MCI_HB_CTRL_WIN0_ADDRESS_MASK_REG_NUM		0x2
201 
202 /* /HB /Units /HB_REG /HB_REGHopping Bus Registers
203  * /Window 0 Destination Register
204  */
205 #define MCI_HB_CTRL_WIN0_DESTINATION_REG_NUM		0x3
206 #define MCI_HB_CTRL_WIN0_DEST_VALID_FLAG(val)		(((val) & 0x1) << 16)
207 #define MCI_HB_CTRL_WIN0_DEST_ID(val)			(((val) & 0xFF) << 0)
208 
209 /* /HB /Units /HB_REG /HB_REGHopping Bus Registers /Tx Control Register */
210 #define MCI_HB_CTRL_TX_CTRL_REG_NUM			0xD
211 #define MCI_HB_CTRL_TX_CTRL_PCIE_MODE_OFFSET		24
212 #define MCI_HB_CTRL_TX_CTRL_PCIE_MODE			\
213 				(1 << MCI_HB_CTRL_TX_CTRL_PCIE_MODE_OFFSET)
214 #define MCI_HB_CTRL_TX_CTRL_PRI_TH_QOS(val)		(((val) & 0xF) << 12)
215 #define MCI_HB_CTRL_TX_CTRL_MAX_RD_CNT(val)		(((val) & 0x1F) << 6)
216 #define MCI_HB_CTRL_TX_CTRL_MAX_WR_CNT(val)		(((val) & 0x1F) << 0)
217 
218 /* /HB /Units /IHB_REG /IHB_REGInterchip Hopping Bus Registers
219  * /IHB Version Control Register
220  */
221 #define MCI_PHY_CTRL_REG_NUM				0x7
222 #define MCI_PHY_CTRL_MCI_MINOR				0x8 /* BITS [3:0] */
223 #define MCI_PHY_CTRL_MCI_MAJOR_OFFSET			4
224 #define MCI_PHY_CTRL_MCI_MAJOR				\
225 				(1 << MCI_PHY_CTRL_MCI_MAJOR_OFFSET)
226 #define MCI_PHY_CTRL_MCI_SLEEP_REQ_OFFSET		11
227 #define MCI_PHY_CTRL_MCI_SLEEP_REQ			\
228 				(1 << MCI_PHY_CTRL_MCI_SLEEP_REQ_OFFSET)
229 /* Host=1 / Device=0 PHY mode */
230 #define MCI_PHY_CTRL_MCI_PHY_MODE_OFFSET		24
231 #define MCI_PHY_CTRL_MCI_PHY_MODE_HOST			\
232 				(1 << MCI_PHY_CTRL_MCI_PHY_MODE_OFFSET)
233 /* Register=1 / PWM=0 interface */
234 #define MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE_OFFSET		25
235 #define MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE		\
236 				(1 << MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE_OFFSET)
237  /* PHY code InReset=1 */
238 #define MCI_PHY_CTRL_MCI_PHY_RESET_CORE_OFFSET		26
239 #define MCI_PHY_CTRL_MCI_PHY_RESET_CORE			\
240 				(1 << MCI_PHY_CTRL_MCI_PHY_RESET_CORE_OFFSET)
241 #define MCI_PHY_CTRL_PHY_ADDR_MSB_OFFSET		27
242 #define MCI_PHY_CTRL_PHY_ADDR_MSB(addr)			\
243 				(((addr) & 0x3) << \
244 				MCI_PHY_CTRL_PHY_ADDR_MSB_OFFSET)
245 #define MCI_PHY_CTRL_PIDI_MODE_OFFSET			31
246 #define MCI_PHY_CTRL_PIDI_MODE				\
247 				(1 << MCI_PHY_CTRL_PIDI_MODE_OFFSET)
248 
249 /* Number of times to wait for the MCI link ready after MCI configurations
250  * Normally takes 34-35 successive reads
251  */
252 #define LINK_READY_TIMEOUT				100
253 
254 enum mci_register_type {
255 	MCI_REG_TYPE_PHY = 0,
256 	MCI_REG_TYPE_CTRL,
257 };
258 
259 enum {
260 	MCI_CMD_WRITE,
261 	MCI_CMD_READ
262 };
263 
264 /* Write wrapper callback for debug:
265  * will print written data in case LOG_LEVEL >= 40
266  */
267 static void mci_mmio_write_32(uintptr_t addr, uint32_t value)
268 {
269 	VERBOSE("Write:\t0x%x = 0x%x\n", (uint32_t)addr, value);
270 	mmio_write_32(addr, value);
271 }
272 /* Read wrapper callback for debug:
273  * will print read data in case LOG_LEVEL >= 40
274  */
275 static uint32_t mci_mmio_read_32(uintptr_t addr)
276 {
277 	uint32_t value;
278 
279 	value = mmio_read_32(addr);
280 	VERBOSE("Read:\t0x%x = 0x%x\n", (uint32_t)addr, value);
281 	return value;
282 }
283 
284 /* MCI indirect access command completion polling:
285  * Each write/read command done via MCI indirect registers must be polled
286  * for command completions status.
287  *
288  * Returns 1 in case of error
289  * Returns 0 in case of command completed successfully.
290  */
291 static int mci_poll_command_completion(int mci_index, int command_type)
292 {
293 	uint32_t mci_cmd_value = 0, retry_count = 100, ret = 0;
294 	uint32_t completion_flags = MCI_INDIRECT_CTRL_CMD_DONE;
295 
296 	debug_enter();
297 	/* Read commands require validating that requested data is ready */
298 	if (command_type == MCI_CMD_READ)
299 		completion_flags |= MCI_INDIRECT_CTRL_DATA_READY;
300 
301 	do {
302 		/* wait 1 ms before each polling */
303 		mdelay(1);
304 		mci_cmd_value = mci_mmio_read_32(MCI_ACCESS_CMD_REG(mci_index));
305 	} while (((mci_cmd_value & completion_flags) != completion_flags) &&
306 			 (retry_count-- > 0));
307 
308 	if (retry_count == 0) {
309 		ERROR("%s: MCI command timeout (command status = 0x%x)\n",
310 		      __func__, mci_cmd_value);
311 		ret = 1;
312 	}
313 
314 	debug_exit();
315 	return ret;
316 }
317 
318 int mci_read(int mci_idx, uint32_t cmd, uint32_t *value)
319 {
320 	int rval;
321 
322 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_idx), cmd);
323 
324 	rval = mci_poll_command_completion(mci_idx, MCI_CMD_READ);
325 
326 	*value = mci_mmio_read_32(MCI_WRITE_READ_DATA_REG(mci_idx));
327 
328 	return rval;
329 }
330 
331 int  mci_write(int mci_idx, uint32_t cmd, uint32_t data)
332 {
333 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_idx), data);
334 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_idx), cmd);
335 
336 	return mci_poll_command_completion(mci_idx, MCI_CMD_WRITE);
337 }
338 
339 /* Perform 3 configurations in one command: PCI mode,
340  * queues separation and cache bit
341  */
342 static int mci_axi_set_pcie_mode(int mci_index)
343 {
344 	uint32_t reg_data, ret = 1;
345 
346 	debug_enter();
347 	/* This configuration makes MCI IP behave consistently with AXI protocol
348 	 * It should be configured at one side only (for example locally at AP).
349 	 * The IP takes care of performing the same configurations at MCI on
350 	 * another side (for example remotely at CP).
351 	 */
352 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
353 			  MCI_AXI_ACCESS_PCIE_MODE |
354 			  MCI_AXI_ACCESS_CACHE_CHECK |
355 			  MCI_AXI_ACCESS_FORCE_POST_WR |
356 			  MCI_AXI_ACCESS_DISABLE_CLK_GATING);
357 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
358 			  MCI_INDIRECT_REG_CTRL_ADDR(
359 				MCI_AXI_ACCESS_DATA_REG_NUM)  |
360 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB) |
361 			  MCI_INDIRECT_CTRL_LOCAL_PKT |
362 			  MCI_INDIRECT_CTRL_CIRCULAR_CMD);
363 
364 	/* if Write command was successful, verify PCIe mode */
365 	if (mci_poll_command_completion(mci_index, MCI_CMD_WRITE) == 0) {
366 		/* Verify the PCIe mode selected */
367 		mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
368 				  MCI_INDIRECT_REG_CTRL_ADDR(
369 					MCI_HB_CTRL_TX_CTRL_REG_NUM)  |
370 				  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB) |
371 				  MCI_INDIRECT_CTRL_LOCAL_PKT |
372 				  MCI_INDIRECT_CTRL_READ_CMD);
373 		/* if read was completed, verify PCIe mode */
374 		if (mci_poll_command_completion(mci_index, MCI_CMD_READ) == 0) {
375 			reg_data = mci_mmio_read_32(
376 					MCI_WRITE_READ_DATA_REG(mci_index));
377 			if (reg_data & MCI_HB_CTRL_TX_CTRL_PCIE_MODE)
378 				ret = 0;
379 		}
380 	}
381 
382 	debug_exit();
383 	return ret;
384 }
385 
386 /* Reduce sequence FIFO timer expiration threshold */
387 static int mci_axi_set_fifo_thresh(int mci_index)
388 {
389 	uint32_t reg_data, ret = 0;
390 
391 	debug_enter();
392 	/* This configuration reduces sequence FIFO timer expiration threshold
393 	 * (to 0x7 instead of 0xA).
394 	 * In MCI 1.6 version this configuration prevents possible functional
395 	 * issues.
396 	 * In version 1.82 the configuration prevents performance degradation
397 	 */
398 
399 	/* Configure local AP side */
400 	reg_data = MCI_PHY_CTRL_PIDI_MODE |
401 		   MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE |
402 		   MCI_PHY_CTRL_MCI_PHY_MODE_HOST |
403 		   MCI_PHY_CTRL_MCI_MAJOR |
404 		   MCI_PHY_CTRL_MCI_MINOR;
405 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index), reg_data);
406 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
407 			  MCI_INDIRECT_REG_CTRL_ADDR(MCI_PHY_CTRL_REG_NUM) |
408 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
409 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
410 
411 	/* Reduce the threshold */
412 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
413 			  MCI_CTRL_IHB_MODE_CFG_REG_DEF_VAL);
414 
415 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
416 			  MCI_INDIRECT_REG_CTRL_ADDR(
417 				MCI_CTRL_IHB_MODE_CFG_REG_NUM) |
418 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
419 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
420 
421 	/* Exit PIDI mode */
422 	reg_data = MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE |
423 		   MCI_PHY_CTRL_MCI_PHY_MODE_HOST |
424 		   MCI_PHY_CTRL_MCI_MAJOR |
425 		   MCI_PHY_CTRL_MCI_MINOR;
426 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index), reg_data);
427 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
428 			  MCI_INDIRECT_REG_CTRL_ADDR(MCI_PHY_CTRL_REG_NUM) |
429 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
430 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
431 
432 	/* Configure remote CP side */
433 	reg_data = MCI_PHY_CTRL_PIDI_MODE |
434 		   MCI_PHY_CTRL_MCI_MAJOR |
435 		   MCI_PHY_CTRL_MCI_MINOR |
436 		   MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE;
437 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index), reg_data);
438 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
439 			  MCI_INDIRECT_REG_CTRL_ADDR(MCI_PHY_CTRL_REG_NUM) |
440 			  MCI_CTRL_IHB_MODE_FWD_MOD);
441 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
442 
443 	/* Reduce the threshold */
444 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
445 			  MCI_CTRL_IHB_MODE_CFG_REG_DEF_VAL);
446 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
447 			  MCI_INDIRECT_REG_CTRL_ADDR(
448 				MCI_CTRL_IHB_MODE_CFG_REG_NUM) |
449 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT));
450 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
451 
452 	/* Exit PIDI mode */
453 	reg_data = MCI_PHY_CTRL_MCI_MAJOR |
454 		   MCI_PHY_CTRL_MCI_MINOR |
455 		   MCI_PHY_CTRL_MCI_PHY_REG_IF_MODE;
456 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index), reg_data);
457 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
458 			  MCI_INDIRECT_REG_CTRL_ADDR(MCI_PHY_CTRL_REG_NUM) |
459 			  MCI_CTRL_IHB_MODE_FWD_MOD);
460 
461 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
462 
463 	debug_exit();
464 	return ret;
465 }
466 
467 /* Configure:
468  * 1. AP & CP TX thresholds and delta configurations
469  * 2. DLO & DLI FIFO full threshold
470  * 3. RX thresholds and delta configurations
471  * 4. CP AR and AW outstanding
472  * 5. AP AR and AW outstanding
473  */
474 static int mci_axi_set_fifo_rx_tx_thresh(int mci_index)
475 {
476 	uint32_t ret = 0;
477 
478 	debug_enter();
479 	/* AP TX thresholds and delta configurations (IHB_reg 0x1) */
480 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
481 			  MCI_CTRL_TX_MEM_CFG_REG_DEF_VAL);
482 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
483 			  MCI_INDIRECT_REG_CTRL_ADDR(
484 				MCI_CTRL_TX_MEM_CFG_REG_NUM) |
485 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
486 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
487 
488 	/* CP TX thresholds and delta configurations (IHB_reg 0x1) */
489 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
490 			  MCI_CTRL_TX_MEM_CFG_REG_DEF_VAL);
491 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
492 			  MCI_INDIRECT_REG_CTRL_ADDR(
493 				MCI_CTRL_TX_MEM_CFG_REG_NUM) |
494 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT));
495 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
496 
497 	/* AP DLO & DLI FIFO full threshold & Auto-Link enable (IHB_reg 0x8) */
498 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
499 			  MCI_CTRL_MCI_PHY_SET_REG_DEF_VAL |
500 			  MCI_CTRL_MCI_PHY_SET_AUTO_LINK_EN(1));
501 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
502 			  MCI_INDIRECT_REG_CTRL_ADDR(
503 				MCI_CTRL_MCI_PHY_SETTINGS_REG_NUM) |
504 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
505 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
506 
507 	/* CP DLO & DLI FIFO full threshold (IHB_reg 0x8) */
508 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
509 			  MCI_CTRL_MCI_PHY_SET_REG_DEF_VAL);
510 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
511 			  MCI_INDIRECT_REG_CTRL_ADDR(
512 				MCI_CTRL_MCI_PHY_SETTINGS_REG_NUM) |
513 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT));
514 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
515 
516 	/* AP RX thresholds and delta configurations (IHB_reg 0x0) */
517 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
518 			  MCI_CTRL_RX_MEM_CFG_REG_DEF_AP_VAL);
519 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
520 			  MCI_INDIRECT_REG_CTRL_ADDR(
521 				MCI_CTRL_RX_MEM_CFG_REG_NUM) |
522 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
523 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
524 
525 	/* CP RX thresholds and delta configurations (IHB_reg 0x0) */
526 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
527 			  MCI_CTRL_RX_MEM_CFG_REG_DEF_CP_VAL);
528 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
529 			  MCI_INDIRECT_REG_CTRL_ADDR(
530 				MCI_CTRL_RX_MEM_CFG_REG_NUM) |
531 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT));
532 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
533 
534 	/* AP AR & AW maximum AXI outstanding request cfg (HB_reg 0xd) */
535 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
536 			  MCI_HB_CTRL_TX_CTRL_PRI_TH_QOS(8) |
537 			  MCI_HB_CTRL_TX_CTRL_MAX_RD_CNT(3) |
538 			  MCI_HB_CTRL_TX_CTRL_MAX_WR_CNT(3));
539 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
540 			  MCI_INDIRECT_REG_CTRL_ADDR(
541 				MCI_HB_CTRL_TX_CTRL_REG_NUM) |
542 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB) |
543 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
544 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
545 
546 	/* CP AR & AW maximum AXI outstanding request cfg (HB_reg 0xd) */
547 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(mci_index),
548 			  MCI_HB_CTRL_TX_CTRL_PRI_TH_QOS(8) |
549 			  MCI_HB_CTRL_TX_CTRL_MAX_RD_CNT(0xB) |
550 			  MCI_HB_CTRL_TX_CTRL_MAX_WR_CNT(0x11));
551 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(mci_index),
552 			  MCI_INDIRECT_REG_CTRL_ADDR(
553 				MCI_HB_CTRL_TX_CTRL_REG_NUM) |
554 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT) |
555 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB));
556 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
557 
558 	debug_exit();
559 	return ret;
560 }
561 
562 /* configure MCI to allow read & write transactions to arrive at the same time.
563  * Without the below configuration, MCI won't sent response to CPU for
564  * transactions which arrived simultaneously and will lead to CPU hang.
565  * The below will configure MCI to be able to pass transactions from/to CP/AP.
566  */
567 static int mci_enable_simultaneous_transactions(int mci_index)
568 {
569 	uint32_t ret = 0;
570 
571 	debug_enter();
572 	/* ID assignment (assigning global ID offset to CP) */
573 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(0),
574 			  MCI_DID_GLOBAL_ASSIGN_REQ_MCI_LOCAL_ID(2) |
575 			  MCI_DID_GLOBAL_ASSIGN_REQ_MCI_COUNT(2) |
576 			  MCI_DID_GLOBAL_ASSIGN_REQ_HOPS_NUM(2));
577 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(0),
578 			  MCI_INDIRECT_REG_CTRL_ADDR(
579 				MCI_DID_GLOBAL_ASSIGNMENT_REQUEST_REG) |
580 			  MCI_INDIRECT_CTRL_ASSIGN_CMD);
581 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
582 
583 	/* Assigning dest. ID=3 to all transactions entering from AXI at AP */
584 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(0),
585 			  MCI_HB_CTRL_WIN0_DEST_VALID_FLAG(1) |
586 			  MCI_HB_CTRL_WIN0_DEST_ID(3));
587 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(0),
588 			  MCI_INDIRECT_REG_CTRL_ADDR(
589 				MCI_HB_CTRL_WIN0_DESTINATION_REG_NUM) |
590 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB) |
591 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
592 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
593 
594 	/* Assigning dest. ID=1 to all transactions entering from AXI at CP */
595 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(0),
596 			  MCI_HB_CTRL_WIN0_DEST_VALID_FLAG(1) |
597 			  MCI_HB_CTRL_WIN0_DEST_ID(1));
598 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(0),
599 			  MCI_INDIRECT_REG_CTRL_ADDR(
600 				MCI_HB_CTRL_WIN0_DESTINATION_REG_NUM) |
601 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT) |
602 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB));
603 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
604 
605 	/* End address to all transactions entering from AXI at AP.
606 	 * This will lead to get match for any AXI address
607 	 * and receive destination ID=3
608 	 */
609 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(0), 0xffffffff);
610 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(0),
611 			  MCI_INDIRECT_REG_CTRL_ADDR(
612 				MCI_HB_CTRL_WIN0_ADDRESS_MASK_REG_NUM) |
613 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB) |
614 			  MCI_INDIRECT_CTRL_LOCAL_PKT);
615 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
616 
617 	/* End address to all transactions entering from AXI at CP.
618 	 * This will lead to get match for any AXI address
619 	 * and receive destination ID=1
620 	 */
621 	mci_mmio_write_32(MCI_WRITE_READ_DATA_REG(0), 0xffffffff);
622 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(0),
623 			  MCI_INDIRECT_REG_CTRL_ADDR(
624 				MCI_HB_CTRL_WIN0_ADDRESS_MASK_REG_NUM) |
625 			  MCI_INDIRECT_CTRL_HOPID(GID_IHB_EXT) |
626 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB));
627 	ret |= mci_poll_command_completion(mci_index, MCI_CMD_WRITE);
628 
629 	debug_exit();
630 	return ret;
631 }
632 
633 /* Check if MCI simultaneous transaction was already enabled.
634  * Currently bootrom does this mci configuration only when the boot source is
635  * SAR_MCIX4, in other cases it should be done at this stage.
636  * It is worth noticing that in case of booting from uart, the bootrom
637  * flow is different and this mci initialization is skipped even if boot
638  * source is SAR_MCIX4. Therefore new verification bases on appropriate mci's
639  * register content: if the appropriate reg contains 0x0 it means that the
640  * bootrom didn't perform required mci configuration.
641  *
642  * Returns:
643  * 0 - configuration already done
644  * 1 - configuration missing
645  */
646 static _Bool mci_simulatenous_trans_missing(int mci_index)
647 {
648 	uint32_t reg, ret;
649 
650 	/* read 'Window 0 Destination ID assignment' from HB register 0x3
651 	 * (TX_CFG_W0_DST_ID) to check whether ID assignment was already
652 	 * performed by BootROM.
653 	 */
654 	debug_enter();
655 	mci_mmio_write_32(MCI_ACCESS_CMD_REG(0),
656 			  MCI_INDIRECT_REG_CTRL_ADDR(
657 				MCI_HB_CTRL_WIN0_DESTINATION_REG_NUM) |
658 			  MCI_INDIRECT_CTRL_HOPID(GID_AXI_HB) |
659 			  MCI_INDIRECT_CTRL_LOCAL_PKT |
660 			  MCI_INDIRECT_CTRL_READ_CMD);
661 	ret = mci_poll_command_completion(mci_index, MCI_CMD_READ);
662 
663 	reg = mci_mmio_read_32(MCI_WRITE_READ_DATA_REG(mci_index));
664 
665 	if (ret)
666 		ERROR("Failed to verify MCI simultaneous read/write status\n");
667 
668 	debug_exit();
669 	/* default ID assignment is 0, so if register doesn't contain zeros
670 	 * it means that bootrom already performed required configuration.
671 	 */
672 	if (reg != 0)
673 		return 0;
674 
675 	return 1;
676 }
677 
678 /* For A1 revision, configure the MCI link for performance improvement:
679  * - set MCI to support read/write transactions to arrive at the same time
680  * - Switch AXI to PCIe mode
681  * - Reduce sequence FIFO threshold
682  * - Configure RX/TX FIFO thresholds
683  *
684  *   Note:
685  *   We don't exit on error code from any sub routine, to try (best effort) to
686  *   complete the MCI configuration.
687  *   (If we exit - Bootloader will surely fail to boot)
688  */
689 int mci_configure(int mci_index)
690 {
691 	int rval;
692 
693 	debug_enter();
694 	/* According to design guidelines the MCI simultaneous transaction
695 	 * shouldn't be enabled more then once - therefore make sure that it
696 	 * wasn't already enabled in bootrom.
697 	 */
698 	if (mci_simulatenous_trans_missing(mci_index)) {
699 		VERBOSE("Enabling MCI simultaneous transaction\n");
700 		/* set MCI to support read/write transactions
701 		 * to arrive at the same time
702 		 */
703 		rval = mci_enable_simultaneous_transactions(mci_index);
704 		if (rval)
705 			ERROR("Failed to set MCI simultaneous read/write\n");
706 	} else
707 		VERBOSE("Skip MCI ID assignment - already done by bootrom\n");
708 
709 	/* Configure MCI for more consistent behavior with AXI protocol */
710 	rval = mci_axi_set_pcie_mode(mci_index);
711 	if (rval)
712 		ERROR("Failed to set MCI to AXI PCIe mode\n");
713 
714 	/* reduce FIFO global threshold */
715 	rval = mci_axi_set_fifo_thresh(mci_index);
716 	if (rval)
717 		ERROR("Failed to set MCI FIFO global threshold\n");
718 
719 	/* configure RX/TX FIFO thresholds */
720 	rval = mci_axi_set_fifo_rx_tx_thresh(mci_index);
721 	if (rval)
722 		ERROR("Failed to set MCI RX/TX FIFO threshold\n");
723 
724 	debug_exit();
725 	return 1;
726 }
727 
728 int mci_get_link_status(void)
729 {
730 	uint32_t cmd, data;
731 
732 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_CTRL_STATUS_REG_NUM) |
733 		MCI_INDIRECT_CTRL_LOCAL_PKT | MCI_INDIRECT_CTRL_READ_CMD);
734 	if (mci_read(0, cmd, &data)) {
735 		ERROR("Failed to read status register\n");
736 		return -1;
737 	}
738 
739 	/* Check if the link is ready */
740 	if (data != MCI_CTRL_PHY_READY) {
741 		ERROR("Bad link status %x\n", data);
742 		return -1;
743 	}
744 
745 	return 0;
746 }
747 
748 void mci_turn_link_down(void)
749 {
750 	uint32_t cmd, data;
751 	int rval = 0;
752 
753 	debug_enter();
754 
755 	/* Turn off auto-link */
756 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_CTRL_MCI_PHY_SETTINGS_REG_NUM) |
757 			MCI_INDIRECT_CTRL_LOCAL_PKT);
758 	data = (MCI_CTRL_MCI_PHY_SET_REG_DEF_VAL2 |
759 		MCI_CTRL_MCI_PHY_SET_AUTO_LINK_EN(0));
760 	rval = mci_write(0, cmd, data);
761 	if (rval)
762 		ERROR("Failed to turn off auto-link\n");
763 
764 	/* Reset AP PHY */
765 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_PHY_CTRL_REG_NUM) |
766 		MCI_INDIRECT_CTRL_LOCAL_PKT);
767 	data = (MCI_PHY_CTRL_MCI_MINOR |
768 		MCI_PHY_CTRL_MCI_MAJOR |
769 		MCI_PHY_CTRL_MCI_PHY_MODE_HOST |
770 		MCI_PHY_CTRL_MCI_PHY_RESET_CORE);
771 	rval = mci_write(0, cmd, data);
772 	if (rval)
773 		ERROR("Failed to reset AP PHY\n");
774 
775 	/* Clear all status & CRC values */
776 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_LINK_CRC_CTRL_REG_NUM) |
777 	       MCI_INDIRECT_CTRL_LOCAL_PKT);
778 	data = 0x0;
779 	mci_write(0, cmd, data);
780 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_CTRL_STATUS_REG_NUM) |
781 	       MCI_INDIRECT_CTRL_LOCAL_PKT);
782 	data = 0x0;
783 	rval = mci_write(0, cmd, data);
784 	if (rval)
785 		ERROR("Failed to reset AP PHY\n");
786 
787 	/* Wait 5ms before un-reset the PHY */
788 	mdelay(5);
789 
790 	/* Un-reset AP PHY */
791 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_PHY_CTRL_REG_NUM) |
792 	       MCI_INDIRECT_CTRL_LOCAL_PKT);
793 	data = (MCI_PHY_CTRL_MCI_MINOR | MCI_PHY_CTRL_MCI_MAJOR |
794 		MCI_PHY_CTRL_MCI_PHY_MODE_HOST);
795 	rval = mci_write(0, cmd, data);
796 	if (rval)
797 		ERROR("Failed to un-reset AP PHY\n");
798 
799 	debug_exit();
800 }
801 
802 void mci_turn_link_on(void)
803 {
804 	uint32_t cmd, data;
805 	int rval = 0;
806 
807 	debug_enter();
808 	/* Turn on auto-link */
809 	cmd = (MCI_INDIRECT_REG_CTRL_ADDR(MCI_CTRL_MCI_PHY_SETTINGS_REG_NUM) |
810 			MCI_INDIRECT_CTRL_LOCAL_PKT);
811 	data = (MCI_CTRL_MCI_PHY_SET_REG_DEF_VAL2 |
812 		MCI_CTRL_MCI_PHY_SET_AUTO_LINK_EN(1));
813 	rval = mci_write(0, cmd, data);
814 	if (rval)
815 		ERROR("Failed to turn on auto-link\n");
816 
817 	debug_exit();
818 }
819 
820 /* Initialize MCI for performance improvements */
821 int mci_initialize(int mci_index)
822 {
823 	int ret;
824 
825 	debug_enter();
826 	INFO("MCI%d initialization:\n", mci_index);
827 
828 	ret = mci_configure(mci_index);
829 
830 	debug_exit();
831 	return ret;
832 }
833