1be462c97SLizhi Hou /* SPDX-License-Identifier: GPL-2.0 */ 2be462c97SLizhi Hou /* 3be462c97SLizhi Hou * Copyright (C) 2022-2024, Advanced Micro Devices, Inc. 4be462c97SLizhi Hou */ 5be462c97SLizhi Hou 6be462c97SLizhi Hou #ifndef _AMDXDNA_CTX_H_ 7be462c97SLizhi Hou #define _AMDXDNA_CTX_H_ 8be462c97SLizhi Hou 9aac24309SLizhi Hou #include <linux/bitfield.h> 10aac24309SLizhi Hou 11aac24309SLizhi Hou #include "amdxdna_gem.h" 12aac24309SLizhi Hou 13aac24309SLizhi Hou struct amdxdna_hwctx_priv; 14aac24309SLizhi Hou 15aac24309SLizhi Hou enum ert_cmd_opcode { 16aac24309SLizhi Hou ERT_START_CU = 0, 17aac24309SLizhi Hou ERT_CMD_CHAIN = 19, 18aac24309SLizhi Hou ERT_START_NPU = 20, 19aac24309SLizhi Hou }; 20aac24309SLizhi Hou 21aac24309SLizhi Hou enum ert_cmd_state { 22aac24309SLizhi Hou ERT_CMD_STATE_INVALID, 23aac24309SLizhi Hou ERT_CMD_STATE_NEW, 24aac24309SLizhi Hou ERT_CMD_STATE_QUEUED, 25aac24309SLizhi Hou ERT_CMD_STATE_RUNNING, 26aac24309SLizhi Hou ERT_CMD_STATE_COMPLETED, 27aac24309SLizhi Hou ERT_CMD_STATE_ERROR, 28aac24309SLizhi Hou ERT_CMD_STATE_ABORT, 29aac24309SLizhi Hou ERT_CMD_STATE_SUBMITTED, 30aac24309SLizhi Hou ERT_CMD_STATE_TIMEOUT, 31aac24309SLizhi Hou ERT_CMD_STATE_NORESPONSE, 32aac24309SLizhi Hou }; 33aac24309SLizhi Hou 34aac24309SLizhi Hou /* 35aac24309SLizhi Hou * Interpretation of the beginning of data payload for ERT_START_NPU in 36aac24309SLizhi Hou * amdxdna_cmd. The rest of the payload in amdxdna_cmd is regular kernel args. 37aac24309SLizhi Hou */ 38aac24309SLizhi Hou struct amdxdna_cmd_start_npu { 39aac24309SLizhi Hou u64 buffer; /* instruction buffer address */ 40aac24309SLizhi Hou u32 buffer_size; /* size of buffer in bytes */ 41aac24309SLizhi Hou u32 prop_count; /* properties count */ 42aac24309SLizhi Hou u32 prop_args[]; /* properties and regular kernel arguments */ 43aac24309SLizhi Hou }; 44aac24309SLizhi Hou 45aac24309SLizhi Hou /* 46aac24309SLizhi Hou * Interpretation of the beginning of data payload for ERT_CMD_CHAIN in 47aac24309SLizhi Hou * amdxdna_cmd. The rest of the payload in amdxdna_cmd is cmd BO handles. 48aac24309SLizhi Hou */ 49aac24309SLizhi Hou struct amdxdna_cmd_chain { 50aac24309SLizhi Hou u32 command_count; 51aac24309SLizhi Hou u32 submit_index; 52aac24309SLizhi Hou u32 error_index; 53aac24309SLizhi Hou u32 reserved[3]; 54aac24309SLizhi Hou u64 data[] __counted_by(command_count); 55aac24309SLizhi Hou }; 56aac24309SLizhi Hou 57ac49797cSLizhi Hou /* Exec buffer command header format */ 58ac49797cSLizhi Hou #define AMDXDNA_CMD_STATE GENMASK(3, 0) 59ac49797cSLizhi Hou #define AMDXDNA_CMD_EXTRA_CU_MASK GENMASK(11, 10) 60ac49797cSLizhi Hou #define AMDXDNA_CMD_COUNT GENMASK(22, 12) 61ac49797cSLizhi Hou #define AMDXDNA_CMD_OPCODE GENMASK(27, 23) 62ac49797cSLizhi Hou struct amdxdna_cmd { 63ac49797cSLizhi Hou u32 header; 64ac49797cSLizhi Hou u32 data[]; 65ac49797cSLizhi Hou }; 66ac49797cSLizhi Hou 67be462c97SLizhi Hou struct amdxdna_hwctx { 68be462c97SLizhi Hou struct amdxdna_client *client; 69be462c97SLizhi Hou struct amdxdna_hwctx_priv *priv; 70be462c97SLizhi Hou char *name; 71be462c97SLizhi Hou 72be462c97SLizhi Hou u32 id; 73be462c97SLizhi Hou u32 max_opc; 74be462c97SLizhi Hou u32 num_tiles; 75be462c97SLizhi Hou u32 mem_size; 76be462c97SLizhi Hou u32 fw_ctx_id; 77be462c97SLizhi Hou u32 col_list_len; 78be462c97SLizhi Hou u32 *col_list; 79be462c97SLizhi Hou u32 start_col; 80be462c97SLizhi Hou u32 num_col; 81be462c97SLizhi Hou #define HWCTX_STAT_INIT 0 82be462c97SLizhi Hou #define HWCTX_STAT_READY 1 83be462c97SLizhi Hou #define HWCTX_STAT_STOP 2 84be462c97SLizhi Hou u32 status; 85be462c97SLizhi Hou u32 old_status; 86be462c97SLizhi Hou 87be462c97SLizhi Hou struct amdxdna_qos_info qos; 88be462c97SLizhi Hou struct amdxdna_hwctx_param_config_cu *cus; 89be462c97SLizhi Hou u32 syncobj_hdl; 90*4fd6ca90SLizhi Hou 91*4fd6ca90SLizhi Hou atomic64_t job_submit_cnt; 92*4fd6ca90SLizhi Hou atomic64_t job_free_cnt ____cacheline_aligned_in_smp; 93be462c97SLizhi Hou }; 94be462c97SLizhi Hou 95aac24309SLizhi Hou #define drm_job_to_xdna_job(j) \ 96aac24309SLizhi Hou container_of(j, struct amdxdna_sched_job, base) 97aac24309SLizhi Hou 98aac24309SLizhi Hou struct amdxdna_sched_job { 99aac24309SLizhi Hou struct drm_sched_job base; 100aac24309SLizhi Hou struct kref refcnt; 101aac24309SLizhi Hou struct amdxdna_hwctx *hwctx; 102aac24309SLizhi Hou struct mm_struct *mm; 103aac24309SLizhi Hou /* The fence to notice DRM scheduler that job is done by hardware */ 104aac24309SLizhi Hou struct dma_fence *fence; 105aac24309SLizhi Hou /* user can wait on this fence */ 106aac24309SLizhi Hou struct dma_fence *out_fence; 107aac24309SLizhi Hou bool job_done; 108aac24309SLizhi Hou u64 seq; 109aac24309SLizhi Hou struct amdxdna_gem_obj *cmd_bo; 110aac24309SLizhi Hou size_t bo_cnt; 111aac24309SLizhi Hou struct drm_gem_object *bos[] __counted_by(bo_cnt); 112aac24309SLizhi Hou }; 113aac24309SLizhi Hou 114aac24309SLizhi Hou static inline u32 115aac24309SLizhi Hou amdxdna_cmd_get_op(struct amdxdna_gem_obj *abo) 116aac24309SLizhi Hou { 117aac24309SLizhi Hou struct amdxdna_cmd *cmd = abo->mem.kva; 118aac24309SLizhi Hou 119aac24309SLizhi Hou return FIELD_GET(AMDXDNA_CMD_OPCODE, cmd->header); 120aac24309SLizhi Hou } 121aac24309SLizhi Hou 122aac24309SLizhi Hou static inline void 123aac24309SLizhi Hou amdxdna_cmd_set_state(struct amdxdna_gem_obj *abo, enum ert_cmd_state s) 124aac24309SLizhi Hou { 125aac24309SLizhi Hou struct amdxdna_cmd *cmd = abo->mem.kva; 126aac24309SLizhi Hou 127aac24309SLizhi Hou cmd->header &= ~AMDXDNA_CMD_STATE; 128aac24309SLizhi Hou cmd->header |= FIELD_PREP(AMDXDNA_CMD_STATE, s); 129aac24309SLizhi Hou } 130aac24309SLizhi Hou 131aac24309SLizhi Hou static inline enum ert_cmd_state 132aac24309SLizhi Hou amdxdna_cmd_get_state(struct amdxdna_gem_obj *abo) 133aac24309SLizhi Hou { 134aac24309SLizhi Hou struct amdxdna_cmd *cmd = abo->mem.kva; 135aac24309SLizhi Hou 136aac24309SLizhi Hou return FIELD_GET(AMDXDNA_CMD_STATE, cmd->header); 137aac24309SLizhi Hou } 138aac24309SLizhi Hou 139aac24309SLizhi Hou void *amdxdna_cmd_get_payload(struct amdxdna_gem_obj *abo, u32 *size); 140aac24309SLizhi Hou int amdxdna_cmd_get_cu_idx(struct amdxdna_gem_obj *abo); 141aac24309SLizhi Hou 142aac24309SLizhi Hou static inline u32 amdxdna_hwctx_col_map(struct amdxdna_hwctx *hwctx) 143aac24309SLizhi Hou { 144aac24309SLizhi Hou return GENMASK(hwctx->start_col + hwctx->num_col - 1, 145aac24309SLizhi Hou hwctx->start_col); 146aac24309SLizhi Hou } 147aac24309SLizhi Hou 148aac24309SLizhi Hou void amdxdna_sched_job_cleanup(struct amdxdna_sched_job *job); 149be462c97SLizhi Hou void amdxdna_hwctx_remove_all(struct amdxdna_client *client); 150bed4c73eSLizhi Hou void amdxdna_hwctx_suspend(struct amdxdna_client *client); 151bed4c73eSLizhi Hou void amdxdna_hwctx_resume(struct amdxdna_client *client); 152aac24309SLizhi Hou 153aac24309SLizhi Hou int amdxdna_cmd_submit(struct amdxdna_client *client, 154aac24309SLizhi Hou u32 cmd_bo_hdls, u32 *arg_bo_hdls, u32 arg_bo_cnt, 155aac24309SLizhi Hou u32 hwctx_hdl, u64 *seq); 156aac24309SLizhi Hou 157aac24309SLizhi Hou int amdxdna_cmd_wait(struct amdxdna_client *client, u32 hwctx_hdl, 158aac24309SLizhi Hou u64 seq, u32 timeout); 159aac24309SLizhi Hou 160be462c97SLizhi Hou int amdxdna_drm_create_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 161be462c97SLizhi Hou int amdxdna_drm_config_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 162be462c97SLizhi Hou int amdxdna_drm_destroy_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 163aac24309SLizhi Hou int amdxdna_drm_submit_cmd_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 164be462c97SLizhi Hou 165be462c97SLizhi Hou #endif /* _AMDXDNA_CTX_H_ */ 166