Skip to content

Commit a3e384b

Browse files
tiensungDinh Nguyen
authored andcommitted
HSD #1509326948: fpga: altera-cvp: Recovery retry
If an incorrect bitstream is sent, there is a need to retry the tear-down if it fails. We shall set a maximum of 10 tries to recover the system from a permanent failure. Signed-off-by: Ang Tien Sung <[email protected]>
1 parent b589b94 commit a3e384b

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

drivers/fpga/altera-cvp.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
#define ALTERA_CVP_V1_SIZE 4
6767
#define ALTERA_CVP_V2_SIZE 4096
6868

69+
/* Tear-down retry */
70+
#define CVP_TEARDOWN_MAX_RETRY 10
6971
/* Optional CvP config error status check for debugging */
7072
static bool altera_cvp_chkcfg;
7173

@@ -315,6 +317,22 @@ static int altera_cvp_teardown(struct fpga_manager *mgr,
315317
return ret;
316318
}
317319

320+
static int altera_cvp_recovery(struct fpga_manager *mgr,
321+
struct fpga_image_info *info)
322+
{
323+
int ret = 0, retry = 0;
324+
325+
for (retry = 0; retry < CVP_TEARDOWN_MAX_RETRY; retry++) {
326+
ret = altera_cvp_teardown(mgr, info);
327+
if (!ret)
328+
break;
329+
dev_warn(&mgr->dev,
330+
"%s: [%d] Tear-down failed. Retrying\n",
331+
__func__,
332+
retry);
333+
}
334+
return ret;
335+
}
318336
static int altera_cvp_write_init(struct fpga_manager *mgr,
319337
struct fpga_image_info *info,
320338
const char *buf, size_t count)
@@ -347,7 +365,7 @@ static int altera_cvp_write_init(struct fpga_manager *mgr,
347365

348366
if (val & VSE_CVP_STATUS_CFG_RDY) {
349367
dev_warn(&mgr->dev, "CvP already started, tear down first\n");
350-
ret = altera_cvp_teardown(mgr, info);
368+
ret = altera_cvp_recovery(mgr, info);
351369
if (ret)
352370
return ret;
353371
}
@@ -488,7 +506,7 @@ static int altera_cvp_write_complete(struct fpga_manager *mgr,
488506
u32 mask, val;
489507
int ret;
490508

491-
ret = altera_cvp_teardown(mgr, info);
509+
ret = altera_cvp_recovery(mgr, info);
492510
if (ret)
493511
return ret;
494512

0 commit comments

Comments
 (0)