]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.10/soc-fsl-qbman-add-cgr-update-function.patch
5.10-stable patches
[thirdparty/kernel/stable-queue.git] / queue-5.10 / soc-fsl-qbman-add-cgr-update-function.patch
1 From af1e2da42077660ad8a653658234ebbd5bdf2ce9 Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Fri, 2 Sep 2022 17:57:35 -0400
4 Subject: soc: fsl: qbman: Add CGR update function
5
6 From: Sean Anderson <sean.anderson@seco.com>
7
8 [ Upstream commit 914f8b228ede709274b8c80514b352248ec9da00 ]
9
10 This adds a function to update a CGR with new parameters. qman_create_cgr
11 can almost be used for this (with flags=0), but it's not suitable because
12 it also registers the callback function. The _safe variant was modeled off
13 of qman_cgr_delete_safe. However, we handle multiple arguments and a return
14 value.
15
16 Signed-off-by: Sean Anderson <sean.anderson@seco.com>
17 Acked-by: Camelia Groza <camelia.groza@nxp.com>
18 Signed-off-by: David S. Miller <davem@davemloft.net>
19 Stable-dep-of: fbec4e7fed89 ("soc: fsl: qbman: Use raw spinlock for cgr_lock")
20 Signed-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
26 diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c
27 index 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)
85 diff --git a/include/soc/fsl/qman.h b/include/soc/fsl/qman.h
86 index 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 --
106 2.43.0
107