forked from Minki/linux
cxgb4: update LE-TCAM collection for T6
For T6, clip table is separated from main TCAM. So, update LE-TCAM collection logic to collect clip table TCAM as well. IPv6 takes 4 entries in clip table TCAM compared to 2 entries in main TCAM. Also, in case of errors, keep LE-TCAM collected so far and set the status to partial dump. Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com> Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7e360d9d31
commit
8e725f7caa
@ -235,6 +235,9 @@ struct cudbg_vpd_data {
|
||||
};
|
||||
|
||||
#define CUDBG_MAX_TCAM_TID 0x800
|
||||
#define CUDBG_T6_CLIP 1536
|
||||
#define CUDBG_MAX_TID_COMP_EN 6144
|
||||
#define CUDBG_MAX_TID_COMP_DIS 3072
|
||||
|
||||
enum cudbg_le_entry_types {
|
||||
LE_ET_UNKNOWN = 0,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#define CUDBG_STATUS_NOT_IMPLEMENTED -28
|
||||
#define CUDBG_SYSTEM_ERROR -29
|
||||
#define CUDBG_STATUS_CCLK_NOT_DEFINED -32
|
||||
#define CUDBG_STATUS_PARTIAL_DATA -41
|
||||
|
||||
#define CUDBG_MAJOR_VERSION 1
|
||||
#define CUDBG_MINOR_VERSION 14
|
||||
|
@ -2366,8 +2366,11 @@ void cudbg_fill_le_tcam_info(struct adapter *padap,
|
||||
value = t4_read_reg(padap, LE_DB_ROUTING_TABLE_INDEX_A);
|
||||
tcam_region->routing_start = value;
|
||||
|
||||
/*Get clip table index */
|
||||
value = t4_read_reg(padap, LE_DB_CLIP_TABLE_INDEX_A);
|
||||
/* Get clip table index. For T6 there is separate CLIP TCAM */
|
||||
if (is_t6(padap->params.chip))
|
||||
value = t4_read_reg(padap, LE_DB_CLCAM_TID_BASE_A);
|
||||
else
|
||||
value = t4_read_reg(padap, LE_DB_CLIP_TABLE_INDEX_A);
|
||||
tcam_region->clip_start = value;
|
||||
|
||||
/* Get filter table index */
|
||||
@ -2392,8 +2395,16 @@ void cudbg_fill_le_tcam_info(struct adapter *padap,
|
||||
tcam_region->tid_hash_base;
|
||||
}
|
||||
} else { /* hash not enabled */
|
||||
tcam_region->max_tid = CUDBG_MAX_TCAM_TID;
|
||||
if (is_t6(padap->params.chip))
|
||||
tcam_region->max_tid = (value & ASLIPCOMPEN_F) ?
|
||||
CUDBG_MAX_TID_COMP_EN :
|
||||
CUDBG_MAX_TID_COMP_DIS;
|
||||
else
|
||||
tcam_region->max_tid = CUDBG_MAX_TCAM_TID;
|
||||
}
|
||||
|
||||
if (is_t6(padap->params.chip))
|
||||
tcam_region->max_tid += CUDBG_T6_CLIP;
|
||||
}
|
||||
|
||||
int cudbg_collect_le_tcam(struct cudbg_init *pdbg_init,
|
||||
@ -2423,18 +2434,31 @@ int cudbg_collect_le_tcam(struct cudbg_init *pdbg_init,
|
||||
for (i = 0; i < tcam_region.max_tid; ) {
|
||||
rc = cudbg_read_tid(pdbg_init, i, tid_data);
|
||||
if (rc) {
|
||||
cudbg_err->sys_err = rc;
|
||||
cudbg_put_buff(pdbg_init, &temp_buff);
|
||||
return rc;
|
||||
cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA;
|
||||
/* Update tcam header and exit */
|
||||
tcam_region.max_tid = i;
|
||||
memcpy(temp_buff.data, &tcam_region,
|
||||
sizeof(struct cudbg_tcam));
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* ipv6 takes two tids */
|
||||
cudbg_is_ipv6_entry(tid_data, tcam_region) ? i += 2 : i++;
|
||||
if (cudbg_is_ipv6_entry(tid_data, tcam_region)) {
|
||||
/* T6 CLIP TCAM: ipv6 takes 4 entries */
|
||||
if (is_t6(padap->params.chip) &&
|
||||
i >= tcam_region.clip_start &&
|
||||
i < tcam_region.clip_start + CUDBG_T6_CLIP)
|
||||
i += 4;
|
||||
else /* Main TCAM: ipv6 takes two tids */
|
||||
i += 2;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
|
||||
tid_data++;
|
||||
bytes += sizeof(struct cudbg_tid_data);
|
||||
}
|
||||
|
||||
out:
|
||||
return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
|
||||
}
|
||||
|
||||
|
@ -2999,6 +2999,7 @@
|
||||
#define LE_DB_HASH_TID_BASE_A 0x19c30
|
||||
#define LE_DB_HASH_TBL_BASE_ADDR_A 0x19c30
|
||||
#define LE_DB_INT_CAUSE_A 0x19c3c
|
||||
#define LE_DB_CLCAM_TID_BASE_A 0x19df4
|
||||
#define LE_DB_TID_HASHBASE_A 0x19df8
|
||||
#define T6_LE_DB_HASH_TID_BASE_A 0x19df8
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user