123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566 |
- /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
- /*
- * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
- */
- #ifndef _UAPI_MSM_HGSL_H
- #define _UAPI_MSM_HGSL_H
- #include <linux/types.h>
- #include <linux/ioctl.h>
- #define HGSL_SYNC_TYPE_HSYNC 1
- #define HGSL_SYNC_TYPE_ISYNC 2
- struct hgsl_ibdesc {
- __u64 gpuaddr;
- __u64 sizedwords;
- };
- struct hgsl_mem_object {
- __u64 gpuaddr;
- __u64 sizedwords;
- };
- #define HGSL_IOCTL_BASE 'h'
- #define HGSL_IORW(n, t) _IOWR(HGSL_IOCTL_BASE, n, t)
- #define HGSL_IOW(n, t) _IOW(HGSL_IOCTL_BASE, n, t)
- /**
- * return current status of Doorbell system
- */
- #define DB_STATE_Q_MASK 0xffff
- #define DB_STATE_Q_UNINIT 1
- #define DB_STATE_Q_INIT_DONE 2
- #define DB_STATE_Q_FAULT 3
- #define HGSL_IOCTL_DBQ_GETSTATE HGSL_IORW(0x01, __s32)
- /**
- * struct hgsl_db_queue_inf - initialize Doorbell
- * @fd: File descriptor of DB queue
- * @head_dwords: Size of DB queue header
- * @head_off_dwords: offset of DB queue header
- * @queue_dwords: size of DB queue
- * @queue_off_dwords: offset of DB queue
- * @db_signal: DB signal type, One of DB_SIGNAL_* values
- *
- **/
- struct hgsl_db_queue_inf {
- __s32 fd;
- __u32 head_dwords;
- __s32 head_off_dwords;
- __u32 queue_dwords;
- __s32 queue_off_dwords;
- __u32 db_signal;
- };
- #define DB_SIGNAL_INVALID 0
- #define DB_SIGNAL_GLOBAL_0 1
- #define DB_SIGNAL_GLOBAL_1 2
- #define DB_SIGNAL_LOCAL 3
- #define DB_SIGNAL_MAX DB_SIGNAL_LOCAL
- #define HGSL_IOCTL_DBQ_INIT \
- HGSL_IORW(0x02, struct hgsl_db_queue_inf)
- /**
- * Assign a DB to current instance, input is DB index.
- */
- #define HGSL_IOCTL_DBQ_ASSIGN HGSL_IORW(0x03, __u32)
- /**
- * struct hgsl_dbq_release_info - release DB queue
- * @ref_count; userspace could inform PVM to do cleanup
- * if this param is zero
- * @ctxt_id: Current context
- */
- struct hgsl_dbq_release_info {
- __u32 ref_count;
- __u32 ctxt_id;
- };
- #define HGSL_IOCTL_DBQ_RELEASE \
- HGSL_IORW(0x04, struct hgsl_dbq_release_info)
- /**
- * struct hgsl_fhi_issud_cmds - submit cmds to DB queue
- * @ibs: db commands list
- * @num_ibs: Number of db commands
- * @bos: buffer objects list
- * @num_bos: Number of buffer objects
- * @context_id: Current context for these cmds
- * @flags: reserved
- * @timestamp: Userspace time stamp
- */
- struct hgsl_fhi_issud_cmds {
- __u64 ibs;
- __u32 num_ibs;
- __u64 bos;
- __u32 num_bos;
- __u32 context_id;
- __u32 flags;
- __u32 timestamp;
- __u32 padding;
- };
- #define HGSL_IOCTL_ISSUE_CMDS \
- HGSL_IORW(0x05, struct hgsl_fhi_issud_cmds)
- /**
- * struct hgsl_ctxt_create_info - create a DB context
- * @context_id: Current context for these cmds
- * @shadow_fd: File descriptor of time stamp buffer
- * @shadow_sop_offset: Offset for start timestamp written
- * by GPU before cmds
- * @shadow_eop_offset: Offset for end timestamp written
- * by GPU after cmds
- */
- struct hgsl_ctxt_create_info {
- __u32 context_id;
- __s32 shadow_fd;
- __u32 shadow_sop_offset;
- __u32 shadow_eop_offset;
- };
- struct hgsl_ioctl_ctxt_create_params {
- __u32 devhandle;
- __u32 type;
- __u32 flags;
- __u32 ctxthandle;
- __u32 sync_type;
- __u32 padding;
- };
- #define HGSL_IOCTL_CTXT_CREATE HGSL_IOW(0x10, \
- struct hgsl_ioctl_ctxt_create_params)
- struct hgsl_ioctl_ctxt_destroy_params {
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 rval;
- __u32 padding;
- };
- #define HGSL_IOCTL_CTXT_DESTROY HGSL_IOW(0x11, \
- struct hgsl_ioctl_ctxt_destroy_params)
- /**
- * struct hgsl_wait_ts_info - wait a timestamp to be retired
- * @timestamp: The user timestamp to wait
- * @timeout: Expiry timeout
- */
- struct hgsl_wait_ts_info {
- __u32 context_id;
- __u32 timestamp;
- __u32 timeout;
- __u32 padding;
- __u32 devhandle;
- __u32 channel_id;
- };
- #define HGSL_IOCTL_WAIT_TIMESTAMP \
- HGSL_IOW(0x12, struct hgsl_wait_ts_info)
- /**
- * struct hgsl_ioctl_issueib_params - submit cmds to GPU
- * @ibs: db commands list
- * @devhandle: GPU device handle
- * @ctxthandle: Current context handle for the cmds
- * @timestamp: Userspace time stamp
- * @flags: reserved
- * @num_ibs: Number of ib cmds
- * @rval: return value from host
- * @channel_id: hab channel id
- */
- struct hgsl_ioctl_issueib_params {
- __u64 ibs;
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 timestamp;
- __u32 flags;
- __u32 num_ibs;
- __u32 rval;
- __u32 channel_id;
- __u32 padding;
- };
- #define HGSL_IOCTL_ISSUE_IB \
- HGSL_IORW(0x20, struct hgsl_ioctl_issueib_params)
- struct hgsl_ioctl_issueib_with_alloc_list_params {
- __u64 rpc_syncobj;
- __u64 ibs;
- __u64 allocations;
- __u64 be_data;
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 timestamp;
- __u32 flags;
- __u32 num_ibs;
- __u32 num_allocations;
- __u32 rval;
- __u32 channel_id;
- };
- #define HGSL_IOCTL_ISSUIB_WITH_ALLOC_LIST \
- HGSL_IORW(0x21, struct hgsl_ioctl_issueib_with_alloc_list_params)
- #define HGSL_HYP_GENERAL_MAX_SEND_NUM 2
- #define HGSL_HYP_GENERAL_MAX_REPLY_NUM 1
- struct hgsl_ioctl_hyp_generic_transaction_params {
- __u64 send_data[HGSL_HYP_GENERAL_MAX_SEND_NUM];
- __u64 reply_data[HGSL_HYP_GENERAL_MAX_REPLY_NUM];
- __u32 send_size[HGSL_HYP_GENERAL_MAX_SEND_NUM];
- __u32 reply_size[HGSL_HYP_GENERAL_MAX_REPLY_NUM];
- __u32 send_num;
- __u32 reply_num;
- __u32 cmd_id;
- __u64 ret_value;
- };
- #define HGSL_IOCTL_HYP_GENERIC_TRANSACTION \
- HGSL_IORW(0x22, struct hgsl_ioctl_hyp_generic_transaction_params)
- struct hgsl_ioctl_get_shadowts_mem_params {
- __u64 size;
- __u32 device_id;
- __u32 ctxthandle;
- __u32 flags;
- __s32 fd;
- };
- #define HGSL_IOCTL_GET_SHADOWTS_MEM \
- HGSL_IORW(0x23, struct hgsl_ioctl_get_shadowts_mem_params)
- struct hgsl_ioctl_put_shadowts_mem_params {
- __u32 ctxthandle;
- __u32 padding;
- };
- #define HGSL_IOCTL_PUT_SHADOWTS_MEM \
- HGSL_IOW(0x24, struct hgsl_ioctl_put_shadowts_mem_params)
- struct hgsl_ioctl_mem_alloc_params {
- __u64 memdesc;
- __u32 sizebytes;
- __u32 flags;
- __s32 fd;
- __u32 padding;
- };
- #define HGSL_IOCTL_MEM_ALLOC \
- HGSL_IORW(0x25, struct hgsl_ioctl_mem_alloc_params)
- struct hgsl_ioctl_mem_free_params {
- __u64 memdesc;
- };
- #define HGSL_IOCTL_MEM_FREE \
- HGSL_IORW(0x26, struct hgsl_ioctl_mem_free_params)
- struct hgsl_ioctl_mem_map_smmu_params {
- __u64 size;
- __u64 offset;
- __u64 uva;
- __u64 memdesc;
- __s32 fd;
- __u32 memtype;
- __u32 flags;
- __u32 padding;
- };
- #define HGSL_IOCTL_MEM_MAP_SMMU \
- HGSL_IORW(0x27, struct hgsl_ioctl_mem_map_smmu_params)
- struct hgsl_ioctl_mem_unmap_smmu_params {
- __u64 gpuaddr;
- __u64 size;
- __u32 memtype;
- __u32 padding;
- };
- #define HGSL_IOCTL_MEM_UNMAP_SMMU \
- HGSL_IOW(0x28, struct hgsl_ioctl_mem_unmap_smmu_params)
- struct hgsl_ioctl_mem_cache_operation_params {
- __u64 offsetbytes;
- __u64 sizebytes;
- __u64 gpuaddr;
- __u32 operation;
- __u32 padding;
- };
- #define HGSL_IOCTL_MEM_CACHE_OPERATION \
- HGSL_IORW(0x29, struct hgsl_ioctl_mem_cache_operation_params)
- struct hgsl_ioctl_read_ts_params {
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 type;
- __u32 timestamp;
- };
- #define HGSL_IOCTL_READ_TIMESTAMP \
- HGSL_IORW(0x2A, struct hgsl_ioctl_read_ts_params)
- struct hgsl_ioctl_check_ts_params {
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 type;
- __u32 timestamp;
- __u32 rval;
- __u32 padding;
- };
- #define HGSL_IOCTL_CHECK_TIMESTAMP \
- HGSL_IORW(0x2B, struct hgsl_ioctl_check_ts_params)
- struct hgsl_ioctl_syncobj_wait_multiple_params {
- __u64 num_syncobjs;
- __u64 rpc_syncobj;
- __u64 status;
- __u32 timeout_ms;
- __u32 result;
- };
- #define HGSL_IOCTL_SYNCOBJ_WAIT_MULTIPLE \
- HGSL_IORW(0x2C, struct hgsl_ioctl_syncobj_wait_multiple_params)
- struct hgsl_ioctl_set_metainfo_params {
- __u64 memdesc_priv;
- __u64 metainfo;
- __u32 flags;
- __u32 metainfo_len;
- };
- #define HGSL_IOCTL_SET_METAINFO \
- HGSL_IORW(0x2D, struct hgsl_ioctl_set_metainfo_params)
- #define HGSL_IOCTL_GET_SYSTEM_TIME \
- HGSL_IORW(0x2E, __u64)
- struct hgsl_ioctl_perfcounter_select_params {
- __u64 groups;
- __u64 counter_ids;
- __u64 counter_val_regs;
- __u64 counter_val_hi_regs;
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 num_counters;
- __u32 rval;
- };
- #define HGSL_IOCTL_PERFCOUNTER_SELECT \
- HGSL_IORW(0x30, struct hgsl_ioctl_perfcounter_select_params)
- struct hgsl_ioctl_perfcounter_deselect_params {
- __u64 groups;
- __u64 counter_ids;
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 timestamp;
- __u32 num_counters;
- };
- #define HGSL_IOCTL_PERFCOUNTER_DESELECT \
- HGSL_IOW(0x31, struct hgsl_ioctl_perfcounter_deselect_params)
- struct hgsl_ioctl_perfcounter_query_selections_params {
- __u64 selections;
- __u32 devhandle;
- __u32 ctxthandle;
- __u32 num_counters;
- __u32 group;
- __u32 max_counters;
- __u32 padding;
- };
- #define HGSL_IOCTL_PERFCOUNTER_QUERY_SELECTION \
- HGSL_IORW(0x32, struct hgsl_ioctl_perfcounter_query_selections_params)
- struct hgsl_ioctl_perfcounter_read_params {
- __u64 value;
- __u32 devhandle;
- __u32 group;
- __u32 counter;
- __u32 rval;
- };
- #define HGSL_IOCTL_PERFCOUNTER_READ \
- HGSL_IORW(0x33, struct hgsl_ioctl_perfcounter_read_params)
- /**
- * struct hgsl_hsync_fence_create - wait a h-sync fence
- * @timestamp: The user timestamp attached to the fence
- * @context_id; The conext to create fence
- * @fence_fd: File descriptor of the new created fence
- */
- struct hgsl_hsync_fence_create {
- __u32 timestamp;
- __u32 padding;
- __s32 context_id;
- __s32 fence_fd;
- };
- #define HGSL_IOCTL_HSYNC_FENCE_CREATE \
- HGSL_IOW(0x13, struct hgsl_hsync_fence_create)
- /**
- * Create an i-fence timeline - param is id of the new timeline
- */
- #define HGSL_IOCTL_ISYNC_TIMELINE_CREATE \
- HGSL_IOW(0x14, __u32)
- /**
- * Destroy an i-fence timeline - param is id of timeline to be released
- */
- #define HGSL_IOCTL_ISYNC_TIMELINE_DESTROY \
- HGSL_IOW(0x15, __u32)
- /* Use padding field to tell if ts is valid when create isync fence */
- #define HGSL_ISYNC_FENCE_CREATE_USE_TS 1
- /**
- * struct hgsl_isync_create_fence - wait an i-sync fence
- * @timeline_id: The timestamp for the new fence
- * @fence_id: id of new created fence
- * @ts: option, should set it if want to use isync forward
- */
- struct hgsl_isync_create_fence {
- __u32 timeline_id;
- __s32 fence_id;
- __u32 ts;
- __u32 padding;
- };
- #define HGSL_IOCTL_ISYNC_FENCE_CREATE \
- HGSL_IOW(0x16, \
- struct hgsl_isync_create_fence)
- /**
- * struct hgsl_isync_signal_fence - signal an i-sync fence
- * @timeline_id: The timestamp for current fence
- * @fence_id: id of fence to be signalled
- */
- struct hgsl_isync_signal_fence {
- __u32 timeline_id;
- __s32 fence_id;
- };
- #define HGSL_IOCTL_ISYNC_FENCE_SIGNAL \
- HGSL_IOW(0x17, \
- struct hgsl_isync_signal_fence)
- /**
- * struct hgsl_isync_signal_fence - signal an i-sync fence
- * @timeline_id: The timestamp for current fence
- * @fence_id: id of fence to be signalled
- */
- struct hgsl_isync_forward {
- __u32 timeline_id;
- __s32 ts;
- };
- #define HGSL_IOCTL_ISYNC_FORWARD \
- HGSL_IOW(0x18, \
- struct hgsl_isync_forward)
- /**
- * struct hgsl_isync_timeline_create64 - create a isync timeline with 64 or 32bits timestamp
- * @initial_ts: The initial timestamp value.
- * @timeline_id: The timestamp for current fence
- * @flags: flags used to timeline
- */
- struct hgsl_timeline_create {
- __u64 initial_ts;
- __u32 timeline_id;
- __s32 flags;
- };
- #define HGSL_IOCTL_TIMELINE_CREATE \
- HGSL_IORW(0x19, struct hgsl_timeline_create)
- /**
- * struct hgsl_timeline_val - A container to store a timeline/sequence number
- * pair.
- * @timepoint: timepoint to signal/query/wait
- * @timeline: The timeline identifier to signal/query/wait
- *
- * A container to store a timeline/timepoint pair used by the query, signal and wait
- * ioctls.
- */
- struct hgsl_timeline_val {
- __u64 timepoint;
- __u32 timeline_id;
- __u32 padding;
- };
- /**
- * struct hgsl_timeline_query - query multiple timelines
- * @timelines: Address of an array of &struct hgsl_timeline_val entries
- * @count: Number of entries in @timeline
- * @timelines_size: Size of each entry in @timelines
- */
- struct hgsl_timeline_query {
- __u64 timelines;
- __u32 count;
- __u32 timelines_size;
- };
- #define HGSL_IOCTL_TIMELINE_QUERY \
- HGSL_IORW(0x1A, struct hgsl_timeline_query)
- /**
- * struct hgsl_timeline_signal - signal multiple timelines
- * @timelines: Address of an array of &struct hgsl_timeline_val entries
- * @count: Number of entries in @timeline
- * @timelines_size: Size of each entry in @timelines
- */
- struct hgsl_timeline_signal {
- __u64 timelines;
- __u32 count;
- __u32 timelines_size;
- };
- #define HGSL_IOCTL_TIMELINE_SIGNAL \
- HGSL_IOW(0x1B, struct hgsl_timeline_signal)
- #define HGSL_TIMELINE_WAIT_ALL 1
- #define HGSL_TIMELINE_WAIT_ANY 2
- /**
- * struct hgsl_timeline_wait - wait multiple timelines
- * @timeout_nanosec: Number of nanoseconds to wait for the signal
- * @timelines: Address of an array of &struct hgsl_timeline_val entries
- * @count: Number of entries in @timeline
- * @timelines_size: Size of each entry in @timelines
- * @flags: One of HGSL_TIMELINE_WAIT_ALL or HGSL_TIMELINE_WAIT_ANY
- */
- struct hgsl_timeline_wait {
- __u64 timeout_nanosec;
- __u64 timelines;
- __u32 count;
- __u32 timelines_size;
- __u32 flags;
- /* private: padding for 64 bit compatibility */
- __u32 padding;
- };
- #define HGSL_IOCTL_TIMELINE_WAIT \
- HGSL_IOW(0x1C, struct hgsl_timeline_wait)
- /**
- * struct hgsl_ioctl_mem_get_fd_params - get fd from memdesc
- * @memdesc: According to memdesc to find the mem node
- * @fd: The fd of dmabuf mem node
- */
- struct hgsl_ioctl_mem_get_fd_params {
- __u64 memdesc;
- __s32 fd;
- };
- #define HGSL_IOCTL_MEM_GET_FD \
- HGSL_IORW(0x1D, struct hgsl_ioctl_mem_get_fd_params)
- #endif /* _UAPI_MSM_HGSL_H */
|