📄 pcibr_private.h
字号:
/* $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 + -