xref: /linux/drivers/net/ethernet/meta/fbnic/fbnic_csr.c (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
13d12862bSMohsin Bashir // SPDX-License-Identifier: GPL-2.0
23d12862bSMohsin Bashir /* Copyright (c) Meta Platforms, Inc. and affiliates. */
33d12862bSMohsin Bashir 
43d12862bSMohsin Bashir #include "fbnic.h"
53d12862bSMohsin Bashir 
63d12862bSMohsin Bashir #define FBNIC_BOUNDS(section) { \
73d12862bSMohsin Bashir 	.start = FBNIC_CSR_START_##section, \
83d12862bSMohsin Bashir 	.end = FBNIC_CSR_END_##section + 1, \
93d12862bSMohsin Bashir }
103d12862bSMohsin Bashir 
113d12862bSMohsin Bashir struct fbnic_csr_bounds {
123d12862bSMohsin Bashir 	u32	start;
133d12862bSMohsin Bashir 	u32	end;
143d12862bSMohsin Bashir };
153d12862bSMohsin Bashir 
163d12862bSMohsin Bashir static const struct fbnic_csr_bounds fbnic_csr_sects[] = {
173d12862bSMohsin Bashir 	FBNIC_BOUNDS(INTR),
183d12862bSMohsin Bashir 	FBNIC_BOUNDS(INTR_CQ),
193d12862bSMohsin Bashir 	FBNIC_BOUNDS(QM_TX),
203d12862bSMohsin Bashir 	FBNIC_BOUNDS(QM_RX),
213d12862bSMohsin Bashir 	FBNIC_BOUNDS(TCE),
223d12862bSMohsin Bashir 	FBNIC_BOUNDS(TCE_RAM),
233d12862bSMohsin Bashir 	FBNIC_BOUNDS(TMI),
243d12862bSMohsin Bashir 	FBNIC_BOUNDS(PTP),
253d12862bSMohsin Bashir 	FBNIC_BOUNDS(RXB),
263d12862bSMohsin Bashir 	FBNIC_BOUNDS(RPC),
273d12862bSMohsin Bashir 	FBNIC_BOUNDS(FAB),
283d12862bSMohsin Bashir 	FBNIC_BOUNDS(MASTER),
293d12862bSMohsin Bashir 	FBNIC_BOUNDS(PCS),
303d12862bSMohsin Bashir 	FBNIC_BOUNDS(RSFEC),
313d12862bSMohsin Bashir 	FBNIC_BOUNDS(MAC_MAC),
323d12862bSMohsin Bashir 	FBNIC_BOUNDS(SIG),
33*c6aa4e2cSMohsin Bashir 	FBNIC_BOUNDS(PCIE_SS_COMPHY),
343d12862bSMohsin Bashir 	FBNIC_BOUNDS(PUL_USER),
353d12862bSMohsin Bashir 	FBNIC_BOUNDS(QUEUE),
363d12862bSMohsin Bashir 	FBNIC_BOUNDS(RPC_RAM),
373d12862bSMohsin Bashir };
383d12862bSMohsin Bashir 
393d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_ACT_DW_PER_ENTRY			14
403d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_ACT_NUM_ENTRIES			64
413d12862bSMohsin Bashir 
423d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_MACDA_DW_PER_ENTRY		4
433d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES		32
443d12862bSMohsin Bashir 
453d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_OUTER_IPSRC_DW_PER_ENTRY		9
463d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_OUTER_IPSRC_NUM_ENTRIES		8
473d12862bSMohsin Bashir 
483d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_OUTER_IPDST_DW_PER_ENTRY		9
493d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_OUTER_IPDST_NUM_ENTRIES		8
503d12862bSMohsin Bashir 
513d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_IPSRC_DW_PER_ENTRY		9
523d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_IPSRC_NUM_ENTRIES		8
533d12862bSMohsin Bashir 
543d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_IPDST_DW_PER_ENTRY		9
553d12862bSMohsin Bashir #define FBNIC_RPC_TCAM_IPDST_NUM_ENTRIES		8
563d12862bSMohsin Bashir 
573d12862bSMohsin Bashir #define FBNIC_RPC_RSS_TBL_DW_PER_ENTRY			2
583d12862bSMohsin Bashir #define FBNIC_RPC_RSS_TBL_NUM_ENTRIES			256
593d12862bSMohsin Bashir 
fbnic_csr_get_regs_rpc_ram(struct fbnic_dev * fbd,u32 ** data_p)603d12862bSMohsin Bashir static void fbnic_csr_get_regs_rpc_ram(struct fbnic_dev *fbd, u32 **data_p)
613d12862bSMohsin Bashir {
623d12862bSMohsin Bashir 	u32 start = FBNIC_CSR_START_RPC_RAM;
633d12862bSMohsin Bashir 	u32 end = FBNIC_CSR_END_RPC_RAM;
643d12862bSMohsin Bashir 	u32 *data = *data_p;
653d12862bSMohsin Bashir 	u32 i, j;
663d12862bSMohsin Bashir 
673d12862bSMohsin Bashir 	*(data++) = start;
68a072ffd8SMohsin Bashir 	*(data++) = end;
693d12862bSMohsin Bashir 
703d12862bSMohsin Bashir 	/* FBNIC_RPC_TCAM_ACT */
713d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_TCAM_ACT_NUM_ENTRIES; i++) {
723d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_TCAM_ACT_DW_PER_ENTRY; j++)
733d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_ACT(i, j));
743d12862bSMohsin Bashir 	}
753d12862bSMohsin Bashir 
763d12862bSMohsin Bashir 	/* FBNIC_RPC_TCAM_MACDA */
773d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES; i++) {
783d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_TCAM_MACDA_DW_PER_ENTRY; j++)
793d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_MACDA(i, j));
803d12862bSMohsin Bashir 	}
813d12862bSMohsin Bashir 
823d12862bSMohsin Bashir 	/* FBNIC_RPC_TCAM_OUTER_IPSRC */
833d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_TCAM_OUTER_IPSRC_NUM_ENTRIES; i++) {
843d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_TCAM_OUTER_IPSRC_DW_PER_ENTRY; j++)
853d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_OUTER_IPSRC(i, j));
863d12862bSMohsin Bashir 	}
873d12862bSMohsin Bashir 
883d12862bSMohsin Bashir 	/* FBNIC_RPC_TCAM_OUTER_IPDST */
893d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_TCAM_OUTER_IPDST_NUM_ENTRIES; i++) {
903d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_TCAM_OUTER_IPDST_DW_PER_ENTRY; j++)
913d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_OUTER_IPDST(i, j));
923d12862bSMohsin Bashir 	}
933d12862bSMohsin Bashir 
943d12862bSMohsin Bashir 	/* FBNIC_RPC_TCAM_IPSRC */
953d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_TCAM_IPSRC_NUM_ENTRIES; i++) {
963d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_TCAM_IPSRC_DW_PER_ENTRY; j++)
973d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_IPSRC(i, j));
983d12862bSMohsin Bashir 	}
993d12862bSMohsin Bashir 
1003d12862bSMohsin Bashir 	/* FBNIC_RPC_TCAM_IPDST */
1013d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_TCAM_IPDST_NUM_ENTRIES; i++) {
1023d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_TCAM_IPDST_DW_PER_ENTRY; j++)
1033d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_IPDST(i, j));
1043d12862bSMohsin Bashir 	}
1053d12862bSMohsin Bashir 
1063d12862bSMohsin Bashir 	/* FBNIC_RPC_RSS_TBL */
1073d12862bSMohsin Bashir 	for (i = 0; i < FBNIC_RPC_RSS_TBL_NUM_ENTRIES; i++) {
1083d12862bSMohsin Bashir 		for (j = 0; j < FBNIC_RPC_RSS_TBL_DW_PER_ENTRY; j++)
1093d12862bSMohsin Bashir 			*(data++) = rd32(fbd, FBNIC_RPC_RSS_TBL(i, j));
1103d12862bSMohsin Bashir 	}
1113d12862bSMohsin Bashir 
1123d12862bSMohsin Bashir 	*data_p = data;
1133d12862bSMohsin Bashir }
1143d12862bSMohsin Bashir 
fbnic_csr_get_regs(struct fbnic_dev * fbd,u32 * data,u32 * regs_version)1153d12862bSMohsin Bashir void fbnic_csr_get_regs(struct fbnic_dev *fbd, u32 *data, u32 *regs_version)
1163d12862bSMohsin Bashir {
1173d12862bSMohsin Bashir 	const struct fbnic_csr_bounds *bound;
1183d12862bSMohsin Bashir 	u32 *start = data;
1193d12862bSMohsin Bashir 	int i, j;
1203d12862bSMohsin Bashir 
1213d12862bSMohsin Bashir 	*regs_version = 1u;
1223d12862bSMohsin Bashir 
1233d12862bSMohsin Bashir 	/* Skip RPC_RAM section which cannot be dumped linearly */
1243d12862bSMohsin Bashir 	for (i = 0, bound = fbnic_csr_sects;
1253d12862bSMohsin Bashir 	     i < ARRAY_SIZE(fbnic_csr_sects) - 1; i++, ++bound) {
1263d12862bSMohsin Bashir 		*(data++) = bound->start;
1273d12862bSMohsin Bashir 		*(data++) = bound->end - 1;
1283d12862bSMohsin Bashir 		for (j = bound->start; j < bound->end; j++)
1293d12862bSMohsin Bashir 			*(data++) = rd32(fbd, j);
1303d12862bSMohsin Bashir 	}
1313d12862bSMohsin Bashir 
1323d12862bSMohsin Bashir 	/* Dump the RPC_RAM as special case registers */
1333d12862bSMohsin Bashir 	fbnic_csr_get_regs_rpc_ram(fbd, &data);
1343d12862bSMohsin Bashir 
1353d12862bSMohsin Bashir 	WARN_ON(data - start != fbnic_csr_regs_len(fbd));
1363d12862bSMohsin Bashir }
1373d12862bSMohsin Bashir 
fbnic_csr_regs_len(struct fbnic_dev * fbd)1383d12862bSMohsin Bashir int fbnic_csr_regs_len(struct fbnic_dev *fbd)
1393d12862bSMohsin Bashir {
1403d12862bSMohsin Bashir 	int i, len = 0;
1413d12862bSMohsin Bashir 
1423d12862bSMohsin Bashir 	/* Dump includes start and end information of each section
1433d12862bSMohsin Bashir 	 * which results in an offset of 2
1443d12862bSMohsin Bashir 	 */
1453d12862bSMohsin Bashir 	for (i = 0; i < ARRAY_SIZE(fbnic_csr_sects); i++)
1463d12862bSMohsin Bashir 		len += fbnic_csr_sects[i].end - fbnic_csr_sects[i].start + 2;
1473d12862bSMohsin Bashir 
1483d12862bSMohsin Bashir 	return len;
1493d12862bSMohsin Bashir }
150