]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - queue-5.10/soc-fsl-qbman-add-cgr-update-function.patch
Fixes for 5.10
[thirdparty/kernel/stable-queue.git] / queue-5.10 / soc-fsl-qbman-add-cgr-update-function.patch
CommitLineData
b7ca0ba0
SL
1From af1e2da42077660ad8a653658234ebbd5bdf2ce9 Mon Sep 17 00:00:00 2001
2From: Sasha Levin <sashal@kernel.org>
3Date: Fri, 2 Sep 2022 17:57:35 -0400
4Subject: soc: fsl: qbman: Add CGR update function
5
6From: Sean Anderson <sean.anderson@seco.com>
7
8[ Upstream commit 914f8b228ede709274b8c80514b352248ec9da00 ]
9
10This adds a function to update a CGR with new parameters. qman_create_cgr
11can almost be used for this (with flags=0), but it's not suitable because
12it also registers the callback function. The _safe variant was modeled off
13of qman_cgr_delete_safe. However, we handle multiple arguments and a return
14value.
15
16Signed-off-by: Sean Anderson <sean.anderson@seco.com>
17Acked-by: Camelia Groza <camelia.groza@nxp.com>
18Signed-off-by: David S. Miller <davem@davemloft.net>
19Stable-dep-of: fbec4e7fed89 ("soc: fsl: qbman: Use raw spinlock for cgr_lock")
20Signed-off-by: Sasha Levin <sashal@kernel.org>
21---
22 drivers/soc/fsl/qbman/qman.c | 48 ++++++++++++++++++++++++++++++++++++
23 include/soc/fsl/qman.h | 9 +++++++
24 2 files changed, 57 insertions(+)
25
26diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c
27index d581576c9a861..3346593e0bc62 100644
28--- a/drivers/soc/fsl/qbman/qman.c
29+++ b/drivers/soc/fsl/qbman/qman.c
30@@ -2568,6 +2568,54 @@ void qman_delete_cgr_safe(struct qman_cgr *cgr)
31 }
32 EXPORT_SYMBOL(qman_delete_cgr_safe);
33
34+static int qman_update_cgr(struct qman_cgr *cgr, struct qm_mcc_initcgr *opts)
35+{
36+ int ret;
37+ unsigned long irqflags;
38+ struct qman_portal *p = qman_cgr_get_affine_portal(cgr);
39+
40+ if (!p)
41+ return -EINVAL;
42+
43+ spin_lock_irqsave(&p->cgr_lock, irqflags);
44+ ret = qm_modify_cgr(cgr, 0, opts);
45+ spin_unlock_irqrestore(&p->cgr_lock, irqflags);
46+ put_affine_portal();
47+ return ret;
48+}
49+
50+struct update_cgr_params {
51+ struct qman_cgr *cgr;
52+ struct qm_mcc_initcgr *opts;
53+ int ret;
54+};
55+
56+static void qman_update_cgr_smp_call(void *p)
57+{
58+ struct update_cgr_params *params = p;
59+
60+ params->ret = qman_update_cgr(params->cgr, params->opts);
61+}
62+
63+int qman_update_cgr_safe(struct qman_cgr *cgr, struct qm_mcc_initcgr *opts)
64+{
65+ struct update_cgr_params params = {
66+ .cgr = cgr,
67+ .opts = opts,
68+ };
69+
70+ preempt_disable();
71+ if (qman_cgr_cpus[cgr->cgrid] != smp_processor_id())
72+ smp_call_function_single(qman_cgr_cpus[cgr->cgrid],
73+ qman_update_cgr_smp_call, &params,
74+ true);
75+ else
76+ params.ret = qman_update_cgr(cgr, opts);
77+ preempt_enable();
78+ return params.ret;
79+}
80+EXPORT_SYMBOL(qman_update_cgr_safe);
81+
82 /* Cleanup FQs */
83
84 static int _qm_mr_consume_and_match_verb(struct qm_portal *p, int v)
85diff --git a/include/soc/fsl/qman.h b/include/soc/fsl/qman.h
86index 9f484113cfda7..3cecbfdb0f8c2 100644
87--- a/include/soc/fsl/qman.h
88+++ b/include/soc/fsl/qman.h
89@@ -1170,6 +1170,15 @@ int qman_delete_cgr(struct qman_cgr *cgr);
90 */
91 void qman_delete_cgr_safe(struct qman_cgr *cgr);
92
93+/**
94+ * qman_update_cgr_safe - Modifies a congestion group object from any CPU
95+ * @cgr: the 'cgr' object to modify
96+ * @opts: state of the CGR settings
97+ *
98+ * This will select the proper CPU and modify the CGR settings.
99+ */
100+int qman_update_cgr_safe(struct qman_cgr *cgr, struct qm_mcc_initcgr *opts);
101+
102 /**
103 * qman_query_cgr_congested - Queries CGR's congestion status
104 * @cgr: the 'cgr' object to query
105--
1062.43.0
107