2023-07-24 02:26:17

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 0/8] firmware: imx: scu/scu-irq: misc update

From: Peng Fan <[email protected]>

V3:
Fix build error reported by kernel robot
Add patch subject-prefix

V2:
Fix build warning

Dong Aisheng (2):
firmware: imx: scu: change init level to subsys_initcall_sync
firmware: imx: scu: increase RPC timeout

Peng Fan (4):
firmware: imx: scu: drop return value check
firmware: imx: scu: use soc name for soc_id
firmware: imx: scu-irq: export imx_scu_irq_get_status
firmware: imx: scu-irq: enlarge the IMX_SC_IRQ_NUM_GROUP

Ranjani Vaidyanathan (1):
firmware: imx: scu-irq: support identifying SCU wakeup source from
sysfs

Robin Gong (1):
firmware: imx: scu-irq: fix RCU complains after M4 partition reset

drivers/firmware/imx/imx-scu-irq.c | 116 +++++++++++++++++++++++------
drivers/firmware/imx/imx-scu-soc.c | 19 ++---
drivers/firmware/imx/imx-scu.c | 9 ++-
include/linux/firmware/imx/sci.h | 6 ++
4 files changed, 114 insertions(+), 36 deletions(-)

--
2.37.1



2023-07-24 02:31:33

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 7/8] firmware: imx: scu-irq: enlarge the IMX_SC_IRQ_NUM_GROUP

From: Peng Fan <[email protected]>

Per SCFW update, update the IMX_SC_IRQ_NUM_GROUP to 9.

Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu-irq.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/firmware/imx/imx-scu-irq.c b/drivers/firmware/imx/imx-scu-irq.c
index 6549f3792a0f..8d902db1daf2 100644
--- a/drivers/firmware/imx/imx-scu-irq.c
+++ b/drivers/firmware/imx/imx-scu-irq.c
@@ -14,7 +14,7 @@

#define IMX_SC_IRQ_FUNC_ENABLE 1
#define IMX_SC_IRQ_FUNC_STATUS 2
-#define IMX_SC_IRQ_NUM_GROUP 4
+#define IMX_SC_IRQ_NUM_GROUP 9

static u32 mu_resource_id;

--
2.37.1


2023-07-24 02:41:12

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 4/8] firmware: imx: scu: use soc name for soc_id

From: Peng Fan <[email protected]>

Same as soc-imx8m and soc-imx driver, use soc name for soc_id

Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu-soc.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/firmware/imx/imx-scu-soc.c b/drivers/firmware/imx/imx-scu-soc.c
index ef9103987e76..cb8377670a7d 100644
--- a/drivers/firmware/imx/imx-scu-soc.c
+++ b/drivers/firmware/imx/imx-scu-soc.c
@@ -107,10 +107,12 @@ int imx_scu_soc_init(struct device *dev)
return -EINVAL;

/* format soc_id value passed from SCU firmware */
- val = id & 0x1f;
- soc_dev_attr->soc_id = devm_kasprintf(dev, GFP_KERNEL, "0x%x", val);
- if (!soc_dev_attr->soc_id)
- return -ENOMEM;
+ if (of_machine_is_compatible("fsl,imx8qm"))
+ soc_dev_attr->soc_id = "i.MX8QM";
+ else if (of_machine_is_compatible("fsl,imx8qxp"))
+ soc_dev_attr->soc_id = "i.MX8QXP";
+ else if (of_machine_is_compatible("fsl,imx8dxl"))
+ soc_dev_attr->soc_id = "i.MX8DXL";

/* format revision value passed from SCU firmware */
val = (id >> 5) & 0xf;
--
2.37.1


2023-07-24 02:49:11

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 2/8] firmware: imx: scu: increase RPC timeout

From: Dong Aisheng <[email protected]>

When system loading is high, we can met some command timeout
issue occasionaly, so increase the timeout to a more safe value.

Signed-off-by: Dong Aisheng <[email protected]>
Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/firmware/imx/imx-scu.c b/drivers/firmware/imx/imx-scu.c
index 2d24359420d8..14ff9d3504bf 100644
--- a/drivers/firmware/imx/imx-scu.c
+++ b/drivers/firmware/imx/imx-scu.c
@@ -20,7 +20,7 @@
#include <linux/platform_device.h>

#define SCU_MU_CHAN_NUM 8
-#define MAX_RX_TIMEOUT (msecs_to_jiffies(30))
+#define MAX_RX_TIMEOUT (msecs_to_jiffies(3000))

struct imx_sc_chan {
struct imx_sc_ipc *sc_ipc;
--
2.37.1


2023-07-24 03:15:12

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 5/8] firmware: imx: scu-irq: fix RCU complains after M4 partition reset

From: Robin Gong <[email protected]>

Use blocking_notifier_chain instead of atomic_notifier_chain, otherwise
below RCU complains would come out since unregister/register_virtio_device
() will issue mbox message (mbox_send_message() is blocking) again after
received M4 partition reset. Actually, no need atomic for notifier which
is so tough for user since this notifier is called in worker instead of
interrupt handler directly.

[ 389.706645] i2c-rpmsg virtio0.rpmsg-i2c-channel.-1.2: i2c rpmsg driver is removed
[ 389.767362] Wait for remote ready timeout, use first_notify.
[ 389.774084] ------------[ cut here ]------------
[ 389.778729] WARNING: CPU: 0 PID: 397 at kernel/rcu/tree_plugin.h:293 rcu_note_context_switch+0x34/0x338
[ 389.788131] Modules linked in:
[ 389.791195] CPU: 0 PID: 397 Comm: kworker/0:13 Not tainted 5.4.0-rc5-02977-g08f78722f07b #26
[ 389.799633] Hardware name: Freescale i.MX8DXL Phantom MEK (DT)
[ 389.805481] Workqueue: events imx_scu_irq_work_handler

Signed-off-by: Robin Gong <[email protected]>
Reviewed-by: Dong Aisheng <[email protected]>
Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu-irq.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/firmware/imx/imx-scu-irq.c b/drivers/firmware/imx/imx-scu-irq.c
index d9dcc20945c6..4408f150b3d5 100644
--- a/drivers/firmware/imx/imx-scu-irq.c
+++ b/drivers/firmware/imx/imx-scu-irq.c
@@ -42,25 +42,25 @@ struct imx_sc_msg_irq_enable {

static struct imx_sc_ipc *imx_sc_irq_ipc_handle;
static struct work_struct imx_sc_irq_work;
-static ATOMIC_NOTIFIER_HEAD(imx_scu_irq_notifier_chain);
+static BLOCKING_NOTIFIER_HEAD(imx_scu_irq_notifier_chain);

int imx_scu_irq_register_notifier(struct notifier_block *nb)
{
- return atomic_notifier_chain_register(
+ return blocking_notifier_chain_register(
&imx_scu_irq_notifier_chain, nb);
}
EXPORT_SYMBOL(imx_scu_irq_register_notifier);

int imx_scu_irq_unregister_notifier(struct notifier_block *nb)
{
- return atomic_notifier_chain_unregister(
+ return blocking_notifier_chain_unregister(
&imx_scu_irq_notifier_chain, nb);
}
EXPORT_SYMBOL(imx_scu_irq_unregister_notifier);

static int imx_scu_irq_notifier_call_chain(unsigned long status, u8 *group)
{
- return atomic_notifier_call_chain(&imx_scu_irq_notifier_chain,
+ return blocking_notifier_call_chain(&imx_scu_irq_notifier_chain,
status, (void *)group);
}

--
2.37.1


2023-07-24 03:22:13

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 1/8] firmware: imx: scu: change init level to subsys_initcall_sync

From: Dong Aisheng <[email protected]>

Change firmware init level to subsys_initcall_sync to ensure it's
probed before most devices to avoid unnecessary defer probe.

Signed-off-by: Dong Aisheng <[email protected]>
Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/firmware/imx/imx-scu.c b/drivers/firmware/imx/imx-scu.c
index 47db49911e7b..2d24359420d8 100644
--- a/drivers/firmware/imx/imx-scu.c
+++ b/drivers/firmware/imx/imx-scu.c
@@ -353,7 +353,12 @@ static struct platform_driver imx_scu_driver = {
},
.probe = imx_scu_probe,
};
-builtin_platform_driver(imx_scu_driver);
+
+static int __init imx_scu_driver_init(void)
+{
+ return platform_driver_register(&imx_scu_driver);
+}
+subsys_initcall_sync(imx_scu_driver_init);

MODULE_AUTHOR("Dong Aisheng <[email protected]>");
MODULE_DESCRIPTION("IMX SCU firmware protocol driver");
--
2.37.1


2023-07-24 03:41:22

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 3/8] firmware: imx: scu: drop return value check

From: Peng Fan <[email protected]>

For IMX_SC_MISC_FUNC_UNIQUE_ID, the scfw has a return value,
and the imx-scu always return 0. So drop the return value check.

BTW, also initialize msg to 0.

Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu-soc.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/firmware/imx/imx-scu-soc.c b/drivers/firmware/imx/imx-scu-soc.c
index 2f32353de2c9..ef9103987e76 100644
--- a/drivers/firmware/imx/imx-scu-soc.c
+++ b/drivers/firmware/imx/imx-scu-soc.c
@@ -33,20 +33,15 @@ struct imx_sc_msg_misc_get_soc_uid {

static int imx_scu_soc_uid(u64 *soc_uid)
{
- struct imx_sc_msg_misc_get_soc_uid msg;
+ struct imx_sc_msg_misc_get_soc_uid msg = { 0 };
struct imx_sc_rpc_msg *hdr = &msg.hdr;
- int ret;

hdr->ver = IMX_SC_RPC_VERSION;
hdr->svc = IMX_SC_RPC_SVC_MISC;
hdr->func = IMX_SC_MISC_FUNC_UNIQUE_ID;
hdr->size = 1;

- ret = imx_scu_call_rpc(imx_sc_soc_ipc_handle, &msg, true);
- if (ret) {
- pr_err("%s: get soc uid failed, ret %d\n", __func__, ret);
- return ret;
- }
+ imx_scu_call_rpc(imx_sc_soc_ipc_handle, &msg, true);

*soc_uid = msg.uid_high;
*soc_uid <<= 32;
--
2.37.1


2023-07-24 03:47:08

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH 10/10] arm64: dts: imx8dxl: update scu-pd compatible

From: Peng Fan <[email protected]>

Per dt-bindings, add "fsl,imx8dxl-scu-pd" compatible string for scu-pd
node

Signed-off-by: Peng Fan <[email protected]>
---
arch/arm64/boot/dts/freescale/imx8dxl.dtsi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/freescale/imx8dxl.dtsi b/arch/arm64/boot/dts/freescale/imx8dxl.dtsi
index 792b7224ca5b..32c69619f22b 100644
--- a/arch/arm64/boot/dts/freescale/imx8dxl.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8dxl.dtsi
@@ -122,7 +122,7 @@ &lsio_mu1 1 0
&lsio_mu1 3 3>;

pd: power-controller {
- compatible = "fsl,scu-pd";
+ compatible = "fsl,imx8dxl-scu-pd", "fsl,scu-pd";
#power-domain-cells = <1>;
wakeup-irq = <160 163 235 236 237 228 229 230 231 238
239 240 166 169>;
--
2.37.1


2023-07-24 03:49:56

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V3 8/8] firmware: imx: scu-irq: support identifying SCU wakeup source from sysfs

From: Ranjani Vaidyanathan <[email protected]>

Record SCU wakeup interrupt in /sys/power/pm_wakeup_irq
The user can further identify the exact wakeup source by using the
following interface:
cat /sys/firmware/scu_wakeup_source/wakeup_src

The above will print the wake groups and the irqs that could have
contributed to waking up the kernel. For example if ON/OFF button was the
wakeup source:
cat /sys/firmware/scu_wakeup_source/wakeup_src
Wakeup source group = 3, irq = 0x1

The user can refer to the SCFW API documentation to identify all the
wake groups and irqs.

Signed-off-by: Ranjani Vaidyanathan <[email protected]>
Signed-off-by: Peng Fan <[email protected]>
---
drivers/firmware/imx/imx-scu-irq.c | 66 +++++++++++++++++++++++++++---
1 file changed, 61 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/imx/imx-scu-irq.c b/drivers/firmware/imx/imx-scu-irq.c
index 8d902db1daf2..79efbf259dd7 100644
--- a/drivers/firmware/imx/imx-scu-irq.c
+++ b/drivers/firmware/imx/imx-scu-irq.c
@@ -11,6 +11,8 @@
#include <linux/firmware/imx/sci.h>
#include <linux/mailbox_client.h>
#include <linux/suspend.h>
+#include <linux/sysfs.h>
+#include <linux/kobject.h>

#define IMX_SC_IRQ_FUNC_ENABLE 1
#define IMX_SC_IRQ_FUNC_STATUS 2
@@ -40,6 +42,20 @@ struct imx_sc_msg_irq_enable {
u8 enable;
} __packed;

+struct scu_wakeup {
+ u32 mask;
+ u32 wakeup_src;
+ bool valid;
+};
+
+/* Sysfs functions */
+struct kobject *wakeup_obj;
+static ssize_t wakeup_source_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
+static struct kobj_attribute wakeup_source_attr =
+ __ATTR(wakeup_src, 0660, wakeup_source_show, NULL);
+
+static struct scu_wakeup scu_irq_wakeup[IMX_SC_IRQ_NUM_GROUP];
+
static struct imx_sc_ipc *imx_sc_irq_ipc_handle;
static struct work_struct imx_sc_irq_work;
static BLOCKING_NOTIFIER_HEAD(imx_scu_irq_notifier_chain);
@@ -71,16 +87,24 @@ static void imx_scu_irq_work_handler(struct work_struct *work)
u8 i;

for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) {
+ if (scu_irq_wakeup[i].mask) {
+ scu_irq_wakeup[i].valid = false;
+ scu_irq_wakeup[i].wakeup_src = 0;
+ }
ret = imx_scu_irq_get_status(i, &irq_status);
if (ret) {
- pr_err("get irq group %d status failed, ret %d\n",
- i, ret);
+ pr_err("get irq group %d status failed, ret %d\n", i, ret);
return;
}

if (!irq_status)
continue;
-
+ if (scu_irq_wakeup[i].mask & irq_status) {
+ scu_irq_wakeup[i].valid = true;
+ scu_irq_wakeup[i].wakeup_src = irq_status & scu_irq_wakeup[i].mask;
+ } else {
+ scu_irq_wakeup[i].wakeup_src = irq_status;
+ }
pm_system_wakeup();
imx_scu_irq_notifier_call_chain(irq_status, &i);
}
@@ -135,6 +159,11 @@ int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable)
pr_err("enable irq failed, group %d, mask %d, ret %d\n",
group, mask, ret);

+ if (enable)
+ scu_irq_wakeup[group].mask |= mask;
+ else
+ scu_irq_wakeup[group].mask &= ~mask;
+
return ret;
}
EXPORT_SYMBOL(imx_scu_irq_group_enable);
@@ -144,6 +173,25 @@ static void imx_scu_irq_callback(struct mbox_client *c, void *msg)
schedule_work(&imx_sc_irq_work);
}

+static ssize_t wakeup_source_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
+{
+ int i;
+
+ for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) {
+ if (!scu_irq_wakeup[i].wakeup_src)
+ continue;
+
+ if (scu_irq_wakeup[i].valid)
+ sprintf(buf, "Wakeup source group = %d, irq = 0x%x\n",
+ i, scu_irq_wakeup[i].wakeup_src);
+ else
+ sprintf(buf, "Spurious SCU wakeup, group = %d, irq = 0x%x\n",
+ i, scu_irq_wakeup[i].wakeup_src);
+ }
+
+ return strlen(buf);
+}
+
int imx_scu_enable_general_irq_channel(struct device *dev)
{
struct of_phandle_args spec;
@@ -173,8 +221,7 @@ int imx_scu_enable_general_irq_channel(struct device *dev)

INIT_WORK(&imx_sc_irq_work, imx_scu_irq_work_handler);

- if (!of_parse_phandle_with_args(dev->of_node, "mboxes",
- "#mbox-cells", 0, &spec))
+ if (!of_parse_phandle_with_args(dev->of_node, "mboxes", "#mbox-cells", 0, &spec))
i = of_alias_get_id(spec.np, "mu");

/* use mu1 as general mu irq channel if failed */
@@ -183,6 +230,15 @@ int imx_scu_enable_general_irq_channel(struct device *dev)

mu_resource_id = IMX_SC_R_MU_0A + i;

+ /* Create directory under /sysfs/firmware */
+ wakeup_obj = kobject_create_and_add("scu_wakeup_source", firmware_kobj);
+
+ if (sysfs_create_file(wakeup_obj, &wakeup_source_attr.attr)) {
+ pr_err("Cannot create sysfs file......\n");
+ kobject_put(wakeup_obj);
+ sysfs_remove_file(firmware_kobj, &wakeup_source_attr.attr);
+ }
+
return ret;
}
EXPORT_SYMBOL(imx_scu_enable_general_irq_channel);
--
2.37.1


