From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CB7BEA09FF for ; Wed, 30 Dec 2020 04:04:49 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C090A2C55; Wed, 30 Dec 2020 04:04:48 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 97CF2C8DC; Wed, 30 Dec 2020 04:04:45 +0100 (CET) IronPort-SDR: QgaZY7F9rL6bxEnsTN/WVZBo5Imy/2e8G73sREwZHTSWQ3Gvy+Hym7lAu+bU2GHCUfZlX2aESy jZoDl0MCL07g== X-IronPort-AV: E=McAfee;i="6000,8403,9849"; a="238116311" X-IronPort-AV: E=Sophos;i="5.78,460,1599548400"; d="scan'208";a="238116311" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Dec 2020 19:04:43 -0800 IronPort-SDR: oNJik66KR8BGP4nLo+NTxxOBPv8NpewZCQ7YuoQwx0spT9VI1micIiQlefuHWYJ8dNO4tx8xB3 syJFvWW8MYSw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,460,1599548400"; d="scan'208";a="385052564" Received: from orsmsx602.amr.corp.intel.com ([10.22.229.15]) by orsmga007.jf.intel.com with ESMTP; 29 Dec 2020 19:04:43 -0800 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX602.amr.corp.intel.com (10.22.229.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Tue, 29 Dec 2020 19:04:42 -0800 Received: from ORSEDG601.ED.cps.intel.com (10.7.248.6) by orsmsx610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5 via Frontend Transport; Tue, 29 Dec 2020 19:04:42 -0800 Received: from NAM02-BL2-obe.outbound.protection.outlook.com (104.47.38.55) by edgegateway.intel.com (134.134.137.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.1713.5; Tue, 29 Dec 2020 19:04:42 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dBEUQAJGmn7gEVWW4BJdsAiFR0eB9vYX66daiGrQfjiidXbkJCx25IjI2wAZWv55pfDRwva+6Q1hjpEO8E4CNYGhRICwiSdKL8wx+S/kPwfBB3oLkJXk5R69muZV+CDPWLNJpENDk/Ap1gH5rrSR8enuLL20YT9RfSqXb4kqHOEX/F2UpRzuv/rhBveiycB351um7bx5rFxKrosUUlxxLEgHznQ1ndkAK5mO40UxnGQZvQnjWxzWM93BMzNd31vAP1i/wt0mdLBNszrXAjb1HaPaZ1vM7vu1ateTQItazlT/FHXLltbcw8fh80E6kNQ+ZQ0+uCCmYcxtHZgZFS1l1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=N9ilDS/YPT7Jr6YVdp21oeyi8Rwt6yFQ9Pbho0AwCq4=; b=aHSOKP2yDWgLnObFxsCdJiVWXF5B5SlxezD2v40xwQNIt4DLfH4zkYB3oXf9JSZNQo5imWiV1m5zyv+pVIHPVm1A9dwCq27DMxb4qZxZi0TLhvFl5XTa+LT8k4p8aWhpb6HzuUxJaZmymd8oYZwD+hrBsF9ptE+1yBI0VACD+GqVN3qg2l3GX+Yz22jBX+mhsAbum3udkgVYV5H6nysrYHONE3oceC4F6CqoWIcTrJlNZ5TJGjuITyysjW8F1iYjstrjiG6B7p3g5repWyKobmJuj9uMqnDNLBoZ9bQafM/pyV0mYkqo0fbcOyH5hrjGJ17AMT4kIw3FrTg3CqoNsw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=N9ilDS/YPT7Jr6YVdp21oeyi8Rwt6yFQ9Pbho0AwCq4=; b=X738KGojahyqaiWbTeA08ARmsHJsWqado+5dAWzqI7dtnLihV2oucxJQkuzl2qNrjquBDX26g2BeGhTN4reHwlinaaEv+7tQawyweXlf5ZEcVTqFHO3PaIudzXqdfI/1xN+xZiZKAhnds2zfkjohW3/9bXxfdeRfQ15VssxwWUM= Received: from DM6PR11MB3131.namprd11.prod.outlook.com (2603:10b6:5:6d::32) by DM6PR11MB3579.namprd11.prod.outlook.com (2603:10b6:5:13c::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3700.27; Wed, 30 Dec 2020 03:04:39 +0000 Received: from DM6PR11MB3131.namprd11.prod.outlook.com ([fe80::4dbf:9e9b:fc2b:137]) by DM6PR11MB3131.namprd11.prod.outlook.com ([fe80::4dbf:9e9b:fc2b:137%5]) with mapi id 15.20.3700.031; Wed, 30 Dec 2020 03:04:39 +0000 From: "Zhang, Tianfei" To: "Huang, Wei" , "dev@dpdk.org" , "Xu, Rosen" , "Zhang, Qi Z" CC: "stable@dpdk.org" Thread-Topic: [PATCH v1 1/4] raw/ifpga: add fpga rsu function Thread-Index: AQHW3k60jb7mkB8PAUSDgxMnKk3sUqoO4Vog Date: Wed, 30 Dec 2020 03:04:38 +0000 Message-ID: References: <1609293255-2781-1-git-send-email-wei.huang@intel.com> <1609293255-2781-2-git-send-email-wei.huang@intel.com> In-Reply-To: <1609293255-2781-2-git-send-email-wei.huang@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.5.1.3 dlp-reaction: no-action authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.198.147.223] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 3e94b25d-8f19-450b-22d8-08d8ac6fa587 x-ms-traffictypediagnostic: DM6PR11MB3579: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:114; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: UCPNt2oErEdSKx2fPXGXgyZUbVChrGzpNpvj1AeR0Cwuwge6+69IqZY0NGWVFKDngOfTSv/4wqgbHAHIprOu/v6uQzU+igdxmx+AYt3+F22jM/vx3+wGNRIATItTf5wTA7BT+SuCuySuDxepS6ddFettqIY6SyRBB3irZmubi7lCTX4tftYpowaZNYIv6UwSCdcUO8ChQKfBab2nWk5Hjb6msx9QUsC8aD3o6sArs352TBgGlnWBk3JkisC7CVcPJhuM+EH9aNJOXUmRTlz6nYarobVfR3WSrSBwYXpzrCkEtNjIHNYpTqKe3nJ/jDR6bWUHwOkXjCFaL6B2ZA7QI7hYM7HnZ6d6028PTtYFF7bKoH+rPlNiUYexEXcKH+VUp5SpKhV5E7T3LGBSgIyJMQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR11MB3131.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(136003)(346002)(366004)(376002)(396003)(39860400002)(66556008)(26005)(478600001)(4326008)(8676002)(9686003)(450100002)(8936002)(5660300002)(55016002)(6636002)(30864003)(52536014)(2906002)(66446008)(64756008)(316002)(66946007)(7696005)(76116006)(110136005)(71200400001)(33656002)(86362001)(83380400001)(6506007)(186003)(53546011)(66476007)(559001)(579004); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata: =?iso-2022-jp?B?STJxZVl6UWNINVIzM3J2dUI0VGdadUZNc2NndHhDNXluU1lLVnBRdFk0?= =?iso-2022-jp?B?aE5ldUpUSDdFYjJRbDRCbmZCamQxYnhicjZPbllWM29kaDlSYWFYbE5a?= =?iso-2022-jp?B?V2djZ2VLdjVvdXNtUE5zT0I5VVlFNDkvTUxDYXo5c1BUWnFHZUZqS1Rp?= =?iso-2022-jp?B?QmljSHpTd01zN1ZRa2JlWWhTbk5aaWlXWDM1dVk2cGJZRndpSm1iTFVY?= =?iso-2022-jp?B?eGdUWVpJV0NEaTh4NW9GUE9jTzZZY1RyajY2V0U0a0RqZW1jV0M1bUVB?= =?iso-2022-jp?B?TWs5Z0J1THg5WklsWkFDWUIrVkszYXdUUHhpOUZnakplSTViK3hkSE12?= =?iso-2022-jp?B?R2FFakhEUW5lU2U0cEtpSVNXNTN0SFpjekJOM2l4c1VQZHJvMXF2d2sw?= =?iso-2022-jp?B?Y3JhNEV6elltemQvOEtFOTJGbmxNRWhpVlE3RjZ5c0Vocmg2NnlHbHNn?= =?iso-2022-jp?B?MGYrbHJnT1BDaWs4eGNIaXQ0ZEhMVlZHTmNQRHByTzVia2ppQkJia2l6?= =?iso-2022-jp?B?N1YxcmZBWjBlOERYVEFQR2tpOWhRSmVnNnd6bjdkc1hNa3luWVpqMUFE?= =?iso-2022-jp?B?NDVrM0Fqdm9wOG9sdTZsM0E2bnpIVlhPNk5jbWt5ZEtoSjNHSUVRZ2o2?= =?iso-2022-jp?B?bUplV0tQeVpWL0VTTUc5M2ZKQWlENGJGZTVMTnEwc2ZaQ3ZzTE5ZZ0pK?= =?iso-2022-jp?B?S0RUb0tmZTdjV0t3aWNmZkpDQkZYdDdxc0tDTjlDV2lNMHk2WUtWMm5E?= =?iso-2022-jp?B?ZVB1WUE5UWdlVnJXNExHNTBJejAxUm82VnFnMGNzMUcvQzFQNVNOYzhD?= =?iso-2022-jp?B?QlN2cjRaZ3N1blQ3aCtsdTVoME91WVBHcnh1SDFDckVBUW9qMktFSEg5?= =?iso-2022-jp?B?VzNVNVFuQ081SW1TTGwwb3Z5OVplb3EveHIxZ0EvN3BhckF0M3ZPSE1D?= =?iso-2022-jp?B?OURvbllWZUdFbFlxVFNha3k2YmgvYUtjdU9WcGxmT0lsZHJkOHRicFE2?= =?iso-2022-jp?B?T1hkM1pYclJUUitBS1lyWmlxREYyYXBBbHE2ZmVtSEJWU3U2QVF1Tlp1?= =?iso-2022-jp?B?WWRyM2lXRzc3cXZ0bWlWY0hXVjJIbVZGNVlMS28yMk5xL0ZPdEJERENL?= =?iso-2022-jp?B?SDE5RWNiSWErcG9ZdFBKSFBteml3WE52T2wwZGhIb2FoSWpoNld5UGpL?= =?iso-2022-jp?B?OC93ZzdVRzc0MkI1RExFNWM5ZFFhekc3UHJLQ1lDajZmZCtoY3YxK2ZS?= =?iso-2022-jp?B?NUJPVzFiT3dZa1RYYVZpay9zb1JTejIzdzBwYkV5d2Y5bmdxbXV5WlNJ?= =?iso-2022-jp?B?MHhPeG80c3A2R3ZINEdDRkFLUDQxaHJZd3lldjJWYmIzbVdIeXBFcU1l?= =?iso-2022-jp?B?QVA0Q2VhQmV3Z3pmelZDMHowQW5ZRTFuTktBWGRrN0gycTArOD0=?= Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB3131.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3e94b25d-8f19-450b-22d8-08d8ac6fa587 X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Dec 2020 03:04:39.0160 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: fWsDmnjzMryb65HYhTq53bj59snae9ICyXTCcRDCANdxQ1/lby6XByLKBJr4shosQ5BmJPJ6f2297XRL9ktOXQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB3579 X-OriginatorOrg: intel.com Subject: Re: [dpdk-stable] [PATCH v1 1/4] raw/ifpga: add fpga rsu function X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" > -----Original Message----- > From: Huang, Wei > Sent: 2020=1B$BG/=1B(B12=1B$B7n=1B(B30=1B$BF|=1B(B 9:54 > To: dev@dpdk.org; Xu, Rosen ; Zhang, Qi Z > > Cc: stable@dpdk.org; Zhang, Tianfei ; Huang, Wei > > Subject: [PATCH v1 1/4] raw/ifpga: add fpga rsu function >=20 > RSU (Remote System Update) depends on secure manager which may be > different on various implementations, so a new secure manager device is > implemented for adapting such difference. > There are three major functions added: > 1. ifpga_rawdev_update_flash() updates flash with specific image file. > 2. ifpga_rawdev_stop_flash_update() aborts flash update process. > 3. ifpga_rawdev_reload() reloads FPGA from updated flash. >=20 > Signed-off-by: Wei Huang > --- > drivers/raw/ifpga/base/ifpga_api.c | 26 + > drivers/raw/ifpga/base/ifpga_fme.c | 8 + > drivers/raw/ifpga/base/ifpga_fme_rsu.c | 437 +++++++++++++++ > drivers/raw/ifpga/base/ifpga_hw.h | 1 + > drivers/raw/ifpga/base/ifpga_sec_mgr.c | 639 > ++++++++++++++++++++++ > drivers/raw/ifpga/base/ifpga_sec_mgr.h | 89 +++ > drivers/raw/ifpga/base/meson.build | 2 + > drivers/raw/ifpga/base/opae_hw_api.c | 59 ++ > drivers/raw/ifpga/base/opae_hw_api.h | 11 + > drivers/raw/ifpga/base/opae_intel_max10.c | 51 ++ > drivers/raw/ifpga/base/opae_intel_max10.h | 44 ++ > drivers/raw/ifpga/ifpga_rawdev.c | 55 ++ > drivers/raw/ifpga/ifpga_rawdev.h | 7 +- > 13 files changed, 1428 insertions(+), 1 deletion(-) create mode 100644 > drivers/raw/ifpga/base/ifpga_fme_rsu.c > create mode 100644 drivers/raw/ifpga/base/ifpga_sec_mgr.c > create mode 100644 drivers/raw/ifpga/base/ifpga_sec_mgr.h >=20 > diff --git a/drivers/raw/ifpga/base/ifpga_api.c > b/drivers/raw/ifpga/base/ifpga_api.c > index 1ff57fa18..1aedf150b 100644 > --- a/drivers/raw/ifpga/base/ifpga_api.c > +++ b/drivers/raw/ifpga/base/ifpga_api.c > @@ -5,6 +5,7 @@ > #include "ifpga_api.h" > #include "ifpga_enumerate.h" > #include "ifpga_feature_dev.h" > +#include "ifpga_sec_mgr.h" >=20 > #include "opae_hw_api.h" >=20 > @@ -228,11 +229,36 @@ static int ifpga_mgr_get_board_info(struct > opae_manager *mgr, > return 0; > } >=20 > +static int ifpga_mgr_update_flash(struct opae_manager *mgr, const char > *image, > + u64 *status) > +{ > + struct ifpga_fme_hw *fme =3D mgr->data; > + > + return fpga_update_flash(fme, image, status); } > + > +static int ifpga_mgr_stop_flash_update(struct opae_manager *mgr, int > +force) { > + struct ifpga_fme_hw *fme =3D mgr->data; > + > + return fpga_stop_flash_update(fme, force); } > + > +static int ifpga_mgr_reload(struct opae_manager *mgr, int type, int > +page) { > + struct ifpga_fme_hw *fme =3D mgr->data; > + > + return fpga_reload(fme, type, page); > +} > + > struct opae_manager_ops ifpga_mgr_ops =3D { > .flash =3D ifpga_mgr_flash, > .get_eth_group_region_info =3D ifpga_mgr_get_eth_group_region_info, > .get_sensor_value =3D ifpga_mgr_get_sensor_value, > .get_board_info =3D ifpga_mgr_get_board_info, > + .update_flash =3D ifpga_mgr_update_flash, > + .stop_flash_update =3D ifpga_mgr_stop_flash_update, > + .reload =3D ifpga_mgr_reload, > }; >=20 > static int ifpga_mgr_read_mac_rom(struct opae_manager *mgr, int offset, > diff --git a/drivers/raw/ifpga/base/ifpga_fme.c > b/drivers/raw/ifpga/base/ifpga_fme.c > index f29ff3159..34fd9a818 100644 > --- a/drivers/raw/ifpga/base/ifpga_fme.c > +++ b/drivers/raw/ifpga/base/ifpga_fme.c > @@ -7,6 +7,7 @@ > #include "opae_intel_max10.h" > #include "opae_i2c.h" > #include "opae_at24_eeprom.h" > +#include "ifpga_sec_mgr.h" >=20 > #define PWR_THRESHOLD_MAX 0x7F >=20 > @@ -1152,6 +1153,12 @@ static int fme_nios_spi_init(struct ifpga_feature > *feature) > if (spi_self_checking(max10)) > goto spi_fail; >=20 > + ret =3D init_sec_mgr(fme); > + if (ret) { > + dev_err(fme, "security manager init fail\n"); > + goto spi_fail; > + } > + > return ret; >=20 > spi_fail: > @@ -1165,6 +1172,7 @@ static void fme_nios_spi_uinit(struct ifpga_feature > *feature) { > struct ifpga_fme_hw *fme =3D (struct ifpga_fme_hw *)feature->parent; >=20 > + release_sec_mgr(fme); > if (fme->max10_dev) > intel_max10_device_remove(fme->max10_dev); > } > diff --git a/drivers/raw/ifpga/base/ifpga_fme_rsu.c > b/drivers/raw/ifpga/base/ifpga_fme_rsu.c > new file mode 100644 > index 000000000..dfeb3a698 > --- /dev/null > +++ b/drivers/raw/ifpga/base/ifpga_fme_rsu.c > @@ -0,0 +1,437 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2020 Intel Corporation > + */ > + > +#include > +#include > +#include > +#include "ifpga_sec_mgr.h" > + > + Pls remove one blank line. > +static struct ifpga_sec_mgr *sec_mgr; > + > +static void set_rsu_control(struct ifpga_sec_mgr *smgr, uint32_t ctrl) > +{ > + if (smgr && smgr->rsu_control) > + *smgr->rsu_control =3D ctrl; > +} > + > +static uint32_t get_rsu_control(struct ifpga_sec_mgr *smgr) { > + if (smgr && smgr->rsu_control) > + return *smgr->rsu_control; > + return 0; > +} > + > +static void set_rsu_status(struct ifpga_sec_mgr *smgr, uint32_t status, > + uint32_t progress) > +{ > + if (smgr && smgr->rsu_status) > + *smgr->rsu_status =3D ((status << 16) & 0xffff0000) | > + (progress & 0xffff); > +} > + > +static void get_rsu_status(struct ifpga_sec_mgr *smgr, uint32_t *status, > + uint32_t *progress) > +{ > + if (smgr && smgr->rsu_status) { > + if (status) > + *status =3D (*smgr->rsu_status >> 16) & 0xffff; > + if (progress) > + *progress =3D *smgr->rsu_status & 0xffff; > + } > + if (smgr && smgr->rsu_status) { > + if (status) > + *status =3D (*smgr->rsu_status >> 16) & 0xffff; > + if (progress) > + *progress =3D *smgr->rsu_status & 0xffff; > + } > +} > + > +static void sig_handler(int sig, siginfo_t *info, void *data) { > + (void)(info); > + (void)(data); > + > + switch (sig) { > + case SIGINT: > + if (sec_mgr) { > + dev_info(sec_mgr, "Interrupt secure flash update" > + " by keyboard\n"); > + set_rsu_control(sec_mgr, IFPGA_RSU_ABORT); > + } > + break; > + default: > + break; > + } > +} > + > +static void log_time(time_t t, const char *msg) { > + uint32_t h =3D 0; > + uint32_t m =3D 0; > + uint32_t s =3D 0; > + > + if (t < 60) { > + s =3D (uint32_t)t; > + } else if (t < 3600) { > + s =3D (uint32_t)(t % 60); > + m =3D (uint32_t)(t / 60); > + } else { > + s =3D (uint32_t)(t % 60); > + m =3D (uint32_t)((t % 3600) / 60); > + h =3D (uint32_t)(t / 3600); > + } > + printf("%s - %02u:%02u:%02u\n", msg, h, m, s); } > + > +static int start_flash_update(struct ifpga_sec_mgr *smgr) { > + if (!smgr) > + return -ENODEV; > + > + if (!smgr->ops || !smgr->ops->prepare) > + return -EINVAL; > + > + return smgr->ops->prepare(smgr); > +} > + > +static int write_flash_image(struct ifpga_sec_mgr *smgr, const char *ima= ge, > + uint32_t offset) > +{ > + void *buf =3D NULL; > + int retry =3D 0; > + uint32_t length =3D 0; > + uint32_t to_transfer =3D 0; > + uint32_t one_percent =3D 0; > + uint32_t prog =3D 0; > + uint32_t old_prog =3D -1; > + ssize_t read_size =3D 0; > + int fd =3D -1; > + int ret =3D 0; > + > + if (!smgr) > + return -ENODEV; > + > + if (!smgr->ops || !smgr->ops->write_blk) > + return -EINVAL; > + > + fd =3D open(image, O_RDONLY); > + if (fd < 0) { > + dev_err(smgr, > + "Failed to open \'%s\' for RD [e:%s]\n", > + image, strerror(errno)); > + return -EIO; > + } > + > + buf =3D malloc(IFPGA_RSU_DATA_BLK_SIZE); > + if (!buf) { > + dev_err(smgr, "Failed to allocate memory for flash update\n"); > + close(fd); > + return -ENOMEM; > + } > + > + length =3D smgr->rsu_length; > + one_percent =3D length / 100; > + do { > + to_transfer =3D length > IFPGA_RSU_DATA_BLK_SIZE ? > + IFPGA_RSU_DATA_BLK_SIZE : length; Add parentheses is better, like "(length > IFPGA_RSU_DATA_BLK_SIZE ) ? " > + lseek(fd, offset, SEEK_SET); > + read_size =3D read(fd, buf, to_transfer); > + if (read_size < 0) { > + dev_err(smgr, "Failed to read from \'%s\' [e:%s]\n", > + image, strerror(errno)); > + ret =3D -EIO; > + goto end; > + } > + if ((uint32_t)read_size !=3D to_transfer) { > + dev_err(smgr, > + "Read length %zd is not expected [e:%u]\n", > + read_size, to_transfer); > + ret =3D -EIO; > + goto end; > + } > + > + retry =3D 0; > + do { > + if (get_rsu_control(smgr) =3D=3D IFPGA_RSU_ABORT) { > + ret =3D -EAGAIN; > + goto end; > + } > + ret =3D smgr->ops->write_blk(smgr, buf, offset, > + to_transfer); > + if (ret =3D=3D 0) > + break; > + sleep(1); > + } while (++retry <=3D IFPGA_RSU_WRITE_RETRY); > + if (retry > IFPGA_RSU_WRITE_RETRY) { > + dev_err(smgr, "Failed to write to staging area 0x%x\n", > + offset); > + ret =3D -EAGAIN; > + goto end; > + } > + > + length -=3D to_transfer; > + offset +=3D to_transfer; > + prog =3D offset / one_percent; > + if (prog !=3D old_prog) { > + printf("\r%d%%", prog); > + fflush(stdout); > + set_rsu_status(smgr, IFPGA_RSU_READY, prog); > + old_prog =3D prog; > + } > + } while (length > 0); > + set_rsu_status(smgr, IFPGA_RSU_READY, 100); > + printf("\n"); > + > +end: > + free(buf); > + close(fd); > + return ret; > +} > + > +static int apply_flash_update(struct ifpga_sec_mgr *smgr) { > + uint32_t one_percent =3D 0; > + uint32_t one_percent_time =3D 0; > + uint32_t prog =3D 0; > + uint32_t old_prog =3D -1; > + uint32_t copy_time =3D 0; > + int ret =3D 0; > + > + if (!smgr) > + return -ENODEV; > + > + if (!smgr->ops || !smgr->ops->write_done > || !smgr->ops->check_complete) > + return -EINVAL; > + > + if (smgr->ops->write_done(smgr) < 0) { > + dev_err(smgr, "Failed to apply flash update\n"); > + return -EAGAIN; > + } > + > + one_percent =3D (smgr->rsu_length + 99) / 100; > + if (smgr->copy_speed =3D=3D 0) /* avoid zero divide fault */ > + smgr->copy_speed =3D 1; > + one_percent_time =3D (one_percent + smgr->copy_speed - 1) / > + smgr->copy_speed; > + if (one_percent_time =3D=3D 0) /* avoid zero divide fault */ > + one_percent_time =3D 1; > + > + do { > + ret =3D smgr->ops->check_complete(smgr); > + if (ret !=3D -EAGAIN) > + break; > + sleep(1); > + copy_time +=3D 1; > + prog =3D copy_time / one_percent_time; > + if (prog >=3D 100) > + prog =3D 99; > + if (prog !=3D old_prog) { > + printf("\r%d%%", prog); > + fflush(stdout); > + set_rsu_status(smgr, IFPGA_RSU_COPYING, prog); > + old_prog =3D prog; > + } > + } while (true); > + > + if (ret < 0) { > + printf("\n"); > + dev_err(smgr, "Failed to complete secure flash update\n"); > + } else { > + printf("\r100%%\n"); > + set_rsu_status(smgr, IFPGA_RSU_COPYING, 100); > + } > + > + return ret; > +} > + > +static int secure_update_cancel(struct ifpga_sec_mgr *smgr) { > + if (!smgr) > + return -ENODEV; > + > + if (!smgr->ops || !smgr->ops->cancel) > + return -EINVAL; > + > + return smgr->ops->cancel(smgr); > +} > + > +static int secure_update_status(struct ifpga_sec_mgr *smgr, uint64_t > +*status) { > + if (!smgr) > + return -ENODEV; > + > + if (!smgr->ops || !smgr->ops->get_hw_errinfo) > + return -EINVAL; > + > + if (status) > + *status =3D smgr->ops->get_hw_errinfo(smgr); > + > + return 0; > +} > + > +int fpga_update_flash(struct ifpga_fme_hw *fme, const char *image, > + uint64_t *status) > +{ > + struct ifpga_hw *hw =3D NULL; > + struct ifpga_sec_mgr *smgr =3D NULL; > + uint32_t rsu_stat =3D 0; > + int fd =3D -1; > + struct sigaction old_sigint_action; > + struct sigaction sa; > + time_t start; > + int ret =3D 0; > + > + if (!fme || !image || !status) { > + dev_err(fme, "Input parameter of %s is invalid\n", __func__); > + return -EINVAL; > + } > + > + hw =3D (struct ifpga_hw *)fme->parent; > + if (!hw) { > + dev_err(fme, "Parent of FME not found\n"); > + return -ENODEV; > + } > + > + smgr =3D (struct ifpga_sec_mgr *)fme->sec_mgr; > + if (!smgr || !smgr->max10_dev) { > + dev_err(smgr, "Security manager not initialized\n"); > + return -ENODEV; > + } > + > + opae_adapter_lock(hw->adapter, -1); > + get_rsu_status(smgr, &rsu_stat, NULL); > + if (rsu_stat !=3D IFPGA_RSU_IDLE) { > + opae_adapter_unlock(hw->adapter); > + if (rsu_stat =3D=3D IFPGA_RSU_REBOOT) > + dev_info(smgr, "Reboot is in progress\n"); > + else > + dev_info(smgr, "Update is in progress\n"); > + return -EAGAIN; > + } > + set_rsu_control(smgr, 0); > + set_rsu_status(smgr, IFPGA_RSU_PREPARE, 0); > + opae_adapter_unlock(hw->adapter); > + > + fd =3D open(image, O_RDONLY); > + if (fd < 0) { > + dev_err(smgr, > + "Failed to open \'%s\' for RD [e:%s]\n", > + image, strerror(errno)); > + return -EIO; > + } > + smgr->rsu_length =3D lseek(fd, 0, SEEK_END); > + close(fd); > + > + if (smgr->max10_dev->staging_area_size < smgr->rsu_length) { > + dev_err(dev, "Size of staging area is small than image length " > + "[%u<%u]\n", smgr->max10_dev->staging_area_size, > + smgr->rsu_length); > + return -EINVAL; > + } > + > + printf("Updating from file \'%s\' with size %u\n", > + image, smgr->rsu_length); > + > + sec_mgr =3D smgr; > + memset(&sa, 0, sizeof(struct sigaction)); > + sa.sa_flags =3D SA_SIGINFO | SA_RESETHAND; > + sa.sa_sigaction =3D sig_handler; > + ret =3D sigaction(SIGINT, &sa, &old_sigint_action); > + if (ret < 0) { > + dev_warn(dev, "Failed to register signal handler" > + " [e:%d]\n", ret); > + sec_mgr =3D NULL; > + } > + > + start =3D time(NULL); > + log_time(time(NULL) - start, "Starting secure flash update"); > + ret =3D start_flash_update(smgr); > + if (ret < 0) > + goto end; > + > + set_rsu_status(smgr, IFPGA_RSU_READY, 0); > + log_time(time(NULL) - start, "Writing to staging area"); > + ret =3D write_flash_image(smgr, image, 0); > + if (ret < 0) > + goto end; > + > + set_rsu_status(smgr, IFPGA_RSU_COPYING, 0); > + log_time(time(NULL) - start, "Applying secure flash update"); > + ret =3D apply_flash_update(smgr); > + > +end: > + if (sec_mgr) { > + sec_mgr =3D NULL; > + if (sigaction(SIGINT, &old_sigint_action, NULL) < 0) > + dev_err(smgr, "Failed to unregister signal handler\n"); > + } > + > + secure_update_status(smgr, status); > + if (ret < 0) { > + log_time(time(NULL) - start, "Secure flash update ERROR"); > + printf("Error status code is %zx\n", *status); > + if (ret =3D=3D -EAGAIN) > + secure_update_cancel(smgr); > + } else { > + log_time(time(NULL) - start, "Secure flash update OK"); > + } > + set_rsu_status(smgr, IFPGA_RSU_IDLE, 0); > + > + return ret; > +} > + > +int fpga_stop_flash_update(struct ifpga_fme_hw *fme, int force) { > + struct ifpga_sec_mgr *smgr =3D NULL; > + uint32_t status =3D 0; > + int retry =3D IFPGA_RSU_CANCEL_RETRY; > + int ret =3D 0; > + > + if (!fme) { > + dev_err(fme, "Input parameter of %s is invalid\n", __func__); > + return -EINVAL; > + } > + smgr =3D (struct ifpga_sec_mgr *)fme->sec_mgr; > + > + get_rsu_status(smgr, &status, NULL); > + if (status !=3D IFPGA_RSU_IDLE) { > + dev_info(smgr, "Cancel secure flash update\n"); > + set_rsu_control(smgr, IFPGA_RSU_ABORT); > + } > + > + if (force) { > + sleep(2); > + do { > + get_rsu_status(smgr, &status, NULL); > + if (status =3D=3D IFPGA_RSU_IDLE) > + break; > + if (secure_update_cancel(smgr) =3D=3D 0) > + set_rsu_status(smgr, IFPGA_RSU_IDLE, 0); > + sleep(1); > + } while (--retry > 0); > + if (retry <=3D 0) { > + dev_err(smgr, "Failed to stop flash update\n"); > + ret =3D -EAGAIN; > + } > + } > + > + return ret; > +} > + > +int fpga_reload(struct ifpga_fme_hw *fme, int type, int page) { > + struct ifpga_sec_mgr *smgr =3D NULL; > + > + if (!fme) { > + dev_err(fme, "Input parameter of %s is invalid\n", __func__); > + return -EINVAL; > + } > + smgr =3D (struct ifpga_sec_mgr *)fme->sec_mgr; > + > + if (!smgr || !smgr->ops || !smgr->ops->reload) > + return -EINVAL; > + > + return smgr->ops->reload(smgr, type, page); } > diff --git a/drivers/raw/ifpga/base/ifpga_hw.h > b/drivers/raw/ifpga/base/ifpga_hw.h > index 7c3307fe7..ed5edc601 100644 > --- a/drivers/raw/ifpga/base/ifpga_hw.h > +++ b/drivers/raw/ifpga/base/ifpga_hw.h > @@ -91,6 +91,7 @@ struct ifpga_fme_hw { > struct opae_board_info board_info; > int nums_eth_dev; > unsigned int nums_acc_region; > + void *sec_mgr; > }; >=20 > enum ifpga_port_state { > diff --git a/drivers/raw/ifpga/base/ifpga_sec_mgr.c > b/drivers/raw/ifpga/base/ifpga_sec_mgr.c > new file mode 100644 > index 000000000..6f039f5fa > --- /dev/null > +++ b/drivers/raw/ifpga/base/ifpga_sec_mgr.c > @@ -0,0 +1,639 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2020 Intel Corporation > + */ > + > +#include > +#include > +#include > +#include "ifpga_sec_mgr.h" > + > + > +static const char * const rsu_prog[] =3D {"IDLE", "PREPARING", "SLEEPING= ", > + "READY", "AUTHENTICATING", "COPYING", "CANCELLATION", > "PROGRAMMING_KEY", > + "DONE", "PKVL_DONE"}; > +static const char * const rsu_statl[] =3D {"NORMAL", "TIMEOUT", > "AUTH_FAIL", > + "COPY_FAIL", "FATAL", "PKVL_REJECT", "NON_INCR", "ERASE_FAIL", > + "WEAROUT"}; > +static const char * const rsu_stath[] =3D {"NIOS_OK", "USER_OK", > "FACTORY_OK", > + "USER_FAIL", "FACTORY_FAIL", "NIOS_FLASH_ERR", > "FPGA_FLASH_ERR"}; > + > +static const char *rsu_progress_name(uint32_t prog) { > + if (prog > SEC_PROGRESS_PKVL_PROM_DONE) > + return "UNKNOWN"; > + else > + return rsu_prog[prog]; > +} > + > +static const char *rsu_status_name(uint32_t stat) { > + if (stat >=3D SEC_STATUS_NIOS_OK) { > + if (stat > SEC_STATUS_FPGA_FLASH_ERR) > + return "UNKNOWN"; > + else > + return rsu_stath[stat-SEC_STATUS_NIOS_OK]; > + } else { > + if (stat > SEC_STATUS_WEAROUT) > + return "UNKNOWN"; > + else > + return rsu_statl[stat]; > + } > +} > + > +static bool secure_start_done(uint32_t doorbell) { > + return (SEC_STATUS_G(doorbell) =3D=3D SEC_STATUS_ERASE_FAIL || > + SEC_STATUS_G(doorbell) =3D=3D SEC_STATUS_WEAROUT || > + (SEC_PROGRESS_G(doorbell) !=3D SEC_PROGRESS_IDLE && > + SEC_PROGRESS_G(doorbell) !=3D SEC_PROGRESS_RSU_DONE)); } > + > +static bool secure_prog_ready(uint32_t doorbell) { > + return (SEC_PROGRESS_G(doorbell) !=3D SEC_PROGRESS_READY); } > + > +static int poll_timeout(struct intel_max10_device *dev, uint32_t offset, > + bool (*cond)(uint32_t), uint32_t interval_ms, uint32_t timeout_ms) { > + uint32_t val =3D 0; > + int ret =3D 0; > + > + for (;;) { > + ret =3D max10_sys_read(dev, offset, &val); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 register 0x%x [e:%d]\n", > + offset, ret); > + break; > + } > + > + if (cond(val)) { > + dev_debug(dev, > + "Read 0x%08x from max10 register 0x%x " > + "[poll success]\n", val, offset); > + ret =3D 0; > + break; > + } > + if (timeout_ms > interval_ms) > + timeout_ms -=3D interval_ms; > + else > + timeout_ms =3D 0; > + if (timeout_ms =3D=3D 0) { > + dev_debug(dev, > + "Read 0x%08x from max10 register 0x%x " > + "[poll timeout]\n", val, offset); > + ret =3D -ETIMEDOUT; > + break; > + } > + msleep(interval_ms); > + } > + > + return ret; > +} > + > +static int n3000_secure_update_start(struct intel_max10_device *dev) { > + uint32_t doorbell =3D 0; > + uint32_t prog =3D 0; > + uint32_t status =3D 0; > + int ret =3D 0; > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + prog =3D SEC_PROGRESS_G(doorbell); > + if ((prog !=3D SEC_PROGRESS_IDLE) && (prog !=3D > SEC_PROGRESS_RSU_DONE)) { > + dev_debug(dev, "Current RSU progress is %s\n", > + rsu_progress_name(prog)); > + return -EBUSY; > + } > + > + ret =3D max10_sys_update_bits(dev, MAX10_DOORBELL, > + RSU_REQUEST | HOST_STATUS, RSU_REQUEST); > + if (ret < 0) { > + dev_err(dev, > + "Failed to updt max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + ret =3D poll_timeout(dev, MAX10_DOORBELL, secure_start_done, > + IFPGA_SEC_START_INTERVAL_MS, > IFPGA_SEC_START_TIMEOUT_MS); > + if (ret < 0) { > + dev_err(dev, > + "Failed to poll max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + status =3D SEC_STATUS_G(doorbell); > + if (status =3D=3D SEC_STATUS_WEAROUT) > + return -EAGAIN; > + > + if (status =3D=3D SEC_STATUS_ERASE_FAIL) > + return -EIO; > + > + return 0; > +} > + > +static int n3000_cancel(struct ifpga_sec_mgr *smgr) { > + struct intel_max10_device *dev =3D NULL; > + uint32_t doorbell =3D 0; > + uint32_t prog =3D 0; > + int ret =3D 0; > + > + if (!smgr || !smgr->max10_dev) > + return -ENODEV; > + dev =3D (struct intel_max10_device *)smgr->max10_dev; > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + prog =3D SEC_PROGRESS_G(doorbell); > + if (prog =3D=3D SEC_PROGRESS_IDLE) > + return 0; > + if (prog !=3D SEC_PROGRESS_READY) > + return -EBUSY; > + > + return max10_sys_update_bits(dev, MAX10_DOORBELL, HOST_STATUS, > + HOST_STATUS_S(HOST_STATUS_ABORT_RSU)); > +} > + > +static int n3000_prepare(struct ifpga_sec_mgr *smgr) { > + struct intel_max10_device *dev =3D NULL; > + int retry =3D 0; > + int ret =3D 0; > + > + if (!smgr || !smgr->max10_dev) > + return -ENODEV; > + dev =3D (struct intel_max10_device *)smgr->max10_dev; > + > + ret =3D n3000_secure_update_start(dev); > + if (ret =3D=3D -EBUSY) > + n3000_cancel(smgr); > + > + while (ret) { > + if (++retry > IFPGA_RSU_START_RETRY) > + break; > + msleep(1000); > + ret =3D n3000_secure_update_start(dev); > + } > + if (retry > IFPGA_RSU_START_RETRY) { > + dev_err(dev, "Failed to start secure flash update\n"); > + ret =3D -EAGAIN; > + } > + > + return ret; > +} > + > +static int n3000_bulk_write(struct intel_max10_device *dev, uint32_t add= r, > + char *buf, uint32_t len) > +{ > + uint32_t i =3D 0; > + uint32_t n =3D 0; > + uint32_t v =3D 0; > + uint32_t p =3D 0; > + int ret =3D 0; > + > + if (len & 0x3) { > + dev_err(dev, > + "Length of data block is not 4 bytes aligned [e:%u]\n", > + len); > + return -EINVAL; > + } > + > + n =3D len >> 2; > + for (i =3D 0; i < n; i++) { > + p =3D i << 2; > + v =3D *(uint32_t *)(buf + p); > + ret =3D max10_reg_write(dev, addr + p, v); > + if (ret < 0) { > + dev_err(dev, > + "Failed to write to staging area 0x%08x [e:%d]\n", > + addr + p, ret); > + return ret; > + } > + usleep(1); > + } > + > + return 0; > +} > + > +static int n3000_write_blk(struct ifpga_sec_mgr *smgr, char *buf, > + uint32_t offset, uint32_t len) > +{ > + struct intel_max10_device *dev =3D NULL; > + uint32_t doorbell =3D 0; > + uint32_t prog =3D 0; > + uint32_t m =3D 0; > + int ret =3D 0; > + > + if (!smgr || !smgr->max10_dev) > + return -ENODEV; > + dev =3D (struct intel_max10_device *)smgr->max10_dev; > + > + if (offset + len > dev->staging_area_size) { > + dev_err(dev, > + "Write position would be out of staging area [e:%u]\n", > + dev->staging_area_size); > + return -ENOMEM; > + } > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + prog =3D SEC_PROGRESS_G(doorbell); > + if (prog =3D=3D SEC_PROGRESS_PREPARE) > + return -EAGAIN; > + else if (prog !=3D SEC_PROGRESS_READY) > + return -EBUSY; > + > + m =3D len & 0x3; > + if (m !=3D 0) > + len +=3D 4 - m; /* make length to 4 bytes align */ > + > + return n3000_bulk_write(dev, dev->staging_area_base + offset, buf, > +len); } > + > +static int n3000_write_done(struct ifpga_sec_mgr *smgr) { > + struct intel_max10_device *dev =3D NULL; > + uint32_t doorbell =3D 0; > + uint32_t prog =3D 0; > + uint32_t status =3D 0; > + int ret =3D 0; > + > + if (!smgr || !smgr->max10_dev) > + return -ENODEV; > + dev =3D (struct intel_max10_device *)smgr->max10_dev; > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + prog =3D SEC_PROGRESS_G(doorbell); > + if (prog !=3D SEC_PROGRESS_READY) > + return -EBUSY; > + > + ret =3D max10_sys_update_bits(dev, MAX10_DOORBELL, HOST_STATUS, > + HOST_STATUS_S(HOST_STATUS_WRITE_DONE)); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + ret =3D poll_timeout(dev, MAX10_DOORBELL, secure_prog_ready, > + IFPGA_NIOS_HANDSHAKE_INTERVAL_MS, > + IFPGA_NIOS_HANDSHAKE_TIMEOUT_MS); > + if (ret < 0) { > + dev_err(dev, > + "Failed to poll max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + status =3D SEC_STATUS_G(doorbell); > + switch (status) { > + case SEC_STATUS_NORMAL: > + case SEC_STATUS_NIOS_OK: > + case SEC_STATUS_USER_OK: > + case SEC_STATUS_FACTORY_OK: > + ret =3D 0; > + break; > + default: > + ret =3D -EIO; > + break; > + } > + > + return ret; > +} > + > +static int n3000_check_complete(struct ifpga_sec_mgr *smgr) { > + struct intel_max10_device *dev =3D NULL; > + uint32_t doorbell =3D 0; > + uint32_t status =3D 0; > + uint32_t prog =3D 0; > + int ret =3D 0; > + > + if (!smgr || !smgr->max10_dev) > + return -ENODEV; > + dev =3D (struct intel_max10_device *)smgr->max10_dev; > + > + ret =3D max10_sys_read(dev, MAX10_DOORBELL, &doorbell); > + if (ret < 0) { > + dev_err(dev, > + "Failed to read max10 doorbell register [e:%d]\n", > + ret); > + return ret; > + } > + > + status =3D SEC_STATUS_G(doorbell); > + switch (status) { > + case SEC_STATUS_NORMAL: > + case SEC_STATUS_NIOS_OK: > + case SEC_STATUS_USER_OK: > + case SEC_STATUS_FACTORY_OK: > + case SEC_STATUS_WEAROUT: > + break; > + default: > + return -EIO; > + } > + > + prog =3D SEC_PROGRESS_G(doorbell); > + switch (prog) { > + case SEC_PROGRESS_IDLE: > + case SEC_PROGRESS_RSU_DONE: > + return 0; > + case SEC_PROGRESS_AUTHENTICATING: > + case SEC_PROGRESS_COPYING: > + case SEC_PROGRESS_UPDATE_CANCEL: > + case SEC_PROGRESS_PROGRAM_KEY_HASH: > + return -EAGAIN; > + case SEC_PROGRESS_PREPARE: > + case SEC_PROGRESS_READY: > + return -EBUSY; > + default: > + return -EIO; > + } > + > + return 0; > +} > + > +static int n3000_reload_fpga(struct intel_max10_device *dev, int page) > +{ > + int ret =3D 0; > + > + dev_info(dev, "Reload FPGA\n"); > + > + if (!dev || ((page !=3D 0) && (page !=3D 1))) { > + dev_err(dev, "Input parameter of %s is invalid\n", __func__); > + ret =3D -EINVAL; > + goto end; > + } > + > + if (dev->flags & MAX10_FLAGS_SECURE) { > + ret =3D max10_sys_update_bits(dev, FPGA_RECONF_REG, > + SFPGA_RP_LOAD, 0); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 reconfig register [e:%d]\n", > + ret); > + goto end; > + } > + ret =3D max10_sys_update_bits(dev, FPGA_RECONF_REG, > + SFPGA_RP_LOAD | SFPGA_RECONF_PAGE, > + SFPGA_RP_LOAD | SFPGA_PAGE(page)); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 reconfig register [e:%d]\n", > + ret); > + goto end; > + } > + } else { > + ret =3D max10_sys_update_bits(dev, RSU_REG, FPGA_RP_LOAD, 0); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 rsu register [e:%d]\n", > + ret); > + goto end; > + } > + ret =3D max10_sys_update_bits(dev, RSU_REG, > + FPGA_RP_LOAD | FPGA_RECONF_PAGE, > + FPGA_RP_LOAD | FPGA_PAGE(page)); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 rsu register [e:%d]\n", > + ret); > + goto end; > + } > + } > + > + ret =3D max10_sys_update_bits(dev, FPGA_RECONF_REG, > COUNTDOWN_START, 0); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 reconfig register [e:%d]\n", > + ret); > + goto end; > + } > + > + ret =3D max10_sys_update_bits(dev, FPGA_RECONF_REG, > COUNTDOWN_START, > + COUNTDOWN_START); > + if (ret < 0) { > + dev_err(dev, > + "Failed to update max10 reconfig register [e:%d]\n", > + ret); > + } > +end: > + if (ret < 0) > + dev_err(dev, "Failed to reload FPGA\n"); > + > + return ret; > +} > + > +static int n3000_reload_bmc(struct intel_max10_device *dev, int page) { > + uint32_t val =3D 0; > + int ret =3D 0; > + > + dev_info(dev, "Reload BMC\n"); > + > + if (!dev || ((page !=3D 0) && (page !=3D 1))) { > + dev_err(dev, "Input parameter of %s is invalid\n", __func__); > + ret =3D -EINVAL; > + goto end; > + } > + > + if (dev->flags & MAX10_FLAGS_SECURE) { > + ret =3D max10_sys_update_bits(dev, MAX10_DOORBELL, > + CONFIG_SEL | REBOOT_REQ, > + CONFIG_SEL_S(page) | REBOOT_REQ); > + } else { > + val =3D page =3D=3D 0 ? 0x1 : 0x3; Add parentheses is better, like "val =3D (page =3D=3D 0) ? 0x1 : 0x3 "