Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp708809imm; Wed, 18 Jul 2018 09:18:21 -0700 (PDT) X-Google-Smtp-Source: AAOMgpeBp33HxCVMefQHEs5VQgzujQefG4Ap3GTKCke7xOV+uZgYKtZV9LpuCNvm6yRRMLs+LP4X X-Received: by 2002:a62:5543:: with SMTP id j64-v6mr5830075pfb.188.1531930701786; Wed, 18 Jul 2018 09:18:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531930701; cv=none; d=google.com; s=arc-20160816; b=rBTHx4Ran25Df7tgRSe+ZACKA/sqREmmHR/QtXj0r+6WtkzYOu0B4RqSc/RUe6LquU m5xz56ddiamTPS/NaJ/+N+OGfbEMNU55B4cLvM22B8jRgDq734TugMRbegS6sTT4S51T iQFCJx9KnbMxWxT/QzQeylVVsuZzvpeIdzH91zYvqG5gfSnYRz/663NyXyzGc7vYTpzC up4Tc2niiNs/QGoxMNATl4ZAb6HpaDAlwoO6K3PUOy1/wEUM7pALfPTlt7DhOjRJEpW0 lKLMHK8S+zH9kGterx/R3QofUCoS0ocT/xCmrF7TEkRk9Jo9AEgP+iSYNtoRY/AlaRYu 4d+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=8XqvqQsGtQL30d3xL7tWT+R/V95kTU+gWbl7eI3J8QA=; b=m79Dk0Pl1Hs2kkRVG7ErIJxe5GhST5hX8BlO4x1qFks0HdZ5PtFn8JDjRr+EwrdF0U rBk71V/XbahUNj4/cmMQWK6rXYi8BuEbnOkQUMqt6w0wvkJWPIp3VDy9Kb3cv/mipMDK JD9ydKnQKWQ4O+utfmjn3N0N3wXeC8dwGOQ7w7y8BQSwr4gS0QBUT7FW9IsWAo5CrQkT 9W/wRJNsv3l68/eBW2u7XBxB9B2MuapCsaAmk8R+vXIbJUXbaKDL/05US4vHlg3FqEaz crJ5oixhX5PjlN+dzwVSnK7cXL2HbTEY9+4QP3rtwICkNdtEvJZWotbat8KBCKh8Zthl yXcw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r59-v6si3385087plb.314.2018.07.18.09.18.06; Wed, 18 Jul 2018 09:18:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731778AbeGRQzh (ORCPT + 99 others); Wed, 18 Jul 2018 12:55:37 -0400 Received: from mga06.intel.com ([134.134.136.31]:52005 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731726AbeGRQzg (ORCPT ); Wed, 18 Jul 2018 12:55:36 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Jul 2018 09:16:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,370,1526367600"; d="scan'208";a="67947168" Received: from marshy.an.intel.com ([10.122.105.159]) by orsmga003.jf.intel.com with ESMTP; 18 Jul 2018 09:16:42 -0700 From: richard.gong@linux.intel.com To: gregkh@linuxfoundation.org, catalin.marinas@arm.com, will.deacon@arm.com, dinguyen@kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, atull@kernel.org, mdf@kernel.org, arnd@arndb.de, corbet@lwn.net Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-fpga@vger.kernel.org, linux-doc@vger.kernel.org, yves.vandervennet@linux.intel.com, richard.gong@intel.com Subject: [PATCHv7 9/9] misc: add remote status update client support Date: Wed, 18 Jul 2018 11:18:44 -0500 Message-Id: <1531930724-22061-10-git-send-email-richard.gong@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531930724-22061-1-git-send-email-richard.gong@linux.intel.com> References: <1531930724-22061-1-git-send-email-richard.gong@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Richard Gong Extend Intel Stratix10 service layer to support the second service layer client, Remote Status Update (RSU). RSU is used to provide our customers with protection against loading bas bitstreams onto their devices when those device are booting from flash. Signed-off-by: Richard Gong Signed-off-by: Alan Tull --- v7: this patch is added in patch set version 7 --- drivers/misc/stratix10-smc.h | 9 +++++++++ drivers/misc/stratix10-svc.c | 39 ++++++++++++++++++++++++++++-------- include/linux/stratix10-svc-client.h | 20 ++++++++++++++++-- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/drivers/misc/stratix10-smc.h b/drivers/misc/stratix10-smc.h index d1275e9..2857e69 100644 --- a/drivers/misc/stratix10-smc.h +++ b/drivers/misc/stratix10-smc.h @@ -67,12 +67,21 @@ * * INTEL_SIP_SMC_FPGA_CONFIG_STATUS_ERROR: * There is error during the FPGA configuration process. + * + * INTEL_SIP_SMC_REG_ERROR: + * There is error during a read or write operation of the protected registers. + * + * INTEL_SIP_SMC_RSU_ERROR: + * There is error during a remote status update. */ #define INTEL_SIP_SMC_RETURN_UNKNOWN_FUNCTION 0xFFFFFFFF #define INTEL_SIP_SMC_STATUS_OK 0x0 #define INTEL_SIP_SMC_FPGA_CONFIG_STATUS_BUSY 0x1 #define INTEL_SIP_SMC_FPGA_CONFIG_STATUS_REJECTED 0x2 #define INTEL_SIP_SMC_FPGA_CONFIG_STATUS_ERROR 0x4 +#define INTEL_SIP_SMC_REG_ERROR 0x5 +#define INTEL_SIP_SMC_RSU_ERROR 0x6 + /** * Request INTEL_SIP_SMC_FPGA_CONFIG_START diff --git a/drivers/misc/stratix10-svc.c b/drivers/misc/stratix10-svc.c index eefd08b..c26ed20 100644 --- a/drivers/misc/stratix10-svc.c +++ b/drivers/misc/stratix10-svc.c @@ -36,7 +36,7 @@ * timeout is set to 30 seconds (30 * 1000) at Intel Stratix10 SoC. */ #define SVC_NUM_DATA_IN_FIFO 32 -#define SVC_NUM_CHANNEL 1 +#define SVC_NUM_CHANNEL 2 #define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 200 #define FPGA_CONFIG_STATUS_TIMEOUT_SEC 30 @@ -271,7 +271,7 @@ static void svc_thread_cmd_config_status(struct stratix10_svc_controller *ctrl, * @cb_data: pointer to callback data structure to service client * @res: result from SMC or HVC call * - * Send back the correspond status to the service client (FPGA manager etc). + * Send back the correspond status to the service clients. */ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data, struct stratix10_svc_cb_data *cb_data, @@ -407,6 +407,16 @@ static int svc_normal_to_secure_thread(void *data) a1 = 0; a2 = 0; break; + case COMMAND_RSU_STATUS: + a0 = INTEL_SIP_SMC_RSU_STATUS; + a1 = 0; + a2 = 0; + break; + case COMMAND_RSU_UPDATE: + a0 = INTEL_SIP_SMC_RSU_UPDATE; + a1 = pdata->arg[0]; + a2 = 0; + break; default: pr_warn("it shouldn't happen\n"); break; @@ -423,6 +433,19 @@ static int svc_normal_to_secure_thread(void *data) (unsigned int)res.a1, (unsigned int)res.a2); pr_debug(" res.a3=0x%016x\n", (unsigned int)res.a3); + if (pdata->command == COMMAND_RSU_STATUS) { + if (res.a0 == INTEL_SIP_SMC_RSU_ERROR) + cbdata->status = BIT(SVC_STATUS_RSU_ERROR); + else + cbdata->status = BIT(SVC_STATUS_RSU_OK); + + cbdata->kaddr1 = &res; + cbdata->kaddr2 = NULL; + cbdata->kaddr3 = NULL; + pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata); + continue; + } + switch (res.a0) { case INTEL_SIP_SMC_STATUS_OK: svc_thread_recv_status_ok(pdata, cbdata, res); @@ -446,12 +469,7 @@ static int svc_normal_to_secure_thread(void *data) pr_debug("%s: STATUS_REJECTED\n", __func__); break; case INTEL_SIP_SMC_FPGA_CONFIG_STATUS_ERROR: - pr_err("%s: STATUS_ERROR\n", __func__); - cbdata->status = BIT(SVC_STATUS_RECONFIG_ERROR); - cbdata->kaddr1 = NULL; - cbdata->kaddr2 = NULL; - cbdata->kaddr3 = NULL; - pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata); + svc_thread_recv_status_err(pdata, cbdata, res); break; default: pr_warn("it shouldn't happen\n"); @@ -972,6 +990,11 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) chans[0].name = SVC_CLIENT_FPGA; spin_lock_init(&chans[0].lock); + chans[1].scl = NULL; + chans[1].ctrl = controller; + chans[1].name = SVC_CLIENT_RSU; + spin_lock_init(&chans[1].lock); + list_add_tail(&controller->node, &svc_ctrl); platform_set_drvdata(pdev, controller); diff --git a/include/linux/stratix10-svc-client.h b/include/linux/stratix10-svc-client.h index 4e5f0af..f7b09e3 100644 --- a/include/linux/stratix10-svc-client.h +++ b/include/linux/stratix10-svc-client.h @@ -10,8 +10,10 @@ * Service layer driver supports client names * * fpga: for FPGA configuration + * rsu: for remote status update */ #define SVC_CLIENT_FPGA "fpga" +#define SVC_CLIENT_RSU "rsu" /** * Status of the sent command, in bit number @@ -36,6 +38,9 @@ * * SVC_COMMAND_STATUS_RECONFIG_ERROR: * Error encountered during FPGA configuration. + * + * SVC_STATUS_RSU_OK: + * Secure firmware accepts the request of remote status update (RSU). */ #define SVC_STATUS_RECONFIG_REQUEST_OK 0 #define SVC_STATUS_RECONFIG_BUFFER_SUBMITTED 1 @@ -43,7 +48,8 @@ #define SVC_STATUS_RECONFIG_COMPLETED 3 #define SVC_STATUS_RECONFIG_BUSY 4 #define SVC_STATUS_RECONFIG_ERROR 5 - +#define SVC_STATUS_RSU_OK 6 +#define SVC_STATUS_RSU_ERROR 7 /** * Flag bit for COMMAND_RECONFIG * @@ -56,9 +62,11 @@ /** * Timeout settings for service clients: * timeout value used in Stratix10 FPGA manager driver. + * timeout value used in RSU driver */ #define SVC_RECONFIG_REQUEST_TIMEOUT_MS 100 #define SVC_RECONFIG_BUFFER_TIMEOUT_MS 240 +#define SVC_RSU_REQUEST_TIMEOUT_MS 300 struct stratix10_svc_chan; @@ -81,13 +89,21 @@ struct stratix10_svc_chan; * @COMMAND_RECONFIG_STATUS: check the status of the configuration, return * status is SVC_STATUS_RECONFIG_COMPLETED, or SVC_STATUS_RECONFIG_BUSY, or * SVC_STATUS_RECONFIG_ERROR + * + * @COMMAND_RSU_STATUS: request remote system update boot log, return status + * is log data or SVC_STATUS_RSU_ERROR + * + * @COMMAND_RSU_UPDATE: set the offset of the bitstream to boot after reboot, + * return status is SVC_STATUS_RSU_OK or SVC_STATUS_RSU_ERROR */ enum stratix10_svc_command_code { COMMAND_NOOP = 0, COMMAND_RECONFIG, COMMAND_RECONFIG_DATA_SUBMIT, COMMAND_RECONFIG_DATA_CLAIM, - COMMAND_RECONFIG_STATUS + COMMAND_RECONFIG_STATUS, + COMMAND_RSU_STATUS, + COMMAND_RSU_UPDATE }; /** -- 2.7.4