mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 17:41:22 +00:00
ff555fc553
On some NXP platforms (e.g i.MX7ULP) the poweroff and reboot operations are done via a separate remote core. Typically Linux needs to send a message to the remote core and requests for poweroff or reboot. By default the communication between Linux core and the remote core is is done via a blocking mailbox mechanism but Linux doesn't allow blocking operations in the system off (reboot, power off) handlers. So, we need to make sure the mailbox message send operations do not block for this specific operations. Fortunately, Linux allows us to register handlers that are called in preparation of the system off operations. Thus, before carrying the power off or reboot preparations, just destroy the existing mailboxes and create them as non-blocking. Note that power off and restart are totally different operations and are not complementary. We introduce a new flag in the imx remoteproc per device data which tells us when a device needs this special setup. For now, only imx7ulp needs it. Signed-off-by: Peng Fan <peng.fan@nxp.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Link: https://lore.kernel.org/r/20240822-imx_rproc-v3-2-6d943723945d@nxp.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
46 lines
931 B
C
46 lines
931 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2017 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>
|
|
* Copyright 2021 NXP
|
|
*/
|
|
|
|
#ifndef _IMX_RPROC_H
|
|
#define _IMX_RPROC_H
|
|
|
|
/* address translation table */
|
|
struct imx_rproc_att {
|
|
u32 da; /* device address (From Cortex M4 view)*/
|
|
u32 sa; /* system bus address */
|
|
u32 size; /* size of reg range */
|
|
int flags;
|
|
};
|
|
|
|
/* Remote core start/stop method */
|
|
enum imx_rproc_method {
|
|
IMX_RPROC_NONE,
|
|
/* Through syscon regmap */
|
|
IMX_RPROC_MMIO,
|
|
/* Through ARM SMCCC */
|
|
IMX_RPROC_SMC,
|
|
/* Through System Control Unit API */
|
|
IMX_RPROC_SCU_API,
|
|
};
|
|
|
|
/* dcfg flags */
|
|
#define IMX_RPROC_NEED_SYSTEM_OFF BIT(0)
|
|
|
|
struct imx_rproc_dcfg {
|
|
u32 src_reg;
|
|
u32 src_mask;
|
|
u32 src_start;
|
|
u32 src_stop;
|
|
u32 gpr_reg;
|
|
u32 gpr_wait;
|
|
const struct imx_rproc_att *att;
|
|
size_t att_size;
|
|
enum imx_rproc_method method;
|
|
u32 flags;
|
|
};
|
|
|
|
#endif /* _IMX_RPROC_H */
|