1a2a55e51SPrabhakar Kushwaha /*
2a2a55e51SPrabhakar Kushwaha  * Copyright (C) 2014 Freescale Semiconductor
3a2a55e51SPrabhakar Kushwaha  *
4a2a55e51SPrabhakar Kushwaha  * SPDX-License-Identifier:	GPL-2.0+
5a2a55e51SPrabhakar Kushwaha  */
6a2a55e51SPrabhakar Kushwaha 
7a2a55e51SPrabhakar Kushwaha /* Perform extra checking */
8a2a55e51SPrabhakar Kushwaha #include <common.h>
9a2a55e51SPrabhakar Kushwaha #include <errno.h>
10a2a55e51SPrabhakar Kushwaha #include <asm/io.h>
11a2a55e51SPrabhakar Kushwaha #include <linux/types.h>
12cd8aefc0SPrabhakar Kushwaha #include <asm/atomic.h>
13a2a55e51SPrabhakar Kushwaha #include <malloc.h>
14*8e62f1eeSPriyanka Jain #include <asm/arch/soc.h>
15a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_qbman_base.h>
16a2a55e51SPrabhakar Kushwaha 
17a2a55e51SPrabhakar Kushwaha #define QBMAN_CHECKING
18a2a55e51SPrabhakar Kushwaha 
19a2a55e51SPrabhakar Kushwaha /* Any time there is a register interface which we poll on, this provides a
20a2a55e51SPrabhakar Kushwaha  * "break after x iterations" scheme for it. It's handy for debugging, eg.
21a2a55e51SPrabhakar Kushwaha  * where you don't want millions of lines of log output from a polling loop
22a2a55e51SPrabhakar Kushwaha  * that won't, because such things tend to drown out the earlier log output
23a2a55e51SPrabhakar Kushwaha  * that might explain what caused the problem. (NB: put ";" after each macro!)
24a2a55e51SPrabhakar Kushwaha  * TODO: we should probably remove this once we're done sanitising the
25a2a55e51SPrabhakar Kushwaha  * simulator...
26a2a55e51SPrabhakar Kushwaha  */
27a2a55e51SPrabhakar Kushwaha #define DBG_POLL_START(loopvar) (loopvar = 10)
28a2a55e51SPrabhakar Kushwaha #define DBG_POLL_CHECK(loopvar) \
29a2a55e51SPrabhakar Kushwaha 	do {if (!(loopvar--)) BUG_ON(NULL == "DBG_POLL_CHECK"); } while (0)
30a2a55e51SPrabhakar Kushwaha 
31a2a55e51SPrabhakar Kushwaha /* For CCSR or portal-CINH registers that contain fields at arbitrary offsets
32a2a55e51SPrabhakar Kushwaha  * and widths, these macro-generated encode/decode/isolate/remove inlines can
33a2a55e51SPrabhakar Kushwaha  * be used.
34a2a55e51SPrabhakar Kushwaha  *
35a2a55e51SPrabhakar Kushwaha  * Eg. to "d"ecode a 14-bit field out of a register (into a "uint16_t" type),
36a2a55e51SPrabhakar Kushwaha  * where the field is located 3 bits "up" from the least-significant bit of the
37a2a55e51SPrabhakar Kushwaha  * register (ie. the field location within the 32-bit register corresponds to a
38a2a55e51SPrabhakar Kushwaha  * mask of 0x0001fff8), you would do;
39a2a55e51SPrabhakar Kushwaha  *                uint16_t field = d32_uint16_t(3, 14, reg_value);
40a2a55e51SPrabhakar Kushwaha  *
41a2a55e51SPrabhakar Kushwaha  * Or to "e"ncode a 1-bit boolean value (input type is "int", zero is FALSE,
42a2a55e51SPrabhakar Kushwaha  * non-zero is TRUE, so must convert all non-zero inputs to 1, hence the "!!"
43a2a55e51SPrabhakar Kushwaha  * operator) into a register at bit location 0x00080000 (19 bits "in" from the
44a2a55e51SPrabhakar Kushwaha  * LS bit), do;
45a2a55e51SPrabhakar Kushwaha  *                reg_value |= e32_int(19, 1, !!field);
46a2a55e51SPrabhakar Kushwaha  *
47a2a55e51SPrabhakar Kushwaha  * If you wish to read-modify-write a register, such that you leave the 14-bit
48a2a55e51SPrabhakar Kushwaha  * field as-is but have all other fields set to zero, then "i"solate the 14-bit
49a2a55e51SPrabhakar Kushwaha  * value using;
50a2a55e51SPrabhakar Kushwaha  *                reg_value = i32_uint16_t(3, 14, reg_value);
51a2a55e51SPrabhakar Kushwaha  *
52a2a55e51SPrabhakar Kushwaha  * Alternatively, you could "r"emove the 1-bit boolean field (setting it to
53a2a55e51SPrabhakar Kushwaha  * zero) but leaving all other fields as-is;
54a2a55e51SPrabhakar Kushwaha  *                reg_val = r32_int(19, 1, reg_value);
55a2a55e51SPrabhakar Kushwaha  *
56a2a55e51SPrabhakar Kushwaha  */
57a2a55e51SPrabhakar Kushwaha #define MAKE_MASK32(width) (width == 32 ? 0xffffffff : \
58a2a55e51SPrabhakar Kushwaha 				 (uint32_t)((1 << width) - 1))
59a2a55e51SPrabhakar Kushwaha #define DECLARE_CODEC32(t) \
60a2a55e51SPrabhakar Kushwaha static inline uint32_t e32_##t(uint32_t lsoffset, uint32_t width, t val) \
61a2a55e51SPrabhakar Kushwaha { \
62a2a55e51SPrabhakar Kushwaha 	BUG_ON(width > (sizeof(t) * 8)); \
63a2a55e51SPrabhakar Kushwaha 	return ((uint32_t)val & MAKE_MASK32(width)) << lsoffset; \
64a2a55e51SPrabhakar Kushwaha } \
65a2a55e51SPrabhakar Kushwaha static inline t d32_##t(uint32_t lsoffset, uint32_t width, uint32_t val) \
66a2a55e51SPrabhakar Kushwaha { \
67a2a55e51SPrabhakar Kushwaha 	BUG_ON(width > (sizeof(t) * 8)); \
68a2a55e51SPrabhakar Kushwaha 	return (t)((val >> lsoffset) & MAKE_MASK32(width)); \
69a2a55e51SPrabhakar Kushwaha } \
70a2a55e51SPrabhakar Kushwaha static inline uint32_t i32_##t(uint32_t lsoffset, uint32_t width, \
71a2a55e51SPrabhakar Kushwaha 				uint32_t val) \
72a2a55e51SPrabhakar Kushwaha { \
73a2a55e51SPrabhakar Kushwaha 	BUG_ON(width > (sizeof(t) * 8)); \
74a2a55e51SPrabhakar Kushwaha 	return e32_##t(lsoffset, width, d32_##t(lsoffset, width, val)); \
75a2a55e51SPrabhakar Kushwaha } \
76a2a55e51SPrabhakar Kushwaha static inline uint32_t r32_##t(uint32_t lsoffset, uint32_t width, \
77a2a55e51SPrabhakar Kushwaha 				uint32_t val) \
78a2a55e51SPrabhakar Kushwaha { \
79a2a55e51SPrabhakar Kushwaha 	BUG_ON(width > (sizeof(t) * 8)); \
80a2a55e51SPrabhakar Kushwaha 	return ~(MAKE_MASK32(width) << lsoffset) & val; \
81a2a55e51SPrabhakar Kushwaha }
82a2a55e51SPrabhakar Kushwaha DECLARE_CODEC32(uint32_t)
83a2a55e51SPrabhakar Kushwaha DECLARE_CODEC32(uint16_t)
84a2a55e51SPrabhakar Kushwaha DECLARE_CODEC32(uint8_t)
85a2a55e51SPrabhakar Kushwaha DECLARE_CODEC32(int)
86a2a55e51SPrabhakar Kushwaha 
87a2a55e51SPrabhakar Kushwaha 	/*********************/
88a2a55e51SPrabhakar Kushwaha 	/* Debugging assists */
89a2a55e51SPrabhakar Kushwaha 	/*********************/
90a2a55e51SPrabhakar Kushwaha 
91a2a55e51SPrabhakar Kushwaha static inline void __hexdump(unsigned long start, unsigned long end,
92a2a55e51SPrabhakar Kushwaha 			unsigned long p, size_t sz, const unsigned char *c)
93a2a55e51SPrabhakar Kushwaha {
94a2a55e51SPrabhakar Kushwaha 	while (start < end) {
95a2a55e51SPrabhakar Kushwaha 		unsigned int pos = 0;
96a2a55e51SPrabhakar Kushwaha 		char buf[64];
97a2a55e51SPrabhakar Kushwaha 		int nl = 0;
98a2a55e51SPrabhakar Kushwaha 
99a2a55e51SPrabhakar Kushwaha 		pos += sprintf(buf + pos, "%08lx: ", start);
100a2a55e51SPrabhakar Kushwaha 		do {
101a2a55e51SPrabhakar Kushwaha 			if ((start < p) || (start >= (p + sz)))
102a2a55e51SPrabhakar Kushwaha 				pos += sprintf(buf + pos, "..");
103a2a55e51SPrabhakar Kushwaha 			else
104a2a55e51SPrabhakar Kushwaha 				pos += sprintf(buf + pos, "%02x", *(c++));
105a2a55e51SPrabhakar Kushwaha 			if (!(++start & 15)) {
106a2a55e51SPrabhakar Kushwaha 				buf[pos++] = '\n';
107a2a55e51SPrabhakar Kushwaha 				nl = 1;
108a2a55e51SPrabhakar Kushwaha 			} else {
109a2a55e51SPrabhakar Kushwaha 				nl = 0;
110a2a55e51SPrabhakar Kushwaha 				if (!(start & 1))
111a2a55e51SPrabhakar Kushwaha 					buf[pos++] = ' ';
112a2a55e51SPrabhakar Kushwaha 				if (!(start & 3))
113a2a55e51SPrabhakar Kushwaha 					buf[pos++] = ' ';
114a2a55e51SPrabhakar Kushwaha 			}
115a2a55e51SPrabhakar Kushwaha 		} while (start & 15);
116a2a55e51SPrabhakar Kushwaha 		if (!nl)
117a2a55e51SPrabhakar Kushwaha 			buf[pos++] = '\n';
118a2a55e51SPrabhakar Kushwaha 		buf[pos] = '\0';
119a2a55e51SPrabhakar Kushwaha 		debug("%s", buf);
120a2a55e51SPrabhakar Kushwaha 	}
121a2a55e51SPrabhakar Kushwaha }
122a2a55e51SPrabhakar Kushwaha static inline void hexdump(const void *ptr, size_t sz)
123a2a55e51SPrabhakar Kushwaha {
124a2a55e51SPrabhakar Kushwaha 	unsigned long p = (unsigned long)ptr;
125a2a55e51SPrabhakar Kushwaha 	unsigned long start = p & ~(unsigned long)15;
126a2a55e51SPrabhakar Kushwaha 	unsigned long end = (p + sz + 15) & ~(unsigned long)15;
127a2a55e51SPrabhakar Kushwaha 	const unsigned char *c = ptr;
128a2a55e51SPrabhakar Kushwaha 
129a2a55e51SPrabhakar Kushwaha 	__hexdump(start, end, p, sz, c);
130a2a55e51SPrabhakar Kushwaha }
131a2a55e51SPrabhakar Kushwaha 
132a2a55e51SPrabhakar Kushwaha #if defined(__BIG_ENDIAN)
133a2a55e51SPrabhakar Kushwaha #define DQRR_TOK_OFFSET 0
134a2a55e51SPrabhakar Kushwaha #else
135a2a55e51SPrabhakar Kushwaha #define DQRR_TOK_OFFSET 24
136a2a55e51SPrabhakar Kushwaha #endif
137a2a55e51SPrabhakar Kushwaha 
138a2a55e51SPrabhakar Kushwaha /* Similarly-named functions */
139a2a55e51SPrabhakar Kushwaha #define upper32(a) upper_32_bits(a)
140a2a55e51SPrabhakar Kushwaha #define lower32(a) lower_32_bits(a)
141a2a55e51SPrabhakar Kushwaha 
142a2a55e51SPrabhakar Kushwaha 	/****************/
143a2a55e51SPrabhakar Kushwaha 	/* arch assists */
144a2a55e51SPrabhakar Kushwaha 	/****************/
145a2a55e51SPrabhakar Kushwaha 
146a2a55e51SPrabhakar Kushwaha static inline void dcbz(void *ptr)
147a2a55e51SPrabhakar Kushwaha {
148a2a55e51SPrabhakar Kushwaha 	uint32_t *p = ptr;
149a2a55e51SPrabhakar Kushwaha 	BUG_ON((unsigned long)ptr & 63);
150a2a55e51SPrabhakar Kushwaha 	p[0] = 0;
151a2a55e51SPrabhakar Kushwaha 	p[1] = 0;
152a2a55e51SPrabhakar Kushwaha 	p[2] = 0;
153a2a55e51SPrabhakar Kushwaha 	p[3] = 0;
154a2a55e51SPrabhakar Kushwaha 	p[4] = 0;
155a2a55e51SPrabhakar Kushwaha 	p[5] = 0;
156a2a55e51SPrabhakar Kushwaha 	p[6] = 0;
157a2a55e51SPrabhakar Kushwaha 	p[7] = 0;
158a2a55e51SPrabhakar Kushwaha 	p[8] = 0;
159a2a55e51SPrabhakar Kushwaha 	p[9] = 0;
160a2a55e51SPrabhakar Kushwaha 	p[10] = 0;
161a2a55e51SPrabhakar Kushwaha 	p[11] = 0;
162a2a55e51SPrabhakar Kushwaha 	p[12] = 0;
163a2a55e51SPrabhakar Kushwaha 	p[13] = 0;
164a2a55e51SPrabhakar Kushwaha 	p[14] = 0;
165a2a55e51SPrabhakar Kushwaha 	p[15] = 0;
166a2a55e51SPrabhakar Kushwaha }
167a2a55e51SPrabhakar Kushwaha 
168a2a55e51SPrabhakar Kushwaha #define lwsync()
169a2a55e51SPrabhakar Kushwaha 
170*8e62f1eeSPriyanka Jain void qbman_version(u32 *major, u32 *minor)
171*8e62f1eeSPriyanka Jain {
172*8e62f1eeSPriyanka Jain 	u32 svr_dev_id;
173*8e62f1eeSPriyanka Jain 
174*8e62f1eeSPriyanka Jain 	/*
175*8e62f1eeSPriyanka Jain 	 * LS2080A SoC and its personalities has qbman cotroller version 4.0
176*8e62f1eeSPriyanka Jain 	 * New SoCs like LS2088A, LS1088A has qbman conroller version 4.1
177*8e62f1eeSPriyanka Jain 	 */
178*8e62f1eeSPriyanka Jain 	svr_dev_id = get_svr() >> 16;
179*8e62f1eeSPriyanka Jain 	if (svr_dev_id == SVR_DEV_LS2080A) {
180*8e62f1eeSPriyanka Jain 		*major = 4;
181*8e62f1eeSPriyanka Jain 		*minor = 0;
182*8e62f1eeSPriyanka Jain 	} else {
183*8e62f1eeSPriyanka Jain 		*major = 4;
184*8e62f1eeSPriyanka Jain 		*minor = 1;
185*8e62f1eeSPriyanka Jain 	}
186*8e62f1eeSPriyanka Jain }
187*8e62f1eeSPriyanka Jain 
188a2a55e51SPrabhakar Kushwaha #include "qbman_sys.h"
189