0001
0002
0003
0004
0005
0006
0007 #ifndef __MIPS_ASM_MIPS_CPS_H__
0008 # error Please include asm/mips-cps.h rather than asm/mips-cpc.h
0009 #endif
0010
0011 #ifndef __MIPS_ASM_MIPS_CPC_H__
0012 #define __MIPS_ASM_MIPS_CPC_H__
0013
0014 #include <linux/bitops.h>
0015 #include <linux/errno.h>
0016
0017
0018 extern void __iomem *mips_cpc_base;
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 extern phys_addr_t mips_cpc_default_phys_base(void);
0029
0030
0031
0032
0033
0034
0035
0036 #ifdef CONFIG_MIPS_CPC
0037 extern int mips_cpc_probe(void);
0038 #else
0039 static inline int mips_cpc_probe(void)
0040 {
0041 return -ENODEV;
0042 }
0043 #endif
0044
0045
0046
0047
0048
0049
0050 static inline bool mips_cpc_present(void)
0051 {
0052 #ifdef CONFIG_MIPS_CPC
0053 return mips_cpc_base != NULL;
0054 #else
0055 return false;
0056 #endif
0057 }
0058
0059
0060 #define MIPS_CPC_GCB_OFS 0x0000
0061 #define MIPS_CPC_CLCB_OFS 0x2000
0062 #define MIPS_CPC_COCB_OFS 0x4000
0063
0064 #define CPC_ACCESSOR_RO(sz, off, name) \
0065 CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_GCB_OFS + off, name) \
0066 CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_COCB_OFS + off, redir_##name)
0067
0068 #define CPC_ACCESSOR_RW(sz, off, name) \
0069 CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_GCB_OFS + off, name) \
0070 CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_COCB_OFS + off, redir_##name)
0071
0072 #define CPC_CX_ACCESSOR_RO(sz, off, name) \
0073 CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_CLCB_OFS + off, cl_##name) \
0074 CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_COCB_OFS + off, co_##name)
0075
0076 #define CPC_CX_ACCESSOR_RW(sz, off, name) \
0077 CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_CLCB_OFS + off, cl_##name) \
0078 CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_COCB_OFS + off, co_##name)
0079
0080
0081 CPC_ACCESSOR_RW(32, 0x000, access)
0082
0083
0084 CPC_ACCESSOR_RW(32, 0x008, seqdel)
0085
0086
0087 CPC_ACCESSOR_RW(32, 0x010, rail)
0088
0089
0090 CPC_ACCESSOR_RW(32, 0x018, resetlen)
0091
0092
0093 CPC_ACCESSOR_RO(32, 0x020, revision)
0094
0095
0096 CPC_ACCESSOR_RW(32, 0x030, pwrup_ctl)
0097 #define CPC_PWRUP_CTL_CM_PWRUP BIT(0)
0098
0099
0100 CPC_ACCESSOR_RW(64, 0x138, config)
0101
0102
0103 CPC_ACCESSOR_RW(32, 0x140, sys_config)
0104 #define CPC_SYS_CONFIG_BE_IMMEDIATE BIT(2)
0105 #define CPC_SYS_CONFIG_BE_STATUS BIT(1)
0106 #define CPC_SYS_CONFIG_BE BIT(0)
0107
0108
0109 CPC_CX_ACCESSOR_RW(32, 0x000, cmd)
0110 #define CPC_Cx_CMD GENMASK(3, 0)
0111 #define CPC_Cx_CMD_CLOCKOFF 0x1
0112 #define CPC_Cx_CMD_PWRDOWN 0x2
0113 #define CPC_Cx_CMD_PWRUP 0x3
0114 #define CPC_Cx_CMD_RESET 0x4
0115
0116
0117 CPC_CX_ACCESSOR_RW(32, 0x008, stat_conf)
0118 #define CPC_Cx_STAT_CONF_PWRUPE BIT(23)
0119 #define CPC_Cx_STAT_CONF_SEQSTATE GENMASK(22, 19)
0120 #define CPC_Cx_STAT_CONF_SEQSTATE_D0 0x0
0121 #define CPC_Cx_STAT_CONF_SEQSTATE_U0 0x1
0122 #define CPC_Cx_STAT_CONF_SEQSTATE_U1 0x2
0123 #define CPC_Cx_STAT_CONF_SEQSTATE_U2 0x3
0124 #define CPC_Cx_STAT_CONF_SEQSTATE_U3 0x4
0125 #define CPC_Cx_STAT_CONF_SEQSTATE_U4 0x5
0126 #define CPC_Cx_STAT_CONF_SEQSTATE_U5 0x6
0127 #define CPC_Cx_STAT_CONF_SEQSTATE_U6 0x7
0128 #define CPC_Cx_STAT_CONF_SEQSTATE_D1 0x8
0129 #define CPC_Cx_STAT_CONF_SEQSTATE_D3 0x9
0130 #define CPC_Cx_STAT_CONF_SEQSTATE_D2 0xa
0131 #define CPC_Cx_STAT_CONF_CLKGAT_IMPL BIT(17)
0132 #define CPC_Cx_STAT_CONF_PWRDN_IMPL BIT(16)
0133 #define CPC_Cx_STAT_CONF_EJTAG_PROBE BIT(15)
0134
0135
0136 CPC_CX_ACCESSOR_RW(32, 0x010, other)
0137 #define CPC_Cx_OTHER_CORENUM GENMASK(23, 16)
0138
0139
0140 CPC_CX_ACCESSOR_RW(32, 0x020, vp_stop)
0141
0142
0143 CPC_CX_ACCESSOR_RW(32, 0x028, vp_run)
0144
0145
0146 CPC_CX_ACCESSOR_RW(32, 0x030, vp_running)
0147
0148
0149 CPC_CX_ACCESSOR_RW(32, 0x090, config)
0150
0151 #ifdef CONFIG_MIPS_CPC
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 extern void mips_cpc_lock_other(unsigned int core);
0163
0164
0165
0166
0167
0168
0169
0170 extern void mips_cpc_unlock_other(void);
0171
0172 #else
0173
0174 static inline void mips_cpc_lock_other(unsigned int core) { }
0175 static inline void mips_cpc_unlock_other(void) { }
0176
0177 #endif
0178
0179 #endif