[MIPS] TXx9: Reorganize PCI code
[linux-2.6.git] / include / asm-mips / txx9 / tx4927.h
index f21a7b1..c0382fd 100644 (file)
 #ifndef __ASM_TXX9_TX4927_H
 #define __ASM_TXX9_TX4927_H
 
+#include <linux/types.h>
+#include <linux/io.h>
 #include <asm/txx9irq.h>
+#include <asm/txx9/tx4927pcic.h>
 
 #define TX4927_IRQ_CP0_BEG  MIPS_CPU_IRQ_BASE
 #define TX4927_IRQ_CP0_END  (MIPS_CPU_IRQ_BASE + 8 - 1)
 
 #define TX4927_IRQ_NEST_EXT_ON_PIC  (TX4927_IRQ_PIC_BEG+3)
 
-#define TX4927_CCFG_TOE 0x00004000
-#define TX4927_CCFG_WR 0x00008000
-#define TX4927_CCFG_TINTDIS    0x01000000
-
-#define TX4927_PCIMEM     0x08000000
-#define TX4927_PCIMEM_SIZE 0x08000000
-#define TX4927_PCIIO      0x16000000
-#define TX4927_PCIIO_SIZE  0x01000000
-
 #define TX4927_SDRAMC_REG      0xff1f8000
 #define TX4927_EBUSC_REG       0xff1f9000
 #define TX4927_PCIC_REG                0xff1fd000
 #define TX4927_NR_TMR  3
 #define TX4927_TMR_REG(ch)     (0xff1ff000 + (ch) * 0x100)
 
-/* bits for ISTAT3/IMASK3/IMSTAT3 */
-#define TX4927_INT3B_PCID      0
-#define TX4927_INT3B_PCIC      1
-#define TX4927_INT3B_PCIB      2
-#define TX4927_INT3B_PCIA      3
-#define TX4927_INT3F_PCID      (1 << TX4927_INT3B_PCID)
-#define TX4927_INT3F_PCIC      (1 << TX4927_INT3B_PCIC)
-#define TX4927_INT3F_PCIB      (1 << TX4927_INT3B_PCIB)
-#define TX4927_INT3F_PCIA      (1 << TX4927_INT3B_PCIA)
-
-#define TX4927_NR_IRQ_LOCAL    TX4927_IRQ_PIC_BEG
-#define TX4927_NR_IRQ_IRC      32      /* On-Chip IRC */
-
 #define TX4927_IR_PCIC         16
 #define TX4927_IR_PCIERR       22
-#define TX4927_IR_PCIPMA       23
-#define TX4927_IRQ_IRC_PCIC    (TX4927_NR_IRQ_LOCAL + TX4927_IR_PCIC)
-#define TX4927_IRQ_IRC_PCIERR  (TX4927_NR_IRQ_LOCAL + TX4927_IR_PCIERR)
-#define TX4927_IRQ_IOC1                (TX4927_NR_IRQ_LOCAL + TX4927_NR_IRQ_IRC)
-#define TX4927_IRQ_IOC_PCID    (TX4927_IRQ_IOC1 + TX4927_INT3B_PCID)
-#define TX4927_IRQ_IOC_PCIC    (TX4927_IRQ_IOC1 + TX4927_INT3B_PCIC)
-#define TX4927_IRQ_IOC_PCIB    (TX4927_IRQ_IOC1 + TX4927_INT3B_PCIB)
-#define TX4927_IRQ_IOC_PCIA    (TX4927_IRQ_IOC1 + TX4927_INT3B_PCIA)
-
-#ifdef _LANGUAGE_ASSEMBLY
-#define _CONST64(c)    c
-#else
-#define _CONST64(c)    c##ull
-
-#include <asm/byteorder.h>
+#define TX4927_NUM_IR  32
 
 struct tx4927_sdramc_reg {
        volatile unsigned long long cr[4];
@@ -104,177 +71,158 @@ struct tx4927_ebusc_reg {
 };
 
 struct tx4927_ccfg_reg {
-       volatile unsigned long long ccfg;
-       volatile unsigned long long crir;
-       volatile unsigned long long pcfg;
-       volatile unsigned long long tear;
-       volatile unsigned long long clkctr;
-       volatile unsigned long long unused0;
-       volatile unsigned long long garbc;
-       volatile unsigned long long unused1;
-       volatile unsigned long long unused2;
-       volatile unsigned long long ramp;
-};
-
-struct tx4927_pcic_reg {
-       volatile unsigned long pciid;
-       volatile unsigned long pcistatus;
-       volatile unsigned long pciccrev;
-       volatile unsigned long pcicfg1;
-       volatile unsigned long p2gm0plbase;             /* +10 */
-       volatile unsigned long p2gm0pubase;
-       volatile unsigned long p2gm1plbase;
-       volatile unsigned long p2gm1pubase;
-       volatile unsigned long p2gm2pbase;              /* +20 */
-       volatile unsigned long p2giopbase;
-       volatile unsigned long unused0;
-       volatile unsigned long pcisid;
-       volatile unsigned long unused1;         /* +30 */
-       volatile unsigned long pcicapptr;
-       volatile unsigned long unused2;
-       volatile unsigned long pcicfg2;
-       volatile unsigned long g2ptocnt;                /* +40 */
-       volatile unsigned long unused3[15];
-       volatile unsigned long g2pstatus;               /* +80 */
-       volatile unsigned long g2pmask;
-       volatile unsigned long pcisstatus;
-       volatile unsigned long pcimask;
-       volatile unsigned long p2gcfg;          /* +90 */
-       volatile unsigned long p2gstatus;
-       volatile unsigned long p2gmask;
-       volatile unsigned long p2gccmd;
-       volatile unsigned long unused4[24];             /* +a0 */
-       volatile unsigned long pbareqport;              /* +100 */
-       volatile unsigned long pbacfg;
-       volatile unsigned long pbastatus;
-       volatile unsigned long pbamask;
-       volatile unsigned long pbabm;           /* +110 */
-       volatile unsigned long pbacreq;
-       volatile unsigned long pbacgnt;
-       volatile unsigned long pbacstate;
-       volatile unsigned long long g2pmgbase[3];               /* +120 */
-       volatile unsigned long long g2piogbase;
-       volatile unsigned long g2pmmask[3];             /* +140 */
-       volatile unsigned long g2piomask;
-       volatile unsigned long long g2pmpbase[3];               /* +150 */
-       volatile unsigned long long g2piopbase;
-       volatile unsigned long pciccfg;         /* +170 */
-       volatile unsigned long pcicstatus;
-       volatile unsigned long pcicmask;
-       volatile unsigned long unused5;
-       volatile unsigned long long p2gmgbase[3];               /* +180 */
-       volatile unsigned long long p2giogbase;
-       volatile unsigned long g2pcfgadrs;              /* +1a0 */
-       volatile unsigned long g2pcfgdata;
-       volatile unsigned long unused6[8];
-       volatile unsigned long g2pintack;
-       volatile unsigned long g2pspc;
-       volatile unsigned long unused7[12];             /* +1d0 */
-       volatile unsigned long long pdmca;              /* +200 */
-       volatile unsigned long long pdmga;
-       volatile unsigned long long pdmpa;
-       volatile unsigned long long pdmcut;
-       volatile unsigned long long pdmcnt;             /* +220 */
-       volatile unsigned long long pdmsts;
-       volatile unsigned long long unused8[2];
-       volatile unsigned long long pdmdb[4];           /* +240 */
-       volatile unsigned long long pdmtdh;             /* +260 */
-       volatile unsigned long long pdmdms;
+       u64 ccfg;
+       u64 crir;
+       u64 pcfg;
+       u64 toea;
+       u64 clkctr;
+       u64 unused0;
+       u64 garbc;
+       u64 unused1;
+       u64 unused2;
+       u64 ramp;
 };
 
-#endif /* _LANGUAGE_ASSEMBLY */
-
-/*
- * PCIC
- */
-
-/* bits for G2PSTATUS/G2PMASK */
-#define TX4927_PCIC_G2PSTATUS_ALL      0x00000003
-#define TX4927_PCIC_G2PSTATUS_TTOE     0x00000002
-#define TX4927_PCIC_G2PSTATUS_RTOE     0x00000001
-
-/* bits for PCIMASK (see also PCI_STATUS_XXX in linux/pci.h */
-#define TX4927_PCIC_PCISTATUS_ALL      0x0000f900
-
-/* bits for PBACFG */
-#define TX4927_PCIC_PBACFG_RPBA 0x00000004
-#define TX4927_PCIC_PBACFG_PBAEN       0x00000002
-#define TX4927_PCIC_PBACFG_BMCEN       0x00000001
-
-/* bits for G2PMnGBASE */
-#define TX4927_PCIC_G2PMnGBASE_BSDIS   _CONST64(0x0000002000000000)
-#define TX4927_PCIC_G2PMnGBASE_ECHG    _CONST64(0x0000001000000000)
-
-/* bits for G2PIOGBASE */
-#define TX4927_PCIC_G2PIOGBASE_BSDIS   _CONST64(0x0000002000000000)
-#define TX4927_PCIC_G2PIOGBASE_ECHG    _CONST64(0x0000001000000000)
-
-/* bits for PCICSTATUS/PCICMASK */
-#define TX4927_PCIC_PCICSTATUS_ALL     0x000007dc
-
-/* bits for PCICCFG */
-#define TX4927_PCIC_PCICCFG_LBWC_MASK  0x0fff0000
-#define TX4927_PCIC_PCICCFG_HRST       0x00000800
-#define TX4927_PCIC_PCICCFG_SRST       0x00000400
-#define TX4927_PCIC_PCICCFG_IRBER      0x00000200
-#define TX4927_PCIC_PCICCFG_IMSE0      0x00000100
-#define TX4927_PCIC_PCICCFG_IMSE1      0x00000080
-#define TX4927_PCIC_PCICCFG_IMSE2      0x00000040
-#define TX4927_PCIC_PCICCFG_IISE       0x00000020
-#define TX4927_PCIC_PCICCFG_ATR 0x00000010
-#define TX4927_PCIC_PCICCFG_ICAE       0x00000008
-
-/* bits for P2GMnGBASE */
-#define TX4927_PCIC_P2GMnGBASE_TMEMEN  _CONST64(0x0000004000000000)
-#define TX4927_PCIC_P2GMnGBASE_TBSDIS  _CONST64(0x0000002000000000)
-#define TX4927_PCIC_P2GMnGBASE_TECHG   _CONST64(0x0000001000000000)
-
-/* bits for P2GIOGBASE */
-#define TX4927_PCIC_P2GIOGBASE_TIOEN   _CONST64(0x0000004000000000)
-#define TX4927_PCIC_P2GIOGBASE_TBSDIS  _CONST64(0x0000002000000000)
-#define TX4927_PCIC_P2GIOGBASE_TECHG   _CONST64(0x0000001000000000)
-
-#define TX4927_PCIC_IDSEL_AD_TO_SLOT(ad)       ((ad) - 11)
-#define TX4927_PCIC_MAX_DEVNU  TX4927_PCIC_IDSEL_AD_TO_SLOT(32)
-
 /*
  * CCFG
  */
 /* CCFG : Chip Configuration */
+#define TX4927_CCFG_WDRST      0x0000020000000000ULL
+#define TX4927_CCFG_WDREXEN    0x0000010000000000ULL
+#define TX4927_CCFG_BCFG_MASK  0x000000ff00000000ULL
+#define TX4927_CCFG_TINTDIS    0x01000000
 #define TX4927_CCFG_PCI66      0x00800000
-#define TX4927_CCFG_PCIMIDE    0x00400000
-#define TX4927_CCFG_PCIXARB    0x00002000
+#define TX4927_CCFG_PCIMODE    0x00400000
+#define TX4927_CCFG_DIVMODE_MASK       0x000e0000
+#define TX4927_CCFG_DIVMODE_8  (0x0 << 17)
+#define TX4927_CCFG_DIVMODE_12 (0x1 << 17)
+#define TX4927_CCFG_DIVMODE_16 (0x2 << 17)
+#define TX4927_CCFG_DIVMODE_10 (0x3 << 17)
+#define TX4927_CCFG_DIVMODE_2  (0x4 << 17)
+#define TX4927_CCFG_DIVMODE_3  (0x5 << 17)
+#define TX4927_CCFG_DIVMODE_4  (0x6 << 17)
+#define TX4927_CCFG_DIVMODE_2_5        (0x7 << 17)
+#define TX4927_CCFG_BEOW       0x00010000
+#define TX4927_CCFG_WR 0x00008000
+#define TX4927_CCFG_TOE        0x00004000
+#define TX4927_CCFG_PCIARB     0x00002000
 #define TX4927_CCFG_PCIDIVMODE_MASK    0x00001800
 #define TX4927_CCFG_PCIDIVMODE_2_5     0x00000000
 #define TX4927_CCFG_PCIDIVMODE_3       0x00000800
 #define TX4927_CCFG_PCIDIVMODE_5       0x00001000
 #define TX4927_CCFG_PCIDIVMODE_6       0x00001800
-
-#define TX4937_CCFG_PCIDIVMODE_MASK    0x00001c00
-#define TX4937_CCFG_PCIDIVMODE_8       0x00000000
-#define TX4937_CCFG_PCIDIVMODE_4       0x00000400
-#define TX4937_CCFG_PCIDIVMODE_9       0x00000800
-#define TX4937_CCFG_PCIDIVMODE_4_5     0x00000c00
-#define TX4937_CCFG_PCIDIVMODE_10      0x00001000
-#define TX4937_CCFG_PCIDIVMODE_5       0x00001400
-#define TX4937_CCFG_PCIDIVMODE_11      0x00001800
-#define TX4937_CCFG_PCIDIVMODE_5_5     0x00001c00
+#define TX4927_CCFG_SYSSP_MASK 0x000000c0
+#define TX4927_CCFG_ENDIAN     0x00000004
+#define TX4927_CCFG_HALT       0x00000002
+#define TX4927_CCFG_ACEHOLD    0x00000001
+#define TX4927_CCFG_W1CBITS    (TX4927_CCFG_WDRST | TX4927_CCFG_BEOW)
 
 /* PCFG : Pin Configuration */
+#define TX4927_PCFG_SDCLKDLY_MASK      0x30000000
+#define TX4927_PCFG_SDCLKDLY(d)        ((d)<<28)
+#define TX4927_PCFG_SYSCLKEN   0x08000000
+#define TX4927_PCFG_SDCLKEN_ALL        0x07800000
+#define TX4927_PCFG_SDCLKEN(ch)        (0x00800000<<(ch))
 #define TX4927_PCFG_PCICLKEN_ALL       0x003f0000
 #define TX4927_PCFG_PCICLKEN(ch)       (0x00010000<<(ch))
+#define TX4927_PCFG_SEL2       0x00000200
+#define TX4927_PCFG_SEL1       0x00000100
+#define TX4927_PCFG_DMASEL_ALL 0x000000ff
+#define TX4927_PCFG_DMASEL0_MASK       0x00000003
+#define TX4927_PCFG_DMASEL1_MASK       0x0000000c
+#define TX4927_PCFG_DMASEL2_MASK       0x00000030
+#define TX4927_PCFG_DMASEL3_MASK       0x000000c0
+#define TX4927_PCFG_DMASEL0_DRQ0       0x00000000
+#define TX4927_PCFG_DMASEL0_SIO1       0x00000001
+#define TX4927_PCFG_DMASEL0_ACL0       0x00000002
+#define TX4927_PCFG_DMASEL0_ACL2       0x00000003
+#define TX4927_PCFG_DMASEL1_DRQ1       0x00000000
+#define TX4927_PCFG_DMASEL1_SIO1       0x00000004
+#define TX4927_PCFG_DMASEL1_ACL1       0x00000008
+#define TX4927_PCFG_DMASEL1_ACL3       0x0000000c
+#define TX4927_PCFG_DMASEL2_DRQ2       0x00000000      /* SEL2=0 */
+#define TX4927_PCFG_DMASEL2_SIO0       0x00000010      /* SEL2=0 */
+#define TX4927_PCFG_DMASEL2_ACL1       0x00000000      /* SEL2=1 */
+#define TX4927_PCFG_DMASEL2_ACL2       0x00000020      /* SEL2=1 */
+#define TX4927_PCFG_DMASEL2_ACL0       0x00000030      /* SEL2=1 */
+#define TX4927_PCFG_DMASEL3_DRQ3       0x00000000
+#define TX4927_PCFG_DMASEL3_SIO0       0x00000040
+#define TX4927_PCFG_DMASEL3_ACL3       0x00000080
+#define TX4927_PCFG_DMASEL3_ACL1       0x000000c0
 
 /* CLKCTR : Clock Control */
+#define TX4927_CLKCTR_ACLCKD   0x02000000
+#define TX4927_CLKCTR_PIOCKD   0x01000000
+#define TX4927_CLKCTR_DMACKD   0x00800000
 #define TX4927_CLKCTR_PCICKD   0x00400000
+#define TX4927_CLKCTR_TM0CKD   0x00100000
+#define TX4927_CLKCTR_TM1CKD   0x00080000
+#define TX4927_CLKCTR_TM2CKD   0x00040000
+#define TX4927_CLKCTR_SIO0CKD  0x00020000
+#define TX4927_CLKCTR_SIO1CKD  0x00010000
+#define TX4927_CLKCTR_ACLRST   0x00000200
+#define TX4927_CLKCTR_PIORST   0x00000100
+#define TX4927_CLKCTR_DMARST   0x00000080
 #define TX4927_CLKCTR_PCIRST   0x00000040
-
-#ifndef _LANGUAGE_ASSEMBLY
+#define TX4927_CLKCTR_TM0RST   0x00000010
+#define TX4927_CLKCTR_TM1RST   0x00000008
+#define TX4927_CLKCTR_TM2RST   0x00000004
+#define TX4927_CLKCTR_SIO0RST  0x00000002
+#define TX4927_CLKCTR_SIO1RST  0x00000001
 
 #define tx4927_sdramcptr       ((struct tx4927_sdramc_reg *)TX4927_SDRAMC_REG)
-#define tx4927_pcicptr         ((struct tx4927_pcic_reg *)TX4927_PCIC_REG)
-#define tx4927_ccfgptr         ((struct tx4927_ccfg_reg *)TX4927_CCFG_REG)
+#define tx4927_pcicptr \
+               ((struct tx4927_pcic_reg __iomem *)TX4927_PCIC_REG)
+#define tx4927_ccfgptr \
+               ((struct tx4927_ccfg_reg __iomem *)TX4927_CCFG_REG)
 #define tx4927_ebuscptr                ((struct tx4927_ebusc_reg *)TX4927_EBUSC_REG)
 
-#endif /* _LANGUAGE_ASSEMBLY */
+/* utilities */
+static inline void txx9_clear64(__u64 __iomem *adr, __u64 bits)
+{
+#ifdef CONFIG_32BIT
+       unsigned long flags;
+       local_irq_save(flags);
+#endif
+       ____raw_writeq(____raw_readq(adr) & ~bits, adr);
+#ifdef CONFIG_32BIT
+       local_irq_restore(flags);
+#endif
+}
+static inline void txx9_set64(__u64 __iomem *adr, __u64 bits)
+{
+#ifdef CONFIG_32BIT
+       unsigned long flags;
+       local_irq_save(flags);
+#endif
+       ____raw_writeq(____raw_readq(adr) | bits, adr);
+#ifdef CONFIG_32BIT
+       local_irq_restore(flags);
+#endif
+}
+
+/* These functions are not interrupt safe. */
+static inline void tx4927_ccfg_clear(__u64 bits)
+{
+       ____raw_writeq(____raw_readq(&tx4927_ccfgptr->ccfg)
+                      & ~(TX4927_CCFG_W1CBITS | bits),
+                      &tx4927_ccfgptr->ccfg);
+}
+static inline void tx4927_ccfg_set(__u64 bits)
+{
+       ____raw_writeq((____raw_readq(&tx4927_ccfgptr->ccfg)
+                       & ~TX4927_CCFG_W1CBITS) | bits,
+                      &tx4927_ccfgptr->ccfg);
+}
+static inline void tx4927_ccfg_change(__u64 change, __u64 new)
+{
+       ____raw_writeq((____raw_readq(&tx4927_ccfgptr->ccfg)
+                       & ~(TX4927_CCFG_W1CBITS | change)) |
+                      new,
+                      &tx4927_ccfgptr->ccfg);
+}
+
+int tx4927_report_pciclk(void);
+int tx4927_pciclk66_setup(void);
 
 #endif /* __ASM_TXX9_TX4927_H */