/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2020 Marvell International Ltd. * * Helper utilities for qlm_jtag. */ #ifndef __CVMX_HELPER_JTAG_H__ #define __CVMX_HELPER_JTAG_H__ /** * The JTAG chain for CN52XX and CN56XX is 4 * 268 bits long, or 1072. * CN5XXX full chain shift is: * new data => lane 3 => lane 2 => lane 1 => lane 0 => data out * The JTAG chain for CN63XX is 4 * 300 bits long, or 1200. * The JTAG chain for CN68XX is 4 * 304 bits long, or 1216. * The JTAG chain for CN66XX/CN61XX/CNF71XX is 4 * 304 bits long, or 1216. * CN6XXX full chain shift is: * new data => lane 0 => lane 1 => lane 2 => lane 3 => data out * Shift LSB first, get LSB out */ extern const __cvmx_qlm_jtag_field_t __cvmx_qlm_jtag_field_cn63xx[]; extern const __cvmx_qlm_jtag_field_t __cvmx_qlm_jtag_field_cn66xx[]; extern const __cvmx_qlm_jtag_field_t __cvmx_qlm_jtag_field_cn68xx[]; #define CVMX_QLM_JTAG_UINT32 40 typedef u32 qlm_jtag_uint32_t[CVMX_QLM_JTAG_UINT32 * 8]; /** * Initialize the internal QLM JTAG logic to allow programming * of the JTAG chain by the cvmx_helper_qlm_jtag_*() functions. * These functions should only be used at the direction of Cavium * Networks. Programming incorrect values into the JTAG chain * can cause chip damage. */ void cvmx_helper_qlm_jtag_init(void); /** * Write up to 32bits into the QLM jtag chain. Bits are shifted * into the MSB and out the LSB, so you should shift in the low * order bits followed by the high order bits. The JTAG chain for * CN52XX and CN56XX is 4 * 268 bits long, or 1072. The JTAG chain * for CN63XX is 4 * 300 bits long, or 1200. * * @param qlm QLM to shift value into * @param bits Number of bits to shift in (1-32). * @param data Data to shift in. Bit 0 enters the chain first, followed by * bit 1, etc. * * Return: The low order bits of the JTAG chain that shifted out of the * circle. */ u32 cvmx_helper_qlm_jtag_shift(int qlm, int bits, u32 data); /** * Shift long sequences of zeros into the QLM JTAG chain. It is * common to need to shift more than 32 bits of zeros into the * chain. This function is a convience wrapper around * cvmx_helper_qlm_jtag_shift() to shift more than 32 bits of * zeros at a time. * * @param qlm QLM to shift zeros into * @param bits */ void cvmx_helper_qlm_jtag_shift_zeros(int qlm, int bits); /** * Program the QLM JTAG chain into all lanes of the QLM. You must * have already shifted in the proper number of bits into the * JTAG chain. Updating invalid values can possibly cause chip damage. * * @param qlm QLM to program */ void cvmx_helper_qlm_jtag_update(int qlm); /** * Load the QLM JTAG chain with data from all lanes of the QLM. * * @param qlm QLM to program */ void cvmx_helper_qlm_jtag_capture(int qlm); #endif /* __CVMX_HELPER_JTAG_H__ */