ZOCL Driver Interfaces

A GEM style driver for Xilinx edge based accelerators

This file defines ioctl command codes and associated structures for interacting with zocl driver for Xilinx FPGA platforms(Zynq/ZynqMP/Versal).

Accelerator memory allocation is modeled as buffer objects (bo). zocl supports both SMMU based shared virtual memory and CMA based shared physical memory between PS and PL. zocl also supports memory management of PL-DDRs and PL-BRAMs. PL-DDR is reserved by zocl driver via device tree. Both PS Linux and PL logic can access PL-DDRs

Execution model is asynchronous where execute commands are submitted using command buffers and POSIX poll is used to wait for finished commands. Commands for a compute unit can only be submitted after an explicit context has been opened by the client for that compute unit.

zocl driver functionality is described in the following table.

# Functionality ioctl request code data format
1 Allocate buffer on device DRM_IOCTL_ZOCL_CREATE_BO drm_zocl_create_bo
2 Allocate buffer on device with userptr DRM_IOCTL_ZOCL_USERPTR_BO drm_zocl_userptr_bo
3 Get the buffer handle of given physical address DRM_IOCTL_ZOCL_GET_HOST_BO drm_zocl_host_bo
4 Prepare bo for mapping into user’s address space DRM_IOCTL_ZOCL_MAP_BO drm_zocl_map_bo
5 Synchronize (DMA) buffer contents in requested direction DRM_IOCTL_ZOCL_SYNC_BO drm_zocl_sync_bo
6 Obtain information about buffer object DRM_IOCTL_ZOCL_INFO_BO drm_zocl_info_bo
7 Update bo backing storage with user’s data DRM_IOCTL_ZOCL_PWRITE_BO drm_zocl_pwrite_bo
8 Read back data in bo backing storage DRM_IOCTL_ZOCL_PREAD_BO drm_zocl_pread_bo
9 Update device view with a specific xclbin image DRM_IOCTL_ZOCL_PCAP_DOWNLOAD drm_zocl_pcap_download
10 Read the xclbin and map the compute units. DRM_IOCTL_ZOCL_READ_AXLF drm_zocl_axlf
11 Send an execute job to a compute unit DRM_IOCTL_ZOCL_EXECBUF drm_zocl_execbuf
12 Get the soft kernel command (experimental) DRM_IOCTL_ZOCL_SK_GETCMD drm_zocl_sk_getcmd
13 Create the soft kernel (experimental) DRM_IOCTL_ZOCL_SK_CREATE drm_zocl_sk_create
14 Report the soft kernel state (experimental) DRM_IOCTL_ZOCL_SK_REPORT drm_zocl_sk_report
15 Get Information about Compute Unit (experimental) DRM_IOCTL_ZOCL_INFO_CU drm_zocl_info_cu
struct drm_zocl_create_bo

Create buffer object used with DRM_IOCTL_ZOCL_CREATE_BO ioctl

Definition

struct drm_zocl_create_bo {
  uint64_t size;
  uint32_t handle;
  uint32_t flags;
};

Members

size
Requested size of the buffer object
handle
bo handle returned by the driver
flags
DRM_ZOCL_BO_XXX flags
struct drm_zocl_userptr_bo

Create buffer object with user’s pointer used with DRM_IOCTL_ZOCL_USERPTR_BO ioctl

Definition

struct drm_zocl_userptr_bo {
  uint64_t addr;
  uint64_t size;
  uint32_t handle;
  uint32_t flags;
};

Members

addr
Address of buffer allocated by user
size
Requested size of the buffer object
handle
bo handle returned by the driver
flags
DRM_XOCL_BO_XXX flags
struct drm_zocl_map_bo

Prepare a buffer object for mmap used with DRM_IOCTL_ZOCL_MAP_BO ioctl

Definition

struct drm_zocl_map_bo {
  uint32_t handle;
  uint32_t pad;
  uint64_t offset;
};

Members

handle
bo handle
pad
Unused
offset
‘Fake’ offset returned by the driver which can be used with POSIX mmap
struct drm_zocl_sync_bo

Synchronize the buffer in the requested direction via cache flush/invalidation. used with DRM_ZOCL_SYNC_BO ioctl.

Definition

struct drm_zocl_sync_bo {
  uint32_t handle;
  enum drm_zocl_sync_bo_dir dir;
  uint64_t offset;
  uint64_t size;
};

Members

handle
GEM object handle
dir
DRM_ZOCL_SYNC_DIR_XXX
offset
Offset into the object to write to
size
Length of data to write
struct drm_zocl_info_bo

Obtain information about buffer object used with DRM_IOCTL_ZOCL_INFO_BO ioctl

Definition

struct drm_zocl_info_bo {
  uint32_t handle;
  uint64_t size;
  uint64_t paddr;
};

Members

handle
GEM object handle
size
Size of BO
paddr
physical address
struct drm_zocl_host_bo

