klgraph.c 17 KB
Newer Older
Andrew Morton's avatar
Andrew Morton committed
1
/*
Jesse Barnes's avatar
Jesse Barnes committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
 * 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-2003 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>
17
#include <linux/init.h>
Jesse Barnes's avatar
Jesse Barnes committed
18 19 20 21 22
#include <asm/sn/sgi.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/iograph.h>
#include <asm/sn/hcl.h>
#include <asm/sn/hcl_util.h>
23
#include <asm/sn/sn_private.h>
Jesse Barnes's avatar
Jesse Barnes committed
24

25
/* #define KLGRAPH_DEBUG 1 */
Jesse Barnes's avatar
Jesse Barnes committed
26 27 28 29 30 31
#ifdef KLGRAPH_DEBUG
#define GRPRINTF(x)	printk x
#else
#define GRPRINTF(x)
#endif

Jesse Barnes's avatar
Jesse Barnes committed
32
void mark_cpuvertex_as_cpu(vertex_hdl_t vhdl, cpuid_t cpuid);
Jesse Barnes's avatar
Jesse Barnes committed
33 34 35


/* ARGSUSED */
36
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
37
klhwg_add_hub(vertex_hdl_t node_vertex, klhub_t *hub, cnodeid_t cnode)
Jesse Barnes's avatar
Jesse Barnes committed
38
{
Jesse Barnes's avatar
Jesse Barnes committed
39 40
	vertex_hdl_t myhubv;
	vertex_hdl_t hub_mon;
Jesse Barnes's avatar
Jesse Barnes committed
41 42 43
	int rc;
	extern struct file_operations shub_mon_fops;

44 45 46 47
	hwgraph_path_add(node_vertex, EDGE_LBL_HUB, &myhubv);

	HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, myhubv, NULL, "Created path for hub vertex for Shub node.\n"));

Jesse Barnes's avatar
Jesse Barnes committed
48
	rc = device_master_set(myhubv, node_vertex);
49 50 51 52
	if (rc) {
		printk("klhwg_add_hub: Unable to create hub vertex.\n");
		return;
	}
Jesse Barnes's avatar
Jesse Barnes committed
53
	hub_mon = hwgraph_register(myhubv, EDGE_LBL_PERFMON,
54
		0, 0, 0, 0,
Jesse Barnes's avatar
Jesse Barnes committed
55 56 57 58 59
		S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0,
		&shub_mon_fops, (void *)(long)cnode);
}

/* ARGSUSED */
60
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
61
klhwg_add_disabled_cpu(vertex_hdl_t node_vertex, cnodeid_t cnode, klcpu_t *cpu, slotid_t slot)
Jesse Barnes's avatar
Jesse Barnes committed
62
{
Jesse Barnes's avatar
Jesse Barnes committed
63
        vertex_hdl_t my_cpu;
Jesse Barnes's avatar
Jesse Barnes committed
64 65 66 67 68 69 70
        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){
71
		snprintf(name, 120, "%s/%s/%c", EDGE_LBL_DISABLED, EDGE_LBL_CPU, 'a' + cpu->cpu_info.physid);
Jesse Barnes's avatar
Jesse Barnes committed
72 73
		(void) hwgraph_path_add(node_vertex, name, &my_cpu);

74 75
		HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, my_cpu, NULL, "Created path for disabled cpu slice.\n"));

Jesse Barnes's avatar
Jesse Barnes committed
76 77 78 79 80 81 82
		mark_cpuvertex_as_cpu(my_cpu, cpu_id);
		device_master_set(my_cpu, node_vertex);
		return;
        }
}

/* ARGSUSED */
83
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
84
klhwg_add_cpu(vertex_hdl_t node_vertex, cnodeid_t cnode, klcpu_t *cpu)
Jesse Barnes's avatar
Jesse Barnes committed
85
{
Jesse Barnes's avatar
Jesse Barnes committed
86
        vertex_hdl_t my_cpu, cpu_dir;
Jesse Barnes's avatar
Jesse Barnes committed
87 88 89 90 91 92 93
        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);

94
        snprintf(name, 120, "%s/%d/%c",
Jesse Barnes's avatar
Jesse Barnes committed
95 96 97 98 99
                EDGE_LBL_CPUBUS,
                0,
                'a' + cpu->cpu_info.physid);

        (void) hwgraph_path_add(node_vertex, name, &my_cpu);
