From: Krzysztof Kozlowski <krzk@kernel.org>
To: Michal Wilczynski <m.wilczynski@samsung.com>,
mturquette@baylibre.com, sboyd@kernel.org, robh@kernel.org,
krzk+dt@kernel.org, conor+dt@kernel.org, drew@pdp7.com,
guoren@kernel.org, wefu@redhat.com, jassisinghbrar@gmail.com,
paul.walmsley@sifive.com, palmer@dabbelt.com,
aou@eecs.berkeley.edu, frank.binns@imgtec.com,
matt.coster@imgtec.com, maarten.lankhorst@linux.intel.com,
mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com,
simona@ffwll.ch, ulf.hansson@linaro.org, jszhang@kernel.org,
p.zabel@pengutronix.de, m.szyprowski@samsung.com
Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
dri-devel@lists.freedesktop.org, linux-pm@vger.kernel.org
Subject: Re: [RFC PATCH v2 05/19] firmware: thead: Add AON firmware protocol driver
Date: Mon, 23 Dec 2024 17:17:03 +0100 [thread overview]
Message-ID: <ef07641d-ced2-4a45-89cd-d119e503dd14@kernel.org> (raw)
In-Reply-To: <20241223125553.3527812-6-m.wilczynski@samsung.com>
On 23/12/2024 13:55, Michal Wilczynski wrote:
> The T-Head TH1520 SoC uses an E902 co-processor running Always-On (AON)
> firmware to manage power, clock, and other system resources [1]. This
> patch introduces a driver implementing the AON firmware protocol,
> allowing the Linux kernel to communicate with the firmware via mailbox
> channels. Through an RPC-based interface, the kernel can initiate power
> state transitions, update resource configurations, and perform other
> AON-related tasks.
>
> Link: https://openbeagle.org/beaglev-ahead/beaglev-ahead/-/blob/main/docs/TH1520%20System%20User%20Manual.pdf [1]
>
> Signed-off-by: Michal Wilczynski <m.wilczynski@samsung.com>
> ---
> MAINTAINERS | 2 +
> drivers/firmware/Kconfig | 9 +
> drivers/firmware/Makefile | 1 +
> drivers/firmware/thead,th1520-aon.c | 203 ++++++++++++++++++
> .../linux/firmware/thead/thead,th1520-aon.h | 186 ++++++++++++++++
> 5 files changed, 401 insertions(+)
> create mode 100644 drivers/firmware/thead,th1520-aon.c
> create mode 100644 include/linux/firmware/thead/thead,th1520-aon.h
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 7705d1b6dd7a..42aef66bd257 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -20196,10 +20196,12 @@ F: Documentation/devicetree/bindings/pinctrl/thead,th1520-pinctrl.yaml
> F: Documentation/devicetree/bindings/power/thead,th1520-power.yaml
> F: arch/riscv/boot/dts/thead/
> F: drivers/clk/thead/clk-th1520-ap.c
> +F: drivers/firmware/thead,th1520-aon.c
> F: drivers/mailbox/mailbox-th1520.c
> F: drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
> F: drivers/pinctrl/pinctrl-th1520.c
> F: include/dt-bindings/clock/thead,th1520-clk-ap.h
> +F: include/linux/firmware/thead/thead,th1520-aon.h
>
> RNBD BLOCK DRIVERS
> M: Md. Haris Iqbal <haris.iqbal@ionos.com>
> diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
> index 71d8b26c4103..e08e01de3ee3 100644
> --- a/drivers/firmware/Kconfig
> +++ b/drivers/firmware/Kconfig
> @@ -212,6 +212,15 @@ config SYSFB_SIMPLEFB
>
> If unsure, say Y.
>
> +config TH1520_AON_PROTOCOL
> + tristate "Always-On firmware protocol"
> + depends on THEAD_TH1520_MBOX
Would:
|| COMPILE_TEST
work?
What sort of dependency is this? Build time? Runtime? If runtime, this
should be just dependency on ARCH_THEAD (or whatever is there)
> + help
> + Power, clock, and resource management capabilities on the TH1520 SoC are
> + managed by the E902 core. Firmware running on this core communicates with
> + the kernel through the Always-On protocol, using hardware mailbox as a medium.
> + Say yes if you need such capabilities.
> +
...
> +static void th1520_aon_rx_callback(struct mbox_client *c, void *rx_msg)
> +{
> + struct th1520_aon_chan *aon_chan =
> + container_of(c, struct th1520_aon_chan, cl);
> + struct th1520_aon_rpc_msg_hdr *hdr =
> + (struct th1520_aon_rpc_msg_hdr *)rx_msg;
> + u8 recv_size = sizeof(struct th1520_aon_rpc_msg_hdr) + hdr->size;
> +
> + if (recv_size != sizeof(struct th1520_aon_rpc_ack_common)) {
> + dev_err(c->dev, "Invalid ack size, not completing\n");
> + return;
> + }
> +
> + memcpy(&aon_chan->ack_msg, rx_msg, recv_size);
> + complete(&aon_chan->done);
> +}
> +
You need proper (and useful) kerneldoc for all exported functions.
> +int th1520_aon_call_rpc(struct th1520_aon_chan *aon_chan, void *msg)
> +{
> + struct th1520_aon_rpc_msg_hdr *hdr = msg;
> + int ret;
> +
> + mutex_lock(&aon_chan->transaction_lock);
> + reinit_completion(&aon_chan->done);
> +
> + RPC_SET_VER(hdr, TH1520_AON_RPC_VERSION);
> + RPC_SET_SVC_ID(hdr, hdr->svc);
> + RPC_SET_SVC_FLAG_MSG_TYPE(hdr, RPC_SVC_MSG_TYPE_DATA);
> + RPC_SET_SVC_FLAG_ACK_TYPE(hdr, RPC_SVC_MSG_NEED_ACK);
> +
> + ret = mbox_send_message(aon_chan->ch, msg);
> + if (ret < 0) {
> + dev_err(aon_chan->cl.dev, "RPC send msg failed: %d\n", ret);
> + goto out;
> + }
> +
> + if (!wait_for_completion_timeout(&aon_chan->done, MAX_RX_TIMEOUT)) {
> + dev_err(aon_chan->cl.dev, "RPC send msg timeout\n");
> + mutex_unlock(&aon_chan->transaction_lock);
> + return -ETIMEDOUT;
> + }
> +
> + ret = aon_chan->ack_msg.err_code;
> +
> +out:
> + mutex_unlock(&aon_chan->transaction_lock);
> +
> + return th1520_aon_to_linux_errno(ret);
> +}
> +EXPORT_SYMBOL_GPL(th1520_aon_call_rpc);
> +
Here as well.
> +int th1520_aon_power_update(struct th1520_aon_chan *aon_chan, u16 rsrc,
> + bool power_on)
> +{
> + struct th1520_aon_msg_req_set_resource_power_mode msg = {};
> + struct th1520_aon_rpc_msg_hdr *hdr = &msg.hdr;
> + int ret;
> +
> + hdr->svc = TH1520_AON_RPC_SVC_PM;
> + hdr->func = TH1520_AON_PM_FUNC_SET_RESOURCE_POWER_MODE;
> + hdr->size = TH1520_AON_RPC_MSG_NUM;
> +
> + RPC_SET_BE16(&msg.resource, 0, rsrc);
> + RPC_SET_BE16(&msg.resource, 2,
> + (power_on ? TH1520_AON_PM_PW_MODE_ON :
> + TH1520_AON_PM_PW_MODE_OFF));
> +
> + ret = th1520_aon_call_rpc(aon_chan, &msg);
> + if (ret)
> + dev_err(aon_chan->cl.dev, "failed to power %s resource %d ret %d\n",
> + power_on ? "up" : "off", rsrc, ret);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(th1520_aon_power_update);
> +
> +static int th1520_aon_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct th1520_aon_chan *aon_chan;
> + struct mbox_client *cl;
> + int ret;
> +
> + aon_chan = devm_kzalloc(dev, sizeof(*aon_chan), GFP_KERNEL);
> + if (!aon_chan)
> + return -ENOMEM;
> +
> + cl = &aon_chan->cl;
> + cl->dev = dev;
> + cl->tx_block = true;
> + cl->tx_tout = MAX_TX_TIMEOUT;
> + cl->rx_callback = th1520_aon_rx_callback;
> +
> + aon_chan->ch = mbox_request_channel_byname(cl, "aon");
> + if (IS_ERR(aon_chan->ch)) {
> + ret = PTR_ERR(aon_chan->ch);
> + if (ret != -EPROBE_DEFER)
> + dev_err(dev, "Failed to request aon mbox chan ret %d\n",
> + ret);
You just open-coded dev_err_probe. Syntax is:
return dev_err_probe()
> + return ret;
> + }
> +
> + mutex_init(&aon_chan->transaction_lock);
> + init_completion(&aon_chan->done);
> +
> + platform_set_drvdata(pdev, aon_chan);
> +
> + return devm_of_platform_populate(dev);
> +}
> +
No remove() callback to free mbox channel? Looks like a leak.
Best regards,
Krzysztof
next prev parent reply other threads:[~2024-12-23 16:17 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20241223125600eucas1p22d9257e92c798e9f4346a76d1d0fc73d@eucas1p2.samsung.com>
2024-12-23 12:55 ` [RFC PATCH v2 00/19] Enable drm/imagination BXM-4-64 Support for LicheePi 4A Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 01/19] dt-bindings: clock: Add VO subsystem clocks and update address requirements Michal Wilczynski
2024-12-23 16:05 ` Krzysztof Kozlowski
2024-12-23 20:50 ` Stephen Boyd
2024-12-24 8:53 ` Krzysztof Kozlowski
2024-12-24 9:23 ` Michal Wilczynski
2024-12-24 13:33 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 02/19] clk: thead: Add clock support for VO subsystem in T-Head TH1520 SoC Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 03/19] dt-bindings: power: thead,th1520: Add support for power domains Michal Wilczynski
2024-12-23 15:16 ` Rob Herring (Arm)
2024-12-23 16:02 ` Michal Wilczynski
2024-12-23 16:06 ` Krzysztof Kozlowski
2024-12-23 16:09 ` Krzysztof Kozlowski
2024-12-24 9:31 ` Michal Wilczynski
2024-12-24 13:32 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 04/19] dt-bindings: firmware: thead,th1520: Add support for firmware node Michal Wilczynski
2024-12-23 16:11 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 05/19] firmware: thead: Add AON firmware protocol driver Michal Wilczynski
2024-12-23 16:17 ` Krzysztof Kozlowski [this message]
2024-12-23 12:55 ` [RFC PATCH v2 06/19] soc: thead: power-domain: Add power-domain driver for TH1520 Michal Wilczynski
2024-12-23 16:20 ` Krzysztof Kozlowski
2024-12-23 16:26 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 07/19] riscv: Enable PM_GENERIC_DOMAINS for T-Head SoCs Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 08/19] dt-bindings: reset: Add T-HEAD TH1520 SoC Reset Controller Michal Wilczynski
2024-12-23 16:22 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 09/19] reset: thead: Add TH1520 reset controller driver Michal Wilczynski
2024-12-23 16:25 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 10/19] drm/imagination: Add reset controller support for GPU initialization Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 11/19] dt-bindings: gpu: Add 'resets' property " Michal Wilczynski
2024-12-23 16:29 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 12/19] dt-bindings: gpu: Add compatibles for T-HEAD TH1520 GPU Michal Wilczynski
2024-12-23 16:31 ` Krzysztof Kozlowski
2024-12-23 12:55 ` [RFC PATCH v2 13/19] drm/imagination: Add support for IMG BXM-4-64 GPU Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 14/19] drm/imagination: Enable PowerVR driver for RISC-V Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 15/19] riscv: dts: thead: Extend device tree clk with VO reg Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 16/19] riscv: dts: thead: Add mailbox node Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 17/19] riscv: dts: thead: Introduce power domain nodes with aon firmware Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 18/19] riscv: dts: thead: Introduce reset controller node Michal Wilczynski
2024-12-23 12:55 ` [RFC PATCH v2 19/19] riscv: dts: thead: Add GPU node to TH1520 device tree Michal Wilczynski
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=ef07641d-ced2-4a45-89cd-d119e503dd14@kernel.org \
--to=krzk@kernel.org \
--cc=airlied@gmail.com \
--cc=aou@eecs.berkeley.edu \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=drew@pdp7.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=frank.binns@imgtec.com \
--cc=guoren@kernel.org \
--cc=jassisinghbrar@gmail.com \
--cc=jszhang@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=m.szyprowski@samsung.com \
--cc=m.wilczynski@samsung.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matt.coster@imgtec.com \
--cc=mripard@kernel.org \
--cc=mturquette@baylibre.com \
--cc=p.zabel@pengutronix.de \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=robh@kernel.org \
--cc=sboyd@kernel.org \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
--cc=ulf.hansson@linaro.org \
--cc=wefu@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox