diff options
author | Petri Gynther <pgynther@google.com> | 2021-02-03 21:34:56 -0800 |
---|---|---|
committer | Petri Gynther <pgynther@google.com> | 2021-02-04 11:56:53 -0800 |
commit | 232075c185db837723cb959f6bf31ea9221f969b (patch) | |
tree | 22ecd2fe49b1d69c68bab36f893e2136a559d43c | |
parent | 4de45b8151f5ce9d2c0c9a11f105426baac029c6 (diff) | |
parent | e22a42a610e253a565ce023fa4a3967386ca7a62 (diff) | |
download | aoc-ipc-232075c185db837723cb959f6bf31ea9221f969b.tar.gz |
Merge android-gs-pixel-mainline into android-gs-pixel-5.10android-s-v2-beta-3_r0.6android-s-qpr3-beta-3_r0.5android-s-qpr3-beta-2_r0.5android-s-qpr3-beta-1_r0.6android-s-qpr3-beta-1_r0.5android-12.1.0_r0.6android-12.1.0_r0.40android-12.1.0_r0.35android-12.1.0_r0.28android-12.1.0_r0.22android-12.1.0_r0.16android-12.0.0_r0.9android-12.0.0_r0.8android-12.0.0_r0.42android-12.0.0_r0.36android-12.0.0_r0.26android-12.0.0_r0.17android-12.0.0_r0.16android-gs-raviole-5.10-s-v2-beta-3android-gs-raviole-5.10-s-qpr3-beta-3android-gs-raviole-5.10-s-qpr3-beta-2android-gs-raviole-5.10-android12Landroid-gs-raviole-5.10-android12-qpr3android-gs-raviole-5.10-android12-qpr1-dandroid-gs-raviole-5.10-android12-d1android-gs-bluejay-5.10-android12L-d2
Signed-off-by: Petri Gynther <pgynther@google.com>
Change-Id: I5d5de50099ac7cfaac7a9e5a628c5edeb78e739b
-rw-r--r-- | aoc_ipc_core.c | 35 | ||||
-rw-r--r-- | aoc_ipc_core.h | 27 | ||||
-rw-r--r-- | aoc_ipc_core_internal.h | 12 |
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(®ion->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 { |