📄 xtalk.c
字号:
xtalk_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 */ return DEV_FUNC(dev, dmatrans_addr) (dev, dev_desc, paddr, byte_count, flags);}alenlist_txtalk_dmatrans_list(devfs_handle_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ alenlist_t palenlist, /* system address/length list */ unsigned flags){ /* defined in dma.h */ return DEV_FUNC(dev, dmatrans_list) (dev, dev_desc, palenlist, flags);}voidxtalk_dmamap_drain(xtalk_dmamap_t map){ DMAMAP_FUNC(map, dmamap_drain) (CAST_DMAMAP(map));}voidxtalk_dmaaddr_drain(devfs_handle_t dev, paddr_t addr, size_t size){ DEV_FUNC(dev, dmaaddr_drain) (dev, addr, size);}voidxtalk_dmalist_drain(devfs_handle_t dev, alenlist_t list){ DEV_FUNC(dev, dmalist_drain) (dev, list);}/* ===================================================================== * INTERRUPT MANAGEMENT * * Allow crosstalk devices to establish interrupts *//* * Allocate resources required for an interrupt as specified in intr_desc. * Return resource handle in intr_hdl. */xtalk_intr_txtalk_intr_alloc(devfs_handle_t dev, /* which Crosstalk device */ device_desc_t dev_desc, /* device descriptor */ devfs_handle_t owner_dev){ /* owner of this interrupt */ return (xtalk_intr_t) DEV_FUNC(dev, intr_alloc) (dev, dev_desc, owner_dev);}/* * Free resources consumed by intr_alloc. */voidxtalk_intr_free(xtalk_intr_t intr_hdl){ INTR_FUNC(intr_hdl, intr_free) (CAST_INTR(intr_hdl));}/* * Associate resources allocated with a previous xtalk_intr_alloc call with the * described handler, arg, name, etc. * * Returns 0 on success, returns <0 on failure. */intxtalk_intr_connect(xtalk_intr_t intr_hdl, /* xtalk intr resource handle */ intr_func_t intr_func, /* xtalk intr handler */ intr_arg_t 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 */ return INTR_FUNC(intr_hdl, intr_connect) (CAST_INTR(intr_hdl), intr_func, intr_arg, setfunc, setfunc_arg, thread);}/* * Disassociate handler with the specified interrupt. */voidxtalk_intr_disconnect(xtalk_intr_t intr_hdl){ INTR_FUNC(intr_hdl, intr_disconnect) (CAST_INTR(intr_hdl));}/* * Return a hwgraph vertex that represents the CPU currently * targeted by an interrupt. */devfs_handle_txtalk_intr_cpu_get(xtalk_intr_t intr_hdl){ return INTR_FUNC(intr_hdl, intr_cpu_get) (CAST_INTR(intr_hdl));}/* * ===================================================================== * ERROR MANAGEMENT *//* * xtalk_error_handler: * pass this error on to the handler registered * at the specified xtalk connecdtion point, * or complain about it here if there is no handler. * * This routine plays two roles during error delivery * to most widgets: first, the external agent (heart, * hub, or whatever) calls in with the error and the * connect point representing the crosstalk switch, * or whatever crosstalk device is directly connected * to the agent. * * If there is a switch, it will generally look at the * widget number stashed in the ioerror structure; and, * if the error came from some widget other than the * switch, it will call back into xtalk_error_handler * with the connection point of the offending port. */intxtalk_error_handler( devfs_handle_t xconn, int error_code, ioerror_mode_t mode, ioerror_t *ioerror){ xwidget_info_t xwidget_info;#if DEBUG && ERROR_DEBUG cmn_err(CE_CONT, "%v: xtalk_error_handler\n", xconn);#endif xwidget_info = xwidget_info_get(xconn); /* Make sure that xwidget_info is a valid pointer before derefencing it. * We could come in here during very early initialization. */ if (xwidget_info && xwidget_info->w_efunc) return xwidget_info->w_efunc (xwidget_info->w_einfo, error_code, mode, ioerror); /* * no error handler registered for * the offending port. it's not clear * what needs to be done, but reporting * it would be a good thing, unless it * is a mode that requires nothing. */ if ((mode == MODE_DEVPROBE) || (mode == MODE_DEVUSERERROR) || (mode == MODE_DEVREENABLE)) return IOERROR_HANDLED;#ifdef IRIX cmn_err(CE_WARN, "Xbow at %v encountered Fatal error", xconn);#endif ioerror_dump("xtalk", error_code, mode, ioerror); return IOERROR_UNHANDLED;}intxtalk_error_devenable(devfs_handle_t xconn_vhdl, int devnum, int error_code){ return DEV_FUNC(xconn_vhdl, error_devenable) (xconn_vhdl, devnum, error_code);}/* ===================================================================== * CONFIGURATION MANAGEMENT *//* * Startup a crosstalk provider */voidxtalk_provider_startup(devfs_handle_t xtalk_provider){ DEV_FUNC(xtalk_provider, provider_startup) (xtalk_provider);}/* * Shutdown a crosstalk provider */voidxtalk_provider_shutdown(devfs_handle_t xtalk_provider){ DEV_FUNC(xtalk_provider, provider_shutdown) (xtalk_provider);}/* * Enable a device on a xtalk widget */voidxtalk_widgetdev_enable(devfs_handle_t xconn_vhdl, int devnum){ DEV_FUNC(xconn_vhdl, widgetdev_enable) (xconn_vhdl, devnum);}/* * Shutdown a device on a xtalk widget */voidxtalk_widgetdev_shutdown(devfs_handle_t xconn_vhdl, int devnum){ DEV_FUNC(xconn_vhdl, widgetdev_shutdown) (xconn_vhdl, devnum);}intxtalk_dma_enabled(devfs_handle_t xconn_vhdl){ return DEV_FUNC(xconn_vhdl, dma_enabled) (xconn_vhdl);}/* * Generic crosstalk functions, for use with all crosstalk providers * and all crosstalk devices. *//****** Generic crosstalk interrupt interfaces ******/devfs_handle_txtalk_intr_dev_get(xtalk_intr_t xtalk_intr){ return (xtalk_intr->xi_dev);}xwidgetnum_txtalk_intr_target_get(xtalk_intr_t xtalk_intr){ return (xtalk_intr->xi_target);}xtalk_intr_vector_txtalk_intr_vector_get(xtalk_intr_t xtalk_intr){ return (xtalk_intr->xi_vector);}iopaddr_txtalk_intr_addr_get(struct xtalk_intr_s *xtalk_intr){ return (xtalk_intr->xi_addr);}void *xtalk_intr_sfarg_get(xtalk_intr_t xtalk_intr){ return (xtalk_intr->xi_sfarg);}intxtalk_intr_flags_get(xtalk_intr_t xtalk_intr){ return(xtalk_intr->xi_flags);}/****** Generic crosstalk pio interfaces ******/devfs_handle_txtalk_pio_dev_get(xtalk_piomap_t xtalk_piomap){ return (xtalk_piomap->xp_dev);}xwidgetnum_txtalk_pio_target_get(xtalk_piomap_t xtalk_piomap){ return (xtalk_piomap->xp_target);}iopaddr_txtalk_pio_xtalk_addr_get(xtalk_piomap_t xtalk_piomap){ return (xtalk_piomap->xp_xtalk_addr);}ulongxtalk_pio_mapsz_get(xtalk_piomap_t xtalk_piomap){ return (xtalk_piomap->xp_mapsz);}caddr_txtalk_pio_kvaddr_get(xtalk_piomap_t xtalk_piomap){ return (xtalk_piomap->xp_kvaddr);}/****** Generic crosstalk dma interfaces ******/devfs_handle_txtalk_dma_dev_get(xtalk_dmamap_t xtalk_dmamap){ return (xtalk_dmamap->xd_dev);}xwidgetnum_txtalk_dma_target_get(xtalk_dmamap_t xtalk_dmamap){ return (xtalk_dmamap->xd_target);}/****** Generic crosstalk widget information interfaces ******//* xwidget_info_chk: * check to see if this vertex is a widget; * if so, return its widget_info (if any). * if not, return NULL. */xwidget_info_txwidget_info_chk(devfs_handle_t xwidget){ arbitrary_info_t ainfo = 0; hwgraph_info_get_LBL(xwidget, INFO_LBL_XWIDGET, &ainfo); return (xwidget_info_t) ainfo;}xwidget_info_txwidget_info_get(devfs_handle_t xwidget){ xwidget_info_t widget_info; widget_info = (xwidget_info_t) hwgraph_fastinfo_get(xwidget);#ifdef IRIX if ((widget_info != NULL) && (widget_info->w_fingerprint != widget_info_fingerprint)) cmn_err(CE_PANIC, "%v bad xwidget_info", xwidget);#endif return (widget_info);}voidxwidget_info_set(devfs_handle_t xwidget, xwidget_info_t widget_info){ if (widget_info != NULL) widget_info->w_fingerprint = widget_info_fingerprint; hwgraph_fastinfo_set(xwidget, (arbitrary_info_t) widget_info); /* Also, mark this vertex as an xwidget, * and use the widget_info, so xwidget_info_chk * can work (and be fairly efficient). */ hwgraph_info_add_LBL(xwidget, INFO_LBL_XWIDGET, (arbitrary_info_t) widget_info);}devfs_handle_txwidget_info_dev_get(xwidget_info_t xwidget_info){ if (xwidget_info == NULL) panic("null xwidget_info"); return (xwidget_info->w_vertex);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -