cpunode.c revision 1.1.4.1 1 1.1.4.1 jruoho /* $NetBSD: cpunode.c,v 1.1.4.1 2011/06/06 09:06:26 jruoho Exp $ */
2 1.1.4.1 jruoho /*-
3 1.1.4.1 jruoho * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
4 1.1.4.1 jruoho * All rights reserved.
5 1.1.4.1 jruoho *
6 1.1.4.1 jruoho * This code is derived from software contributed to The NetBSD Foundation
7 1.1.4.1 jruoho * by Raytheon BBN Technologies Corp and Defense Advanced Research Projects
8 1.1.4.1 jruoho * Agency and which was developed by Matt Thomas of 3am Software Foundry.
9 1.1.4.1 jruoho *
10 1.1.4.1 jruoho * This material is based upon work supported by the Defense Advanced Research
11 1.1.4.1 jruoho * Projects Agency and Space and Naval Warfare Systems Center, Pacific, under
12 1.1.4.1 jruoho * Contract No. N66001-09-C-2073.
13 1.1.4.1 jruoho * Approved for Public Release, Distribution Unlimited
14 1.1.4.1 jruoho *
15 1.1.4.1 jruoho * Redistribution and use in source and binary forms, with or without
16 1.1.4.1 jruoho * modification, are permitted provided that the following conditions
17 1.1.4.1 jruoho * are met:
18 1.1.4.1 jruoho * 1. Redistributions of source code must retain the above copyright
19 1.1.4.1 jruoho * notice, this list of conditions and the following disclaimer.
20 1.1.4.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright
21 1.1.4.1 jruoho * notice, this list of conditions and the following disclaimer in the
22 1.1.4.1 jruoho * documentation and/or other materials provided with the distribution.
23 1.1.4.1 jruoho *
24 1.1.4.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
25 1.1.4.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26 1.1.4.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27 1.1.4.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
28 1.1.4.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 1.1.4.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 1.1.4.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 1.1.4.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 1.1.4.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 1.1.4.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 1.1.4.1 jruoho * POSSIBILITY OF SUCH DAMAGE.
35 1.1.4.1 jruoho */
36 1.1.4.1 jruoho
37 1.1.4.1 jruoho #include <sys/cdefs.h>
38 1.1.4.1 jruoho
39 1.1.4.1 jruoho __KERNEL_RCSID(0, "$NetBSD: cpunode.c,v 1.1.4.1 2011/06/06 09:06:26 jruoho Exp $");
40 1.1.4.1 jruoho
41 1.1.4.1 jruoho #include <sys/param.h>
42 1.1.4.1 jruoho #include <sys/device.h>
43 1.1.4.1 jruoho #include <sys/cpu.h>
44 1.1.4.1 jruoho
45 1.1.4.1 jruoho #include "ioconf.h"
46 1.1.4.1 jruoho
47 1.1.4.1 jruoho #include <powerpc/booke/cpuvar.h>
48 1.1.4.1 jruoho
49 1.1.4.1 jruoho static int cpunode_match(device_t, cfdata_t, void *);
50 1.1.4.1 jruoho static void cpunode_attach(device_t, device_t, void *);
51 1.1.4.1 jruoho
52 1.1.4.1 jruoho CFATTACH_DECL_NEW(cpunode, sizeof(struct cpunode_softc),
53 1.1.4.1 jruoho cpunode_match, cpunode_attach, NULL, NULL);
54 1.1.4.1 jruoho
55 1.1.4.1 jruoho static u_int nodes;
56 1.1.4.1 jruoho
57 1.1.4.1 jruoho static int
58 1.1.4.1 jruoho cpunode_match(device_t parent, cfdata_t cf, void *aux)
59 1.1.4.1 jruoho {
60 1.1.4.1 jruoho struct mainbus_attach_args * const ma = aux;
61 1.1.4.1 jruoho if (strcmp(ma->ma_name, cpunode_cd.cd_name) != 0)
62 1.1.4.1 jruoho return 0;
63 1.1.4.1 jruoho
64 1.1.4.1 jruoho if (ma->ma_node > 8 || (nodes & (1 << ma->ma_node)))
65 1.1.4.1 jruoho return 0;
66 1.1.4.1 jruoho
67 1.1.4.1 jruoho return 1;
68 1.1.4.1 jruoho }
69 1.1.4.1 jruoho
70 1.1.4.1 jruoho static int
71 1.1.4.1 jruoho cpunode_print(void *aux, const char *pnp)
72 1.1.4.1 jruoho {
73 1.1.4.1 jruoho struct cpunode_attach_args *cna = aux;
74 1.1.4.1 jruoho
75 1.1.4.1 jruoho if (pnp)
76 1.1.4.1 jruoho #if 0
77 1.1.4.1 jruoho return QUIET;
78 1.1.4.1 jruoho #else
79 1.1.4.1 jruoho aprint_normal("%s at %s", cna->cna_locs.cnl_name, pnp);
80 1.1.4.1 jruoho #endif
81 1.1.4.1 jruoho
82 1.1.4.1 jruoho if (cna->cna_locs.cnl_instance != 0)
83 1.1.4.1 jruoho aprint_normal(" instance %d", cna->cna_locs.cnl_instance);
84 1.1.4.1 jruoho
85 1.1.4.1 jruoho return UNCONF;
86 1.1.4.1 jruoho }
87 1.1.4.1 jruoho
88 1.1.4.1 jruoho static void
89 1.1.4.1 jruoho cpunode_attach(device_t parent, device_t self, void *aux)
90 1.1.4.1 jruoho {
91 1.1.4.1 jruoho const struct cpunode_locators *cnl = cpu_md_ops.md_cpunode_locs;
92 1.1.4.1 jruoho struct cpunode_softc * const sc = device_private(self);
93 1.1.4.1 jruoho struct mainbus_attach_args * const ma = aux;
94 1.1.4.1 jruoho struct cpunode_attach_args cna;
95 1.1.4.1 jruoho
96 1.1.4.1 jruoho sc->sc_dev = self;
97 1.1.4.1 jruoho
98 1.1.4.1 jruoho aprint_normal("\n");
99 1.1.4.1 jruoho aprint_normal_dev(self,
100 1.1.4.1 jruoho "%"PRIu64"KB/%"PRIu64"B %"PRIu64"-banked %"PRIu64"-way unified L2 cache\n",
101 1.1.4.1 jruoho board_info_get_number("l2-cache-size") / 1024,
102 1.1.4.1 jruoho board_info_get_number("l2-cache-line-size"),
103 1.1.4.1 jruoho board_info_get_number("l2-cache-banks"),
104 1.1.4.1 jruoho board_info_get_number("l2-cache-ways"));
105 1.1.4.1 jruoho
106 1.1.4.1 jruoho nodes |= 1 << ma->ma_node;
107 1.1.4.1 jruoho
108 1.1.4.1 jruoho const uint16_t my_id = board_info_get_number("my-id");
109 1.1.4.1 jruoho
110 1.1.4.1 jruoho for (u_int childmask = 1; cnl->cnl_name != NULL; cnl++) {
111 1.1.4.1 jruoho bool inclusive = true;
112 1.1.4.1 jruoho bool found = (cnl->cnl_ids[0] == 0);
113 1.1.4.1 jruoho
114 1.1.4.1 jruoho #if DEBUG > 1
115 1.1.4.1 jruoho aprint_normal_dev(self, "dev=%s[%u], addr=%x@%x",
116 1.1.4.1 jruoho cnl->cnl_name, cnl->cnl_instance, cnl->cnl_size,
117 1.1.4.1 jruoho cnl->cnl_addr);
118 1.1.4.1 jruoho if (cnl->cnl_nintr > 0) {
119 1.1.4.1 jruoho aprint_normal(", intrs=%u", cnl->cnl_intrs[0]);
120 1.1.4.1 jruoho for (u_int i = 1; i < cnl->cnl_nintr; i++)
121 1.1.4.1 jruoho aprint_normal(",%u", cnl->cnl_intrs[i]);
122 1.1.4.1 jruoho }
123 1.1.4.1 jruoho aprint_normal("\n");
124 1.1.4.1 jruoho #endif
125 1.1.4.1 jruoho
126 1.1.4.1 jruoho for (u_int i = 0;
127 1.1.4.1 jruoho !found
128 1.1.4.1 jruoho && i < __arraycount(cnl->cnl_ids)
129 1.1.4.1 jruoho && cnl->cnl_ids[i] != 0;
130 1.1.4.1 jruoho i++) {
131 1.1.4.1 jruoho if (cnl->cnl_ids[i] == 0xffff) {
132 1.1.4.1 jruoho inclusive = false;
133 1.1.4.1 jruoho continue;
134 1.1.4.1 jruoho }
135 1.1.4.1 jruoho found = (cnl->cnl_ids[i] == my_id);
136 1.1.4.1 jruoho }
137 1.1.4.1 jruoho /*
138 1.1.4.1 jruoho * found & inclusive == match
139 1.1.4.1 jruoho * !found & !inclusive == match
140 1.1.4.1 jruoho * found & !inclusive == no match
141 1.1.4.1 jruoho * !found & inclusive == no match
142 1.1.4.1 jruoho * therefore
143 1.1.4.1 jruoho * found ^ inclusive = no match
144 1.1.4.1 jruoho * so
145 1.1.4.1 jruoho * !(found ^ inclusive) = match
146 1.1.4.1 jruoho */
147 1.1.4.1 jruoho if (found ^ inclusive)
148 1.1.4.1 jruoho continue;
149 1.1.4.1 jruoho
150 1.1.4.1 jruoho cna.cna_busname = "cpunode";
151 1.1.4.1 jruoho cna.cna_memt = ma->ma_memt;
152 1.1.4.1 jruoho cna.cna_le_memt = ma->ma_le_memt;
153 1.1.4.1 jruoho cna.cna_dmat = ma->ma_dmat;
154 1.1.4.1 jruoho cna.cna_childmask = childmask;
155 1.1.4.1 jruoho cna.cna_locs = *cnl;
156 1.1.4.1 jruoho
157 1.1.4.1 jruoho (void)config_found_sm_loc(self, "cpunode", NULL, &cna,
158 1.1.4.1 jruoho cpunode_print, NULL);
159 1.1.4.1 jruoho childmask <<= 1;
160 1.1.4.1 jruoho }
161 1.1.4.1 jruoho /*
162 1.1.4.1 jruoho * Anything MD left to do?
163 1.1.4.1 jruoho */
164 1.1.4.1 jruoho if (cpu_md_ops.md_cpunode_attach != NULL)
165 1.1.4.1 jruoho (*cpu_md_ops.md_cpunode_attach)(parent, self, aux);
166 1.1.4.1 jruoho }
167 1.1.4.1 jruoho
168 1.1.4.1 jruoho static int cpu_match(device_t, cfdata_t, void *);
169 1.1.4.1 jruoho static void cpu_attach(device_t, device_t, void *);
170 1.1.4.1 jruoho
171 1.1.4.1 jruoho CFATTACH_DECL_NEW(cpu, 0,
172 1.1.4.1 jruoho cpu_match, cpu_attach, NULL, NULL);
173 1.1.4.1 jruoho
174 1.1.4.1 jruoho static int
175 1.1.4.1 jruoho cpu_match(device_t parent, cfdata_t cf, void *aux)
176 1.1.4.1 jruoho {
177 1.1.4.1 jruoho struct cpunode_softc * const psc = device_private(parent);
178 1.1.4.1 jruoho struct cpunode_attach_args * const cna = aux;
179 1.1.4.1 jruoho
180 1.1.4.1 jruoho if (strcmp(cna->cna_locs.cnl_name, cpu_cd.cd_name) != 0)
181 1.1.4.1 jruoho return 0;
182 1.1.4.1 jruoho
183 1.1.4.1 jruoho if (psc->sc_children & cna->cna_childmask)
184 1.1.4.1 jruoho return 0;
185 1.1.4.1 jruoho
186 1.1.4.1 jruoho return 1;
187 1.1.4.1 jruoho }
188 1.1.4.1 jruoho
189 1.1.4.1 jruoho static void
190 1.1.4.1 jruoho cpu_attach(device_t parent, device_t self, void *aux)
191 1.1.4.1 jruoho {
192 1.1.4.1 jruoho struct cpunode_softc * const psc = device_private(parent);
193 1.1.4.1 jruoho struct cpunode_attach_args * const cna = aux;
194 1.1.4.1 jruoho
195 1.1.4.1 jruoho psc->sc_children |= cna->cna_childmask;
196 1.1.4.1 jruoho
197 1.1.4.1 jruoho aprint_normal("\n");
198 1.1.4.1 jruoho
199 1.1.4.1 jruoho (*cpu_md_ops.md_cpu_attach)(self, cna->cna_locs.cnl_instance);
200 1.1.4.1 jruoho }
201