cgr
opts.fqd.cgid = qipriv.cgr.cgrid;
qman_delete_cgr_safe(&priv->cgr);
qman_release_cgrid(priv->cgr.cgrid);
static void cgr_cb(struct qman_portal *qm, struct qman_cgr *cgr, int congested)
opts.fqd.cgid = qipriv.cgr.cgrid;
ret = qman_alloc_cgrid(&qipriv.cgr.cgrid);
qipriv.cgr.cb = cgr_cb;
opts.cgr.cscn_en = QM_CGR_EN;
opts.cgr.mode = QMAN_CGR_MODE_FRAME;
qm_cgr_cs_thres_set64(&opts.cgr.cs_thres, val, 1);
ret = qman_create_cgr(&qipriv.cgr, QMAN_CGR_FLAG_USE_INIT, &opts);
qipriv.cgr.cgrid);
struct qman_cgr cgr;
qman_delete_cgr_safe(&qipriv.cgr);
qman_release_cgrid(qipriv.cgr.cgrid);
initfq.fqd.cgid = (u8)priv->cgr_data.cgr.cgrid;
initcgr.cgr.cscn_en = QM_CGR_EN;
qm_cgr_cs_thres_set64(&initcgr.cgr.cs_thres, cs_th, 1);
initcgr.cgr.cstd_en = QM_CGR_EN;
qman_delete_cgr_safe(&priv->cgr_data.cgr);
qman_release_cgrid(priv->cgr_data.cgr.cgrid);
qman_delete_cgr_safe(&priv->cgr_data.cgr);
qman_release_cgrid(priv->cgr_data.cgr.cgrid);
static void dpaa_eth_cgscn(struct qman_portal *qm, struct qman_cgr *cgr,
struct dpaa_priv *priv = (struct dpaa_priv *)container_of(cgr,
struct dpaa_priv, cgr_data.cgr);
err = qman_alloc_cgrid(&priv->cgr_data.cgr.cgrid);
priv->cgr_data.cgr.cb = dpaa_eth_cgscn;
initcgr.cgr.cscn_en = QM_CGR_EN;
qm_cgr_cs_thres_set64(&initcgr.cgr.cs_thres, cs_th, 1);
initcgr.cgr.cstd_en = QM_CGR_EN;
err = qman_create_cgr(&priv->cgr_data.cgr, QMAN_CGR_FLAG_USE_INIT,
__func__, err, priv->cgr_data.cgr.cgrid);
qman_release_cgrid(priv->cgr_data.cgr.cgrid);
priv->cgr_data.cgr.cgrid, priv->mac_dev->addr,
priv->cgr_data.cgr.chan);
qm_cgr_cs_thres_set64(&opts.cgr.cs_thres, cs_th, 1);
err = qman_update_cgr_safe(&priv->cgr_data.cgr, &opts);
struct qman_cgr cgr;
if (qman_query_cgr_congested(&priv->cgr_data.cgr, &cg_status) == 0) {
struct qman_cgr *cgr;
list_for_each_entry(cgr, &p->cgr_cbs, node)
if (cgr->cb && qman_cgrs_get(&c, cgr->cgrid))
cgr->cb(p, cgr, qman_cgrs_get(&rr, cgr->cgrid));
static int qman_query_cgr(struct qman_cgr *cgr,
mcc->cgr.cgid = cgr->cgrid;
int qman_query_cgr_congested(struct qman_cgr *cgr, bool *result)
err = qman_query_cgr(cgr, &query_cgr);
*result = !!query_cgr.cgr.cs;
static int qm_modify_cgr(struct qman_cgr *cgr, u32 flags,
mcc->initcgr.cgid = cgr->cgrid;
static void qm_cgr_cscn_targ_set(struct __qm_mc_cgr *cgr, int pi, u32 val)
cgr->cscn_targ_upd_ctrl = cpu_to_be16(pi |
cgr->cscn_targ = cpu_to_be32(val | QM_CGR_TARG_PORTAL(pi));
static void qm_cgr_cscn_targ_clear(struct __qm_mc_cgr *cgr, int pi, u32 val)
cgr->cscn_targ_upd_ctrl = cpu_to_be16(pi);
cgr->cscn_targ = cpu_to_be32(val & ~QM_CGR_TARG_PORTAL(pi));
struct qman_cgr cgr;
for (cgr.cgrid = 0; cgr.cgrid < CGR_NUM; cgr.cgrid++) {
if (qm_modify_cgr(&cgr, QMAN_CGR_FLAG_USE_INIT, NULL))
int qman_create_cgr(struct qman_cgr *cgr, u32 flags,
if (cgr->cgrid >= CGR_NUM)
qman_cgr_cpus[cgr->cgrid] = smp_processor_id();
cgr->chan = p->config->channel;
ret = qman_query_cgr(cgr, &cgr_state);
qm_cgr_cscn_targ_set(&local_opts.cgr, PORTAL_IDX(p),
be32_to_cpu(cgr_state.cgr.cscn_targ));
ret = qm_modify_cgr(cgr, QMAN_CGR_FLAG_USE_INIT,
ret = qm_modify_cgr(cgr, 0, &local_opts);
list_add(&cgr->node, &p->cgr_cbs);
ret = qman_query_cgr(cgr, &cgr_state);
if (cgr->cb && cgr_state.cgr.cscn_en &&
qman_cgrs_get(&p->cgrs[1], cgr->cgrid))
cgr->cb(p, cgr, 1);
static struct qman_portal *qman_cgr_get_affine_portal(struct qman_cgr *cgr)
if (cgr->chan != p->config->channel) {
cgr->chan, p->config->channel);
int qman_delete_cgr(struct qman_cgr *cgr)
struct qman_portal *p = qman_cgr_get_affine_portal(cgr);
list_del(&cgr->node);
if (i->cgrid == cgr->cgrid && i->cb)
ret = qman_query_cgr(cgr, &cgr_state);
list_add(&cgr->node, &p->cgr_cbs);
qm_cgr_cscn_targ_clear(&local_opts.cgr, PORTAL_IDX(p),
be32_to_cpu(cgr_state.cgr.cscn_targ));
ret = qm_modify_cgr(cgr, 0, &local_opts);
list_add(&cgr->node, &p->cgr_cbs);
void qman_delete_cgr_safe(struct qman_cgr *cgr)
if (qman_cgr_cpus[cgr->cgrid] != smp_processor_id()) {
smp_call_function_single(qman_cgr_cpus[cgr->cgrid],
qman_delete_cgr_smp_call, cgr, true);
qman_delete_cgr(cgr);
static int qman_update_cgr(struct qman_cgr *cgr, struct qm_mcc_initcgr *opts)
struct qman_portal *p = qman_cgr_get_affine_portal(cgr);
ret = qm_modify_cgr(cgr, 0, opts);
struct qman_cgr *cgr;
params->ret = qman_update_cgr(params->cgr, params->opts);
int qman_update_cgr_safe(struct qman_cgr *cgr, struct qm_mcc_initcgr *opts)
.cgr = cgr,
if (qman_cgr_cpus[cgr->cgrid] != smp_processor_id())
smp_call_function_single(qman_cgr_cpus[cgr->cgrid],
params.ret = qman_update_cgr(cgr, opts);
struct qm_mcc_cgr cgr;
static inline int qman_cgrs_get(struct qman_cgrs *c, u8 cgr)
return c->q.state[CGR_WORD(cgr)] & CGR_BIT(cgr);
struct __qm_mc_cgr cgr; /* CGR fields */
struct __qm_mc_cgr cgr; /* CGR fields */