From: Cristian Marussi <cristian.marussi@arm.com>
To: Sibi Sankar <quic_sibis@quicinc.com>
Cc: sudeep.holla@arm.com, cristian.marussi@arm.com,
andersson@kernel.org, konrad.dybcio@linaro.org,
robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org,
linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
quic_rgottimu@quicinc.com, quic_kshivnan@quicinc.com,
conor+dt@kernel.org, arm-scmi@vger.kernel.org,
Amir Vajid <avajid@quicinc.com>
Subject: Re: [PATCH V4 4/5] soc: qcom: Introduce SCMI based Memlat (Memory Latency) governor
Date: Tue, 22 Oct 2024 13:00:18 +0100 [thread overview]
Message-ID: <ZxeT0rl4LJP17LiE@pluto> (raw)
In-Reply-To: <20241007061023.1978380-5-quic_sibis@quicinc.com>
On Mon, Oct 07, 2024 at 11:40:22AM +0530, Sibi Sankar wrote:
> Introduce a client driver that uses the memlat algorithm string
> hosted on QCOM SCMI Generic Extension Protocol to detect memory
> latency workloads and control frequency/level of the various
> memory buses (DDR/LLCC/DDR_QOS).
>
Hi,
a few small remarks, down below.
> Co-developed-by: Shivnandan Kumar <quic_kshivnan@quicinc.com>
> Signed-off-by: Shivnandan Kumar <quic_kshivnan@quicinc.com>
> Co-developed-by: Ramakrishna Gottimukkula <quic_rgottimu@quicinc.com>
> Signed-off-by: Ramakrishna Gottimukkula <quic_rgottimu@quicinc.com>
> Co-developed-by: Amir Vajid <avajid@quicinc.com>
> Signed-off-by: Amir Vajid <avajid@quicinc.com>
> Signed-off-by: Sibi Sankar <quic_sibis@quicinc.com>
> ---
[snip]
> +static int populate_cluster_info(u32 *cluster_info)
> +{
> + char name[MAX_NAME_LEN];
> + int i = 0;
> +
> + struct device_node *cn __free(device_node) = of_find_node_by_path("/cpus");
> + if (!cn)
> + return -ENODEV;
Not sure if this is some new coding style accepted for the new cleanup.h
fancy stuff (sincere question/doubt...so please take this with a grain of salt),
BUT, if not, you should consider grouping this definition/initialization to
the start of the block whose scope they are in...like:
struct device_node *cn __free(device_node) = of_find_node_by_path("/cpus");
struct device_node *map __free(device_node) = NULL;
char name[MAX_NAME_LEN];
int i = 0;
if (!cn)
return -ENODEV;
map = of_get_child_by_name(cn, "cpu-map");
if (!map)
return -ENODEV;
> +
> + struct device_node *map __free(device_node) = of_get_child_by_name(cn, "cpu-map");
> + if (!map)
> + return -ENODEV;
> +
As said...
> + do {
> + snprintf(name, sizeof(name), "cluster%d", i);
> + struct device_node *c __free(device_node) = of_get_child_by_name(map, name);
> + if (!c)
> + break;
> +
> + *(cluster_info + i) = of_get_child_count(c);
> + i++;
> + } while (1);
> +
> + return 0;
> +}
> +
> +static void populate_physical_mask(struct device_node *np, u32 *mask, u32 *cluster_info)
> +{
> + struct device_node *dev_phandle __free(device_node);
...so this cleanups on return....
> + int cpu, i = 0, physical_id;
> +
> + do {
> + dev_phandle = of_parse_phandle(np, "cpus", i++);
BUT wont this be needed to be of_put, between calls to of_parse_phandle
inside this loop ? ... so cannot this be done like
int cpu, i = 0, physical_id;
while (1) {
struct device_node *dev_phandle __free(device_node) = of_parse_phandle(np, "cpus", i++);
if (!dev_phandle)
break;
cpu = of_cpu_node_to_id(dev_phandle);
if (cpu != -ENODEV) {
....
}
...not even build tested ... ah... :P
> + cpu = of_cpu_node_to_id(dev_phandle);
> + if (cpu != -ENODEV) {
> + physical_id = topology_core_id(cpu);
> + for (int j = 0; j < topology_cluster_id(cpu); j++)
> + physical_id += *(cluster_info + j);
> + *mask |= BIT(physical_id);
> + }
> + } while (dev_phandle);
> +}
> +
> +static struct cpufreq_memfreq_map *init_cpufreq_memfreq_map(struct device *dev,
> + struct scmi_memory_info *memory,
> + struct device_node *of_node,
> + u32 *cnt)
> +{
> + struct device_node *tbl_np __free(device_node), *opp_np __free(device_node);
> + struct cpufreq_memfreq_map *tbl;
> + int ret, i = 0;
> + u32 level, len;
> + u64 rate;
> +
> + tbl_np = of_parse_phandle(of_node, "operating-points-v2", 0);
> + if (!tbl_np)
> + return ERR_PTR(-ENODEV);
> +
> + len = min(of_get_available_child_count(tbl_np), MAX_MAP_ENTRIES);
> + if (len == 0)
> + return ERR_PTR(-ENODEV);
> +
> + tbl = devm_kzalloc(dev, (len + 1) * sizeof(struct cpufreq_memfreq_map),
> + GFP_KERNEL);
> + if (!tbl)
> + return ERR_PTR(-ENOMEM);
> +
> + for_each_available_child_of_node(tbl_np, opp_np) {
This seems to lack a of+node_put at the end but possibly the scoped
version for_each_available_child_of_node_scoped() will do it for you...
> + ret = of_property_read_u64_index(opp_np, "opp-hz", 0, &rate);
> + if (ret < 0)
> + return ERR_PTR(ret);
> +
> + tbl[i].cpufreq_mhz = rate / HZ_PER_MHZ;
> +
> + if (memory->hw_type != QCOM_MEM_TYPE_DDR_QOS) {
> + ret = of_property_read_u64_index(opp_np, "opp-hz", 1, &rate);
> + if (ret < 0)
> + return ERR_PTR(ret);
> +
> + tbl[i].memfreq_khz = rate / HZ_PER_KHZ;
> + } else {
> + ret = of_property_read_u32(opp_np, "opp-level", &level);
> + if (ret < 0)
> + return ERR_PTR(ret);
> +
> + tbl[i].memfreq_khz = level;
> + }
> +
> + dev_dbg(dev, "Entry%d CPU:%u, Mem:%u\n", i, tbl[i].cpufreq_mhz, tbl[i].memfreq_khz);
> + i++;
> + }
> + *cnt = len;
> +
> + return tbl;
> +}
> +
> +static int process_scmi_memlat_of_node(struct scmi_device *sdev, struct scmi_memlat_info *info)
> +{
> + struct scmi_monitor_info *monitor;
> + struct scmi_memory_info *memory;
> + char name[MAX_NAME_LEN];
> + u64 memfreq[2];
> + int ret;
> +
> + ret = populate_cluster_info(info->cluster_info);
> + if (ret < 0) {
> + dev_err_probe(&sdev->dev, ret, "failed to populate cluster info\n");
> + goto err;
> + }
> +
> + of_node_get(sdev->dev.of_node);
cant you use cleanup.h magic also for this and get rid of a few gotos down below ?
...this function seems the ideal case fot that...
> + do {
> + snprintf(name, sizeof(name), "memory-%d", info->memory_cnt);
> + struct device_node *memory_np __free(device_node) =
> + of_find_node_by_name(sdev->dev.of_node, name);
> +
> + if (!memory_np)
> + break;
> +
> + if (info->memory_cnt >= MAX_MEMORY_TYPES)
Shouldn't the MAX_MEMORY_TYPES something discoverable at runtime through
some command of your vendor protocol ? for better future scalability I
mean...maybe I am overthinking...
> + return dev_err_probe(&sdev->dev, -EINVAL,
> + "failed to parse unsupported memory type\n");
> +
> + memory = devm_kzalloc(&sdev->dev, sizeof(*memory), GFP_KERNEL);
> + if (!memory) {
> + ret = -ENOMEM;
> + goto err;
> + }
> +
Thanks,
Cristian
next prev parent reply other threads:[~2024-10-22 12:00 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-07 6:10 [PATCH V4 0/5] arm_scmi: vendors: Qualcomm Generic Vendor Extensions Sibi Sankar
2024-10-07 6:10 ` [PATCH V4 1/5] dt-bindings: firmware: Document bindings for QCOM SCMI Generic Extension Sibi Sankar
2024-10-07 18:06 ` Dmitry Baryshkov
2024-10-22 7:13 ` Sibi Sankar
2024-10-24 19:54 ` Dmitry Baryshkov
2024-10-08 6:47 ` Krzysztof Kozlowski
2024-10-08 6:49 ` Krzysztof Kozlowski
2024-10-08 12:10 ` Dmitry Baryshkov
2024-10-08 12:11 ` Krzysztof Kozlowski
2024-10-22 7:25 ` Sibi Sankar
2024-10-24 13:29 ` Krzysztof Kozlowski
2024-10-24 19:46 ` Dmitry Baryshkov
2024-10-24 19:48 ` Dmitry Baryshkov
2024-11-06 22:18 ` Jeffrey Hugo
2024-11-14 4:17 ` Sibi Sankar
2024-12-05 15:27 ` Sudeep Holla
2024-12-17 11:45 ` Sibi Sankar
2024-10-07 6:10 ` [PATCH V4 2/5] firmware: arm_scmi: Add QCOM Generic Vendor Protocol documentation Sibi Sankar
2024-10-22 10:22 ` Cristian Marussi
2024-11-14 4:32 ` Sibi Sankar
2024-10-07 6:10 ` [PATCH V4 3/5] firmware: arm_scmi: vendors: Add QCOM SCMI Generic Extensions Sibi Sankar
2024-10-07 18:13 ` Dmitry Baryshkov
2024-10-22 7:18 ` Sibi Sankar
2024-10-07 6:10 ` [PATCH V4 4/5] soc: qcom: Introduce SCMI based Memlat (Memory Latency) governor Sibi Sankar
2024-10-07 17:57 ` Dmitry Baryshkov
2024-10-22 8:18 ` Sibi Sankar
2024-10-26 18:16 ` Dmitry Baryshkov
2024-11-14 4:13 ` Sibi Sankar
2024-11-14 12:32 ` Dmitry Baryshkov
2024-12-05 10:52 ` Sibi Sankar
2024-12-05 11:30 ` Dmitry Baryshkov
2024-12-17 10:16 ` Sibi Sankar
2024-12-17 10:46 ` Dmitry Baryshkov
2024-12-17 11:05 ` Sibi Sankar
2024-12-17 12:10 ` Dmitry Baryshkov
2024-11-15 0:38 ` MyungJoo Ham
2024-12-05 10:17 ` Sibi Sankar
2024-10-28 8:30 ` Cristian Marussi
2024-10-10 12:18 ` Jonathan Cameron
2024-10-22 7:31 ` Sibi Sankar
2024-10-22 12:00 ` Cristian Marussi [this message]
2024-11-29 9:57 ` Shivnandan Kumar
2024-12-05 11:03 ` Sibi Sankar
2024-12-05 12:39 ` Cristian Marussi
2024-12-23 13:57 ` Sibi Sankar
2024-10-07 6:10 ` [PATCH V4 5/5] arm64: dts: qcom: x1e80100: Enable LLCC/DDR/DDR_QOS dvfs Sibi Sankar
2024-10-08 6:52 ` [PATCH V4 0/5] arm_scmi: vendors: Qualcomm Generic Vendor Extensions Krzysztof Kozlowski
2024-10-22 8:24 ` Sibi Sankar
2024-11-06 12:55 ` Johan Hovold
2024-11-06 20:03 ` Cristian Marussi
2024-11-08 15:14 ` Johan Hovold
2024-11-14 4:22 ` Sibi Sankar
2024-11-22 8:37 ` Johan Hovold
2024-12-05 10:56 ` Sibi Sankar
2024-12-05 15:52 ` Johan Hovold
2024-12-17 11:49 ` Sibi Sankar
2024-12-19 10:37 ` Johan Hovold
2024-12-23 14:00 ` Sibi Sankar
2024-12-05 17:01 ` Sudeep Holla
2024-12-17 12:25 ` Sibi Sankar
2024-12-17 14:45 ` Cristian Marussi
2024-12-23 14:09 ` Sibi Sankar
2024-12-17 17:59 ` Sudeep Holla
2024-12-23 14:14 ` Sibi Sankar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZxeT0rl4LJP17LiE@pluto \
--to=cristian.marussi@arm.com \
--cc=andersson@kernel.org \
--cc=arm-scmi@vger.kernel.org \
--cc=avajid@quicinc.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=quic_kshivnan@quicinc.com \
--cc=quic_rgottimu@quicinc.com \
--cc=quic_sibis@quicinc.com \
--cc=robh+dt@kernel.org \
--cc=sudeep.holla@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.