Skip to content

Commit

Permalink
Merge branch 'for-6.7/firmware' into for-6.7/memory
Browse files Browse the repository at this point in the history
  • Loading branch information
thierryreding committed Oct 13, 2023
2 parents 0bb80ec + ea608a0 commit 364b40c
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
30 changes: 30 additions & 0 deletions drivers/firmware/tegra/bpmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

static int __maybe_unused tegra_bpmp_resume(struct device *dev);

int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
struct tegra_bpmp_message *msg)
{
Expand All @@ -325,6 +327,14 @@ int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
if (!tegra_bpmp_message_valid(msg))
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;

spin_lock(&bpmp->atomic_tx_lock);
Expand Down Expand Up @@ -364,6 +374,14 @@ int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
if (!tegra_bpmp_message_valid(msg))
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,
msg->tx.size);
if (IS_ERR(channel))
Expand Down Expand Up @@ -796,17 +814,29 @@ static int tegra_bpmp_probe(struct platform_device *pdev)
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)
{
struct tegra_bpmp *bpmp = dev_get_drvdata(dev);

bpmp->suspended = false;

if (bpmp->soc->ops->resume)
return bpmp->soc->ops->resume(bpmp);
else
return 0;
}

static const struct dev_pm_ops tegra_bpmp_pm_ops = {
.suspend_noirq = tegra_bpmp_suspend,
.resume_noirq = tegra_bpmp_resume,
};

Expand Down
2 changes: 1 addition & 1 deletion include/soc/tegra/bpmp-abi.h
Original file line number Diff line number Diff line change
Expand Up @@ -1194,7 +1194,7 @@ struct cmd_clk_is_enabled_request {
*/
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
* master invoking the command earlier.
*
Expand Down
6 changes: 6 additions & 0 deletions include/soc/tegra/bpmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,12 @@ struct tegra_bpmp {
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_mirror;
#endif

bool suspended;
};

#define TEGRA_BPMP_MESSAGE_RESET BIT(0)

struct tegra_bpmp_message {
unsigned int mrq;

Expand All @@ -117,6 +121,8 @@ struct tegra_bpmp_message {
size_t size;
int ret;
} rx;

unsigned long flags;
};

#if IS_ENABLED(CONFIG_TEGRA_BPMP)
Expand Down

0 comments on commit 364b40c

Please sign in to comment.