diff options
| -rw-r--r-- | drivers/firmware/tegra/bpmp.c | 25 | ||||
| -rw-r--r-- | include/soc/tegra/bpmp.h | 7 | 
2 files changed, 32 insertions, 0 deletions
| diff --git a/drivers/firmware/tegra/bpmp.c b/drivers/firmware/tegra/bpmp.c index a3d5b518c10e..90c6089fed84 100644 --- a/drivers/firmware/tegra/bpmp.c +++ b/drivers/firmware/tegra/bpmp.c @@ -470,6 +470,31 @@ unlock:  }  EXPORT_SYMBOL_GPL(tegra_bpmp_free_mrq); +bool tegra_bpmp_mrq_is_supported(struct tegra_bpmp *bpmp, unsigned int mrq) +{ +	struct mrq_query_abi_request req = { .mrq = cpu_to_le32(mrq) }; +	struct mrq_query_abi_response resp; +	struct tegra_bpmp_message msg = { +		.mrq = MRQ_QUERY_ABI, +		.tx = { +			.data = &req, +			.size = sizeof(req), +		}, +		.rx = { +			.data = &resp, +			.size = sizeof(resp), +		}, +	}; +	int ret; + +	ret = tegra_bpmp_transfer(bpmp, &msg); +	if (ret || msg.rx.ret) +		return false; + +	return resp.status == 0; +} +EXPORT_SYMBOL_GPL(tegra_bpmp_mrq_is_supported); +  static void tegra_bpmp_mrq_handle_ping(unsigned int mrq,  				       struct tegra_bpmp_channel *channel,  				       void *data) diff --git a/include/soc/tegra/bpmp.h b/include/soc/tegra/bpmp.h index e69e4c4d80ae..b02f926a0216 100644 --- a/include/soc/tegra/bpmp.h +++ b/include/soc/tegra/bpmp.h @@ -129,6 +129,7 @@ int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,  			   tegra_bpmp_mrq_handler_t handler, void *data);  void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,  			 void *data); +bool tegra_bpmp_mrq_is_supported(struct tegra_bpmp *bpmp, unsigned int mrq);  #else  static inline struct tegra_bpmp *tegra_bpmp_get(struct device *dev)  { @@ -164,6 +165,12 @@ static inline void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp,  				       unsigned int mrq, void *data)  {  } + +static inline bool tegra_bpmp_mrq_is_supported(struct tegra_bpmp *bpmp, +					      unsigned int mrq) +{ +	return false; +}  #endif  #if IS_ENABLED(CONFIG_CLK_TEGRA_BPMP) | 
