* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:30 Kees Cook
2023-08-17 20:42 ` Gustavo A. R. Silva
0 siblings, 1 reply; 2+ messages in thread
From: Kees Cook @ 2023-08-17 20:30 UTC (permalink / raw)
To: Michael Turquette
Cc: Kees Cook, Stephen Boyd, Joel Stanley, Andrew Jeffery,
Taichi Sugaya, Takao Orito, Qin Jian, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Andy Gross,
Bjorn Andersson, Konrad Dybcio, Sergio Paracuellos,
Matthias Brugger, AngeloGioacchino Del Regno, Maxime Ripard,
Chen-Yu Tsai, Jernej Skrabec, David Airlie, Daniel Vetter,
Samuel Holland, Vinod Koul, Kishon Vijay Abraham I, linux-clk,
linux-arm-kernel, linux-aspeed, linux-arm-msm, linux-mediatek,
dri-devel, linux-sunxi, linux-phy, Nathan Chancellor,
Nick Desaulniers, Tom Rix, linux-kernel, llvm, linux-hardening
Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).
As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.
[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
Cc: Takao Orito <orito.takao@socionext.com>
Cc: Qin Jian <qinjian@cqplus1.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-aspeed@lists.ozlabs.org
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-mediatek@lists.infradead.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-sunxi@lists.linux.dev
Cc: linux-phy@lists.infradead.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
drivers/clk/clk-aspeed.c | 3 +--
drivers/clk/clk-ast2600.c | 2 +-
drivers/clk/clk-gemini.c | 2 +-
drivers/clk/clk-milbeaut.c | 3 +--
drivers/clk/clk-sp7021.c | 3 +--
drivers/clk/mvebu/cp110-system-controller.c | 2 +-
drivers/clk/qcom/clk-cpu-8996.c | 2 +-
drivers/clk/ralink/clk-mt7621.c | 3 +--
drivers/gpu/drm/sun4i/sun8i_tcon_top.c | 3 +--
drivers/phy/qualcomm/phy-qcom-edp.c | 2 +-
include/linux/clk-provider.h | 2 +-
11 files changed, 11 insertions(+), 16 deletions(-)
diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
index 284710adaef5..ff84191d0fe8 100644
--- a/drivers/clk/clk-aspeed.c
+++ b/drivers/clk/clk-aspeed.c
@@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
GFP_KERNEL);
if (!aspeed_clk_data)
return;
+ aspeed_clk_data->num = ASPEED_NUM_CLKS;
/*
* This way all clocks fetched before the platform device probes,
@@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
aspeed_ast2500_cc(map);
else
pr_err("unknown platform, failed to add clocks\n");
-
- aspeed_clk_data->num = ASPEED_NUM_CLKS;
ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
if (ret)
pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
index f9e27f95a967..909c3137c428 100644
--- a/drivers/clk/clk-ast2600.c
+++ b/drivers/clk/clk-ast2600.c
@@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
ASPEED_G6_NUM_CLKS), GFP_KERNEL);
if (!aspeed_g6_clk_data)
return;
+ aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
/*
* This way all clocks fetched before the platform device probes,
@@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
}
aspeed_g6_cc(map);
- aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
if (ret)
pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index a23fa6d47ef1..2572d15aadd0 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
GFP_KERNEL);
if (!gemini_clk_data)
return;
+ gemini_clk_data->num = GEMINI_NUM_CLKS;
/*
* This way all clock fetched before the platform device probes,
@@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
/* Register the clocks to be accessed by the device tree */
- gemini_clk_data->num = GEMINI_NUM_CLKS;
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
}
CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
index 050fd4fb588f..18c20aff45f7 100644
--- a/drivers/clk/clk-milbeaut.c
+++ b/drivers/clk/clk-milbeaut.c
@@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
if (!m10v_clk_data)
return;
+ m10v_clk_data->num = M10V_NUM_CLKS;
base = of_iomap(np, 0);
if (!base) {
@@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
base + CLKSEL(1), 0, 3, 0, rclk_table,
&m10v_crglock, NULL);
m10v_clk_data->hws[M10V_RCLK_ID] = hw;
-
- m10v_clk_data->num = M10V_NUM_CLKS;
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
}
CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
index 11d22043ddd7..01d3c4c7b0b2 100644
--- a/drivers/clk/clk-sp7021.c
+++ b/drivers/clk/clk-sp7021.c
@@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
GFP_KERNEL);
if (!clk_data)
return -ENOMEM;
+ clk_data->num = CLK_MAX;
hws = clk_data->hws;
pd_ext.index = 0;
@@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
return PTR_ERR(hws[i]);
}
- clk_data->num = CLK_MAX;
-
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
}
diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
index 84c8900542e4..03c59bf22106 100644
--- a/drivers/clk/mvebu/cp110-system-controller.c
+++ b/drivers/clk/mvebu/cp110-system-controller.c
@@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
GFP_KERNEL);
if (!cp110_clk_data)
return -ENOMEM;
+ cp110_clk_data->num = CP110_CLK_NUM;
cp110_clks = cp110_clk_data->hws;
- cp110_clk_data->num = CP110_CLK_NUM;
/* Register the PLL0 which is the root of the hw tree */
pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
index 592c7c3cdeb7..72689448a653 100644
--- a/drivers/clk/qcom/clk-cpu-8996.c
+++ b/drivers/clk/qcom/clk-cpu-8996.c
@@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
if (!data)
return -ENOMEM;
+ data->num = 2;
base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(base))
@@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
data->hws[0] = &pwrcl_pmux.clkr.hw;
data->hws[1] = &perfcl_pmux.clkr.hw;
- data->num = 2;
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
}
diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
index d95a33293b0a..92d14350c4b3 100644
--- a/drivers/clk/ralink/clk-mt7621.c
+++ b/drivers/clk/ralink/clk-mt7621.c
@@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
GFP_KERNEL);
if (!clk_data)
return -ENOMEM;
+ clk_data->num = count;
for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
clk_data->hws[i] = mt7621_clk_early[i];
@@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
goto unreg_clk_fixed;
}
- clk_data->num = count;
-
ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
if (ret) {
dev_err(dev, "Couldn't add clk hw provider\n");
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 6f076cf4b403..a1ca3916f42b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
GFP_KERNEL);
if (!clk_data)
return -ENOMEM;
+ clk_data->num = CLK_NUM;
tcon_top->clk_data = clk_data;
spin_lock_init(&tcon_top->reg_lock);
@@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
goto err_unregister_gates;
}
- clk_data->num = CLK_NUM;
-
ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
clk_data);
if (ret)
diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
index e0e722b9be31..8e5078304646 100644
--- a/drivers/phy/qualcomm/phy-qcom-edp.c
+++ b/drivers/phy/qualcomm/phy-qcom-edp.c
@@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
if (!data)
return -ENOMEM;
+ data->num = 2;
snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
init.ops = &qcom_edp_dp_link_clk_ops;
@@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
data->hws[0] = &edp->dp_link_hw;
data->hws[1] = &edp->dp_pixel_hw;
- data->num = 2;
return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
}
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 0f0cd01906b4..ec32ec58c59f 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -1379,7 +1379,7 @@ struct clk_onecell_data {
struct clk_hw_onecell_data {
unsigned int num;
- struct clk_hw *hws[];
+ struct clk_hw *hws[] __counted_by(num);
};
#define CLK_OF_DECLARE(name, compat, fn) \
--
2.34.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
2023-08-17 20:30 [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by Kees Cook
@ 2023-08-17 20:42 ` Gustavo A. R. Silva
0 siblings, 0 replies; 2+ messages in thread
From: Gustavo A. R. Silva @ 2023-08-17 20:42 UTC (permalink / raw)
To: Kees Cook, Michael Turquette
Cc: Stephen Boyd, Joel Stanley, Andrew Jeffery, Taichi Sugaya,
Takao Orito, Qin Jian, Andrew Lunn, Gregory Clement,
Sebastian Hesselbarth, Andy Gross, Bjorn Andersson, Konrad Dybcio,
Sergio Paracuellos, Matthias Brugger, AngeloGioacchino Del Regno,
Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, David Airlie,
Daniel Vetter, Samuel Holland, Vinod Koul, Kishon Vijay Abraham I,
linux-clk, linux-arm-kernel, linux-aspeed, linux-arm-msm,
linux-mediatek, dri-devel, linux-sunxi, linux-phy,
Nathan Chancellor, Nick Desaulniers, Tom Rix, linux-kernel, llvm,
linux-hardening
On 8/17/23 14:30, Kees Cook wrote:
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
>
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
>
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
>
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Thanks
--
Gustavo
> ---
> drivers/clk/clk-aspeed.c | 3 +--
> drivers/clk/clk-ast2600.c | 2 +-
> drivers/clk/clk-gemini.c | 2 +-
> drivers/clk/clk-milbeaut.c | 3 +--
> drivers/clk/clk-sp7021.c | 3 +--
> drivers/clk/mvebu/cp110-system-controller.c | 2 +-
> drivers/clk/qcom/clk-cpu-8996.c | 2 +-
> drivers/clk/ralink/clk-mt7621.c | 3 +--
> drivers/gpu/drm/sun4i/sun8i_tcon_top.c | 3 +--
> drivers/phy/qualcomm/phy-qcom-edp.c | 2 +-
> include/linux/clk-provider.h | 2 +-
> 11 files changed, 11 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
> index 284710adaef5..ff84191d0fe8 100644
> --- a/drivers/clk/clk-aspeed.c
> +++ b/drivers/clk/clk-aspeed.c
> @@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
> GFP_KERNEL);
> if (!aspeed_clk_data)
> return;
> + aspeed_clk_data->num = ASPEED_NUM_CLKS;
>
> /*
> * This way all clocks fetched before the platform device probes,
> @@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
> aspeed_ast2500_cc(map);
> else
> pr_err("unknown platform, failed to add clocks\n");
> -
> - aspeed_clk_data->num = ASPEED_NUM_CLKS;
> ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
> if (ret)
> pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index f9e27f95a967..909c3137c428 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
> ASPEED_G6_NUM_CLKS), GFP_KERNEL);
> if (!aspeed_g6_clk_data)
> return;
> + aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>
> /*
> * This way all clocks fetched before the platform device probes,
> @@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
> }
>
> aspeed_g6_cc(map);
> - aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
> ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
> if (ret)
> pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
> index a23fa6d47ef1..2572d15aadd0 100644
> --- a/drivers/clk/clk-gemini.c
> +++ b/drivers/clk/clk-gemini.c
> @@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
> GFP_KERNEL);
> if (!gemini_clk_data)
> return;
> + gemini_clk_data->num = GEMINI_NUM_CLKS;
>
> /*
> * This way all clock fetched before the platform device probes,
> @@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
> gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
>
> /* Register the clocks to be accessed by the device tree */
> - gemini_clk_data->num = GEMINI_NUM_CLKS;
> of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
> }
> CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> index 050fd4fb588f..18c20aff45f7 100644
> --- a/drivers/clk/clk-milbeaut.c
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
>
> if (!m10v_clk_data)
> return;
> + m10v_clk_data->num = M10V_NUM_CLKS;
>
> base = of_iomap(np, 0);
> if (!base) {
> @@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
> base + CLKSEL(1), 0, 3, 0, rclk_table,
> &m10v_crglock, NULL);
> m10v_clk_data->hws[M10V_RCLK_ID] = hw;
> -
> - m10v_clk_data->num = M10V_NUM_CLKS;
> of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
> }
> CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
> diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
> index 11d22043ddd7..01d3c4c7b0b2 100644
> --- a/drivers/clk/clk-sp7021.c
> +++ b/drivers/clk/clk-sp7021.c
> @@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
> GFP_KERNEL);
> if (!clk_data)
> return -ENOMEM;
> + clk_data->num = CLK_MAX;
>
> hws = clk_data->hws;
> pd_ext.index = 0;
> @@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
> return PTR_ERR(hws[i]);
> }
>
> - clk_data->num = CLK_MAX;
> -
> return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
> }
>
> diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
> index 84c8900542e4..03c59bf22106 100644
> --- a/drivers/clk/mvebu/cp110-system-controller.c
> +++ b/drivers/clk/mvebu/cp110-system-controller.c
> @@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
> GFP_KERNEL);
> if (!cp110_clk_data)
> return -ENOMEM;
> + cp110_clk_data->num = CP110_CLK_NUM;
>
> cp110_clks = cp110_clk_data->hws;
> - cp110_clk_data->num = CP110_CLK_NUM;
>
> /* Register the PLL0 which is the root of the hw tree */
> pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
> diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
> index 592c7c3cdeb7..72689448a653 100644
> --- a/drivers/clk/qcom/clk-cpu-8996.c
> +++ b/drivers/clk/qcom/clk-cpu-8996.c
> @@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
> data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
> if (!data)
> return -ENOMEM;
> + data->num = 2;
>
> base = devm_platform_ioremap_resource(pdev, 0);
> if (IS_ERR(base))
> @@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>
> data->hws[0] = &pwrcl_pmux.clkr.hw;
> data->hws[1] = &perfcl_pmux.clkr.hw;
> - data->num = 2;
>
> return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
> }
> diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
> index d95a33293b0a..92d14350c4b3 100644
> --- a/drivers/clk/ralink/clk-mt7621.c
> +++ b/drivers/clk/ralink/clk-mt7621.c
> @@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
> GFP_KERNEL);
> if (!clk_data)
> return -ENOMEM;
> + clk_data->num = count;
>
> for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
> clk_data->hws[i] = mt7621_clk_early[i];
> @@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
> goto unreg_clk_fixed;
> }
>
> - clk_data->num = count;
> -
> ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
> if (ret) {
> dev_err(dev, "Couldn't add clk hw provider\n");
> diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> index 6f076cf4b403..a1ca3916f42b 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> @@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
> GFP_KERNEL);
> if (!clk_data)
> return -ENOMEM;
> + clk_data->num = CLK_NUM;
> tcon_top->clk_data = clk_data;
>
> spin_lock_init(&tcon_top->reg_lock);
> @@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
> goto err_unregister_gates;
> }
>
> - clk_data->num = CLK_NUM;
> -
> ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
> clk_data);
> if (ret)
> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
> index e0e722b9be31..8e5078304646 100644
> --- a/drivers/phy/qualcomm/phy-qcom-edp.c
> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c
> @@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
> data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
> if (!data)
> return -ENOMEM;
> + data->num = 2;
>
> snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
> init.ops = &qcom_edp_dp_link_clk_ops;
> @@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>
> data->hws[0] = &edp->dp_link_hw;
> data->hws[1] = &edp->dp_pixel_hw;
> - data->num = 2;
>
> return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
> }
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 0f0cd01906b4..ec32ec58c59f 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -1379,7 +1379,7 @@ struct clk_onecell_data {
>
> struct clk_hw_onecell_data {
> unsigned int num;
> - struct clk_hw *hws[];
> + struct clk_hw *hws[] __counted_by(num);
> };
>
> #define CLK_OF_DECLARE(name, compat, fn) \
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-08-17 20:43 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-17 20:30 [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by Kees Cook
2023-08-17 20:42 ` Gustavo A. R. Silva
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox