int AwsXcl::xclLoadXclBin()

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
    }