xref: /aosp_15_r20/external/ethtool/fsl_enetc.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /* Code to dump registers for the Freescale/NXP ENETC controller.
2*1b481fc3SMaciej Żenczykowski  *
3*1b481fc3SMaciej Żenczykowski  * Copyright 2022 NXP
4*1b481fc3SMaciej Żenczykowski  */
5*1b481fc3SMaciej Żenczykowski #include <stdio.h>
6*1b481fc3SMaciej Żenczykowski #include "internal.h"
7*1b481fc3SMaciej Żenczykowski 
8*1b481fc3SMaciej Żenczykowski #define BIT(x)			(1U << (x))
9*1b481fc3SMaciej Żenczykowski 
10*1b481fc3SMaciej Żenczykowski enum enetc_bdr_type {TX, RX};
11*1b481fc3SMaciej Żenczykowski #define ENETC_SIMR		0
12*1b481fc3SMaciej Żenczykowski #define ENETC_SIPMAR0		0x80
13*1b481fc3SMaciej Żenczykowski #define ENETC_SIPMAR1		0x84
14*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRMR		0x800
15*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRSR		0x804
16*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRBAR0	0x810
17*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRBAR1	0x814
18*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRPIR		0x818
19*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRCIR		0x81c
20*1b481fc3SMaciej Żenczykowski #define ENETC_SICBDRLENR	0x820
21*1b481fc3SMaciej Żenczykowski #define ENETC_SICAPR0		0x900
22*1b481fc3SMaciej Żenczykowski #define ENETC_SICAPR1		0x904
23*1b481fc3SMaciej Żenczykowski #define ENETC_SIUEFDCR		0xe28
24*1b481fc3SMaciej Żenczykowski 
25*1b481fc3SMaciej Żenczykowski #define ENETC_BDR_OFF(i)	((i) * 0x200)
26*1b481fc3SMaciej Żenczykowski #define ENETC_BDR(t, i, r)	(0x8000 + (t) * 0x100 + ENETC_BDR_OFF(i) + (r))
27*1b481fc3SMaciej Żenczykowski 
28*1b481fc3SMaciej Żenczykowski /* RX BDR reg offsets */
29*1b481fc3SMaciej Żenczykowski #define ENETC_RBMR		0
30*1b481fc3SMaciej Żenczykowski #define ENETC_RBSR		0x4
31*1b481fc3SMaciej Żenczykowski #define ENETC_RBBSR		0x8
32*1b481fc3SMaciej Żenczykowski #define ENETC_RBCIR		0xc
33*1b481fc3SMaciej Żenczykowski #define ENETC_RBBAR0		0x10
34*1b481fc3SMaciej Żenczykowski #define ENETC_RBBAR1		0x14
35*1b481fc3SMaciej Żenczykowski #define ENETC_RBPIR		0x18
36*1b481fc3SMaciej Żenczykowski #define ENETC_RBLENR		0x20
37*1b481fc3SMaciej Żenczykowski #define ENETC_RBIER		0xa0
38*1b481fc3SMaciej Żenczykowski #define ENETC_RBICR0		0xa8
39*1b481fc3SMaciej Żenczykowski #define ENETC_RBICR1		0xac
40*1b481fc3SMaciej Żenczykowski 
41*1b481fc3SMaciej Żenczykowski /* TX BDR reg offsets */
42*1b481fc3SMaciej Żenczykowski #define ENETC_TBMR		0
43*1b481fc3SMaciej Żenczykowski #define ENETC_TBSR		0x4
44*1b481fc3SMaciej Żenczykowski #define ENETC_TBBAR0		0x10
45*1b481fc3SMaciej Żenczykowski #define ENETC_TBBAR1		0x14
46*1b481fc3SMaciej Żenczykowski #define ENETC_TBPIR		0x18
47*1b481fc3SMaciej Żenczykowski #define ENETC_TBCIR		0x1c
48*1b481fc3SMaciej Żenczykowski #define ENETC_TBLENR		0x20
49*1b481fc3SMaciej Żenczykowski #define ENETC_TBIER		0xa0
50*1b481fc3SMaciej Żenczykowski #define ENETC_TBIDR		0xa4
51*1b481fc3SMaciej Żenczykowski #define ENETC_TBICR0		0xa8
52*1b481fc3SMaciej Żenczykowski #define ENETC_TBICR1		0xac
53*1b481fc3SMaciej Żenczykowski 
54*1b481fc3SMaciej Żenczykowski /* Port registers */
55*1b481fc3SMaciej Żenczykowski #define ENETC_PORT_BASE		0x10000
56*1b481fc3SMaciej Żenczykowski #define ENETC_PMR		ENETC_PORT_BASE + 0x0000
57*1b481fc3SMaciej Żenczykowski #define ENETC_PSR		ENETC_PORT_BASE + 0x0004
58*1b481fc3SMaciej Żenczykowski #define ENETC_PSIPMR		ENETC_PORT_BASE + 0x0018
59*1b481fc3SMaciej Żenczykowski #define ENETC_PSIPMAR0(n)	ENETC_PORT_BASE + (0x0100 + (n) * 0x8) /* n = SI index */
60*1b481fc3SMaciej Żenczykowski #define ENETC_PSIPMAR1(n)	ENETC_PORT_BASE + (0x0104 + (n) * 0x8)
61*1b481fc3SMaciej Żenczykowski #define ENETC_PTXMBAR		ENETC_PORT_BASE + 0x0608
62*1b481fc3SMaciej Żenczykowski #define ENETC_PCAPR0		ENETC_PORT_BASE + 0x0900
63*1b481fc3SMaciej Żenczykowski #define ENETC_PCAPR1		ENETC_PORT_BASE + 0x0904
64*1b481fc3SMaciej Żenczykowski #define ENETC_PSICFGR0(n)	ENETC_PORT_BASE + (0x0940 + (n) * 0xc)  /* n = SI index */
65*1b481fc3SMaciej Żenczykowski 
66*1b481fc3SMaciej Żenczykowski #define ENETC_PRFSCAPR		ENETC_PORT_BASE + 0x1804
67*1b481fc3SMaciej Żenczykowski #define ENETC_PTCMSDUR(n)	ENETC_PORT_BASE + (0x2020 + (n) * 4) /* n = TC index [0..7] */
68*1b481fc3SMaciej Żenczykowski 
69*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_CFG	ENETC_PORT_BASE + 0x8008
70*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_TX_EN		BIT(0)
71*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_RX_EN		BIT(1)
72*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_WAN		BIT(3)
73*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_PROMISC		BIT(4)
74*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_PAD		BIT(5)
75*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_CRC		BIT(6)
76*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_PAUSE_FWD		BIT(7)
77*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_PAUSE_IGN		BIT(8)
78*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_TX_ADDR_INS	BIT(9)
79*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_XGLP		BIT(10)
80*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_TXP		BIT(11)
81*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_SWR		BIT(12)
82*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_CNT_FRM_EN	BIT(13)
83*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_SEND_IDLE		BIT(16)
84*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_NO_LEN_CHK	BIT(17)
85*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_SFD		BIT(21)
86*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_TX_LOWP_ENA	BIT(23)
87*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_REG_LOWP_RXETY	BIT(24)
88*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_RXSTP		BIT(29)
89*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_CMD_MG		BIT(31)
90*1b481fc3SMaciej Żenczykowski 
91*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_MAXFRM	ENETC_PORT_BASE + 0x8014
92*1b481fc3SMaciej Żenczykowski #define ENETC_PM0_IF_MODE	ENETC_PORT_BASE + 0x8300
93*1b481fc3SMaciej Żenczykowski 
94*1b481fc3SMaciej Żenczykowski struct enetc_register {
95*1b481fc3SMaciej Żenczykowski 	u32 addr;
96*1b481fc3SMaciej Żenczykowski 	const char *name;
97*1b481fc3SMaciej Żenczykowski 	void (*decode)(u32 val, char *buf);
98*1b481fc3SMaciej Żenczykowski };
99*1b481fc3SMaciej Żenczykowski 
100*1b481fc3SMaciej Żenczykowski #define REG(_reg, _name)	{ .addr = (_reg), .name = (_name) }
101*1b481fc3SMaciej Żenczykowski 
102*1b481fc3SMaciej Żenczykowski #define REG_DEC(_reg, _name, _decode) \
103*1b481fc3SMaciej Żenczykowski 	{ .addr = (_reg), .name = (_name), .decode = (_decode) }
104*1b481fc3SMaciej Żenczykowski 
decode_cmd_cfg(u32 val,char * buf)105*1b481fc3SMaciej Żenczykowski static void decode_cmd_cfg(u32 val, char *buf)
106*1b481fc3SMaciej Żenczykowski {
107*1b481fc3SMaciej Żenczykowski 	sprintf(buf, "\tMG %d\n\tRXSTP %d\n\tREG_LOWP_RXETY %d\n"
108*1b481fc3SMaciej Żenczykowski 		"\tTX_LOWP_ENA %d\n\tSFD %d\n\tNO_LEN_CHK %d\n\tSEND_IDLE %d\n"
109*1b481fc3SMaciej Żenczykowski 		"\tCNT_FRM_EN %d\n\tSWR %d\n\tTXP %d\n\tXGLP %d\n"
110*1b481fc3SMaciej Żenczykowski 		"\tTX_ADDR_INS %d\n\tPAUSE_IGN %d\n\tPAUSE_FWD %d\n\tCRC %d\n"
111*1b481fc3SMaciej Żenczykowski 		"\tPAD %d\n\tPROMIS %d\n\tWAN %d\n\tRX_EN %d\n\tTX_EN %d\n",
112*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_MG),
113*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_RXSTP),
114*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_REG_LOWP_RXETY),
115*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_TX_LOWP_ENA),
116*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_SFD),
117*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_NO_LEN_CHK),
118*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_SEND_IDLE),
119*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_CNT_FRM_EN),
120*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_SWR),
121*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_TXP),
122*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_XGLP),
123*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_TX_ADDR_INS),
124*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_PAUSE_IGN),
125*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_PAUSE_FWD),
126*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_CRC),
127*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_PAD),
128*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_PROMISC),
129*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_WAN),
130*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_RX_EN),
131*1b481fc3SMaciej Żenczykowski 		!!(val & ENETC_PM0_CMD_TX_EN));
132*1b481fc3SMaciej Żenczykowski }
133*1b481fc3SMaciej Żenczykowski 
134*1b481fc3SMaciej Żenczykowski #define RXBDR_REGS(_i) \
135*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBMR), "RX BDR " #_i " mode register"), \
136*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBSR), "RX BDR " #_i " status register"), \
137*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBBSR), "RX BDR " #_i " buffer size register"), \
138*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBPIR), "RX BDR " #_i " producer index register"), \
139*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBCIR), "RX BDR " #_i " consumer index register"), \
140*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBBAR0), "RX BDR " #_i " base address register 0"), \
141*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBBAR1), "RX BDR " #_i " base address register 1"), \
142*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBLENR), "RX BDR " #_i " length register"), \
143*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBIER), "RX BDR " #_i " interrupt enable register"), \
144*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBICR0), "RX BDR " #_i " interrupt coalescing register 0"), \
145*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(RX, (_i), ENETC_RBICR1), "RX BDR " #_i " interrupt coalescing register 1")
146*1b481fc3SMaciej Żenczykowski 
147*1b481fc3SMaciej Żenczykowski #define TXBDR_REGS(_i) \
148*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBMR), "TX BDR " #_i " mode register"), \
149*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBSR), "TX BDR " #_i " status register"), \
150*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBBAR0), "TX BDR " #_i " base address register 0"), \
151*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBBAR1), "TX BDR " #_i " base address register 1"), \
152*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBPIR), "TX BDR " #_i " producer index register"), \
153*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBCIR), "TX BDR " #_i " consumer index register"), \
154*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBLENR), "TX BDR " #_i " length register"), \
155*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBIER), "TX BDR " #_i " interrupt enable register"), \
156*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBICR0), "TX BDR " #_i " interrupt coalescing register 0"), \
157*1b481fc3SMaciej Żenczykowski 	REG(ENETC_BDR(TX, (_i), ENETC_TBICR1), "TX BDR " #_i " interrupt coalescing register 1")
158*1b481fc3SMaciej Żenczykowski 
159*1b481fc3SMaciej Żenczykowski static const struct enetc_register known_enetc_regs[] = {
160*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SIMR, "SI mode register"),
161*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SIPMAR0, "SI primary MAC address register 0"),
162*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SIPMAR1, "SI primary MAC address register 1"),
163*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRMR, "SI control BDR mode register"),
164*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRSR, "SI control BDR status register"),
165*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRBAR0, "SI control BDR base address register 0"),
166*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRBAR1, "SI control BDR base address register 1"),
167*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRPIR, "SI control BDR producer index register"),
168*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRCIR, "SI control BDR consumer index register"),
169*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICBDRLENR, "SI control BDR length register"),
170*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICAPR0, "SI capability register 0"),
171*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SICAPR1, "SI capability register 1"),
172*1b481fc3SMaciej Żenczykowski 	REG(ENETC_SIUEFDCR, "SI uncorrectable error frame drop count register"),
173*1b481fc3SMaciej Żenczykowski 
174*1b481fc3SMaciej Żenczykowski 	TXBDR_REGS(0), TXBDR_REGS(1), TXBDR_REGS(2), TXBDR_REGS(3),
175*1b481fc3SMaciej Żenczykowski 	TXBDR_REGS(4), TXBDR_REGS(5), TXBDR_REGS(6), TXBDR_REGS(7),
176*1b481fc3SMaciej Żenczykowski 	TXBDR_REGS(8), TXBDR_REGS(9), TXBDR_REGS(10), TXBDR_REGS(11),
177*1b481fc3SMaciej Żenczykowski 	TXBDR_REGS(12), TXBDR_REGS(13), TXBDR_REGS(14), TXBDR_REGS(15),
178*1b481fc3SMaciej Żenczykowski 
179*1b481fc3SMaciej Żenczykowski 	RXBDR_REGS(0), RXBDR_REGS(1), RXBDR_REGS(2), RXBDR_REGS(3),
180*1b481fc3SMaciej Żenczykowski 	RXBDR_REGS(4), RXBDR_REGS(5), RXBDR_REGS(6), RXBDR_REGS(7),
181*1b481fc3SMaciej Żenczykowski 	RXBDR_REGS(8), RXBDR_REGS(9), RXBDR_REGS(10), RXBDR_REGS(11),
182*1b481fc3SMaciej Żenczykowski 	RXBDR_REGS(12), RXBDR_REGS(13), RXBDR_REGS(14), RXBDR_REGS(15),
183*1b481fc3SMaciej Żenczykowski 
184*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PMR, "Port mode register"),
185*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PSR, "Port status register"),
186*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PSIPMR, "Port SI promiscuous mode register"),
187*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PSIPMAR0(0), "Port SI0 primary MAC address register 0"),
188*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PSIPMAR1(0), "Port SI0 primary MAC address register 1"),
189*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PTXMBAR, "Port HTA transmit memory buffer allocation register"),
190*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PCAPR0, "Port capability register 0"),
191*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PCAPR1, "Port capability register 1"),
192*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PSICFGR0(0), "Port SI0 configuration register 0"),
193*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PRFSCAPR, "Port RFS capability register"),
194*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PTCMSDUR(0), "Port traffic class 0 maximum SDU register"),
195*1b481fc3SMaciej Żenczykowski 	REG_DEC(ENETC_PM0_CMD_CFG, "Port eMAC Command and Configuration Register",
196*1b481fc3SMaciej Żenczykowski 		decode_cmd_cfg),
197*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PM0_MAXFRM, "Port eMAC Maximum Frame Length Register"),
198*1b481fc3SMaciej Żenczykowski 	REG(ENETC_PM0_IF_MODE, "Port eMAC Interface Mode Control Register"),
199*1b481fc3SMaciej Żenczykowski };
200*1b481fc3SMaciej Żenczykowski 
decode_known_reg(const struct enetc_register * reg,u32 val)201*1b481fc3SMaciej Żenczykowski static void decode_known_reg(const struct enetc_register *reg, u32 val)
202*1b481fc3SMaciej Żenczykowski {
203*1b481fc3SMaciej Żenczykowski 	char buf[512];
204*1b481fc3SMaciej Żenczykowski 
205*1b481fc3SMaciej Żenczykowski 	reg->decode(val, buf);
206*1b481fc3SMaciej Żenczykowski 	fprintf(stdout, "%s: 0x%x\n%s", reg->name, val, buf);
207*1b481fc3SMaciej Żenczykowski }
208*1b481fc3SMaciej Żenczykowski 
dump_known_reg(const struct enetc_register * reg,u32 val)209*1b481fc3SMaciej Żenczykowski static void dump_known_reg(const struct enetc_register *reg, u32 val)
210*1b481fc3SMaciej Żenczykowski {
211*1b481fc3SMaciej Żenczykowski 	fprintf(stdout, "%s: 0x%x\n", reg->name, val);
212*1b481fc3SMaciej Żenczykowski }
213*1b481fc3SMaciej Żenczykowski 
dump_unknown_reg(u32 addr,u32 val)214*1b481fc3SMaciej Żenczykowski static void dump_unknown_reg(u32 addr, u32 val)
215*1b481fc3SMaciej Żenczykowski {
216*1b481fc3SMaciej Żenczykowski 	fprintf(stdout, "Reg 0x%x: 0x%x\n", addr, val);
217*1b481fc3SMaciej Żenczykowski }
218*1b481fc3SMaciej Żenczykowski 
dump_reg(u32 addr,u32 val)219*1b481fc3SMaciej Żenczykowski static void dump_reg(u32 addr, u32 val)
220*1b481fc3SMaciej Żenczykowski {
221*1b481fc3SMaciej Żenczykowski 	const struct enetc_register *reg;
222*1b481fc3SMaciej Żenczykowski 	u32 i;
223*1b481fc3SMaciej Żenczykowski 
224*1b481fc3SMaciej Żenczykowski 	for (i = 0; i < ARRAY_SIZE(known_enetc_regs); i++) {
225*1b481fc3SMaciej Żenczykowski 		reg = &known_enetc_regs[i];
226*1b481fc3SMaciej Żenczykowski 		if (reg->addr == addr) {
227*1b481fc3SMaciej Żenczykowski 			if (reg->decode)
228*1b481fc3SMaciej Żenczykowski 				decode_known_reg(reg, val);
229*1b481fc3SMaciej Żenczykowski 			else
230*1b481fc3SMaciej Żenczykowski 				dump_known_reg(reg, val);
231*1b481fc3SMaciej Żenczykowski 			return;
232*1b481fc3SMaciej Żenczykowski 		}
233*1b481fc3SMaciej Żenczykowski 	}
234*1b481fc3SMaciej Żenczykowski 
235*1b481fc3SMaciej Żenczykowski 	dump_unknown_reg(addr, val);
236*1b481fc3SMaciej Żenczykowski }
237*1b481fc3SMaciej Żenczykowski 
238*1b481fc3SMaciej Żenczykowski /* Registers are structured in an array of key/value u32 pairs.
239*1b481fc3SMaciej Żenczykowski  * Compare each key to our list of known registers, or print it
240*1b481fc3SMaciej Żenczykowski  * as a raw address otherwise.
241*1b481fc3SMaciej Żenczykowski  */
fsl_enetc_dump_regs(struct ethtool_drvinfo * info __maybe_unused,struct ethtool_regs * regs)242*1b481fc3SMaciej Żenczykowski int fsl_enetc_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
243*1b481fc3SMaciej Żenczykowski 			struct ethtool_regs *regs)
244*1b481fc3SMaciej Żenczykowski {
245*1b481fc3SMaciej Żenczykowski 	u32 *data = (u32 *)regs->data;
246*1b481fc3SMaciej Żenczykowski 	u32 len = regs->len;
247*1b481fc3SMaciej Żenczykowski 
248*1b481fc3SMaciej Żenczykowski 	if (len % 8) {
249*1b481fc3SMaciej Żenczykowski 		fprintf(stdout, "Expected length to be multiple of 8 bytes\n");
250*1b481fc3SMaciej Żenczykowski 		return -1;
251*1b481fc3SMaciej Żenczykowski 	}
252*1b481fc3SMaciej Żenczykowski 
253*1b481fc3SMaciej Żenczykowski 	while (len) {
254*1b481fc3SMaciej Żenczykowski 		dump_reg(data[0], data[1]);
255*1b481fc3SMaciej Żenczykowski 		data += 2; len -= 8;
256*1b481fc3SMaciej Żenczykowski 	}
257*1b481fc3SMaciej Żenczykowski 
258*1b481fc3SMaciej Żenczykowski 	return 0;
259*1b481fc3SMaciej Żenczykowski }
260