Skip to content

Commit

Permalink
pm_runtime: add runtime power management initial implementation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
tlauda authored and Marcin Maka committed Jun 20, 2018
1 parent 5827f39 commit 14ca1fa
Show file tree
Hide file tree
Showing 33 changed files with 663 additions and 14 deletions.
5 changes: 5 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down Expand Up @@ -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
])
Expand Down
3 changes: 2 additions & 1 deletion doc/sof_uapi.doxygen.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/drivers/hda-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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;
}

Expand Down
3 changes: 2 additions & 1 deletion src/include/sof/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@ include_HEADERS = \
wait.h \
string.h \
hda-dma.h \
work.h
work.h \
pm_runtime.h
77 changes: 77 additions & 0 deletions src/include/sof/pm_runtime.h
Original file line number Diff line number Diff line change
@@ -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__ */
2 changes: 2 additions & 0 deletions src/include/sof/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/init/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion src/lib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
74 changes: 74 additions & 0 deletions src/lib/pm_runtime.c
Original file line number Diff line number Diff line change
@@ -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;
}
}
14 changes: 8 additions & 6 deletions src/platform/Makefile.am
Original file line number Diff line number Diff line change
@@ -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
3 changes: 2 additions & 1 deletion src/platform/apollolake/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
1 change: 1 addition & 0 deletions src/platform/apollolake/include/platform/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ noinst_HEADERS = \
mailbox.h \
memory.h \
platform.h \
pm_runtime.h \
shim.h \
timer.h
3 changes: 3 additions & 0 deletions src/platform/apollolake/include/platform/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
65 changes: 65 additions & 0 deletions src/platform/apollolake/include/platform/pm_runtime.h
Original file line number Diff line number Diff line change
@@ -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__ */
3 changes: 3 additions & 0 deletions src/platform/apollolake/include/platform/shim.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading

0 comments on commit 14ca1fa

Please sign in to comment.