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

📄 ml_iograph.c

📁 嵌入式系统设计与实例开发实验教材二源码 多线程应用程序设计 串行端口程序设计 AD接口实验 CAN总线通信实验 GPS通信实验 Linux内核移植与编译实验 IC卡读写实验 SD驱动使
💻 C
📖 第 1 页 / 共 4 页
字号:
}/* * io_xswitch_widget_init *	 *//* defined in include/linux/ctype.h  *//* #define toupper(c)	(islower(c) ? (c) - 'a' + 'A' : (c)) */voidio_xswitch_widget_init(devfs_handle_t  	xswitchv,		       devfs_handle_t	hubv,		       xwidgetnum_t	widgetnum,		       async_attach_t	aa){	xswitch_info_t		xswitch_info;	xwidgetnum_t		hub_widgetid;	devfs_handle_t		widgetv;	cnodeid_t		cnode;	widgetreg_t		widget_id;	nasid_t			nasid, peer_nasid;	struct xwidget_hwid_s 	hwid;	hubinfo_t		hubinfo;	/*REFERENCED*/	int			rc;	char			slotname[SLOTNUM_MAXLENGTH];	char 			pathname[128];	char			new_name[64];	moduleid_t		module;	slotid_t		slot;	lboard_t		*board = NULL;	char			buffer[16];		DBG("\nio_xswitch_widget_init: hubv 0x%p, xswitchv 0x%p, widgetnum 0x%x\n", hubv, xswitchv, widgetnum);	/*	 * Verify that xswitchv is indeed an attached xswitch.	 */	xswitch_info = xswitch_info_get(xswitchv);	ASSERT(xswitch_info != NULL);	hubinfo_get(hubv, &hubinfo);	nasid = hubinfo->h_nasid;	cnode = NASID_TO_COMPACT_NODEID(nasid);	hub_widgetid = hubinfo->h_widgetid;	/* Who's the other guy on out crossbow (if anyone) */	peer_nasid = NODEPDA(cnode)->xbow_peer;	if (peer_nasid == INVALID_NASID)		/* If I don't have a peer, use myself. */		peer_nasid = nasid;	/* Check my xbow structure and my peer's */	if (!xbow_port_io_enabled(nasid, widgetnum) &&	    !xbow_port_io_enabled(peer_nasid, widgetnum)) {		return;	}	if (xswitch_info_link_ok(xswitch_info, widgetnum)) {		char			name[4];		/*		 * If the current hub is not supposed to be the master 		 * for this widgetnum, then skip this widget.		 */		if (xswitch_info_master_assignment_get(xswitch_info,						       widgetnum) != hubv) {			return;		}		module  = NODEPDA(cnode)->module_id;#ifdef XBRIDGE_REGS_SIM		/* hardwire for now...could do this with something like:		 * xbow_soft_t soft = hwgraph_fastinfo_get(vhdl);		 * xbow_t xbow = soft->base;		 * xbowreg_t xwidget_id = xbow->xb_wid_id;		 * but I don't feel like figuring out vhdl right now..		 * and I know for a fact the answer is 0x2d000049 		 */		DBG("io_xswitch_widget_init: XBRIDGE_REGS_SIM FIXME: reading xwidget id: hardwired to xbridge (0x2d000049).\n");		DBG("XWIDGET_PART_NUM(0x2d000049)= 0x%x\n", XWIDGET_PART_NUM(0x2d000049));		if (XWIDGET_PART_NUM(0x2d000049)==XXBOW_WIDGET_PART_NUM) {#else		if (nasid_has_xbridge(nasid)) {#endif /* XBRIDGE_REGS_SIM */			board = find_lboard_module_class(				(lboard_t *)KL_CONFIG_INFO(nasid),				module,				KLTYPE_IOBRICK);DBG("io_xswitch_widget_init: Board 0x%p\n", board);{		lboard_t dummy;			if (board) {				DBG("io_xswitch_widget_init: Found KLTYPE_IOBRICK Board 0x%p brd_type 0x%x\n", board, board->brd_type);			} else {				DBG("io_xswitch_widget_init: FIXME did not find IOBOARD\n");				board = &dummy;			}				}			/*			 * BRINGUP	 		 * Make sure we really want to say xbrick, pbrick,			 * etc. rather than XIO, graphics, etc.	 		 */#ifdef SUPPORT_PRINTING_M_FORMAT			sprintf(pathname, EDGE_LBL_MODULE "/%M/"				"%cbrick" "/%s/%d",				NODEPDA(cnode)->module_id,				#else			memset(buffer, 0, 16);			format_module_id(buffer, NODEPDA(cnode)->module_id, MODULE_FORMAT_BRIEF);			sprintf(pathname, EDGE_LBL_MODULE "/%s/"				"%cbrick" "/%s/%d",				buffer,#endif#ifdef BRINGUP				(board->brd_type == KLTYPE_IBRICK) ? 'I' :				(board->brd_type == KLTYPE_PBRICK) ? 'P' :				(board->brd_type == KLTYPE_XBRICK) ? 'X' : '?',#else				toupper(MODULE_GET_BTCHAR(NODEPDA(cnode)->module_id)),#endif /* BRINGUP */				EDGE_LBL_XTALK, widgetnum);		} 				DBG("io_xswitch_widget_init: path= %s\n", pathname);		rc = hwgraph_path_add(hwgraph_root, pathname, &widgetv);				ASSERT(rc == GRAPH_SUCCESS);		/* This is needed to let the user programs to map the		 * module,slot numbers to the corresponding widget numbers		 * on the crossbow.		 */		rc = device_master_set(hwgraph_connectpt_get(widgetv), hubv);		/* If we are looking at the global master io6		 * then add information about the version of		 * the io6prom as a part of "detailed inventory"		 * information.		 */		if (is_master_baseio(nasid,				     NODEPDA(cnode)->module_id,#ifdef BRINGUP 				     get_widget_slotnum(0,widgetnum))) {#else	<<< BOMB! >>> Need a new way to get slot numbers on IP35/IP37#endif			extern void klhwg_baseio_inventory_add(devfs_handle_t,							       cnodeid_t);			module 	= NODEPDA(cnode)->module_id;#ifdef XBRIDGE_REGS_SIM			DBG("io_xswitch_widget_init: XBRIDGE_REGS_SIM FIXME: reading xwidget id: hardwired to xbridge (0x2d000049).\n");			if (XWIDGET_PART_NUM(0x2d000049)==XXBOW_WIDGET_PART_NUM) {#else			if (nasid_has_xbridge(nasid)) {#endif /* XBRIDGE_REGS_SIM */				board = find_lboard_module(					(lboard_t *)KL_CONFIG_INFO(nasid),					module);				/*			 	 * BRINGUP				 * Change iobrick to correct i/o brick				 */#ifdef SUPPORT_PRINTING_M_FORMAT				sprintf(pathname, EDGE_LBL_MODULE "/%M/"#else				sprintf(pathname, EDGE_LBL_MODULE "/%x/"#endif					"iobrick" "/%s/%d",					NODEPDA(cnode)->module_id,					EDGE_LBL_XTALK, widgetnum);			} else {#ifdef BRINGUP				slot = get_widget_slotnum(0, widgetnum);#else	<<< BOMB! Need a new way to get slot numbers on IP35/IP37#endif				board = get_board_name(nasid, module, slot,								new_name);				/*			 	 * Create the vertex for the widget, 				 * using the decimal 			 	 * widgetnum as the name of the primary edge.			 	 */#ifdef SUPPORT_PRINTING_M_FORMAT				sprintf(pathname, EDGE_LBL_MODULE "/%M/"                                                EDGE_LBL_SLOT "/%s/%s",                                        NODEPDA(cnode)->module_id,                                        slotname, new_name);#else				memset(buffer, 0, 16);				format_module_id(buffer, NODEPDA(cnode)->module_id, MODULE_FORMAT_BRIEF);				sprintf(pathname, EDGE_LBL_MODULE "/%s/"					  	EDGE_LBL_SLOT "/%s/%s",					buffer,					slotname, new_name);#endif			}			rc = hwgraph_path_add(hwgraph_root, pathname, &widgetv);			DBG("io_xswitch_widget_init: (2) path= %s\n", pathname);		        /*		         * This is a weird ass code needed for error injection		         * purposes.		         */		        rc = device_master_set(hwgraph_connectpt_get(widgetv), hubv);						klhwg_baseio_inventory_add(widgetv,cnode);		}		sprintf(name, "%d", widgetnum);		DBG("io_xswitch_widget_init: FIXME hwgraph_edge_add %s xswitchv 0x%p, widgetv 0x%p\n", name, xswitchv, widgetv);		rc = hwgraph_edge_add(xswitchv, widgetv, name);				/*		 * crosstalk switch code tracks which		 * widget is attached to each link.		 */		xswitch_info_vhdl_set(xswitch_info, widgetnum, widgetv);				/*		 * Peek at the widget to get its crosstalk part and		 * mfgr numbers, then present it to the generic xtalk		 * bus provider to have its driver attach routine		 * called (or not).		 */#ifdef XBRIDGE_REGS_SIM		widget_id = 0x2d000049;		DBG("io_xswitch_widget_init: XBRIDGE_REGS_SIM FIXME: id hardwired to widget_id\n");#else		widget_id = XWIDGET_ID_READ(nasid, widgetnum);#endif /* XBRIDGE_REGS_SIM */		hwid.part_num = XWIDGET_PART_NUM(widget_id);		hwid.rev_num = XWIDGET_REV_NUM(widget_id);		hwid.mfg_num = XWIDGET_MFG_NUM(widget_id);		/* Store some inventory information about		 * the xwidget in the hardware graph.		 */		xwidget_inventory_add(widgetv,board,hwid);				(void)xwidget_register(&hwid, widgetv, widgetnum,				       hubv, hub_widgetid,				       aa);#ifdef	SN0_USE_BTE		bte_bpush_war(cnode, (void *)board);#endif	}}static voidio_init_xswitch_widgets(devfs_handle_t xswitchv, cnodeid_t cnode){	xwidgetnum_t		widgetnum;	async_attach_t          aa;	aa = async_attach_new();		DBG("io_init_xswitch_widgets: xswitchv 0x%p for cnode %d\n", xswitchv, cnode);	for (widgetnum = HUB_WIDGET_ID_MIN; widgetnum <= HUB_WIDGET_ID_MAX; 	     widgetnum++) {		io_xswitch_widget_init(xswitchv,				       cnodeid_to_vertex(cnode),				       widgetnum, aa);	}	/* 	 * Wait for parallel attach threads, if any, to complete.	 */	async_attach_waitall(aa);	async_attach_free(aa);}/* * For each PCI bridge connected to the xswitch, add a link from the * board's klconfig info to the bridge's hwgraph vertex.  This lets * the FRU analyzer find the bridge without traversing the hardware * graph and risking hangs. */static voidio_link_xswitch_widgets(devfs_handle_t xswitchv, cnodeid_t cnodeid){	xwidgetnum_t		widgetnum;	char 			pathname[128];	devfs_handle_t		vhdl;	nasid_t			nasid, peer_nasid;	lboard_t		*board;	/* And its connected hub's nasids */	nasid = COMPACT_TO_NASID_NODEID(cnodeid);	peer_nasid = NODEPDA(cnodeid)->xbow_peer;	/* 	 * Look for paths matching "<widgetnum>/pci" under xswitchv.	 * For every widget, init. its lboard's hwgraph link.  If the	 * board has a PCI bridge, point the link to it.	 */	for (widgetnum = HUB_WIDGET_ID_MIN; widgetnum <= HUB_WIDGET_ID_MAX;		 widgetnum++) {		sprintf(pathname, "%d", widgetnum);		if (hwgraph_traverse(xswitchv, pathname, &vhdl) !=		    GRAPH_SUCCESS)			continue;#if defined (CONFIG_SGI_IP35) || defined (CONFIG_IA64_SGI_SN1) || defined (CONFIG_IA64_GENERIC)		board = find_lboard_module((lboard_t *)KL_CONFIG_INFO(nasid),				NODEPDA(cnodeid)->module_id);#else		{		slotid_t	slot;		slot = get_widget_slotnum(xbow_num, widgetnum);		board = find_lboard_modslot((lboard_t *)KL_CONFIG_INFO(nasid),				    NODEPDA(cnodeid)->module_id, slot);		}#endif /* CONFIG_SGI_IP35 || CONFIG_IA64_SGI_SN1 */		if (board == NULL && peer_nasid != INVALID_NASID) {			/*			 * Try to find the board on our peer			 */#if defined (CONFIG_SGI_IP35) || defined (CONFIG_IA64_SGI_SN1) || defined (CONFIG_IA64_GENERIC)			board = find_lboard_module(				(lboard_t *)KL_CONFIG_INFO(peer_nasid),				NODEPDA(cnodeid)->module_id);#else			board = find_lboard_modslot((lboard_t *)KL_CONFIG_INFO(peer_nasid),						    NODEPDA(cnodeid)->module_id, slot);#endif /* CONFIG_SGI_IP35 || CONFIG_IA64_SGI_SN1 */		}		if (board == NULL) {#if defined(SUPPORT_PRINTING_V_FORMAT)			PRINT_WARNING("Could not find PROM info for vertex %v, "				"FRU analyzer may fail",				vhdl);#else			PRINT_WARNING("Could not find PROM info for vertex 0x%x, "				"FRU analyzer may fail",				vhdl);#endif			return;		}		sprintf(pathname, "%d/"EDGE_LBL_PCI, widgetnum);		if (hwgraph_traverse(xswitchv, pathname, &vhdl) == 		    GRAPH_SUCCESS)			board->brd_graph_link = vhdl;		else			board->brd_graph_link = GRAPH_VERTEX_NONE;	}}/* * Initialize all I/O on the specified node. */static voidio_init_node(cnodeid_t cnodeid){	/*REFERENCED*/	devfs_handle_t hubv, switchv, widgetv;	struct xwidget_hwid_s hwid;	hubinfo_t hubinfo;	int is_xswitch;	nodepda_t	*npdap;	struct semaphore *peer_sema = 0;	uint32_t	widget_partnum;	nodepda_router_info_t *npda_rip;	cpu_cookie_t	c = 0;	extern int hubdev_docallouts(devfs_handle_t);#ifdef LATER	/* Try to execute on the node that we're initializing. */	c = setnoderun(cnodeid);#endif	npdap = NODEPDA(cnodeid);	/*	 * Get the "top" vertex for this node's hardware	 * graph; it will carry the per-hub hub-specific	 * data, and act as the crosstalk provider master.	 * It's canonical path is probably something of the	 * form /hw/module/%M/slot/%d/node	 */	hubv = cnodeid_to_vertex(cnodeid);	DBG("io_init_node: Initialize IO for cnode %d hubv(node) 0x%p npdap 0x%p\n", cnodeid, hubv, npdap);	ASSERT(hubv != GRAPH_VERTEX_NONE);	hubdev_docallouts(hubv);	/*	 * Set up the dependent routers if we have any.	 */	npda_rip = npdap->npda_rip_first;	while(npda_rip) {		/* If the router info has not been initialized		 * then we need to do the router initialization		 */		if (!npda_rip->router_infop) {			router_init(cnodeid,0,npda_rip);

⌨️ 快捷键说明

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