Skip to content

Commit db3397b

Browse files
committed
Merge branch 'cxgb4-next'
Hariprasad Shenai says: ==================== cxgb4/cxgb4vf: Adds support for Chelsio T6 adapter This patch series adds the following: Adds NIC driver support for T6 adapter Adds vNIC driver support for T6 adapter This patch series has been created against net-next tree and includes patches on cxgb4 and cxgb4vf driver. We have included all the maintainers of respective drivers. Kindly review the change and let us know in case of any review comments. Thanks V2: Fixed compilation issue, when CHELSIO_T4_FCOE is set ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents d895112 + 41fc2e4 commit db3397b

File tree

13 files changed

+932
-172
lines changed

13 files changed

+932
-172
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ struct sge_params {
224224
};
225225

226226
struct tp_params {
227-
unsigned int ntxchan; /* # of Tx channels */
228227
unsigned int tre; /* log2 of core clocks per TP tick */
229228
unsigned int la_mask; /* what events are recorded by TP LA */
230229
unsigned short tx_modq_map; /* TX modulation scheduler queue to */
@@ -273,6 +272,7 @@ struct pci_params {
273272

274273
#define CHELSIO_T4 0x4
275274
#define CHELSIO_T5 0x5
275+
#define CHELSIO_T6 0x6
276276

277277
enum chip_type {
278278
T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
@@ -284,6 +284,10 @@ enum chip_type {
284284
T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1),
285285
T5_FIRST_REV = T5_A0,
286286
T5_LAST_REV = T5_A1,
287+
288+
T6_A0 = CHELSIO_CHIP_CODE(CHELSIO_T6, 0),
289+
T6_FIRST_REV = T6_A0,
290+
T6_LAST_REV = T6_A0,
287291
};
288292

289293
struct devlog_params {
@@ -292,6 +296,15 @@ struct devlog_params {
292296
u32 size; /* size of log */
293297
};
294298

299+
/* Stores chip specific parameters */
300+
struct arch_specific_params {
301+
u8 nchan;
302+
u16 mps_rplc_size;
303+
u16 vfcount;
304+
u32 sge_fl_db;
305+
u16 mps_tcam_size;
306+
};
307+
295308
struct adapter_params {
296309
struct sge_params sge;
297310
struct tp_params tp;
@@ -317,6 +330,7 @@ struct adapter_params {
317330
unsigned char nports; /* # of ethernet ports */
318331
unsigned char portvec;
319332
enum chip_type chip; /* chip code */
333+
struct arch_specific_params arch; /* chip specific params */
320334
unsigned char offload;
321335

322336
unsigned char bypass;
@@ -850,6 +864,11 @@ enum {
850864
VLAN_REWRITE
851865
};
852866

867+
static inline int is_t6(enum chip_type chip)
868+
{
869+
return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T6;
870+
}
871+
853872
static inline int is_t5(enum chip_type chip)
854873
{
855874
return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T5;

drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c

Lines changed: 135 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,72 +1084,159 @@ static inline void tcamxy2valmask(u64 x, u64 y, u8 *addr, u64 *mask)
10841084

10851085
static int mps_tcam_show(struct seq_file *seq, void *v)
10861086
{
1087-
if (v == SEQ_START_TOKEN)
1088-
seq_puts(seq, "Idx Ethernet address Mask Vld Ports PF"
1089-
" VF Replication "
1090-
"P0 P1 P2 P3 ML\n");
1091-
else {
1087+
struct adapter *adap = seq->private;
1088+
unsigned int chip_ver = CHELSIO_CHIP_VERSION(adap->params.chip);
1089+
1090+
if (v == SEQ_START_TOKEN) {
1091+
if (adap->params.arch.mps_rplc_size > 128)
1092+
seq_puts(seq, "Idx Ethernet address Mask "
1093+
"Vld Ports PF VF "
1094+
"Replication "
1095+
" P0 P1 P2 P3 ML\n");
1096+
else
1097+
seq_puts(seq, "Idx Ethernet address Mask "
1098+
"Vld Ports PF VF Replication"
1099+
" P0 P1 P2 P3 ML\n");
1100+
} else {
10921101
u64 mask;
10931102
u8 addr[ETH_ALEN];
1094-
struct adapter *adap = seq->private;
1103+
bool replicate;
10951104
unsigned int idx = (uintptr_t)v - 2;
1096-
u64 tcamy = t4_read_reg64(adap, MPS_CLS_TCAM_Y_L(idx));
1097-
u64 tcamx = t4_read_reg64(adap, MPS_CLS_TCAM_X_L(idx));
1098-
u32 cls_lo = t4_read_reg(adap, MPS_CLS_SRAM_L(idx));
1099-
u32 cls_hi = t4_read_reg(adap, MPS_CLS_SRAM_H(idx));
1100-
u32 rplc[4] = {0, 0, 0, 0};
1105+
u64 tcamy, tcamx, val;
1106+
u32 cls_lo, cls_hi, ctl;
1107+
u32 rplc[8] = {0};
1108+
1109+
if (chip_ver > CHELSIO_T5) {
1110+
/* CtlCmdType - 0: Read, 1: Write
1111+
* CtlTcamSel - 0: TCAM0, 1: TCAM1
1112+
* CtlXYBitSel- 0: Y bit, 1: X bit
1113+
*/
1114+
1115+
/* Read tcamy */
1116+
ctl = CTLCMDTYPE_V(0) | CTLXYBITSEL_V(0);
1117+
if (idx < 256)
1118+
ctl |= CTLTCAMINDEX_V(idx) | CTLTCAMSEL_V(0);
1119+
else
1120+
ctl |= CTLTCAMINDEX_V(idx - 256) |
1121+
CTLTCAMSEL_V(1);
1122+
t4_write_reg(adap, MPS_CLS_TCAM_DATA2_CTL_A, ctl);
1123+
val = t4_read_reg(adap, MPS_CLS_TCAM_DATA1_A);
1124+
tcamy = DMACH_G(val) << 32;
1125+
tcamy |= t4_read_reg(adap, MPS_CLS_TCAM_DATA0_A);
1126+
1127+
/* Read tcamx. Change the control param */
1128+
ctl |= CTLXYBITSEL_V(1);
1129+
t4_write_reg(adap, MPS_CLS_TCAM_DATA2_CTL_A, ctl);
1130+
val = t4_read_reg(adap, MPS_CLS_TCAM_DATA1_A);
1131+
tcamx = DMACH_G(val) << 32;
1132+
tcamx |= t4_read_reg(adap, MPS_CLS_TCAM_DATA0_A);
1133+
} else {
1134+
tcamy = t4_read_reg64(adap, MPS_CLS_TCAM_Y_L(idx));
1135+
tcamx = t4_read_reg64(adap, MPS_CLS_TCAM_X_L(idx));
1136+
}
1137+
1138+
cls_lo = t4_read_reg(adap, MPS_CLS_SRAM_L(idx));
1139+
cls_hi = t4_read_reg(adap, MPS_CLS_SRAM_H(idx));
11011140

11021141
if (tcamx & tcamy) {
11031142
seq_printf(seq, "%3u -\n", idx);
11041143
goto out;
11051144
}
11061145

1107-
if (cls_lo & REPLICATE_F) {
1146+
rplc[0] = rplc[1] = rplc[2] = rplc[3] = 0;
1147+
if (chip_ver > CHELSIO_T5)
1148+
replicate = (cls_lo & T6_REPLICATE_F);
1149+
else
1150+
replicate = (cls_lo & REPLICATE_F);
1151+
1152+
if (replicate) {
11081153
struct fw_ldst_cmd ldst_cmd;
11091154
int ret;
1155+
struct fw_ldst_mps_rplc mps_rplc;
1156+
u32 ldst_addrspc;
11101157

11111158
memset(&ldst_cmd, 0, sizeof(ldst_cmd));
1159+
ldst_addrspc =
1160+
FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MPS);
11121161
ldst_cmd.op_to_addrspace =
11131162
htonl(FW_CMD_OP_V(FW_LDST_CMD) |
11141163
FW_CMD_REQUEST_F |
11151164
FW_CMD_READ_F |
1116-
FW_LDST_CMD_ADDRSPACE_V(
1117-
FW_LDST_ADDRSPC_MPS));
1165+
ldst_addrspc);
11181166
ldst_cmd.cycles_to_len16 = htonl(FW_LEN16(ldst_cmd));
1119-
ldst_cmd.u.mps.fid_ctl =
1167+
ldst_cmd.u.mps.rplc.fid_idx =
11201168
htons(FW_LDST_CMD_FID_V(FW_LDST_MPS_RPLC) |
1121-
FW_LDST_CMD_CTL_V(idx));
1169+
FW_LDST_CMD_IDX_V(idx));
11221170
ret = t4_wr_mbox(adap, adap->mbox, &ldst_cmd,
11231171
sizeof(ldst_cmd), &ldst_cmd);
11241172
if (ret)
11251173
dev_warn(adap->pdev_dev, "Can't read MPS "
11261174
"replication map for idx %d: %d\n",
11271175
idx, -ret);
11281176
else {
1129-
rplc[0] = ntohl(ldst_cmd.u.mps.rplc31_0);
1130-
rplc[1] = ntohl(ldst_cmd.u.mps.rplc63_32);
1131-
rplc[2] = ntohl(ldst_cmd.u.mps.rplc95_64);
1132-
rplc[3] = ntohl(ldst_cmd.u.mps.rplc127_96);
1177+
mps_rplc = ldst_cmd.u.mps.rplc;
1178+
rplc[0] = ntohl(mps_rplc.rplc31_0);
1179+
rplc[1] = ntohl(mps_rplc.rplc63_32);
1180+
rplc[2] = ntohl(mps_rplc.rplc95_64);
1181+
rplc[3] = ntohl(mps_rplc.rplc127_96);
1182+
if (adap->params.arch.mps_rplc_size > 128) {
1183+
rplc[4] = ntohl(mps_rplc.rplc159_128);
1184+
rplc[5] = ntohl(mps_rplc.rplc191_160);
1185+
rplc[6] = ntohl(mps_rplc.rplc223_192);
1186+
rplc[7] = ntohl(mps_rplc.rplc255_224);
1187+
}
11331188
}
11341189
}
11351190

11361191
tcamxy2valmask(tcamx, tcamy, addr, &mask);
1137-
seq_printf(seq, "%3u %02x:%02x:%02x:%02x:%02x:%02x %012llx"
1138-
"%3c %#x%4u%4d",
1139-
idx, addr[0], addr[1], addr[2], addr[3], addr[4],
1140-
addr[5], (unsigned long long)mask,
1141-
(cls_lo & SRAM_VLD_F) ? 'Y' : 'N', PORTMAP_G(cls_hi),
1142-
PF_G(cls_lo),
1143-
(cls_lo & VF_VALID_F) ? VF_G(cls_lo) : -1);
1144-
if (cls_lo & REPLICATE_F)
1145-
seq_printf(seq, " %08x %08x %08x %08x",
1146-
rplc[3], rplc[2], rplc[1], rplc[0]);
1192+
if (chip_ver > CHELSIO_T5)
1193+
seq_printf(seq, "%3u %02x:%02x:%02x:%02x:%02x:%02x "
1194+
"%012llx%3c %#x%4u%4d",
1195+
idx, addr[0], addr[1], addr[2], addr[3],
1196+
addr[4], addr[5], (unsigned long long)mask,
1197+
(cls_lo & T6_SRAM_VLD_F) ? 'Y' : 'N',
1198+
PORTMAP_G(cls_hi),
1199+
T6_PF_G(cls_lo),
1200+
(cls_lo & T6_VF_VALID_F) ?
1201+
T6_VF_G(cls_lo) : -1);
11471202
else
1148-
seq_printf(seq, "%36c", ' ');
1149-
seq_printf(seq, "%4u%3u%3u%3u %#x\n",
1150-
SRAM_PRIO0_G(cls_lo), SRAM_PRIO1_G(cls_lo),
1151-
SRAM_PRIO2_G(cls_lo), SRAM_PRIO3_G(cls_lo),
1152-
(cls_lo >> MULTILISTEN0_S) & 0xf);
1203+
seq_printf(seq, "%3u %02x:%02x:%02x:%02x:%02x:%02x "
1204+
"%012llx%3c %#x%4u%4d",
1205+
idx, addr[0], addr[1], addr[2], addr[3],
1206+
addr[4], addr[5], (unsigned long long)mask,
1207+
(cls_lo & SRAM_VLD_F) ? 'Y' : 'N',
1208+
PORTMAP_G(cls_hi),
1209+
PF_G(cls_lo),
1210+
(cls_lo & VF_VALID_F) ? VF_G(cls_lo) : -1);
1211+
1212+
if (replicate) {
1213+
if (adap->params.arch.mps_rplc_size > 128)
1214+
seq_printf(seq, " %08x %08x %08x %08x "
1215+
"%08x %08x %08x %08x",
1216+
rplc[7], rplc[6], rplc[5], rplc[4],
1217+
rplc[3], rplc[2], rplc[1], rplc[0]);
1218+
else
1219+
seq_printf(seq, " %08x %08x %08x %08x",
1220+
rplc[3], rplc[2], rplc[1], rplc[0]);
1221+
} else {
1222+
if (adap->params.arch.mps_rplc_size > 128)
1223+
seq_printf(seq, "%72c", ' ');
1224+
else
1225+
seq_printf(seq, "%36c", ' ');
1226+
}
1227+
1228+
if (chip_ver > CHELSIO_T5)
1229+
seq_printf(seq, "%4u%3u%3u%3u %#x\n",
1230+
T6_SRAM_PRIO0_G(cls_lo),
1231+
T6_SRAM_PRIO1_G(cls_lo),
1232+
T6_SRAM_PRIO2_G(cls_lo),
1233+
T6_SRAM_PRIO3_G(cls_lo),
1234+
(cls_lo >> T6_MULTILISTEN0_S) & 0xf);
1235+
else
1236+
seq_printf(seq, "%4u%3u%3u%3u %#x\n",
1237+
SRAM_PRIO0_G(cls_lo), SRAM_PRIO1_G(cls_lo),
1238+
SRAM_PRIO2_G(cls_lo), SRAM_PRIO3_G(cls_lo),
1239+
(cls_lo >> MULTILISTEN0_S) & 0xf);
11531240
}
11541241
out: return 0;
11551242
}
@@ -1416,6 +1503,9 @@ static int rss_config_show(struct seq_file *seq, void *v)
14161503
seq_printf(seq, " HashDelay: %3d\n", HASHDELAY_G(rssconf));
14171504
if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5)
14181505
seq_printf(seq, " VfWrAddr: %3d\n", VFWRADDR_G(rssconf));
1506+
else
1507+
seq_printf(seq, " VfWrAddr: %3d\n",
1508+
T6_VFWRADDR_G(rssconf));
14191509
seq_printf(seq, " KeyMode: %s\n", keymode[KEYMODE_G(rssconf)]);
14201510
seq_printf(seq, " VfWrEn: %3s\n", yesno(rssconf & VFWREN_F));
14211511
seq_printf(seq, " KeyWrEn: %3s\n", yesno(rssconf & KEYWREN_F));
@@ -1634,14 +1724,14 @@ static int rss_vf_config_open(struct inode *inode, struct file *file)
16341724
struct adapter *adapter = inode->i_private;
16351725
struct seq_tab *p;
16361726
struct rss_vf_conf *vfconf;
1637-
int vf;
1727+
int vf, vfcount = adapter->params.arch.vfcount;
16381728

1639-
p = seq_open_tab(file, 128, sizeof(*vfconf), 1, rss_vf_config_show);
1729+
p = seq_open_tab(file, vfcount, sizeof(*vfconf), 1, rss_vf_config_show);
16401730
if (!p)
16411731
return -ENOMEM;
16421732

16431733
vfconf = (struct rss_vf_conf *)p->data;
1644-
for (vf = 0; vf < 128; vf++) {
1734+
for (vf = 0; vf < vfcount; vf++) {
16451735
t4_read_rss_vf_config(adapter, vf, &vfconf[vf].rss_vf_vfl,
16461736
&vfconf[vf].rss_vf_vfh);
16471737
}
@@ -2033,7 +2123,7 @@ void add_debugfs_files(struct adapter *adap,
20332123
int t4_setup_debugfs(struct adapter *adap)
20342124
{
20352125
int i;
2036-
u32 size;
2126+
u32 size = 0;
20372127
struct dentry *de;
20382128

20392129
static struct t4_debugfs_entry t4_debugfs_files[] = {
@@ -2104,12 +2194,7 @@ int t4_setup_debugfs(struct adapter *adap)
21042194
size = t4_read_reg(adap, MA_EDRAM1_BAR_A);
21052195
add_debugfs_mem(adap, "edc1", MEM_EDC1, EDRAM1_SIZE_G(size));
21062196
}
2107-
if (is_t4(adap->params.chip)) {
2108-
size = t4_read_reg(adap, MA_EXT_MEMORY_BAR_A);
2109-
if (i & EXT_MEM_ENABLE_F)
2110-
add_debugfs_mem(adap, "mc", MEM_MC,
2111-
EXT_MEM_SIZE_G(size));
2112-
} else {
2197+
if (is_t5(adap->params.chip)) {
21132198
if (i & EXT_MEM0_ENABLE_F) {
21142199
size = t4_read_reg(adap, MA_EXT_MEMORY0_BAR_A);
21152200
add_debugfs_mem(adap, "mc0", MEM_MC0,
@@ -2120,6 +2205,11 @@ int t4_setup_debugfs(struct adapter *adap)
21202205
add_debugfs_mem(adap, "mc1", MEM_MC1,
21212206
EXT_MEM1_SIZE_G(size));
21222207
}
2208+
} else {
2209+
if (i & EXT_MEM_ENABLE_F)
2210+
size = t4_read_reg(adap, MA_EXT_MEMORY_BAR_A);
2211+
add_debugfs_mem(adap, "mc", MEM_MC,
2212+
EXT_MEM_SIZE_G(size));
21232213
}
21242214

21252215
de = debugfs_create_file_size("flash", S_IRUSR, adap->debugfs_root, adap,

0 commit comments

Comments
 (0)