bcu_vrip.c revision 1.13 1 1.13 takemura /* $NetBSD: bcu_vrip.c,v 1.13 2002/01/26 10:50:44 takemura Exp $ */
2 1.1 takemura
3 1.1 takemura /*-
4 1.7 sato * Copyright (c) 1999-2001 SATO Kazumi. All rights reserved.
5 1.1 takemura * Copyright (c) 1999 PocketBSD Project. All rights reserved.
6 1.1 takemura *
7 1.1 takemura * Redistribution and use in source and binary forms, with or without
8 1.1 takemura * modification, are permitted provided that the following conditions
9 1.1 takemura * are met:
10 1.1 takemura * 1. Redistributions of source code must retain the above copyright
11 1.1 takemura * notice, this list of conditions and the following disclaimer.
12 1.1 takemura * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 takemura * notice, this list of conditions and the following disclaimer in the
14 1.1 takemura * documentation and/or other materials provided with the distribution.
15 1.1 takemura * 3. All advertising materials mentioning features or use of this software
16 1.1 takemura * must display the following acknowledgement:
17 1.1 takemura * This product includes software developed by the PocketBSD project
18 1.1 takemura * and its contributors.
19 1.1 takemura * 4. Neither the name of the project nor the names of its contributors
20 1.1 takemura * may be used to endorse or promote products derived from this software
21 1.1 takemura * without specific prior written permission.
22 1.1 takemura *
23 1.1 takemura * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 1.1 takemura * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.1 takemura * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.1 takemura * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 1.1 takemura * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 1.1 takemura * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 1.1 takemura * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.1 takemura * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 1.1 takemura * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 1.1 takemura * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 1.1 takemura * SUCH DAMAGE.
34 1.1 takemura *
35 1.1 takemura */
36 1.1 takemura
37 1.1 takemura #include <sys/param.h>
38 1.1 takemura #include <sys/systm.h>
39 1.1 takemura #include <sys/device.h>
40 1.1 takemura #include <sys/reboot.h>
41 1.1 takemura
42 1.1 takemura #include <machine/bus.h>
43 1.13 takemura #include <machine/bitdisp.h>
44 1.1 takemura
45 1.1 takemura #include <mips/cpuregs.h>
46 1.1 takemura
47 1.7 sato #include "opt_vr41xx.h"
48 1.1 takemura #include <hpcmips/vr/vr.h>
49 1.7 sato #include <hpcmips/vr/vrcpudef.h>
50 1.1 takemura #include <hpcmips/vr/vripvar.h>
51 1.1 takemura #include <hpcmips/vr/vripreg.h>
52 1.1 takemura #include <hpcmips/vr/bcureg.h>
53 1.1 takemura #include <hpcmips/vr/bcuvar.h>
54 1.1 takemura
55 1.12 uch static int vrbcu_match(struct device *, struct cfdata *, void *);
56 1.12 uch static void vrbcu_attach(struct device *, struct device *, void *);
57 1.1 takemura
58 1.12 uch static void vrbcu_write(struct vrbcu_softc *, int, unsigned short);
59 1.12 uch static unsigned short vrbcu_read(struct vrbcu_softc *, int);
60 1.2 sato
61 1.12 uch static void vrbcu_dump_regs(void);
62 1.5 sato
63 1.2 sato char *vr_cpuname=NULL;
64 1.2 sato int vr_major=-1;
65 1.2 sato int vr_minor=-1;
66 1.2 sato int vr_cpuid=-1;
67 1.1 takemura
68 1.1 takemura struct cfattach vrbcu_ca = {
69 1.3 sato sizeof(struct vrbcu_softc), vrbcu_match, vrbcu_attach
70 1.1 takemura };
71 1.1 takemura
72 1.3 sato struct vrbcu_softc *the_bcu_sc = NULL;
73 1.3 sato
74 1.3 sato static inline void
75 1.12 uch vrbcu_write(struct vrbcu_softc *sc, int port, unsigned short val)
76 1.3 sato {
77 1.12 uch
78 1.3 sato bus_space_write_2(sc->sc_iot, sc->sc_ioh, port, val);
79 1.3 sato }
80 1.3 sato
81 1.3 sato static inline unsigned short
82 1.12 uch vrbcu_read(struct vrbcu_softc *sc, int port)
83 1.3 sato {
84 1.12 uch
85 1.12 uch return (bus_space_read_2(sc->sc_iot, sc->sc_ioh, port));
86 1.3 sato }
87 1.3 sato
88 1.1 takemura static int
89 1.12 uch vrbcu_match(struct device *parent, struct cfdata *cf, void *aux)
90 1.1 takemura {
91 1.12 uch
92 1.12 uch return (2);
93 1.1 takemura }
94 1.1 takemura
95 1.1 takemura static void
96 1.12 uch vrbcu_attach(struct device *parent, struct device *self, void *aux)
97 1.1 takemura {
98 1.1 takemura struct vrip_attach_args *va = aux;
99 1.3 sato struct vrbcu_softc *sc = (struct vrbcu_softc *)self;
100 1.1 takemura
101 1.3 sato sc->sc_iot = va->va_iot;
102 1.3 sato bus_space_map(sc->sc_iot, va->va_addr, va->va_size,
103 1.12 uch 0, /* no flags */
104 1.12 uch &sc->sc_ioh);
105 1.1 takemura
106 1.1 takemura printf("\n");
107 1.3 sato the_bcu_sc = sc;
108 1.5 sato vrbcu_dump_regs();
109 1.5 sato }
110 1.5 sato
111 1.5 sato static void
112 1.5 sato vrbcu_dump_regs()
113 1.5 sato {
114 1.5 sato struct vrbcu_softc *sc = the_bcu_sc;
115 1.7 sato int cpuclock = 0, tclock = 0, vtclock = 0, cpuid;
116 1.8 sato #if !defined(ONLY_VR4102)
117 1.7 sato int spdreg;
118 1.7 sato #endif
119 1.7 sato #ifdef VRBCUDEBUG
120 1.5 sato int reg;
121 1.7 sato #endif /* VRBCUDEBUG */
122 1.5 sato
123 1.7 sato cpuid = vrbcu_vrip_getcpuid();
124 1.8 sato #if !defined(ONLY_VR4181) && !defined(ONLY_VR4102)
125 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
126 1.12 uch && cpuid <= BCUREVID_RID_4131
127 1.12 uch && cpuid >= BCUREVID_RID_4111) {
128 1.7 sato spdreg = vrbcu_read(sc, BCUCLKSPEED_REG_W);
129 1.5 sato #ifdef VRBCUDEBUG
130 1.7 sato printf("vrbcu: CLKSPEED %x: \n", spdreg);
131 1.7 sato #endif /* VRBCUDEBUG */
132 1.7 sato }
133 1.7 sato #endif
134 1.8 sato #if defined VR4181
135 1.8 sato if (cpuid == BCUREVID_FIXRID_4181){
136 1.8 sato spdreg = vrbcu_read(sc, BCU81CLKSPEED_REG_W);
137 1.8 sato #ifdef VRBCUDEBUG
138 1.8 sato printf("vrbcu: CLKSPEED %x: \n", spdreg);
139 1.8 sato #endif /* VRBCUDEBUG */
140 1.8 sato }
141 1.8 sato #endif
142 1.7 sato
143 1.5 sato cpuclock = vrbcu_vrip_getcpuclock();
144 1.5 sato
145 1.5 sato switch (cpuid) {
146 1.8 sato #if defined VR4181
147 1.7 sato case BCUREVID_FIXRID_4181:
148 1.12 uch switch ((spdreg & BCU81CLKSPEED_DIVTMASK) >>
149 1.12 uch BCU81CLKSPEED_DIVTSHFT){
150 1.8 sato case BCU81CLKSPEED_DIVT1:
151 1.8 sato vtclock = tclock = cpuclock;
152 1.8 sato break;
153 1.8 sato case BCU81CLKSPEED_DIVT2:
154 1.8 sato vtclock = tclock = cpuclock/2;
155 1.8 sato break;
156 1.8 sato case BCU81CLKSPEED_DIVT3:
157 1.8 sato vtclock = tclock = cpuclock/3;
158 1.8 sato break;
159 1.8 sato case BCU81CLKSPEED_DIVT4:
160 1.8 sato vtclock = tclock = cpuclock/4;
161 1.8 sato break;
162 1.8 sato default:
163 1.8 sato vtclock = tclock = 0;
164 1.8 sato }
165 1.8 sato break;
166 1.8 sato #endif /* VR4181 */
167 1.5 sato case BCUREVID_RID_4101:
168 1.5 sato case BCUREVID_RID_4102:
169 1.5 sato vtclock = tclock = cpuclock/2;
170 1.5 sato break;
171 1.7 sato #if defined VR4111
172 1.5 sato case BCUREVID_RID_4111:
173 1.7 sato if ((spdreg&BCUCLKSPEED_DIVT2B) == 0)
174 1.5 sato vtclock = tclock = cpuclock/2;
175 1.7 sato else if ((spdreg&BCUCLKSPEED_DIVT3B) == 0)
176 1.5 sato vtclock = tclock = cpuclock/3;
177 1.7 sato else if ((spdreg&BCUCLKSPEED_DIVT4B) == 0)
178 1.5 sato vtclock = tclock = cpuclock/4;
179 1.5 sato else
180 1.5 sato vtclock = tclock = 0; /* XXX */
181 1.5 sato break;
182 1.7 sato #endif /* VR4111 */
183 1.7 sato #if defined VR4121
184 1.5 sato case BCUREVID_RID_4121:
185 1.12 uch {
186 1.12 uch int vt;
187 1.12 uch tclock = cpuclock / ((spdreg & BCUCLKSPEED_DIVTMASK) >>
188 1.12 uch BCUCLKSPEED_DIVTSHFT);
189 1.12 uch vt = ((spdreg & BCUCLKSPEED_DIVVTMASK) >>
190 1.12 uch BCUCLKSPEED_DIVVTSHFT);
191 1.12 uch if (vt == 0)
192 1.12 uch vtclock = 0; /* XXX */
193 1.12 uch else if (vt < 0x9)
194 1.12 uch vtclock = cpuclock / vt;
195 1.12 uch else
196 1.12 uch vtclock = cpuclock / ((vt - 8)*2+1) * 2;
197 1.12 uch }
198 1.12 uch break;
199 1.7 sato #endif /* VR4121 */
200 1.11 sato #if defined VR4122 || defined VR4131
201 1.9 enami case BCUREVID_RID_4122:
202 1.11 sato case BCUREVID_RID_4131:
203 1.12 uch {
204 1.12 uch int vtdiv;
205 1.9 enami
206 1.12 uch vtdiv = ((spdreg & BCUCLKSPEED_VTDIVMODE) >>
207 1.12 uch BCUCLKSPEED_VTDIVSHFT);
208 1.12 uch if (vtdiv == 0 || vtdiv > BCUCLKSPEED_VTDIV6)
209 1.12 uch vtclock = 0; /* XXX */
210 1.12 uch else
211 1.12 uch vtclock = cpuclock / vtdiv;
212 1.12 uch tclock = vtclock /
213 1.12 uch (((spdreg & BCUCLKSPEED_TDIVMODE) >>
214 1.12 uch BCUCLKSPEED_TDIVSHFT) ? 4 : 2);
215 1.12 uch }
216 1.12 uch break;
217 1.11 sato #endif /* VR4122 || VR4131 */
218 1.5 sato default:
219 1.5 sato break;
220 1.5 sato }
221 1.7 sato if (tclock)
222 1.7 sato printf("%s: cpu %d.%03dMHz, bus %d.%03dMHz, ram %d.%03dMHz\n",
223 1.12 uch sc->sc_dev.dv_xname,
224 1.12 uch cpuclock/1000000, (cpuclock%1000000)/1000,
225 1.12 uch tclock/1000000, (tclock%1000000)/1000,
226 1.12 uch vtclock/1000000, (vtclock%1000000)/1000);
227 1.7 sato else {
228 1.7 sato printf("%s: cpu %d.%03dMHz\n",
229 1.12 uch sc->sc_dev.dv_xname,
230 1.12 uch cpuclock/1000000, (cpuclock%1000000)/1000);
231 1.12 uch printf("%s: UNKNOWN BUS CLOCK SPEED:"
232 1.12 uch " CPU is UNKNOWN or NOT CONFIGURED\n",
233 1.12 uch sc->sc_dev.dv_xname);
234 1.7 sato }
235 1.5 sato #ifdef VRBCUDEBUG
236 1.7 sato reg = vrbcu_read(sc, BCUCNT1_REG_W);
237 1.7 sato printf("vrbcu: CNT1 %x: ", reg);
238 1.7 sato bitdisp16(reg);
239 1.7 sato #if !defined(ONLY_VR4181)
240 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
241 1.12 uch && cpuid <= BCUREVID_RID_4121
242 1.12 uch && cpuid >= BCUREVID_RID_4102) {
243 1.7 sato reg = vrbcu_read(sc, BCUCNT2_REG_W);
244 1.7 sato printf("vrbcu: CNT2 %x: ", reg);
245 1.7 sato bitdisp16(reg);
246 1.7 sato }
247 1.7 sato #endif /* !defined ONLY_VR4181 */
248 1.11 sato #if !defined(ONLY_VR4181) || !defined(ONLY_VR4122_4131)
249 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
250 1.12 uch && cpuid <= BCUREVID_RID_4121
251 1.12 uch && cpuid >= BCUREVID_RID_4102) {
252 1.7 sato reg = vrbcu_read(sc, BCUSPEED_REG_W);
253 1.7 sato printf("vrbcu: SPEED %x: ", reg);
254 1.7 sato bitdisp16(reg);
255 1.7 sato reg = vrbcu_read(sc, BCUERRST_REG_W);
256 1.7 sato printf("vrbcu: ERRST %x: ", reg);
257 1.7 sato bitdisp16(reg);
258 1.7 sato reg = vrbcu_read(sc, BCURFCNT_REG_W);
259 1.7 sato printf("vrbcu: RFCNT %x\n", reg);
260 1.7 sato reg = vrbcu_read(sc, BCUREFCOUNT_REG_W);
261 1.7 sato printf("vrbcu: RFCOUNT %x\n", reg);
262 1.7 sato }
263 1.11 sato #endif /* !defined(ONLY_VR4181) || !defined(ONLY_VR4122_4131) */
264 1.7 sato #if !defined(ONLY_VR4181)
265 1.7 sato if (cpuid != BCUREVID_FIXRID_4181
266 1.12 uch && cpuid <= BCUREVID_RID_4131
267 1.12 uch && cpuid >= BCUREVID_RID_4111)
268 1.7 sato {
269 1.5 sato reg = vrbcu_read(sc, BCUCNT3_REG_W);
270 1.5 sato printf("vrbcu: CNT3 %x: ", reg);
271 1.5 sato bitdisp16(reg);
272 1.5 sato }
273 1.7 sato #endif /* !defined ONLY_VR4181 */
274 1.5 sato #endif /* VRBCUDEBUG */
275 1.5 sato
276 1.1 takemura }
277 1.1 takemura
278 1.1 takemura static char *cpuname[] = {
279 1.7 sato "VR4101", /* 0 */
280 1.7 sato "VR4102", /* 1 */
281 1.7 sato "VR4111", /* 2 */
282 1.7 sato "VR4121", /* 3 */
283 1.7 sato "VR4122", /* 4 */
284 1.11 sato "VR4131", /* 5 */
285 1.7 sato "UNKNOWN",
286 1.7 sato "UNKNOWN",
287 1.1 takemura "UNKNOWN",
288 1.1 takemura "UNKNOWN",
289 1.1 takemura "UNKNOWN",
290 1.7 sato "UNKNOWN",
291 1.7 sato "UNKNOWN",
292 1.7 sato "UNKNOWN",
293 1.7 sato "UNKNOWN",
294 1.7 sato "UNKNOWN",
295 1.7 sato "VR4181", /* 0x10 + 0 */
296 1.7 sato };
297 1.1 takemura
298 1.2 sato int
299 1.2 sato vrbcu_vrip_getcpuid(void)
300 1.2 sato {
301 1.2 sato volatile u_int16_t *revreg;
302 1.2 sato
303 1.2 sato if (vr_cpuid != -1)
304 1.12 uch return (vr_cpuid);
305 1.2 sato
306 1.2 sato if (vr_cpuid == -1) {
307 1.8 sato if (VRIP_BCU_ADDR == VR4181_BCU_ADDR)
308 1.12 uch revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
309 1.12 uch ((VRIP_BCU_ADDR+BCU81REVID_REG_W));
310 1.8 sato else
311 1.12 uch revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
312 1.12 uch ((VRIP_BCU_ADDR+BCUREVID_REG_W));
313 1.2 sato
314 1.2 sato vr_cpuid = *revreg;
315 1.2 sato vr_cpuid = (vr_cpuid&BCUREVID_RIDMASK)>>BCUREVID_RIDSHFT;
316 1.8 sato if (VRIP_BCU_ADDR == VR4181_BCU_ADDR
317 1.8 sato && vr_cpuid == BCUREVID_RID_4181) /* conflict vr4101 */
318 1.7 sato vr_cpuid = BCUREVID_FIXRID_4181;
319 1.2 sato }
320 1.12 uch return (vr_cpuid);
321 1.2 sato }
322 1.2 sato
323 1.1 takemura char *
324 1.1 takemura vrbcu_vrip_getcpuname(void)
325 1.1 takemura {
326 1.2 sato int cpuid;
327 1.1 takemura
328 1.2 sato if (vr_cpuname != NULL)
329 1.12 uch return (vr_cpuname);
330 1.1 takemura
331 1.2 sato cpuid = vrbcu_vrip_getcpuid();
332 1.2 sato vr_cpuname = cpuname[cpuid];
333 1.12 uch
334 1.12 uch return (vr_cpuname);
335 1.1 takemura }
336 1.1 takemura
337 1.2 sato
338 1.1 takemura int
339 1.1 takemura vrbcu_vrip_getcpumajor(void)
340 1.1 takemura {
341 1.1 takemura volatile u_int16_t *revreg;
342 1.2 sato
343 1.2 sato if (vr_major != -1)
344 1.12 uch return (vr_major);
345 1.1 takemura
346 1.12 uch revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
347 1.12 uch ((VRIP_BCU_ADDR+BCUREVID_REG_W));
348 1.1 takemura
349 1.2 sato vr_major = *revreg;
350 1.2 sato vr_major = (vr_major&BCUREVID_MJREVMASK)>>BCUREVID_MJREVSHFT;
351 1.12 uch
352 1.12 uch return (vr_major);
353 1.1 takemura }
354 1.1 takemura
355 1.1 takemura int
356 1.1 takemura vrbcu_vrip_getcpuminor(void)
357 1.1 takemura {
358 1.1 takemura volatile u_int16_t *revreg;
359 1.2 sato
360 1.2 sato if (vr_minor != -1)
361 1.12 uch return (vr_minor);
362 1.1 takemura
363 1.12 uch revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1
364 1.12 uch ((VRIP_BCU_ADDR+BCUREVID_REG_W));
365 1.1 takemura
366 1.2 sato vr_minor = *revreg;
367 1.2 sato vr_minor = (vr_minor&BCUREVID_MNREVMASK)>>BCUREVID_MNREVSHFT;
368 1.12 uch
369 1.12 uch return (vr_minor);
370 1.1 takemura }
371 1.4 shin
372 1.4 shin #define CLKX 18432000 /* CLKX1,CLKX2: 18.432MHz */
373 1.4 shin #define MHZ 1000000
374 1.4 shin
375 1.4 shin int
376 1.4 shin vrbcu_vrip_getcpuclock(void)
377 1.4 shin {
378 1.4 shin u_int16_t clksp;
379 1.4 shin int cpuid, cpuclock;
380 1.4 shin
381 1.4 shin cpuid = vrbcu_vrip_getcpuid();
382 1.7 sato if (cpuid != BCUREVID_FIXRID_4181 && cpuid >= BCUREVID_RID_4111) {
383 1.12 uch clksp = *(u_int16_t *)MIPS_PHYS_TO_KSEG1
384 1.12 uch ((VRIP_BCU_ADDR+BCUCLKSPEED_REG_W)) &
385 1.12 uch BCUCLKSPEED_CLKSPMASK;
386 1.8 sato } else if (cpuid == BCUREVID_FIXRID_4181) {
387 1.12 uch clksp = *(u_int16_t *)MIPS_PHYS_TO_KSEG1
388 1.12 uch ((VRIP_BCU_ADDR+BCU81CLKSPEED_REG_W)) &
389 1.12 uch BCUCLKSPEED_CLKSPMASK;
390 1.7 sato }
391 1.4 shin
392 1.4 shin switch (cpuid) {
393 1.7 sato case BCUREVID_FIXRID_4181:
394 1.8 sato cpuclock = CLKX / clksp * 64;
395 1.7 sato /* branch delay is 1 clock; 2 clock/loop */
396 1.7 sato cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
397 1.7 sato break;
398 1.4 shin case BCUREVID_RID_4101:
399 1.4 shin /* assume 33MHz */
400 1.4 shin cpuclock = 33000000;
401 1.4 shin /* branch delay is 1 clock; 2 clock/loop */
402 1.4 shin cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
403 1.4 shin break;
404 1.4 shin case BCUREVID_RID_4102:
405 1.4 shin cpuclock = CLKX / clksp * 32;
406 1.4 shin /* branch delay is 1 clock; 2 clock/loop */
407 1.4 shin cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
408 1.4 shin break;
409 1.4 shin case BCUREVID_RID_4111:
410 1.4 shin cpuclock = CLKX / clksp * 64;
411 1.4 shin /* branch delay is 1 clock; 2 clock/loop */
412 1.4 shin cpuspeed = (cpuclock / 2 + MHZ / 2) / MHZ;
413 1.4 shin break;
414 1.4 shin case BCUREVID_RID_4121:
415 1.4 shin cpuclock = CLKX / clksp * 64;
416 1.9 enami /* branch delay is 2 clock; 3 clock/loop */
417 1.9 enami cpuspeed = (cpuclock / 3 + MHZ / 2) / MHZ;
418 1.9 enami break;
419 1.9 enami case BCUREVID_RID_4122:
420 1.11 sato cpuclock = CLKX / clksp * 98;
421 1.11 sato /* branch delay is 2 clock; 3 clock/loop */
422 1.11 sato cpuspeed = (cpuclock / 3 + MHZ / 2) / MHZ;
423 1.11 sato break;
424 1.11 sato case BCUREVID_RID_4131:
425 1.9 enami cpuclock = CLKX / clksp * 98;
426 1.4 shin /* branch delay is 2 clock; 3 clock/loop */
427 1.4 shin cpuspeed = (cpuclock / 3 + MHZ / 2) / MHZ;
428 1.4 shin break;
429 1.4 shin default:
430 1.4 shin panic("unknown CPU type %d\n", cpuid);
431 1.4 shin break;
432 1.4 shin }
433 1.12 uch
434 1.12 uch return (cpuclock);
435 1.4 shin }
436