From nobody Sun Dec 14 21:54:08 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE1D621765E for ; Wed, 5 Feb 2025 07:58:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738742328; cv=none; b=HcUrNPlWyEgN5T8WBrkWlQwh0Gl5UOTGPtoP7zc85WfVhaYAcIzhbvYFgmua7Eh3mn3bRE46WgA+5arjls1PM6gwupO/0ShRbidszy8084AfZwStHqMifYF2D3/y25JqtvdGE0E0RBfVjGGDg80Te0CaZRxuyIA8e9++nccy2B4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738742328; c=relaxed/simple; bh=ZopVieWijvzU+oBhZmofMrmf5ru4Ukq9wJt2t291gJA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=ju62K5cu9TWpurRBLL3Kd5g1lBsihaY318bnTKQTdRQkZPGcfeB7w9ndnmyk07rSFHIyHUQBZzBtr9zFxjN26ClDXcBL4zR7acNXs/fECE5qRPnm9f7NCIEmmXkeSsnPYZ46wx9dBXXeg9LujawfQLb03cAkItn6bC05ybpiuTc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uEbwFEGs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uEbwFEGs" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3852AC4CED1; Wed, 5 Feb 2025 07:58:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738742328; bh=ZopVieWijvzU+oBhZmofMrmf5ru4Ukq9wJt2t291gJA=; h=From:Date:Subject:To:Cc:Reply-To:From; b=uEbwFEGsnvSLt6o1BOI/cwp2ZC5tEc/H2yJyATLIvXq/nQQzCxEkLlmnZlU1HHM+g qEY05IxJSikItCnu2u/uV+oPhN8Y/CofpaqCjmdBdVLLyZSMDP37d8ohCLDCkSn8dw Y9tmZMnRVHEZlcA+/szHIV7fIb5PHK3WjzJbWgoSoDf8/WT8daUD08Cdpqi0Y5EY/K pbxGkpMxULQnif2ohYwotYASO0B9d0Feo635FYz5gSAG1HLkMamsoBr8Ri2eUE9VW1 vb36eFND0/eOteJ3Gcz1sVyImwFJiCs4Bk8pZcm5RnWOGZ4Tog5U/LV7EzStlvBDZv K76x8B+OXuIxA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22023C02192; Wed, 5 Feb 2025 07:58:48 +0000 (UTC) From: Chuan Liu via B4 Relay Date: Wed, 05 Feb 2025 15:58:43 +0800 Subject: [PATCH v2] soc: amlogic: clk-measure: Optimize the memory size of clk-measure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250205-optimize_memory_size_of_clk_measure-v2-1-4f546053495d@amlogic.com> X-B4-Tracking: v=1; b=H4sIADIao2cC/5WNWw6CMBREt0LutzVteYlf7sMQ0tRbuJFS0iJRS fduYQf+zZlk5mwQ0BMGuGYbeFwpkJsSyFMGelBTj4weiUFyWXIhc+bmhSx9sbNonf90Yc/OdHp 8pkqFl0dmGl1wvIiybgpIT7NHQ+/Dcm8TDxSWtD2kq9jb//5XwQTjlVKV4sKYvL4pO7qe9Fk7C 22M8QfWd3ks2AAAAA== To: Neil Armstrong , Kevin Hilman , Jerome Brunet , Martin Blumenstingl Cc: linux-arm-kernel@lists.infradead.org, linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, Chuan Liu X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1738742326; l=7454; i=chuan.liu@amlogic.com; s=20240902; h=from:subject:message-id; bh=CmPH3b1j74K558ccUEKEAgqGmyZRPF8SYGNr1A0i6CM=; b=JJUxo3NfEYFOoJCIwiriJ83d+KNiGzq1jcQ7AAQRhodrDHrguh/T49K5lXqMIA6/MlHve3lFP s4xSfhbuf4ZBFeBNFKMh3Jf1wUXoMOCsh0Qa2hN9H1/mhH7nO53BjKH X-Developer-Key: i=chuan.liu@amlogic.com; a=ed25519; pk=fnKDB+81SoWGKW2GJNFkKy/ULvsDmJZRGBE7pR5Xcpo= X-Endpoint-Received: by B4 Relay for chuan.liu@amlogic.com/20240902 with auth_id=203 X-Original-From: Chuan Liu Reply-To: chuan.liu@amlogic.com From: Chuan Liu Drop "CLK_MSR_MAX" and replace it with adding a member "msr_count" in the structure to specify the count of msr_id. Mark the table of msr_id as const. Signed-off-by: Chuan Liu Reviewed-by: Neil Armstrong --- The number of msr_ids for each chip is inconsistent. Defining a fixed-size array for each chip to store msr_ids would waste memory. --- Changes in v2: - Discard the global variable and restore the "priv" member in the "struct meson_msr_id". - Mark msr_id_table as const. - Link to v1: https://lore.kernel.org/r/20250123-optimize_memory_size_of_cl= k_measure-v1-1-06aa6a01ff37@amlogic.com --- drivers/soc/amlogic/meson-clk-measure.c | 86 ++++++++++++++++++++++++-----= ---- 1 file changed, 62 insertions(+), 24 deletions(-) diff --git a/drivers/soc/amlogic/meson-clk-measure.c b/drivers/soc/amlogic/= meson-clk-measure.c index a6453ffeb753..39638d6a593c 100644 --- a/drivers/soc/amlogic/meson-clk-measure.c +++ b/drivers/soc/amlogic/meson-clk-measure.c @@ -33,23 +33,26 @@ static DEFINE_MUTEX(measure_lock); #define DIV_STEP 32 #define DIV_MAX 640 =20 -#define CLK_MSR_MAX 128 - struct meson_msr_id { struct meson_msr *priv; unsigned int id; const char *name; }; =20 +struct meson_msr_data { + struct meson_msr_id *msr_table; + unsigned int msr_count; +}; + struct meson_msr { struct regmap *regmap; - struct meson_msr_id msr_table[CLK_MSR_MAX]; + struct meson_msr_data data; }; =20 #define CLK_MSR_ID(__id, __name) \ [__id] =3D {.id =3D __id, .name =3D __name,} =20 -static struct meson_msr_id clk_msr_m8[CLK_MSR_MAX] =3D { +static const struct meson_msr_id clk_msr_m8[] =3D { CLK_MSR_ID(0, "ring_osc_out_ee0"), CLK_MSR_ID(1, "ring_osc_out_ee1"), CLK_MSR_ID(2, "ring_osc_out_ee2"), @@ -98,7 +101,7 @@ static struct meson_msr_id clk_msr_m8[CLK_MSR_MAX] =3D { CLK_MSR_ID(63, "mipi_csi_cfg"), }; =20 -static struct meson_msr_id clk_msr_gx[CLK_MSR_MAX] =3D { +static const struct meson_msr_id clk_msr_gx[] =3D { CLK_MSR_ID(0, "ring_osc_out_ee_0"), CLK_MSR_ID(1, "ring_osc_out_ee_1"), CLK_MSR_ID(2, "ring_osc_out_ee_2"), @@ -168,7 +171,7 @@ static struct meson_msr_id clk_msr_gx[CLK_MSR_MAX] =3D { CLK_MSR_ID(82, "ge2d"), }; =20 -static struct meson_msr_id clk_msr_axg[CLK_MSR_MAX] =3D { +static const struct meson_msr_id clk_msr_axg[] =3D { CLK_MSR_ID(0, "ring_osc_out_ee_0"), CLK_MSR_ID(1, "ring_osc_out_ee_1"), CLK_MSR_ID(2, "ring_osc_out_ee_2"), @@ -242,7 +245,7 @@ static struct meson_msr_id clk_msr_axg[CLK_MSR_MAX] =3D= { CLK_MSR_ID(109, "audio_locker_in"), }; =20 -static struct meson_msr_id clk_msr_g12a[CLK_MSR_MAX] =3D { +static const struct meson_msr_id clk_msr_g12a[] =3D { CLK_MSR_ID(0, "ring_osc_out_ee_0"), CLK_MSR_ID(1, "ring_osc_out_ee_1"), CLK_MSR_ID(2, "ring_osc_out_ee_2"), @@ -358,7 +361,7 @@ static struct meson_msr_id clk_msr_g12a[CLK_MSR_MAX] = =3D { CLK_MSR_ID(122, "audio_pdm_dclk"), }; =20 -static struct meson_msr_id clk_msr_sm1[CLK_MSR_MAX] =3D { +static const struct meson_msr_id clk_msr_sm1[] =3D { CLK_MSR_ID(0, "ring_osc_out_ee_0"), CLK_MSR_ID(1, "ring_osc_out_ee_1"), CLK_MSR_ID(2, "ring_osc_out_ee_2"), @@ -489,7 +492,7 @@ static struct meson_msr_id clk_msr_sm1[CLK_MSR_MAX] =3D= { }; =20 static int meson_measure_id(struct meson_msr_id *clk_msr_id, - unsigned int duration) + unsigned int duration) { struct meson_msr *priv =3D clk_msr_id->priv; unsigned int val; @@ -573,13 +576,14 @@ DEFINE_SHOW_ATTRIBUTE(clk_msr); static int clk_msr_summary_show(struct seq_file *s, void *data) { struct meson_msr_id *msr_table =3D s->private; + unsigned int msr_count =3D msr_table->priv->data.msr_count; unsigned int precision =3D 0; int val, i; =20 seq_puts(s, " clock rate precision\n"); seq_puts(s, "---------------------------------------------\n"); =20 - for (i =3D 0 ; i < CLK_MSR_MAX ; ++i) { + for (i =3D 0 ; i < msr_count ; ++i) { if (!msr_table[i].name) continue; =20 @@ -604,7 +608,7 @@ static const struct regmap_config meson_clk_msr_regmap_= config =3D { =20 static int meson_msr_probe(struct platform_device *pdev) { - const struct meson_msr_id *match_data; + const struct meson_msr_data *match_data; struct meson_msr *priv; struct dentry *root, *clks; void __iomem *base; @@ -621,7 +625,16 @@ static int meson_msr_probe(struct platform_device *pde= v) return -ENODEV; } =20 - memcpy(priv->msr_table, match_data, sizeof(priv->msr_table)); + priv->data.msr_table =3D devm_kcalloc(&pdev->dev, + match_data->msr_count, + sizeof(struct meson_msr_id), + GFP_KERNEL); + if (!priv->data.msr_table) + return -ENOMEM; + + memcpy(priv->data.msr_table, match_data->msr_table, + match_data->msr_count * sizeof(struct meson_msr_id)); + priv->data.msr_count =3D match_data->msr_count; =20 base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(base)) @@ -636,45 +649,70 @@ static int meson_msr_probe(struct platform_device *pd= ev) clks =3D debugfs_create_dir("clks", root); =20 debugfs_create_file("measure_summary", 0444, root, - priv->msr_table, &clk_msr_summary_fops); + priv->data.msr_table, &clk_msr_summary_fops); =20 - for (i =3D 0 ; i < CLK_MSR_MAX ; ++i) { - if (!priv->msr_table[i].name) + for (i =3D 0 ; i < priv->data.msr_count ; ++i) { + if (!priv->data.msr_table[i].name) continue; =20 - priv->msr_table[i].priv =3D priv; + priv->data.msr_table[i].priv =3D priv; =20 - debugfs_create_file(priv->msr_table[i].name, 0444, clks, - &priv->msr_table[i], &clk_msr_fops); + debugfs_create_file(priv->data.msr_table[i].name, 0444, clks, + &priv->data.msr_table[i], &clk_msr_fops); } =20 return 0; } =20 +static const struct meson_msr_data clk_msr_gx_data =3D { + .msr_table =3D (void *)clk_msr_gx, + .msr_count =3D ARRAY_SIZE(clk_msr_gx), +}; + +static const struct meson_msr_data clk_msr_m8_data =3D { + .msr_table =3D (void *)clk_msr_m8, + .msr_count =3D ARRAY_SIZE(clk_msr_m8), +}; + +static const struct meson_msr_data clk_msr_axg_data =3D { + .msr_table =3D (void *)clk_msr_axg, + .msr_count =3D ARRAY_SIZE(clk_msr_axg), +}; + +static const struct meson_msr_data clk_msr_g12a_data =3D { + .msr_table =3D (void *)clk_msr_g12a, + .msr_count =3D ARRAY_SIZE(clk_msr_g12a), +}; + +static const struct meson_msr_data clk_msr_sm1_data =3D { + .msr_table =3D (void *)clk_msr_sm1, + .msr_count =3D ARRAY_SIZE(clk_msr_sm1), +}; + static const struct of_device_id meson_msr_match_table[] =3D { { .compatible =3D "amlogic,meson-gx-clk-measure", - .data =3D (void *)clk_msr_gx, + .data =3D &clk_msr_gx_data, }, { .compatible =3D "amlogic,meson8-clk-measure", - .data =3D (void *)clk_msr_m8, + .data =3D &clk_msr_m8_data, }, { .compatible =3D "amlogic,meson8b-clk-measure", - .data =3D (void *)clk_msr_m8, + .data =3D &clk_msr_m8_data, }, { .compatible =3D "amlogic,meson-axg-clk-measure", - .data =3D (void *)clk_msr_axg, + .data =3D &clk_msr_axg_data, }, { .compatible =3D "amlogic,meson-g12a-clk-measure", - .data =3D (void *)clk_msr_g12a, + .data =3D &clk_msr_g12a_data, }, { .compatible =3D "amlogic,meson-sm1-clk-measure", - .data =3D (void *)clk_msr_sm1, + .data =3D &clk_msr_sm1_data, }, { /* sentinel */ } }; --- base-commit: 1e1fd26ed4ca05cc1f0e5857918da4dd54967f7d change-id: 20250123-optimize_memory_size_of_clk_measure-f9c40e815794 Best regards, --=20 Chuan Liu