]>
Commit | Line | Data |
---|---|---|
b7ca0ba0 SL |
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, ¶ms, | |
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 |