[PATCH 1/4] clk: scmi: Bulk allocate all sub-driver instance data
Peng Fan
peng.fan at nxp.com
Tue Nov 4 09:05:53 CET 2025
Hi Marek, Tom,
> Subject: [PATCH 1/4] clk: scmi: Bulk allocate all sub-driver instance
> data
I just see this patchset was delegated to me in patchwork. But
there is no scmi repo, could I use the u-boot-fsl-qoriq.git repo
for managing the scmi patches?
Thanks,
Peng.
>
> Allocate all sub-driver instance data at once. The amount of data that
> have to be allocated is known up front, so is the size of the data, so
> there is no need to call malloc() in a loop, mallocate all data at once.
>
> The upside is, less heap fragmentation and fewer malloc() calls overall,
> and a faster boot time.
>
> The downside is, if some of the clock fail to register, then the clock
> driver cannot free parts of the bulk allocated sub-driver instance data.
> Such a failure can only occur if clk_register() were to fail, and if that
> happens, the system has more significant problems. Worse, if a core
> clock driver fails to probe, the system has even bigger problem.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Alice Guo <alice.guo at nxp.com>
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Sean Anderson <seanga2 at gmail.com>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Valentin Caron <valentin.caron at foss.st.com>
> Cc: Vinh Nguyen <vinh.nguyen.xz at renesas.com>
> Cc: u-boot at lists.denx.de
> ---
> drivers/clk/clk_scmi.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c index
> f9e17c38cad..0b64c73a61d 100644
> --- a/drivers/clk/clk_scmi.c
> +++ b/drivers/clk/clk_scmi.c
> @@ -283,7 +283,7 @@ static ulong scmi_clk_set_rate(struct clk *clk,
> ulong rate)
>
> static int scmi_clk_probe(struct udevice *dev) {
> - struct clk_scmi *clk_scmi;
> + struct clk_scmi *clk_scmi_bulk, *clk_scmi;
> struct scmi_clock_priv *priv = dev_get_priv(dev);
> size_t num_clocks, i;
> int ret;
> @@ -312,20 +312,23 @@ static int scmi_clk_probe(struct udevice
> *dev)
> return ret;
> }
>
> + clk_scmi_bulk = kzalloc(num_clocks * sizeof(*clk_scmi),
> GFP_KERNEL);
> + if (!clk_scmi_bulk)
> + return -ENOMEM;
> +
> for (i = 0; i < num_clocks; i++) {
> char *clock_name;
> u32 attributes;
>
> if (!scmi_clk_get_attibute(dev, i, &clock_name,
> &attributes)) {
> - clk_scmi = kzalloc(sizeof(*clk_scmi),
> GFP_KERNEL);
> - if (!clk_scmi || !clock_name)
> + clk_scmi = clk_scmi_bulk + i;
> + if (!clock_name)
> ret = -ENOMEM;
> else
> ret = clk_register(&clk_scmi->clk,
> dev->driver->name,
> clock_name, dev-
> >name);
>
> if (ret) {
> - free(clk_scmi);
> free(clock_name);
> return ret;
> }
> --
> 2.51.0
More information about the U-Boot
mailing list