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