Commit 9e6e423a authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'tegra-for-6.7-firmware' of...

Merge tag 'tegra-for-6.7-firmware' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into soc/drivers

firmware: tegra: Changes for v6.7-rc1

Contains a typofix and a new mechanism to help fix an issue that can
seemingly hang the system during early resume.

* tag 'tegra-for-6.7-firmware' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
  firmware: tegra: Add suspend hook and reset BPMP IPC early on resume
  firmware: tegra: Fix a typo

Link: https://lore.kernel.org/r/20231013153723.1729109-2-thierry.reding@gmail.comSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 024d4292 ea608a01
...@@ -313,6 +313,8 @@ static ssize_t tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel, ...@@ -313,6 +313,8 @@ static ssize_t tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel,
return __tegra_bpmp_channel_write(channel, mrq, flags, data, size); return __tegra_bpmp_channel_write(channel, mrq, flags, data, size);
} }
static int __maybe_unused tegra_bpmp_resume(struct device *dev);
int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp, int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
struct tegra_bpmp_message *msg) struct tegra_bpmp_message *msg)
{ {
...@@ -325,6 +327,14 @@ int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp, ...@@ -325,6 +327,14 @@ int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
if (!tegra_bpmp_message_valid(msg)) if (!tegra_bpmp_message_valid(msg))
return -EINVAL; return -EINVAL;
if (bpmp->suspended) {
/* Reset BPMP IPC channels during resume based on flags passed */
if (msg->flags & TEGRA_BPMP_MESSAGE_RESET)
tegra_bpmp_resume(bpmp->dev);
else
return -EAGAIN;
}
channel = bpmp->tx_channel; channel = bpmp->tx_channel;
spin_lock(&bpmp->atomic_tx_lock); spin_lock(&bpmp->atomic_tx_lock);
...@@ -364,6 +374,14 @@ int tegra_bpmp_transfer(struct tegra_bpmp *bpmp, ...@@ -364,6 +374,14 @@ int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
if (!tegra_bpmp_message_valid(msg)) if (!tegra_bpmp_message_valid(msg))
return -EINVAL; return -EINVAL;
if (bpmp->suspended) {
/* Reset BPMP IPC channels during resume based on flags passed */
if (msg->flags & TEGRA_BPMP_MESSAGE_RESET)
tegra_bpmp_resume(bpmp->dev);
else
return -EAGAIN;
}
channel = tegra_bpmp_write_threaded(bpmp, msg->mrq, msg->tx.data, channel = tegra_bpmp_write_threaded(bpmp, msg->mrq, msg->tx.data,
msg->tx.size); msg->tx.size);
if (IS_ERR(channel)) if (IS_ERR(channel))
...@@ -796,10 +814,21 @@ static int tegra_bpmp_probe(struct platform_device *pdev) ...@@ -796,10 +814,21 @@ static int tegra_bpmp_probe(struct platform_device *pdev)
return err; return err;
} }
static int __maybe_unused tegra_bpmp_suspend(struct device *dev)
{
struct tegra_bpmp *bpmp = dev_get_drvdata(dev);
bpmp->suspended = true;
return 0;
}
static int __maybe_unused tegra_bpmp_resume(struct device *dev) static int __maybe_unused tegra_bpmp_resume(struct device *dev)
{ {
struct tegra_bpmp *bpmp = dev_get_drvdata(dev); struct tegra_bpmp *bpmp = dev_get_drvdata(dev);
bpmp->suspended = false;
if (bpmp->soc->ops->resume) if (bpmp->soc->ops->resume)
return bpmp->soc->ops->resume(bpmp); return bpmp->soc->ops->resume(bpmp);
else else
...@@ -807,6 +836,7 @@ static int __maybe_unused tegra_bpmp_resume(struct device *dev) ...@@ -807,6 +836,7 @@ static int __maybe_unused tegra_bpmp_resume(struct device *dev)
} }
static const struct dev_pm_ops tegra_bpmp_pm_ops = { static const struct dev_pm_ops tegra_bpmp_pm_ops = {
.suspend_noirq = tegra_bpmp_suspend,
.resume_noirq = tegra_bpmp_resume, .resume_noirq = tegra_bpmp_resume,
}; };
......
...@@ -1194,7 +1194,7 @@ struct cmd_clk_is_enabled_request { ...@@ -1194,7 +1194,7 @@ struct cmd_clk_is_enabled_request {
*/ */
struct cmd_clk_is_enabled_response { struct cmd_clk_is_enabled_response {
/** /**
* @brief The state of the clock that has been succesfully * @brief The state of the clock that has been successfully
* requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the * requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the
* master invoking the command earlier. * master invoking the command earlier.
* *
......
...@@ -102,8 +102,12 @@ struct tegra_bpmp { ...@@ -102,8 +102,12 @@ struct tegra_bpmp {
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_mirror; struct dentry *debugfs_mirror;
#endif #endif
bool suspended;
}; };
#define TEGRA_BPMP_MESSAGE_RESET BIT(0)
struct tegra_bpmp_message { struct tegra_bpmp_message {
unsigned int mrq; unsigned int mrq;
...@@ -117,6 +121,8 @@ struct tegra_bpmp_message { ...@@ -117,6 +121,8 @@ struct tegra_bpmp_message {
size_t size; size_t size;
int ret; int ret;
} rx; } rx;
unsigned long flags;
}; };
#if IS_ENABLED(CONFIG_TEGRA_BPMP) #if IS_ENABLED(CONFIG_TEGRA_BPMP)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment