OSHW-DEIMOS/SOFTWARE/A64-TERES/linux-a64/drivers/soc/allwinner/pm/pm.h
Dimitar Gamishev f9b0e7a283 linux
2017-10-13 14:07:04 +03:00

273 lines
9.6 KiB
C
Executable File

#ifndef _PM_H
#define _PM_H
/*
* Copyright (c) 2011-2015 yanggq.young@allwinnertech.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*/
#include "pm_types.h"
#include "pm_config.h"
#include "pm_errcode.h"
#include "pm_debug.h"
#include "pm_of.h"
#include <linux/of.h>
#include <linux/delay.h>
#include <linux/of_address.h>
#include "mem_cpu.h"
#include "mem_ccmu.h"
#include "mem_serial.h"
#include "mem_key.h"
#include "mem_ir.h"
#include "mem_usb.h"
#include "mem_printk.h"
#include "mem_divlibc.h"
#include "mem_int.h"
#include "mem_gpio.h"
#include "mem_tmr.h"
#include "mem_tmstmp.h"
#include "mem_clk.h"
#include "mem_timing.h"
#include "mem_mapping.h"
#include "mem_hwspinlock.h"
#ifdef CONFIG_ARCH_SUN9IW1P1
#include "mem_cci400.h"
#include "mem_gtbus.h"
#endif
#include "linux/power/aw_pm.h"
extern __u32 debug_mask;
typedef enum{
PM_STANDBY_PRINT_STANDBY = (1U << 0),
PM_STANDBY_PRINT_RESUME = (1U << 1),
PM_STANDBY_ENABLE_JTAG = (1U << 2),
PM_STANDBY_PRINT_PORT = (1U << 3),
PM_STANDBY_PRINT_IO_STATUS = (1U << 4),
PM_STANDBY_PRINT_CACHE_TLB_MISS = (1U << 5),
PM_STANDBY_PRINT_CCU_STATUS = (1U << 6),
PM_STANDBY_PRINT_PWR_STATUS = (1U << 7),
PM_STANDBY_PRINT_CPUS_IO_STATUS = (1U << 8),
PM_STANDBY_PRINT_CCI400_REG = (1U << 9),
PM_STANDBY_PRINT_GTBUS_REG = (1U << 10),
PM_STANDBY_TEST = (1U << 11),
PM_STANDBY_PRINT_RESUME_IO_STATUS = (1U << 12)
}debug_mask_flag;
extern unsigned int parse_bitmap_en;
typedef enum{
DEBUG_WAKEUP_SRC = (0x01<<0),
DEBUG_WAKEUP_GPIO_MAP = (0x01<<1),
DEBUG_WAKEUP_GPIO_GROUP_MAP = (0x01<<2),
DEBUG_PWR_DM_MAP = (0x01<<3)
}parse_bitmap_en_flag;
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#define uk_printf(s, size, fmt, args...) do { \
if(NULL != s){ \
s += scnprintf(s, size, fmt, ## args); \
}else{ \
printk(fmt, ## args); \
} \
}while(0)
struct mmu_state {
/* CR0 */
__u32 cssr; /* Cache Size Selection */
/* CR1 */
__u32 cr; /* Control */
__u32 cacr; /* Coprocessor Access Control */
/* CR2 */
__u32 ttb_0r; /* Translation Table Base 0 */
__u32 ttb_1r; /* Translation Table Base 1 */
__u32 ttbcr; /* Translation Talbe Base Control */
/* CR3 */
__u32 dacr; /* Domain Access Control */
/*cr10*/
__u32 prrr; /* Primary Region Remap Register */
__u32 nrrr; /* Normal Memory Remap Register */
};
/**
*@brief struct of super mem
*/
struct aw_mem_para{
void **resume_pointer;
volatile __u32 mem_flag;
__u32 monitor_vector;
__u32 axp_event;
__u32 sys_event;
__u32 debug_mask;
__u32 suspend_delay_ms;
__u32 saved_runtime_context_svc[RUNTIME_CONTEXT_SIZE];
struct clk_div_t clk_div;
struct clk_misc_t clk_misc; //miscellaneous para.
struct pll_factor_t pll_factor;
struct mmu_state saved_mmu_state;
};
typedef int (*suspend_func)(void);
/*mem_mmu_pc_asm.S*/
extern unsigned int save_sp_nommu(void);
extern unsigned int save_sp(void);
extern void clear_reg_context(void);
extern void restore_sp(unsigned int sp);
//cache
extern void invalidate_dcache(void);
extern void flush_icache(void);
extern void flush_dcache(void);
extern void disable_cache(void);
extern void disable_dcache(void);
extern void disable_l2cache(void);
extern void enable_cache(void);
extern void enable_icache(void);
extern void disable_program_flow_prediction(void);
extern void invalidate_branch_predictor(void);
extern void enable_program_flow_prediction(void);
extern void mem_flush_tlb(void);
extern void mem_preload_tlb(void);
void disable_mmu(void);
void enable_mmu(void);
extern int jump_to_resume(void* pointer, __u32 *addr);
extern int jump_to_resume0(void* pointer);
void jump_to_suspend(__u32 ttbr1, suspend_func p);
extern int jump_to_resume0_nommu(void* pointer);
/*mmu_pc.c*/
extern void save_mmu_state(struct mmu_state *saved_mmu_state);
extern void restore_mmu_state(struct mmu_state *saved_mmu_state);
void set_ttbr0(void);
extern void invalidate_dcache(void);
typedef struct __MEM_TWIC_REG
{
volatile __u32 reg_saddr;
volatile __u32 reg_xsaddr;
volatile __u32 reg_data;
volatile __u32 reg_ctl;
volatile __u32 reg_status;
volatile __u32 reg_clkr;
volatile __u32 reg_reset;
volatile __u32 reg_efr;
volatile __u32 reg_lctl;
} __mem_twic_reg_t;
struct gic_distributor_state{
//distributor
volatile __u32 GICD_CTLR; //offset 0x00, distributor Contrl reg
volatile __u32 GICD_IGROUPRn; //offset 0x80, Interrupt Grp Reg ?
volatile __u32 GICD_ISENABLERn[0x180/4]; //offset 0x100-0x17c, Interrupt Set-Enable Reg
volatile __u32 GICD_ICENABLERn[0x180/4]; //offset 0x180-0x1fc, Iterrupt Clear-Enable Reg
volatile __u32 GICD_ISPENDRn[0x180/4]; //offset 0x200-0x27c, Iterrupt Set-Pending Reg
volatile __u32 GICD_ICPENDRn[0x180/4]; //offset 0x280-0x2fc, Iterrupt Clear-Pending Reg
volatile __u32 GICD_ISACTIVERn[0x180/4]; //offset 0x300-0x37c, GICv2 Iterrupt Set-Active Reg
volatile __u32 GICD_ICACTIVERn[0x180/4]; //offset 0x380-0x3fc, Iterrupt Clear-Active Reg
volatile __u32 GICD_IPRIORITYRn[0x180/4]; //offset 0x400-0x7F8, Iterrupt Priority Reg
volatile __u32 GICD_ITARGETSRn[(0x400-0x20)/4]; //offset 0x820-0xbf8, Iterrupt Processor Targets Reg
volatile __u32 GICD_ICFGRn[0x100/4]; //offset 0xc00-0xcfc, Iterrupt Config Reg
volatile __u32 GICD_NSACRn[0x100/4]; //offset 0xE00-0xEfc, non-secure Access Ctrl Reg ?
volatile __u32 GICD_CPENDSGIRn[0x10/4]; //offset 0xf10-0xf1c, SGI Clear-Pending Reg
volatile __u32 GICD_SPENDSGIRn[0x10/4]; //offset 0xf20-0xf2c, SGI Set-Pending Reg
};
struct gic_cpu_interface_state{
//cpu interface reg
volatile __u32 GICC_CTLR_PMR_BPR[0xc/4]; //offset 0x00-0x08, cpu interface Ctrl Reg + Interrupt Priority Mask Reg + Binary Point Reg
volatile __u32 GICC_ABPR; //offset 0x1c, Aliased Binary Point Reg
volatile __u32 GICC_APRn[0x10/4]; //offset 0xd0-0xdc, Active Priorities Reg
volatile __u32 GICC_NSAPRn[0x10/4]; //offset 0xe0-0xec, Non-secure Active Priorities Reg
};
struct gic_distributor_disc{
//distributor
volatile __u32 GICD_CTLR; //offset 0x00, distributor Contrl reg
volatile __u32 reserved0[0x7c/4]; //0ffset 0x04-0x7c
volatile __u32 GICD_IGROUPRn; //offset 0x80, Interrupt Grp Reg ?
volatile __u32 reserved1[0x7c/4]; //0ffset 0x84-0xfc
volatile __u32 GICD_ISENABLERn[0x180/4]; //offset 0x100-0x17c, Interrupt Set-Enable Reg
volatile __u32 GICD_ICENABLERn[0x180/4]; //offset 0x180-0x1fc, Iterrupt Clear-Enable Reg
volatile __u32 GICD_ISPENDRn[0x180/4]; //offset 0x200-0x27c, Iterrupt Set-Pending Reg
volatile __u32 GICD_ICPENDRn[0x180/4]; //offset 0x280-0x2fc, Iterrupt Clear-Pending Reg
volatile __u32 GICD_ISACTIVERn[0x180/4]; //offset 0x300-0x37c, GICv2 Iterrupt Set-Active Reg
volatile __u32 GICD_ICACTIVERn[0x180/4]; //offset 0x380-0x3fc, Iterrupt Clear-Active Reg
volatile __u32 GICD_IPRIORITYRn[0x180/4]; //offset 0x400-0x7F8, Iterrupt Priority Reg
volatile __u32 reserved2[0x24/4]; //0ffset 0x7fc-0x81c
volatile __u32 GICD_ITARGETSRn[(0x400-0x20)/4]; //offset 0x820-0xbf8, Iterrupt Processor Targets Reg
volatile __u32 reserved3; //0ffset 0xbfc
volatile __u32 GICD_ICFGRn[0x100/4]; //offset 0xc00-0xcfc, Iterrupt Config Reg
volatile __u32 reserved4[0x100/4]; //0ffset 0xd00-0xdfc
volatile __u32 GICD_NSACRn[0x100/4]; //offset 0xE00-0xEfc, non-secure Access Ctrl Reg ?
volatile __u32 reserved5[0x10/4]; //0ffset 0xf00-0xf0c
volatile __u32 GICD_CPENDSGIRn[0x10/4]; //offset 0xf10-0xf1c, SGI Clear-Pending Reg
volatile __u32 GICD_SPENDSGIRn[0x10/4]; //offset 0xf20-0xf2c, SGI Set-Pending Reg
volatile __u32 reserved6[0xd0/4]; //0ffset 0xf30-0xffc
};
struct gic_cpu_interface_disc{
//cpu interface reg
volatile __u32 GICC_CTLR_PMR_BPR[0xc/4]; //offset 0x00-0x08, cpu interface Ctrl Reg + Interrupt Priority Mask Reg + Binary Point Reg
volatile __u32 reserved7[0x10/4]; //0ffset 0xC-0x18, readonly or writeonly
volatile __u32 GICC_ABPR; //offset 0x1c, Aliased Binary Point Reg
volatile __u32 reserved8[0xb0/4]; //0ffset 0x20-0xcf, readonly or writeonly
volatile __u32 GICC_APRn[0x10/4]; //offset 0xd0-0xdc, Active Priorities Reg
volatile __u32 GICC_NSAPRn[0x10/4]; //offset 0xe0-0xec, Non-secure Active Priorities Reg
volatile __u32 reserved9[0x10/4]; //0ffset 0xf0-0xfc, readonly or writeonly
volatile __u32 reserved10[0xf00/4]; //0ffset 0x100-0xffc, readonly or writeonly
volatile __u32 reserved11; //0ffset 0x1000, readonly or writeonly
};
struct gic_state{
struct gic_distributor_state m_distributor;
struct gic_cpu_interface_state m_interface;
};
struct twi_state{
__mem_twic_reg_t *twi_reg;
__u32 twi_reg_backup[7];
};
struct sram_state{
__u32 sram_reg_back[SRAM_REG_LENGTH];
};
//save module state
__s32 mem_twi_save(struct twi_state *ptwi_state);
__s32 mem_twi_restore(struct twi_state *ptwi_state);
__s32 mem_sram_init(void);
__s32 mem_sram_save(struct sram_state *psram_state);
__s32 mem_sram_restore(struct sram_state *psram_state);
__s32 mem_ccu_save(struct ccm_state *ccm_reg);
__s32 mem_ccu_restore(struct ccm_state *ccm_reg);
extern struct aw_mem_para mem_para_info;
extern struct super_standby_para super_standby_para_info;
#if defined(CONFIG_ARCH_SUN8IW8P1)
#else
#ifdef CONFIG_SUNXI_ARISC
#else
//#warning "ARISC driver is not enabled!!!!!!!!!"
#endif
#endif
#endif /*_PM_H*/