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; 90be462c97SLizhi Hou }; 91be462c97SLizhi Hou 92aac24309SLizhi Hou #define drm_job_to_xdna_job(j) \ 93aac24309SLizhi Hou container_of(j, struct amdxdna_sched_job, base) 94aac24309SLizhi Hou 95aac24309SLizhi Hou struct amdxdna_sched_job { 96aac24309SLizhi Hou struct drm_sched_job base; 97aac24309SLizhi Hou struct kref refcnt; 98aac24309SLizhi Hou struct amdxdna_hwctx *hwctx; 99aac24309SLizhi Hou struct mm_struct *mm; 100aac24309SLizhi Hou /* The fence to notice DRM scheduler that job is done by hardware */ 101aac24309SLizhi Hou struct dma_fence *fence; 102aac24309SLizhi Hou /* user can wait on this fence */ 103aac24309SLizhi Hou struct dma_fence *out_fence; 104aac24309SLizhi Hou bool job_done; 105aac24309SLizhi Hou u64 seq; 106aac24309SLizhi Hou struct amdxdna_gem_obj *cmd_bo; 107aac24309SLizhi Hou size_t bo_cnt; 108aac24309SLizhi Hou struct drm_gem_object *bos[] __counted_by(bo_cnt); 109aac24309SLizhi Hou }; 110aac24309SLizhi Hou 111aac24309SLizhi Hou static inline u32 112aac24309SLizhi Hou amdxdna_cmd_get_op(struct amdxdna_gem_obj *abo) 113aac24309SLizhi Hou { 114aac24309SLizhi Hou struct amdxdna_cmd *cmd = abo->mem.kva; 115aac24309SLizhi Hou 116aac24309SLizhi Hou return FIELD_GET(AMDXDNA_CMD_OPCODE, cmd->header); 117aac24309SLizhi Hou } 118aac24309SLizhi Hou 119aac24309SLizhi Hou static inline void 120aac24309SLizhi Hou amdxdna_cmd_set_state(struct amdxdna_gem_obj *abo, enum ert_cmd_state s) 121aac24309SLizhi Hou { 122aac24309SLizhi Hou struct amdxdna_cmd *cmd = abo->mem.kva; 123aac24309SLizhi Hou 124aac24309SLizhi Hou cmd->header &= ~AMDXDNA_CMD_STATE; 125aac24309SLizhi Hou cmd->header |= FIELD_PREP(AMDXDNA_CMD_STATE, s); 126aac24309SLizhi Hou } 127aac24309SLizhi Hou 128aac24309SLizhi Hou static inline enum ert_cmd_state 129aac24309SLizhi Hou amdxdna_cmd_get_state(struct amdxdna_gem_obj *abo) 130aac24309SLizhi Hou { 131aac24309SLizhi Hou struct amdxdna_cmd *cmd = abo->mem.kva; 132aac24309SLizhi Hou 133aac24309SLizhi Hou return FIELD_GET(AMDXDNA_CMD_STATE, cmd->header); 134aac24309SLizhi Hou } 135aac24309SLizhi Hou 136aac24309SLizhi Hou void *amdxdna_cmd_get_payload(struct amdxdna_gem_obj *abo, u32 *size); 137aac24309SLizhi Hou int amdxdna_cmd_get_cu_idx(struct amdxdna_gem_obj *abo); 138aac24309SLizhi Hou 139aac24309SLizhi Hou static inline u32 amdxdna_hwctx_col_map(struct amdxdna_hwctx *hwctx) 140aac24309SLizhi Hou { 141aac24309SLizhi Hou return GENMASK(hwctx->start_col + hwctx->num_col - 1, 142aac24309SLizhi Hou hwctx->start_col); 143aac24309SLizhi Hou } 144aac24309SLizhi Hou 145aac24309SLizhi Hou void amdxdna_sched_job_cleanup(struct amdxdna_sched_job *job); 146be462c97SLizhi Hou void amdxdna_hwctx_remove_all(struct amdxdna_client *client); 147*bed4c73eSLizhi Hou void amdxdna_hwctx_suspend(struct amdxdna_client *client); 148*bed4c73eSLizhi Hou void amdxdna_hwctx_resume(struct amdxdna_client *client); 149aac24309SLizhi Hou 150aac24309SLizhi Hou int amdxdna_cmd_submit(struct amdxdna_client *client, 151aac24309SLizhi Hou u32 cmd_bo_hdls, u32 *arg_bo_hdls, u32 arg_bo_cnt, 152aac24309SLizhi Hou u32 hwctx_hdl, u64 *seq); 153aac24309SLizhi Hou 154aac24309SLizhi Hou int amdxdna_cmd_wait(struct amdxdna_client *client, u32 hwctx_hdl, 155aac24309SLizhi Hou u64 seq, u32 timeout); 156aac24309SLizhi Hou 157be462c97SLizhi Hou int amdxdna_drm_create_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 158be462c97SLizhi Hou int amdxdna_drm_config_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 159be462c97SLizhi Hou int amdxdna_drm_destroy_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 160aac24309SLizhi Hou int amdxdna_drm_submit_cmd_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 161be462c97SLizhi Hou 162be462c97SLizhi Hou #endif /* _AMDXDNA_CTX_H_ */ 163