From: Tomasz Lauda tomasz.lauda@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@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@linux.intel.com + */ + +/** + * \file include/sof/pm_runtime.h + * \brief Runtime power management header file + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file lib/pm_runtime.c + * \brief Runtime power management implementation + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file platform/apollolake/include/platform/pm_runtime.h + * \brief Runtime power management header file for Apollolake + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file platform/apollolake/pm_runtime.c + * \brief Runtime power management implementation specific for Apollolake + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file platform/baytrail/include/platform/pm_runtime.h + * \brief Runtime power management header file for Baytrail + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file platform/cannonlake/include/platform/pm_runtime.h + * \brief Runtime power management header file for Cannonlake + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file platform/cannonlake/pm_runtime.c + * \brief Runtime power management implementation specific for Cannonlake + * \author Tomasz Lauda tomasz.lauda@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@linux.intel.com + */ + +/** + * \file platform/haswell/include/platform/pm_runtime.h + * \brief Runtime power management header file for Haswell + * \author Tomasz Lauda tomasz.lauda@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@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@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