100 101 102 103

	HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, my_cpu, NULL, "Created path for active cpu slice.\n"));

	mark_cpuvertex_as_cpu(my_cpu, cpu_id);
Jesse Barnes's avatar
Jesse Barnes committed
104 105 106 107
        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) {
108
                snprintf(name, 120, "%c", 'a' + cpu->cpu_info.physid);
Jesse Barnes's avatar
Jesse Barnes committed
109
                (void) hwgraph_edge_add(cpu_dir, my_cpu, name);
110
		HWGRAPH_DEBUG((__FILE__, __FUNCTION__,__LINE__, cpu_dir, my_cpu, "Created % from vhdl1 to vhdl2.\n", name));
Jesse Barnes's avatar
Jesse Barnes committed
111 112 113 114
        }
}


115
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
116 117 118 119 120 121 122
klhwg_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;
Jesse Barnes's avatar
Jesse Barnes committed
123
	vertex_hdl_t xbow_v, hubv;
Jesse Barnes's avatar
Jesse Barnes committed
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
	/*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;

	if ((xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW))
	    == NULL)
	    return;

	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);

149
		if (hub_cnode == INVALID_CNODEID) {
Jesse Barnes's avatar
Jesse Barnes committed
150 151 152 153 154 155 156 157 158 159 160
			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!");

161
                        printk("klhwg_add_xbow: Failed to add "
Jesse Barnes's avatar
Jesse Barnes committed
162 163 164
                                "edge: vertex 0x%p to vertex 0x%p,"
                                "error %d\n",
                                (void *)hubv, (void *)xbow_v, err);
165
			return;
Jesse Barnes's avatar
Jesse Barnes committed
166
                }
167 168 169

		HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, xbow_v, NULL, "Created path for xtalk.\n"));

Jesse Barnes's avatar
Jesse Barnes committed
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
		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;
		}
	}
}


/* ARGSUSED */
188
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
189
klhwg_add_node(vertex_hdl_t hwgraph_root, cnodeid_t cnode)
Jesse Barnes's avatar
Jesse Barnes committed
190 191 192 193
{
	nasid_t nasid;
	lboard_t *brd;
	klhub_t *hub;
Jesse Barnes's avatar
Jesse Barnes committed
194
	vertex_hdl_t node_vertex = NULL;
Jesse Barnes's avatar
Jesse Barnes committed
195 196 197 198 199
	char path_buffer[100];
	int rv;
	char *s;
	int board_disabled = 0;
	klcpu_t *cpu;
200
	vertex_hdl_t cpu_dir;
Jesse Barnes's avatar
Jesse Barnes committed
201 202 203 204 205

	nasid = COMPACT_TO_NASID_NODEID(cnode);
	brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA);
	ASSERT(brd);

206 207 208 209 210 211 212
	/* Generate a hardware graph path for this board. */
	board_to_path(brd, path_buffer);
	rv = hwgraph_path_add(hwgraph_root, path_buffer, &node_vertex);
	if (rv != GRAPH_SUCCESS) {
		printk("Node vertex creation failed.  Path == %s", path_buffer);
		return;
	}
Jesse Barnes's avatar
Jesse Barnes committed
213

214 215 216 217 218 219 220
	HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created path for SHUB node.\n"));
	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;
Jesse Barnes's avatar
Jesse Barnes committed
221
		
222 223 224 225 226 227 228 229
	if(!board_disabled) {
		mark_nodevertex_as_node(node_vertex, cnode);
		s = dev_to_name(node_vertex, path_buffer, sizeof(path_buffer));
		NODEPDA(cnode)->hwg_node_name =
					kmalloc(strlen(s) + 1, GFP_KERNEL);
		if (NODEPDA(cnode)->hwg_node_name <= 0) {
			printk("%s: no memory\n", __FUNCTION__);
			return;
Jesse Barnes's avatar
Jesse Barnes committed
230
		}
231 232 233 234 235 236 237
		strcpy(NODEPDA(cnode)->hwg_node_name, s);
		hubinfo_set(node_vertex, NODEPDA(cnode)->pdinfo);
		NODEPDA(cnode)->slotdesc = brd->brd_slot;
		NODEPDA(cnode)->geoid = brd->brd_geoid;
		NODEPDA(cnode)->module = module_lookup(geo_module(brd->brd_geoid));
		klhwg_add_hub(node_vertex, hub, cnode);
	}
