root/arch/powerpc/include/asm/immap_cpm2.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * CPM2 Internal Memory Map
 * Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
 *
 * The Internal Memory Map for devices with CPM2 on them.  This
 * is the superset of all CPM2 devices (8260, 8266, 8280, 8272,
 * 8560).
 */
#ifdef __KERNEL__
#ifndef __IMMAP_CPM2__
#define __IMMAP_CPM2__

#include <linux/types.h>

/* System configuration registers.
*/
typedef struct sys_82xx_conf {
        u32     sc_siumcr;
        u32     sc_sypcr;
        u8      res1[6];
        u16     sc_swsr;
        u8      res2[20];
        u32     sc_bcr;
        u8      sc_ppc_acr;
        u8      res3[3];
        u32     sc_ppc_alrh;
        u32     sc_ppc_alrl;
        u8      sc_lcl_acr;
        u8      res4[3];
        u32     sc_lcl_alrh;
        u32     sc_lcl_alrl;
        u32     sc_tescr1;
        u32     sc_tescr2;
        u32     sc_ltescr1;
        u32     sc_ltescr2;
        u32     sc_pdtea;
        u8      sc_pdtem;
        u8      res5[3];
        u32     sc_ldtea;
        u8      sc_ldtem;
        u8      res6[163];
} sysconf_82xx_cpm2_t;

typedef struct sys_85xx_conf {
        u32     sc_cear;
        u16     sc_ceer;
        u16     sc_cemr;
        u8      res1[70];
        u32     sc_smaer;
        u8      res2[4];
        u32     sc_smevr;
        u32     sc_smctr;
        u32     sc_lmaer;
        u8      res3[4];
        u32     sc_lmevr;
        u32     sc_lmctr;
        u8      res4[144];
} sysconf_85xx_cpm2_t;

typedef union sys_conf {
        sysconf_82xx_cpm2_t     siu_82xx;
        sysconf_85xx_cpm2_t     siu_85xx;
} sysconf_cpm2_t;



/* Memory controller registers.
*/
typedef struct  mem_ctlr {
        u32     memc_br0;
        u32     memc_or0;
        u32     memc_br1;
        u32     memc_or1;
        u32     memc_br2;
        u32     memc_or2;
        u32     memc_br3;
        u32     memc_or3;
        u32     memc_br4;
        u32     memc_or4;
        u32     memc_br5;
        u32     memc_or5;
        u32     memc_br6;
        u32     memc_or6;
        u32     memc_br7;
        u32     memc_or7;
        u32     memc_br8;
        u32     memc_or8;
        u32     memc_br9;
        u32     memc_or9;
        u32     memc_br10;
        u32     memc_or10;
        u32     memc_br11;
        u32     memc_or11;
        u8      res1[8];
        u32     memc_mar;
        u8      res2[4];
        u32     memc_mamr;
        u32     memc_mbmr;
        u32     memc_mcmr;
        u8      res3[8];
        u16     memc_mptpr;
        u8      res4[2];
        u32     memc_mdr;
        u8      res5[4];
        u32     memc_psdmr;
        u32     memc_lsdmr;
        u8      memc_purt;
        u8      res6[3];
        u8      memc_psrt;
        u8      res7[3];
        u8      memc_lurt;
        u8      res8[3];
        u8      memc_lsrt;
        u8      res9[3];
        u32     memc_immr;
        u32     memc_pcibr0;
        u32     memc_pcibr1;
        u8      res10[16];
        u32     memc_pcimsk0;
        u32     memc_pcimsk1;
        u8      res11[52];
} memctl_cpm2_t;

/* System Integration Timers.
*/
typedef struct  sys_int_timers {
        u8      res1[32];
        u16     sit_tmcntsc;
        u8      res2[2];
        u32     sit_tmcnt;
        u8      res3[4];
        u32     sit_tmcntal;
        u8      res4[16];
        u16     sit_piscr;
        u8      res5[2];
        u32     sit_pitc;
        u32     sit_pitr;
        u8      res6[94];
        u8      res7[390];
} sit_cpm2_t;

#define PISCR_PIRQ_MASK         ((u16)0xff00)
#define PISCR_PS                ((u16)0x0080)
#define PISCR_PIE               ((u16)0x0004)
#define PISCR_PTF               ((u16)0x0002)
#define PISCR_PTE               ((u16)0x0001)

