habanalabs: refactor wait-for-user-interrupt function

Refactor the wait-for-user-interrupt routine to make it more
generic for re-use for other user exposed h/w interfaces in future
ASICs.

Signed-off-by: Bharat Jauhari <bjauhari@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
This commit is contained in:
Bharat Jauhari 2021-09-08 17:32:54 +03:00 committed by Oded Gabbay
parent 792512459f
commit d4194f2140
1 changed files with 8 additions and 14 deletions

View File

@ -2782,12 +2782,12 @@ static inline unsigned long hl_usecs64_to_jiffies(const u64 usecs)
static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx, static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
u64 timeout_us, u64 user_address, u64 timeout_us, u64 user_address,
u64 target_value, u16 interrupt_offset, u64 target_value, struct hl_user_interrupt *interrupt,
u32 *status, u32 *status,
u64 *timestamp) u64 *timestamp)
{ {
struct hl_user_pending_interrupt *pend; struct hl_user_pending_interrupt *pend;
struct hl_user_interrupt *interrupt;
unsigned long timeout, flags; unsigned long timeout, flags;
u64 completion_value; u64 completion_value;
long completion_rc; long completion_rc;
@ -2805,11 +2805,6 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
hl_fence_init(&pend->fence, ULONG_MAX); hl_fence_init(&pend->fence, ULONG_MAX);
if (interrupt_offset == HL_COMMON_USER_INTERRUPT_ID)
interrupt = &hdev->common_user_interrupt;
else
interrupt = &hdev->user_interrupt[interrupt_offset];
/* Add pending user interrupt to relevant list for the interrupt /* Add pending user interrupt to relevant list for the interrupt
* handler to monitor * handler to monitor
*/ */
@ -2898,9 +2893,10 @@ remove_pending_user_interrupt:
static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
{ {
u16 interrupt_id, interrupt_offset, first_interrupt, last_interrupt; u16 interrupt_id, first_interrupt, last_interrupt;
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
struct asic_fixed_properties *prop; struct asic_fixed_properties *prop;
struct hl_user_interrupt *interrupt;
union hl_wait_cs_args *args = data; union hl_wait_cs_args *args = data;
u32 status = HL_WAIT_CS_STATUS_BUSY; u32 status = HL_WAIT_CS_STATUS_BUSY;
u64 timestamp; u64 timestamp;
@ -2913,8 +2909,7 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
return -EPERM; return -EPERM;
} }
interrupt_id = interrupt_id = FIELD_GET(HL_WAIT_CS_FLAGS_INTERRUPT_MASK, args->in.flags);
FIELD_GET(HL_WAIT_CS_FLAGS_INTERRUPT_MASK, args->in.flags);
first_interrupt = prop->first_available_user_msix_interrupt; first_interrupt = prop->first_available_user_msix_interrupt;
last_interrupt = prop->first_available_user_msix_interrupt + last_interrupt = prop->first_available_user_msix_interrupt +
@ -2927,15 +2922,14 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
} }
if (interrupt_id == HL_COMMON_USER_INTERRUPT_ID) if (interrupt_id == HL_COMMON_USER_INTERRUPT_ID)
interrupt_offset = HL_COMMON_USER_INTERRUPT_ID; interrupt = &hdev->common_user_interrupt;
else else
interrupt_offset = interrupt_id - first_interrupt; interrupt = &hdev->user_interrupt[interrupt_id - first_interrupt];
rc = _hl_interrupt_wait_ioctl(hdev, hpriv->ctx, rc = _hl_interrupt_wait_ioctl(hdev, hpriv->ctx,
args->in.interrupt_timeout_us, args->in.addr, args->in.interrupt_timeout_us, args->in.addr,
args->in.target, interrupt_offset, &status, args->in.target, interrupt, &status,
&timestamp); &timestamp);
if (rc) { if (rc) {
if (rc != -EINTR) if (rc != -EINTR)
dev_err_ratelimited(hdev->dev, dev_err_ratelimited(hdev->dev,