in SDAccel/userspace/src/shim.cpp [149:217]
int AwsXcl::xclLoadXclBin(const xclBin *buffer)
{
char *xclbininmemory = reinterpret_cast<char*> (const_cast<xclBin*> (buffer));
#ifdef INTERNAL_TESTING
if (!memcmp(xclbininmemory, "xclbin2", 8)) {
return xclLoadAxlf(reinterpret_cast<axlf*>(xclbininmemory));
}
if (mLogStream.is_open()) {
mLogStream << __func__ << ", " << std::this_thread::get_id() << ", " << buffer << std::endl;
}
if (!mLocked)
return -EPERM;
const unsigned cmd = AWSMGMT_IOCICAPDOWNLOAD;
awsmgmt_ioc_bitstream obj = {const_cast<xclBin *>(buffer)};
return ioctl(mMgtHandle, cmd, &obj);
#else
if (!memcmp(xclbininmemory, "xclbin2", 8)) {
int retVal = 0;
axlf *axlfbuffer = reinterpret_cast<axlf*>(const_cast<xclBin*> (buffer));
fpga_mgmt_image_info orig_info;
char* afi_id = get_afi_from_axlf(axlfbuffer);
std::memset(&orig_info, 0, sizeof(struct fpga_mgmt_image_info));
fpga_mgmt_describe_local_image(mBoardNumber, &orig_info, 0);
uint64_t xclbin_id_from_sysfs;
if( int retVal = xclGetXclBinIdFromSysfs( xclbin_id_from_sysfs ) != 0 )
return retVal;
if ( (xclbin_id_from_sysfs == 0) || (axlfbuffer->m_uniqueId != xclbin_id_from_sysfs) || checkAndSkipReload(afi_id, &orig_info) ) {
// force data retention option
union fpga_mgmt_load_local_image_options opt;
fpga_mgmt_init_load_local_image_options(&opt);
opt.flags = FPGA_CMD_DRAM_DATA_RETENTION;
opt.afi_id = afi_id;
opt.slot_id = mBoardNumber;
retVal = fpga_mgmt_load_local_image_with_options(&opt);
if (retVal == FPGA_ERR_DRAM_DATA_RETENTION_NOT_POSSIBLE ||
retVal == FPGA_ERR_DRAM_DATA_RETENTION_FAILED ||
retVal == FPGA_ERR_DRAM_DATA_RETENTION_SETUP_FAILED) {
std::cout << "INFO: Could not load AFI for data retention, code: " << retVal
<< " - Loading in classic mode." << std::endl;
retVal = fpga_mgmt_load_local_image(mBoardNumber, afi_id);
}
// check retVal from image load
if (retVal) {
std::cout << "Failed to load AFI, error: " << retVal << std::endl;
return -retVal;
}
retVal = sleepUntilLoaded( std::string(afi_id) );
if (!retVal) {
drm_xocl_axlf axlf_obj = { reinterpret_cast<axlf*>(const_cast<xclBin*>(buffer)) };
retVal = ioctl(mUserHandle, DRM_IOCTL_XOCL_READ_AXLF, &axlf_obj);
if (retVal) {
std::cout << "IOCTL DRM_IOCTL_XOCL_READ_AXLF Failed: " << retVal << std::endl;
} else {
std::cout << "AFI load complete." << std::endl;
}
}
}
return retVal;
} else {
char* afi_id = get_afi_from_xclBin(buffer);
return fpga_mgmt_load_local_image(mBoardNumber, afi_id);
}
#endif
}