lkml.org 
[lkml]   [2021]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCHv3 6/6] fpga: stratix10-soc: extend driver for bitstream authentication
    On Mon, Jan 25, 2021 at 02:56:28PM -0600, richard.gong@linux.intel.com wrote:
    > From: Richard Gong <richard.gong@intel.com>
    >
    > Extend FPGA manager driver to support FPGA bitstream authentication on
    > Intel SocFPGA platforms.
    >
    > Signed-off-by: Richard Gong <richard.gong@intel.com>
    > ---
    > v3: add handle to retriev the firmware version to keep driver
    > back compatible
    > v2: use flag defined in stratix10-svc driver
    > ---
    > drivers/fpga/stratix10-soc.c | 62 +++++++++++++++++++++++++++++++++++++++-----
    > 1 file changed, 56 insertions(+), 6 deletions(-)
    >
    > diff --git a/drivers/fpga/stratix10-soc.c b/drivers/fpga/stratix10-soc.c
    > index 657a70c..59d738c 100644
    > --- a/drivers/fpga/stratix10-soc.c
    > +++ b/drivers/fpga/stratix10-soc.c
    > @@ -24,6 +24,10 @@
    > #define S10_BUFFER_TIMEOUT (msecs_to_jiffies(SVC_RECONFIG_BUFFER_TIMEOUT_MS))
    > #define S10_RECONFIG_TIMEOUT (msecs_to_jiffies(SVC_RECONFIG_REQUEST_TIMEOUT_MS))
    >
    > +#define INVALID_FIRMWARE_VERSION 0xFFFF
    > +typedef void (*s10_callback)(struct stratix10_svc_client *client,
    > + struct stratix10_svc_cb_data *data);
    > +
    > /*
    > * struct s10_svc_buf
    > * buf: virtual address of buf provided by service layer
    > @@ -40,11 +44,13 @@ struct s10_priv {
    > struct completion status_return_completion;
    > struct s10_svc_buf svc_bufs[NUM_SVC_BUFS];
    > unsigned long status;
    > + unsigned int fw_version;
    > };
    >
    > static int s10_svc_send_msg(struct s10_priv *priv,
    > enum stratix10_svc_command_code command,
    > - void *payload, u32 payload_length)
    > + void *payload, u32 payload_length,
    > + s10_callback callback)
    > {
    > struct stratix10_svc_chan *chan = priv->chan;
    > struct device *dev = priv->client.dev;
    > @@ -57,6 +63,7 @@ static int s10_svc_send_msg(struct s10_priv *priv,
    > msg.command = command;
    > msg.payload = payload;
    > msg.payload_length = payload_length;
    > + priv->client.receive_cb = callback;
    >
    > ret = stratix10_svc_send(chan, &msg);
    > dev_dbg(dev, "stratix10_svc_send returned status %d\n", ret);
    > @@ -134,6 +141,29 @@ static void s10_unlock_bufs(struct s10_priv *priv, void *kaddr)
    > }
    >
    > /*
    > + * s10_fw_version_callback - callback for the version of running firmware
    > + * @client: service layer client struct
    > + * @data: message from service layer
    > + */
    > +static void s10_fw_version_callback(struct stratix10_svc_client *client,
    > + struct stratix10_svc_cb_data *data)
    > +{
    > + struct s10_priv *priv = client->priv;
    > + unsigned int *version = (unsigned int *)data->kaddr1;
    > +
    > + if (data->status == BIT(SVC_STATUS_OK))
    > + priv->fw_version = *version;
    > + else if (data->status == BIT(SVC_STATUS_NO_SUPPORT))
    > + dev_warn(client->dev,
    > + "FW doesn't support bitstream authentication\n");
    > + else
    > + dev_err(client->dev, "Failed to get FW version %lu\n",
    > + BIT(data->status));
    > +
    > + complete(&priv->status_return_completion);
    > +}
    > +
    > +/*
    > * s10_receive_callback - callback for service layer to use to provide client
    > * (this driver) messages received through the mailbox.
    > * client: service layer client struct
    > @@ -186,13 +216,22 @@ static int s10_ops_write_init(struct fpga_manager *mgr,
    > if (info->flags & FPGA_MGR_PARTIAL_RECONFIG) {
    > dev_dbg(dev, "Requesting partial reconfiguration.\n");
    > ctype.flags |= BIT(COMMAND_RECONFIG_FLAG_PARTIAL);
    > + } else if (info->flags & FPGA_MGR_BITSTREM_AUTHENTICATION) {
    BITSTREAM ;-)

    Nit: Maybe the flag could be FPGA_MGR_BITSTREAM_AUTHENTICATE and/or
    FPGA_MGR_BITSTREAM_AUTH_AND_PERSIST.
    > + if (priv->fw_version == INVALID_FIRMWARE_VERSION) {
    > + dev_err(dev, "FW doesn't support\n");
    > + return -EINVAL;
    > + }
    > +
    > + dev_dbg(dev, "Requesting bitstream authentication.\n");
    > + ctype.flags |= BIT(COMMAND_AUTHENTICATE_BITSTREAM);
    > } else {
    > dev_dbg(dev, "Requesting full reconfiguration.\n");
    > }
    >
    > reinit_completion(&priv->status_return_completion);
    > ret = s10_svc_send_msg(priv, COMMAND_RECONFIG,
    > - &ctype, sizeof(ctype));
    > + &ctype, sizeof(ctype),
    > + s10_receive_callback);
    > if (ret < 0)
    > goto init_done;
    >
    > @@ -259,7 +298,7 @@ static int s10_send_buf(struct fpga_manager *mgr, const char *buf, size_t count)
    > svc_buf = priv->svc_bufs[i].buf;
    > memcpy(svc_buf, buf, xfer_sz);
    > ret = s10_svc_send_msg(priv, COMMAND_RECONFIG_DATA_SUBMIT,
    > - svc_buf, xfer_sz);
    > + svc_buf, xfer_sz, s10_receive_callback);
    > if (ret < 0) {
    > dev_err(dev,
    > "Error while sending data to service layer (%d)", ret);
    > @@ -303,7 +342,7 @@ static int s10_ops_write(struct fpga_manager *mgr, const char *buf,
    >
    > ret = s10_svc_send_msg(
    > priv, COMMAND_RECONFIG_DATA_CLAIM,
    > - NULL, 0);
    > + NULL, 0, s10_receive_callback);
    > if (ret < 0)
    > break;
    > }
    > @@ -357,7 +396,8 @@ static int s10_ops_write_complete(struct fpga_manager *mgr,
    > do {
    > reinit_completion(&priv->status_return_completion);
    >
    > - ret = s10_svc_send_msg(priv, COMMAND_RECONFIG_STATUS, NULL, 0);
    > + ret = s10_svc_send_msg(priv, COMMAND_RECONFIG_STATUS,
    > + NULL, 0, s10_receive_callback);
    > if (ret < 0)
    > break;
    >
    > @@ -411,8 +451,9 @@ static int s10_probe(struct platform_device *pdev)
    > if (!priv)
    > return -ENOMEM;
    >
    > + priv->fw_version = INVALID_FIRMWARE_VERSION;
    > priv->client.dev = dev;
    > - priv->client.receive_cb = s10_receive_callback;
    > + priv->client.receive_cb = NULL;
    > priv->client.priv = priv;
    >
    > priv->chan = stratix10_svc_request_channel_byname(&priv->client,
    > @@ -440,6 +481,15 @@ static int s10_probe(struct platform_device *pdev)
    > goto probe_err;
    > }
    >
    > + /* get the running firmware version */
    > + ret = s10_svc_send_msg(priv, COMMAND_FIRMWARE_VERSION,
    > + NULL, 0, s10_fw_version_callback);
    > + if (ret) {
    > + dev_err(dev, "couldn't get firmware version\n");
    > + fpga_mgr_free(mgr);
    > + goto probe_err;
    > + }
    > +
    > platform_set_drvdata(pdev, mgr);
    > return ret;
    >
    > --
    > 2.7.4
    >
    Thanks,
    Moritz

    \
     
     \ /
      Last update: 2021-01-27 02:10    [W:2.479 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site