/* PCI Controller.
*/
typedef struct pci_ctlr {
        u32     pci_omisr;
        u32     pci_omimr;
        u8      res1[8];
        u32     pci_ifqpr;
        u32     pci_ofqpr;
        u8      res2[8];
        u32     pci_imr0;
        u32     pci_imr1;
        u32     pci_omr0;
        u32     pci_omr1;
        u32     pci_odr;
        u8      res3[4];
        u32     pci_idr;
        u8      res4[20];
        u32     pci_imisr;
        u32     pci_imimr;
        u8      res5[24];
        u32     pci_ifhpr;
        u8      res6[4];
        u32     pci_iftpr;
        u8      res7[4];
        u32     pci_iphpr;
        u8      res8[4];
        u32     pci_iptpr;
        u8      res9[4];
        u32     pci_ofhpr;
        u8      res10[4];
        u32     pci_oftpr;
        u8      res11[4];
        u32     pci_ophpr;
        u8      res12[4];
        u32     pci_optpr;
        u8      res13[8];
        u32     pci_mucr;
        u8      res14[8];
        u32     pci_qbar;
        u8      res15[12];
        u32     pci_dmamr0;
        u32     pci_dmasr0;
        u32     pci_dmacdar0;
        u8      res16[4];
        u32     pci_dmasar0;
        u8      res17[4];
        u32     pci_dmadar0;
        u8      res18[4];
        u32     pci_dmabcr0;
        u32     pci_dmandar0;
        u8      res19[86];
        u32     pci_dmamr1;
        u32     pci_dmasr1;
        u32     pci_dmacdar1;
        u8      res20[4];
        u32     pci_dmasar1;
        u8      res21[4];
        u32     pci_dmadar1;
        u8      res22[4];
        u32     pci_dmabcr1;
        u32     pci_dmandar1;
        u8      res23[88];
        u32     pci_dmamr2;
        u32     pci_dmasr2;
        u32     pci_dmacdar2;
        u8      res24[4];
        u32     pci_dmasar2;
        u8      res25[4];
        u32     pci_dmadar2;
        u8      res26[4];
        u32     pci_dmabcr2;
        u32     pci_dmandar2;
        u8      res27[88];
        u32     pci_dmamr3;
        u32     pci_dmasr3;
        u32     pci_dmacdar3;
        u8      res28[4];
        u32     pci_dmasar3;
        u8      res29[4];
        u32     pci_dmadar3;
        u8      res30[4];
        u32     pci_dmabcr3;
        u32     pci_dmandar3;
        u8      res31[344];
        u32     pci_potar0;
        u8      res32[4];
        u32     pci_pobar0;
        u8      res33[4];
        u32     pci_pocmr0;
        u8      res34[4];
        u32     pci_potar1;
        u8      res35[4];
        u32     pci_pobar1;
        u8      res36[4];
        u32     pci_pocmr1;
        u8      res37[4];
        u32     pci_potar2;
        u8      res38[4];
        u32     pci_pobar2;
        u8      res39[4];
        u32     pci_pocmr2;
        u8      res40[50];
        u32     pci_ptcr;
        u32     pci_gpcr;
        u32     pci_gcr;
        u32     pci_esr;
        u32     pci_emr;
        u32     pci_ecr;
        u32     pci_eacr;
        u8      res41[4];
        u32     pci_edcr;
        u8      res42[4];
        u32     pci_eccr;
        u8      res43[44];
        u32     pci_pitar1;
        u8      res44[4];
        u32     pci_pibar1;
        u8      res45[4];
        u32     pci_picmr1;
        u8      res46[4];
        u32     pci_pitar0;
        u8      res47[4];
        u32     pci_pibar0;
        u8      res48[4];
        u32     pci_picmr0;
        u8      res49[4];
        u32     pci_cfg_addr;
        u32     pci_cfg_data;
        u32     pci_int_ack;
        u8      res50[756];
} pci_cpm2_t;

/* Interrupt Controller.
*/
typedef struct interrupt_controller {
        u16     ic_sicr;
        u8      res1[2];
        u32     ic_sivec;
        u32     ic_sipnrh;
        u32     ic_sipnrl;
        u32     ic_siprr;
        u32     ic_scprrh;
        u32     ic_scprrl;
        u32     ic_simrh;
        u32     ic_simrl;
        u32     ic_siexr;
        u8      res2[88];
} intctl_cpm2_t;

/* Clocks and Reset.
*/
typedef struct clk_and_reset {
        u32     car_sccr;
        u8      res1[4];
        u32     car_scmr;
        u8      res2[4];
        u32     car_rsr;
        u32     car_rmr;
        u8      res[104];
} car_cpm2_t;

/* Input/Output Port control/status registers.
 * Names consistent with processor manual, although they are different
 * from the original 8xx names.......
 */
