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