xref: /nrf52832-nimble/rt-thread/libcpu/ppc/ppc405/include/asm/ppc4xx.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*----------------------------------------------------------------------------+
2*10465441SEvalZero |
3*10465441SEvalZero |       This source code has been made available to you by IBM on an AS-IS
4*10465441SEvalZero |       basis.  Anyone receiving this source is licensed under IBM
5*10465441SEvalZero |       copyrights to use it in any way he or she deems fit, including
6*10465441SEvalZero |       copying it, modifying it, compiling it, and redistributing it either
7*10465441SEvalZero |       with or without modifications.  No license under IBM patents or
8*10465441SEvalZero |       patent applications is to be implied by the copyright license.
9*10465441SEvalZero |
10*10465441SEvalZero |       Any user of this software should understand that IBM cannot provide
11*10465441SEvalZero |       technical support for this software and will not be responsible for
12*10465441SEvalZero |       any consequences resulting from the use of this software.
13*10465441SEvalZero |
14*10465441SEvalZero |       Any person who transfers this source code or any derivative work
15*10465441SEvalZero |       must include the IBM copyright notice, this paragraph, and the
16*10465441SEvalZero |       preceding two paragraphs in the transferred software.
17*10465441SEvalZero |
18*10465441SEvalZero |       COPYRIGHT   I B M   CORPORATION 1999
19*10465441SEvalZero |       LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M
20*10465441SEvalZero +----------------------------------------------------------------------------*/
21*10465441SEvalZero 
22*10465441SEvalZero #ifndef	__PPC4XX_H__
23*10465441SEvalZero #define __PPC4XX_H__
24*10465441SEvalZero 
25*10465441SEvalZero /*
26*10465441SEvalZero  * Configure which SDRAM/DDR/DDR2 controller is equipped
27*10465441SEvalZero  */
28*10465441SEvalZero #define CONFIG_SDRAM_PPC4xx_IBM_SDRAM	/* IBM SDRAM controller */
29*10465441SEvalZero 
30*10465441SEvalZero #include <asm/ppc405.h>
31*10465441SEvalZero #include <asm/ppc4xx-uic.h>
32*10465441SEvalZero 
33*10465441SEvalZero /*
34*10465441SEvalZero  * Macro for generating register field mnemonics
35*10465441SEvalZero  */
36*10465441SEvalZero #define	PPC_REG_BITS		32
37*10465441SEvalZero #define	PPC_REG_VAL(bit, value)	((value) << ((PPC_REG_BITS - 1) - (bit)))
38*10465441SEvalZero 
39*10465441SEvalZero /*
40*10465441SEvalZero  * Elide casts when assembling register mnemonics
41*10465441SEvalZero  */
42*10465441SEvalZero #ifndef __ASSEMBLY__
43*10465441SEvalZero #define	static_cast(type, val)	(type)(val)
44*10465441SEvalZero #else
45*10465441SEvalZero #define	static_cast(type, val)	(val)
46*10465441SEvalZero #endif
47*10465441SEvalZero 
48*10465441SEvalZero /*
49*10465441SEvalZero  * Common stuff for 4xx (405 and 440)
50*10465441SEvalZero  */
51*10465441SEvalZero 
52*10465441SEvalZero #define EXC_OFF_SYS_RESET	0x0100	/* System reset				*/
53*10465441SEvalZero #define _START_OFFSET		(EXC_OFF_SYS_RESET + 0x2000)
54*10465441SEvalZero 
55*10465441SEvalZero #define RESET_VECTOR	0xfffffffc
56*10465441SEvalZero #define CACHELINE_MASK	(CONFIG_SYS_CACHELINE_SIZE - 1) /* Address mask for cache
57*10465441SEvalZero 						     line aligned data. */
58*10465441SEvalZero 
59*10465441SEvalZero #define CPR0_DCR_BASE	0x0C
60*10465441SEvalZero #define cprcfga		(CPR0_DCR_BASE+0x0)
61*10465441SEvalZero #define cprcfgd		(CPR0_DCR_BASE+0x1)
62*10465441SEvalZero 
63*10465441SEvalZero #define SDR_DCR_BASE	0x0E
64*10465441SEvalZero #define sdrcfga		(SDR_DCR_BASE+0x0)
65*10465441SEvalZero #define sdrcfgd		(SDR_DCR_BASE+0x1)
66*10465441SEvalZero 
67*10465441SEvalZero #define SDRAM_DCR_BASE	0x10
68*10465441SEvalZero #define memcfga		(SDRAM_DCR_BASE+0x0)
69*10465441SEvalZero #define memcfgd		(SDRAM_DCR_BASE+0x1)
70*10465441SEvalZero 
71*10465441SEvalZero #define EBC_DCR_BASE	0x12
72*10465441SEvalZero #define ebccfga		(EBC_DCR_BASE+0x0)
73*10465441SEvalZero #define ebccfgd		(EBC_DCR_BASE+0x1)
74*10465441SEvalZero 
75*10465441SEvalZero /*
76*10465441SEvalZero  * Macros for indirect DCR access
77*10465441SEvalZero  */
78*10465441SEvalZero #define mtcpr(reg, d)	do { mtdcr(cprcfga,reg);mtdcr(cprcfgd,d); } while (0)
79*10465441SEvalZero #define mfcpr(reg, d)	do { mtdcr(cprcfga,reg);d = mfdcr(cprcfgd); } while (0)
80*10465441SEvalZero 
81*10465441SEvalZero #define mtebc(reg, d)	do { mtdcr(ebccfga,reg);mtdcr(ebccfgd,d); } while (0)
82*10465441SEvalZero #define mfebc(reg, d)	do { mtdcr(ebccfga,reg);d = mfdcr(ebccfgd); } while (0)
83*10465441SEvalZero 
84*10465441SEvalZero #define mtsdram(reg, d)	do { mtdcr(memcfga,reg);mtdcr(memcfgd,d); } while (0)
85*10465441SEvalZero #define mfsdram(reg, d)	do { mtdcr(memcfga,reg);d = mfdcr(memcfgd); } while (0)
86*10465441SEvalZero 
87*10465441SEvalZero #define mtsdr(reg, d)	do { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,d); } while (0)
88*10465441SEvalZero #define mfsdr(reg, d)	do { mtdcr(sdrcfga,reg);d = mfdcr(sdrcfgd); } while (0)
89*10465441SEvalZero 
90*10465441SEvalZero #ifndef __ASSEMBLY__
91*10465441SEvalZero 
92*10465441SEvalZero typedef struct
93*10465441SEvalZero {
94*10465441SEvalZero 	unsigned long freqDDR;
95*10465441SEvalZero 	unsigned long freqEBC;
96*10465441SEvalZero 	unsigned long freqOPB;
97*10465441SEvalZero 	unsigned long freqPCI;
98*10465441SEvalZero 	unsigned long freqPLB;
99*10465441SEvalZero 	unsigned long freqTmrClk;
100*10465441SEvalZero 	unsigned long freqUART;
101*10465441SEvalZero 	unsigned long freqProcessor;
102*10465441SEvalZero 	unsigned long freqVCOHz;
103*10465441SEvalZero 	unsigned long freqVCOMhz;	/* in MHz                          */
104*10465441SEvalZero 	unsigned long pciClkSync;	/* PCI clock is synchronous        */
105*10465441SEvalZero 	unsigned long pciIntArbEn;	/* Internal PCI arbiter is enabled */
106*10465441SEvalZero 	unsigned long pllExtBusDiv;
107*10465441SEvalZero 	unsigned long pllFbkDiv;
108*10465441SEvalZero 	unsigned long pllFwdDiv;
109*10465441SEvalZero 	unsigned long pllFwdDivA;
110*10465441SEvalZero 	unsigned long pllFwdDivB;
111*10465441SEvalZero 	unsigned long pllOpbDiv;
112*10465441SEvalZero 	unsigned long pllPciDiv;
113*10465441SEvalZero 	unsigned long pllPlbDiv;
114*10465441SEvalZero } PPC4xx_SYS_INFO;
115*10465441SEvalZero 
get_mcsr(void)116*10465441SEvalZero static inline rt_uint32_t get_mcsr(void)
117*10465441SEvalZero {
118*10465441SEvalZero 	rt_uint32_t val;
119*10465441SEvalZero 
120*10465441SEvalZero 	asm volatile("mfspr %0, 0x23c" : "=r" (val) :);
121*10465441SEvalZero 	return val;
122*10465441SEvalZero }
123*10465441SEvalZero 
set_mcsr(rt_uint32_t val)124*10465441SEvalZero static inline void set_mcsr(rt_uint32_t val)
125*10465441SEvalZero {
126*10465441SEvalZero 	asm volatile("mtspr 0x23c, %0" : "=r" (val) :);
127*10465441SEvalZero }
128*10465441SEvalZero 
129*10465441SEvalZero #endif	/* __ASSEMBLY__ */
130*10465441SEvalZero 
131*10465441SEvalZero /* for multi-cpu support */
132*10465441SEvalZero #define NA_OR_UNKNOWN_CPU	-1
133*10465441SEvalZero 
134*10465441SEvalZero #endif	/* __PPC4XX_H__ */
135