[Sound-open-firmware] [PATCH 04/10] pm_runtime: add runtime power management initial implementation

Liam Girdwood liam.r.girdwood at linux.intel.com
Thu Jun 21 12:12:02 CEST 2018


From: Tomasz Lauda <tomasz.lauda at linux.intel.com>

This patch adds initial empty implementation of runtime power management.
It is based on linux kernel implementation and will be developed
in the future.

Signed-off-by: Tomasz Lauda <tomasz.lauda at linux.intel.com>
---
 Makefile.am                                   |  5 ++
 configure.ac                                  |  5 ++
 doc/sof_uapi.doxygen.in                       |  3 +-
 src/drivers/hda-dma.c                         |  4 +
 src/include/sof/Makefile.am                   |  3 +-
 src/include/sof/pm_runtime.h                  | 77 +++++++++++++++++++
 src/include/sof/trace.h                       |  2 +
 src/init/init.c                               |  4 +
 src/lib/Makefile.am                           |  3 +-
 src/lib/pm_runtime.c                          | 74 ++++++++++++++++++
 src/platform/Makefile.am                      | 14 ++--
 src/platform/apollolake/Makefile.am           |  3 +-
 .../apollolake/include/platform/Makefile.am   |  1 +
 .../apollolake/include/platform/platform.h    |  3 +
 .../apollolake/include/platform/pm_runtime.h  | 65 ++++++++++++++++
 .../apollolake/include/platform/shim.h        |  3 +
 src/platform/apollolake/pm_runtime.c          | 67 ++++++++++++++++
 .../baytrail/include/platform/Makefile.am     |  2 +-
 .../baytrail/include/platform/pm_runtime.h    | 60 +++++++++++++++
 src/platform/cannonlake/Makefile.am           |  3 +-
 .../cannonlake/include/platform/Makefile.am   |  1 +
 .../cannonlake/include/platform/platform.h    |  3 +
 .../cannonlake/include/platform/pm_runtime.h  | 65 ++++++++++++++++
 .../cannonlake/include/platform/shim.h        |  3 +
 src/platform/cannonlake/pm_runtime.c          | 67 ++++++++++++++++
 .../haswell/include/platform/Makefile.am      |  2 +-
 .../haswell/include/platform/pm_runtime.h     | 60 +++++++++++++++
 src/platform/intel/Makefile.am                |  1 +
 src/platform/intel/include/Makefile.am        |  1 +
 .../intel/include/platform/Makefile.am        |  3 +
 .../intel/include/platform/cavs/Makefile.am   |  2 +
 .../intel/include/platform/cavs/pm_runtime.h  | 66 ++++++++++++++++
 test/cmocka/Makefile.am                       |  2 +-
 33 files changed, 663 insertions(+), 14 deletions(-)
 create mode 100644 src/include/sof/pm_runtime.h
 create mode 100644 src/lib/pm_runtime.c
 create mode 100644 src/platform/apollolake/include/platform/pm_runtime.h
 create mode 100644 src/platform/apollolake/pm_runtime.c
 create mode 100644 src/platform/baytrail/include/platform/pm_runtime.h
 create mode 100644 src/platform/cannonlake/include/platform/pm_runtime.h
 create mode 100644 src/platform/cannonlake/pm_runtime.c
 create mode 100644 src/platform/haswell/include/platform/pm_runtime.h
 create mode 100644 src/platform/intel/Makefile.am
 create mode 100644 src/platform/intel/include/Makefile.am
 create mode 100644 src/platform/intel/include/platform/Makefile.am
 create mode 100644 src/platform/intel/include/platform/cavs/Makefile.am
 create mode 100644 src/platform/intel/include/platform/cavs/pm_runtime.h

diff --git a/Makefile.am b/Makefile.am
index 701e8f2..d941047 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -33,6 +33,11 @@ export ARCH_INCDIR = \
 
 PLATFORM_INCDIR = -I $(SRC_DIR)/platform/$(PLATFORM)/include
 
+if BUILD_CAVS
+PLATFORM_INCDIR += \
+	-I $(SRC_DIR)/platform/intel/include
+endif
+
 if XCC
 PLATFORM_INCDIR += \
 	-I $(ROOT_DIR)/arch/include
diff --git a/configure.ac b/configure.ac
index 2673d39..be89fc1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -283,6 +283,7 @@ AM_CONDITIONAL(BUILD_BROADWELL,  test "$FW_NAME" = "bdw")
 AM_CONDITIONAL(BUILD_APOLLOLAKE,  test "$FW_NAME" = "apl")
 AM_CONDITIONAL(BUILD_CANNONLAKE,  test "$FW_NAME" = "cnl")
 AM_CONDITIONAL(BUILD_BOOTLOADER,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
+AM_CONDITIONAL(BUILD_CAVS,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
 AM_CONDITIONAL(BUILD_MODULE,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
 AM_CONDITIONAL(BUILD_APL_SSP,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
 
@@ -467,6 +468,10 @@ AC_CONFIG_FILES([
 	src/platform/cannonlake/include/arch/xtensa/Makefile
 	src/platform/cannonlake/include/arch/xtensa/config/Makefile
 	src/platform/cannonlake/include/platform/Makefile
+	src/platform/intel/Makefile
+	src/platform/intel/include/Makefile
+	src/platform/intel/include/platform/Makefile
+	src/platform/intel/include/platform/cavs/Makefile
 	test/Makefile
 	test/cmocka/Makefile
 ])
diff --git a/doc/sof_uapi.doxygen.in b/doc/sof_uapi.doxygen.in
index 74052f1..18444c9 100644
--- a/doc/sof_uapi.doxygen.in
+++ b/doc/sof_uapi.doxygen.in
@@ -6,7 +6,8 @@ GENERATE_MAN     = NO
 GENERATE_XML	 = YES
 
 CASE_SENSE_NAMES = NO
-INPUT            = @top_srcdir@/src/include/uapi
+INPUT            = @top_srcdir@/src/include/uapi \
+                   @top_srcdir@/src/include/sof
 EXCLUDE		 =
 RECURSIVE	 = YES
 FILE_PATTERNS    = *.c *.h
diff --git a/src/drivers/hda-dma.c b/src/drivers/hda-dma.c
index 974ee80..2d23576 100644
--- a/src/drivers/hda-dma.c
+++ b/src/drivers/hda-dma.c
@@ -42,6 +42,7 @@
 #include <sof/dma.h>
 #include <sof/io.h>
 #include <sof/ipc.h>
+#include <sof/pm_runtime.h>
 #include <sof/wait.h>
 #include <platform/dma.h>
 #include <arch/cache.h>
@@ -129,6 +130,9 @@ static int hda_dma_copy(struct dma *dma, int channel, int bytes)
 	host_dma_reg_write(dma, channel, DGLLPI, bytes);
 	host_dma_reg_write(dma, channel, DGLPIBI, bytes);
 
+	/* Force Host DMA to exit L1 */
+	pm_runtime_put(PM_RUNTIME_HOST_DMA_L1);
+
 	return 0;
 }
 
diff --git a/src/include/sof/Makefile.am b/src/include/sof/Makefile.am
index b667459..7eaba9a 100644
--- a/src/include/sof/Makefile.am
+++ b/src/include/sof/Makefile.am
@@ -35,4 +35,5 @@ include_HEADERS = \
 	wait.h \
 	string.h \
 	hda-dma.h \
-	work.h
+	work.h \
+	pm_runtime.h
diff --git a/src/include/sof/pm_runtime.h b/src/include/sof/pm_runtime.h
new file mode 100644
index 0000000..04e0fe1
--- /dev/null
+++ b/src/include/sof/pm_runtime.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file include/sof/pm_runtime.h
+ * \brief Runtime power management header file
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#ifndef __INCLUDE_PM_RUNTIME__
+#define __INCLUDE_PM_RUNTIME__
+
+#include <sof/lock.h>
+#include <sof/trace.h>
+
+/** \brief Power management trace function. */
+#define trace_pm(__e)	trace_event_atomic(TRACE_CLASS_POWER, __e)
+
+/** \brief Power management trace value function. */
+#define trace_pm_value(__e)	trace_value_atomic(__e)
+
+/** \brief Runtime power management context */
+enum pm_runtime_context {
+	PM_RUNTIME_HOST_DMA_L1 = 0,	/**< Host DMA L1 Exit */
+};
+
+/** \brief Runtime power management data. */
+struct pm_runtime_data {
+	spinlock_t lock;	/**< lock mechanism */
+	void *platform_data;	/**< platform specific data */
+};
+
+/**
+ * \brief Initializes runtime power management.
+ */
+void pm_runtime_init(void);
+
+/**
+ * \brief Retrieves power management resource.
+ * \param[in] context Type of power management context.
+ */
+void pm_runtime_get(enum pm_runtime_context context);
+
+/**
+ * \brief Releases power management resource.
+ * \param[in] context Type of power management context.
+ */
+void pm_runtime_put(enum pm_runtime_context context);
+
+#endif /* __INCLUDE_PM_RUNTIME__ */
diff --git a/src/include/sof/trace.h b/src/include/sof/trace.h
index 0e339b5..d72ef68 100644
--- a/src/include/sof/trace.h
+++ b/src/include/sof/trace.h
@@ -62,6 +62,7 @@
 #define TRACE_BOOT_SYS_HEAP		(TRACE_BOOT_SYS + 0x300)
 #define TRACE_BOOT_SYS_NOTE		(TRACE_BOOT_SYS + 0x400)
 #define TRACE_BOOT_SYS_SCHED		(TRACE_BOOT_SYS + 0x500)
+#define TRACE_BOOT_SYS_POWER		(TRACE_BOOT_SYS + 0x600)
 
 /* platform/device specific codes */
 #define TRACE_BOOT_PLATFORM_ENTRY	(TRACE_BOOT_PLATFORM + 0x100)
@@ -99,6 +100,7 @@
 #define TRACE_CLASS_EQ_IIR      (20 << 24)
 #define TRACE_CLASS_SA		(21 << 24)
 #define TRACE_CLASS_DMIC	(22 << 24)
+#define TRACE_CLASS_POWER	(23 << 24)
 
 /* move to config.h */
 #define TRACE	1
diff --git a/src/init/init.c b/src/init/init.c
index 73ba3be..b72fa1d 100644
--- a/src/init/init.c
+++ b/src/init/init.c
@@ -42,6 +42,7 @@
 #include <sof/trace.h>
 #include <sof/schedule.h>
 #include <sof/dma-trace.h>
+#include <sof/pm_runtime.h>
 #include <platform/platform.h>
 
 /* main firmware context */
@@ -75,6 +76,9 @@ int main(int argc, char *argv[])
 	trace_point(TRACE_BOOT_SYS_SCHED);
 	scheduler_init(&sof);
 
+	trace_point(TRACE_BOOT_SYS_POWER);
+	pm_runtime_init();
+
 	/* init the platform */
 	err = platform_init(&sof);
 	if (err < 0)
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 874d2fb..3175079 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -9,7 +9,8 @@ libcore_a_SOURCES = \
 	schedule.c \
 	agent.c \
 	interrupt.c \
-	dma-trace.c
+	dma-trace.c \
+	pm_runtime.c
 
 libcore_a_CFLAGS = \
 	$(ARCH_CFLAGS) \
diff --git a/src/lib/pm_runtime.c b/src/lib/pm_runtime.c
new file mode 100644
index 0000000..b165f5f
--- /dev/null
+++ b/src/lib/pm_runtime.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file lib/pm_runtime.c
+ * \brief Runtime power management implementation
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#include <sof/pm_runtime.h>
+#include <sof/alloc.h>
+#include <platform/pm_runtime.h>
+
+/** \brief Runtime power management data pointer. */
+static struct pm_runtime_data *prd;
+
+void pm_runtime_init(void)
+{
+	trace_pm("ini");
+
+	prd = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, sizeof(*prd));
+	spinlock_init(&prd->lock);
+
+	platform_pm_runtime_init(prd);
+}
+
+void pm_runtime_get(enum pm_runtime_context context)
+{
+	trace_pm("get");
+
+	switch (context) {
+	default:
+		platform_pm_runtime_get(context);
+		break;
+	}
+}
+
+void pm_runtime_put(enum pm_runtime_context context)
+{
+	trace_pm("put");
+
+	switch (context) {
+	default:
+		platform_pm_runtime_put(context);
+		break;
+	}
+}
diff --git a/src/platform/Makefile.am b/src/platform/Makefile.am
index 93742b0..6a41c47 100644
--- a/src/platform/Makefile.am
+++ b/src/platform/Makefile.am
@@ -1,23 +1,25 @@
+SUBDIRS = intel
+
 if BUILD_BAYTRAIL
-SUBDIRS = baytrail
+SUBDIRS += baytrail
 endif
 
 if BUILD_CHERRYTRAIL
-SUBDIRS = baytrail 
+SUBDIRS += baytrail
 endif
 
 if BUILD_APOLLOLAKE
-SUBDIRS = apollolake
+SUBDIRS += apollolake
 endif
 
 if BUILD_HASWELL
-SUBDIRS = haswell
+SUBDIRS += haswell
 endif
 
 if BUILD_BROADWELL
-SUBDIRS = haswell
+SUBDIRS += haswell
 endif
 
 if BUILD_CANNONLAKE
-SUBDIRS = cannonlake
+SUBDIRS += cannonlake
 endif
diff --git a/src/platform/apollolake/Makefile.am b/src/platform/apollolake/Makefile.am
index 417a13d..1732a6d 100644
--- a/src/platform/apollolake/Makefile.am
+++ b/src/platform/apollolake/Makefile.am
@@ -13,7 +13,8 @@ libplatform_a_SOURCES = \
 	clk.c \
 	timer.c \
 	interrupt.c \
-	memory.c
+	memory.c \
+	pm_runtime.c
 
 libplatform_a_CFLAGS = \
 	$(ARCH_CFLAGS) \
diff --git a/src/platform/apollolake/include/platform/Makefile.am b/src/platform/apollolake/include/platform/Makefile.am
index 4e4e20d..af8ef78 100644
--- a/src/platform/apollolake/include/platform/Makefile.am
+++ b/src/platform/apollolake/include/platform/Makefile.am
@@ -5,5 +5,6 @@ noinst_HEADERS = \
 	mailbox.h \
 	memory.h \
 	platform.h \
+	pm_runtime.h \
 	shim.h \
 	timer.h
diff --git a/src/platform/apollolake/include/platform/platform.h b/src/platform/apollolake/include/platform/platform.h
index 1cce0c7..39f8549 100644
--- a/src/platform/apollolake/include/platform/platform.h
+++ b/src/platform/apollolake/include/platform/platform.h
@@ -120,6 +120,9 @@ struct sof;
 /* DSP default delay in cycles */
 #define PLATFORM_DEFAULT_DELAY	12
 
+/* minimal L1 exit time in cycles */
+#define PLATFORM_FORCE_L1_EXIT_TIME	12288
+
 /* Platform defined panic code */
 static inline void platform_panic(uint32_t p)
 {
diff --git a/src/platform/apollolake/include/platform/pm_runtime.h b/src/platform/apollolake/include/platform/pm_runtime.h
new file mode 100644
index 0000000..2758638
--- /dev/null
+++ b/src/platform/apollolake/include/platform/pm_runtime.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/apollolake/include/platform/pm_runtime.h
+ * \brief Runtime power management header file for Apollolake
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__
+#define __INCLUDE_PLATFORM_PM_RUNTIME__
+
+#include <sof/pm_runtime.h>
+
+/** \brief Platform specific runtime power management data. */
+struct platform_pm_runtime_data {
+	/* TBD */
+};
+
+/**
+ * \brief Initializes platform specific runtime power management.
+ * \param[in,out] prd Runtime power management data.
+ */
+void platform_pm_runtime_init(struct pm_runtime_data *prd);
+
+/**
+ * \brief Retrieves platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+void platform_pm_runtime_get(enum pm_runtime_context context);
+
+/**
+ * \brief Releases platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+void platform_pm_runtime_put(enum pm_runtime_context context);
+
+#endif /* __INCLUDE_PLATFORM_PM_RUNTIME__ */
diff --git a/src/platform/apollolake/include/platform/shim.h b/src/platform/apollolake/include/platform/shim.h
index 92b6cf3..598f1c8 100644
--- a/src/platform/apollolake/include/platform/shim.h
+++ b/src/platform/apollolake/include/platform/shim.h
@@ -162,6 +162,9 @@
 #define SHIM_L2_PREF_CFG	(SHIM_BASE + 0x508)
 #define SHIM_L2_CACHE_PREF	(SHIM_BASE + 0x510)
 
+#define SHIM_SVCFG			0xF4
+#define SHIM_SVCFG_FORCE_L1_EXIT	(0x1 << 1)
+
 
 /* host windows */
 #define DMWBA(x)		(HOST_WIN_BASE(x) + 0x0)
diff --git a/src/platform/apollolake/pm_runtime.c b/src/platform/apollolake/pm_runtime.c
new file mode 100644
index 0000000..00f902d
--- /dev/null
+++ b/src/platform/apollolake/pm_runtime.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/apollolake/pm_runtime.c
+ * \brief Runtime power management implementation specific for Apollolake
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#include <sof/alloc.h>
+#include <platform/platform.h>
+#include <platform/pm_runtime.h>
+#include <platform/cavs/pm_runtime.h>
+
+/** \brief Runtime power management data pointer. */
+struct pm_runtime_data *_prd;
+
+void platform_pm_runtime_init(struct pm_runtime_data *prd)
+{
+	struct platform_pm_runtime_data *pprd;
+
+	_prd = prd;
+
+	pprd = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, sizeof(*pprd));
+	_prd->platform_data = pprd;
+}
+
+void platform_pm_runtime_get(enum pm_runtime_context context)
+{
+	/* Action based on context */
+}
+
+void platform_pm_runtime_put(enum pm_runtime_context context)
+{
+	switch (context) {
+	case PM_RUNTIME_HOST_DMA_L1:
+		cavs_pm_runtime_force_host_dma_l1_exit();
+		break;
+	}
+}
diff --git a/src/platform/baytrail/include/platform/Makefile.am b/src/platform/baytrail/include/platform/Makefile.am
index 5775230..48a7f5b 100644
--- a/src/platform/baytrail/include/platform/Makefile.am
+++ b/src/platform/baytrail/include/platform/Makefile.am
@@ -5,7 +5,7 @@ noinst_HEADERS = \
 	mailbox.h \
 	memory.h \
 	platform.h \
+	pm_runtime.h \
 	pmc.h \
 	shim.h \
 	timer.h
-	
diff --git a/src/platform/baytrail/include/platform/pm_runtime.h b/src/platform/baytrail/include/platform/pm_runtime.h
new file mode 100644
index 0000000..6757e32
--- /dev/null
+++ b/src/platform/baytrail/include/platform/pm_runtime.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/baytrail/include/platform/pm_runtime.h
+ * \brief Runtime power management header file for Baytrail
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__
+#define __INCLUDE_PLATFORM_PM_RUNTIME__
+
+#include <sof/pm_runtime.h>
+
+/**
+ * \brief Initializes platform specific runtime power management.
+ * \param[in,out] prd Runtime power management data.
+ */
+static inline void platform_pm_runtime_init(struct pm_runtime_data *prd) { }
+
+/**
+ * \brief Retrieves platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+static inline void platform_pm_runtime_get(enum pm_runtime_context context) { }
+
+/**
+ * \brief Releases platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+static inline void platform_pm_runtime_put(enum pm_runtime_context context) { }
+
+#endif /* __INCLUDE_PLATFORM_PM_RUNTIME__ */
diff --git a/src/platform/cannonlake/Makefile.am b/src/platform/cannonlake/Makefile.am
index 503271c..da7b4e9 100644
--- a/src/platform/cannonlake/Makefile.am
+++ b/src/platform/cannonlake/Makefile.am
@@ -13,7 +13,8 @@ libplatform_a_SOURCES = \
 	clk.c \
 	timer.c \
 	interrupt.c \
-	memory.c
+	memory.c \
+	pm_runtime.c
 
 libplatform_a_CFLAGS = \
 	$(ARCH_CFLAGS) \
diff --git a/src/platform/cannonlake/include/platform/Makefile.am b/src/platform/cannonlake/include/platform/Makefile.am
index 4e4e20d..af8ef78 100644
--- a/src/platform/cannonlake/include/platform/Makefile.am
+++ b/src/platform/cannonlake/include/platform/Makefile.am
@@ -5,5 +5,6 @@ noinst_HEADERS = \
 	mailbox.h \
 	memory.h \
 	platform.h \
+	pm_runtime.h \
 	shim.h \
 	timer.h
diff --git a/src/platform/cannonlake/include/platform/platform.h b/src/platform/cannonlake/include/platform/platform.h
index 36e4868..b3e5f74 100644
--- a/src/platform/cannonlake/include/platform/platform.h
+++ b/src/platform/cannonlake/include/platform/platform.h
@@ -117,6 +117,9 @@ struct sof;
 /* DSP default delay in cycles */
 #define PLATFORM_DEFAULT_DELAY	12
 
+/* minimal L1 exit time in cycles */
+#define PLATFORM_FORCE_L1_EXIT_TIME	8192
+
 /* Platform defined trace code */
 static inline void platform_panic(uint32_t p)
 {
diff --git a/src/platform/cannonlake/include/platform/pm_runtime.h b/src/platform/cannonlake/include/platform/pm_runtime.h
new file mode 100644
index 0000000..3cf113d
--- /dev/null
+++ b/src/platform/cannonlake/include/platform/pm_runtime.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/cannonlake/include/platform/pm_runtime.h
+ * \brief Runtime power management header file for Cannonlake
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__
+#define __INCLUDE_PLATFORM_PM_RUNTIME__
+
+#include <sof/pm_runtime.h>
+
+/** \brief Platform specific runtime power management data. */
+struct platform_pm_runtime_data {
+	/* TBD */
+};
+
+/**
+ * \brief Initializes platform specific runtime power management.
+ * \param[in,out] prd Runtime power management data.
+ */
+void platform_pm_runtime_init(struct pm_runtime_data *prd);
+
+/**
+ * \brief Retrieves platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+void platform_pm_runtime_get(enum pm_runtime_context context);
+
+/**
+ * \brief Releases platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+void platform_pm_runtime_put(enum pm_runtime_context context);
+
+#endif /* __INCLUDE_PLATFORM_PM_RUNTIME__ */
diff --git a/src/platform/cannonlake/include/platform/shim.h b/src/platform/cannonlake/include/platform/shim.h
index 82281f8..8615e7b 100644
--- a/src/platform/cannonlake/include/platform/shim.h
+++ b/src/platform/cannonlake/include/platform/shim.h
@@ -191,6 +191,9 @@
 #define ALHO_CSO_FLAG		(1 << 1)
 #define ALHO_CFO_FLAG		(1 << 2)
 
+#define SHIM_SVCFG			0xF4
+#define SHIM_SVCFG_FORCE_L1_EXIT	(0x1 << 1)
+
 /* host windows */
 #define DMWBA(x)		(HOST_WIN_BASE(x) + 0x0)
 #define DMWLO(x)		(HOST_WIN_BASE(x) + 0x4)
diff --git a/src/platform/cannonlake/pm_runtime.c b/src/platform/cannonlake/pm_runtime.c
new file mode 100644
index 0000000..e01c882
--- /dev/null
+++ b/src/platform/cannonlake/pm_runtime.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/cannonlake/pm_runtime.c
+ * \brief Runtime power management implementation specific for Cannonlake
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#include <sof/alloc.h>
+#include <platform/platform.h>
+#include <platform/pm_runtime.h>
+#include <platform/cavs/pm_runtime.h>
+
+/** \brief Runtime power management data pointer. */
+struct pm_runtime_data *_prd;
+
+void platform_pm_runtime_init(struct pm_runtime_data *prd)
+{
+	struct platform_pm_runtime_data *pprd;
+
+	_prd = prd;
+
+	pprd = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, sizeof(*pprd));
+	_prd->platform_data = pprd;
+}
+
+void platform_pm_runtime_get(enum pm_runtime_context context)
+{
+	/* Action based on context */
+}
+
+void platform_pm_runtime_put(enum pm_runtime_context context)
+{
+	switch (context) {
+	case PM_RUNTIME_HOST_DMA_L1:
+		cavs_pm_runtime_force_host_dma_l1_exit();
+		break;
+	}
+}
diff --git a/src/platform/haswell/include/platform/Makefile.am b/src/platform/haswell/include/platform/Makefile.am
index 8308e14..af8ef78 100644
--- a/src/platform/haswell/include/platform/Makefile.am
+++ b/src/platform/haswell/include/platform/Makefile.am
@@ -5,6 +5,6 @@ noinst_HEADERS = \
 	mailbox.h \
 	memory.h \
 	platform.h \
+	pm_runtime.h \
 	shim.h \
 	timer.h
-	
diff --git a/src/platform/haswell/include/platform/pm_runtime.h b/src/platform/haswell/include/platform/pm_runtime.h
new file mode 100644
index 0000000..1475838
--- /dev/null
+++ b/src/platform/haswell/include/platform/pm_runtime.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/haswell/include/platform/pm_runtime.h
+ * \brief Runtime power management header file for Haswell
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__
+#define __INCLUDE_PLATFORM_PM_RUNTIME__
+
+#include <sof/pm_runtime.h>
+
+/**
+ * \brief Initializes platform specific runtime power management.
+ * \param[in,out] prd Runtime power management data.
+ */
+static inline void platform_pm_runtime_init(struct pm_runtime_data *prd) { }
+
+/**
+ * \brief Retrieves platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+static inline void platform_pm_runtime_get(enum pm_runtime_context context) { }
+
+/**
+ * \brief Releases platform specific power management resource.
+ * \param[in] context Type of power management context.
+ */
+static inline void platform_pm_runtime_put(enum pm_runtime_context context) { }
+
+#endif /* __INCLUDE_PLATFORM_PM_RUNTIME__ */
diff --git a/src/platform/intel/Makefile.am b/src/platform/intel/Makefile.am
new file mode 100644
index 0000000..7b92e00
--- /dev/null
+++ b/src/platform/intel/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = include
diff --git a/src/platform/intel/include/Makefile.am b/src/platform/intel/include/Makefile.am
new file mode 100644
index 0000000..912728c
--- /dev/null
+++ b/src/platform/intel/include/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = platform
diff --git a/src/platform/intel/include/platform/Makefile.am b/src/platform/intel/include/platform/Makefile.am
new file mode 100644
index 0000000..13161e0
--- /dev/null
+++ b/src/platform/intel/include/platform/Makefile.am
@@ -0,0 +1,3 @@
+if BUILD_CAVS
+SUBDIRS = cavs
+endif
diff --git a/src/platform/intel/include/platform/cavs/Makefile.am b/src/platform/intel/include/platform/cavs/Makefile.am
new file mode 100644
index 0000000..712c197
--- /dev/null
+++ b/src/platform/intel/include/platform/cavs/Makefile.am
@@ -0,0 +1,2 @@
+noinst_HEADERS = \
+	pm_runtime.h
diff --git a/src/platform/intel/include/platform/cavs/pm_runtime.h b/src/platform/intel/include/platform/cavs/pm_runtime.h
new file mode 100644
index 0000000..486c119
--- /dev/null
+++ b/src/platform/intel/include/platform/cavs/pm_runtime.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+/**
+ * \file platform/intel/platform/cavs/include/pm_runtime.h
+ * \brief Runtime power management header file for cAVS
+ * \author Tomasz Lauda <tomasz.lauda at linux.intel.com>
+ */
+
+#ifndef __INCLUDE_CAVS_PM_RUNTIME__
+#define __INCLUDE_CAVS_PM_RUNTIME__
+
+#include <platform/pm_runtime.h>
+
+extern struct pm_runtime_data *_prd;
+
+/**
+ * \brief Forces Host DMAs to exit L1.
+ */
+static inline void cavs_pm_runtime_force_host_dma_l1_exit(void)
+{
+	uint32_t flags;
+
+	spin_lock_irq(&_prd->lock, flags);
+
+	if (!(shim_read(SHIM_SVCFG) & SHIM_SVCFG_FORCE_L1_EXIT)) {
+		shim_write(SHIM_SVCFG,
+			   shim_read(SHIM_SVCFG) | SHIM_SVCFG_FORCE_L1_EXIT);
+
+		wait_delay(PLATFORM_FORCE_L1_EXIT_TIME);
+
+		shim_write(SHIM_SVCFG,
+			   shim_read(SHIM_SVCFG) & ~(SHIM_SVCFG_FORCE_L1_EXIT));
+	}
+
+	spin_unlock_irq(&_prd->lock, flags);
+}
+
+#endif /* __INCLUDE_CAVS_PM_RUNTIME__ */
diff --git a/test/cmocka/Makefile.am b/test/cmocka/Makefile.am
index bca9f56..ff1ef19 100644
--- a/test/cmocka/Makefile.am
+++ b/test/cmocka/Makefile.am
@@ -75,4 +75,4 @@ sin_fixed_SOURCES = src/math/trig/sin_fixed.c
 sin_fixed_LDADD = ../../src/math/libsof_math.a $(LDADD)
 
 # all our binaries are test cases
-TESTS = $(check_PROGRAMS)
+TESTS = $(check_PROGRAMS)
\ No newline at end of file
-- 
2.17.0



More information about the Sound-open-firmware mailing list