2023-03-27 09:54:51 -06:00
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
*
* Copyright ( c ) 2019 - 2020 , The Linux Foundation . All rights reserved .
* Copyright ( c ) 2021 - 2023 Qualcomm Innovation Center , Inc . All rights reserved .
*/
# ifndef QAIC_ACCEL_H_
# define QAIC_ACCEL_H_
# include "drm.h"
# if defined(__cplusplus)
extern " C " {
# endif
/* The length(4K) includes len and count fields of qaic_manage_msg */
# define QAIC_MANAGE_MAX_MSG_LENGTH SZ_4K
/* semaphore flags */
# define QAIC_SEM_INSYNCFENCE 2
# define QAIC_SEM_OUTSYNCFENCE 1
/* Semaphore commands */
# define QAIC_SEM_NOP 0
# define QAIC_SEM_INIT 1
# define QAIC_SEM_INC 2
# define QAIC_SEM_DEC 3
# define QAIC_SEM_WAIT_EQUAL 4
# define QAIC_SEM_WAIT_GT_EQ 5 /* Greater than or equal */
# define QAIC_SEM_WAIT_GT_0 6 /* Greater than 0 */
# define QAIC_TRANS_UNDEFINED 0
# define QAIC_TRANS_PASSTHROUGH_FROM_USR 1
# define QAIC_TRANS_PASSTHROUGH_TO_USR 2
# define QAIC_TRANS_PASSTHROUGH_FROM_DEV 3
# define QAIC_TRANS_PASSTHROUGH_TO_DEV 4
# define QAIC_TRANS_DMA_XFER_FROM_USR 5
# define QAIC_TRANS_DMA_XFER_TO_DEV 6
# define QAIC_TRANS_ACTIVATE_FROM_USR 7
# define QAIC_TRANS_ACTIVATE_FROM_DEV 8
# define QAIC_TRANS_ACTIVATE_TO_DEV 9
# define QAIC_TRANS_DEACTIVATE_FROM_USR 10
# define QAIC_TRANS_DEACTIVATE_FROM_DEV 11
# define QAIC_TRANS_STATUS_FROM_USR 12
# define QAIC_TRANS_STATUS_TO_USR 13
# define QAIC_TRANS_STATUS_FROM_DEV 14
# define QAIC_TRANS_STATUS_TO_DEV 15
# define QAIC_TRANS_TERMINATE_FROM_DEV 16
# define QAIC_TRANS_TERMINATE_TO_DEV 17
# define QAIC_TRANS_DMA_XFER_CONT 18
# define QAIC_TRANS_VALIDATE_PARTITION_FROM_DEV 19
# define QAIC_TRANS_VALIDATE_PARTITION_TO_DEV 20
/**
* struct qaic_manage_trans_hdr - Header for a transaction in a manage message .
* @ type : In . Identifies this transaction . See QAIC_TRANS_ * defines .
* @ len : In . Length of this transaction , including this header .
*/
struct qaic_manage_trans_hdr {
__u32 type ;
__u32 len ;
} ;
/**
* struct qaic_manage_trans_passthrough - Defines a passthrough transaction .
* @ hdr : In . Header to identify this transaction .
* @ data : In . Payload of this ransaction . Opaque to the driver . Userspace must
* encode in little endian and align / pad to 64 - bit .
*/
struct qaic_manage_trans_passthrough {
struct qaic_manage_trans_hdr hdr ;
__u8 data [ ] ;
} ;
/**
* struct qaic_manage_trans_dma_xfer - Defines a DMA transfer transaction .
* @ hdr : In . Header to identify this transaction .
* @ tag : In . Identified this transfer in other transactions . Opaque to the
* driver .
* @ pad : Structure padding .
* @ addr : In . Address of the data to DMA to the device .
* @ size : In . Length of the data to DMA to the device .
*/
struct qaic_manage_trans_dma_xfer {
struct qaic_manage_trans_hdr hdr ;
__u32 tag ;
__u32 pad ;
__u64 addr ;
__u64 size ;
} ;
/**
* struct qaic_manage_trans_activate_to_dev - Defines an activate request .
* @ hdr : In . Header to identify this transaction .
* @ queue_size : In . Number of elements for DBC request and response queues .
* @ eventfd : Unused .
* @ options : In . Device specific options for this activate .
* @ pad : Structure padding . Must be 0.
*/
struct qaic_manage_trans_activate_to_dev {
struct qaic_manage_trans_hdr hdr ;
__u32 queue_size ;
__u32 eventfd ;
__u32 options ;
__u32 pad ;
} ;
/**
* struct qaic_manage_trans_activate_from_dev - Defines an activate response .
* @ hdr : Out . Header to identify this transaction .
* @ status : Out . Return code of the request from the device .
* @ dbc_id : Out . Id of the assigned DBC for successful request .
* @ options : Out . Device specific options for this activate .
*/
struct qaic_manage_trans_activate_from_dev {
struct qaic_manage_trans_hdr hdr ;
__u32 status ;
__u32 dbc_id ;
__u64 options ;
} ;
/**
* struct qaic_manage_trans_deactivate - Defines a deactivate request .
* @ hdr : In . Header to identify this transaction .
* @ dbc_id : In . Id of assigned DBC .
* @ pad : Structure padding . Must be 0.
*/
struct qaic_manage_trans_deactivate {
struct qaic_manage_trans_hdr hdr ;
__u32 dbc_id ;
__u32 pad ;
} ;
/**
* struct qaic_manage_trans_status_to_dev - Defines a status request .
* @ hdr : In . Header to identify this transaction .
*/
struct qaic_manage_trans_status_to_dev {
struct qaic_manage_trans_hdr hdr ;
} ;
/**
* struct qaic_manage_trans_status_from_dev - Defines a status response .
* @ hdr : Out . Header to identify this transaction .
* @ major : Out . NNC protocol version major number .
* @ minor : Out . NNC protocol version minor number .
* @ status : Out . Return code from device .
* @ status_flags : Out . Flags from device . Bit 0 indicates if CRCs are required .
*/
struct qaic_manage_trans_status_from_dev {
struct qaic_manage_trans_hdr hdr ;
__u16 major ;
__u16 minor ;
__u32 status ;
__u64 status_flags ;
} ;
/**
* struct qaic_manage_msg - Defines a message to the device .
* @ len : In . Length of all the transactions contained within this message .
* @ count : In . Number of transactions in this message .
* @ data : In . Address to an array where the transactions can be found .
*/
struct qaic_manage_msg {
__u32 len ;
__u32 count ;
__u64 data ;
} ;
/**
* struct qaic_create_bo - Defines a request to create a buffer object .
* @ size : In . Size of the buffer in bytes .
* @ handle : Out . GEM handle for the BO .
* @ pad : Structure padding . Must be 0.
*/
struct qaic_create_bo {
__u64 size ;
__u32 handle ;
__u32 pad ;
} ;
/**
* struct qaic_mmap_bo - Defines a request to prepare a BO for mmap ( ) .
* @ handle : In . Handle of the GEM BO to prepare for mmap ( ) .
* @ pad : Structure padding . Must be 0.
* @ offset : Out . Offset value to provide to mmap ( ) .
*/
struct qaic_mmap_bo {
__u32 handle ;
__u32 pad ;
__u64 offset ;
} ;
/**
* struct qaic_sem - Defines a semaphore command for a BO slice .
* @ val : In . Only lower 12 bits are valid .
* @ index : In . Only lower 5 bits are valid .
* @ presync : In . 1 if presync operation , 0 if postsync .
* @ cmd : In . One of QAIC_SEM_ * .
* @ flags : In . Bitfield . See QAIC_SEM_INSYNCFENCE and QAIC_SEM_OUTSYNCFENCE
* @ pad : Structure padding . Must be 0.
*/
struct qaic_sem {
__u16 val ;
__u8 index ;
__u8 presync ;
__u8 cmd ;
__u8 flags ;
__u16 pad ;
} ;
/**
* struct qaic_attach_slice_entry - Defines a single BO slice .
* @ size : In . Size of this slice in bytes .
* @ sem0 : In . Semaphore command 0. Must be 0 is not valid .
* @ sem1 : In . Semaphore command 1. Must be 0 is not valid .
* @ sem2 : In . Semaphore command 2. Must be 0 is not valid .
* @ sem3 : In . Semaphore command 3. Must be 0 is not valid .
* @ dev_addr : In . Device address this slice pushes to or pulls from .
* @ db_addr : In . Address of the doorbell to ring .
* @ db_data : In . Data to write to the doorbell .
* @ db_len : In . Size of the doorbell data in bits - 32 , 16 , or 8. 0 is for
* inactive doorbells .
* @ offset : In . Start of this slice as an offset from the start of the BO .
*/
struct qaic_attach_slice_entry {
__u64 size ;
struct qaic_sem sem0 ;
struct qaic_sem sem1 ;
struct qaic_sem sem2 ;
struct qaic_sem sem3 ;
__u64 dev_addr ;
__u64 db_addr ;
__u32 db_data ;
__u32 db_len ;
__u64 offset ;
} ;
/**
* struct qaic_attach_slice_hdr - Defines metadata for a set of BO slices .
* @ count : In . Number of slices for this BO .
* @ dbc_id : In . Associate the sliced BO with this DBC .
* @ handle : In . GEM handle of the BO to slice .
* @ dir : In . Direction of data flow . 1 = DMA_TO_DEVICE , 2 = DMA_FROM_DEVICE
2023-09-01 11:22:41 -06:00
* @ size : In . Total length of BO being used . This should not exceed base
* size of BO ( struct drm_gem_object . base )
* For BOs being allocated using DRM_IOCTL_QAIC_CREATE_BO , size of
* BO requested is PAGE_SIZE aligned then allocated hence allocated
* BO size maybe bigger . This size should not exceed the new
* PAGE_SIZE aligned BO size .
2023-03-27 09:54:51 -06:00
* @ dev_addr : In . Device address this slice pushes to or pulls from .
* @ db_addr : In . Address of the doorbell to ring .
* @ db_data : In . Data to write to the doorbell .
* @ db_len : In . Size of the doorbell data in bits - 32 , 16 , or 8. 0 is for
* inactive doorbells .
* @ offset : In . Start of this slice as an offset from the start of the BO .
*/
struct qaic_attach_slice_hdr {
__u32 count ;
__u32 dbc_id ;
__u32 handle ;
__u32 dir ;
__u64 size ;
} ;
/**
* struct qaic_attach_slice - Defines a set of BO slices .
* @ hdr : In . Metadata of the set of slices .
* @ data : In . Pointer to an array containing the slice definitions .
*/
struct qaic_attach_slice {
struct qaic_attach_slice_hdr hdr ;
__u64 data ;
} ;
/**
* struct qaic_execute_entry - Defines a BO to submit to the device .
* @ handle : In . GEM handle of the BO to commit to the device .
* @ dir : In . Direction of data . 1 = to device , 2 = from device .
*/
struct qaic_execute_entry {
__u32 handle ;
__u32 dir ;
} ;
/**
* struct qaic_partial_execute_entry - Defines a BO to resize and submit .
* @ handle : In . GEM handle of the BO to commit to the device .
* @ dir : In . Direction of data . 1 = to device , 2 = from device .
2023-10-27 10:43:30 -06:00
* @ resize : In . New size of the BO . Must be < = the original BO size .
* @ resize as 0 would be interpreted as no DMA transfer is
* involved .
2023-03-27 09:54:51 -06:00
*/
struct qaic_partial_execute_entry {
__u32 handle ;
__u32 dir ;
__u64 resize ;
} ;
/**
* struct qaic_execute_hdr - Defines metadata for BO submission .
* @ count : In . Number of BOs to submit .
* @ dbc_id : In . DBC to submit the BOs on .
*/
struct qaic_execute_hdr {
__u32 count ;
__u32 dbc_id ;
} ;
/**
* struct qaic_execute - Defines a list of BOs to submit to the device .
* @ hdr : In . BO list metadata .
* @ data : In . Pointer to an array of BOs to submit .
*/
struct qaic_execute {
struct qaic_execute_hdr hdr ;
__u64 data ;
} ;
/**
* struct qaic_wait - Defines a blocking wait for BO execution .
* @ handle : In . GEM handle of the BO to wait on .
* @ timeout : In . Maximum time in ms to wait for the BO .
* @ dbc_id : In . DBC the BO is submitted to .
* @ pad : Structure padding . Must be 0.
*/
struct qaic_wait {
__u32 handle ;
__u32 timeout ;
__u32 dbc_id ;
__u32 pad ;
} ;
/**
* struct qaic_perf_stats_hdr - Defines metadata for getting BO perf info .
* @ count : In . Number of BOs requested .
* @ pad : Structure padding . Must be 0.
* @ dbc_id : In . DBC the BO are associated with .
*/
struct qaic_perf_stats_hdr {
__u16 count ;
__u16 pad ;
__u32 dbc_id ;
} ;
/**
* struct qaic_perf_stats - Defines a request for getting BO perf info .
* @ hdr : In . Request metadata
* @ data : In . Pointer to array of stats structures that will receive the data .
*/
struct qaic_perf_stats {
struct qaic_perf_stats_hdr hdr ;
__u64 data ;
} ;
/**
* struct qaic_perf_stats_entry - Defines a BO perf info .
* @ handle : In . GEM handle of the BO to get perf stats for .
* @ queue_level_before : Out . Number of elements in the queue before this BO
* was submitted .
* @ num_queue_element : Out . Number of elements added to the queue to submit
* this BO .
* @ submit_latency_us : Out . Time taken by the driver to submit this BO .
* @ device_latency_us : Out . Time taken by the device to execute this BO .
* @ pad : Structure padding . Must be 0.
*/
struct qaic_perf_stats_entry {
__u32 handle ;
__u32 queue_level_before ;
__u32 num_queue_element ;
__u32 submit_latency_us ;
__u32 device_latency_us ;
__u32 pad ;
} ;
2023-09-01 11:22:47 -06:00
/**
* struct qaic_detach_slice - Detaches slicing configuration from BO .
* @ handle : In . GEM handle of the BO to detach slicing configuration .
* @ pad : Structure padding . Must be 0.
*/
struct qaic_detach_slice {
__u32 handle ;
__u32 pad ;
} ;
2023-03-27 09:54:51 -06:00
# define DRM_QAIC_MANAGE 0x00
# define DRM_QAIC_CREATE_BO 0x01
# define DRM_QAIC_MMAP_BO 0x02
# define DRM_QAIC_ATTACH_SLICE_BO 0x03
# define DRM_QAIC_EXECUTE_BO 0x04
# define DRM_QAIC_PARTIAL_EXECUTE_BO 0x05
# define DRM_QAIC_WAIT_BO 0x06
# define DRM_QAIC_PERF_STATS_BO 0x07
2023-09-01 11:22:47 -06:00
# define DRM_QAIC_DETACH_SLICE_BO 0x08
2023-03-27 09:54:51 -06:00
# define DRM_IOCTL_QAIC_MANAGE DRM_IOWR(DRM_COMMAND_BASE + DRM_QAIC_MANAGE, struct qaic_manage_msg)
# define DRM_IOCTL_QAIC_CREATE_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_QAIC_CREATE_BO, struct qaic_create_bo)
# define DRM_IOCTL_QAIC_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_QAIC_MMAP_BO, struct qaic_mmap_bo)
# define DRM_IOCTL_QAIC_ATTACH_SLICE_BO DRM_IOW(DRM_COMMAND_BASE + DRM_QAIC_ATTACH_SLICE_BO, struct qaic_attach_slice)
# define DRM_IOCTL_QAIC_EXECUTE_BO DRM_IOW(DRM_COMMAND_BASE + DRM_QAIC_EXECUTE_BO, struct qaic_execute)
# define DRM_IOCTL_QAIC_PARTIAL_EXECUTE_BO DRM_IOW(DRM_COMMAND_BASE + DRM_QAIC_PARTIAL_EXECUTE_BO, struct qaic_execute)
# define DRM_IOCTL_QAIC_WAIT_BO DRM_IOW(DRM_COMMAND_BASE + DRM_QAIC_WAIT_BO, struct qaic_wait)
# define DRM_IOCTL_QAIC_PERF_STATS_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_QAIC_PERF_STATS_BO, struct qaic_perf_stats)
2023-09-01 11:22:47 -06:00
# define DRM_IOCTL_QAIC_DETACH_SLICE_BO DRM_IOW(DRM_COMMAND_BASE + DRM_QAIC_DETACH_SLICE_BO, struct qaic_detach_slice)
2023-03-27 09:54:51 -06:00
# if defined(__cplusplus)
}
# endif
# endif /* QAIC_ACCEL_H_ */