public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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

  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