📄 hubio_next.h
字号:
#define c_doresp ii_icrb0_c_fld_s.ic_resprqd#define c_gbr ii_icrb0_c_fld_s.ic_gbr#define c_regvalue ii_icrb0_c_regvaltypedef ii_icrb0_d_u_t icrbd_t;#define icrbd_ctxtvld ii_icrb0_d_fld_s.id_cvld#define icrbd_toutvld ii_icrb0_d_fld_s.id_tvld#define icrbd_context ii_icrb0_d_fld_s.id_context#define d_regvalue ii_icrb0_d_regval#endif /* LANGUAGE_C *//* Number of widgets supported by hub */#define HUB_NUM_WIDGET 9#define HUB_WIDGET_ID_MIN 0x8#define HUB_WIDGET_ID_MAX 0xf#define HUB_WIDGET_PART_NUM 0xc110#define MAX_HUBS_PER_XBOW 2#ifdef _LANGUAGE_C/* A few more #defines for backwards compatibility */#define iprb_t ii_iprb0_u_t#define iprb_regval ii_iprb0_regval#define iprb_mult_err ii_iprb0_fld_s.i_mult_err#define iprb_spur_rd ii_iprb0_fld_s.i_spur_rd#define iprb_spur_wr ii_iprb0_fld_s.i_spur_wr#define iprb_rd_to ii_iprb0_fld_s.i_rd_to#define iprb_ovflow ii_iprb0_fld_s.i_of_cnt#define iprb_error ii_iprb0_fld_s.i_error#define iprb_ff ii_iprb0_fld_s.i_f#define iprb_mode ii_iprb0_fld_s.i_m#define iprb_bnakctr ii_iprb0_fld_s.i_nb#define iprb_anakctr ii_iprb0_fld_s.i_na#define iprb_xtalkctr ii_iprb0_fld_s.i_c#endif#define LNK_STAT_WORKING 0x2#define IIO_WSTAT_ECRAZY (1ULL << 32) /* Hub gone crazy */#define IIO_WSTAT_TXRETRY (1ULL << 9) /* Hub Tx Retry timeout */#define IIO_WSTAT_TXRETRY_MASK (0x7F) /* should be 0xFF?? */#define IIO_WSTAT_TXRETRY_SHFT (16)#define IIO_WSTAT_TXRETRY_CNT(w) (((w) >> 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 <asm/sn/alenlist.h>#include <asm/sn/dmamap.h>#include <asm/sn/iobus.h>#include <asm/sn/xtalk/xtalk.h>/* 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_ENDIANtypedef 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;#elsetypedef 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 iiperformance registers *//* io_perf_sel allows the caller to specify what tests will be performed */#ifdef LITTLE_ENDIANtypedef 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;#elsetypedef 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_ENDIANtypedef 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;#elsetypedef 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_ENDIANtypedef 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;#elsetypedef 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_thub_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_thub_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 voidhub_piomap_done(hub_piomap_t hub_piomap);extern caddr_thub_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_thub_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 voidhub_dmamap_free(hub_dmamap_t dmamap);extern iopaddr_thub_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_thub_dmamap_list( hub_dmamap_t dmamap, /* use mapping resources */ alenlist_t alenlist, /* map this Addr/Length List */ unsigned flags);extern voidhub_dmamap_done( hub_dmamap_t dmamap); /* done w/ mapping resources */extern iopaddr_thub_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_thub_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 voidhub_dmamap_drain( hub_dmamap_t map);extern voidhub_dmaaddr_drain( devfs_handle_t vhdl, paddr_t addr, size_t bytes);extern voidhub_dmalist_drain( devfs_handle_t vhdl, alenlist_t list);/* INTERRUPT MANAGEMENT */typedef struct hub_intr_s *hub_intr_t;extern hub_intr_thub_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_thub_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 voidhub_intr_free(hub_intr_t intr_hdl);extern inthub_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 voidhub_intr_disconnect(hub_intr_t intr_hdl);extern devfs_handle_thub_intr_cpu_get(hub_intr_t intr_hdl);/* CONFIGURATION MANAGEMENT */extern voidhub_provider_startup(devfs_handle_t hub);extern voidhub_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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -