diff options
-rwxr-xr-x | drivers/dsp/syslink/multicore_ipc/listmp_sharedmemory.c | 25 | ||||
-rw-r--r-- | drivers/dsp/syslink/multicore_ipc/platform.c | 2 | ||||
-rw-r--r-- | drivers/dsp/syslink/notify_ducatidriver/notify_ducati.c | 29 |
3 files changed, 42 insertions, 14 deletions
diff --git a/drivers/dsp/syslink/multicore_ipc/listmp_sharedmemory.c b/drivers/dsp/syslink/multicore_ipc/listmp_sharedmemory.c index 1530a89717a5..5904c6d18000 100755 --- a/drivers/dsp/syslink/multicore_ipc/listmp_sharedmemory.c +++ b/drivers/dsp/syslink/multicore_ipc/listmp_sharedmemory.c @@ -809,7 +809,7 @@ bool listmp_sharedmemory_empty(listmp_sharedmemory_handle listmp_handle) /*! @retval true if list is empty */ sharedHead = (struct listmp_elem *)(sharedregion_get_srptr( (void *)obj->listmp_elem, obj->index)); - + dsb(); if (obj->listmp_elem->next == sharedHead) is_empty = true; @@ -856,6 +856,7 @@ void *listmp_sharedmemory_get_head(listmp_sharedmemory_handle listmp_handle) } localHeadNext = sharedregion_get_ptr((u32 *)obj->listmp_elem->next); + dsb(); /* See if the listmp_sharedmemory_object was empty */ if (localHeadNext == (struct listmp_elem *)obj->listmp_elem) { /*! @retval NULL if list is empty */ @@ -863,14 +864,14 @@ void *listmp_sharedmemory_get_head(listmp_sharedmemory_handle listmp_handle) } else { /* Elem to return */ elem = localHeadNext; - + dsb(); localNext = sharedregion_get_ptr((u32 *)elem->next); sharedHead = (struct listmp_elem *) sharedregion_get_srptr( (void *)obj->listmp_elem, obj->index); /* Fix the head of the list next pointer */ obj->listmp_elem->next = elem->next; - + dsb(); /* Fix the prev pointer of the new first elem on the list */ localNext->prev = sharedHead; @@ -979,12 +980,12 @@ int listmp_sharedmemory_put_head(listmp_sharedmemory_handle listmp_handle, handle = (listmp_sharedmemory_object *)listmp_handle; obj = (struct listmp_sharedmemory_obj *) handle->obj; - + dsb(); index = sharedregion_get_index(elem); sharedElem = (struct listmp_elem *) sharedregion_get_srptr(elem, index); sharedHead = (struct listmp_elem *)sharedregion_get_srptr( (void *)obj->listmp_elem, obj->index); - + dsb(); if (obj->params.gate != NULL) { retval = gatepeterson_enter(obj->params.gate); if (retval < 0) { @@ -992,10 +993,10 @@ int listmp_sharedmemory_put_head(listmp_sharedmemory_handle listmp_handle, goto exit; } } - /* Add the new elem into the list */ elem->next = obj->listmp_elem->next; elem->prev = sharedHead; + dsb(); localNextElem = sharedregion_get_ptr((u32 *)elem->next); localNextElem->prev = sharedElem; obj->listmp_elem->next = sharedElem; @@ -1042,7 +1043,7 @@ int listmp_sharedmemory_put_tail(listmp_sharedmemory_handle listmp_handle, handle = (listmp_sharedmemory_object *)listmp_handle; obj = (struct listmp_sharedmemory_obj *) handle->obj; - + dsb(); /* Safe to do outside the gate */ index = sharedregion_get_index(elem); sharedElem = (struct listmp_elem *) @@ -1058,11 +1059,12 @@ int listmp_sharedmemory_put_tail(listmp_sharedmemory_handle listmp_handle, goto exit; } } - /* Add the new elem into the list */ elem->next = sharedHead; elem->prev = obj->listmp_elem->prev; + dsb(); localPrevElem = sharedregion_get_ptr((u32 *)elem->prev); + dsb(); localPrevElem->next = sharedElem; obj->listmp_elem->prev = sharedElem; @@ -1126,7 +1128,7 @@ int listmp_sharedmemory_insert(listmp_sharedmemory_handle listmp_handle, index = sharedregion_get_index(new_elem); sharedNewElem = (struct listmp_elem *) sharedregion_get_srptr(new_elem, index); - + dsb(); /* Get SRPtr for cur_elem */ index = sharedregion_get_index(cur_elem); sharedCurElem = (struct listmp_elem *) @@ -1134,10 +1136,11 @@ int listmp_sharedmemory_insert(listmp_sharedmemory_handle listmp_handle, /* Get SRPtr for cur_elem->prev */ localPrevElem = sharedregion_get_ptr((u32 *)cur_elem->prev); - + dsb(); new_elem->next = sharedCurElem; new_elem->prev = cur_elem->prev; localPrevElem->next = sharedNewElem; + dsb(); cur_elem->prev = sharedNewElem; if (obj->params.gate != NULL) @@ -1191,7 +1194,7 @@ int listmp_sharedmemory_remove(listmp_sharedmemory_handle listmp_handle, localPrevElem = sharedregion_get_ptr((u32 *)elem->prev); localNextElem = sharedregion_get_ptr((u32 *)elem->next); - + dsb(); localPrevElem->next = elem->next; localNextElem->prev = elem->prev; diff --git a/drivers/dsp/syslink/multicore_ipc/platform.c b/drivers/dsp/syslink/multicore_ipc/platform.c index 957e9a2a84f1..5a08400b0743 100644 --- a/drivers/dsp/syslink/multicore_ipc/platform.c +++ b/drivers/dsp/syslink/multicore_ipc/platform.c @@ -94,7 +94,7 @@ /*! * @brief Wait for this much poll count when sending event */ -#define NOTIFY_SENDEVENTPOLLCOUNT ((u32) -1) +#define NOTIFY_SENDEVENTPOLLCOUNT 0xfffff /*! * @brief Align buffer in Heap diff --git a/drivers/dsp/syslink/notify_ducatidriver/notify_ducati.c b/drivers/dsp/syslink/notify_ducatidriver/notify_ducati.c index 413cae455eb3..860709f26430 100644 --- a/drivers/dsp/syslink/notify_ducatidriver/notify_ducati.c +++ b/drivers/dsp/syslink/notify_ducatidriver/notify_ducati.c @@ -941,7 +941,7 @@ int notify_ducatidrv_sendevent(struct notify_driver_object *handle, BUG_ON(handle == NULL); BUG_ON(handle->driver_object == NULL); - + dsb(); driver_object = (struct notify_ducatidrv_object *) handle->driver_object; @@ -970,9 +970,12 @@ int notify_ducatidrv_sendevent(struct notify_driver_object *handle, proc_ctrl[driver_object->other_id].reg_mask. enable_mask) != 1)) { status = -ENODEV; + printk(KERN_ERR "NOTIFY DRV: OTHER SIDE NOT READY TO" + "RECEIVE. %d\n", event_no); /* This may be used for polling till other-side is ready, so do not set failure reason.*/ } else { + dsb(); /* Enter critical section protection. */ if (mutex_lock_interruptible(notify_ducatidriver_state. gate_handle) != 0) @@ -1009,6 +1012,23 @@ int notify_ducatidrv_sendevent(struct notify_driver_object *handle, information to theremote processor */ status = omap_mbox_msg_send(ducati_mbox, payload); + i = 0; + while ((other_event_chart[event_no].flag + != DOWN) + && status == 0) { + /* Leave critical section protection + Create a window of opportunity + for other interrupts to be handled. + */ + i++; + if ((max_poll_count != (int) -1) + && (i == max_poll_count)) { + status = -EBUSY; + printk(KERN_ERR "NOTIFY-remote" + "not processed event %d\n", + event_no); + } + } } /* Leave critical section protection. */ mutex_unlock(notify_ducatidriver_state.gate_handle); @@ -1147,12 +1167,14 @@ static void notify_ducatidrv_isr_callback(void *ref_data, void* ntfy_msg) struct notify_shmdrv_eventreg *reg_chart; VOLATILE struct notify_shmdrv_proc_ctrl *proc_ctrl_ptr; int event_no; + dsb(); + /* Enter critical section protection. */ driver_obj = (struct notify_ducatidrv_object *) ref_data; proc_ctrl_ptr = &(driver_obj->ctrl_ptr->proc_ctrl[driver_obj->self_id]); reg_chart = driver_obj->reg_chart; self_event_chart = proc_ctrl_ptr->self_event_chart; - + dsb(); /* Execute the loop till no asserted event is found for one complete loop through all registered events @@ -1169,9 +1191,11 @@ static void notify_ducatidrv_isr_callback(void *ref_data, void* ntfy_msg) payload = self_event_chart[event_no]. payload; + dsb(); /* Acknowledge the event. */ payload = (int)ntfy_msg; self_event_chart[event_no].flag = DOWN; + dsb(); /*Call the callbacks associated with the event*/ temp = driver_obj-> event_list[event_no]. @@ -1212,6 +1236,7 @@ static void notify_ducatidrv_isr_callback(void *ref_data, void* ntfy_msg) } } while ((event_no != (int) -1) && (i < driver_obj->params.num_events)); + } /* |