Path: blob/master/arch/alpha/include/asm/core_marvel.h
15126 views
/*1* Marvel systems use the IO7 I/O chip provides PCI/PCIX/AGP access2*3* This file is based on:4*5* Marvel / EV7 System Programmer's Manual6* Revision 1.007* 14 May 20018*/910#ifndef __ALPHA_MARVEL__H__11#define __ALPHA_MARVEL__H__1213#include <linux/types.h>14#include <linux/spinlock.h>1516#include <asm/compiler.h>1718#define MARVEL_MAX_PIDS 32 /* as long as we rely on 43-bit superpage */19#define MARVEL_IRQ_VEC_PE_SHIFT (10)20#define MARVEL_IRQ_VEC_IRQ_MASK ((1 << MARVEL_IRQ_VEC_PE_SHIFT) - 1)21#define MARVEL_NR_IRQS \22(16 + (MARVEL_MAX_PIDS * (1 << MARVEL_IRQ_VEC_PE_SHIFT)))2324/*25* EV7 RBOX Registers26*/27typedef struct {28volatile unsigned long csr __attribute__((aligned(16)));29} ev7_csr;3031typedef struct {32ev7_csr RBOX_CFG; /* 0x0000 */33ev7_csr RBOX_NSVC;34ev7_csr RBOX_EWVC;35ev7_csr RBOX_WHAMI;36ev7_csr RBOX_TCTL; /* 0x0040 */37ev7_csr RBOX_INT;38ev7_csr RBOX_IMASK;39ev7_csr RBOX_IREQ;40ev7_csr RBOX_INTQ; /* 0x0080 */41ev7_csr RBOX_INTA;42ev7_csr RBOX_IT;43ev7_csr RBOX_SCRATCH1;44ev7_csr RBOX_SCRATCH2; /* 0x00c0 */45ev7_csr RBOX_L_ERR;46} ev7_csrs;4748/*49* EV7 CSR addressing macros50*/51#define EV7_MASK40(addr) ((addr) & ((1UL << 41) - 1))52#define EV7_KERN_ADDR(addr) ((void *)(IDENT_ADDR | EV7_MASK40(addr)))5354#define EV7_PE_MASK 0x1ffUL /* 9 bits ( 256 + mem/io ) */55#define EV7_IPE(pe) ((~((long)(pe)) & EV7_PE_MASK) << 35)5657#define EV7_CSR_PHYS(pe, off) (EV7_IPE(pe) | (0x7FFCUL << 20) | (off))58#define EV7_CSRS_PHYS(pe) (EV7_CSR_PHYS(pe, 0UL))5960#define EV7_CSR_KERN(pe, off) (EV7_KERN_ADDR(EV7_CSR_PHYS(pe, off)))61#define EV7_CSRS_KERN(pe) (EV7_KERN_ADDR(EV7_CSRS_PHYS(pe)))6263#define EV7_CSR_OFFSET(name) ((unsigned long)&((ev7_csrs *)NULL)->name.csr)6465/*66* IO7 registers67*/68typedef struct {69volatile unsigned long csr __attribute__((aligned(64)));70} io7_csr;7172typedef struct {73/* I/O Port Control Registers */74io7_csr POx_CTRL; /* 0x0000 */75io7_csr POx_CACHE_CTL;76io7_csr POx_TIMER;77io7_csr POx_IO_ADR_EXT;78io7_csr POx_MEM_ADR_EXT; /* 0x0100 */79io7_csr POx_XCAL_CTRL;80io7_csr rsvd1[2]; /* ?? spec doesn't show 0x180 */81io7_csr POx_DM_SOURCE; /* 0x0200 */82io7_csr POx_DM_DEST;83io7_csr POx_DM_SIZE;84io7_csr POx_DM_CTRL;85io7_csr rsvd2[4]; /* 0x0300 */8687/* AGP Control Registers -- port 3 only */88io7_csr AGP_CAP_ID; /* 0x0400 */89io7_csr AGP_STAT;90io7_csr AGP_CMD;91io7_csr rsvd3;9293/* I/O Port Monitor Registers */94io7_csr POx_MONCTL; /* 0x0500 */95io7_csr POx_CTRA;96io7_csr POx_CTRB;97io7_csr POx_CTR56;98io7_csr POx_SCRATCH; /* 0x0600 */99io7_csr POx_XTRA_A;100io7_csr POx_XTRA_TS;101io7_csr POx_XTRA_Z;102io7_csr rsvd4; /* 0x0700 */103io7_csr POx_THRESHA;104io7_csr POx_THRESHB;105io7_csr rsvd5[33];106107/* System Address Space Window Control Registers */108109io7_csr POx_WBASE[4]; /* 0x1000 */110io7_csr POx_WMASK[4];111io7_csr POx_TBASE[4];112io7_csr POx_SG_TBIA;113io7_csr POx_MSI_WBASE;114io7_csr rsvd6[50];115116/* I/O Port Error Registers */117io7_csr POx_ERR_SUM;118io7_csr POx_FIRST_ERR;119io7_csr POx_MSK_HEI;120io7_csr POx_TLB_ERR;121io7_csr POx_SPL_COMPLT;122io7_csr POx_TRANS_SUM;123io7_csr POx_FRC_PCI_ERR;124io7_csr POx_MULT_ERR;125io7_csr rsvd7[8];126127/* I/O Port End of Interrupt Registers */128io7_csr EOI_DAT;129io7_csr rsvd8[7];130io7_csr POx_IACK_SPECIAL;131io7_csr rsvd9[103];132} io7_ioport_csrs;133134typedef struct {135io7_csr IO_ASIC_REV; /* 0x30.0000 */136io7_csr IO_SYS_REV;137io7_csr SER_CHAIN3;138io7_csr PO7_RST1;139io7_csr PO7_RST2; /* 0x30.0100 */140io7_csr POx_RST[4];141io7_csr IO7_DWNH;142io7_csr IO7_MAF;143io7_csr IO7_MAF_TO;144io7_csr IO7_ACC_CLUMP; /* 0x30.0300 */145io7_csr IO7_PMASK;146io7_csr IO7_IOMASK;147io7_csr IO7_UPH;148io7_csr IO7_UPH_TO; /* 0x30.0400 */149io7_csr RBX_IREQ_OFF;150io7_csr RBX_INTA_OFF;151io7_csr INT_RTY;152io7_csr PO7_MONCTL; /* 0x30.0500 */153io7_csr PO7_CTRA;154io7_csr PO7_CTRB;155io7_csr PO7_CTR56;156io7_csr PO7_SCRATCH; /* 0x30.0600 */157io7_csr PO7_XTRA_A;158io7_csr PO7_XTRA_TS;159io7_csr PO7_XTRA_Z;160io7_csr PO7_PMASK; /* 0x30.0700 */161io7_csr PO7_THRESHA;162io7_csr PO7_THRESHB;163io7_csr rsvd1[97];164io7_csr PO7_ERROR_SUM; /* 0x30.2000 */165io7_csr PO7_BHOLE_MASK;166io7_csr PO7_HEI_MSK;167io7_csr PO7_CRD_MSK;168io7_csr PO7_UNCRR_SYM; /* 0x30.2100 */169io7_csr PO7_CRRCT_SYM;170io7_csr PO7_ERR_PKT[2];171io7_csr PO7_UGBGE_SYM; /* 0x30.2200 */172io7_csr rsbv2[887];173io7_csr PO7_LSI_CTL[128]; /* 0x31.0000 */174io7_csr rsvd3[123];175io7_csr HLT_CTL; /* 0x31.3ec0 */176io7_csr HPI_CTL; /* 0x31.3f00 */177io7_csr CRD_CTL;178io7_csr STV_CTL;179io7_csr HEI_CTL;180io7_csr PO7_MSI_CTL[16]; /* 0x31.4000 */181io7_csr rsvd4[240];182183/*184* Interrupt Diagnostic / Test185*/186struct {187io7_csr INT_PND;188io7_csr INT_CLR;189io7_csr INT_EOI;190io7_csr rsvd[29];191} INT_DIAG[4];192io7_csr rsvd5[125]; /* 0x31.a000 */193io7_csr MISC_PND; /* 0x31.b800 */194io7_csr rsvd6[31];195io7_csr MSI_PND[16]; /* 0x31.c000 */196io7_csr rsvd7[16];197io7_csr MSI_CLR[16]; /* 0x31.c800 */198} io7_port7_csrs;199200/*201* IO7 DMA Window Base register (POx_WBASEx)202*/203#define wbase_m_ena 0x1204#define wbase_m_sg 0x2205#define wbase_m_dac 0x4206#define wbase_m_addr 0xFFF00000207union IO7_POx_WBASE {208struct {209unsigned ena : 1; /* <0> */210unsigned sg : 1; /* <1> */211unsigned dac : 1; /* <2> -- window 3 only */212unsigned rsvd1 : 17;213unsigned addr : 12; /* <31:20> */214unsigned rsvd2 : 32;215} bits;216unsigned as_long[2];217unsigned as_quad;218};219220/*221* IO7 IID (Interrupt IDentifier) format222*223* For level-sensative interrupts, int_num is encoded as:224*225* bus/port slot/device INTx226* <7:5> <4:2> <1:0>227*/228union IO7_IID {229struct {230unsigned int_num : 9; /* <8:0> */231unsigned tpu_mask : 4; /* <12:9> rsvd */232unsigned msi : 1; /* 13 */233unsigned ipe : 10; /* <23:14> */234unsigned long rsvd : 40;235} bits;236unsigned int as_long[2];237unsigned long as_quad;238};239240/*241* IO7 addressing macros242*/243#define IO7_KERN_ADDR(addr) (EV7_KERN_ADDR(addr))244245#define IO7_PORT_MASK 0x07UL /* 3 bits of port */246247#define IO7_IPE(pe) (EV7_IPE(pe))248#define IO7_IPORT(port) ((~((long)(port)) & IO7_PORT_MASK) << 32)249250#define IO7_HOSE(pe, port) (IO7_IPE(pe) | IO7_IPORT(port))251252#define IO7_MEM_PHYS(pe, port) (IO7_HOSE(pe, port) | 0x00000000UL)253#define IO7_CONF_PHYS(pe, port) (IO7_HOSE(pe, port) | 0xFE000000UL)254#define IO7_IO_PHYS(pe, port) (IO7_HOSE(pe, port) | 0xFF000000UL)255#define IO7_CSR_PHYS(pe, port, off) \256(IO7_HOSE(pe, port) | 0xFF800000UL | (off))257#define IO7_CSRS_PHYS(pe, port) (IO7_CSR_PHYS(pe, port, 0UL))258#define IO7_PORT7_CSRS_PHYS(pe) (IO7_CSR_PHYS(pe, 7, 0x300000UL))259260#define IO7_MEM_KERN(pe, port) (IO7_KERN_ADDR(IO7_MEM_PHYS(pe, port)))261#define IO7_CONF_KERN(pe, port) (IO7_KERN_ADDR(IO7_CONF_PHYS(pe, port)))262#define IO7_IO_KERN(pe, port) (IO7_KERN_ADDR(IO7_IO_PHYS(pe, port)))263#define IO7_CSR_KERN(pe, port, off) (IO7_KERN_ADDR(IO7_CSR_PHYS(pe,port,off)))264#define IO7_CSRS_KERN(pe, port) (IO7_KERN_ADDR(IO7_CSRS_PHYS(pe, port)))265#define IO7_PORT7_CSRS_KERN(pe) (IO7_KERN_ADDR(IO7_PORT7_CSRS_PHYS(pe)))266267#define IO7_PLL_RNGA(pll) (((pll) >> 3) & 0x7)268#define IO7_PLL_RNGB(pll) (((pll) >> 6) & 0x7)269270#define IO7_MEM_SPACE (2UL * 1024 * 1024 * 1024) /* 2GB MEM */271#define IO7_IO_SPACE (8UL * 1024 * 1024) /* 8MB I/O */272273274/*275* Offset between ram physical addresses and pci64 DAC addresses276*/277#define IO7_DAC_OFFSET (1UL << 49)278279/*280* This is needed to satisify the IO() macro used in initializing the machvec281*/282#define MARVEL_IACK_SC \283((unsigned long) \284(&(((io7_ioport_csrs *)IO7_CSRS_KERN(0, 0))->POx_IACK_SPECIAL)))285286#ifdef __KERNEL__287288/*289* IO7 structs290*/291#define IO7_NUM_PORTS 4292#define IO7_AGP_PORT 3293294struct io7_port {295struct io7 *io7;296struct pci_controller *hose;297298int enabled;299unsigned int port;300io7_ioport_csrs *csrs;301302unsigned long saved_wbase[4];303unsigned long saved_wmask[4];304unsigned long saved_tbase[4];305};306307struct io7 {308struct io7 *next;309310unsigned int pe;311io7_port7_csrs *csrs;312struct io7_port ports[IO7_NUM_PORTS];313314spinlock_t irq_lock;315};316317#ifndef __EXTERN_INLINE318# define __EXTERN_INLINE extern inline319# define __IO_EXTERN_INLINE320#endif321322/*323* I/O functions. All access through linear space.324*/325326/*327* Memory functions. All accesses through linear space.328*/329330#define vucp volatile unsigned char __force *331#define vusp volatile unsigned short __force *332333extern unsigned int marvel_ioread8(void __iomem *);334extern void marvel_iowrite8(u8 b, void __iomem *);335336__EXTERN_INLINE unsigned int marvel_ioread16(void __iomem *addr)337{338return __kernel_ldwu(*(vusp)addr);339}340341__EXTERN_INLINE void marvel_iowrite16(u16 b, void __iomem *addr)342{343__kernel_stw(b, *(vusp)addr);344}345346extern void __iomem *marvel_ioremap(unsigned long addr, unsigned long size);347extern void marvel_iounmap(volatile void __iomem *addr);348extern void __iomem *marvel_ioportmap (unsigned long addr);349350__EXTERN_INLINE int marvel_is_ioaddr(unsigned long addr)351{352return (addr >> 40) & 1;353}354355extern int marvel_is_mmio(const volatile void __iomem *);356357#undef vucp358#undef vusp359360#undef __IO_PREFIX361#define __IO_PREFIX marvel362#define marvel_trivial_rw_bw 1363#define marvel_trivial_rw_lq 1364#define marvel_trivial_io_bw 0365#define marvel_trivial_io_lq 1366#define marvel_trivial_iounmap 0367#include <asm/io_trivial.h>368369#ifdef __IO_EXTERN_INLINE370# undef __EXTERN_INLINE371# undef __IO_EXTERN_INLINE372#endif373374#endif /* __KERNEL__ */375376#endif /* __ALPHA_MARVEL__H__ */377378379