Jesse Barnes's avatar
Jesse Barnes committed
238

239 240 241 242 243 244 245
	/*
	 * If there's at least 1 CPU, add a "cpu" directory to represent
	 * the collection of all CPUs attached to this node.
	 */
	cpu = (klcpu_t *)find_first_component(brd, KLSTRUCT_CPU);
	if (cpu) {
		graph_error_t rv;
Jesse Barnes's avatar
Jesse Barnes committed
246

247 248 249 250
		rv = hwgraph_path_add(node_vertex, EDGE_LBL_CPU, &cpu_dir);
		if (rv != GRAPH_SUCCESS) {
			printk("klhwg_add_node: Cannot create CPU directory\n");
			return;
Jesse Barnes's avatar
Jesse Barnes committed
251
		}
252
		HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, cpu_dir, NULL, "Created cpu directiry on SHUB node.\n"));
Jesse Barnes's avatar
Jesse Barnes committed
253

254 255 256 257 258 259 260
	}

	while (cpu) {
		cpuid_t cpu_id;
		cpu_id = nasid_slice_to_cpuid(nasid,cpu->cpu_info.physid);
		if (cpu_online(cpu_id))
			klhwg_add_cpu(node_vertex, cnode, cpu);
Jesse Barnes's avatar
Jesse Barnes committed
261
		else
262 263 264 265 266
			klhwg_add_disabled_cpu(node_vertex, cnode, cpu, brd->brd_slot);

		cpu = (klcpu_t *)
			find_component(brd, (klinfo_t *)cpu, KLSTRUCT_CPU);
	}
Jesse Barnes's avatar
Jesse Barnes committed
267 268 269 270
}


/* ARGSUSED */
271
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
272
klhwg_add_all_routers(vertex_hdl_t hwgraph_root)
Jesse Barnes's avatar
Jesse Barnes committed
273 274 275 276
{
	nasid_t nasid;
	cnodeid_t cnode;
	lboard_t *brd;
Jesse Barnes's avatar
Jesse Barnes committed
277
	vertex_hdl_t node_vertex;
Jesse Barnes's avatar
Jesse Barnes committed
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
	char path_buffer[100];
	int rv;

	for (cnode = 0; cnode < numnodes; cnode++) {
		nasid = COMPACT_TO_NASID_NODEID(cnode);
		brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid),
				KLTYPE_ROUTER);

		if (!brd)
			/* No routers stored in this node's memory */
			continue;

		do {
			ASSERT(brd);

			/* Don't add duplicate boards. */
			if (brd->brd_flags & DUPLICATE_BOARD)
				continue;

			/* Generate a hardware graph path for this board. */
			board_to_path(brd, path_buffer);

			/* Add the router */
			rv = hwgraph_path_add(hwgraph_root, path_buffer, &node_vertex);
302 303 304 305 306 307
			if (rv != GRAPH_SUCCESS) {
				printk("Router vertex creation "
						  "failed.  Path == %s", path_buffer);
				return;
			}
			HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created router path.\n"));
Jesse Barnes's avatar
Jesse Barnes committed
308 309 310 311 312 313 314 315 316

		/* Find the rest of the routers stored on this node. */
		} while ( (brd = find_lboard_class(KLCF_NEXT(brd),
			 KLTYPE_ROUTER)) );
	}

}

/* ARGSUSED */
317
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
318
klhwg_connect_one_router(vertex_hdl_t hwgraph_root, lboard_t *brd,
Jesse Barnes's avatar
Jesse Barnes committed
319 320 321 322 323
			 cnodeid_t cnode, nasid_t nasid)
{
	klrou_t *router;
	char path_buffer[50];
	char dest_path[50];
Jesse Barnes's avatar
Jesse Barnes committed
324 325
	vertex_hdl_t router_hndl;
	vertex_hdl_t dest_hndl;
Jesse Barnes's avatar
Jesse Barnes committed
326 327 328 329 330 331 332 333 334 335 336 337 338 339
	int rc;
	int port;
	lboard_t *dest_brd;

	/* Don't add duplicate boards. */
	if (brd->brd_flags & DUPLICATE_BOARD) {
		return;
	}

	/* Generate a hardware graph path for this board. */
	board_to_path(brd, path_buffer);

	rc = hwgraph_traverse(hwgraph_root, path_buffer, &router_hndl);

340
	if (rc != GRAPH_SUCCESS)
Jesse Barnes's avatar
Jesse Barnes committed
341 342 343 344 345 346 347
			return;

	if (rc != GRAPH_SUCCESS)
		printk(KERN_WARNING  "Can't find router: %s", path_buffer);

	/* We don't know what to do with multiple router components */
	if (brd->brd_numcompts != 1) {
348
		printk("klhwg_connect_one_router: %d cmpts on router\n",
Jesse Barnes's avatar
Jesse Barnes committed
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
			brd->brd_numcompts);
		return;
	}


	/* Convert component 0 to klrou_t ptr */
	router = (klrou_t *)NODE_OFFSET_TO_K0(NASID_GET(brd),
					      brd->brd_compts[0]);

	for (port = 1; port <= MAX_ROUTER_PORTS; port++) {
		/* See if the port's active */
		if (router->rou_port[port].port_nasid == INVALID_NASID) {
			GRPRINTF(("klhwg_connect_one_router: port %d inactive.\n",
				 port));
			continue;
		}
365
		if (NASID_TO_COMPACT_NODEID(router->rou_port[port].port_nasid) 
Jesse Barnes's avatar
Jesse Barnes committed
366 367 368 369 370 371 372 373 374 375 376 377 378 379
		    == INVALID_CNODEID) {
			continue;
		}

		dest_brd = (lboard_t *)NODE_OFFSET_TO_K0(
				router->rou_port[port].port_nasid,
				router->rou_port[port].port_offset);

		/* Generate a hardware graph path for this board. */
		board_to_path(dest_brd, dest_path);

		rc = hwgraph_traverse(hwgraph_root, dest_path, &dest_hndl);

		if (rc != GRAPH_SUCCESS) {
380
			if (KL_CONFIG_DUPLICATE_BOARD(dest_brd))
Jesse Barnes's avatar
Jesse Barnes committed
381
				continue;
382 383
			printk("Can't find router: %s", dest_path);
			return;
Jesse Barnes's avatar
Jesse Barnes committed
384 385 386 387 388 389 390 391 392 393 394 395 396
		}

		sprintf(dest_path, "%d", port);

		rc = hwgraph_edge_add(router_hndl, dest_hndl, dest_path);

		if (rc == GRAPH_DUP) {
			GRPRINTF(("Skipping port %d. nasid %d %s/%s\n",
				  port, router->rou_port[port].port_nasid,
				  path_buffer, dest_path));
			continue;
		}

397 398
		if (rc != GRAPH_SUCCESS) {
			printk("Can't create edge: %s/%s to vertex 0x%p error 0x%x\n",
Jesse Barnes's avatar
Jesse Barnes committed
399
				path_buffer, dest_path, (void *)dest_hndl, rc);
400 401 402
			return;
		}
		HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, router_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", dest_path));
Jesse Barnes's avatar
Jesse Barnes committed
403 404 405 406 407
		
	}
}


408
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
409
klhwg_connect_routers(vertex_hdl_t hwgraph_root)
Jesse Barnes's avatar
Jesse Barnes committed
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
{
	nasid_t nasid;
	cnodeid_t cnode;
	lboard_t *brd;

	for (cnode = 0; cnode < numnodes; cnode++) {
		nasid = COMPACT_TO_NASID_NODEID(cnode);
		brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid),
				KLTYPE_ROUTER);

		if (!brd)
			continue;

		do {

			nasid = COMPACT_TO_NASID_NODEID(cnode);

			klhwg_connect_one_router(hwgraph_root, brd,
						 cnode, nasid);

		/* Find the rest of the routers stored on this node. */
		} while ( (brd = find_lboard_class(KLCF_NEXT(brd), KLTYPE_ROUTER)) );
	}
}



437
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
438
klhwg_connect_hubs(vertex_hdl_t hwgraph_root)
Jesse Barnes's avatar
Jesse Barnes committed
439 440 441 442 443 444
{
	nasid_t nasid;
	cnodeid_t cnode;
	lboard_t *brd;
	klhub_t *hub;
	lboard_t *dest_brd;
Jesse Barnes's avatar
Jesse Barnes committed
445 446
	vertex_hdl_t hub_hndl;
	vertex_hdl_t dest_hndl;
Jesse Barnes's avatar
Jesse Barnes committed
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
	char path_buffer[50];
	char dest_path[50];
	graph_error_t rc;
	int port;

	for (cnode = 0; cnode < numnodes; cnode++) {
		nasid = COMPACT_TO_NASID_NODEID(cnode);

		brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA);
		ASSERT(brd);

		hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB);
		ASSERT(hub);

		for (port = 1; port <= MAX_NI_PORTS; port++) {
			if (hub->hub_port[port].port_nasid == INVALID_NASID) {
463
				continue; /* Port not active */
Jesse Barnes's avatar
Jesse Barnes committed
464 465
			}

466
			if (NASID_TO_COMPACT_NODEID(hub->hub_port[port].port_nasid) == INVALID_CNODEID)
Jesse Barnes's avatar
Jesse Barnes committed
467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
				continue;

			/* Generate a hardware graph path for this board. */
			board_to_path(brd, path_buffer);
			rc = hwgraph_traverse(hwgraph_root, path_buffer, &hub_hndl);

			if (rc != GRAPH_SUCCESS)
				printk(KERN_WARNING  "Can't find hub: %s", path_buffer);

			dest_brd = (lboard_t *)NODE_OFFSET_TO_K0(
					hub->hub_port[port].port_nasid,
					hub->hub_port[port].port_offset);

			/* Generate a hardware graph path for this board. */
			board_to_path(dest_brd, dest_path);

			rc = hwgraph_traverse(hwgraph_root, dest_path, &dest_hndl);

			if (rc != GRAPH_SUCCESS) {
486
				if (KL_CONFIG_DUPLICATE_BOARD(dest_brd))
Jesse Barnes's avatar
Jesse Barnes committed
487
					continue;
488 489
				printk("Can't find board: %s", dest_path);
				return;
Jesse Barnes's avatar
Jesse Barnes committed
490 491 492 493
			} else {
				char buf[1024];

				rc = hwgraph_path_add(hub_hndl, EDGE_LBL_INTERCONNECT, &hub_hndl);
494 495 496

				HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, hub_hndl, NULL, "Created link path.\n"));

Jesse Barnes's avatar
Jesse Barnes committed
497 498 499 500 501
				sprintf(buf,"%s/%s",path_buffer,EDGE_LBL_INTERCONNECT);
				rc = hwgraph_traverse(hwgraph_root, buf, &hub_hndl);
				sprintf(buf,"%d",port);
				rc = hwgraph_edge_add(hub_hndl, dest_hndl, buf);

502
				HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, hub_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", buf));
Jesse Barnes's avatar
Jesse Barnes committed
503

504 505 506 507 508
				if (rc != GRAPH_SUCCESS) {
					printk("Can't create edge: %s/%s to vertex 0x%p, error 0x%x\n",
							path_buffer, dest_path, (void *)dest_hndl, rc);
					return;
				}
Jesse Barnes's avatar
Jesse Barnes committed
509 510 511 512 513 514 515 516 517
			}
		}
	}
}

/* Store the pci/vme disabled board information as extended administrative
 * hints which can later be used by the drivers using the device/driver
 * admin interface. 
 */
518
static void __init
Jesse Barnes's avatar
Jesse Barnes committed
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
klhwg_device_disable_hints_add(void)
{
	cnodeid_t	cnode; 		/* node we are looking at */
	nasid_t		nasid;		/* nasid of the node */
	lboard_t	*board;		/* board we are looking at */
	int		comp_index;	/* component index */
	klinfo_t	*component;	/* component in the board we are
					 * looking at 
					 */
	char		device_name[MAXDEVNAME];
	
	for(cnode = 0; cnode < numnodes; cnode++) {
		nasid = COMPACT_TO_NASID_NODEID(cnode);
		board = (lboard_t *)KL_CONFIG_INFO(nasid);
		/* Check out all the board info stored  on a node */
		while(board) {
			/* No need to look at duplicate boards or non-io 
			 * boards
			 */
			if (KL_CONFIG_DUPLICATE_BOARD(board) ||
			    KLCLASS(board->brd_type) != KLCLASS_IO) {
				board = KLCF_NEXT(board);
				continue;
			}
			/* Check out all the components of a board */
			for (comp_index = 0; 
			     comp_index < KLCF_NUM_COMPS(board);
			     comp_index++) {
				component = KLCF_COMP(board,comp_index);
				/* If the component is enabled move on to
				 * the next component
				 */
				if (KLCONFIG_INFO_ENABLED(component))
					continue;
				/* NOTE : Since the prom only supports
				 * the disabling of pci devices the following
				 * piece of code makes sense. 
				 * Make sure that this assumption is valid
				 */
				/* This component is disabled. Store this
				 * hint in the extended device admin table
				 */
				/* Get the canonical name of the pci device */
				device_component_canonical_name_get(board,
							    component,
							    device_name);
#ifdef DEBUG
				printf("%s DISABLED\n",device_name);
#endif				
			}
			/* go to the next board info stored on this 
			 * node 
			 */
			board = KLCF_NEXT(board);
		}
	}
}

577
void __init
Jesse Barnes's avatar
Jesse Barnes committed
578
klhwg_add_all_modules(vertex_hdl_t hwgraph_root)
Jesse Barnes's avatar
Jesse Barnes committed
579 580 581
{
	cmoduleid_t	cm;
	char		name[128];
Jesse Barnes's avatar
Jesse Barnes committed
582 583
	vertex_hdl_t	vhdl;
	vertex_hdl_t  module_vhdl;
Jesse Barnes's avatar
Jesse Barnes committed
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
	int		rc;
	char		buffer[16];

	/* Add devices under each module */

	for (cm = 0; cm < nummodules; cm++) {
		/* Use module as module vertex fastinfo */

		memset(buffer, 0, 16);
		format_module_id(buffer, modules[cm]->id, MODULE_FORMAT_BRIEF);
		sprintf(name, EDGE_LBL_MODULE "/%s", buffer);

		rc = hwgraph_path_add(hwgraph_root, name, &module_vhdl);
		ASSERT(rc == GRAPH_SUCCESS);
		rc = rc;
599
		HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, module_vhdl, NULL, "Created module path.\n"));
Jesse Barnes's avatar
Jesse Barnes committed
600 601 602 603 604 605 606 607 608 609 610

		hwgraph_fastinfo_set(module_vhdl, (arbitrary_info_t) modules[cm]);

		/* Add system controller */
		sprintf(name,
			EDGE_LBL_MODULE "/%s/" EDGE_LBL_L1,
			buffer);

		rc = hwgraph_path_add(hwgraph_root, name, &vhdl);
		ASSERT_ALWAYS(rc == GRAPH_SUCCESS); 
		rc = rc;
611
		HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, vhdl, NULL, "Created L1 path.\n"));
Jesse Barnes's avatar
Jesse Barnes committed
612

613 614
		hwgraph_info_add_LBL(vhdl, INFO_LBL_ELSC,
				     (arbitrary_info_t)1);
Jesse Barnes's avatar
Jesse Barnes committed
615 616 617 618

	}
}

619
void __init
Jesse Barnes's avatar
Jesse Barnes committed
620
klhwg_add_all_nodes(vertex_hdl_t hwgraph_root)
Jesse Barnes's avatar
Jesse Barnes committed
621 622 623 624
{
	cnodeid_t	cnode;

	for (cnode = 0; cnode < numnodes; cnode++) {
Jesse Barnes's avatar
Jesse Barnes committed
625
		klhwg_add_node(hwgraph_root, cnode);
Jesse Barnes's avatar
Jesse Barnes committed
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
	}

	for (cnode = 0; cnode < numnodes; cnode++) {
		klhwg_add_xbow(cnode, cnodeid_to_nasid(cnode));
	}

	/*
	 * As for router hardware inventory information, we set this
	 * up in router.c. 
	 */
	
	klhwg_add_all_routers(hwgraph_root);
	klhwg_connect_routers(hwgraph_root);
	klhwg_connect_hubs(hwgraph_root);

	/* Go through the entire system's klconfig
	 * to figure out which pci components have been disabled
	 */
	klhwg_device_disable_hints_add();

}