Commit c209e742 authored by Ofir Bitton's avatar Ofir Bitton Committed by Oded Gabbay

habanalabs: allow user to pass a staged submission seq

In order to support the staged submission feature, user must be
allowed to use the same CS sequence for all submissions in the
same staged submission.
Signed-off-by: default avatarOfir Bitton <obitton@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent ac6fdbfe
...@@ -807,7 +807,7 @@ static int hl_cs_copy_chunk_array(struct hl_device *hdev, ...@@ -807,7 +807,7 @@ static int hl_cs_copy_chunk_array(struct hl_device *hdev,
} }
static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks, static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks,
u32 num_chunks, u64 *cs_seq, bool timestamp) u32 num_chunks, u64 *cs_seq, u32 flags)
{ {
bool int_queues_only = true; bool int_queues_only = true;
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
...@@ -836,7 +836,7 @@ static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks, ...@@ -836,7 +836,7 @@ static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks,
goto free_cs_chunk_array; goto free_cs_chunk_array;
} }
cs->timestamp = !!timestamp; cs->timestamp = !!(flags & HL_CS_FLAGS_TIMESTAMP);
*cs_seq = cs->sequence; *cs_seq = cs->sequence;
hl_debugfs_add_cs(cs); hl_debugfs_add_cs(cs);
...@@ -1004,7 +1004,7 @@ static int hl_cs_ctx_switch(struct hl_fpriv *hpriv, union hl_cs_args *args, ...@@ -1004,7 +1004,7 @@ static int hl_cs_ctx_switch(struct hl_fpriv *hpriv, union hl_cs_args *args,
rc = 0; rc = 0;
} else { } else {
rc = cs_ioctl_default(hpriv, chunks, num_chunks, rc = cs_ioctl_default(hpriv, chunks, num_chunks,
cs_seq, false); cs_seq, 0);
} }
mutex_unlock(&hpriv->restore_phase_mutex); mutex_unlock(&hpriv->restore_phase_mutex);
...@@ -1347,7 +1347,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -1347,7 +1347,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
enum hl_cs_type cs_type; enum hl_cs_type cs_type;
u64 cs_seq = ULONG_MAX; u64 cs_seq = ULONG_MAX;
void __user *chunks; void __user *chunks;
u32 num_chunks; u32 num_chunks, flags;
int rc; int rc;
rc = hl_cs_sanity_checks(hpriv, args); rc = hl_cs_sanity_checks(hpriv, args);
...@@ -1362,6 +1362,12 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -1362,6 +1362,12 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
~HL_CS_FLAGS_FORCE_RESTORE); ~HL_CS_FLAGS_FORCE_RESTORE);
chunks = (void __user *) (uintptr_t) args->in.chunks_execute; chunks = (void __user *) (uintptr_t) args->in.chunks_execute;
num_chunks = args->in.num_chunks_execute; num_chunks = args->in.num_chunks_execute;
flags = args->in.cs_flags;
/* In case this is a staged CS, user should supply the CS sequence */
if ((flags & HL_CS_FLAGS_STAGED_SUBMISSION) &&
!(flags & HL_CS_FLAGS_STAGED_SUBMISSION_FIRST))
cs_seq = args->in.seq;
switch (cs_type) { switch (cs_type) {
case CS_TYPE_SIGNAL: case CS_TYPE_SIGNAL:
...@@ -1372,7 +1378,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -1372,7 +1378,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
break; break;
default: default:
rc = cs_ioctl_default(hpriv, chunks, num_chunks, &cs_seq, rc = cs_ioctl_default(hpriv, chunks, num_chunks, &cs_seq,
args->in.cs_flags & HL_CS_FLAGS_TIMESTAMP); args->in.cs_flags);
break; break;
} }
......
...@@ -609,6 +609,9 @@ struct hl_cs_chunk { ...@@ -609,6 +609,9 @@ struct hl_cs_chunk {
#define HL_CS_FLAGS_WAIT 0x4 #define HL_CS_FLAGS_WAIT 0x4
#define HL_CS_FLAGS_COLLECTIVE_WAIT 0x8 #define HL_CS_FLAGS_COLLECTIVE_WAIT 0x8
#define HL_CS_FLAGS_TIMESTAMP 0x20 #define HL_CS_FLAGS_TIMESTAMP 0x20
#define HL_CS_FLAGS_STAGED_SUBMISSION 0x40
#define HL_CS_FLAGS_STAGED_SUBMISSION_FIRST 0x80
#define HL_CS_FLAGS_STAGED_SUBMISSION_LAST 0x100
#define HL_CS_STATUS_SUCCESS 0 #define HL_CS_STATUS_SUCCESS 0
...@@ -622,11 +625,18 @@ struct hl_cs_in { ...@@ -622,11 +625,18 @@ struct hl_cs_in {
/* holds address of array of hl_cs_chunk for execution phase */ /* holds address of array of hl_cs_chunk for execution phase */
__u64 chunks_execute; __u64 chunks_execute;
union {
/* this holds address of array of hl_cs_chunk for store phase - /* this holds address of array of hl_cs_chunk for store phase -
* Currently not in use * Currently not in use
*/ */
__u64 chunks_store; __u64 chunks_store;
/* Sequence number of a staged submission CS
* valid only if HL_CS_FLAGS_STAGED_SUBMISSION is set
*/
__u64 seq;
};
/* Number of chunks in restore phase array. Maximum number is /* Number of chunks in restore phase array. Maximum number is
* HL_MAX_JOBS_PER_CS * HL_MAX_JOBS_PER_CS
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment