summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Gynther <pgynther@google.com>2021-02-03 21:34:56 -0800
committerPetri Gynther <pgynther@google.com>2021-02-04 11:56:53 -0800
commit232075c185db837723cb959f6bf31ea9221f969b (patch)
tree22ecd2fe49b1d69c68bab36f893e2136a559d43c
parent4de45b8151f5ce9d2c0c9a11f105426baac029c6 (diff)
parente22a42a610e253a565ce023fa4a3967386ca7a62 (diff)
downloadaoc-ipc-232075c185db837723cb959f6bf31ea9221f969b.tar.gz
Signed-off-by: Petri Gynther <pgynther@google.com> Change-Id: I5d5de50099ac7cfaac7a9e5a628c5edeb78e739b
-rw-r--r--aoc_ipc_core.c35
-rw-r--r--aoc_ipc_core.h27
-rw-r--r--aoc_ipc_core_internal.h12
3 files changed, 69 insertions, 5 deletions
diff --git a/aoc_ipc_core.c b/aoc_ipc_core.c
index e17579a..b17013d 100644
--- a/aoc_ipc_core.c
+++ b/aoc_ipc_core.c
@@ -177,10 +177,31 @@ const char *aoc_service_name(aoc_service *service)
return header->name;
}
-bool aoc_service_is_ring(aoc_service *service)
+static inline int aoc_service_type(aoc_service *service)
{
struct aoc_ipc_service_header *header = service;
- return ((header->flags & AOC_SERVICE_FLAG_RING) != 0);
+ return (header->flags & AOC_SERVICE_TYPE_MASK) >> 16;
+}
+
+bool aoc_service_is_queue(aoc_service *service)
+{
+ return aoc_service_type(service) == AOC_SERVICE_TYPE_QUEUE;
+}
+
+bool aoc_service_is_ring(aoc_service *service)
+{
+ return aoc_service_type(service) == AOC_SERVICE_TYPE_RING;
+}
+
+bool aoc_service_is_buffer(aoc_service *service)
+{
+ return aoc_service_type(service) == AOC_SERVICE_TYPE_BUFFER;
+}
+
+int aoc_service_irq_index(aoc_service *service)
+{
+ struct aoc_ipc_service_header *header = service;
+ return (header->flags & AOC_SERVICE_IRQ_MASK) >> AOC_SERVICE_IRQ_SHIFT;
}
size_t aoc_ring_bytes_read(aoc_service *service, aoc_direction dir)
@@ -231,7 +252,7 @@ size_t aoc_service_message_size(aoc_service *service, aoc_direction dir)
return 0;
region = &header->regions[dir];
- if (aoc_service_is_ring(service)) {
+ if (aoc_service_is_ring(service) || aoc_service_is_buffer(service)) {
return region->size;
} else {
const size_t header_size =
@@ -314,6 +335,9 @@ size_t aoc_service_slots_available_to_read(aoc_service *service,
if (ioread32(&region->slots) == 0)
return 0;
+ if (aoc_service_is_buffer(service))
+ return 0;
+
if (aoc_service_is_ring(service)) {
/*
* Rings have one slot and the tx/rx counters specify bytes. If the
@@ -346,6 +370,8 @@ size_t aoc_service_slots_available_to_write(aoc_service *service,
if (aoc_service_is_ring(service)) {
return 1;
+ } else if (aoc_service_is_buffer(service)) {
+ return 0;
} else {
size_t diff = _difference_with_overflow(region);
@@ -644,7 +670,8 @@ size_t aoc_service_ring_read_offset(aoc_service *service, aoc_direction dir)
return s->regions[dir].rx % s->regions[dir].size;
}
-bool aoc_ring_is_push(aoc_service *service) {
+bool aoc_ring_is_push(aoc_service *service)
+{
struct aoc_ipc_service_header *s =
(struct aoc_ipc_service_header *)service;
diff --git a/aoc_ipc_core.h b/aoc_ipc_core.h
index fffb910..cef81f7 100644
--- a/aoc_ipc_core.h
+++ b/aoc_ipc_core.h
@@ -44,6 +44,15 @@ typedef enum {
} aoc_direction;
/**
+ * Check if a passed in service is a queue
+ *
+ * \param[in] service pointer to a service
+ *
+ * \return true if service is a message queue, otherwise false
+ */
+bool aoc_service_is_queue(aoc_service *service);
+
+/**
* Check if a passed in service is a ring
*
* \param[in] service pointer to a service
@@ -53,6 +62,24 @@ typedef enum {
bool aoc_service_is_ring(aoc_service *service);
/**
+ * Check if a passed in service is a buffer
+ *
+ * \param[in] service pointer to a service
+ *
+ * \return true if service is a named buffer, otherwise false
+ */
+bool aoc_service_is_buffer(aoc_service *service);
+
+/**
+ * Return the interrupt index for a service
+ *
+ * \param[in] service pointer to a service
+ *
+ * \return interrupt index for the service
+ */
+int aoc_service_irq_index(aoc_service *service);
+
+/**
* Return the name of a service
*
* \param[in] service pointer to a service
diff --git a/aoc_ipc_core_internal.h b/aoc_ipc_core_internal.h
index 646d518..f3a1314 100644
--- a/aoc_ipc_core_internal.h
+++ b/aoc_ipc_core_internal.h
@@ -46,7 +46,17 @@ extern "C" {
#define AOC_SERVICE_FLAG_SYSTEM_MASK 0xffff0000
#define AOC_SERVICE_FLAG_RING 0x00010000
-#define AOC_SERVICE_FLAG_RING_PUSH 0x00020000
+#define AOC_SERVICE_FLAG_RING_PUSH 0x01000000
+
+#define AOC_SERVICE_TYPE_MASK 0x00070000
+#define AOC_SERVICE_IRQ_MASK 0x00f80000
+#define AOC_SERVICE_IRQ_SHIFT 19
+
+enum AOC_SERVICE_TYPE {
+ AOC_SERVICE_TYPE_QUEUE = 0,
+ AOC_SERVICE_TYPE_RING,
+ AOC_SERVICE_TYPE_BUFFER,
+};
#define AOC_MAGIC 0xA0C00A0C
struct aoc_control_block {