[Sound-open-firmware] [PATCH] core: create a context and pass it to each subsystem at init
Liam Girdwood
liam.r.girdwood at linux.intel.com
Tue Jun 6 17:42:21 CEST 2017
Create a global firmware context structure and pass this to each subsystem
on initialisation. This allows components to share access to global DSP
context.
Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
src/arch/xtensa/init.c | 2 +-
src/include/reef/alloc.h | 4 +++-
src/include/reef/init.h | 4 +++-
src/include/reef/ipc.h | 4 +++-
src/include/reef/notifier.h | 4 +++-
src/include/reef/reef.h | 17 +++++++++++++++++
src/include/reef/task.h | 4 +++-
src/init/init.c | 20 +++++++++++++-------
src/ipc/ipc.c | 2 +-
src/lib/alloc.c | 2 +-
src/lib/notifier.c | 2 +-
src/platform/baytrail/include/platform/platform.h | 4 +++-
src/platform/baytrail/platform.c | 4 ++--
src/tasks/audio.c | 2 +-
14 files changed, 55 insertions(+), 20 deletions(-)
diff --git a/src/arch/xtensa/init.c b/src/arch/xtensa/init.c
index edbc6c5..f904738 100644
--- a/src/arch/xtensa/init.c
+++ b/src/arch/xtensa/init.c
@@ -149,7 +149,7 @@ static void register_exceptions(void)
}
/* do any architecture init here */
-int arch_init(void)
+int arch_init(struct reef *reef)
{
register_exceptions();
return 0;
diff --git a/src/include/reef/alloc.h b/src/include/reef/alloc.h
index 209203f..d263052 100644
--- a/src/include/reef/alloc.h
+++ b/src/include/reef/alloc.h
@@ -36,6 +36,8 @@
#include <stdint.h>
#include <reef/dma.h>
+struct reef;
+
/* Heap Memory Zones
*
* The heap has three different zones from where memory can be allocated :-
@@ -87,5 +89,5 @@ int mm_pm_context_save(struct dma_sg_config *sg);
int mm_pm_context_restore(struct dma_sg_config *sg);
/* heap initialisation */
-void init_heap(void);
+void init_heap(struct reef *reef);
#endif
diff --git a/src/include/reef/init.h b/src/include/reef/init.h
index d8544b2..c2eaf87 100644
--- a/src/include/reef/init.h
+++ b/src/include/reef/init.h
@@ -31,9 +31,11 @@
#ifndef __INCLUDE_INIT_H__
#define __INCLUDE_INIT_H__
+struct reef;
+
/* main firmware entry point - argc and argv not currently used */
int main(int argc, char *argv[]);
-int arch_init(void);
+int arch_init(struct reef *reef);
#endif
diff --git a/src/include/reef/ipc.h b/src/include/reef/ipc.h
index 4b5e59e..8d4a422 100644
--- a/src/include/reef/ipc.h
+++ b/src/include/reef/ipc.h
@@ -38,6 +38,8 @@
#include <reef/audio/component.h>
#include <reef/lock.h>
+struct reef;
+
#define trace_ipc(__e) trace_event(TRACE_CLASS_IPC, __e)
#define tracev_ipc(__e) tracev_event(TRACE_CLASS_IPC, __e)
#define trace_ipc_error(__e) trace_error(TRACE_CLASS_IPC, __e)
@@ -136,7 +138,7 @@ struct ipc {
#define ipc_get_dai_comp(id) \
(struct ipc_dai_dev *)ipc_get_comp(id)
-int ipc_init(void);
+int ipc_init(struct reef *reef);
int platform_ipc_init(struct ipc *ipc);
void ipc_free(struct ipc *ipc);
diff --git a/src/include/reef/notifier.h b/src/include/reef/notifier.h
index 2c04a95..1c42a60 100644
--- a/src/include/reef/notifier.h
+++ b/src/include/reef/notifier.h
@@ -34,6 +34,8 @@
#include <stdint.h>
#include <reef/list.h>
+struct reef;
+
/* notifier general IDs */
#define NOTIFIER_ID_CPU_FREQ 0
#define NOTIFIER_ID_SSP_FREQ 1
@@ -50,6 +52,6 @@ void notifier_unregister(struct notifier *notifier);
void notifier_event(int id, int message, void *event_data);
-void init_system_notify(void);
+void init_system_notify(struct reef *reef);
#endif
diff --git a/src/include/reef/reef.h b/src/include/reef/reef.h
index 84bbfc0..0cf8261 100644
--- a/src/include/reef/reef.h
+++ b/src/include/reef/reef.h
@@ -35,6 +35,9 @@
#include <stddef.h>
#include <arch/reef.h>
+struct ipc;
+
+/* TODO: define for unsigned and short, byte */
#define MAX_INT 0xffffffff
/* use same syntax as Linux for simplicity */
@@ -55,4 +58,18 @@ void cmemcpy(void *dest, void *src, size_t size);
cmemcpy(dest, src, size)
#endif
+/* general firmware context */
+struct reef {
+ /* init data */
+ int argc;
+ char **argv;
+
+ /* ipc */
+ struct ipc *ipc;
+
+ /* private data */
+ void *arch_private;
+ void *plat_private;
+};
+
#endif
diff --git a/src/include/reef/task.h b/src/include/reef/task.h
index dc51242..0158f3f 100644
--- a/src/include/reef/task.h
+++ b/src/include/reef/task.h
@@ -31,6 +31,8 @@
#ifndef __INCLUDE_TASK_H__
#define __INCLUDE_TASK_H__
-int do_task(void);
+struct reef;
+
+int do_task(struct reef *reef);
#endif
diff --git a/src/init/init.c b/src/init/init.c
index 31d727e..029c20f 100644
--- a/src/init/init.c
+++ b/src/init/init.c
@@ -41,35 +41,41 @@
#include <reef/trace.h>
#include <platform/platform.h>
+/* main firmware context */
+static struct reef reef;
+
int main(int argc, char *argv[])
{
int err;
trace_point(TRACE_BOOT_START);
+ /* setup context */
+ reef.argc = argc;
+ reef.argv = argv;
+
/* init architecture */
- err = arch_init();
+ trace_point(TRACE_BOOT_ARCH);
+ err = arch_init(&reef);
if (err < 0)
panic(PANIC_ARCH);
- trace_point(TRACE_BOOT_ARCH);
-
/* initialise system services */
trace_point(TRACE_BOOT_SYS_HEAP);
- init_heap();
- init_system_notify();
+ init_heap(&reef);
trace_point(TRACE_BOOT_SYS_NOTE);
+ init_system_notify(&reef);
/* init the platform */
- err = platform_init();
+ err = platform_init(&reef);
if (err < 0)
panic(PANIC_PLATFORM);
trace_point(TRACE_BOOT_PLATFORM);
/* should not return */
- err = do_task();
+ err = do_task(&reef);
/* should never get here */
panic(PANIC_TASK);
diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c
index edf3f58..0b7b40a 100644
--- a/src/ipc/ipc.c
+++ b/src/ipc/ipc.c
@@ -188,7 +188,7 @@ int ipc_comp_connect(uint32_t source_id, uint32_t sink_id, uint32_t buffer_id)
icd_source->cd, icd_sink->cd, ibd->dev.cb);
}
-int ipc_init(void)
+int ipc_init(struct reef *reef)
{
/* init ipc data */
_ipc = rzalloc(RZONE_SYS, RFLAGS_NONE, sizeof(*_ipc));
diff --git a/src/lib/alloc.c b/src/lib/alloc.c
index b77fbf8..86c2bc7 100644
--- a/src/lib/alloc.c
+++ b/src/lib/alloc.c
@@ -602,7 +602,7 @@ int mm_pm_context_restore(struct dma_sg_config *sg)
}
/* initialise map */
-void init_heap(void)
+void init_heap(struct reef *reef)
{
struct block_map *next_map, *current_map;
int i;
diff --git a/src/lib/notifier.c b/src/lib/notifier.c
index d0f0a45..888473e 100644
--- a/src/lib/notifier.c
+++ b/src/lib/notifier.c
@@ -78,7 +78,7 @@ out:
spin_unlock(&_notify.lock);
}
-void init_system_notify(void)
+void init_system_notify(struct reef *reef)
{
list_init(&_notify.list);
spinlock_init(&_notify.lock);
diff --git a/src/platform/baytrail/include/platform/platform.h b/src/platform/baytrail/include/platform/platform.h
index 7df65b8..cd1e1d9 100644
--- a/src/platform/baytrail/include/platform/platform.h
+++ b/src/platform/baytrail/include/platform/platform.h
@@ -35,6 +35,8 @@
#include <platform/shim.h>
#include <platform/interrupt.h>
+struct reef;
+
/* default static pipeline SSP port - not used for dynamic pipes */
#define PLATFORM_SSP_PORT 2
@@ -107,6 +109,6 @@
int platform_boot_complete(uint32_t boot_message);
-int platform_init(void);
+int platform_init(struct reef *reef);
#endif
diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c
index ed7f108..eb28958 100644
--- a/src/platform/baytrail/platform.c
+++ b/src/platform/baytrail/platform.c
@@ -133,7 +133,7 @@ static struct timer platform_ext_timer = {
.irq = IRQ_NUM_EXT_TIMER,
};
-int platform_init(void)
+int platform_init(struct reef *reef)
{
#if defined CONFIG_BAYTRAIL
struct dma *dmac0, *dmac1;
@@ -185,7 +185,7 @@ int platform_init(void)
/* initialise the host IPC mechanisms */
trace_point(TRACE_BOOT_PLATFORM_IPC);
- ipc_init();
+ ipc_init(reef);
/* init DMACs */
trace_point(TRACE_BOOT_PLATFORM_DMA);
diff --git a/src/tasks/audio.c b/src/tasks/audio.c
index 2de1a82..3cdaea4 100644
--- a/src/tasks/audio.c
+++ b/src/tasks/audio.c
@@ -50,7 +50,7 @@ struct audio_data {
struct pipeline *p;
};
-int do_task(void)
+int do_task(struct reef *reef)
{
struct audio_data pdata;
--
2.11.0
More information about the Sound-open-firmware
mailing list