typedef struct io_port {
        u32     iop_pdira;
        u32     iop_ppara;
        u32     iop_psora;
        u32     iop_podra;
        u32     iop_pdata;
        u8      res1[12];
        u32     iop_pdirb;
        u32     iop_pparb;
        u32     iop_psorb;
        u32     iop_podrb;
        u32     iop_pdatb;
        u8      res2[12];
        u32     iop_pdirc;
        u32     iop_pparc;
        u32     iop_psorc;
        u32     iop_podrc;
        u32     iop_pdatc;
        u8      res3[12];
        u32     iop_pdird;
        u32     iop_ppard;
        u32     iop_psord;
        u32     iop_podrd;
        u32     iop_pdatd;
        u8      res4[12];
} iop_cpm2_t;

/* Communication Processor Module Timers
*/
typedef struct cpm_timers {
        u8      cpmt_tgcr1;
        u8      res1[3];
        u8      cpmt_tgcr2;
        u8      res2[11];
        u16     cpmt_tmr1;
        u16     cpmt_tmr2;
        u16     cpmt_trr1;
        u16     cpmt_trr2;
        u16     cpmt_tcr1;
        u16     cpmt_tcr2;
        u16     cpmt_tcn1;
        u16     cpmt_tcn2;
        u16     cpmt_tmr3;
        u16     cpmt_tmr4;
        u16     cpmt_trr3;
        u16     cpmt_trr4;
        u16     cpmt_tcr3;
        u16     cpmt_tcr4;
        u16     cpmt_tcn3;
        u16     cpmt_tcn4;
        u16     cpmt_ter1;
        u16     cpmt_ter2;
        u16     cpmt_ter3;
        u16     cpmt_ter4;
        u8      res3[584];
} cpmtimer_cpm2_t;

/* DMA control/status registers.
*/
typedef struct sdma_csr {
        u8      res0[24];
        u8      sdma_sdsr;
        u8      res1[3];
        u8      sdma_sdmr;
        u8      res2[3];
        u8      sdma_idsr1;
        u8      res3[3];
        u8      sdma_idmr1;
        u8      res4[3];
        u8      sdma_idsr2;
        u8      res5[3];
        u8      sdma_idmr2;
        u8      res6[3];
        u8      sdma_idsr3;
        u8      res7[3];
        u8      sdma_idmr3;
        u8      res8[3];
        u8      sdma_idsr4;
        u8      res9[3];
        u8      sdma_idmr4;
        u8      res10[707];
} sdma_cpm2_t;

/* Fast controllers
*/
typedef struct fcc {
        u32     fcc_gfmr;
        u32     fcc_fpsmr;
        u16     fcc_ftodr;
        u8      res1[2];
        u16     fcc_fdsr;
        u8      res2[2];
        u16     fcc_fcce;
        u8      res3[2];
        u16     fcc_fccm;
        u8      res4[2];
        u8      fcc_fccs;
        u8      res5[3];
        u8      fcc_ftirr_phy[4];
} fcc_t;

/* Fast controllers continued
 */
typedef struct fcc_c {
        u32     fcc_firper;
        u32     fcc_firer;
        u32     fcc_firsr_hi;
        u32     fcc_firsr_lo;
        u8      fcc_gfemr;
        u8      res1[15];
} fcc_c_t;

/* TC Layer
 */
typedef struct tclayer {
        u16     tc_tcmode;
        u16     tc_cdsmr;
        u16     tc_tcer;
        u16     tc_rcc;
        u16     tc_tcmr;
        u16     tc_fcc;
        u16     tc_ccc;
        u16     tc_icc;
        u16     tc_tcc;
        u16     tc_ecc;
        u8      res1[12];
} tclayer_t;


/* I2C
*/
typedef struct i2c {
        u8      i2c_i2mod;
        u8      res1[3];
        u8      i2c_i2add;
        u8      res2[3];
        u8      i2c_i2brg;
        u8      res3[3];
        u8      i2c_i2com;
        u8      res4[3];
        u8      i2c_i2cer;
        u8      res5[3];
        u8      i2c_i2cmr;
        u8      res6[331];
} i2c_cpm2_t;

typedef struct scc {            /* Serial communication channels */
        u32     scc_gsmrl;
        u32     scc_gsmrh;
        u16     scc_psmr;
        u8      res1[2];
        u16     scc_todr;
        u16     scc_dsr;
        u16     scc_scce;
        u8      res2[2];
        u16     scc_sccm;
        u8      res3;
        u8      scc_sccs;
        u8      res4[8];
} scc_t;

typedef struct smc {            /* Serial management channels */
        u8      res1[2];
        u16     smc_smcmr;
        u8      res2[2];
        u8      smc_smce;
        u8      res3[3];
        u8      smc_smcm;
        u8      res4[5];
} smc_t;

/* Serial Peripheral Interface.
*/
typedef struct spi_ctrl {
        u16     spi_spmode;
        u8      res1[4];
        u8      spi_spie;
        u8      res2[3];
        u8      spi_spim;
        u8      res3[2];
        u8      spi_spcom;
        u8      res4[82];
} spictl_cpm2_t;

