History

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.

Bharat Jauhari committed 5 years ago

Commit d4194f21 parent 79251241 file · +8 −14Browse files

Unified · Split

drivers/misc/habanalabs/common/command_submission.c+8−14
@@ -2782,12 +2782,12 @@ static inline unsigned long hl_usecs64_to_jiffies(const u64 usecs) · 2781 unmodified lines
27822782
27832783 static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
27842784 u64 timeout_us, u64 user_address,
2785− u64 target_value, u16 interrupt_offset,
2785+ u64 target_value, struct hl_user_interrupt *interrupt,
2786+
27862787 u32 *status,
27872788 u64 *timestamp)
27882789 {
27892790 struct hl_user_pending_interrupt *pend;
2790− struct hl_user_interrupt *interrupt;
27912791 unsigned long timeout, flags;
27922792 u64 completion_value;
27932793 long completion_rc;
@@ -2805,11 +2805,6 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx, · 11 unmodified lines
28052805
28062806 hl_fence_init(&pend->fence, ULONG_MAX);
28072807
2808− if (interrupt_offset == HL_COMMON_USER_INTERRUPT_ID)
2809− interrupt = &hdev->common_user_interrupt;
2810− else
2811− interrupt = &hdev->user_interrupt[interrupt_offset];
2812−
28132808 /* Add pending user interrupt to relevant list for the interrupt
28142809 * handler to monitor
28152810 */
@@ -2898,9 +2893,10 @@ remove_pending_user_interrupt: · 82 unmodified lines
28982893
28992894 static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
29002895 {
2901− u16 interrupt_id, interrupt_offset, first_interrupt, last_interrupt;
2896+ u16 interrupt_id, first_interrupt, last_interrupt;
29022897 struct hl_device *hdev = hpriv->hdev;
29032898 struct asic_fixed_properties *prop;
2899+ struct hl_user_interrupt *interrupt;
29042900 union hl_wait_cs_args *args = data;
29052901 u32 status = HL_WAIT_CS_STATUS_BUSY;
29062902 u64 timestamp;
@@ -2913,8 +2909,7 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) · 6 unmodified lines
29132909 return -EPERM;
29142910 }
29152911
2916− interrupt_id =
2917− FIELD_GET(HL_WAIT_CS_FLAGS_INTERRUPT_MASK, args->in.flags);
2912+ interrupt_id = FIELD_GET(HL_WAIT_CS_FLAGS_INTERRUPT_MASK, args->in.flags);
29182913
29192914 first_interrupt = prop->first_available_user_msix_interrupt;
29202915 last_interrupt = prop->first_available_user_msix_interrupt +
@@ -2927,15 +2922,14 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) · 6 unmodified lines
29272922 }
29282923
29292924 if (interrupt_id == HL_COMMON_USER_INTERRUPT_ID)
2930− interrupt_offset = HL_COMMON_USER_INTERRUPT_ID;
2925+ interrupt = &hdev->common_user_interrupt;
29312926 else
2932− interrupt_offset = interrupt_id - first_interrupt;
2927+ interrupt = &hdev->user_interrupt[interrupt_id - first_interrupt];
29332928
29342929 rc = _hl_interrupt_wait_ioctl(hdev, hpriv->ctx,
29352930 args->in.interrupt_timeout_us, args->in.addr,
2936− args->in.target, interrupt_offset, &status,
2931+ args->in.target, interrupt, &status,
29372932 &timestamp);
2938−
29392933 if (rc) {
29402934 if (rc != -EINTR)
29412935 dev_err_ratelimited(hdev->dev,