Blame view

arch/mips/sgi-ip27/ip27-klconfig.c 2.87 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  /*
   * Copyright (C) 1999, 2000 Ralf Baechle (ralf@gnu.org)
   * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
   */
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/sched.h>
  #include <linux/interrupt.h>
  #include <linux/kernel_stat.h>
  #include <linux/param.h>
  #include <linux/timex.h>
  #include <linux/mm.h>
  
  #include <asm/sn/klconfig.h>
  #include <asm/sn/arch.h>
  #include <asm/sn/gda.h>
  
  klinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type)
  {
  	int index, j;
  
  	if (kli == (klinfo_t *)NULL) {
  		index = 0;
  	} else {
  		for (j = 0; j < KLCF_NUM_COMPS(brd); j++)
  			if (kli == KLCF_COMP(brd, j))
  				break;
  		index = j;
  		if (index == KLCF_NUM_COMPS(brd)) {
  			printk("find_component: Bad pointer: 0x%p
  ", kli);
  			return (klinfo_t *)NULL;
  		}
  		index++;		/* next component */
  	}
  
  	for (; index < KLCF_NUM_COMPS(brd); index++) {
  		kli = KLCF_COMP(brd, index);
  		if (KLCF_COMP_TYPE(kli) == struct_type)
  			return kli;
  	}
  
  	/* Didn't find it. */
  	return (klinfo_t *)NULL;
  }
  
  klinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type)
  {
  	return find_component(brd, (klinfo_t *)NULL, struct_type);
  }
78e6f4c03   Andrea Gelmini   MIPS: IP27: klcon...
51
  lboard_t *find_lboard(lboard_t *start, unsigned char brd_type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
56
57
58
59
60
61
  {
  	/* Search all boards stored on this node. */
  	while (start) {
  		if (start->brd_type == brd_type)
  			return start;
  		start = KLCF_NEXT(start);
  	}
  	/* Didn't find it. */
  	return (lboard_t *)NULL;
  }
78e6f4c03   Andrea Gelmini   MIPS: IP27: klcon...
62
  lboard_t *find_lboard_class(lboard_t *start, unsigned char brd_type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  {
  	/* Search all boards stored on this node. */
  	while (start) {
  		if (KLCLASS(start->brd_type) == KLCLASS(brd_type))
  			return start;
  		start = KLCF_NEXT(start);
  	}
  
  	/* Didn't find it. */
  	return (lboard_t *)NULL;
  }
  
  cnodeid_t get_cpu_cnode(cpuid_t cpu)
  {
  	return CPUID_TO_COMPACT_NODEID(cpu);
  }
78e6f4c03   Andrea Gelmini   MIPS: IP27: klcon...
79
  klcpu_t *nasid_slice_to_cpuinfo(nasid_t nasid, int slice)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  {
  	lboard_t *brd;
  	klcpu_t *acpu;
  
  	if (!(brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27)))
  		return (klcpu_t *)NULL;
  
  	if (!(acpu = (klcpu_t *)find_first_component(brd, KLSTRUCT_CPU)))
  		return (klcpu_t *)NULL;
  
  	do {
  		if ((acpu->cpu_info.physid) == slice)
  			return acpu;
  	} while ((acpu = (klcpu_t *)find_component(brd, (klinfo_t *)acpu,
  								KLSTRUCT_CPU)));
  	return (klcpu_t *)NULL;
  }
78e6f4c03   Andrea Gelmini   MIPS: IP27: klcon...
97
  klcpu_t *sn_get_cpuinfo(cpuid_t cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  {
  	nasid_t nasid;
  	int slice;
  	klcpu_t *acpu;
  	gda_t *gdap = GDA;
  	cnodeid_t cnode;
  
  	if (!(cpu < MAXCPUS)) {
  		printk("sn_get_cpuinfo: illegal cpuid 0x%lx
  ", cpu);
  		return NULL;
  	}
  
  	cnode = get_cpu_cnode(cpu);
  	if (cnode == INVALID_CNODEID)
  		return NULL;
  
  	if ((nasid = gdap->g_nasidtable[cnode]) == INVALID_NASID)
  		return NULL;
  
  	for (slice = 0; slice < CPUS_PER_NODE; slice++) {
  		acpu = nasid_slice_to_cpuinfo(nasid, slice);
  		if (acpu && acpu->cpu_info.virtid == cpu)
  			return acpu;
  	}
  	return NULL;
  }
  
  int get_cpu_slice(cpuid_t cpu)
  {
  	klcpu_t *acpu;
  
  	if ((acpu = sn_get_cpuinfo(cpu)) == NULL)
  		return -1;
  	return acpu->cpu_info.physid;
  }