/* $Id: hubio_next.h,v 1.1.1.1 2003/06/23 22:18:40 jharrell Exp $ * * 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 Silicon Graphics, Inc. * Copyright (C) 2000 by Colin Ngam */ #ifndef _ASM_SN_SN1_HUBIO_NEXT_H #define _ASM_SN_SN1_HUBIO_NEXT_H /* * Slightly friendlier names for some common registers. */ #define IIO_WIDGET IIO_WID /* Widget identification */ #define IIO_WIDGET_STAT IIO_WSTAT /* Widget status register */ #define IIO_WIDGET_CTRL IIO_WCR /* Widget control register */ #define IIO_PROTECT IIO_ILAPR /* IO interface protection */ #define IIO_PROTECT_OVRRD IIO_ILAPO /* IO protect override */ #define IIO_OUTWIDGET_ACCESS IIO_IOWA /* Outbound widget access */ #define IIO_INWIDGET_ACCESS IIO_IIWA /* Inbound widget access */ #define IIO_INDEV_ERR_MASK IIO_IIDEM /* Inbound device error mask */ #define IIO_LLP_CSR IIO_ILCSR /* LLP control and status */ #define IIO_LLP_LOG IIO_ILLR /* LLP log */ #define IIO_XTALKCC_TOUT IIO_IXCC /* Xtalk credit count timeout*/ #define IIO_XTALKTT_TOUT IIO_IXTT /* Xtalk tail timeout */ #define IIO_IO_ERR_CLR IIO_IECLR /* IO error clear */ #define IIO_IGFX_0 IIO_IGFX0 #define IIO_IGFX_1 IIO_IGFX1 #define IIO_IBCT_0 IIO_IBCT0 #define IIO_IBCT_1 IIO_IBCT1 #define IIO_IBLS_0 IIO_IBLS0 #define IIO_IBLS_1 IIO_IBLS1 #define IIO_IBSA_0 IIO_IBSA0 #define IIO_IBSA_1 IIO_IBSA1 #define IIO_IBDA_0 IIO_IBDA0 #define IIO_IBDA_1 IIO_IBDA1 #define IIO_IBNA_0 IIO_IBNA0 #define IIO_IBNA_1 IIO_IBNA1 #define IIO_IBIA_0 IIO_IBIA0 #define IIO_IBIA_1 IIO_IBIA1 #define IIO_IOPRB_0 IIO_IPRB0 #define IIO_PRTE_0 IIO_IPRTE0 /* PIO Read address table entry 0 */ #define IIO_PRTE(_x) (IIO_PRTE_0 + (8 * (_x))) #define IIO_NUM_IPRBS (9) #define IIO_WIDPRTE(x) IIO_PRTE(((x) - 8)) /* widget ID to its PRTE num */ #define IIO_LLP_CSR_IS_UP 0x00002000 #define IIO_LLP_CSR_LLP_STAT_MASK 0x00003000 #define IIO_LLP_CSR_LLP_STAT_SHFT 12 #define IIO_LLP_CB_MAX 0xffff /* in ILLR CB_CNT, Max Check Bit errors */ #define IIO_LLP_SN_MAX 0xffff /* in ILLR SN_CNT, Max Sequence Number errors */ /* key to IIO_PROTECT_OVRRD */ #define IIO_PROTECT_OVRRD_KEY 0x53474972756c6573ull /* "SGIrules" */ /* BTE register names */ #define IIO_BTE_STAT_0 IIO_IBLS_0 /* Also BTE length/status 0 */ #define IIO_BTE_SRC_0 IIO_IBSA_0 /* Also BTE source address 0 */ #define IIO_BTE_DEST_0 IIO_IBDA_0 /* Also BTE dest. address 0 */ #define IIO_BTE_CTRL_0 IIO_IBCT_0 /* Also BTE control/terminate 0 */ #define IIO_BTE_NOTIFY_0 IIO_IBNA_0 /* Also BTE notification 0 */ #define IIO_BTE_INT_0 IIO_IBIA_0 /* Also BTE interrupt 0 */ #define IIO_BTE_OFF_0 0 /* Base offset from BTE 0 regs. */ #define IIO_BTE_OFF_1 IIO_IBLS_1 - IIO_IBLS_0 /* Offset from base to BTE 1 */ /* BTE register offsets from base */ #define BTEOFF_STAT 0 #define BTEOFF_SRC (IIO_BTE_SRC_0 - IIO_BTE_STAT_0) #define BTEOFF_DEST (IIO_BTE_DEST_0 - IIO_BTE_STAT_0) #define BTEOFF_CTRL (IIO_BTE_CTRL_0 - IIO_BTE_STAT_0) #define BTEOFF_NOTIFY (IIO_BTE_NOTIFY_0 - IIO_BTE_STAT_0) #define BTEOFF_INT (IIO_BTE_INT_0 - IIO_BTE_STAT_0) /* names used in hub_diags.c; carried over from SN0 */ #define IIO_BASE_BTE0 IIO_IBLS_0 #define IIO_BASE_BTE1 IIO_IBLS_1 #if 0 #define IIO_BASE IIO_WID #define IIO_BASE_PERF IIO_IPCR /* IO Performance Control */ #define IIO_PERF_CNT IIO_IPPR /* IO Performance Profiling */ #endif /* GFX Flow Control Node/Widget Register */ #define IIO_IGFX_W_NUM_BITS 4 /* size of widget num field */ #define IIO_IGFX_W_NUM_MASK ((1<> IIO_WSTAT_TXRETRY_SHFT) & \ IIO_WSTAT_TXRETRY_MASK) /* Number of II perf. counters we can multiplex at once */ #define IO_PERF_SETS 32 #if __KERNEL__ #if _LANGUAGE_C /* XXX moved over from SN/SN0/hubio.h -- each should be checked for SN1 */ #include #include #include #include /* Bit for the widget in inbound access register */ #define IIO_IIWA_WIDGET(_w) ((uint64_t)(1ULL << _w)) /* Bit for the widget in outbound access register */ #define IIO_IOWA_WIDGET(_w) ((uint64_t)(1ULL << _w)) /* NOTE: The following define assumes that we are going to get * widget numbers from 8 thru F and the device numbers within * widget from 0 thru 7. */ #define IIO_IIDEM_WIDGETDEV_MASK(w, d) ((uint64_t)(1ULL << (8 * ((w) - 8) + (d)))) /* IO Interrupt Destination Register */ #define IIO_IIDSR_SENT_SHIFT 28 #define IIO_IIDSR_SENT_MASK 0x10000000 #define IIO_IIDSR_ENB_SHIFT 24 #define IIO_IIDSR_ENB_MASK 0x01000000 #define IIO_IIDSR_NODE_SHIFT 8 #define IIO_IIDSR_NODE_MASK 0x0000ff00 #define IIO_IIDSR_PI_ID_SHIFT 8 #define IIO_IIDSR_PI_ID_MASK 0x00000010 #define IIO_IIDSR_LVL_SHIFT 0 #define IIO_IIDSR_LVL_MASK 0x0000007f /* Xtalk timeout threshhold register (IIO_IXTT) */ #define IXTT_RRSP_TO_SHFT 55 /* read response timeout */ #define IXTT_RRSP_TO_MASK (0x1FULL << IXTT_RRSP_TO_SHFT) #define IXTT_RRSP_PS_SHFT 32 /* read responsed TO prescalar */ #define IXTT_RRSP_PS_MASK (0x7FFFFFULL << IXTT_RRSP_PS_SHFT) #define IXTT_TAIL_TO_SHFT 0 /* tail timeout counter threshold */ #define IXTT_TAIL_TO_MASK (0x3FFFFFFULL << IXTT_TAIL_TO_SHFT) /* * The IO LLP control status register and widget control register */ #ifdef LITTLE_ENDIAN typedef union hubii_wcr_u { uint64_t wcr_reg_value; struct { uint64_t wcr_widget_id: 4, /* LLP crossbar credit */ wcr_tag_mode: 1, /* Tag mode */ wcr_rsvd1: 8, /* Reserved */ wcr_xbar_crd: 3, /* LLP crossbar credit */ wcr_f_bad_pkt: 1, /* Force bad llp pkt enable */ wcr_dir_con: 1, /* widget direct connect */ wcr_e_thresh: 5, /* elasticity threshold */ wcr_rsvd: 41; /* unused */ } wcr_fields_s; } hubii_wcr_t; #else typedef union hubii_wcr_u { uint64_t wcr_reg_value; struct { uint64_t wcr_rsvd: 41, /* unused */ wcr_e_thresh: 5, /* elasticity threshold */ wcr_dir_con: 1, /* widget direct connect */ wcr_f_bad_pkt: 1, /* Force bad llp pkt enable */ wcr_xbar_crd: 3, /* LLP crossbar credit */ wcr_rsvd1: 8, /* Reserved */ wcr_tag_mode: 1, /* Tag mode */ wcr_widget_id: 4; /* LLP crossbar credit */ } wcr_fields_s; } hubii_wcr_t; #endif #define iwcr_dir_con wcr_fields_s.wcr_dir_con /* The structures below are defined to extract and modify the ii performance registers */ /* io_perf_sel allows the caller to specify what tests will be performed */ #ifdef LITTLE_ENDIAN typedef union io_perf_sel { uint64_t perf_sel_reg; struct { uint64_t perf_ippr0 : 4, perf_ippr1 : 4, perf_icct : 8, perf_rsvd : 48; } perf_sel_bits; } io_perf_sel_t; #else typedef union io_perf_sel { uint64_t perf_sel_reg; struct { uint64_t perf_rsvd : 48, perf_icct : 8, perf_ippr1 : 4, perf_ippr0 : 4; } perf_sel_bits; } io_perf_sel_t; #endif /* io_perf_cnt is to extract the count from the hub registers. Due to hardware problems there is only one counter, not two. */ #ifdef LITTLE_ENDIAN typedef union io_perf_cnt { uint64_t perf_cnt; struct { uint64_t perf_cnt : 20, perf_rsvd2 : 12, perf_rsvd1 : 32; } perf_cnt_bits; } io_perf_cnt_t; #else typedef union io_perf_cnt { uint64_t perf_cnt; struct { uint64_t perf_rsvd1 : 32, perf_rsvd2 : 12, perf_cnt : 20; } perf_cnt_bits; } io_perf_cnt_t; #endif #ifdef LITTLE_ENDIAN typedef union iprte_a { bdrkreg_t entry; struct { bdrkreg_t i_rsvd_1 : 3; bdrkreg_t i_addr : 38; bdrkreg_t i_init : 3; bdrkreg_t i_source : 8; bdrkreg_t i_rsvd : 2; bdrkreg_t i_widget : 4; bdrkreg_t i_to_cnt : 5; bdrkreg_t i_vld : 1; } iprte_fields; } iprte_a_t; #else typedef union iprte_a { bdrkreg_t entry; struct { bdrkreg_t i_vld : 1; bdrkreg_t i_to_cnt : 5; bdrkreg_t i_widget : 4; bdrkreg_t i_rsvd : 2; bdrkreg_t i_source : 8; bdrkreg_t i_init : 3; bdrkreg_t i_addr : 38; bdrkreg_t i_rsvd_1 : 3; } iprte_fields; } iprte_a_t; #endif /* PIO MANAGEMENT */ typedef struct hub_piomap_s *hub_piomap_t; extern hub_piomap_t hub_piomap_alloc(devfs_handle_t dev, /* set up mapping for this device */ device_desc_t dev_desc, /* device descriptor */ iopaddr_t xtalk_addr, /* map for this xtalk_addr range */ size_t byte_count, size_t byte_count_max, /* maximum size of a mapping */ unsigned flags); /* defined in sys/pio.h */ extern void hub_piomap_free(hub_piomap_t hub_piomap); extern caddr_t hub_piomap_addr(hub_piomap_t hub_piomap, /* mapping resources */ iopaddr_t xtalk_addr, /* map for this xtalk addr */ size_t byte_count); /* map this many bytes */ extern void hub_piomap_done(hub_piomap_t hub_piomap); extern caddr_t hub_piotrans_addr( devfs_handle_t dev, /* translate to this device */ device_desc_t dev_desc, /* device descriptor */ iopaddr_t xtalk_addr, /* Crosstalk address */ size_t byte_count, /* map this many bytes */ unsigned flags); /* (currently unused) */ /* DMA MANAGEMENT */ typedef struct hub_dmamap_s *hub_dmamap_t; extern hub_dmamap_t hub_dmamap_alloc( devfs_handle_t dev, /* set up mappings for dev */ device_desc_t dev_desc, /* device descriptor */ size_t byte_count_max, /* max size of a mapping */ unsigned flags); /* defined in dma.h */ extern void hub_dmamap_free(hub_dmamap_t dmamap); extern iopaddr_t hub_dmamap_addr( hub_dmamap_t dmamap, /* use mapping resources */ paddr_t paddr, /* map for this address */ size_t byte_count); /* map this many bytes */ extern alenlist_t hub_dmamap_list( hub_dmamap_t dmamap, /* use mapping resources */ alenlist_t alenlist, /* map this Addr/Length List */ unsigned flags); extern void hub_dmamap_done( hub_dmamap_t dmamap); /* done w/ mapping resources */ extern iopaddr_t hub_dmatrans_addr( devfs_handle_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ paddr_t paddr, /* system physical address */ size_t byte_count, /* length */ unsigned flags); /* defined in dma.h */ extern alenlist_t hub_dmatrans_list( devfs_handle_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ alenlist_t palenlist, /* system addr/length list */ unsigned flags); /* defined in dma.h */ extern void hub_dmamap_drain( hub_dmamap_t map); extern void hub_dmaaddr_drain( devfs_handle_t vhdl, paddr_t addr, size_t bytes); extern void hub_dmalist_drain( devfs_handle_t vhdl, alenlist_t list); /* INTERRUPT MANAGEMENT */ typedef struct hub_intr_s *hub_intr_t; extern hub_intr_t hub_intr_alloc( devfs_handle_t dev, /* which device */ device_desc_t dev_desc, /* device descriptor */ devfs_handle_t owner_dev); /* owner of this interrupt */ extern hub_intr_t hub_intr_alloc_nothd(devfs_handle_t dev, /* which device */ device_desc_t dev_desc, /* device descriptor */ devfs_handle_t owner_dev); /* owner of this interrupt */ extern void hub_intr_free(hub_intr_t intr_hdl); extern int hub_intr_connect( hub_intr_t intr_hdl, /* xtalk intr resource hndl */ intr_func_t intr_func, /* xtalk intr handler */ void *intr_arg, /* arg to intr handler */ xtalk_intr_setfunc_t setfunc, /* func to set intr hw */ void *setfunc_arg, /* arg to setfunc */ void *thread); /* intr thread to use */ extern void hub_intr_disconnect(hub_intr_t intr_hdl); extern devfs_handle_t hub_intr_cpu_get(hub_intr_t intr_hdl); /* CONFIGURATION MANAGEMENT */ extern void hub_provider_startup(devfs_handle_t hub); extern void hub_provider_shutdown(devfs_handle_t hub); #define HUB_PIO_CONVEYOR 0x1 /* PIO in conveyor belt mode */ #define HUB_PIO_FIRE_N_FORGET 0x2 /* PIO in fire-and-forget mode */ /* Flags that make sense to hub_widget_flags_set */ #define HUB_WIDGET_FLAGS ( \ HUB_PIO_CONVEYOR | \ HUB_PIO_FIRE_N_FORGET \ ) typedef int hub_widget_flags_t; /* Set the PIO mode for a widget. These two functions perform the * same operation, but hub_device_flags_set() takes a hardware graph * vertex while hub_widget_flags_set() takes a nasid and widget * number. In most cases, hub_device_flags_set() should be used. */ extern int hub_widget_flags_set(nasid_t nasid, xwidgetnum_t widget_num, hub_widget_flags_t flags); /* Depending on the flags set take the appropriate actions */ extern int hub_device_flags_set(devfs_handle_t widget_dev, hub_widget_flags_t flags); /* Error Handling. */ extern int hub_ioerror_handler(devfs_handle_t, int, int, struct io_error_s *); extern int kl_ioerror_handler(cnodeid_t, cnodeid_t, cpuid_t, int, paddr_t, caddr_t, ioerror_mode_t); extern void hub_widget_reset(devfs_handle_t, xwidgetnum_t); extern int hub_error_devenable(devfs_handle_t, int, int); extern void hub_widgetdev_enable(devfs_handle_t, int); extern void hub_widgetdev_shutdown(devfs_handle_t, int); extern int hub_dma_enabled(devfs_handle_t); #endif /* _LANGUAGE_C */ #endif /* _KERNEL */ #endif /* _ASM_SN_SN1_HUBIO_NEXT_H */