Sound Open Firmware
Loading...
Searching...
No Matches
ams.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause */
2/*
3 * Copyright (c) 2023 Intel Corporation
4 *
5 * Author: Krzysztof Frydryk <krzysztofx.frydryk@intel.com>
6 */
7
8#ifndef __SOF_LIB_AMS_H__
9#define __SOF_LIB_AMS_H__
10
11#include <errno.h>
12#include <rtos/task.h>
13#include <ipc/topology.h>
14#include <rtos/alloc.h>
15#include <sof/coherent.h>
16#include <sof/lib/uuid.h>
17
18/* Reserved value "does not exist" or "unassigned" value for msg types */
19#define AMS_INVALID_MSG_TYPE 0
20/* Reserved value "does not exist" or "unassigned" value for slots */
21#define AMS_INVALID_SLOT 0xFF
22/* Wildcard for module_id and instance_id values */
23#define AMS_ANY_ID 0xFFFF
24
25/* max number of message UUIDs */
26#define AMS_SERVICE_UUID_TABLE_SIZE 16
27/* max number of async message routes */
28#define AMS_ROUTING_TABLE_SIZE 16
29/* Space allocated for async message content*/
30#define AMS_MAX_MSG_SIZE 0x1000
31
38 /* Message IDs are assigned dynamically on new message entry creation
39 * For a new payload should be acquired by ams_get_message_type_id
40 */
42 /* Producers module ID */
44 /* Producers instance ID */
46 /* Message length */
48 /* Message payload */
49 uint8_t *message;
50};
51
52struct ams_slot {
53 uint16_t module_id;
54 uint16_t instance_id;
55 union {
58 } u;
59 uint32_t __aligned(PLATFORM_DCACHE_ALIGN) pad[];
60};
61
68 void *ctx);
69
78 /* Message ID that will be routed via this entry */
80 /* Callback provided by the subscribed consumer */
82 /* Additional context for consumer_callback (optional) */
83 void *ctx;
84 /* Subscribed consumer's Module ID */
86 /* Subscribed consumer's Module Instance ID */
88 /* Subscribed consumer's Module core id. Saved to speed up routing */
90};
91
93 /* Message ID that will be routed via this entry */
95 /* Subscribed producer's Module ID */
97 /* Subscribed producer's Module Instance ID */
99};
100
101struct uuid_idx {
104};
105
107 /* should be only used with ams_acquire/release function, not generic ones */
108 struct coherent c;
109
114
115 uint32_t slot_uses[CONFIG_CORE_COUNT];
116 /* marks which core already processed slot */
117 uint32_t slot_done[CONFIG_CORE_COUNT];
118
119 struct ams_slot slots[CONFIG_CORE_COUNT];
120};
121
123 /* shared context must be always accessed with shared->c taken */
125};
126
132
134#if CONFIG_SMP
135 struct ams_task ams_task;
136#endif /* CONFIG_SMP */
138};
139
140#if CONFIG_AMS
141int ams_init(void);
142
152int ams_get_message_type_id(const uint8_t *message_uuid,
153 uint32_t *message_type_id);
154
166int ams_register_producer(uint32_t message_type_id,
167 uint16_t module_id,
168 uint16_t instance_id);
169
182int ams_unregister_producer(uint32_t message_type_id,
183 uint16_t module_id,
184 uint16_t instance_id);
185
203int ams_register_consumer(uint32_t message_type_id,
204 uint16_t module_id,
205 uint16_t instance_id,
206 ams_msg_callback_fn function,
207 void *ctx);
208
219int ams_unregister_consumer(uint32_t message_type_id,
220 uint16_t module_id,
221 uint16_t instance_id,
222 ams_msg_callback_fn function);
223
232int ams_send(const struct ams_message_payload *payload);
233
244int ams_send_mi(const struct ams_message_payload *payload,
245 uint16_t module_id, uint16_t instance_id);
246
247static inline struct ams_shared_context *ams_ctx_get(void)
248{
249 return sof_get()->ams_shared_ctx;
250}
251#else
252static inline int ams_init(void) { return 0; }
253static inline int ams_get_message_type_id(const uint8_t *message_uuid,
254 uint32_t *message_type_id) { return 0; }
255
256static inline int ams_register_producer(uint32_t message_type_id,
257 uint16_t module_id,
258 uint16_t instance_id) { return 0; }
259
260static inline int ams_unregister_producer(uint32_t message_type_id,
261 uint16_t module_id,
262 uint16_t instance_id) { return 0; }
263
264static inline int ams_register_consumer(uint32_t message_type_id,
265 uint16_t module_id,
266 uint16_t instance_id,
267 ams_msg_callback_fn function,
268 void *ctx) { return 0; }
269
270static inline int ams_unregister_consumer(uint32_t message_type_id,
271 uint16_t module_id,
272 uint16_t instance_id,
273 ams_msg_callback_fn function) { return 0; }
274
275static inline int ams_send(const struct ams_message_payload *payload) { return 0; }
276
277static inline int ams_send_mi(const struct ams_message_payload *payload, uint16_t module_id,
278 uint16_t instance_id) { return 0; }
279
280static inline struct ams_shared_context *ams_ctx_get(void)
281{
282 return NULL;
283}
284
285#endif /* CONFIG_AMS */
286
287#if CONFIG_SMP && CONFIG_AMS
288int process_incoming_message(uint32_t slot);
289#else
290static inline int process_incoming_message(uint32_t slot) { return 0; }
291#endif /* CONFIG_SMP && CONFIG_AMS */
292
294
295#endif /* __SOF_LIB_AMS_H__ */
static int ams_register_producer(uint32_t message_type_id, uint16_t module_id, uint16_t instance_id)
Definition ams.h:256
static int ams_unregister_consumer(uint32_t message_type_id, uint16_t module_id, uint16_t instance_id, ams_msg_callback_fn function)
Definition ams.h:270
#define AMS_ROUTING_TABLE_SIZE
Definition ams.h:28
#define AMS_MAX_MSG_SIZE
Definition ams.h:30
static int ams_send_mi(const struct ams_message_payload *payload, uint16_t module_id, uint16_t instance_id)
Definition ams.h:277
static int ams_send(const struct ams_message_payload *payload)
Definition ams.h:275
static int process_incoming_message(uint32_t slot)
Definition ams.h:290
void(* ams_msg_callback_fn)(const struct ams_message_payload *const ams_message_payload, void *ctx)
ams_msg_callback_fn
Definition ams.h:67
static int ams_init(void)
Definition ams.h:252
static int ams_register_consumer(uint32_t message_type_id, uint16_t module_id, uint16_t instance_id, ams_msg_callback_fn function, void *ctx)
Definition ams.h:264
static struct ams_shared_context * ams_ctx_get(void)
Definition ams.h:280
static int ams_unregister_producer(uint32_t message_type_id, uint16_t module_id, uint16_t instance_id)
Definition ams.h:260
static int ams_get_message_type_id(const uint8_t *message_uuid, uint32_t *message_type_id)
Definition ams.h:253
#define AMS_SERVICE_UUID_TABLE_SIZE
Definition ams.h:26
struct async_message_service ** arch_ams_get(void)
#define UUID_SIZE
UUID is 16 bytes long.
Definition uuid.h:26
struct sof * sof_get(void)
Internal struct ams_consumer_entry.
Definition ams.h:77
ams_msg_callback_fn consumer_callback
Definition ams.h:81
void * ctx
Definition ams.h:83
uint8_t consumer_instance_id
Definition ams.h:87
uint32_t message_type_id
Definition ams.h:79
uint16_t consumer_module_id
Definition ams.h:85
uint8_t consumer_core_id
Definition ams.h:89
Definition ams.h:122
struct ams_shared_context * shared
Definition ams.h:124
IXC message payload.
Definition ams.h:37
uint8_t * message
Definition ams.h:49
uint16_t producer_instance_id
Definition ams.h:45
uint32_t message_type_id
Definition ams.h:41
uint16_t producer_module_id
Definition ams.h:43
uint32_t message_length
Definition ams.h:47
Definition ams.h:92
uint8_t producer_instance_id
Definition ams.h:98
uint16_t producer_module_id
Definition ams.h:96
uint32_t message_type_id
Definition ams.h:94
Definition ams.h:106
struct uuid_idx uuid_table[AMS_SERVICE_UUID_TABLE_SIZE]
Definition ams.h:113
uint32_t slot_uses[CONFIG_CORE_COUNT]
Definition ams.h:115
uint32_t last_used_msg_id
Definition ams.h:110
uint32_t slot_done[CONFIG_CORE_COUNT]
Definition ams.h:117
struct ams_slot slots[CONFIG_CORE_COUNT]
Definition ams.h:119
struct ams_consumer_entry rt_table[AMS_ROUTING_TABLE_SIZE]
Definition ams.h:111
struct ams_producer producer_table[AMS_ROUTING_TABLE_SIZE]
Definition ams.h:112
struct coherent c
Definition ams.h:108
Definition ams.h:52
uint16_t instance_id
Definition ams.h:54
uint16_t module_id
Definition ams.h:53
struct ams_message_payload msg
Definition ams.h:56
uint32_t __aligned(PLATFORM_DCACHE_ALIGN) pad[]
union ams_slot::@215313021324150325262356264241064275320220165153 u
uint8_t msg_raw[AMS_MAX_MSG_SIZE]
Definition ams.h:57
Definition ams.h:127
uint32_t pending_slots
Definition ams.h:130
struct task ams_task
Definition ams.h:128
struct async_message_service * ams
Definition ams.h:129
Definition ams.h:133
struct ams_context * ams_context
Definition ams.h:137
Definition coherent.h:55
Task used by schedulers.
Definition task.h:56
Definition ams.h:101
uint8_t message_uuid[UUID_SIZE]
Definition ams.h:103
uint32_t message_type_id
Definition ams.h:102