linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Michal Simek <michal.simek@xilinx.com>
Cc: "Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	"Sören Brinkmann" <soren.brinkmann@xilinx.com>,
	"Lucas Stach" <l.stach@pengutronix.de>,
	"Michal Simek" <monstr@monstr.eu>,
	"yangbo lu" <yangbo.lu@nxp.com>,
	"Andreas Färber" <afaerber@suse.de>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	"Alexandre Belloni" <alexandre.belloni@free-electrons.com>,
	"Baoyou Xie" <baoyou.xie@linaro.org>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Nicolas Ferre" <nicolas.ferre@microchip.com>,
	"Simon Horman" <horms+renesas@verge.net.au>
Subject: Re: [PATCH 3/3] soc: xilinx: zynqmp: Add firmware interface
Date: Mon, 14 Aug 2017 17:06:54 +0200	[thread overview]
Message-ID: <CAK8P3a1UhKAhYx2fCoWGm7HMka+8XrzFCxEphYNdyNS7yYR8cA@mail.gmail.com> (raw)
In-Reply-To: <98038734d73c604dee6ac0d34740d5bc2034e87d.1501854302.git.michal.simek@xilinx.com>

On Fri, Aug 4, 2017 at 3:45 PM, Michal Simek <michal.simek@xilinx.com> wrote:
> +static noinline int do_fw_call_smc(u64 arg0, u64 arg1, u64 arg2,
> +                                  u32 *ret_payload)
> +{
> +       struct arm_smccc_res res;
> +
> +       arm_smccc_smc(arg0, arg1, arg2, 0, 0, 0, 0, 0, &res);
> +
> +       if (ret_payload) {
> +               ret_payload[0] = (u32)res.a0;
> +               ret_payload[1] = (u32)(res.a0 >> 32);
> +               ret_payload[2] = (u32)res.a1;
> +               ret_payload[3] = (u32)(res.a1 >> 32);
> +               ret_payload[4] = (u32)res.a2;
> +       }
> +
> +       return zynqmp_pm_ret_code((enum pm_ret_status)res.a0);
> +}

It looks like you forgot to add the cpu_to_le32/le32_to_cpu conversions
here to make this work on big-endian kernels.

> +
> +static u32 pm_api_version;
> +
> +/**
> + * zynqmp_pm_get_api_version - Get version number of PMU PM firmware
> + * @version:   Returned version value
> + *
> + * Return:     Returns status, either success or error+reason
> + */
> +int zynqmp_pm_get_api_version(u32 *version)
> +{
> +       u32 ret_payload[PAYLOAD_ARG_CNT];
> +
> +       if (!version)
> +               return zynqmp_pm_ret_code(XST_PM_CONFLICT);
> +
> +       /* Check is PM API version already verified */
> +       if (pm_api_version > 0) {
> +               *version = pm_api_version;
> +               return XST_PM_SUCCESS;
> +       }
> +       invoke_pm_fn(GET_API_VERSION, 0, 0, 0, 0, ret_payload);
> +       *version = ret_payload[1];
> +
> +       return zynqmp_pm_ret_code((enum pm_ret_status)ret_payload[0]);
> +}
> +EXPORT_SYMBOL_GPL(zynqmp_pm_get_api_version);

How is this supposed to be used? API version number interfaces
are generally problematic, as you don't have that interface any
more if you change the version.

Normally this should be based on the "compatible" string
in DT to find our what you are talking to, in combination with
a list of features that you can query to find out if something
is available that you can't just try out by calling.

> diff --git a/include/linux/soc/xilinx/zynqmp/firmware.h b/include/linux/soc/xilinx/zynqmp/firmware.h
> new file mode 100644
> index 000000000000..5beb5988e3de
> --- /dev/null
> +++ b/include/linux/soc/xilinx/zynqmp/firmware.h
> @@ -0,0 +1,246 @@
> +
> +#ifndef __SOC_ZYNQMP_FIRMWARE_H__
> +#define __SOC_ZYNQMP_FIRMWARE_H__
> +
> +#define ZYNQMP_PM_VERSION_MAJOR        0
> +#define ZYNQMP_PM_VERSION_MINOR        3

Again, having the version number hardcoded in a global constant
seems pointless. If you expect to have to support different incompatible
versions in the future, name the header file firmware-0-3.h and
prefix the constants with the current version.

> +/*
> + * Internal functions
> + */
> +int invoke_pm_fn(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3,
> +                u32 *ret_payload);
> +int zynqmp_pm_ret_code(u32 ret_status);
> +
> +/* Miscellaneous API functions */
> +int zynqmp_pm_get_api_version(u32 *version);
> +int zynqmp_pm_get_chipid(u32 *idcode, u32 *version);

The "internal" functions probably shouldn't be declared in a global
header file.

      Arnd

  reply	other threads:[~2017-08-14 15:06 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-04 13:45 [PATCH 0/3] arm64 xilinx zynqmp firmware interface Michal Simek
2017-08-04 13:45 ` [PATCH 1/3] dt: xilinx: zynqmp: Add bindings for PM firmware Michal Simek
2017-08-10 19:10   ` Rob Herring
2017-08-11 12:58     ` Michal Simek
2017-08-11 13:54       ` Edgar E. Iglesias
2017-08-14 13:47         ` Michal Simek
2017-08-14 14:03           ` Rob Herring
2017-08-14 14:35             ` Michal Simek
2017-08-04 13:45 ` [PATCH 2/3] arm64: zynqmp: dt: Add PM firmware node Michal Simek
2017-08-04 13:45 ` [PATCH 3/3] soc: xilinx: zynqmp: Add firmware interface Michal Simek
2017-08-14 15:06   ` Arnd Bergmann [this message]
2017-08-16 11:51     ` Michal Simek
2017-08-16 12:05       ` Michal Simek
2017-08-16 12:41       ` Arnd Bergmann
2017-08-16 14:00         ` Michal Simek
2017-08-16 14:34           ` Michal Simek
2017-08-16 15:05             ` Arnd Bergmann
2017-08-17 10:48               ` Michal Simek
2017-08-17 21:11                 ` Arnd Bergmann
2017-08-18 12:14                   ` Michal Simek
2017-08-05  4:23 ` [PATCH 0/3] arm64 xilinx zynqmp " Alexander Graf
2017-08-07  6:09   ` Michal Simek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAK8P3a1UhKAhYx2fCoWGm7HMka+8XrzFCxEphYNdyNS7yYR8cA@mail.gmail.com \
    --to=arnd@arndb.de \
    --cc=afaerber@suse.de \
    --cc=alexandre.belloni@free-electrons.com \
    --cc=baoyou.xie@linaro.org \
    --cc=geert+renesas@glider.be \
    --cc=horms+renesas@verge.net.au \
    --cc=l.stach@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michal.simek@xilinx.com \
    --cc=monstr@monstr.eu \
    --cc=nicolas.ferre@microchip.com \
    --cc=shawnguo@kernel.org \
    --cc=soren.brinkmann@xilinx.com \
    --cc=yangbo.lu@nxp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).