ip27-init.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General
  3.  * Public License.  See the file "COPYING" in the main directory of this
  4.  * archive for more details.
  5.  *
  6.  * Copyright (C) 2000 - 2001 by Kanoj Sarcar (kanoj@sgi.com)
  7.  * Copyright (C) 2000 - 2001 by Silicon Graphics, Inc.
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/sched.h>
  13. #include <linux/mmzone.h> /* for numnodes */
  14. #include <linux/mm.h>
  15. #include <asm/pgalloc.h>
  16. #include <asm/pgtable.h>
  17. #include <asm/sn/types.h>
  18. #include <asm/sn/sn0/addrs.h>
  19. #include <asm/sn/sn0/hubni.h>
  20. #include <asm/sn/sn0/hubio.h>
  21. #include <asm/sn/klconfig.h>
  22. #include <asm/sn/ioc3.h>
  23. #include <asm/mipsregs.h>
  24. #include <asm/sn/gda.h>
  25. #include <asm/sn/intr.h>
  26. #include <asm/current.h>
  27. #include <asm/smp.h>
  28. #include <asm/processor.h>
  29. #include <asm/mmu_context.h>
  30. #include <asm/sn/launch.h>
  31. #include <asm/sn/sn_private.h>
  32. #include <asm/sn/sn0/ip27.h>
  33. #include <asm/sn/mapped_kernel.h>
  34. #include <asm/sn/sn0/addrs.h>
  35. #include <asm/sn/gda.h>
  36. #define CPU_NONE (cpuid_t)-1
  37. /*
  38.  * The following should work till 64 nodes, ie 128p SN0s.
  39.  */
  40. #define CNODEMASK_CLRALL(p) (p) = 0
  41. #define CNODEMASK_TSTB(p, bit) ((p) & (1ULL << (bit)))
  42. #define CNODEMASK_SETB(p, bit) ((p) |= 1ULL << (bit))
  43. cpumask_t boot_cpumask;
  44. hubreg_t region_mask = 0;
  45. static int fine_mode = 0;
  46. int maxcpus;
  47. static spinlock_t hub_mask_lock = SPIN_LOCK_UNLOCKED;
  48. static cnodemask_t hub_init_mask;
  49. static atomic_t numstarted = ATOMIC_INIT(1);
  50. static int router_distance;
  51. nasid_t master_nasid = INVALID_NASID;
  52. cnodeid_t nasid_to_compact_node[MAX_NASIDS];
  53. nasid_t compact_to_nasid_node[MAX_COMPACT_NODES];
  54. cnodeid_t cpuid_to_compact_node[MAXCPUS];
  55. char node_distances[MAX_COMPACT_NODES][MAX_COMPACT_NODES];
  56. hubreg_t get_region(cnodeid_t cnode)
  57. {
  58. if (fine_mode)
  59. return COMPACT_TO_NASID_NODEID(cnode) >> NASID_TO_FINEREG_SHFT;
  60. else
  61. return COMPACT_TO_NASID_NODEID(cnode) >> NASID_TO_COARSEREG_SHFT;
  62. }
  63. static void gen_region_mask(hubreg_t *region_mask, int maxnodes)
  64. {
  65. cnodeid_t cnode;
  66. (*region_mask) = 0;
  67. for (cnode = 0; cnode < maxnodes; cnode++) {
  68. (*region_mask) |= 1ULL << get_region(cnode);
  69. }
  70. }
  71. int is_fine_dirmode(void)
  72. {
  73. return (((LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_REGIONSIZE_MASK)
  74. >> NSRI_REGIONSIZE_SHFT) & REGIONSIZE_FINE);
  75. }
  76. nasid_t get_actual_nasid(lboard_t *brd)
  77. {
  78. klhub_t *hub;
  79. if (!brd)
  80. return INVALID_NASID;
  81. /* find out if we are a completely disabled brd. */
  82. hub  = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB);
  83. if (!hub)
  84. return INVALID_NASID;
  85. if (!(hub->hub_info.flags & KLINFO_ENABLE)) /* disabled node brd */
  86. return hub->hub_info.physid;
  87. else
  88. return brd->brd_nasid;
  89. }
  90. /* Tweak this for maximum number of CPUs to activate */
  91. static int max_cpus = NR_CPUS;
  92. int do_cpumask(cnodeid_t cnode, nasid_t nasid, cpumask_t *boot_cpumask, 
  93. int *highest)
  94. {
  95. static int tot_cpus_found = 0;
  96. lboard_t *brd;
  97. klcpu_t *acpu;
  98. int cpus_found = 0;
  99. cpuid_t cpuid;
  100. brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27);
  101. do {
  102. acpu = (klcpu_t *)find_first_component(brd, KLSTRUCT_CPU);
  103. while (acpu) {
  104. cpuid = acpu->cpu_info.virtid;
  105. /* cnode is not valid for completely disabled brds */
  106. if (get_actual_nasid(brd) == brd->brd_nasid)
  107. cpuid_to_compact_node[cpuid] = cnode;
  108. if (cpuid > *highest)
  109. *highest = cpuid;
  110. /* Only let it join in if it's marked enabled */
  111. if ((acpu->cpu_info.flags & KLINFO_ENABLE) &&
  112. (tot_cpus_found != max_cpus)) {
  113. CPUMASK_SETB(*boot_cpumask, cpuid);
  114. cpus_found++;
  115. tot_cpus_found++;
  116. }
  117. acpu = (klcpu_t *)find_component(brd, (klinfo_t *)acpu, 
  118. KLSTRUCT_CPU);
  119. }
  120. brd = KLCF_NEXT(brd);
  121. if (brd)
  122. brd = find_lboard(brd,KLTYPE_IP27);
  123. else
  124. break;
  125. } while (brd);
  126. return cpus_found;
  127. }
  128. cpuid_t cpu_node_probe(cpumask_t *boot_cpumask, int *numnodes)
  129. {
  130. int i, cpus = 0, highest = 0;
  131. gda_t *gdap = GDA;
  132. nasid_t nasid;
  133. /*
  134.  * Initialize the arrays to invalid nodeid (-1)
  135.  */
  136. for (i = 0; i < MAX_COMPACT_NODES; i++)
  137. compact_to_nasid_node[i] = INVALID_NASID;
  138. for (i = 0; i < MAX_NASIDS; i++)
  139. nasid_to_compact_node[i] = INVALID_CNODEID;
  140. for (i = 0; i < MAXCPUS; i++)
  141. cpuid_to_compact_node[i] = INVALID_CNODEID;
  142. *numnodes = 0;
  143. for (i = 0; i < MAX_COMPACT_NODES; i++) {
  144. if ((nasid = gdap->g_nasidtable[i]) == INVALID_NASID) {
  145. break;
  146. } else {
  147. compact_to_nasid_node[i] = nasid;
  148. nasid_to_compact_node[nasid] = i;
  149. (*numnodes)++;
  150. cpus += do_cpumask(i, nasid, boot_cpumask, &highest);
  151. }
  152. }
  153. /*
  154.  * Cpus are numbered in order of cnodes. Currently, disabled
  155.  * cpus are not numbered.
  156.  */
  157. return(highest + 1);
  158. }
  159. int cpu_enabled(cpuid_t cpu)
  160. {
  161. if (cpu == CPU_NONE)
  162. return 0;
  163. return (CPUMASK_TSTB(boot_cpumask, cpu) != 0);
  164. }
  165. void mlreset (void)
  166. {
  167. int i;
  168. void init_topology_matrix(void);
  169. void dump_topology(void);
  170. master_nasid = get_nasid();
  171. fine_mode = is_fine_dirmode();
  172. /*
  173.  * Probe for all CPUs - this creates the cpumask and
  174.  * sets up the mapping tables.
  175.  */
  176. CPUMASK_CLRALL(boot_cpumask);
  177. maxcpus = cpu_node_probe(&boot_cpumask, &numnodes);
  178. printk("Discovered %d cpus on %d nodesn", maxcpus, numnodes);
  179. init_topology_matrix();
  180. dump_topology();
  181. gen_region_mask(&region_mask, numnodes);
  182. CNODEMASK_CLRALL(hub_init_mask);
  183. setup_replication_mask(numnodes);
  184. /*
  185.  * Set all nodes' calias sizes to 8k
  186.  */
  187. for (i = 0; i < numnodes; i++) {
  188. nasid_t nasid;
  189. nasid = COMPACT_TO_NASID_NODEID(i);
  190. /*
  191.  * Always have node 0 in the region mask, otherwise
  192.  * CALIAS accesses get exceptions since the hub
  193.  * thinks it is a node 0 address.
  194.  */
  195. REMOTE_HUB_S(nasid, PI_REGION_PRESENT, (region_mask | 1));
  196. #ifdef CONFIG_REPLICATE_EXHANDLERS
  197. REMOTE_HUB_S(nasid, PI_CALIAS_SIZE, PI_CALIAS_SIZE_8K);
  198. #else
  199. REMOTE_HUB_S(nasid, PI_CALIAS_SIZE, PI_CALIAS_SIZE_0);
  200. #endif
  201. #ifdef LATER
  202. /*
  203.  * Set up all hubs to have a big window pointing at
  204.  * widget 0. Memory mode, widget 0, offset 0
  205.  */
  206. REMOTE_HUB_S(nasid, IIO_ITTE(SWIN0_BIGWIN),
  207. ((HUB_PIO_MAP_TO_MEM << IIO_ITTE_IOSP_SHIFT) |
  208. (0 << IIO_ITTE_WIDGET_SHIFT)));
  209. #endif
  210. }
  211. }
  212. void intr_clear_bits(nasid_t nasid, volatile hubreg_t *pend, int base_level,
  213. char *name)
  214. {
  215. volatile hubreg_t bits;
  216. int i;
  217. /* Check pending interrupts */
  218. if ((bits = HUB_L(pend)) != 0)
  219. for (i = 0; i < N_INTPEND_BITS; i++)
  220. if (bits & (1 << i))
  221. LOCAL_HUB_CLR_INTR(base_level + i);
  222. }
  223. void intr_clear_all(nasid_t nasid)
  224. {
  225. REMOTE_HUB_S(nasid, PI_INT_MASK0_A, 0);
  226. REMOTE_HUB_S(nasid, PI_INT_MASK0_B, 0);
  227. REMOTE_HUB_S(nasid, PI_INT_MASK1_A, 0);
  228. REMOTE_HUB_S(nasid, PI_INT_MASK1_B, 0);
  229. intr_clear_bits(nasid, REMOTE_HUB_ADDR(nasid, PI_INT_PEND0),
  230. INT_PEND0_BASELVL, "INT_PEND0");
  231. intr_clear_bits(nasid, REMOTE_HUB_ADDR(nasid, PI_INT_PEND1),
  232. INT_PEND1_BASELVL, "INT_PEND1");
  233. }
  234. void sn_mp_setup(void)
  235. {
  236. cnodeid_t cnode;
  237. #if 0
  238. cpuid_t cpu;
  239. #endif
  240. for (cnode = 0; cnode < numnodes; cnode++) {
  241. #if 0
  242. init_platform_nodepda();
  243. #endif
  244. intr_clear_all(COMPACT_TO_NASID_NODEID(cnode));
  245. }
  246. #if 0
  247. for (cpu = 0; cpu < maxcpus; cpu++) {
  248. init_platform_pda();
  249. }
  250. #endif
  251. }
  252. void per_hub_init(cnodeid_t cnode)
  253. {
  254. extern void pcibr_setup(cnodeid_t);
  255. cnodemask_t done;
  256. nasid_t nasid;
  257. nasid = COMPACT_TO_NASID_NODEID(cnode);
  258. spin_lock(&hub_mask_lock);
  259. /* Test our bit. */
  260. if (!(done = CNODEMASK_TSTB(hub_init_mask, cnode))) {
  261. /* Turn our bit on in the mask. */
  262. CNODEMASK_SETB(hub_init_mask, cnode);
  263. /*
  264.    * Do the actual initialization if it hasn't been done yet.
  265.    * We don't need to hold a lock for this work.
  266.    */
  267. /*
  268.  * Set CRB timeout at 5ms, (< PI timeout of 10ms)
  269.  */
  270. REMOTE_HUB_S(nasid, IIO_ICTP, 0x800);
  271. REMOTE_HUB_S(nasid, IIO_ICTO, 0xff);
  272. hub_rtc_init(cnode);
  273. pcibr_setup(cnode); 
  274. #ifdef CONFIG_REPLICATE_EXHANDLERS
  275. /*
  276.  * If this is not a headless node initialization, 
  277.  * copy over the caliased exception handlers.
  278.  */
  279. if (get_compact_nodeid() == cnode) {
  280. extern char except_vec0, except_vec1_r10k;
  281. extern char except_vec2_generic, except_vec3_generic;
  282. memcpy((void *)(KSEG0 + 0x100), &except_vec2_generic,
  283. 0x80);
  284. memcpy((void *)(KSEG0 + 0x180), &except_vec3_generic,
  285. 0x80);
  286. memcpy((void *)KSEG0, &except_vec0, 0x80);
  287. memcpy((void *)KSEG0 + 0x080, &except_vec1_r10k, 0x80);
  288. memcpy((void *)(KSEG0 + 0x100), (void *) KSEG0, 0x80);
  289. memcpy((void *)(KSEG0 + 0x180), &except_vec3_generic,
  290. 0x100);
  291. flush_cache_l1();
  292. flush_cache_l2();
  293. }
  294. #endif
  295. }
  296. spin_unlock(&hub_mask_lock);
  297. }
  298. /*
  299.  * This is similar to hard_smp_processor_id().
  300.  */
  301. cpuid_t getcpuid(void)
  302. {
  303. klcpu_t *klcpu;
  304. klcpu = nasid_slice_to_cpuinfo(get_nasid(),LOCAL_HUB_L(PI_CPU_NUM));
  305. return klcpu->cpu_info.virtid;
  306. }
  307. void per_cpu_init(void)
  308. {
  309. extern void install_cpu_nmi_handler(int slice);
  310. extern void load_mmu(void);
  311. static int is_slave = 0;
  312. int cpu = smp_processor_id();
  313. cnodeid_t cnode = get_compact_nodeid();
  314. current_cpu_data.asid_cache = ASID_FIRST_VERSION;
  315. TLBMISS_HANDLER_SETUP();
  316. #if 0
  317. intr_init();
  318. #endif
  319. set_cp0_status(ST0_IM, 0);
  320. per_hub_init(cnode);
  321. cpu_time_init();
  322. if (smp_processor_id()) /* master can't do this early, no kmalloc */
  323. install_cpuintr(cpu);
  324. /* Install our NMI handler if symmon hasn't installed one. */
  325. install_cpu_nmi_handler(cputoslice(cpu));
  326. #if 0
  327. install_tlbintr(cpu);
  328. #endif
  329. set_cp0_status(SRB_DEV0 | SRB_DEV1, SRB_DEV0 | SRB_DEV1);
  330. if (is_slave) {
  331. set_cp0_status(ST0_BEV, 0);
  332. if (mips4_available)
  333. set_cp0_status(ST0_XX, ST0_XX);
  334. set_cp0_status(ST0_KX|ST0_SX|ST0_UX, ST0_KX|ST0_SX|ST0_UX);
  335. sti();
  336. load_mmu();
  337. atomic_inc(&numstarted);
  338. } else {
  339. is_slave = 1;
  340. }
  341. }
  342. cnodeid_t get_compact_nodeid(void)
  343. {
  344. nasid_t nasid;
  345. nasid = get_nasid();
  346. /*
  347.  * Map the physical node id to a virtual node id (virtual node ids
  348.  * are contiguous).
  349.  */
  350. return NASID_TO_COMPACT_NODEID(nasid);
  351. }
  352. #ifdef CONFIG_SMP
  353. /*
  354.  * Takes as first input the PROM assigned cpu id, and the kernel
  355.  * assigned cpu id as the second.
  356.  */
  357. static void alloc_cpupda(cpuid_t cpu, int cpunum)
  358. {
  359. cnodeid_t node;
  360. nasid_t nasid;
  361. node = get_cpu_cnode(cpu);
  362. nasid = COMPACT_TO_NASID_NODEID(node);
  363. cputonasid(cpunum) = nasid;
  364. cputocnode(cpunum) = node;
  365. cputoslice(cpunum) = get_cpu_slice(cpu);
  366. cpu_data[cpunum].p_cpuid = cpu;
  367. }
  368. void __init smp_callin(void)
  369. {
  370. #if 0
  371. calibrate_delay();
  372. smp_store_cpu_info(cpuid);
  373. #endif
  374. }
  375. int __init start_secondary(void)
  376. {
  377. extern int cpu_idle(void);
  378. extern atomic_t smp_commenced;
  379. smp_callin();
  380. while (!atomic_read(&smp_commenced));
  381. return cpu_idle();
  382. }
  383. static volatile cpumask_t boot_barrier;
  384. void cboot(void)
  385. {
  386. CPUMASK_CLRB(boot_barrier, getcpuid()); /* needs atomicity */
  387. per_cpu_init();
  388. #if 0
  389. ecc_init();
  390. bte_lateinit();
  391. init_mfhi_war();
  392. #endif
  393. _flush_tlb_all();
  394. flush_cache_l1();
  395. flush_cache_l2();
  396. start_secondary();
  397. }
  398. void allowboot(void)
  399. {
  400. int num_cpus = 0;
  401. cpuid_t cpu, mycpuid = getcpuid();
  402. cnodeid_t cnode;
  403. extern void bootstrap(void);
  404. sn_mp_setup();
  405. /* Master has already done per_cpu_init() */
  406. install_cpuintr(smp_processor_id());
  407. #if 0
  408. bte_lateinit();
  409. ecc_init();
  410. #endif
  411. replicate_kernel_text(numnodes);
  412. boot_barrier = boot_cpumask;
  413. /* Launch slaves. */
  414. for (cpu = 0; cpu < maxcpus; cpu++) {
  415. if (cpu == mycpuid) {
  416. alloc_cpupda(cpu, num_cpus);
  417. num_cpus++;
  418. /* We're already started, clear our bit */
  419. CPUMASK_CLRB(boot_barrier, cpu);
  420. continue;
  421. }
  422. /* Skip holes in CPU space */
  423. if (CPUMASK_TSTB(boot_cpumask, cpu)) {
  424. struct task_struct *p;
  425. /*
  426.  * The following code is purely to make sure
  427.  * Linux can schedule processes on this slave.
  428.  */
  429. kernel_thread(0, NULL, CLONE_PID);
  430. p = init_task.prev_task;
  431. sprintf(p->comm, "%s%d", "Idle", num_cpus);
  432. init_tasks[num_cpus] = p;
  433. alloc_cpupda(cpu, num_cpus);
  434. del_from_runqueue(p);
  435. p->processor = num_cpus;
  436. p->cpus_runnable = 1 << num_cpus; /* we schedule the first task manually */
  437. unhash_process(p);
  438. /* Attach to the address space of init_task. */
  439. atomic_inc(&init_mm.mm_count);
  440. p->active_mm = &init_mm;
  441. /*
  442.    * Launch a slave into bootstrap().
  443.    * It doesn't take an argument, and we
  444.  * set sp to the kernel stack of the newly 
  445.  * created idle process, gp to the proc struct
  446.  * (so that current-> works).
  447.    */
  448. LAUNCH_SLAVE(cputonasid(num_cpus),cputoslice(num_cpus), 
  449. (launch_proc_t)MAPPED_KERN_RW_TO_K0(bootstrap),
  450. 0, (void *)((unsigned long)p + 
  451. KERNEL_STACK_SIZE - 32), (void *)p);
  452. /*
  453.  * Now optimistically set the mapping arrays. We
  454.  * need to wait here, verify the cpu booted up, then
  455.  * fire up the next cpu.
  456.  */
  457. __cpu_number_map[cpu] = num_cpus;
  458. __cpu_logical_map[num_cpus] = cpu;
  459. num_cpus++;
  460. /*
  461.  * Wait this cpu to start up and initialize its hub,
  462.  * and discover the io devices it will control.
  463.  * 
  464.  * XXX: We really want to fire up launch all the CPUs
  465.  * at once.  We have to preserve the order of the
  466.  * devices on the bridges first though.
  467.  */
  468. while(atomic_read(&numstarted) != num_cpus);
  469. }
  470. }
  471. #ifdef LATER
  472. Wait logic goes here.
  473. #endif
  474. for (cnode = 0; cnode < numnodes; cnode++) {
  475. #if 0
  476. if (cnodetocpu(cnode) == -1) {
  477. printk("Initializing headless hub,cnode %d", cnode);
  478. per_hub_init(cnode);
  479. }
  480. #endif
  481. }
  482. #if 0
  483. cpu_io_setup();
  484. init_mfhi_war();
  485. #endif
  486. smp_num_cpus = num_cpus;
  487. }
  488. #else /* CONFIG_SMP */
  489. void cboot(void) {}
  490. #endif /* CONFIG_SMP */
  491. #define rou_rflag rou_flags
  492. void
  493. router_recurse(klrou_t *router_a, klrou_t *router_b, int depth)
  494. {
  495. klrou_t *router;
  496. lboard_t *brd;
  497. int port;
  498. if (router_a->rou_rflag == 1)
  499. return;
  500. if (depth >= router_distance)
  501. return;
  502. router_a->rou_rflag = 1;
  503. for (port = 1; port <= MAX_ROUTER_PORTS; port++) {
  504. if (router_a->rou_port[port].port_nasid == INVALID_NASID)
  505. continue;
  506. brd = (lboard_t *)NODE_OFFSET_TO_K0(
  507. router_a->rou_port[port].port_nasid,
  508. router_a->rou_port[port].port_offset);
  509. if (brd->brd_type == KLTYPE_ROUTER) {
  510. router = (klrou_t *)NODE_OFFSET_TO_K0(NASID_GET(brd), brd->brd_compts[0]);
  511. if (router == router_b) {
  512. if (depth < router_distance)
  513. router_distance = depth;
  514. }
  515. else
  516. router_recurse(router, router_b, depth + 1);
  517. }
  518. }
  519. router_a->rou_rflag = 0;
  520. }
  521. int
  522. node_distance(nasid_t nasid_a, nasid_t nasid_b)
  523. {
  524. nasid_t nasid;
  525. cnodeid_t cnode;
  526. lboard_t *brd, *dest_brd;
  527. int port;
  528. klrou_t *router, *router_a = NULL, *router_b = NULL;
  529. /* Figure out which routers nodes in question are connected to */
  530. for (cnode = 0; cnode < numnodes; cnode++) {
  531. nasid = COMPACT_TO_NASID_NODEID(cnode);
  532. if (nasid == -1) continue;
  533. brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid),
  534. KLTYPE_ROUTER);
  535. if (!brd)
  536. continue;
  537. do {
  538. if (brd->brd_flags & DUPLICATE_BOARD)
  539. continue;
  540. router = (klrou_t *)NODE_OFFSET_TO_K0(NASID_GET(brd), brd->brd_compts[0]);
  541. router->rou_rflag = 0;
  542. for (port = 1; port <= MAX_ROUTER_PORTS; port++) {
  543. if (router->rou_port[port].port_nasid == INVALID_NASID)
  544. continue;
  545. dest_brd = (lboard_t *)NODE_OFFSET_TO_K0(
  546. router->rou_port[port].port_nasid,
  547. router->rou_port[port].port_offset);
  548. if (dest_brd->brd_type == KLTYPE_IP27) {
  549. if (dest_brd->brd_nasid == nasid_a)
  550. router_a = router;
  551. if (dest_brd->brd_nasid == nasid_b)
  552. router_b = router;
  553. }
  554. }
  555. } while ( (brd = find_lboard_class(KLCF_NEXT(brd), KLTYPE_ROUTER)) );
  556. }
  557. if (router_a == NULL) {
  558. printk("node_distance: router_a NULLn");
  559. return -1;
  560. }
  561. if (router_b == NULL) {
  562. printk("node_distance: router_b NULLn");
  563. return -1;
  564. }
  565. if (nasid_a == nasid_b)
  566. return 0;
  567. if (router_a == router_b)
  568. return 1;
  569. router_distance = 100;
  570. router_recurse(router_a, router_b, 2);
  571. return router_distance;
  572. }
  573. void
  574. init_topology_matrix(void)
  575. {
  576. nasid_t nasid, nasid2;
  577. cnodeid_t row, col;
  578. for (row = 0; row < MAX_COMPACT_NODES; row++)
  579. for (col = 0; col < MAX_COMPACT_NODES; col++)
  580. node_distances[row][col] = -1;
  581. for (row = 0; row < numnodes; row++) {
  582. nasid = COMPACT_TO_NASID_NODEID(row);
  583. for (col = 0; col < numnodes; col++) {
  584. nasid2 = COMPACT_TO_NASID_NODEID(col);
  585. node_distances[row][col] = node_distance(nasid, nasid2);
  586. }
  587. }
  588. }
  589. void
  590. dump_topology(void)
  591. {
  592. nasid_t nasid;
  593. cnodeid_t cnode;
  594. lboard_t *brd, *dest_brd;
  595. int port;
  596. int router_num = 0;
  597. klrou_t *router;
  598. cnodeid_t row, col;
  599. printk("************** Topology ********************n");
  600. printk("    ");
  601. for (col = 0; col < numnodes; col++)
  602. printk("%02d ", col);
  603. printk("n");
  604. for (row = 0; row < numnodes; row++) {
  605. printk("%02d  ", row);
  606. for (col = 0; col < numnodes; col++)
  607. printk("%2d ", node_distances[row][col]);
  608. printk("n");
  609. }
  610. for (cnode = 0; cnode < numnodes; cnode++) {
  611. nasid = COMPACT_TO_NASID_NODEID(cnode);
  612. if (nasid == -1) continue;
  613. brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid),
  614. KLTYPE_ROUTER);
  615. if (!brd)
  616. continue;
  617. do {
  618. if (brd->brd_flags & DUPLICATE_BOARD)
  619. continue;
  620. printk("Router %d:", router_num);
  621. router_num++;
  622. router = (klrou_t *)NODE_OFFSET_TO_K0(NASID_GET(brd), brd->brd_compts[0]);
  623. for (port = 1; port <= MAX_ROUTER_PORTS; port++) {
  624. if (router->rou_port[port].port_nasid == INVALID_NASID)
  625. continue;
  626. dest_brd = (lboard_t *)NODE_OFFSET_TO_K0(
  627. router->rou_port[port].port_nasid,
  628. router->rou_port[port].port_offset);
  629. if (dest_brd->brd_type == KLTYPE_IP27)
  630. printk(" %d", dest_brd->brd_nasid);
  631. if (dest_brd->brd_type == KLTYPE_ROUTER)
  632. printk(" r");
  633. }
  634. printk("n");
  635. } while ( (brd = find_lboard_class(KLCF_NEXT(brd), KLTYPE_ROUTER)) );
  636. }
  637. }
  638. #if 0
  639. #define brd_widgetnum brd_slot
  640. #define NODE_OFFSET_TO_KLINFO(n,off)    ((klinfo_t*) TO_NODE_CAC(n,off))
  641. void
  642. dump_klcfg(void)
  643. {
  644. cnodeid_t       cnode;
  645. int i;
  646. nasid_t         nasid;
  647. lboard_t        *lbptr;
  648. gda_t           *gdap;
  649. gdap = (gda_t *)GDA_ADDR(get_nasid());
  650. if (gdap->g_magic != GDA_MAGIC) {
  651. printk("dumpklcfg_cmd: Invalid GDA MAGICn");
  652. return;
  653. }
  654. for (cnode = 0; cnode < MAX_COMPACT_NODES; cnode ++) {
  655. nasid = gdap->g_nasidtable[cnode];
  656. if (nasid == INVALID_NASID)
  657. continue;
  658. printk("nDumpping klconfig Nasid %d:n", nasid);
  659. lbptr = KL_CONFIG_INFO(nasid);
  660. while (lbptr) {
  661. printk("    %s, Nasid %d, Module %d, widget 0x%x, partition %d, NIC 0x%x lboard 0x%lx",
  662. "board name here", /* BOARD_NAME(lbptr->brd_type), */
  663. lbptr->brd_nasid, lbptr->brd_module, 
  664. lbptr->brd_widgetnum,
  665. lbptr->brd_partition, 
  666. (lbptr->brd_nic), lbptr);
  667. if (lbptr->brd_flags & DUPLICATE_BOARD)
  668. printk(" -D");
  669. printk("n");
  670. for (i = 0; i < lbptr->brd_numcompts; i++) {
  671. klinfo_t *kli;
  672. kli = NODE_OFFSET_TO_KLINFO(NASID_GET(lbptr), lbptr->brd_compts[i]);                       
  673. printk("        type %2d, flags 0x%04x, diagval %3d, physid %4d, virtid %2d: %sn", 
  674. kli->struct_type, 
  675. kli->flags,
  676. kli->diagval,
  677. kli->physid,
  678. kli->virtid,
  679. "comp. name here");
  680. /* COMPONENT_NAME(kli->struct_type)); */
  681. }
  682. lbptr = KLCF_NEXT(lbptr);
  683. }
  684. }
  685. printk("n");
  686. /* Useful to print router maps also */
  687. for (cnode = 0; cnode < MAX_COMPACT_NODES; cnode ++) {
  688. klrou_t *kr;
  689. int i;
  690.          nasid = gdap->g_nasidtable[cnode];
  691.          if (nasid == INVALID_NASID)
  692.              continue;
  693.          lbptr = KL_CONFIG_INFO(nasid);
  694.          while (lbptr) {
  695. lbptr = find_lboard_class(lbptr, KLCLASS_ROUTER);
  696. if(!lbptr)
  697. break;
  698. if (!KL_CONFIG_DUPLICATE_BOARD(lbptr)) {
  699. printk("%llx -> n", lbptr->brd_nic);
  700. kr = (klrou_t *)find_first_component(lbptr,
  701. KLSTRUCT_ROU);
  702. for (i = 1; i <= MAX_ROUTER_PORTS; i++) {
  703. printk("[%d, %llx]; ",
  704. kr->rou_port[i].port_nasid,
  705. kr->rou_port[i].port_offset);
  706. }
  707. printk("n");
  708. }
  709. lbptr = KLCF_NEXT(lbptr);
  710.          }
  711.          printk("n");
  712.      }
  713. dump_topology();
  714. }
  715. #endif