Skip to content

Commit 4f8f73f

Browse files
authored
Merge pull request #466 from rradjabi/aws-2018_2-data-retention
AWS 2018.2 Data Retention
2 parents 7c13004 + b2998d9 commit 4f8f73f

File tree

4 files changed

+74
-33
lines changed

4 files changed

+74
-33
lines changed

src/runtime_src/driver/xclng/drm/xocl/userpf/xocl_drm.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,8 @@ int xocl_drm_init(struct xocl_dev *xdev)
437437
void xocl_drm_fini(struct xocl_dev *xdev)
438438
{
439439
xocl_cleanup_mem(xdev);
440-
440+
xocl_cleanup_connectivity(xdev);
441441
drm_put_dev(xdev->ddev);
442-
443442
mutex_destroy(&xdev->ctx_list_lock);
444443
mutex_destroy(&xdev->stat_lock);
445444
mutex_destroy(&xdev->mm_lock);
@@ -504,14 +503,6 @@ void xocl_cleanup_mem(struct xocl_dev *xdev)
504503
u16 i, ddr;
505504

506505
topology = xdev->topology;
507-
508-
vfree(xdev->layout);
509-
xdev->layout = NULL;
510-
vfree(xdev->debug_layout);
511-
xdev->debug_layout = NULL;
512-
vfree(xdev->connectivity);
513-
xdev->connectivity = NULL;
514-
515506
if (topology == NULL)
516507
return;
517508

@@ -531,6 +522,16 @@ void xocl_cleanup_mem(struct xocl_dev *xdev)
531522
xdev->topology = NULL;
532523
}
533524

525+
void xocl_cleanup_connectivity(struct xocl_dev *xdev)
526+
{
527+
vfree(xdev->layout);
528+
xdev->layout = NULL;
529+
vfree(xdev->debug_layout);
530+
xdev->debug_layout = NULL;
531+
vfree(xdev->connectivity);
532+
xdev->connectivity = NULL;
533+
}
534+
534535
ssize_t xocl_mm_sysfs_stat(struct xocl_dev *xdev, char *buf, bool raw)
535536
{
536537
int i;

src/runtime_src/driver/xclng/drm/xocl/userpf/xocl_drm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ int xocl_drm_init(struct xocl_dev *xdev);
2828
void xocl_drm_fini(struct xocl_dev *xdev);
2929

3030
void xocl_cleanup_mem(struct xocl_dev *xdev);
31+
void xocl_cleanup_connectivity(struct xocl_dev *xdev);
3132
int xocl_check_topology(struct xocl_dev *xdev);
3233

3334
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0)

src/runtime_src/driver/xclng/drm/xocl/userpf/xocl_ioctl.c

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,8 @@ xocl_read_axlf_helper(struct xocl_dev *xdev, struct drm_xocl_axlf *axlf_ptr)
447447
size_t size_of_header;
448448
size_t num_of_sections;
449449
size_t size;
450+
int preserve_mem = 0;
451+
struct mem_topology *new_topology;
450452

451453
userpf_info(xdev, "READ_AXLF IOCTL\n");
452454

@@ -509,12 +511,6 @@ xocl_read_axlf_helper(struct xocl_dev *xdev, struct drm_xocl_axlf *axlf_ptr)
509511
goto done;
510512
}
511513

512-
//Switching the xclbin, make sure none of the buffers are used.
513-
err = xocl_check_topology(xdev);
514-
if(err)
515-
goto done;
516-
517-
xocl_cleanup_mem(xdev);
518514

519515
//Copy from user space and proceed.
520516
size_of_header = sizeof(struct axlf_section_header);
@@ -540,6 +536,42 @@ xocl_read_axlf_helper(struct xocl_dev *xdev, struct drm_xocl_axlf *axlf_ptr)
540536
goto done;
541537
}
542538