/* CPM Mux.
*/
typedef struct cpmux {
        u8      cmx_si1cr;
        u8      res1;
        u8      cmx_si2cr;
        u8      res2;
        u32     cmx_fcr;
        u32     cmx_scr;
        u8      cmx_smr;
        u8      res3;
        u16     cmx_uar;
        u8      res4[16];
} cpmux_t;

/* SIRAM control
*/
typedef struct siram {
        u16     si_amr;
        u16     si_bmr;
        u16     si_cmr;
        u16     si_dmr;
        u8      si_gmr;
        u8      res1;
        u8      si_cmdr;
        u8      res2;
        u8      si_str;
        u8      res3;
        u16     si_rsr;
} siramctl_t;

typedef struct mcc {
        u16     mcc_mcce;
        u8      res1[2];
        u16     mcc_mccm;
        u8      res2[2];
        u8      mcc_mccf;
        u8      res3[7];
} mcc_t;

typedef struct comm_proc {
        u32     cp_cpcr;
        u32     cp_rccr;
        u8      res1[14];
        u16     cp_rter;
        u8      res2[2];
        u16     cp_rtmr;
        u16     cp_rtscr;
        u8      res3[2];
        u32     cp_rtsr;
        u8      res4[12];
} cpm_cpm2_t;

/* USB Controller.
*/
typedef struct cpm_usb_ctlr {
        u8      usb_usmod;
        u8      usb_usadr;
        u8      usb_uscom;
        u8      res1[1];
        __be16  usb_usep[4];
        u8      res2[4];
        __be16  usb_usber;
        u8      res3[2];
        __be16  usb_usbmr;
        u8      usb_usbs;
        u8      res4[7];
} usb_cpm2_t;

/* ...and the whole thing wrapped up....
*/

typedef struct immap {
        /* Some references are into the unique and known dpram spaces,
         * others are from the generic base.
         */
#define im_dprambase    im_dpram1
        u8              im_dpram1[16*1024];
        u8              res1[16*1024];
        u8              im_dpram2[4*1024];
        u8              res2[8*1024];
        u8              im_dpram3[4*1024];
        u8              res3[16*1024];

        sysconf_cpm2_t  im_siu_conf;    /* SIU Configuration */
        memctl_cpm2_t   im_memctl;      /* Memory Controller */
        sit_cpm2_t      im_sit;         /* System Integration Timers */
        pci_cpm2_t      im_pci;         /* PCI Controller */
        intctl_cpm2_t   im_intctl;      /* Interrupt Controller */
        car_cpm2_t      im_clkrst;      /* Clocks and reset */
        iop_cpm2_t      im_ioport;      /* IO Port control/status */
        cpmtimer_cpm2_t im_cpmtimer;    /* CPM timers */
        sdma_cpm2_t     im_sdma;        /* SDMA control/status */

        fcc_t           im_fcc[3];      /* Three FCCs */
        u8              res4z[32];
        fcc_c_t         im_fcc_c[3];    /* Continued FCCs */

        u8              res4[32];

        tclayer_t       im_tclayer[8];  /* Eight TCLayers */
        u16             tc_tcgsr;
        u16             tc_tcger;

        /* First set of baud rate generators.
        */
        u8              res[236];
        u32             im_brgc5;
        u32             im_brgc6;
        u32             im_brgc7;
        u32             im_brgc8;

        u8              res5[608];

        i2c_cpm2_t      im_i2c;         /* I2C control/status */
        cpm_cpm2_t      im_cpm;         /* Communication processor */

        /* Second set of baud rate generators.
        */
        u32             im_brgc1;
        u32             im_brgc2;
        u32             im_brgc3;
        u32             im_brgc4;

        scc_t           im_scc[4];      /* Four SCCs */
        smc_t           im_smc[2];      /* Couple of SMCs */
        spictl_cpm2_t   im_spi;         /* A SPI */
        cpmux_t         im_cpmux;       /* CPM clock route mux */
        siramctl_t      im_siramctl1;   /* First SI RAM Control */
        mcc_t           im_mcc1;        /* First MCC */
        siramctl_t      im_siramctl2;   /* Second SI RAM Control */
        mcc_t           im_mcc2;        /* Second MCC */
        usb_cpm2_t      im_usb;         /* USB Controller */

        u8              res6[1153];

        u16             im_si1txram[256];
        u8              res7[512];
        u16             im_si1rxram[256];
        u8              res8[512];
        u16             im_si2txram[256];
        u8              res9[512];
        u16             im_si2rxram[256];
        u8              res10[512];
        u8              res11[4096];
} cpm2_map_t;

extern cpm2_map_t __iomem *cpm2_immr;

#endif /* __IMMAP_CPM2__ */
#endif /* __KERNEL__ */