Commit c478aa12 authored by Phil Elwell's avatar Phil Elwell Committed by Greg Kroah-Hartman

staging: vchiq_core: Add comments to remote event parts

struct remote_event and the related functions remote_event_*() provides
a higher function between ARM core and VPU. It's very helpful for a
reviewer to have explaining comments about these parts.
Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.com>
Signed-off-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Link: https://lore.kernel.org/r/20221222141553.138563-1-stefan.wahren@i2se.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 72b74b64
......@@ -498,6 +498,7 @@ vchiq_set_conn_state(struct vchiq_state *state, enum vchiq_connstate newstate)
vchiq_platform_conn_state_changed(state, oldstate, newstate);
}
/* This initialises a single remote_event, and the associated wait_queue. */
static inline void
remote_event_create(wait_queue_head_t *wq, struct remote_event *event)
{
......@@ -536,6 +537,10 @@ remote_event_wait(wait_queue_head_t *wq, struct remote_event *event)
return 1;
}
/*
* Acknowledge that the event has been signalled, and wake any waiters. Usually
* called as a result of the doorbell being rung.
*/
static inline void
remote_event_signal_local(wait_queue_head_t *wq, struct remote_event *event)
{
......@@ -544,6 +549,7 @@ remote_event_signal_local(wait_queue_head_t *wq, struct remote_event *event)
wake_up_all(wq);
}
/* Check if a single event has been signalled, waking the waiters if it has. */
static inline void
remote_event_poll(wait_queue_head_t *wq, struct remote_event *event)
{
......@@ -551,6 +557,10 @@ remote_event_poll(wait_queue_head_t *wq, struct remote_event *event)
remote_event_signal_local(wq, event);
}
/*
* VCHIQ used a small, fixed number of remote events. It is simplest to
* enumerate them here for polling.
*/
void
remote_event_pollall(struct vchiq_state *state)
{
......
......@@ -166,6 +166,24 @@ struct vchiq_bulk_queue {
struct vchiq_bulk bulks[VCHIQ_NUM_SERVICE_BULKS];
};
/*
* Remote events provide a way of presenting several virtual doorbells to a
* peer (ARM host to VPU) using only one physical doorbell. They can be thought
* of as a way for the peer to signal a semaphore, in this case implemented as
* a workqueue.
*
* Remote events remain signalled until acknowledged by the receiver, and they
* are non-counting. They are designed in such a way as to minimise the number
* of interrupts and avoid unnecessary waiting.
*
* A remote_event is as small data structures that live in shared memory. It
* comprises two booleans - armed and fired:
*
* The sender sets fired when they signal the receiver.
* If fired is set, the receiver has been signalled and need not wait.
* The receiver sets the armed field before they begin to wait.
* If armed is set, the receiver is waiting and wishes to be woken by interrupt.
*/
struct remote_event {
int armed;
int fired;
......
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