2023-07-24 04:19:05

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH 09/10] dt-bindings: power: fsl,scu-pd: support i.MX8DXL

From: Peng Fan <[email protected]>

Add compatible string for i.MX8DXL

Signed-off-by: Peng Fan <[email protected]>
---
Documentation/devicetree/bindings/power/fsl,scu-pd.yaml | 1 +
1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/power/fsl,scu-pd.yaml b/Documentation/devicetree/bindings/power/fsl,scu-pd.yaml
index 407b7cfec783..4d38f9cceaab 100644
--- a/Documentation/devicetree/bindings/power/fsl,scu-pd.yaml
+++ b/Documentation/devicetree/bindings/power/fsl,scu-pd.yaml
@@ -20,6 +20,7 @@ properties:
compatible:
items:
- enum:
+ - fsl,imx8dxl-scu-pd
- fsl,imx8qm-scu-pd
- fsl,imx8qxp-scu-pd
- const: fsl,scu-pd
--
2.37.1


2023-07-24 08:57:42

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 09/10] dt-bindings: power: fsl,scu-pd: support i.MX8DXL

On 24/07/2023 03:47, Peng Fan (OSS) wrote:
> From: Peng Fan <[email protected]>
>
> Add compatible string for i.MX8DXL
>
> Signed-off-by: Peng Fan <[email protected]>

Please use scripts/get_maintainers.pl to get a list of necessary people
and lists to CC. It might happen, that command when run on an older
kernel, gives you outdated entries. Therefore please be sure you base
your patches on recent Linux kernel.

You missed at least DT list (maybe more), so this won't be tested by
automated tooling. Performing review on untested code might be a waste
of time, thus I will skip this patch entirely till you follow the
process allowing the patch to be tested.

Please kindly resend and include all necessary To/Cc entries.

Best regards,
Krzysztof


2023-07-24 09:48:39

by Peng Fan

[permalink] [raw]
Subject: RE: [PATCH 09/10] dt-bindings: power: fsl,scu-pd: support i.MX8DXL

> Subject: Re: [PATCH 09/10] dt-bindings: power: fsl,scu-pd: support i.MX8DXL
>
> On 24/07/2023 03:47, Peng Fan (OSS) wrote:
> > From: Peng Fan <[email protected]>
> >
> > Add compatible string for i.MX8DXL
> >
> > Signed-off-by: Peng Fan <[email protected]>
>
> Please use scripts/get_maintainers.pl to get a list of necessary people and
> lists to CC. It might happen, that command when run on an older kernel,
> gives you outdated entries. Therefore please be sure you base your patches
> on recent Linux kernel.
>
> You missed at least DT list (maybe more), so this won't be tested by
> automated tooling. Performing review on untested code might be a waste of
> time, thus I will skip this patch entirely till you follow the process allowing
> the patch to be tested.
>
> Please kindly resend and include all necessary To/Cc entries.

This patch was sent out in a wrong patchset. Sorry for the noise.

Thanks,
Peng.

>
> Best regards,
> Krzysztof