diff options
author | Haiying Wang <Haiying.Wang@freescale.com> | 2013-04-08 14:17:40 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-04-19 23:33:41 (GMT) |
commit | 2e25e4b034fb3b9c52905cb6051081109a2cc1a8 (patch) | |
tree | 0f344d75e6ef1fa1414782b7e3ca27b0cc3b922c /drivers/staging/fsl_qbman | |
parent | 108632df20890d69ed6ee8205ff32dd0c8815762 (diff) | |
download | linux-fsl-qoriq-2e25e4b034fb3b9c52905cb6051081109a2cc1a8.tar.xz |
fsl_qman: add debugfs support for query some ceetm features
Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>
Change-Id: I344f564af3cad4d46a1437559ece080dfef59cd2
Reviewed-on: http://git.am.freescale.net:8181/1639
Reviewed-by: Thorpe Geoff-R01361 <Geoff.Thorpe@freescale.com>
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/staging/fsl_qbman')
-rw-r--r-- | drivers/staging/fsl_qbman/qman_config.c | 13 | ||||
-rw-r--r-- | drivers/staging/fsl_qbman/qman_debugfs.c | 209 | ||||
-rw-r--r-- | drivers/staging/fsl_qbman/qman_private.h | 3 |
3 files changed, 218 insertions, 7 deletions
diff --git a/drivers/staging/fsl_qbman/qman_config.c b/drivers/staging/fsl_qbman/qman_config.c index 3a16e67..bfd4ee53 100644 --- a/drivers/staging/fsl_qbman/qman_config.c +++ b/drivers/staging/fsl_qbman/qman_config.c @@ -88,8 +88,9 @@ #define REG_REV3_QCSP_LIO_CFG(n) (0x1000 + ((n) * 0x10)) #define REG_REV3_QCSP_IO_CFG(n) (0x1004 + ((n) * 0x10)) #define REG_REV3_QCSP_DD_CFG(n) (0x100c + ((n) * 0x10)) -#define REG_CEETM_CFG_IDX 0x900 -#define REG_CEETM_CFG_PRES 0x904 +#define REG_CEETM_CFG_IDX 0x900 +#define REG_CEETM_CFG_PRES 0x904 +#define REG_CEETM_XSFDR_IN_USE 0x908 /* Assists for QMAN_MCR */ #define MCR_INIT_PFDR 0x01000000 @@ -975,6 +976,14 @@ int qman_sp_disable_ceetm_mode(enum qm_dc_portal portal, u16 sub_portal) return 0; } +int qman_ceetm_get_xsfdr(enum qm_dc_portal portal, unsigned int *num) +{ + if (!qman_have_ccsr()) + return -ENODEV; + *num = qm_in(CEETM_XSFDR_IN_USE); + return 0; +} + #ifdef CONFIG_SYSFS #define DRV_NAME "fsl-qman" diff --git a/drivers/staging/fsl_qbman/qman_debugfs.c b/drivers/staging/fsl_qbman/qman_debugfs.c index 8a17550..b3b19ac 100644 --- a/drivers/staging/fsl_qbman/qman_debugfs.c +++ b/drivers/staging/fsl_qbman/qman_debugfs.c @@ -761,6 +761,132 @@ static const struct file_operations query_congestion_fops = { }; /******************************************************************************* + * Query CCGR + ******************************************************************************/ +struct query_ccgr_s { + u32 ccgid; +}; +static struct query_ccgr_s query_ccgr_data; + +static int query_ccgr_show(struct seq_file *file, void *offset) +{ + int ret; + struct qm_mcr_ceetm_ccgr_query ccgr_query; + struct qm_mcc_ceetm_ccgr_query query_opts; + int i, j; + u32 mask; + + memset(&ccgr_query, 0, sizeof(struct qm_mcr_ceetm_ccgr_query)); + memset(&query_opts, 0, sizeof(struct qm_mcc_ceetm_ccgr_query)); + + if ((qman_ip_rev & 0xFF00) < QMAN_REV30) + return -EINVAL; + + seq_printf(file, "Query CCGID %x\n", query_ccgr_data.ccgid); + query_opts.dcpid = ((query_ccgr_data.ccgid & 0xFF000000) >> 24); + query_opts.ccgrid = query_ccgr_data.ccgid & 0x000001FF; + ret = qman_ceetm_query_ccgr(&query_opts, &ccgr_query); + if (ret) + return ret; + seq_printf(file, "Query CCGR id %x in DCP %d\n", query_opts.ccgrid, + query_opts.dcpid); + seq_printf(file, " wr_parm_g MA: %u, Mn: %u, SA: %u, Sn: %u, Pn: %u\n", + ccgr_query.cm_query.wr_parm_g.MA, + ccgr_query.cm_query.wr_parm_g.Mn, + ccgr_query.cm_query.wr_parm_g.SA, + ccgr_query.cm_query.wr_parm_g.Sn, + ccgr_query.cm_query.wr_parm_g.Pn); + + seq_printf(file, " wr_parm_y MA: %u, Mn: %u, SA: %u, Sn: %u, Pn: %u\n", + ccgr_query.cm_query.wr_parm_y.MA, + ccgr_query.cm_query.wr_parm_y.Mn, + ccgr_query.cm_query.wr_parm_y.SA, + ccgr_query.cm_query.wr_parm_y.Sn, + ccgr_query.cm_query.wr_parm_y.Pn); + + seq_printf(file, " wr_parm_r MA: %u, Mn: %u, SA: %u, Sn: %u, Pn: %u\n", + ccgr_query.cm_query.wr_parm_r.MA, + ccgr_query.cm_query.wr_parm_r.Mn, + ccgr_query.cm_query.wr_parm_r.SA, + ccgr_query.cm_query.wr_parm_r.Sn, + ccgr_query.cm_query.wr_parm_r.Pn); + + seq_printf(file, " wr_en_g: %u, wr_en_y: %u, we_en_r: %u\n", + ((ccgr_query.cm_query.ctl >> 6) & 0x1), + ((ccgr_query.cm_query.ctl >> 5 & 0x1)), + ((ccgr_query.cm_query.ctl >> 4) & 0x1)); + + seq_printf(file, " cscn_en: %u\n", ((ccgr_query.cm_query.ctl >> 1) & + 0x1)); + seq_printf(file, " cscn_targ_dcp:\n"); + mask = 0x80000000; + for (i = 0; i < 32; i++) { + if (ccgr_query.cm_query.cscn_targ_dcp & mask) + seq_printf(file, " send CSCN to dcp %u\n", (31 - i)); + mask >>= 1; + } + + seq_printf(file, " cscn_targ_swp:\n"); + for (i = 0; i < 4; i++) { + mask = 0x80000000; + for (j = 0; j < 32; j++) { + if (ccgr_query.cm_query.cscn_targ_swp[i] & mask) + seq_printf(file, " send CSCN to swp" + "%u\n", (127 - (i * 32) - j)); + mask >>= 1; + } + } + + seq_printf(file, " td_en: %u\n", (ccgr_query.cm_query.ctl >> 3)); + + seq_printf(file, " cs_thresh_in_TA: %u, cs_thresh_in_Tn: %u\n", + ccgr_query.cm_query.cs_thres.TA, + ccgr_query.cm_query.cs_thres.Tn); + + seq_printf(file, " cs_thresh_out_TA: %u, cs_thresh_out_Tn: %u\n", + ccgr_query.cm_query.cs_thres_x.TA, + ccgr_query.cm_query.cs_thres_x.Tn); + + seq_printf(file, " td_thresh_TA: %u, td_thresh_Tn: %u\n", + ccgr_query.cm_query.td_thres.TA, + ccgr_query.cm_query.td_thres.Tn); + + seq_printf(file, " mode: %s\n", + ((ccgr_query.cm_query.ctl & 0x1) & + QMAN_CGR_MODE_FRAME) ? + "frame count" : "byte count"); + seq_printf(file, " i_cnt: %llu\n", (u64)ccgr_query.cm_query.i_cnt); + seq_printf(file, " a_cnt: %llu\n", (u64)ccgr_query.cm_query.a_cnt); + + return 0; +} + +static int query_ccgr_open(struct inode *inode, struct file *file) +{ + return single_open(file, query_ccgr_show, NULL); +} + +static ssize_t query_ccgr_write(struct file *f, const char __user *buf, + size_t count, loff_t *off) +{ + int ret; + unsigned long val; + + ret = user_input_convert(buf, count, &val); + if (ret) + return ret; + query_ccgr_data.ccgid = val; + return count; +} + +static const struct file_operations query_ccgr_fops = { + .owner = THIS_MODULE, + .open = query_ccgr_open, + .read = seq_read, + .write = query_ccgr_write, + .release = single_release, +}; +/******************************************************************************* * QMan register ******************************************************************************/ struct qman_register_s { @@ -1185,12 +1311,21 @@ static int query_cq_fields_show(struct seq_file *file, void *offset) int ret; struct qm_mcr_ceetm_cq_query query_result; unsigned int cqid; + unsigned int portal; - cqid = query_cq_fields_data.cqid; - ret = qman_ceetm_query_cq(cqid, 0, &query_result); + if ((qman_ip_rev & 0xFF00) < QMAN_REV30) + return -EINVAL; + + cqid = query_cq_fields_data.cqid & 0x00FFFFFF; + portal = query_cq_fields_data.cqid >> 24; + if (portal > qm_dc_portal_fman1) + return -EINVAL; + + ret = qman_ceetm_query_cq(cqid, portal, &query_result); if (ret) return ret; - seq_printf(file, "Query CQ Fields Result cqid 0x%x\n", cqid); + seq_printf(file, "Query CQ Fields Result cqid 0x%x on DCP %d\n", + cqid, portal); seq_printf(file, " ccgid: %u\n", query_result.ccgid); seq_printf(file, " state: %u\n", query_result.state); seq_printf(file, " pfdr_hptr: %u\n", query_result.pfdr_hptr); @@ -1223,8 +1358,6 @@ static ssize_t query_cq_fields_write(struct file *f, ret = user_input_convert(buf, count, &val); if (ret) return ret; - if (val > MAX_FQID) - return -EINVAL; query_cq_fields_data.cqid = (u32)val; return count; } @@ -1236,6 +1369,68 @@ static const struct file_operations query_cq_fields_fops = { .write = query_cq_fields_write, .release = single_release, }; + +/******************************************************************************* + * READ CEETM_XSFDR_IN_USE + ******************************************************************************/ +struct query_ceetm_xsfdr_data_s { + enum qm_dc_portal dcp_portal; +}; + +static struct query_ceetm_xsfdr_data_s query_ceetm_xsfdr_data; + +static int query_ceetm_xsfdr_show(struct seq_file *file, void *offset) +{ + int ret; + unsigned int xsfdr_in_use; + enum qm_dc_portal portal; + + + if ((qman_ip_rev & 0xFF00) < QMAN_REV31) + return -EINVAL; + + portal = query_ceetm_xsfdr_data.dcp_portal; + ret = qman_ceetm_get_xsfdr(portal, &xsfdr_in_use); + if (ret) { + seq_printf(file, "Read CEETM_XSFDR_IN_USE on DCP %d failed\n", + portal); + return ret; + } + + seq_printf(file, "DCP%d: CEETM_XSFDR_IN_USE number is %u\n", portal, + (xsfdr_in_use & 0x1FF)); + return 0; +} + +static int query_ceetm_xsfdr_open(struct inode *inode, + struct file *file) +{ + return single_open(file, query_ceetm_xsfdr_show, NULL); +} + +static ssize_t query_ceetm_xsfdr_write(struct file *f, + const char __user *buf, size_t count, loff_t *off) +{ + int ret; + unsigned long val; + + ret = user_input_convert(buf, count, &val); + if (ret) + return ret; + if (val > qm_dc_portal_fman1) + return -EINVAL; + query_ceetm_xsfdr_data.dcp_portal = (u32)val; + return count; +} + +static const struct file_operations query_ceetm_xsfdr_fops = { + .owner = THIS_MODULE, + .open = query_ceetm_xsfdr_open, + .read = seq_read, + .write = query_ceetm_xsfdr_write, + .release = single_release, +}; + /* helper macros used in qman_debugfs_module_init */ #define QMAN_DBGFS_ENTRY(name, mode, parent, data, fops) \ do { \ @@ -1313,6 +1508,8 @@ static int __init qman_debugfs_module_init(void) QMAN_DBGFS_ENTRY_ROOT("testwrite_cgr_ibcnt", S_IRUGO | S_IWUGO, NULL, &teswrite_cgr_ibcnt_fops); + QMAN_DBGFS_ENTRY_ROOT("query_ceetm_ccgr", S_IRUGO | S_IWUGO, + &query_ccgr_data, &query_ccgr_fops); /* Create files with fqd_root as parent */ QMAN_DBGFS_ENTRY_FQDROOT("stateoos", S_IRUGO, @@ -1339,6 +1536,8 @@ static int __init qman_debugfs_module_init(void) &qman_fqd_state_fops); QMAN_DBGFS_ENTRY_ROOT("query_cq_fields", S_IRUGO | S_IWUGO, &query_cq_fields_data, &query_cq_fields_fops); + QMAN_DBGFS_ENTRY_ROOT("query_ceetm_xsfdr_in_use", S_IRUGO | S_IWUGO, + &query_ceetm_xsfdr_data, &query_ceetm_xsfdr_fops); QMAN_DBGFS_ENTRY_FQDSTATE("cge_enable", 17); diff --git a/drivers/staging/fsl_qbman/qman_private.h b/drivers/staging/fsl_qbman/qman_private.h index ff18462..e43b459 100644 --- a/drivers/staging/fsl_qbman/qman_private.h +++ b/drivers/staging/fsl_qbman/qman_private.h @@ -372,3 +372,6 @@ int qman_ceetm_set_prescaler(enum qm_dc_portal portal); int qman_ceetm_get_prescaler(u16 *pres); int qman_ceetm_query_cq(unsigned int cqid, unsigned int dcpid, struct qm_mcr_ceetm_cq_query *cq_query); +int qman_ceetm_query_ccgr(struct qm_mcc_ceetm_ccgr_query *ccgr_query, + struct qm_mcr_ceetm_ccgr_query *response); +int qman_ceetm_get_xsfdr(enum qm_dc_portal portal, unsigned int *num); |