1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation
8 #include "ifpga_sec_mgr.h"
10 static struct ifpga_sec_mgr *sec_mgr;
12 static void set_rsu_control(struct ifpga_sec_mgr *smgr, uint32_t ctrl)
14 if (smgr && smgr->rsu_control)
15 *smgr->rsu_control = ctrl;
18 static uint32_t get_rsu_control(struct ifpga_sec_mgr *smgr)
20 if (smgr && smgr->rsu_control)
21 return *smgr->rsu_control;
25 static void set_rsu_status(struct ifpga_sec_mgr *smgr, uint32_t status,
28 if (smgr && smgr->rsu_status)
29 *smgr->rsu_status = IFPGA_RSU_STATUS(status, progress);
32 static void get_rsu_status(struct ifpga_sec_mgr *smgr, uint32_t *status,
35 if (smgr && smgr->rsu_status) {
37 *status = IFPGA_RSU_GET_STAT(*smgr->rsu_status);
39 *progress = IFPGA_RSU_GET_PROG(*smgr->rsu_status);
43 static void sig_handler(int sig, siginfo_t *info, void *data)
51 dev_info(sec_mgr, "Interrupt secure flash update"
53 set_rsu_control(sec_mgr, IFPGA_RSU_ABORT);
61 static void log_time(time_t t, const char *msg)
69 } else if (t < 3600) {
70 s = (uint32_t)(t % 60);
71 m = (uint32_t)(t / 60);
73 s = (uint32_t)(t % 60);
74 m = (uint32_t)((t % 3600) / 60);
75 h = (uint32_t)(t / 3600);
77 printf("%s - %02u:%02u:%02u\n", msg, h, m, s);
80 static int start_flash_update(struct ifpga_sec_mgr *smgr)
85 if (!smgr->ops || !smgr->ops->prepare)
88 return smgr->ops->prepare(smgr);
91 static int write_flash_image(struct ifpga_sec_mgr *smgr, const char *image,
97 uint32_t to_transfer = 0;
98 uint32_t one_percent = 0;
100 uint32_t old_prog = -1;
101 ssize_t read_size = 0;
108 if (!smgr->ops || !smgr->ops->write_blk)
111 fd = open(image, O_RDONLY);
114 "Failed to open \'%s\' for RD [e:%s]\n",
115 image, strerror(errno));
119 buf = malloc(IFPGA_RSU_DATA_BLK_SIZE);
121 dev_err(smgr, "Failed to allocate memory for flash update\n");
126 length = smgr->rsu_length;
127 one_percent = length / 100;
129 to_transfer = (length > IFPGA_RSU_DATA_BLK_SIZE) ?
130 IFPGA_RSU_DATA_BLK_SIZE : length;
131 if (lseek(fd, offset, SEEK_SET) < 0) {
132 dev_err(smgr, "Failed to seek in \'%s\' [e:%s]\n",
133 image, strerror(errno));
137 read_size = read(fd, buf, to_transfer);
139 dev_err(smgr, "Failed to read from \'%s\' [e:%s]\n",
140 image, strerror(errno));
144 if ((uint32_t)read_size != to_transfer) {
146 "Read length %zd is not expected [e:%u]\n",
147 read_size, to_transfer);
154 if (get_rsu_control(smgr) == IFPGA_RSU_ABORT) {
158 ret = smgr->ops->write_blk(smgr, buf, offset,
163 } while (++retry <= IFPGA_RSU_WRITE_RETRY);
164 if (retry > IFPGA_RSU_WRITE_RETRY) {
165 dev_err(smgr, "Failed to write to staging area 0x%x\n",
171 length -= to_transfer;
172 offset += to_transfer;
173 prog = offset / one_percent;
174 if (prog != old_prog) {
175 printf("\r%d%%", prog);
177 set_rsu_status(smgr, IFPGA_RSU_READY, prog);
180 } while (length > 0);
181 set_rsu_status(smgr, IFPGA_RSU_READY, 100);
190 static int apply_flash_update(struct ifpga_sec_mgr *smgr)
192 uint32_t one_percent = 0;
193 uint32_t one_percent_time = 0;
195 uint32_t old_prog = -1;
196 uint32_t copy_time = 0;
202 if (!smgr->ops || !smgr->ops->write_done || !smgr->ops->check_complete)
205 if (smgr->ops->write_done(smgr) < 0) {
206 dev_err(smgr, "Failed to apply flash update\n");
210 one_percent = (smgr->rsu_length + 99) / 100;
211 if (smgr->copy_speed == 0) /* avoid zero divide fault */
212 smgr->copy_speed = 1;
213 one_percent_time = (one_percent + smgr->copy_speed - 1) /
215 if (one_percent_time == 0) /* avoid zero divide fault */
216 one_percent_time = 1;
219 ret = smgr->ops->check_complete(smgr);
224 prog = copy_time / one_percent_time;
227 if (prog != old_prog) {
228 printf("\r%d%%", prog);
230 set_rsu_status(smgr, IFPGA_RSU_COPYING, prog);
237 dev_err(smgr, "Failed to complete secure flash update\n");
240 set_rsu_status(smgr, IFPGA_RSU_COPYING, 100);
246 static int secure_update_cancel(struct ifpga_sec_mgr *smgr)
251 if (!smgr->ops || !smgr->ops->cancel)
254 return smgr->ops->cancel(smgr);
257 static int secure_update_status(struct ifpga_sec_mgr *smgr, uint64_t *status)
262 if (!smgr->ops || !smgr->ops->get_hw_errinfo)
266 *status = smgr->ops->get_hw_errinfo(smgr);
271 int fpga_update_flash(struct ifpga_fme_hw *fme, const char *image,
274 struct ifpga_hw *hw = NULL;
275 struct ifpga_sec_mgr *smgr = NULL;
276 uint32_t rsu_stat = 0;
278 struct sigaction old_sigint_action;
283 if (!fme || !image || !status) {
284 dev_err(fme, "Input parameter of %s is invalid\n", __func__);
288 hw = (struct ifpga_hw *)fme->parent;
290 dev_err(fme, "Parent of FME not found\n");
294 smgr = (struct ifpga_sec_mgr *)fme->sec_mgr;
295 if (!smgr || !smgr->max10_dev) {
296 dev_err(smgr, "Security manager not initialized\n");
300 opae_adapter_lock(hw->adapter, -1);
301 get_rsu_status(smgr, &rsu_stat, NULL);
302 if (rsu_stat != IFPGA_RSU_IDLE) {
303 opae_adapter_unlock(hw->adapter);
304 if (rsu_stat == IFPGA_RSU_REBOOT)
305 dev_info(smgr, "Reboot is in progress\n");
307 dev_info(smgr, "Update is in progress\n");
310 set_rsu_control(smgr, 0);
311 set_rsu_status(smgr, IFPGA_RSU_PREPARE, 0);
312 opae_adapter_unlock(hw->adapter);
314 fd = open(image, O_RDONLY);
317 "Failed to open \'%s\' for RD [e:%s]\n",
318 image, strerror(errno));
321 smgr->rsu_length = lseek(fd, 0, SEEK_END);
324 if (smgr->max10_dev->staging_area_size < smgr->rsu_length) {
325 dev_err(dev, "Size of staging area is small than image length "
326 "[%u<%u]\n", smgr->max10_dev->staging_area_size,
331 printf("Updating from file \'%s\' with size %u\n",
332 image, smgr->rsu_length);
335 memset(&sa, 0, sizeof(struct sigaction));
336 sa.sa_flags = SA_SIGINFO | SA_RESETHAND;
337 sa.sa_sigaction = sig_handler;
338 ret = sigaction(SIGINT, &sa, &old_sigint_action);
340 dev_warn(dev, "Failed to register signal handler"
346 log_time(time(NULL) - start, "Starting secure flash update");
347 ret = start_flash_update(smgr);
351 set_rsu_status(smgr, IFPGA_RSU_READY, 0);
352 log_time(time(NULL) - start, "Writing to staging area");
353 ret = write_flash_image(smgr, image, 0);
357 set_rsu_status(smgr, IFPGA_RSU_COPYING, 0);
358 log_time(time(NULL) - start, "Applying secure flash update");
359 ret = apply_flash_update(smgr);
364 if (sigaction(SIGINT, &old_sigint_action, NULL) < 0)
365 dev_err(smgr, "Failed to unregister signal handler\n");
368 secure_update_status(smgr, status);
370 log_time(time(NULL) - start, "Secure flash update ERROR");
372 secure_update_cancel(smgr);
374 log_time(time(NULL) - start, "Secure flash update OK");
376 set_rsu_status(smgr, IFPGA_RSU_IDLE, 0);
381 int fpga_stop_flash_update(struct ifpga_fme_hw *fme, int force)
383 struct ifpga_sec_mgr *smgr = NULL;
385 int retry = IFPGA_RSU_CANCEL_RETRY;
389 dev_err(fme, "Input parameter of %s is invalid\n", __func__);
392 smgr = (struct ifpga_sec_mgr *)fme->sec_mgr;
394 get_rsu_status(smgr, &status, NULL);
395 if (status != IFPGA_RSU_IDLE) {
396 dev_info(smgr, "Cancel secure flash update\n");
397 set_rsu_control(smgr, IFPGA_RSU_ABORT);
403 get_rsu_status(smgr, &status, NULL);
404 if (status == IFPGA_RSU_IDLE)
406 if (secure_update_cancel(smgr) == 0)
407 set_rsu_status(smgr, IFPGA_RSU_IDLE, 0);
409 } while (--retry > 0);
411 dev_err(smgr, "Failed to stop flash update\n");
419 int fpga_reload(struct ifpga_fme_hw *fme, int type, int page)
421 struct ifpga_sec_mgr *smgr = NULL;
424 dev_err(fme, "Input parameter of %s is invalid\n", __func__);
427 smgr = (struct ifpga_sec_mgr *)fme->sec_mgr;
429 if (!smgr || !smgr->ops || !smgr->ops->reload)
432 return smgr->ops->reload(smgr, type, page);