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