On 17/10/2018 07:37, Timo Alho wrote: > Add a helper function to check that firmware is supporting a given MRQ > command. > > Signed-off-by: Timo Alho <talho@xxxxxxxxxx> > --- > drivers/firmware/tegra/bpmp.c | 28 ++++++++++++++++++++++++++++ > include/soc/tegra/bpmp.h | 7 +++++++ > 2 files changed, 35 insertions(+) > > diff --git a/drivers/firmware/tegra/bpmp.c b/drivers/firmware/tegra/bpmp.c > index 41448ba..5bb46a5 100644 > --- a/drivers/firmware/tegra/bpmp.c > +++ b/drivers/firmware/tegra/bpmp.c > @@ -470,6 +470,34 @@ void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq, void *data) > } > 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 != 0 || msg.rx.ret != 0) { > + /* something went wrong; assume not supported */ > + dev_warn(bpmp->dev, "tegra_bpmp_transfer failed\n"); > + return false; > + } > + > + return resp.status != 0 ? false : true; Nit-pick ... seems that the '!=' is not necessary if you switch the false and true around like the original version of this. > +} > +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 e69e4c4..b02f926 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) > Otherwise ... Acked-by: Jon Hunter <jonathanh@xxxxxxxxxx> Cheers, Jon -- nvpublic