tgl: enable WOVCRO clock

This will allow to save significant amount of SOC power
in low power S0ix WoV

Signed-off-by: Adrian Bonislawski <adrian.bonislawski@linux.intel.com>
This commit is contained in:
Adrian Bonislawski 2020-09-07 18:20:09 +02:00 committed by Liam Girdwood
parent 908838ac15
commit fadd8e7077
4 changed files with 33 additions and 6 deletions

View File

@ -305,18 +305,32 @@ static int clock_platform_set_cpu_freq(int clock, int freq_idx)
void platform_clock_init(struct sof *sof)
{
uint32_t platform_lowest_clock = CPU_LOWEST_FREQ_IDX;
int i;
sof->clocks =
cache_to_uncache((struct clock_info *)platform_clocks_info);
#if CAVS_VERSION == CAVS_VERSION_2_5
/*
* Check HW version clock capabilities
* Try to request WOV_CRO clock, if it fails use LPRO clock
*/
shim_write(SHIM_CLKCTL, shim_read(SHIM_CLKCTL) | SHIM_CLKCTL_WOV_CRO_REQUEST);
if (shim_read(SHIM_CLKCTL) & SHIM_CLKCTL_WOV_CRO_REQUEST)
shim_write(SHIM_CLKCTL, shim_read(SHIM_CLKCTL) & ~SHIM_CLKCTL_WOV_CRO_REQUEST);
else
platform_lowest_clock = CPU_LPRO_FREQ_IDX;
#endif
for (i = 0; i < CONFIG_CORE_COUNT; i++) {
sof->clocks[i] = (struct clock_info) {
.freqs_num = NUM_CPU_FREQ,
.freqs = cpu_freq,
.default_freq_idx = CPU_DEFAULT_IDX,
.current_freq_idx = CPU_DEFAULT_IDX,
.lowest_freq_idx = CPU_LOWEST_FREQ_IDX,
.lowest_freq_idx = platform_lowest_clock,
.notification_id = NOTIFIER_ID_CPU_FREQ,
.notification_mask = NOTIFIER_TARGET_CORE_MASK(i),
.set_freq = clock_platform_set_cpu_freq,

View File

@ -16,11 +16,13 @@
#define CLK_MAX_CPU_HZ 400000000
#define CPU_LPRO_FREQ_IDX 0
#define CPU_WOVCRO_FREQ_IDX 0
#define CPU_HPRO_FREQ_IDX 1
#define CPU_LPRO_FREQ_IDX 1
#define CPU_LOWEST_FREQ_IDX CPU_LPRO_FREQ_IDX
#define CPU_HPRO_FREQ_IDX 2
#define CPU_LOWEST_FREQ_IDX CPU_WOVCRO_FREQ_IDX
#if CONFIG_CAVS_LPRO_ONLY
#define CPU_DEFAULT_IDX CPU_LPRO_FREQ_IDX
@ -30,7 +32,7 @@
#define SSP_DEFAULT_IDX 1
#define NUM_CPU_FREQ 2
#define NUM_CPU_FREQ 3
#define NUM_SSP_FREQ 3

View File

@ -113,6 +113,9 @@
/** \brief Request HP RING Oscillator Clock */
#define SHIM_CLKCTL_RHROSCC BIT(31)
/** \brief Request WOVCRO Clock */
#define SHIM_CLKCTL_WOV_CRO_REQUEST BIT(4)
/** \brief Request XTAL Oscillator Clock */
#define SHIM_CLKCTL_RXOSCC BIT(30)
@ -130,6 +133,7 @@
/** \brief Oscillator Clock Select*/
#define SHIM_CLKCTL_OCS_HP_RING BIT(2)
#define SHIM_CLKCTL_OCS_LP_RING 0
#define SHIM_CLKCTL_WOVCROSC BIT(3)
/** \brief LP Memory Clock Select */
#define SHIM_CLKCTL_LMCS_DIV2 0
@ -172,6 +176,9 @@
/** \brief HP RING Oscillator Clock Status */
#define SHIM_CLKSTS_HROSCCS BIT(31)
/** \brief WOVCRO Clock Status */
#define SHIM_CLKSTS_WOV_CRO BIT(4)
/** \brief XTAL Oscillator Clock Status */
#define SHIM_CLKSTS_XOSCCS BIT(30)

View File

@ -10,11 +10,14 @@
#include <sof/lib/clk.h>
const struct freq_table platform_cpu_freq[] = {
{ 38400000, 38400 },
{ 120000000, 120000 },
{ CLK_MAX_CPU_HZ, 400000 },
};
const uint32_t cpu_freq_enc[] = {
SHIM_CLKCTL_WOVCROSC | SHIM_CLKCTL_WOV_CRO_REQUEST |
SHIM_CLKCTL_HMCS_DIV2 | SHIM_CLKCTL_LMCS_DIV4,
SHIM_CLKCTL_RLROSCC | SHIM_CLKCTL_OCS_LP_RING |
SHIM_CLKCTL_HMCS_DIV2 | SHIM_CLKCTL_LMCS_DIV4,
SHIM_CLKCTL_RHROSCC | SHIM_CLKCTL_OCS_HP_RING |
@ -22,8 +25,9 @@ const uint32_t cpu_freq_enc[] = {
};
const uint32_t cpu_freq_status_mask[] = {
SHIM_CLKSTS_WOV_CRO,
SHIM_CLKSTS_LROSCCS,
SHIM_CLKSTS_HROSCCS,
SHIM_CLKSTS_HROSCCS
};
STATIC_ASSERT(NUM_CPU_FREQ == ARRAY_SIZE(platform_cpu_freq),