Get the buffer handle of given physical address used with DRM_IOCTL_ZOCL_GET_HOST_BO ioctl

Definition

struct drm_zocl_host_bo {
  uint64_t paddr;
  size_t size;
  uint32_t handle;
};

Members

paddr
physical address
size
Size of BO
handle
GEM object handle
struct drm_zocl_pwrite_bo

Update bo with user’s data used with DRM_IOCTL_ZOCL_PWRITE_BO ioctl

Definition

struct drm_zocl_pwrite_bo {
  uint32_t handle;
  uint32_t pad;
  uint64_t offset;
  uint64_t size;
  uint64_t data_ptr;
};

Members

handle
GEM object handle
pad
Padding
offset
Offset into the object to write to
size
Length of data to write
data_ptr
Pointer to read the data from (pointers not 32/64 compatible)
struct drm_zocl_pread_bo

Read data from bo used with DRM_IOCTL_ZOCL_PREAD_BO ioctl

Definition

struct drm_zocl_pread_bo {
  uint32_t handle;
  uint32_t pad;
  uint64_t offset;
  uint64_t size;
  uint64_t data_ptr;
};

Members

handle
GEM object handle
pad
Padding
offset
Offset into the object to read from
size
Length of data to wrreadite
data_ptr
Pointer to write the data into (pointers not 32/64 compatible)
struct drm_zocl_info_cu

Get information about Compute Unit (experimental) used with DRM_IOCTL_ZOCL_INFO_CU ioctl

Definition

struct drm_zocl_info_cu {
  uint64_t paddr;
  int apt_idx;
  int cu_idx;
};

Members

paddr
Physical address
apt_idx
Aperture index
cu_idx
CU index
struct drm_zocl_execbuf

Submit a command buffer for execution on a compute unit (experimental) used with DRM_IOCTL_ZOCL_EXECBUF ioctl

Definition

struct drm_zocl_execbuf {
  uint32_t ctx_id;
  uint32_t exec_bo_handle;
};

Members

ctx_id
Pass 0
exec_bo_handle
BO handle of command buffer formatted as ERT command
struct argument_info

Kernel argument information

Definition

struct argument_info {
  char name;
  uint32_t offset;
  uint32_t size;
  uint32_t dir;
};

Members

name
argument name
offset
argument offset in CU
size
argument size in bytes
dir
input or output argument for a CU
struct kernel_info

Kernel information

Definition

struct kernel_info {
  char name;
  int anums;
  struct argument_info args;
};

Members

name
kernel name
anums
number of argument
args
argument array
struct drm_zocl_axlf

Read xclbin (AXLF) device image and map CUs (experimental) used with DRM_IOCTL_ZOCL_READ_AXLF ioctl

Definition

struct drm_zocl_axlf {
  struct axlf * za_xclbin_ptr;
  uint32_t za_flags;
  int za_ksize;
  char * za_kernels;
};

Members

za_xclbin_ptr
Pointer to xclbin (AXLF) object
za_flags
platform flags
za_ksize
size of kernels in bytes
za_kernels
pointer of argument array
struct drm_zocl_sk_getcmd

Get the soft kernel command (experimental) used with DRM_IOCTL_ZOCL_SK_GETCMD ioctl

Definition

struct drm_zocl_sk_getcmd {
  uint32_t opcode;
  uint32_t start_cuidx;
  uint32_t cu_nums;
  size_t size;
  uint64_t paddr;
  char name;
};

Members

opcode
opcode for the Soft Kernel Command Packet
start_cuidx
start index of compute units
cu_nums
number of compute units in program
size
size in bytes of soft kernel image
paddr
soft kernel image’s physical address (little endian)
name
symbol name of soft kernel
struct drm_zocl_aie_cmd

Get the aie command used with DRM_IOCTL_ZOCL_AIE_GETCMD and DRM_IOCTL_ZOCL_AIE_PUTCMD ioctl

Definition

struct drm_zocl_aie_cmd {
  uint32_t opcode;
  uint32_t size;
  char info;
};

Members

opcode
opcode for the Aie Command Packet
size
size in bytes of info data
info
information to transfer
struct drm_zocl_sk_create

Create a soft kernel (experimental) used with DRM_IOCTL_ZOCL_SK_CREATE ioctl

Definition

struct drm_zocl_sk_create {
  uint32_t cu_idx;
  uint32_t handle;
};

Members

cu_idx
Compute unit index
handle
Buffer object handle
struct drm_zocl_sk_report

Report the Soft Kernel State (experimental) used with DRM_IOCTL_ZOCL_SK_REPORT ioctl

Definition

struct drm_zocl_sk_report {
  uint32_t cu_idx;
  enum drm_zocl_scu_state cu_state;
};

Members

cu_idx
Compute unit index
cu_state
State of the Soft Compute Unit