blob: b2686d3cdb68f74479dfbb3f68ba1fa6dab5d262 [file] [log] [blame]
Chin Liang See63550242014-06-10 01:17:42 -05001/*
2 * Copyright (C) 2013 Altera Corporation <www.altera.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7#ifndef _SCAN_MANAGER_H_
8#define _SCAN_MANAGER_H_
9
10struct socfpga_scan_manager {
11 u32 stat;
12 u32 en;
13 u32 padding[2];
14 u32 fifo_single_byte;
15 u32 fifo_double_byte;
16 u32 fifo_quad_byte;
17};
18
19/*
20 * Shift count to get number of IO scan chain data in granularity
21 * of 128-bit ( N / 128 )
22 */
23#define IO_SCAN_CHAIN_128BIT_SHIFT 7
24
25/*
26 * Mask to get residual IO scan chain data in
27 * granularity of 128-bit ( N mod 128 )
28 */
29#define IO_SCAN_CHAIN_128BIT_MASK 0x7F
30
31/*
32 * Shift count to get number of IO scan chain
33 * data in granularity of 32-bit ( N / 32 )
34 */
35#define IO_SCAN_CHAIN_32BIT_SHIFT 5
36
37/*
38 * Mask to get residual IO scan chain data in
39 * granularity of 32-bit ( N mod 32 )
40 */
41#define IO_SCAN_CHAIN_32BIT_MASK 0x1F
42
43/* Byte mask */
44#define IO_SCAN_CHAIN_BYTE_MASK 0xFF
45
46/* 24-bits (3 bytes) IO scan chain payload definition */
47#define IO_SCAN_CHAIN_PAYLOAD_24BIT 24
48
49/*
50 * Maximum length of TDI_TDO packet payload is 128 bits,
51 * represented by (length - 1) in TDI_TDO header
52 */
53#define TDI_TDO_MAX_PAYLOAD 127
54
55/* TDI_TDO packet header for IO scan chain program */
56#define TDI_TDO_HEADER_FIRST_BYTE 0x80
57
58/* Position of second command byte for TDI_TDO packet */
59#define TDI_TDO_HEADER_SECOND_BYTE_SHIFT 8
60
61/*
62 * Maximum polling loop to wait for IO scan chain engine
63 * becomes idle to prevent infinite loop
64 */
65#define SCAN_MAX_DELAY 100
66
67#define SCANMGR_STAT_ACTIVE_GET(x) (((x) & 0x80000000) >> 31)
68#define SCANMGR_STAT_WFIFOCNT_GET(x) (((x) & 0x70000000) >> 28)
69
70/*
71 * Program HPS IO Scan Chain
72 * io_scan_chain_id - IO scan chain ID
73 * io_scan_chain_len_in_bits - IO scan chain length in bits
74 * iocsr_scan_chain - IO scan chain table
75 */
76uint32_t scan_mgr_io_scan_chain_prg(
77 uint32_t io_scan_chain_id,
78 uint32_t io_scan_chain_len_in_bits,
79 const uint32_t *iocsr_scan_chain);
80
81extern const uint32_t iocsr_scan_chain0_table[
82 ((CONFIG_HPS_IOCSR_SCANCHAIN0_LENGTH / 32) + 1)];
83extern const uint32_t iocsr_scan_chain1_table[
84 ((CONFIG_HPS_IOCSR_SCANCHAIN1_LENGTH / 32) + 1)];
85extern const uint32_t iocsr_scan_chain2_table[
86 ((CONFIG_HPS_IOCSR_SCANCHAIN2_LENGTH / 32) + 1)];
87extern const uint32_t iocsr_scan_chain3_table[
88 ((CONFIG_HPS_IOCSR_SCANCHAIN3_LENGTH / 32) + 1)];
89
Chin Liang See112cb0d2014-07-22 04:28:35 -050090int scan_mgr_configure_iocsr(void);
91
Chin Liang See63550242014-06-10 01:17:42 -050092#endif /* _SCAN_MANAGER_H_ */