Merge git://git.denx.de/u-boot-sunxi
[oweals/u-boot.git] / arch / powerpc / include / asm / 8xx_immap.h
1 /*
2  * MPC8xx Internal Memory Map
3  * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
4  *
5  * The I/O on the MPC860 is comprised of blocks of special registers
6  * and the dual port ram for the Communication Processor Module.
7  * Within this space are functional units such as the SIU, memory
8  * controller, system timers, and other control functions.  It is
9  * a combination that I found difficult to separate into logical
10  * functional files.....but anyone else is welcome to try.  -- Dan
11  */
12 #ifndef __IMMAP_8XX__
13 #define __IMMAP_8XX__
14
15 /* System configuration registers.
16 */
17 typedef struct sys_conf {
18         uint    sc_siumcr;
19         uint    sc_sypcr;
20         uint    sc_swt;
21         char    res1[2];
22         ushort  sc_swsr;
23         uint    sc_sipend;
24         uint    sc_simask;
25         uint    sc_siel;
26         uint    sc_sivec;
27         uint    sc_tesr;
28         char    res2[0xc];
29         uint    sc_sdcr;
30         char    res3[0x4c];
31 } sysconf8xx_t;
32
33 /* PCMCIA configuration registers.
34 */
35 typedef struct pcmcia_conf {
36         uint    pcmc_pbr0;
37         uint    pcmc_por0;
38         uint    pcmc_pbr1;
39         uint    pcmc_por1;
40         uint    pcmc_pbr2;
41         uint    pcmc_por2;
42         uint    pcmc_pbr3;
43         uint    pcmc_por3;
44         uint    pcmc_pbr4;
45         uint    pcmc_por4;
46         uint    pcmc_pbr5;
47         uint    pcmc_por5;
48         uint    pcmc_pbr6;
49         uint    pcmc_por6;
50         uint    pcmc_pbr7;
51         uint    pcmc_por7;
52         char    res1[0x20];
53         uint    pcmc_pgcra;
54         uint    pcmc_pgcrb;
55         uint    pcmc_pscr;
56         char    res2[4];
57         uint    pcmc_pipr;
58         char    res3[4];
59         uint    pcmc_per;
60         char    res4[4];
61 } pcmconf8xx_t;
62
63 /* Memory controller registers.
64 */
65 typedef struct  mem_ctlr {
66         uint    memc_br0;
67         uint    memc_or0;
68         uint    memc_br1;
69         uint    memc_or1;
70         uint    memc_br2;
71         uint    memc_or2;
72         uint    memc_br3;
73         uint    memc_or3;
74         uint    memc_br4;
75         uint    memc_or4;
76         uint    memc_br5;
77         uint    memc_or5;
78         uint    memc_br6;
79         uint    memc_or6;
80         uint    memc_br7;
81         uint    memc_or7;
82         char    res1[0x24];
83         uint    memc_mar;
84         uint    memc_mcr;
85         char    res2[4];
86         uint    memc_mamr;
87         uint    memc_mbmr;
88         ushort  memc_mstat;
89         ushort  memc_mptpr;
90         uint    memc_mdr;
91         char    res3[0x80];
92 } memctl8xx_t;
93
94 /* System Integration Timers.
95 */
96 typedef struct  sys_int_timers {
97         ushort  sit_tbscr;
98         char    res0[0x02];
99         uint    sit_tbreff0;
100         uint    sit_tbreff1;
101         char    res1[0x14];
102         ushort  sit_rtcsc;
103         char    res2[0x02];
104         uint    sit_rtc;
105         uint    sit_rtsec;
106         uint    sit_rtcal;
107         char    res3[0x10];
108         ushort  sit_piscr;
109         char    res4[2];
110         uint    sit_pitc;
111         uint    sit_pitr;
112         char    res5[0x34];
113 } sit8xx_t;
114
115 #define TBSCR_TBIRQ_MASK        ((ushort)0xff00)
116 #define TBSCR_REFA              ((ushort)0x0080)
117 #define TBSCR_REFB              ((ushort)0x0040)
118 #define TBSCR_REFAE             ((ushort)0x0008)
119 #define TBSCR_REFBE             ((ushort)0x0004)
120 #define TBSCR_TBF               ((ushort)0x0002)
121 #define TBSCR_TBE               ((ushort)0x0001)
122
123 #define RTCSC_RTCIRQ_MASK       ((ushort)0xff00)
124 #define RTCSC_SEC               ((ushort)0x0080)
125 #define RTCSC_ALR               ((ushort)0x0040)
126 #define RTCSC_38K               ((ushort)0x0010)
127 #define RTCSC_SIE               ((ushort)0x0008)
128 #define RTCSC_ALE               ((ushort)0x0004)
129 #define RTCSC_RTF               ((ushort)0x0002)
130 #define RTCSC_RTE               ((ushort)0x0001)
131
132 #define PISCR_PIRQ_MASK         ((ushort)0xff00)
133 #define PISCR_PS                ((ushort)0x0080)
134 #define PISCR_PIE               ((ushort)0x0004)
135 #define PISCR_PTF               ((ushort)0x0002)
136 #define PISCR_PTE               ((ushort)0x0001)
137
138 /* Clocks and Reset.
139 */
140 typedef struct clk_and_reset {
141         uint    car_sccr;
142         uint    car_plprcr;
143         uint    car_rsr;
144         char    res[0x74];        /* Reserved area                  */
145 } car8xx_t;
146
147 /* System Integration Timers keys.
148 */
149 typedef struct sitk {
150         uint    sitk_tbscrk;
151         uint    sitk_tbreff0k;
152         uint    sitk_tbreff1k;
153         uint    sitk_tbk;
154         char    res1[0x10];
155         uint    sitk_rtcsck;
156         uint    sitk_rtck;
157         uint    sitk_rtseck;
158         uint    sitk_rtcalk;
159         char    res2[0x10];
160         uint    sitk_piscrk;
161         uint    sitk_pitck;
162         char    res3[0x38];
163 } sitk8xx_t;
164
165 /* Clocks and reset keys.
166 */
167 typedef struct cark {
168         uint    cark_sccrk;
169         uint    cark_plprcrk;
170         uint    cark_rsrk;
171         char    res[0x474];
172 } cark8xx_t;
173
174 /* The key to unlock registers maintained by keep-alive power.
175 */
176 #define KAPWR_KEY       ((unsigned int)0x55ccaa33)
177
178 /* I2C
179 */
180 typedef struct i2c {
181         u_char  i2c_i2mod;
182         char    res1[3];
183         u_char  i2c_i2add;
184         char    res2[3];
185         u_char  i2c_i2brg;
186         char    res3[3];
187         u_char  i2c_i2com;
188         char    res4[3];
189         u_char  i2c_i2cer;
190         char    res5[3];
191         u_char  i2c_i2cmr;
192         char    res6[0x8b];
193 } i2c8xx_t;
194
195 /* DMA control/status registers.
196 */
197 typedef struct sdma_csr {
198         char    res1[4];
199         uint    sdma_sdar;
200         u_char  sdma_sdsr;
201         char    res3[3];
202         u_char  sdma_sdmr;
203         char    res4[3];
204         u_char  sdma_idsr1;
205         char    res5[3];
206         u_char  sdma_idmr1;
207         char    res6[3];
208         u_char  sdma_idsr2;
209         char    res7[3];
210         u_char  sdma_idmr2;
211         char    res8[0x13];
212 } sdma8xx_t;
213
214 /* Communication Processor Module Interrupt Controller.
215 */
216 typedef struct cpm_ic {
217         ushort  cpic_civr;
218         char    res[0xe];
219         uint    cpic_cicr;
220         uint    cpic_cipr;
221         uint    cpic_cimr;
222         uint    cpic_cisr;
223 } cpic8xx_t;
224
225 /* Input/Output Port control/status registers.
226 */
227 typedef struct io_port {
228         ushort  iop_padir;
229         ushort  iop_papar;
230         ushort  iop_paodr;
231         ushort  iop_padat;
232         char    res1[8];
233         ushort  iop_pcdir;
234         ushort  iop_pcpar;
235         ushort  iop_pcso;
236         ushort  iop_pcdat;
237         ushort  iop_pcint;
238         char    res2[6];
239         ushort  iop_pddir;
240         ushort  iop_pdpar;
241         char    res3[2];
242         ushort  iop_pddat;
243         uint    utmode;
244         char    res4[4];
245 } iop8xx_t;
246
247 /* Communication Processor Module Timers
248 */
249 typedef struct cpm_timers {
250         ushort  cpmt_tgcr;
251         char    res1[0xe];
252         ushort  cpmt_tmr1;
253         ushort  cpmt_tmr2;
254         ushort  cpmt_trr1;
255         ushort  cpmt_trr2;
256         ushort  cpmt_tcr1;
257         ushort  cpmt_tcr2;
258         ushort  cpmt_tcn1;
259         ushort  cpmt_tcn2;
260         ushort  cpmt_tmr3;
261         ushort  cpmt_tmr4;
262         ushort  cpmt_trr3;
263         ushort  cpmt_trr4;
264         ushort  cpmt_tcr3;
265         ushort  cpmt_tcr4;
266         ushort  cpmt_tcn3;
267         ushort  cpmt_tcn4;
268         ushort  cpmt_ter1;
269         ushort  cpmt_ter2;
270         ushort  cpmt_ter3;
271         ushort  cpmt_ter4;
272         char    res2[8];
273 } cpmtimer8xx_t;
274
275 /* Finally, the Communication Processor stuff.....
276 */
277 typedef struct scc {            /* Serial communication channels */
278         uint    scc_gsmrl;
279         uint    scc_gsmrh;
280         ushort  scc_psmr;
281         char    res1[2];
282         ushort  scc_todr;
283         ushort  scc_dsr;
284         ushort  scc_scce;
285         char    res2[2];
286         ushort  scc_sccm;
287         char    res3;
288         u_char  scc_sccs;
289         char    res4[8];
290 } scc_t;
291
292 typedef struct smc {            /* Serial management channels */
293         char    res1[2];
294         ushort  smc_smcmr;
295         char    res2[2];
296         u_char  smc_smce;
297         char    res3[3];
298         u_char  smc_smcm;
299         char    res4[5];
300 } smc_t;
301
302 /* MPC860T Fast Ethernet Controller.  It isn't part of the CPM, but
303  * it fits within the address space.
304  */
305
306 typedef struct fec {
307         uint    fec_addr_low;           /* lower 32 bits of station address     */
308         ushort  fec_addr_high;          /* upper 16 bits of station address     */
309         ushort  res1;                   /* reserved                             */
310         uint    fec_hash_table_high;    /* upper 32-bits of hash table          */
311         uint    fec_hash_table_low;     /* lower 32-bits of hash table          */
312         uint    fec_r_des_start;        /* beginning of Rx descriptor ring      */
313         uint    fec_x_des_start;        /* beginning of Tx descriptor ring      */
314         uint    fec_r_buff_size;        /* Rx buffer size                       */
315         uint    res2[9];                /* reserved                             */
316         uint    fec_ecntrl;             /* ethernet control register            */
317         uint    fec_ievent;             /* interrupt event register             */
318         uint    fec_imask;              /* interrupt mask register              */
319         uint    fec_ivec;               /* interrupt level and vector status    */
320         uint    fec_r_des_active;       /* Rx ring updated flag                 */
321         uint    fec_x_des_active;       /* Tx ring updated flag                 */
322         uint    res3[10];               /* reserved                             */
323         uint    fec_mii_data;           /* MII data register                    */
324         uint    fec_mii_speed;          /* MII speed control register           */
325         uint    res4[17];               /* reserved                             */
326         uint    fec_r_bound;            /* end of RAM (read-only)               */
327         uint    fec_r_fstart;           /* Rx FIFO start address                */
328         uint    res5[6];                /* reserved                             */
329         uint    fec_x_fstart;           /* Tx FIFO start address                */
330         uint    res6[17];               /* reserved                             */
331         uint    fec_fun_code;           /* fec SDMA function code               */
332         uint    res7[3];                /* reserved                             */
333         uint    fec_r_cntrl;            /* Rx control register                  */
334         uint    fec_r_hash;             /* Rx hash register                     */
335         uint    res8[14];               /* reserved                             */
336         uint    fec_x_cntrl;            /* Tx control register                  */
337         uint    res9[0x1e];             /* reserved                             */
338 } fec_t;
339
340 typedef struct comm_proc {
341         /* General control and status registers.
342         */
343         ushort  cp_cpcr;
344         u_char  res1[2];
345         ushort  cp_rccr;
346         u_char  res2;
347         u_char  cp_rmds;
348         u_char  res3[4];
349         ushort  cp_cpmcr1;
350         ushort  cp_cpmcr2;
351         ushort  cp_cpmcr3;
352         ushort  cp_cpmcr4;
353         u_char  res4[2];
354         ushort  cp_rter;
355         u_char  res5[2];
356         ushort  cp_rtmr;
357         u_char  res6[0x14];
358
359         /* Baud rate generators.
360         */
361         uint    cp_brgc1;
362         uint    cp_brgc2;
363         uint    cp_brgc3;
364         uint    cp_brgc4;
365
366         /* Serial Communication Channels.
367         */
368         scc_t   cp_scc[4];
369
370         /* Serial Management Channels.
371         */
372         smc_t   cp_smc[2];
373
374         /* Serial Peripheral Interface.
375         */
376         ushort  cp_spmode;
377         u_char  res7[4];
378         u_char  cp_spie;
379         u_char  res8[3];
380         u_char  cp_spim;
381         u_char  res9[2];
382         u_char  cp_spcom;
383         u_char  res10[2];
384
385         /* Parallel Interface Port.
386         */
387         u_char  res11[2];
388         ushort  cp_pipc;
389         u_char  res12[2];
390         ushort  cp_ptpr;
391         uint    cp_pbdir;
392         uint    cp_pbpar;
393         u_char  res13[2];
394         ushort  cp_pbodr;
395         uint    cp_pbdat;
396
397         /* Port E - MPC87x/88x only.
398          */
399         uint    cp_pedir;
400         uint    cp_pepar;
401         uint    cp_peso;
402         uint    cp_peodr;
403         uint    cp_pedat;
404
405         /* Communications Processor Timing Register -
406            Contains RMII Timing for the FECs on MPC87x/88x only.
407         */
408         uint    cp_cptr;
409
410         /* Serial Interface and Time Slot Assignment.
411         */
412         uint    cp_simode;
413         u_char  cp_sigmr;
414         u_char  res15;
415         u_char  cp_sistr;
416         u_char  cp_sicmr;
417         u_char  res16[4];
418         uint    cp_sicr;
419         uint    cp_sirp;
420         u_char  res17[0xc];
421
422         u_char  res19[0x100];
423         u_char  cp_siram[0x200];
424
425         /* The fast ethernet controller is not really part of the CPM,
426          * but it resides in the address space.
427          */
428         fec_t   cp_fec;
429         char    res18[0xE00];
430
431         /* The MPC885 family has a second FEC here */
432         fec_t   cp_fec2;
433 #define cp_fec1 cp_fec  /* consistency macro */
434
435         /* Dual Ported RAM follows.
436          * There are many different formats for this memory area
437          * depending upon the devices used and options chosen.
438          * Some processors don't have all of it populated.
439          */
440         u_char  cp_dpmem[0x1C00];       /* BD / Data / ucode */
441
442         /* Parameter RAM */
443         union {
444                 u_char  cp_dparam[0x400];
445                 u16     cp_dparam16[0x200];
446         };
447 } cpm8xx_t;
448
449 /* Internal memory map.
450 */
451 typedef struct immap {
452         sysconf8xx_t    im_siu_conf;    /* SIU Configuration */
453         pcmconf8xx_t    im_pcmcia;      /* PCMCIA Configuration */
454         memctl8xx_t     im_memctl;      /* Memory Controller */
455         sit8xx_t        im_sit;         /* System integration timers */
456         car8xx_t        im_clkrst;      /* Clocks and reset */
457         sitk8xx_t       im_sitk;        /* Sys int timer keys */
458         cark8xx_t       im_clkrstk;     /* Clocks and reset keys */
459         char            res[96];
460         i2c8xx_t        im_i2c;         /* I2C control/status */
461         sdma8xx_t       im_sdma;        /* SDMA control/status */
462         cpic8xx_t       im_cpic;        /* CPM Interrupt Controller */
463         iop8xx_t        im_ioport;      /* IO Port control/status */
464         cpmtimer8xx_t   im_cpmtimer;    /* CPM timers */
465         cpm8xx_t        im_cpm;         /* Communication processor */
466 } immap_t;
467
468 #endif /* __IMMAP_8XX__ */