539+
/* Populating MEM_TOPOLOGY sections. */
540+
size = xocl_read_sect(MEM_TOPOLOGY, &new_topology, axlf, buf);
541+
if (size <= 0) {
542+
if (size != 0)
543+
goto done;
544+
} else if (sizeof_sect(new_topology, m_mem_data) != size) {
545+
err = -EINVAL;
546+
goto done;
547+
}
548+
549+
/* Compare MEM_TOPOLOGY previous vs new. Ignore this and keep disable preserve_mem if not for aws.*/
550+
if (xocl_is_aws(xdev) && (xdev->topology != NULL)) {
551+
if ( (size == sizeof_sect(xdev->topology, m_mem_data)) &&
552+
!memcmp(new_topology, xdev->topology, size) ) {
553+
printk(KERN_INFO "XOCL: MEM_TOPOLOGY match, preserve mem_topology.\n");
554+
preserve_mem = 1;
555+
} else {
556+
printk(KERN_INFO "XOCL: MEM_TOPOLOGY mismatch, do not preserve mem_topology.\n");
557+
}
558+
}
559+
560+
/* Switching the xclbin, make sure none of the buffers are used. */
561+
if (!preserve_mem) {
562+
err = xocl_check_topology(xdev);
563+
if(err)
564+
goto done;
565+
xocl_cleanup_mem(xdev);
566+
}
567+
xocl_cleanup_connectivity(xdev);
568+
569+
/* Copy MEM_TOPOLOGY from new_toplogy if not preserving memory. */
570+
if (!preserve_mem)
571+
xdev->topology = new_topology;
572+
else
573+
vfree(new_topology);
574+
543575
/* Populating IP_LAYOUT sections */
544576
/* zocl_read_sect return size of section when successfully find it */
545577
size = xocl_read_sect(IP_LAYOUT, &xdev->layout, axlf, buf);
@@ -571,20 +603,12 @@ xocl_read_axlf_helper(struct xocl_dev *xdev, struct drm_xocl_axlf *axlf_ptr)
571603
goto done;
572604
}
573605

574-
/* Populating MEM_TOPOLOGY sections */
575-
size = xocl_read_sect(MEM_TOPOLOGY, &xdev->topology, axlf, buf);
576-
if (size <= 0) {
577-
if (size != 0)
606+
if (!preserve_mem) {
607+
err = xocl_init_mm(xdev);
608+
if (err)
578609
goto done;
579-
} else if (sizeof_sect(xdev->topology, m_mem_data) != size) {
580-
err = -EINVAL;
581-
goto done;
582610
}
583611

584-
err = xocl_init_mm(xdev);
585-
if (err)
586-
goto done;
587-
588612
//Populate with "this" bitstream, so avoid redownload the next time
589613
xdev->unique_id_last_bitstream = bin_obj.m_uniqueId;
590614
uuid_copy(&xdev->xclbin_id, &bin_obj.m_header.uuid);

src/runtime_src/driver/xclng/xrt/user_aws/shim.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,21 +167,36 @@ namespace awsbwhal {
167167
return retVal;
168168

169169
if ( (xclbin_id_from_sysfs == 0) || (axlfbuffer->m_uniqueId != xclbin_id_from_sysfs) || checkAndSkipReload(afi_id, &orig_info) ) {
170-
// proceed with download
171-
retVal = fpga_mgmt_load_local_image(mBoardNumber, afi_id);
172-
if (!retVal) {
173-
retVal = sleepUntilLoaded( std::string(afi_id) );
170+
// force data retention option
171+
union fpga_mgmt_load_local_image_options opt;
172+
fpga_mgmt_init_load_local_image_options(&opt);
173+
opt.flags = FPGA_CMD_DRAM_DATA_RETENTION;
174+
opt.afi_id = afi_id;
175+
opt.slot_id = mBoardNumber;
176+
retVal = fpga_mgmt_load_local_image_with_options(&opt);
177+
if (retVal == FPGA_ERR_DRAM_DATA_RETENTION_NOT_POSSIBLE ||
178+
retVal == FPGA_ERR_DRAM_DATA_RETENTION_FAILED ||
179+
retVal == FPGA_ERR_DRAM_DATA_RETENTION_SETUP_FAILED) {
180+
std::cout << "INFO: Could not load AFI for data retention, code: " << retVal
181+
<< " - Loading in classic mode." << std::endl;
182+
retVal = fpga_mgmt_load_local_image(mBoardNumber, afi_id);
183+
}
184+
// check retVal from image load
185+
if (retVal) {
186+
std::cout << "Failed to load AFI, error: " << retVal << std::endl;
187+
return -retVal;
174188
}
189+
retVal = sleepUntilLoaded( std::string(afi_id) );
175190
if (!retVal) {
176191
drm_xocl_axlf axlf_obj = { reinterpret_cast<axlf*>(const_cast<xclBin*>(buffer)) };
177192
retVal = ioctl(mUserHandle, DRM_IOCTL_XOCL_READ_AXLF, &axlf_obj);
178193
if (retVal) {
179194
std::cout << "IOCTL DRM_IOCTL_XOCL_READ_AXLF Failed: " << retVal << std::endl;
180195
} else {
181-
std::cout << "AFI load complete." << std::endl;
196+
std::cout << "AFI load complete." << std::endl;
182197
}
183198
}
184-
}
199+
}
185200
return retVal;
186201
} else {
187202
//char* afi_id = get_afi_from_xclBin(buffer);

0 commit comments

Comments
 (0)