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

📄 klgraph.c

📁 一个2.4.21版本的嵌入式linux内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id$ * * 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-2002 Silicon Graphics, Inc. All rights reserved. *//* * klgraph.c- *      This file specifies the interface between the kernel and the PROM's *      configuration data structures. */#include <linux/types.h>#include <linux/slab.h>#include <asm/sn/sgi.h>#include <asm/sn/sn_sal.h>#include <asm/sn/io.h>#include <asm/sn/iograph.h>#include <asm/sn/invent.h>#include <asm/sn/hcl.h>#include <asm/sn/labelcl.h>#include <asm/sn/kldir.h>#include <asm/sn/gda.h> #include <asm/sn/klconfig.h>#include <asm/sn/router.h>#include <asm/sn/xtalk/xbow.h>#include <asm/sn/hcl_util.h>/* #define KLGRAPH_DEBUG 1 */#ifdef KLGRAPH_DEBUG#define GRPRINTF(x)	printk x#define CE_GRPANIC	CE_PANIC#else#define GRPRINTF(x)#define CE_GRPANIC	CE_PANIC#endif#include <asm/sn/sn_private.h>extern char arg_maxnodes[];extern u64 klgraph_addr[];/* * Support for verbose inventory via hardware graph.  * klhwg_invent_alloc allocates the necessary size of inventory information * and fills in the generic information. */invent_generic_t *klhwg_invent_alloc(cnodeid_t cnode, int class, int size){	invent_generic_t *invent;	invent = kern_malloc(size);	if (!invent) return NULL;		invent->ig_module = NODE_MODULEID(cnode);	invent->ig_slot = SLOTNUM_GETSLOT(NODE_SLOTID(cnode));	invent->ig_invclass = class;	return invent;}/* * Add detailed disabled cpu inventory info to the hardware graph. */voidklhwg_disabled_cpu_invent_info(devfs_handle_t cpuv,                               cnodeid_t cnode,                               klcpu_t *cpu, slotid_t slot){	invent_cpuinfo_t *cpu_invent;	diag_inv_t       *diag_invent;	cpu_invent = (invent_cpuinfo_t *)	klhwg_invent_alloc(cnode, INV_PROCESSOR, sizeof(invent_cpuinfo_t));	if (!cpu_invent)		return;	/* Diag information on this processor */	diag_invent = (diag_inv_t *)	klhwg_invent_alloc(cnode, INV_CPUDIAGVAL, sizeof(diag_inv_t));	if (!diag_invent)		return;	/* Disabled CPU */	cpu_invent->ic_gen.ig_flag = 0x0;	cpu_invent->ic_gen.ig_slot = slot;	cpu_invent->ic_cpu_info.cpuflavor = cpu->cpu_prid;	cpu_invent->ic_cpu_info.cpufq = cpu->cpu_speed;	cpu_invent->ic_cpu_info.sdfreq = cpu->cpu_scachespeed;	cpu_invent->ic_cpu_info.sdsize = cpu->cpu_scachesz;	cpu_invent->ic_cpuid = cpu->cpu_info.virtid;	cpu_invent->ic_slice = cpu->cpu_info.physid;	/* Disabled CPU label */	hwgraph_info_add_LBL(cpuv, INFO_LBL_DETAIL_INVENT,			(arbitrary_info_t) cpu_invent);	hwgraph_info_export_LBL(cpuv, INFO_LBL_DETAIL_INVENT,			sizeof(invent_cpuinfo_t));	/* Diagval label - stores reason for disable +{virt,phys}id +diagval*/	hwgraph_info_add_LBL(cpuv, INFO_LBL_DIAGVAL,			(arbitrary_info_t) diag_invent);	hwgraph_info_export_LBL(cpuv, INFO_LBL_DIAGVAL,			sizeof(diag_inv_t));}/* * Add detailed cpu inventory info to the hardware graph. */voidklhwg_cpu_invent_info(devfs_handle_t cpuv,			cnodeid_t cnode,			klcpu_t *cpu){	invent_cpuinfo_t *cpu_invent;	cpu_invent = (invent_cpuinfo_t *)		klhwg_invent_alloc(cnode, INV_PROCESSOR, sizeof(invent_cpuinfo_t));	if (!cpu_invent)		return;	if (KLCONFIG_INFO_ENABLED((klinfo_t *)cpu))		cpu_invent->ic_gen.ig_flag = INVENT_ENABLED;	else		cpu_invent->ic_gen.ig_flag = 0x0;	cpu_invent->ic_cpu_info.cpuflavor = cpu->cpu_prid;	cpu_invent->ic_cpu_info.cpufq = cpu->cpu_speed;	cpu_invent->ic_cpu_info.sdfreq = cpu->cpu_scachespeed;	cpu_invent->ic_cpu_info.sdsize = cpu->cpu_scachesz;	cpu_invent->ic_cpuid = cpu->cpu_info.virtid;	cpu_invent->ic_slice = cpu_physical_id_to_slice(cpu->cpu_info.virtid);	hwgraph_info_add_LBL(cpuv, INFO_LBL_DETAIL_INVENT,			(arbitrary_info_t) cpu_invent);	hwgraph_info_export_LBL(cpuv, INFO_LBL_DETAIL_INVENT,			sizeof(invent_cpuinfo_t));}/*  * Add information about the baseio prom version number * as a part of detailed inventory info in the hwgraph. */voidklhwg_baseio_inventory_add(devfs_handle_t baseio_vhdl,cnodeid_t cnode){	invent_miscinfo_t	*baseio_inventory;	unsigned char		version = 0,revision = 0;	/* Allocate memory for the "detailed inventory" info	 * for the baseio	 */	baseio_inventory = (invent_miscinfo_t *) 		klhwg_invent_alloc(cnode, INV_PROM, sizeof(invent_miscinfo_t));	baseio_inventory->im_type = INV_IO6PROM;	/* Store the revision info  in the inventory */	baseio_inventory->im_version = version;	baseio_inventory->im_rev = revision;	/* Put the inventory info in the hardware graph */	hwgraph_info_add_LBL(baseio_vhdl, INFO_LBL_DETAIL_INVENT, 			     (arbitrary_info_t) baseio_inventory);	/* Make the information available to the user programs	 * thru hwgfs.	 */        hwgraph_info_export_LBL(baseio_vhdl, INFO_LBL_DETAIL_INVENT,				sizeof(invent_miscinfo_t));}char	*hub_rev[] = {	"0.0",	"1.0",	"2.0",	"2.1",	"2.2",	"2.3"};/* * Add detailed cpu inventory info to the hardware graph. */voidklhwg_hub_invent_info(devfs_handle_t hubv,		      cnodeid_t cnode, 		      klhub_t *hub){	invent_miscinfo_t *hub_invent;	hub_invent = (invent_miscinfo_t *) 	    klhwg_invent_alloc(cnode, INV_MISC, sizeof(invent_miscinfo_t));	if (!hub_invent)	    return;	if (KLCONFIG_INFO_ENABLED((klinfo_t *)hub))	    hub_invent->im_gen.ig_flag = INVENT_ENABLED;	hub_invent->im_type = INV_HUB;	hub_invent->im_rev = hub->hub_info.revision;	hub_invent->im_speed = hub->hub_speed;	hwgraph_info_add_LBL(hubv, INFO_LBL_DETAIL_INVENT, 			     (arbitrary_info_t) hub_invent);        hwgraph_info_export_LBL(hubv, INFO_LBL_DETAIL_INVENT,				sizeof(invent_miscinfo_t));}/* ARGSUSED */voidklhwg_add_hub(devfs_handle_t node_vertex, klhub_t *hub, cnodeid_t cnode){	devfs_handle_t myhubv;	devfs_handle_t hub_mon;	devfs_handle_t synergy;	devfs_handle_t fsb0;	devfs_handle_t fsb1;	int rc;	extern struct file_operations hub_mon_fops;	GRPRINTF(("klhwg_add_hub: adding %s\n", EDGE_LBL_HUB));	(void) hwgraph_path_add(node_vertex, EDGE_LBL_HUB, &myhubv);	rc = device_master_set(myhubv, node_vertex);	/*	 * hub perf stats.	 */	rc = hwgraph_info_add_LBL(myhubv, INFO_LBL_HUB_INFO,                        (arbitrary_info_t)(&NODEPDA(cnode)->hubstats));	if (rc != GRAPH_SUCCESS) {		printk(KERN_WARNING  "klhwg_add_hub: Can't add hub info label 0x%p, code %d",			(void *)myhubv, rc);	}	klhwg_hub_invent_info(myhubv, cnode, hub);	hub_mon = hwgraph_register(myhubv, EDGE_LBL_PERFMON,	    0, DEVFS_FL_AUTO_DEVNUM,	    0, 0,	    S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0,	    &hub_mon_fops,	    (void *)(long)cnode);	init_hub_stats(cnode, NODEPDA(cnode));	/*	 * synergy perf	 */	(void) hwgraph_path_add(myhubv, EDGE_LBL_SYNERGY, &synergy);	(void) hwgraph_path_add(synergy, "0", &fsb0);	(void) hwgraph_path_add(synergy, "1", &fsb1);	fsb0 = hwgraph_register(fsb0, EDGE_LBL_PERFMON,	    0, DEVFS_FL_AUTO_DEVNUM,	    0, 0,	    S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0,	    &synergy_mon_fops, (void *)SYNERGY_PERF_INFO(cnode, 0));	fsb1 = hwgraph_register(fsb1, EDGE_LBL_PERFMON,	    0, DEVFS_FL_AUTO_DEVNUM,	    0, 0,	    S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0,	    &synergy_mon_fops, (void *)SYNERGY_PERF_INFO(cnode, 1));}/* ARGSUSED */voidklhwg_add_disabled_cpu(devfs_handle_t node_vertex, cnodeid_t cnode, klcpu_t *cpu, slotid_t slot){        devfs_handle_t my_cpu;        char name[120];        cpuid_t cpu_id;	nasid_t nasid;	nasid = COMPACT_TO_NASID_NODEID(cnode);        cpu_id = nasid_slice_to_cpuid(nasid, cpu->cpu_info.physid);        if(cpu_id != -1){		sprintf(name, "%s/%s/%c", EDGE_LBL_DISABLED, EDGE_LBL_CPU, 'a' + cpu->cpu_info.physid);		(void) hwgraph_path_add(node_vertex, name, &my_cpu);		mark_cpuvertex_as_cpu(my_cpu, cpu_id);		device_master_set(my_cpu, node_vertex);		klhwg_disabled_cpu_invent_info(my_cpu, cnode, cpu, slot);		return;        }}/* ARGSUSED */voidklhwg_add_cpu(devfs_handle_t node_vertex, cnodeid_t cnode, klcpu_t *cpu){        devfs_handle_t my_cpu, cpu_dir;        char name[120];        cpuid_t cpu_id;	nasid_t nasid;	nasid = COMPACT_TO_NASID_NODEID(cnode);        cpu_id = nasid_slice_to_cpuid(nasid, cpu->cpu_info.physid);        sprintf(name, "%s/%d/%c",                EDGE_LBL_CPUBUS,                0,                'a' + cpu->cpu_info.physid);        GRPRINTF(("klhwg_add_cpu: adding %s to vertex 0x%x\n", name, node_vertex));        (void) hwgraph_path_add(node_vertex, name, &my_cpu);        mark_cpuvertex_as_cpu(my_cpu, cpu_id);        device_master_set(my_cpu, node_vertex);        /* Add an alias under the node's CPU directory */        if (hwgraph_edge_get(node_vertex, EDGE_LBL_CPU, &cpu_dir) == GRAPH_SUCCESS) {                sprintf(name, "%c", 'a' + cpu->cpu_info.physid);                (void) hwgraph_edge_add(cpu_dir, my_cpu, name);        }        klhwg_cpu_invent_info(my_cpu, cnode, cpu);}voidklhwg_add_xbow(cnodeid_t cnode, nasid_t nasid){	lboard_t *brd;	klxbow_t *xbow_p;	nasid_t hub_nasid;	cnodeid_t hub_cnode;	int widgetnum;	devfs_handle_t xbow_v, hubv;	/*REFERENCED*/	graph_error_t err;	if ((brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IOBRICK_XBOW)) == NULL)			return;	if (KL_CONFIG_DUPLICATE_BOARD(brd))	    return;	GRPRINTF(("klhwg_add_xbow: adding cnode %d nasid %d xbow edges\n",			cnode, nasid));	if ((xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW))	    == NULL)	    return;#ifdef	LATER	/*	 * We cannot support this function in devfs .. see below where 	 * we use hwgraph_path_add() to create this vertex with a known 	 * name.	 */	err = hwgraph_vertex_create(&xbow_v);	ASSERT(err == GRAPH_SUCCESS);	xswitch_vertex_init(xbow_v);#endif /* LATER */	for (widgetnum = HUB_WIDGET_ID_MIN; widgetnum <= HUB_WIDGET_ID_MAX; widgetnum++) {		if (!XBOW_PORT_TYPE_HUB(xbow_p, widgetnum)) 		    continue;		hub_nasid = XBOW_PORT_NASID(xbow_p, widgetnum);		if (hub_nasid == INVALID_NASID) {			printk(KERN_WARNING  "hub widget %d, skipping xbow graph\n", widgetnum);			continue;		}		hub_cnode = NASID_TO_COMPACT_NODEID(hub_nasid);		if (is_specified(arg_maxnodes) && hub_cnode == INVALID_CNODEID) {			continue;		}					hubv = cnodeid_to_vertex(hub_cnode);		err = hwgraph_path_add(hubv, EDGE_LBL_XTALK, &xbow_v);                if (err != GRAPH_SUCCESS) {                        if (err == GRAPH_DUP)                                printk(KERN_WARNING  "klhwg_add_xbow: Check for "                                        "working routers and router links!");                        PRINT_PANIC("klhwg_add_xbow: Failed to add "                                "edge: vertex 0x%p to vertex 0x%p,"                                "error %d\n",                                (void *)hubv, (void *)xbow_v, err);                }		xswitch_vertex_init(xbow_v); 		NODEPDA(hub_cnode)->xbow_vhdl = xbow_v;		/*		 * XXX - This won't work is we ever hook up two hubs		 * by crosstown through a crossbow.		 */		if (hub_nasid != nasid) {			NODEPDA(hub_cnode)->xbow_peer = nasid;			NODEPDA(NASID_TO_COMPACT_NODEID(nasid))->xbow_peer =				hub_nasid;		}		GRPRINTF(("klhwg_add_xbow: adding port nasid %d %s to vertex 0x%p\n",			hub_nasid, EDGE_LBL_XTALK, hubv));#ifdef	LATER		err = hwgraph_edge_add(hubv, xbow_v, EDGE_LBL_XTALK);		if (err != GRAPH_SUCCESS) {			if (err == GRAPH_DUP)				printk(KERN_WARNING  "klhwg_add_xbow: Check for "					"working routers and router links!");			PRINT_PANIC("klhwg_add_xbow: Failed to add "				"edge: vertex 0x%p (0x%p) to vertex 0x%p (0x%p), "				"error %d\n",				hubv, hubv, xbow_v, xbow_v, err);		}#endif	}}/* ARGSUSED */voidklhwg_add_node(devfs_handle_t hwgraph_root, cnodeid_t cnode, gda_t *gdap){	nasid_t nasid;	lboard_t *brd;	klhub_t *hub;	devfs_handle_t node_vertex = NULL;	char path_buffer[100];	int rv;	char *s;	int board_disabled = 0;	klcpu_t *cpu;	nasid = COMPACT_TO_NASID_NODEID(cnode);	brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA);	GRPRINTF(("klhwg_add_node: Adding cnode %d, nasid %d, brd 0x%p\n",                cnode, nasid, brd));	ASSERT(brd);	do {		devfs_handle_t cpu_dir;		/* Generate a hardware graph path for this board. */		board_to_path(brd, path_buffer);		GRPRINTF(("klhwg_add_node: adding %s to vertex 0x%p\n",			path_buffer, hwgraph_root));		rv = hwgraph_path_add(hwgraph_root, path_buffer, &node_vertex);		if (rv != GRAPH_SUCCESS)			PRINT_PANIC("Node vertex creation failed.  "					  "Path == %s",				path_buffer);		hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB);		ASSERT(hub);		if(hub->hub_info.flags & KLINFO_ENABLE)			board_disabled = 0;		else			board_disabled = 1;				if(!board_disabled) {			mark_nodevertex_as_node(node_vertex,

⌨️ 快捷键说明

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