⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcibr_private.h

📁 linux-2.4.29操作系统的源码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* $Id$ * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved. */#ifndef _ASM_SN_PCI_PCIBR_PRIVATE_H#define _ASM_SN_PCI_PCIBR_PRIVATE_H/* * pcibr_private.h -- private definitions for pcibr * only the pcibr driver (and its closest friends) * should ever peek into this file. */#include <linux/config.h>#include <linux/pci.h>#include <asm/sn/pci/pcibr.h>#include <asm/sn/pci/pciio_private.h>#include <asm/sn/ksys/l1.h>/* * convenience typedefs */typedef uint64_t pcibr_DMattr_t;typedef uint32_t pcibr_ATEattr_t;typedef struct pcibr_info_s *pcibr_info_t, **pcibr_info_h;typedef struct pcibr_soft_s *pcibr_soft_t;typedef struct pcibr_soft_slot_s *pcibr_soft_slot_t;typedef struct pcibr_hints_s *pcibr_hints_t;typedef struct pcibr_intr_list_s *pcibr_intr_list_t;typedef struct pcibr_intr_wrap_s *pcibr_intr_wrap_t;typedef struct pcibr_intr_cbuf_s *pcibr_intr_cbuf_t;typedef volatile unsigned *cfg_p;typedef volatile bridgereg_t *reg_p;/* * extern functions */cfg_p pcibr_slot_config_addr(bridge_t *, pciio_slot_t, int);cfg_p pcibr_func_config_addr(bridge_t *, pciio_bus_t bus, pciio_slot_t, pciio_function_t, int);unsigned pcibr_slot_config_get(bridge_t *, pciio_slot_t, int);unsigned pcibr_func_config_get(bridge_t *, pciio_slot_t, pciio_function_t, int);void pcibr_debug(uint32_t, vertex_hdl_t, char *, ...);void pcibr_slot_config_set(bridge_t *, pciio_slot_t, int, unsigned);void pcibr_func_config_set(bridge_t *, pciio_slot_t, pciio_function_t, int, 								unsigned);/* * PCIBR_DEBUG() macro and debug bitmask defines *//* low freqency debug events (ie. initialization, resource allocation,...) */#define PCIBR_DEBUG_INIT	0x00000001  /* bridge init */#define PCIBR_DEBUG_HINTS	0x00000002  /* bridge hints */#define PCIBR_DEBUG_ATTACH	0x00000004  /* bridge attach */#define PCIBR_DEBUG_DETACH	0x00000008  /* bridge detach */#define PCIBR_DEBUG_ATE		0x00000010  /* bridge ATE allocation */#define PCIBR_DEBUG_RRB		0x00000020  /* bridge RRB allocation */#define PCIBR_DEBUG_RBAR	0x00000040  /* bridge RBAR allocation */#define PCIBR_DEBUG_PROBE	0x00000080  /* bridge device probing */#define PCIBR_DEBUG_INTR_ERROR  0x00000100  /* bridge error interrupt */#define PCIBR_DEBUG_ERROR_HDLR  0x00000200  /* bridge error handler */#define PCIBR_DEBUG_CONFIG	0x00000400  /* device's config space */#define PCIBR_DEBUG_BAR		0x00000800  /* device's BAR allocations */#define PCIBR_DEBUG_INTR_ALLOC	0x00001000  /* device's intr allocation */#define PCIBR_DEBUG_DEV_ATTACH	0x00002000  /* device's attach */#define PCIBR_DEBUG_DEV_DETACH	0x00004000  /* device's detach */#define PCIBR_DEBUG_HOTPLUG	0x00008000/* high freqency debug events (ie. map allocation, direct translation,...) */#define PCIBR_DEBUG_DEVREG	0x04000000  /* bridges device reg sets */#define PCIBR_DEBUG_PIOMAP	0x08000000  /* pcibr_piomap */#define PCIBR_DEBUG_PIODIR	0x10000000  /* pcibr_piotrans */#define PCIBR_DEBUG_DMAMAP	0x20000000  /* pcibr_dmamap */#define PCIBR_DEBUG_DMADIR	0x40000000  /* pcibr_dmatrans */#define PCIBR_DEBUG_INTR	0x80000000  /* interrupts */extern char	 *pcibr_debug_module;extern int	  pcibr_debug_widget;extern int	  pcibr_debug_slot;extern uint32_t pcibr_debug_mask;/* For low frequency events (ie. initialization, resource allocation,...) */#define PCIBR_DEBUG_ALWAYS(args) pcibr_debug args ;/* XXX: habeck: maybe make PCIBR_DEBUG() always available?  Even in non- * debug kernels?  If tracing isn't enabled (i.e pcibr_debug_mask isn't * set, then the overhead for this macro is just an extra 'if' check. *//* For high frequency events (ie. map allocation, direct translation,...) */#if 1 || DEBUG#define PCIBR_DEBUG(args) PCIBR_DEBUG_ALWAYS(args)#else	/* DEBUG */#define PCIBR_DEBUG(args)#endif	/* DEBUG *//* * Bridge sets up PIO using this information. */struct pcibr_piomap_s {    struct pciio_piomap_s   bp_pp;	/* generic stuff */#define	bp_flags	bp_pp.pp_flags	/* PCIBR_PIOMAP flags */#define	bp_dev		bp_pp.pp_dev	/* associated pci card */#define	bp_slot		bp_pp.pp_slot	/* which slot the card is in */#define	bp_space	bp_pp.pp_space	/* which address space */#define	bp_pciaddr	bp_pp.pp_pciaddr	/* starting offset of mapping */#define	bp_mapsz	bp_pp.pp_mapsz	/* size of this mapping */#define	bp_kvaddr	bp_pp.pp_kvaddr	/* kernel virtual address to use */    iopaddr_t               bp_xtalk_addr;	/* corresponding xtalk address */    xtalk_piomap_t          bp_xtalk_pio;	/* corresponding xtalk resource */    pcibr_piomap_t	    bp_next;	/* Next piomap on the list */    pcibr_soft_t	    bp_soft;	/* backpointer to bridge soft data */    atomic_t		    bp_toc[1];	/* PCI timeout counter */};/* * Bridge sets up DMA using this information. */struct pcibr_dmamap_s {    struct pciio_dmamap_s   bd_pd;#define	bd_flags	bd_pd.pd_flags	/* PCIBR_DMAMAP flags */#define	bd_dev		bd_pd.pd_dev	/* associated pci card */#define	bd_slot		bd_pd.pd_slot	/* which slot the card is in */    struct pcibr_soft_s    *bd_soft;	/* pcibr soft state backptr */    xtalk_dmamap_t          bd_xtalk;	/* associated xtalk resources */    size_t                  bd_max_size;	/* maximum size of mapping */    xwidgetnum_t            bd_xio_port;	/* target XIO port */    iopaddr_t               bd_xio_addr;	/* target XIO address */    iopaddr_t               bd_pci_addr;	/* via PCI address */    int                     bd_ate_index;	/* Address Translation Entry Index */    int                     bd_ate_count;	/* number of ATE's allocated */    bridge_ate_p            bd_ate_ptr;		/* where to write first ATE */    bridge_ate_t            bd_ate_proto;	/* prototype ATE (for xioaddr=0) */    bridge_ate_t            bd_ate_prime;	/* value of 1st ATE written */};#define	IBUFSIZE	5		/* size of circular buffer (holds 4) *//* * Circular buffer used for interrupt processing */struct pcibr_intr_cbuf_s {    spinlock_t		ib_lock;		/* cbuf 'put' lock */    int			ib_in;			/* index of next free entry */    int			ib_out;			/* index of next full entry */    pcibr_intr_wrap_t   ib_cbuf[IBUFSIZE];	/* circular buffer of wrap  */};/* * Bridge sets up interrupts using this information. */struct pcibr_intr_s {    struct pciio_intr_s     bi_pi;#define	bi_flags	bi_pi.pi_flags	/* PCIBR_INTR flags */#define	bi_dev		bi_pi.pi_dev	/* associated pci card */#define	bi_lines	bi_pi.pi_lines	/* which PCI interrupt line(s) */#define bi_func		bi_pi.pi_func	/* handler function (when connected) */#define bi_arg		bi_pi.pi_arg	/* handler parameter (when connected) */#define bi_mustruncpu	bi_pi.pi_mustruncpu /* Where we must run. */#define bi_irq		bi_pi.pi_irq	/* IRQ assigned. */#define bi_cpu		bi_pi.pi_cpu	/* cpu assigned. */    unsigned                bi_ibits;	/* which Bridge interrupt bit(s) */    pcibr_soft_t            bi_soft;	/* shortcut to soft info */    struct pcibr_intr_cbuf_s bi_ibuf;	/* circular buffer of wrap ptrs */    unsigned		bi_last_intr;	/* For Shub lb lost intr. bug */};/*  * PCIBR_INFO_SLOT_GET_EXT returns the external slot number that the card * resides in.  (i.e the slot number silk screened on the back of the I/O  * brick).  PCIBR_INFO_SLOT_GET_INT returns the internal slot (or device) * number used by the pcibr code to represent that external slot (i.e to  * set bit patterns in BRIDGE/PIC registers to represent the device, or to * offset into an array, or ...). * * In BRIDGE and XBRIDGE the external slot and internal device numbering  * are the same.  (0->0, 1->1, 2->2,... 7->7)  BUT in the PIC the external * slot number is always 1 greater than the internal device number (1->0,  * 2->1, 3->2, 4->3).  This is due to the fact that the PCI-X spec requires * that the 'bridge' (i.e PIC) be designated as 'device 0', thus external * slot numbering can't start at zero. * * PCIBR_DEVICE_TO_SLOT converts an internal device number to an external * slot number.  NOTE: PCIIO_SLOT_NONE stays as PCIIO_SLOT_NONE. * * PCIBR_SLOT_TO_DEVICE converts an external slot number to an internal * device number.  NOTE: PCIIO_SLOT_NONE stays as PCIIO_SLOT_NONE. */#define PCIBR_INFO_SLOT_GET_EXT(info)	    (((pcibr_info_t)info)->f_slot)#define PCIBR_INFO_SLOT_GET_INT(info)	    (((pcibr_info_t)info)->f_dev)#define PCIBR_DEVICE_TO_SLOT(pcibr_soft, dev_num) \	(((dev_num) != PCIIO_SLOT_NONE) ? \	    (IS_PIC_SOFT((pcibr_soft)) ? ((dev_num) + 1) : (dev_num)) : \	    PCIIO_SLOT_NONE)#define PCIBR_SLOT_TO_DEVICE(pcibr_soft, slot) \        (((slot) != PCIIO_SLOT_NONE) ? \            (IS_PIC_SOFT((pcibr_soft)) ? ((slot) - 1) : (slot)) : \            PCIIO_SLOT_NONE)/* * per-connect point pcibr data, including standard pciio data in-line: */struct pcibr_info_s {    struct pciio_info_s	    f_c;	/* MUST BE FIRST. */#define	f_vertex	f_c.c_vertex	/* back pointer to vertex */#define	f_bus		f_c.c_bus	/* which bus the card is in */#define	f_slot		f_c.c_slot	/* which slot the card is in */#define	f_func		f_c.c_func	/* which func (on multi-func cards) */#define	f_vendor	f_c.c_vendor	/* PCI card "vendor" code */#define	f_device	f_c.c_device	/* PCI card "device" code */#define	f_master	f_c.c_master	/* PCI bus provider */#define	f_mfast		f_c.c_mfast	/* cached fastinfo from c_master */#define	f_pops		f_c.c_pops	/* cached provider from c_master */#define	f_efunc		f_c.c_efunc	/* error handling function */#define	f_einfo		f_c.c_einfo	/* first parameter for efunc */#define f_window        f_c.c_window    /* state of BASE regs */#define	f_rwindow	f_c.c_rwindow	/* expansion ROM BASE regs */#define	f_rbase		f_c.c_rbase	/* expansion ROM base */#define	f_rsize		f_c.c_rsize	/* expansion ROM size */#define f_piospace      f_c.c_piospace  /* additional I/O spaces allocated */    /* pcibr-specific connection state */    int			    f_ibit[4];	/* Bridge bit for each INTx */    pcibr_piomap_t	    f_piomap;    int                     f_att_det_error;    pciio_slot_t	    f_dev;	/* which device the card represents */    cap_pcix_type0_t	   *f_pcix_cap;	/* pointer to the pcix capability */};/* ===================================================================== *          Shared Interrupt Information */struct pcibr_intr_list_s {    pcibr_intr_list_t       il_next;    pcibr_intr_t            il_intr;    volatile bridgereg_t   *il_wrbf;	/* ptr to b_wr_req_buf[] */};/* ===================================================================== *          Interrupt Wrapper Data */struct pcibr_intr_wrap_s {    pcibr_soft_t            iw_soft;	/* which bridge */    volatile bridgereg_t   *iw_stat;	/* ptr to b_int_status */    bridgereg_t             iw_ibit;	/* bit in b_int_status */    pcibr_intr_list_t       iw_list;	/* ghostbusters! */    int			    iw_hdlrcnt;	/* running handler count */    int			    iw_shared;  /* if Bridge bit is shared */    int			    iw_connected; /* if already connected */};#define	PCIBR_ISR_ERR_START		8#define PCIBR_ISR_MAX_ERRS_BRIDGE 	32#define PCIBR_ISR_MAX_ERRS_PIC		45#define PCIBR_ISR_MAX_ERRS	PCIBR_ISR_MAX_ERRS_PIC/* * PCI Base Address Register window allocation constants. * To reduce the size of the internal resource mapping structures, do * not use the entire PCI bus I/O address space */ #define PCIBR_BUS_IO_BASE      0x100000#define PCIBR_BUS_IO_MAX       0x0FFFFFFF#define PCIBR_BUS_IO_PAGE      0x100000#define PCIBR_BUS_SWIN_BASE    PAGE_SIZE#define PCIBR_BUS_SWIN_MAX     0x000FFFFF#define PCIBR_BUS_SWIN_PAGE    PAGE_SIZE#define PCIBR_BUS_MEM_BASE     0x200000#define PCIBR_BUS_MEM_MAX      0x3FFFFFFF#define PCIBR_BUS_MEM_PAGE     0x100000/* defines for pcibr_soft_s->bs_bridge_type */#define PCIBR_BRIDGETYPE_BRIDGE		0#define PCIBR_BRIDGETYPE_XBRIDGE	1#define PCIBR_BRIDGETYPE_PIC		2#define IS_XBRIDGE_SOFT(ps) (ps->bs_bridge_type == PCIBR_BRIDGETYPE_XBRIDGE)#define IS_PIC_SOFT(ps)     (ps->bs_bridge_type == PCIBR_BRIDGETYPE_PIC)#define IS_PIC_BUSNUM_SOFT(ps, bus)	\		(IS_PIC_SOFT(ps) && ((ps)->bs_busnum == (bus)))#define IS_BRIDGE_SOFT(ps)  (ps->bs_bridge_type == PCIBR_BRIDGETYPE_BRIDGE)#define IS_XBRIDGE_OR_PIC_SOFT(ps) (IS_XBRIDGE_SOFT(ps) || IS_PIC_SOFT(ps))/* * Runtime checks for workarounds. */#define PCIBR_WAR_ENABLED(pv, pcibr_soft) \	((1 << XWIDGET_PART_REV_NUM_REV(pcibr_soft->bs_rev_num)) & pv)/* * Defines for individual WARs. Each is a bitmask of applicable * part revision numbers. (1 << 1) == rev A, (1 << 2) == rev B, etc. */#define PV854697 (~0)     /* PIC: write 64bit regs as 64bits. permanent */#define PV854827 (~0)     /* PIC: fake widget 0xf presence bit. permanent */#define PV855271 (1 << 1) /* PIC: PIC: use virt chan iff 64-bit device. */#define PV855272 (1 << 1) /* PIC: runaway interrupt WAR */#define PV856155 (1 << 1) /* PIC: arbitration WAR */#define PV856864 (1 << 1) /* PIC: lower timeout to free TNUMs quicker */#define PV856866 (1 << 1) /* PIC: avoid rrb's 0/1/8/9. */#define PV862253 (1 << 1) /* PIC: don't enable write req RAM parity checking */#define PV867308 (3 << 1) /* PIC: make LLP error interrupts FATAL for PIC *//* defines for pcibr_soft_s->bs_bridge_mode */#define PCIBR_BRIDGEMODE_PCI_33		0x0#define PCIBR_BRIDGEMODE_PCI_66		0x2#define PCIBR_BRIDGEMODE_PCIX_66	0x3#define PCIBR_BRIDGEMODE_PCIX_100	0x5#define PCIBR_BRIDGEMODE_PCIX_133	0x7#define BUSSPEED_MASK			0x6#define BUSTYPE_MASK			0x1#define IS_PCI(ps)	(!IS_PCIX(ps))#define IS_PCIX(ps)	((ps)->bs_bridge_mode & BUSTYPE_MASK)#define IS_33MHZ(ps)	((ps)->bs_bridge_mode == PCIBR_BRIDGEMODE_PCI_33)#define IS_66MHZ(ps)	(((ps)->bs_bridge_mode == PCIBR_BRIDGEMODE_PCI_66) || \			 ((ps)->bs_bridge_mode == PCIBR_BRIDGEMODE_PCIX_66))#define IS_100MHZ(ps)	((ps)->bs_bridge_mode == PCIBR_BRIDGEMODE_PCIX_100)#define IS_133MHZ(ps)	((ps)->bs_bridge_mode == PCIBR_BRIDGEMODE_PCIX_133)/* Number of PCI slots.   NOTE: this works as long as the first slot * is zero.  Otherwise use ((ps->bs_max_slot+1) - ps->bs_min_slot) */#define PCIBR_NUM_SLOTS(ps) (ps->bs_max_slot+1)/* ===================================================================== *            Bridge Device State structure * *      one instance of this structure is kept for each *      Bridge ASIC in the system. */struct pcibr_soft_s {    vertex_hdl_t          bs_conn;		/* xtalk connection point */    vertex_hdl_t          bs_vhdl;		/* vertex owned by pcibr */    uint64_t                bs_int_enable;	/* Mask of enabled intrs */    bridge_t               *bs_base;		/* PIO pointer to Bridge chip */    char                   *bs_name;		/* hw graph name */    xwidgetnum_t            bs_xid;		/* Bridge's xtalk ID number */    vertex_hdl_t          bs_master;		/* xtalk master vertex */    xwidgetnum_t            bs_mxid;		/* master's xtalk ID number */    pciio_slot_t            bs_first_slot;      /* first existing slot */    pciio_slot_t            bs_last_slot;       /* last existing slot */    pciio_slot_t            bs_last_reset;      /* last slot to reset */    pciio_slot_t	    bs_min_slot;	/* lowest possible slot */    pciio_slot_t	    bs_max_slot;	/* highest possible slot */    pcibr_soft_t	    bs_peers_soft;	/* PICs other bus's soft */    int			    bs_busnum;		/* PIC has two pci busses */    iopaddr_t               bs_dir_xbase;	/* xtalk address for 32-bit PCI direct map */    xwidgetnum_t	    bs_dir_xport;	/* xtalk port for 32-bit PCI direct map */    struct resource	    bs_int_ate_resource;/* root resource for internal ATEs */    struct resource	    bs_ext_ate_resource;/* root resource for external ATEs */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -