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