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

📄 ml_iograph.c

📁 广州斯道2410普及版II的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		}		npda_rip = npda_rip->router_next;	}	/*	 * Read mfg info on this hub	 */#ifdef LATER	printk("io_init_node: FIXME need to implement HUB_VERTEX_MFG_INFO\n");	HUB_VERTEX_MFG_INFO(hubv);#endif /* LATER */	/* 	 * If nothing connected to this hub's xtalk port, we're done.	 */	early_probe_for_widget(hubv, &hwid);	if (hwid.part_num == XWIDGET_PART_NUM_NONE) {#ifdef PROBE_TEST		if ((cnodeid == 1) || (cnodeid == 2)) {			int index;			for (index = 0; index < 600; index++)				DBG("Interfering with device probing!!!\n");		}#endif		/* io_init_done takes cpu cookie as 2nd argument 		 * to do a restorenoderun for the setnoderun done 		 * at the start of this thread 		 */				DBG("**** io_init_node: Node's 0x%p hub widget has XWIDGET_PART_NUM_NONE ****\n", hubv);		return;		/* NOTREACHED */	}	/* 	 * attach our hub_provider information to hubv,	 * so we can use it as a crosstalk provider "master"	 * vertex.	 */	xtalk_provider_register(hubv, &hub_provider);	xtalk_provider_startup(hubv);	/*	 * Create a vertex to represent the crosstalk bus	 * attached to this hub, and a vertex to be used	 * as the connect point for whatever is out there	 * on the other side of our crosstalk connection.	 *	 * Crosstalk Switch drivers "climb up" from their	 * connection point to try and take over the switch	 * point.	 *	 * Of course, the edges and verticies may already	 * exist, in which case our net effect is just to	 * associate the "xtalk_" driver with the connection	 * point for the device.	 */	(void)hwgraph_path_add(hubv, EDGE_LBL_XTALK, &switchv);	DBG("io_init_node: Created 'xtalk' entry to '../node/' xtalk vertex 0x%p\n", switchv);	ASSERT(switchv != GRAPH_VERTEX_NONE);	(void)hwgraph_edge_add(hubv, switchv, EDGE_LBL_IO);	DBG("io_init_node: Created symlink 'io' from ../node/io to ../node/xtalk \n");	/*	 * We need to find the widget id and update the basew_id field	 * accordingly. In particular, SN00 has direct connected bridge,	 * and hence widget id is Not 0.	 */	widget_partnum = (((*(volatile int32_t *)(NODE_SWIN_BASE(COMPACT_TO_NASID_NODEID(cnodeid), 0) + WIDGET_ID))) & WIDGET_PART_NUM) >> WIDGET_PART_NUM_SHFT;	if (widget_partnum == BRIDGE_WIDGET_PART_NUM ||				widget_partnum == XBRIDGE_WIDGET_PART_NUM){		npdap->basew_id = (((*(volatile int32_t *)(NODE_SWIN_BASE(COMPACT_TO_NASID_NODEID(cnodeid), 0) + BRIDGE_WID_CONTROL))) & WIDGET_WIDGET_ID);		DBG("io_init_node: Found XBRIDGE widget_partnum= 0x%x\n", widget_partnum);	} else if (widget_partnum == XBOW_WIDGET_PART_NUM ||				widget_partnum == XXBOW_WIDGET_PART_NUM) {		/* 		 * Xbow control register does not have the widget ID field.		 * So, hard code the widget ID to be zero.		 */		DBG("io_init_node: Found XBOW widget_partnum= 0x%x\n", widget_partnum);		npdap->basew_id = 0;#if defined(BRINGUP)	} else if (widget_partnum == XG_WIDGET_PART_NUM) {		/* 		 * OK, WTF do we do here if we have an XG direct connected to a HUB/Bedrock???		 * So, hard code the widget ID to be zero?		 */		npdap->basew_id = 0;		npdap->basew_id = (((*(volatile int32_t *)(NODE_SWIN_BASE(COMPACT_TO_NASID_NODEID(cnodeid), 0) + BRIDGE_WID_CONTROL))) & WIDGET_WIDGET_ID);#endif	} else { 		npdap->basew_id = (((*(volatile int32_t *)(NODE_SWIN_BASE(COMPACT_TO_NASID_NODEID(cnodeid), 0) + BRIDGE_WID_CONTROL))) & WIDGET_WIDGET_ID);		panic(" ****io_init_node: Unknown Widget Part Number 0x%x Widgt ID 0x%x attached to Hubv 0x%p ****\n", widget_partnum, npdap->basew_id, hubv);		/*NOTREACHED*/	}	{		char widname[10];		sprintf(widname, "%x", npdap->basew_id);		(void)hwgraph_path_add(switchv, widname, &widgetv);		DBG("io_init_node: Created '%s' to '..node/xtalk/' vertex 0x%p\n", widname, widgetv);		ASSERT(widgetv != GRAPH_VERTEX_NONE);	}		nodepda->basew_xc = widgetv;	is_xswitch = xwidget_hwid_is_xswitch(&hwid);	/* 	 * Try to become the master of the widget.  If this is an xswitch	 * with multiple hubs connected, only one will succeed.  Mastership	 * of an xswitch is used only when touching registers on that xswitch.	 * The slave xwidgets connected to the xswitch can be owned by various	 * masters.	 */	if (device_master_set(widgetv, hubv) == 0) {		/* Only one hub (thread) per Crosstalk device or switch makes		 * it to here.		 */		/* 		 * Initialize whatever xwidget is hanging off our hub.		 * Whatever it is, it's accessible through widgetnum 0.		 */		hubinfo_get(hubv, &hubinfo);		(void)xwidget_register(&hwid, widgetv, npdap->basew_id, hubv, hubinfo->h_widgetid, NULL);		if (!is_xswitch) {			/* io_init_done takes cpu cookie as 2nd argument 			 * to do a restorenoderun for the setnoderun done 			 * at the start of this thread 			 */			io_init_done(cnodeid,c);			/* NOTREACHED */		}		/* 		 * Special handling for Crosstalk Switches (e.g. xbow).		 * We need to do things in roughly the following order:		 *	1) Initialize xswitch hardware (done above)		 *	2) Determine which hubs are available to be widget masters		 *	3) Discover which links are active from the xswitch		 *	4) Assign xwidgets hanging off the xswitch to hubs		 *	5) Initialize all xwidgets on the xswitch		 */		volunteer_for_widgets(switchv, hubv);		/* If there's someone else on this crossbow, recognize him */		if (npdap->xbow_peer != INVALID_NASID) {			nodepda_t *peer_npdap = NODEPDA(NASID_TO_COMPACT_NODEID(npdap->xbow_peer));			peer_sema = &peer_npdap->xbow_sema;			volunteer_for_widgets(switchv, peer_npdap->node_vertex);		}		assign_widgets_to_volunteers(switchv, hubv);		/* Signal that we're done */		if (peer_sema) {			mutex_unlock(peer_sema);		}			}	else {	    /* Wait 'til master is done assigning widgets. */	    mutex_lock(&npdap->xbow_sema);	}#ifdef PROBE_TEST	if ((cnodeid == 1) || (cnodeid == 2)) {		int index;		for (index = 0; index < 500; index++)			DBG("Interfering with device probing!!!\n");	}#endif	/* Now both nodes can safely inititialize widgets */	io_init_xswitch_widgets(switchv, cnodeid);	io_link_xswitch_widgets(switchv, cnodeid);	/* io_init_done takes cpu cookie as 2nd argument 	 * to do a restorenoderun for the setnoderun done 	 * at the start of this thread 	 */	io_init_done(cnodeid,c);	DBG("\nio_init_node: DONE INITIALIZED ALL I/O FOR CNODEID %d\n\n", cnodeid);}#define IOINIT_STKSZ	(16 * 1024)#define __DEVSTR1 	"/../.master/"#define __DEVSTR2 	"/target/"#define __DEVSTR3 	"/lun/0/disk/partition/"#define	__DEVSTR4	"/../ef"#if CONFIG_SGI_IP35 || CONFIG_IA64_SGI_SN1 || CONFIG_IA64_GENERIC/* * Currently, we need to allow for 5 IBrick slots with 1 FC each * plus an internal 1394. * * ioconfig starts numbering SCSI's at NUM_BASE_IO_SCSI_CTLR. */#define NUM_BASE_IO_SCSI_CTLR 6#endif/* * This tells ioconfig where it can start numbering scsi controllers. * Below this base number, platform-specific handles the numbering. * XXX Irix legacy..controller numbering should be part of devfsd's job */int num_base_io_scsi_ctlr = 2; /* used by syssgi */devfs_handle_t		base_io_scsi_ctlr_vhdl[NUM_BASE_IO_SCSI_CTLR];static devfs_handle_t	baseio_enet_vhdl,baseio_console_vhdl;/* * Put the logical controller number information in the  * scsi controller vertices for each scsi controller that * is in a "fixed position". */static voidscsi_ctlr_nums_add(devfs_handle_t pci_vhdl){	{		int i;		num_base_io_scsi_ctlr = NUM_BASE_IO_SCSI_CTLR;		/* Initialize base_io_scsi_ctlr_vhdl array */		for (i=0; i<NUM_BASE_IO_SCSI_CTLR; i++)			base_io_scsi_ctlr_vhdl[i] = GRAPH_VERTEX_NONE;	}#if CONFIG_SGI_IP35 || CONFIG_IA64_SGI_SN1 || CONFIG_IA64_GENERIC	{	/*	 * May want to consider changing the SN0 code, above, to work more like	 * the way this works.	 */	devfs_handle_t base_ibrick_xbridge_vhdl;	devfs_handle_t base_ibrick_xtalk_widget_vhdl;	devfs_handle_t scsi_ctlr_vhdl;	int i;	graph_error_t rv;	/*	 * This is a table of "well-known" SCSI controllers and their well-known	 * controller numbers.  The names in the table start from the base IBrick's	 * Xbridge vertex, so the first component is the xtalk widget number.	 */	static struct {		char	*base_ibrick_scsi_path;		int	controller_number;	} hardwired_scsi_controllers[] = {		{"15/" EDGE_LBL_PCI "/1/" EDGE_LBL_SCSI_CTLR "/0", 0},		{"15/" EDGE_LBL_PCI "/2/" EDGE_LBL_SCSI_CTLR "/0", 1},		{"15/" EDGE_LBL_PCI "/3/" EDGE_LBL_SCSI_CTLR "/0", 2},		{"14/" EDGE_LBL_PCI "/1/" EDGE_LBL_SCSI_CTLR "/0", 3},		{"14/" EDGE_LBL_PCI "/2/" EDGE_LBL_SCSI_CTLR "/0", 4},		{"15/" EDGE_LBL_PCI "/6/ohci/0/" EDGE_LBL_SCSI_CTLR "/0", 5},		{NULL, -1} /* must be last */	};	base_ibrick_xtalk_widget_vhdl = hwgraph_connectpt_get(pci_vhdl);	ASSERT_ALWAYS(base_ibrick_xtalk_widget_vhdl != GRAPH_VERTEX_NONE);	base_ibrick_xbridge_vhdl = hwgraph_connectpt_get(base_ibrick_xtalk_widget_vhdl);	ASSERT_ALWAYS(base_ibrick_xbridge_vhdl != GRAPH_VERTEX_NONE);	hwgraph_vertex_unref(base_ibrick_xtalk_widget_vhdl);	/*	 * Iterate through the list of well-known SCSI controllers.	 * For each controller found, set it's controller number according	 * to the table.	 */	for (i=0; hardwired_scsi_controllers[i].base_ibrick_scsi_path != NULL; i++) {		rv = hwgraph_path_lookup(base_ibrick_xbridge_vhdl,			hardwired_scsi_controllers[i].base_ibrick_scsi_path, &scsi_ctlr_vhdl, NULL);		if (rv != GRAPH_SUCCESS) /* No SCSI at this path */			continue;		ASSERT(hardwired_scsi_controllers[i].controller_number < NUM_BASE_IO_SCSI_CTLR);		base_io_scsi_ctlr_vhdl[hardwired_scsi_controllers[i].controller_number] = scsi_ctlr_vhdl;		device_controller_num_set(scsi_ctlr_vhdl, hardwired_scsi_controllers[i].controller_number);		hwgraph_vertex_unref(scsi_ctlr_vhdl); /* (even though we're actually keeping a reference) */	}	hwgraph_vertex_unref(base_ibrick_xbridge_vhdl);	}#else#pragma error Bomb!#endif}#include <asm/sn/ioerror_handling.h>extern devfs_handle_t 	ioc3_console_vhdl_get(void);devfs_handle_t		sys_critical_graph_root = GRAPH_VERTEX_NONE;/* Define the system critical vertices and connect them through * a canonical parent-child relationships for easy traversal * during io error handling. */static voidsys_critical_graph_init(void){	devfs_handle_t		bridge_vhdl,master_node_vhdl;	devfs_handle_t  		xbow_vhdl = GRAPH_VERTEX_NONE;	extern devfs_handle_t	hwgraph_root;	devfs_handle_t		pci_slot_conn;	int			slot;	devfs_handle_t		baseio_console_conn;	DBG("sys_critical_graph_init: FIXME.\n");	baseio_console_conn = hwgraph_connectpt_get(baseio_console_vhdl);	if (baseio_console_conn == NULL) {		return;	}	/* Get the vertex handle for the baseio bridge */	bridge_vhdl = device_master_get(baseio_console_conn);	/* Get the master node of the baseio card */	master_node_vhdl = cnodeid_to_vertex(				master_node_get(baseio_console_vhdl));		/* Add the "root->node" part of the system critical graph */	sys_critical_graph_vertex_add(hwgraph_root,master_node_vhdl);	/* Check if we have a crossbow */	if (hwgraph_traverse(master_node_vhdl,			     EDGE_LBL_XTALK"/0",			     &xbow_vhdl) == GRAPH_SUCCESS) {		/* We have a crossbow.Add "node->xbow" part of the system 		 * critical graph.		 */		sys_critical_graph_vertex_add(master_node_vhdl,xbow_vhdl);				/* Add "xbow->baseio bridge" of the system critical graph */		sys_critical_graph_vertex_add(xbow_vhdl,bridge_vhdl);		hwgraph_vertex_unref(xbow_vhdl);	} else 		/* We donot have a crossbow. Add "node->baseio_bridge"		 * part of the system critical graph.		 */		sys_critical_graph_vertex_add(master_node_vhdl,bridge_vhdl);	/* Add all the populated PCI slot vertices to the system critical	 * graph with the bridge vertex as the parent.	 */	for (slot = 0 ; slot < 8; slot++) {		char	slot_edge[10];		sprintf(slot_edge,"%d",slot);		if (hwgraph_traverse(bridge_vhdl,slot_edge, &pci_slot_conn)		    != GRAPH_SUCCESS)			continue;		sys_critical_graph_vertex_add(bridge_vhdl,pci_slot_conn);		hwgraph_vertex_unref(pci_slot_conn);	}	hwgraph_vertex_unref(bridge_vhdl);	/* Add the "ioc3 pci connection point  -> console ioc3" part 	 * of the system critical graph	 */	if (hwgraph_traverse(baseio_console_vhdl,"..",&pci_slot_conn) ==	    GRAPH_SUCCESS) {		sys_critical_graph_vertex_add(pci_slot_conn, 					      baseio_console_vhdl);		hwgraph_vertex_unref(pci_slot_conn);	}	/* Add the "ethernet pci connection point  -> base ethernet" part of 	 * the system  critical graph	 */	if (hwgraph_traverse(baseio_enet_vhdl,"..",&pci_slot_conn) ==	    GRAPH_SUCCESS) {		sys_critical_graph_vertex_add(pci_slot_conn, 					      baseio_enet_vhdl);		hwgraph_vertex_unref(pci_slot_conn);	}	/* Add the "scsi controller pci connection point  -> base scsi 	 * controller" part of the system critical graph	 */	if (hwgraph_traverse(base_io_scsi_ctlr_vhdl[0],			     "../..",&pci_slot_conn) == GRAPH_SUCCESS) {		sys_critical_graph_vertex_add(pci_slot_conn, 					      base_io_scsi_ctlr_vhdl[0]);		hwgraph_vertex_unref(pci_slot_conn);	}	if (hwgraph_traverse(base_io_scsi_ctlr_vhdl[1],			     "../..",&pci_slot_conn) == GRAPH_SUCCESS) {		sys_critical_graph_vertex_add(pci_slot_conn, 					      base_io_scsi_ctlr_vhdl[1]);

⌨️ 快捷键说明

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