| /* |
| * intel_mid_pm.h |
| * Copyright (c) 2010, Intel Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms and conditions of the GNU General Public License, |
| * version 2, as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License along with |
| * this program; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| */ |
| #include <linux/errno.h> |
| |
| #ifndef INTEL_MID_PM_H |
| #define INTEL_MID_PM_H |
| |
| #include <asm/intel-mid.h> |
| #include <linux/init.h> |
| #include <linux/pci.h> |
| |
| |
| /* Chip ID of Intel Atom SOC*/ |
| #define INTEL_ATOM_MRST 0x26 |
| #define INTEL_ATOM_MFLD 0x27 |
| #define INTEL_ATOM_CLV 0x35 |
| #define INTEL_ATOM_MRFLD 0x4a |
| #define INTEL_ATOM_BYT 0x37 |
| |
| static inline int platform_is(u8 model) |
| { |
| return (boot_cpu_data.x86_model == model); |
| } |
| |
| /* Register Type definitions */ |
| #define OSPM_REG_TYPE 0x0 |
| #define APM_REG_TYPE 0x1 |
| #define OSPM_MAX_POWER_ISLANDS 16 |
| #define OSPM_ISLAND_UP 0x0 |
| #define OSPM_ISLAND_DOWN 0x1 |
| /*Soft reset*/ |
| #define OSPM_ISLAND_SR 0x2 |
| |
| /* North complex power islands definitions for APM block*/ |
| #define APM_GRAPHICS_ISLAND 0x1 |
| #define APM_VIDEO_DEC_ISLAND 0x2 |
| #define APM_VIDEO_ENC_ISLAND 0x4 |
| #define APM_GL3_CACHE_ISLAND 0x8 |
| #define APM_ISP_ISLAND 0x10 |
| #define APM_IPH_ISLAND 0x20 |
| |
| /* North complex power islands definitions for OSPM block*/ |
| #define OSPM_DISPLAY_A_ISLAND 0x2 |
| #define OSPM_DISPLAY_B_ISLAND 0x80 |
| #define OSPM_DISPLAY_C_ISLAND 0x100 |
| #define OSPM_MIPI_ISLAND 0x200 |
| |
| /* North Complex power islands definitions for Tangier */ |
| #define TNG_ISP_ISLAND 0x1 |
| /* North Complex Register definitions for Tangier */ |
| #define ISP_SS_PM0 0x39 |
| |
| #define C4_STATE_IDX 3 |
| #define C6_STATE_IDX 4 |
| #define S0I1_STATE_IDX 5 |
| #define LPMP3_STATE_IDX 6 |
| #define S0I3_STATE_IDX 7 |
| |
| #define C4_HINT (0x30) |
| #define C6_HINT (0x52) |
| |
| #define CSTATE_EXIT_LATENCY_C1 1 |
| #define CSTATE_EXIT_LATENCY_C2 20 |
| #define CSTATE_EXIT_LATENCY_C4 100 |
| #define CSTATE_EXIT_LATENCY_C6 140 |
| |
| /* Since entry latency is substantial |
| * put exit_latency = entry+exit latency |
| */ |
| #ifdef CONFIG_REMOVEME_INTEL_ATOM_MRFLD_POWER |
| #define CSTATE_EXIT_LATENCY_S0i1 1200 |
| #define CSTATE_EXIT_LATENCY_S0i2 2000 |
| #define CSTATE_EXIT_LATENCY_S0i3 10000 |
| #else |
| #define CSTATE_EXIT_LATENCY_LPMP3 1040 |
| #define CSTATE_EXIT_LATENCY_S0i1 1040 |
| #define CSTATE_EXIT_LATENCY_S0i3 2800 |
| #endif |
| #define BYT_S0I1_STATE 0x60 |
| #define BYT_S0I2_STATE 0x62 |
| #define BYT_LPMP3_STATE 0x62 |
| #define BYT_S0I3_STATE 0x64 |
| |
| enum s3_parts { |
| PROC_FRZ, |
| DEV_SUS, |
| NB_CPU_OFF, |
| NB_CPU_ON, |
| DEV_RES, |
| PROC_UNFRZ, |
| MAX_S3_PARTS |
| }; |
| |
| #ifdef CONFIG_ATOM_SOC_POWER |
| #define LOG_PMU_EVENTS |
| |
| /* Error codes for pmu */ |
| #define PMU_SUCCESS 0 |
| #define PMU_FAILED -1 |
| #define PMU_BUSY_STATUS 0 |
| #define PMU_MODE_ID 1 |
| #define SET_MODE 1 |
| #define SET_AOAC_S0i1 2 |
| #define SET_AOAC_S0i3 3 |
| #define SET_LPAUDIO 4 |
| #define SET_AOAC_S0i2 7 |
| |
| #ifdef CONFIG_REMOVEME_INTEL_ATOM_MRFLD_POWER |
| #define MID_S0I1_STATE 0x60 |
| #define MID_S0I2_STATE 0x62 |
| #define MID_LPMP3_STATE 0x62 |
| #define MID_S0I3_STATE 0x64 |
| #else |
| #define MID_S0I1_STATE 0x1 |
| #define MID_LPMP3_STATE 0x3 |
| #define MID_S0I2_STATE 0x7 |
| #define MID_S0I3_STATE 0x7 |
| #endif |
| |
| #define MID_S0IX_STATE 0xf |
| #define MID_S3_STATE 0x1f |
| #define MID_FAST_ON_OFF_STATE 0x3f |
| |
| /* combinations */ |
| #define MID_LPI1_STATE 0x1f |
| #define MID_LPI3_STATE 0x7f |
| #define MID_I1I3_STATE 0xff |
| |
| #define REMOVE_LP_FROM_LPIX 4 |
| |
| /* Power number for MID_POWER */ |
| #define C0_POWER_USAGE 450 |
| #define C6_POWER_USAGE 200 |
| #define LPMP3_POWER_USAGE 130 |
| #define S0I1_POWER_USAGE 50 |
| #define S0I3_POWER_USAGE 31 |
| |
| extern unsigned int enable_s3; |
| extern unsigned int enable_s0ix; |
| |
| extern void pmu_s0ix_demotion_stat(int req_state, int grant_state); |
| extern unsigned int pmu_get_new_cstate(unsigned int cstate, int *index); |
| extern int get_target_platform_state(unsigned long *eax); |
| extern int mid_s0ix_enter(int); |
| extern int pmu_set_devices_in_d0i0(void); |
| extern int pmu_pci_set_power_state(struct pci_dev *pdev, pci_power_t state); |
| extern pci_power_t pmu_pci_choose_state(struct pci_dev *pdev); |
| |
| extern void time_stamp_in_suspend_flow(int mark, bool start); |
| extern void time_stamp_for_sleep_state_latency(int sleep_state, |
| bool start, bool entry); |
| extern int mid_state_to_sys_state(int mid_state); |
| extern void pmu_power_off(void); |
| extern void pmu_set_s0ix_complete(void); |
| extern bool pmu_is_s0ix_in_progress(void); |
| extern int pmu_nc_set_power_state |
| (int islands, int state_type, int reg_type); |
| extern int pmu_nc_get_power_state(int island, int reg_type); |
| extern int pmu_set_emmc_to_d0i0_atomic(void); |
| |
| #ifdef LOG_PMU_EVENTS |
| extern void pmu_log_ipc(u32 command); |
| extern void pmu_log_ipc_irq(void); |
| #else |
| static inline void pmu_log_ipc(u32 command) { return; }; |
| static inline void pmu_log_ipc_irq(void) { return; }; |
| #endif |
| extern void dump_nc_power_history(void); |
| |
| extern bool mid_pmu_is_wake_source(u32 lss_number); |
| |
| extern void (*nc_report_power_state) (u32, int); |
| #else |
| |
| /* |
| * If CONFIG_ATOM_SOC_POWER is not defined |
| * fall back to C6 |
| */ |
| |
| #define MID_S0I1_STATE C6_HINT |
| #define MID_LPMP3_STATE C6_HINT |
| #define MID_S0I3_STATE C6_HINT |
| #define MID_S3_STATE C6_HINT |
| #define MID_FAST_ON_OFF_STATE C6_HINT |
| |
| /* Power usage unknown if MID_POWER not defined */ |
| #define C0_POWER_USAGE 0 |
| #define C6_POWER_USAGE 0 |
| #define LPMP3_POWER_USAGE 0 |
| #define S0I1_POWER_USAGE 0 |
| #define S0I3_POWER_USAGE 0 |
| |
| #define TEMP_DTS_ID 43 |
| |
| static inline int pmu_nc_set_power_state |
| (int islands, int state_type, int reg_type) { return 0; } |
| static inline int pmu_nc_get_power_state(int island, int reg_type) { return 0; } |
| |
| static inline void pmu_set_s0ix_complete(void) { return; } |
| static inline bool pmu_is_s0ix_in_progress(void) { return false; }; |
| static inline unsigned int pmu_get_new_cstate |
| (unsigned int cstate, int *index) { return cstate; }; |
| |
| /*returns function not implemented*/ |
| static inline void time_stamp_in_suspend_flow(int mark, bool start) {} |
| static inline void time_stamp_for_sleep_state_latency(int sleep_state, |
| bool start, bool entry) {} |
| static inline int mid_state_to_sys_state(int mid_state) { return 0; } |
| |
| static inline int pmu_set_devices_in_d0i0(void) { return 0; } |
| static inline void pmu_log_ipc(u32 command) { return; }; |
| static inline void pmu_log_ipc_irq(void) { return; }; |
| static inline int pmu_set_emmc_to_d0i0_atomic(void) { return -ENOSYS; } |
| static inline void pmu_power_off(void) { return; } |
| static inline bool mid_pmu_is_wake_source(u32 lss_number) { return false; } |
| #endif /* #ifdef CONFIG_ATOM_SOC_POWER */ |
| |
| #endif /* #ifndef INTEL_MID_PM_H */ |