diff --git a/Makefile.am b/Makefile.am index 701e8f24c181..d941047eefbb 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 2673d39ddef5..be89fc1a9680 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 74052f1aa76c..18444c9a41cc 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 974ee80d5f35..2d23576880b0 100644 --- a/src/drivers/hda-dma.c +++ b/src/drivers/hda-dma.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -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 b66745927df5..7eaba9a590b6 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 000000000000..04e0fe1304df --- /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 + */ + +/** + * \file include/sof/pm_runtime.h + * \brief Runtime power management header file + * \author Tomasz Lauda + */ + +#ifndef __INCLUDE_PM_RUNTIME__ +#define __INCLUDE_PM_RUNTIME__ + +#include +#include + +/** \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 0e339b59b81c..d72ef6880a2e 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 73ba3beefb63..b72fa1d4a74b 100644 --- a/src/init/init.c +++ b/src/init/init.c @@ -42,6 +42,7 @@ #include #include #include +#include #include /* 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 874d2fb5d1d2..31750790d43a 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 000000000000..b165f5f03c67 --- /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 + */ + +/** + * \file lib/pm_runtime.c + * \brief Runtime power management implementation + * \author Tomasz Lauda + */ + +#include +#include +#include + +/** \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 93742b067816..6a41c478b27a 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 417a13d03e97..1732a6d310c7 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 4e4e20dddbca..af8ef7807760 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 1cce0c78c4ae..39f85498be24 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 000000000000..2758638e5ec2 --- /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 + */ + +/** + * \file platform/apollolake/include/platform/pm_runtime.h + * \brief Runtime power management header file for Apollolake + * \author Tomasz Lauda + */ + +#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__ +#define __INCLUDE_PLATFORM_PM_RUNTIME__ + +#include + +/** \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 92b6cf36f83e..598f1c89973d 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 000000000000..00f902d68f50 --- /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 + */ + +/** + * \file platform/apollolake/pm_runtime.c + * \brief Runtime power management implementation specific for Apollolake + * \author Tomasz Lauda + */ + +#include +#include +#include +#include + +/** \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 5775230c7907..48a7f5bb096a 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 000000000000..6757e3266567 --- /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 + */ + +/** + * \file platform/baytrail/include/platform/pm_runtime.h + * \brief Runtime power management header file for Baytrail + * \author Tomasz Lauda + */ + +#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__ +#define __INCLUDE_PLATFORM_PM_RUNTIME__ + +#include + +/** + * \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 503271cabca7..da7b4e9aef56 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 4e4e20dddbca..af8ef7807760 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 36e48680a451..b3e5f7404b1a 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 000000000000..3cf113d39a41 --- /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 + */ + +/** + * \file platform/cannonlake/include/platform/pm_runtime.h + * \brief Runtime power management header file for Cannonlake + * \author Tomasz Lauda + */ + +#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__ +#define __INCLUDE_PLATFORM_PM_RUNTIME__ + +#include + +/** \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 82281f8de887..8615e7bdb452 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 000000000000..e01c882bfcc4 --- /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 + */ + +/** + * \file platform/cannonlake/pm_runtime.c + * \brief Runtime power management implementation specific for Cannonlake + * \author Tomasz Lauda + */ + +#include +#include +#include +#include + +/** \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 8308e14bbaed..af8ef7807760 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 000000000000..1475838dee0f --- /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 + */ + +/** + * \file platform/haswell/include/platform/pm_runtime.h + * \brief Runtime power management header file for Haswell + * \author Tomasz Lauda + */ + +#ifndef __INCLUDE_PLATFORM_PM_RUNTIME__ +#define __INCLUDE_PLATFORM_PM_RUNTIME__ + +#include + +/** + * \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 000000000000..7b92e00e596a --- /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 000000000000..912728c3a5d0 --- /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 000000000000..13161e04979b --- /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 000000000000..712c19764b14 --- /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 000000000000..486c11972967 --- /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 + */ + +/** + * \file platform/intel/platform/cavs/include/pm_runtime.h + * \brief Runtime power management header file for cAVS + * \author Tomasz Lauda + */ + +#ifndef __INCLUDE_CAVS_PM_RUNTIME__ +#define __INCLUDE_CAVS_PM_RUNTIME__ + +#include + +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 bca9f56ffe8d..ff1ef195120c 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