Locore.c revision 1.16 1 /* $NetBSD: Locore.c,v 1.16 2017/09/15 13:25:34 martin Exp $ */
2
3 /*
4 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
5 * Copyright (C) 1995, 1996 TooLs GmbH.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by TooLs GmbH.
19 * 4. The name of TooLs GmbH may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #include <lib/libsa/stand.h>
35 #include "openfirm.h"
36
37 #include <machine/cpu.h>
38 #include <machine/vmparam.h>
39
40 /*
41 * We are trying to boot a sparc v9 cpu, so openfirmware has to be 64bit,
42 * and the kernel we load will be dealing with 64bits too (even if it is
43 * a 32bit kernel.
44 * Make sure we picked up the right defines:
45 */
46 __CTASSERT(sizeof(cell_t)==8);
47 __CTASSERT(sizeof(paddr_t)==8);
48
49 extern int openfirmware(void *);
50
51
52 __dead void
53 _rtt(void)
54 {
55
56 OF_exit();
57 }
58
59 void __attribute__((__noreturn__))
60 OF_exit(void)
61 {
62 struct {
63 cell_t name;
64 cell_t nargs;
65 cell_t nreturns;
66 } args;
67
68 args.name = ADR2CELL("exit");
69 args.nargs = 0;
70 args.nreturns = 0;
71 openfirmware(&args);
72
73 printf("OF_exit failed");
74 for (;;)
75 continue;
76 }
77
78 void
79 OF_enter(void)
80 {
81 struct {
82 cell_t name;
83 cell_t nargs;
84 cell_t nreturns;
85 } args;
86
87 args.name = ADR2CELL("enter");
88 args.nargs = 0;
89 args.nreturns = 0;
90 openfirmware(&args);
91 }
92
93 int
94 OF_finddevice(const char *name)
95 {
96 struct {
97 cell_t name;
98 cell_t nargs;
99 cell_t nreturns;
100 cell_t device;
101 cell_t phandle;
102 } args;
103
104 args.name = ADR2CELL("finddevice");
105 args.nargs = 1;
106 args.nreturns = 1;
107 args.device = ADR2CELL(name);
108 if (openfirmware(&args) == -1)
109 return -1;
110 return args.phandle;
111 }
112
113 int
114 OF_instance_to_package(int ihandle)
115 {
116 struct {
117 cell_t name;
118 cell_t nargs;
119 cell_t nreturns;
120 cell_t ihandle;
121 cell_t phandle;
122 } args;
123
124 args.name = ADR2CELL("instance-to-package");
125 args.nargs = 1;
126 args.nreturns = 1;
127 args.ihandle = HDL2CELL(ihandle);
128 if (openfirmware(&args) == -1)
129 return -1;
130 return args.phandle;
131 }
132
133 int
134 OF_instance_to_path(int ihandle, char *buf, int buflen)
135 {
136 struct {
137 cell_t name;
138 cell_t nargs;
139 cell_t nreturns;
140 cell_t ihandle;
141 cell_t buf;
142 cell_t buflen;
143 cell_t length;
144 } args;
145
146 args.name = ADR2CELL("instance-to-path");
147 args.nargs = 3;
148 args.nreturns = 1;
149 args.ihandle = HDL2CELL(ihandle);
150 args.buf = ADR2CELL(buf);
151 args.buflen = buflen;
152 if (openfirmware(&args) < 0)
153 return -1;
154 return args.length;
155 }
156
157 int
158 OF_parent(int phandle)
159 {
160 struct {
161 cell_t name;
162 cell_t nargs;
163 cell_t nreturns;
164 cell_t phandle;
165 cell_t parent;
166 } args;
167
168 args.name = ADR2CELL("parent");
169 args.nargs = 1;
170 args.nreturns = 1;
171 args.phandle = HDL2CELL(phandle);
172 if (openfirmware(&args) == -1)
173 return 0;
174 return args.parent;
175 }
176
177 int
178 OF_getprop(int handle, const char *prop, void *buf, int buflen)
179 {
180 struct {
181 cell_t name;
182 cell_t nargs;
183 cell_t nreturns;
184 cell_t phandle;
185 cell_t prop;
186 cell_t buf;
187 cell_t buflen;
188 cell_t size;
189 } args;
190
191 args.name = ADR2CELL("getprop");
192 args.nargs = 4;
193 args.nreturns = 1;
194 args.phandle = HDL2CELL(handle);
195 args.prop = ADR2CELL(prop);
196 args.buf = ADR2CELL(buf);
197 args.buflen = buflen;
198 if (openfirmware(&args) == -1)
199 return -1;
200 return args.size;
201 }
202
203 #ifdef __notyet__ /* Has a bug on FirePower */
204 int
205 OF_setprop(u_int handle, char *prop, void *buf, int len)
206 {
207 struct {
208 cell_t name;
209 cell_t nargs;
210 cell_t nreturns;
211 cell_t phandle;
212 cell_t prop;
213 cell_t buf;
214 cell_t len;
215 cell_t size;
216 } args;
217
218 args.name = ADR2CELL("setprop");
219 args.nargs = 4;
220 args.nreturns = 1;
221 args.phandle = HDL2CELL(handle);
222 args.prop = ADR2CELL(prop);
223 args.buf = ADR2CELL(buf);
224 args.len = len;
225 if (openfirmware(&args) == -1)
226 return -1;
227 return args.size;
228 }
229 #endif
230
231 int
232 OF_interpret(const char *cmd, int nargs, int nreturns, ...)
233 {
234 va_list ap;
235 struct {
236 cell_t name;
237 cell_t nargs;
238 cell_t nreturns;
239 cell_t slot[16];
240 } args;
241 cell_t status;
242 int i = 0;
243
244 args.name = ADR2CELL("interpret");
245 args.nargs = ++nargs;
246 args.nreturns = ++nreturns;
247 args.slot[i++] = ADR2CELL(cmd);
248 va_start(ap, nreturns);
249 while (i < nargs) {
250 args.slot[i++] = va_arg(ap, cell_t);
251 }
252 if (openfirmware(&args) == -1) {
253 va_end(ap);
254 return (-1);
255 }
256 status = args.slot[i++];
257 while (i < nargs+nreturns) {
258 *va_arg(ap, cell_t *) = args.slot[i++];
259 }
260 va_end(ap);
261
262 return status;
263 }
264
265 int
266 OF_package_to_path(int phandle, char *buf, int buflen)
267 {
268 struct {
269 cell_t name;
270 cell_t nargs;
271 cell_t nreturns;
272 cell_t phandle;
273 cell_t buf;
274 cell_t buflen;
275 cell_t length;
276 } args;
277
278 if (buflen > PAGE_SIZE)
279 return -1;
280 args.name = ADR2CELL("package-to-path");
281 args.nargs = 3;
282 args.nreturns = 1;
283 args.phandle = HDL2CELL(phandle);
284 args.buf = ADR2CELL(buf);
285 args.buflen = buflen;
286 if (openfirmware(&args) < 0)
287 return -1;
288 return args.length;
289 }
290
291 int
292 OF_open(const char *dname)
293 {
294 struct {
295 cell_t name;
296 cell_t nargs;
297 cell_t nreturns;
298 cell_t dname;
299 cell_t handle;
300 } args;
301
302 args.name = ADR2CELL("open");
303 args.nargs = 1;
304 args.nreturns = 1;
305 args.dname = ADR2CELL(dname);
306 if (openfirmware(&args) == -1 ||
307 args.handle == 0)
308 return -1;
309 return args.handle;
310 }
311
312 void
313 OF_close(int handle)
314 {
315 struct {
316 cell_t name;
317 cell_t nargs;
318 cell_t nreturns;
319 cell_t handle;
320 } args;
321
322 args.name = ADR2CELL("close");
323 args.nargs = 1;
324 args.nreturns = 0;
325 args.handle = HDL2CELL(handle);
326 openfirmware(&args);
327 }
328
329 int
330 OF_write(int handle, const void *addr, int len)
331 {
332 struct {
333 cell_t name;
334 cell_t nargs;
335 cell_t nreturns;
336 cell_t ihandle;
337 cell_t addr;
338 cell_t len;
339 cell_t actual;
340 } args;
341
342 args.name = ADR2CELL("write");
343 args.nargs = 3;
344 args.nreturns = 1;
345 args.ihandle = HDL2CELL(handle);
346 args.addr = ADR2CELL(addr);
347 args.len = len;
348 if (openfirmware(&args) == -1)
349 return -1;
350 return args.actual;
351 }
352
353 int
354 OF_read(int handle, void *addr, int len)
355 {
356 struct {
357 cell_t name;
358 cell_t nargs;
359 cell_t nreturns;
360 cell_t ihandle;
361 cell_t addr;
362 cell_t len;
363 cell_t actual;
364 } args;
365
366 args.name = ADR2CELL("read");
367 args.nargs = 3;
368 args.nreturns = 1;
369 args.ihandle = HDL2CELL(handle);
370 args.addr = ADR2CELL(addr);
371 args.len = len;
372 if (openfirmware(&args) == -1) {
373 return -1;
374 }
375 return args.actual;
376 }
377
378 int
379 OF_seek(int handle, u_quad_t pos)
380 {
381 struct {
382 cell_t name;
383 cell_t nargs;
384 cell_t nreturns;
385 cell_t handle;
386 cell_t poshi;
387 cell_t poslo;
388 cell_t status;
389 } args;
390
391 args.name = ADR2CELL("seek");
392 args.nargs = 3;
393 args.nreturns = 1;
394 args.handle = HDL2CELL(handle);
395 args.poshi = HDQ2CELL_HI(pos);
396 args.poslo = HDQ2CELL_LO(pos);
397 if (openfirmware(&args) == -1) {
398 return -1;
399 }
400 return args.status;
401 }
402
403 void
404 OF_release(void *virt, u_int size)
405 {
406 struct {
407 cell_t name;
408 cell_t nargs;
409 cell_t nreturns;
410 cell_t virt;
411 cell_t size;
412 } args;
413
414 args.name = ADR2CELL("release");
415 args.nargs = 2;
416 args.nreturns = 0;
417 args.virt = ADR2CELL(virt);
418 args.size = size;
419 openfirmware(&args);
420 }
421
422 int
423 OF_milliseconds(void)
424 {
425 struct {
426 cell_t name;
427 cell_t nargs;
428 cell_t nreturns;
429 cell_t ms;
430 } args;
431
432 args.name = ADR2CELL("milliseconds");
433 args.nargs = 0;
434 args.nreturns = 1;
435 openfirmware(&args);
436 return args.ms;
437 }
438
439 int
440 OF_peer(int phandle)
441 {
442 struct {
443 cell_t name;
444 cell_t nargs;
445 cell_t nreturns;
446 cell_t phandle;
447 cell_t sibling;
448 } args;
449
450 args.name = ADR2CELL("peer");
451 args.nargs = 1;
452 args.nreturns = 1;
453 args.phandle = HDL2CELL(phandle);
454 if (openfirmware(&args) == -1)
455 return 0;
456 return args.sibling;
457 }
458
459 int
460 OF_child(int phandle)
461 {
462 struct {
463 cell_t name;
464 cell_t nargs;
465 cell_t nreturns;
466 cell_t phandle;
467 cell_t child;
468 } args;
469
470 args.name = ADR2CELL("child");
471 args.nargs = 1;
472 args.nreturns = 1;
473 args.phandle = HDL2CELL(phandle);
474 if (openfirmware(&args) == -1)
475 return 0;
476 return args.child;
477 }
478
479 static u_int mmuh = -1;
480 static u_int memh = -1;
481
482 void
483 OF_initialize(void)
484 {
485 u_int chosen;
486
487 if ( (chosen = OF_finddevice("/chosen")) == -1) {
488 OF_exit();
489 }
490 if (OF_getprop(chosen, "mmu", &mmuh, sizeof(mmuh)) != sizeof(mmuh)
491 || OF_getprop(chosen, "memory", &memh, sizeof(memh)) != sizeof(memh))
492 OF_exit();
493 }
494
495 /*
496 * The following need either the handle to memory or the handle to the MMU.
497 */
498
499 /*
500 * Grab some address space from the prom
501 *
502 * Only works while the prom is actively mapping us.
503 */
504 vaddr_t
505 OF_claim_virt(vaddr_t vaddr, int len)
506 {
507 struct {
508 cell_t name;
509 cell_t nargs;
510 cell_t nreturns;
511 cell_t method;
512 cell_t ihandle;
513 cell_t align;
514 cell_t len;
515 cell_t vaddr;
516 cell_t status;
517 cell_t retaddr;
518 } args;
519
520 #ifdef __notyet
521 if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
522 OF_printf("OF_claim_virt: cannot get mmuh\r\n");
523 return -1LL;
524 }
525 #endif
526 args.name = ADR2CELL("call-method");
527 args.nargs = 5;
528 args.nreturns = 2;
529 args.method = ADR2CELL("claim");
530 args.ihandle = HDL2CELL(mmuh);
531 args.align = 0;
532 args.len = len;
533 args.vaddr = ADR2CELL(vaddr);
534 if (openfirmware(&args) != 0)
535 return -1LL;
536 return (vaddr_t)args.retaddr;
537 }
538
539 /*
540 * Request some address space from the prom
541 *
542 * Only works while the prom is actively mapping us.
543 */
544 vaddr_t
545 OF_alloc_virt(int len, int align)
546 {
547 int retaddr=-1;
548 struct {
549 cell_t name;
550 cell_t nargs;
551 cell_t nreturns;
552 cell_t method;
553 cell_t ihandle;
554 cell_t align;
555 cell_t len;
556 cell_t status;
557 cell_t retaddr;
558 } args;
559
560 #ifdef __notyet
561 if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
562 OF_printf("OF_alloc_virt: cannot get mmuh\r\n");
563 return -1LL;
564 }
565 #endif
566 args.name = ADR2CELL("call-method");
567 args.nargs = 4;
568 args.nreturns = 2;
569 args.method = ADR2CELL("claim");
570 args.ihandle = HDL2CELL(mmuh);
571 args.align = align;
572 args.len = len;
573 args.retaddr = ADR2CELL(&retaddr);
574 if (openfirmware(&args) != 0)
575 return -1LL;
576 return (vaddr_t)args.retaddr;
577 }
578
579 /*
580 * Release some address space to the prom
581 *
582 * Only works while the prom is actively mapping us.
583 */
584 int
585 OF_free_virt(vaddr_t vaddr, int len)
586 {
587 struct {
588 cell_t name;
589 cell_t nargs;
590 cell_t nreturns;
591 cell_t method;
592 cell_t ihandle;
593 cell_t len;
594 cell_t vaddr;
595 } args;
596
597 #ifdef __notyet
598 if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
599 OF_printf("OF_claim_virt: cannot get mmuh\r\n");
600 return -1;
601 }
602 #endif
603 args.name = ADR2CELL("call-method");
604 args.nargs = 4;
605 args.nreturns = 0;
606 args.method = ADR2CELL("release");
607 args.ihandle = HDL2CELL(mmuh);
608 args.vaddr = ADR2CELL(vaddr);
609 args.len = len;
610 return openfirmware(&args);
611 }
612
613
614 /*
615 * Unmap some address space
616 *
617 * Only works while the prom is actively mapping us.
618 */
619 int
620 OF_unmap_virt(vaddr_t vaddr, int len)
621 {
622 struct {
623 cell_t name;
624 cell_t nargs;
625 cell_t nreturns;
626 cell_t method;
627 cell_t ihandle;
628 cell_t len;
629 cell_t vaddr;
630 } args;
631
632 #ifdef __notyet
633 if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
634 OF_printf("OF_claim_virt: cannot get mmuh\r\n");
635 return -1;
636 }
637 #endif
638 args.name = ADR2CELL("call-method");
639 args.nargs = 4;
640 args.nreturns = 0;
641 args.method = ADR2CELL("unmap");
642 args.ihandle = HDL2CELL(mmuh);
643 args.vaddr = ADR2CELL(vaddr);
644 args.len = len;
645 return openfirmware(&args);
646 }
647
648 /*
649 * Have prom map in some memory
650 *
651 * Only works while the prom is actively mapping us.
652 */
653 vaddr_t
654 OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode)
655 {
656 struct {
657 cell_t name;
658 cell_t nargs;
659 cell_t nreturns;
660 cell_t method;
661 cell_t ihandle;
662 cell_t mode;
663 cell_t size;
664 cell_t vaddr;
665 cell_t paddr_hi;
666 cell_t paddr_lo;
667 cell_t status;
668 cell_t retaddr;
669 } args;
670
671 #ifdef __notyet
672 if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
673 OF_printf("OF_map_phys: cannot get mmuh\r\n");
674 return 0LL;
675 }
676 #endif
677 args.name = ADR2CELL("call-method");
678 args.nargs = 7;
679 args.nreturns = 1;
680 args.method = ADR2CELL("map");
681 args.ihandle = HDL2CELL(mmuh);
682 args.mode = mode;
683 args.size = size;
684 args.vaddr = ADR2CELL(vaddr);
685 args.paddr_hi = HDQ2CELL_HI(paddr);
686 args.paddr_lo = HDQ2CELL_LO(paddr);
687
688 if (openfirmware(&args) == -1)
689 return -1;
690 if (args.status)
691 return -1;
692 return (vaddr_t)args.retaddr;
693 }
694
695
696 /*
697 * Request some RAM from the prom
698 *
699 * Only works while the prom is actively mapping us.
700 */
701 paddr_t
702 OF_alloc_phys(int len, int align)
703 {
704 struct {
705 cell_t name;
706 cell_t nargs;
707 cell_t nreturns;
708 cell_t method;
709 cell_t ihandle;
710 cell_t align;
711 cell_t len;
712 cell_t status;
713 cell_t phys_hi;
714 cell_t phys_lo;
715 } args;
716
717 #ifdef __notyet
718 if (memh == -1 && ((memh = get_memory_handle()) == -1)) {
719 OF_printf("OF_alloc_phys: cannot get memh\r\n");
720 return -1LL;
721 }
722 #endif
723 args.name = ADR2CELL("call-method");
724 args.nargs = 4;
725 args.nreturns = 3;
726 args.method = ADR2CELL("claim");
727 args.ihandle = HDL2CELL(memh);
728 args.align = align;
729 args.len = len;
730 if (openfirmware(&args) != 0)
731 return -1LL;
732 return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo);
733 }
734
735 /*
736 * Request some specific RAM from the prom
737 *
738 * Only works while the prom is actively mapping us.
739 */
740 paddr_t
741 OF_claim_phys(paddr_t phys, int len)
742 {
743 struct {
744 cell_t name;
745 cell_t nargs;
746 cell_t nreturns;
747 cell_t method;
748 cell_t ihandle;
749 cell_t align;
750 cell_t len;
751 cell_t phys_hi;
752 cell_t phys_lo;
753 cell_t status;
754 cell_t res;
755 cell_t rphys_hi;
756 cell_t rphys_lo;
757 } args;
758
759 #ifdef __notyet
760 if (memh == -1 && ((memh = get_memory_handle()) == -1)) {
761 OF_printf("OF_alloc_phys: cannot get memh\r\n");
762 return 0LL;
763 }
764 #endif
765 args.name = ADR2CELL("call-method");
766 args.nargs = 6;
767 args.nreturns = 4;
768 args.method = ADR2CELL("claim");
769 args.ihandle = HDL2CELL(memh);
770 args.align = 0;
771 args.len = len;
772 args.phys_hi = HDQ2CELL_HI(phys);
773 args.phys_lo = HDQ2CELL_LO(phys);
774 if (openfirmware(&args) != 0)
775 return 0LL;
776 return (paddr_t)CELL2HDQ(args.rphys_hi, args.rphys_lo);
777 }
778
779 /*
780 * Free some RAM to prom
781 *
782 * Only works while the prom is actively mapping us.
783 */
784 int
785 OF_free_phys(paddr_t phys, int len)
786 {
787 struct {
788 cell_t name;
789 cell_t nargs;
790 cell_t nreturns;
791 cell_t method;
792 cell_t ihandle;
793 cell_t len;
794 cell_t phys_hi;
795 cell_t phys_lo;
796 } args;
797
798 #ifdef __notyet
799 if (memh == -1 && ((memh = get_memory_handle()) == -1)) {
800 OF_printf("OF_free_phys: cannot get memh\r\n");
801 return -1;
802 }
803 #endif
804 args.name = ADR2CELL("call-method");
805 args.nargs = 5;
806 args.nreturns = 0;
807 args.method = ADR2CELL("release");
808 args.ihandle = HDL2CELL(memh);
809 args.len = len;
810 args.phys_hi = HDQ2CELL_HI(phys);
811 args.phys_lo = HDQ2CELL_LO(phys);
812 return openfirmware(&args);
813 }
814
815
816 /*
817 * Claim virtual memory -- does not map it in.
818 */
819
820 void *
821 OF_claim(void *virt, u_int size, u_int align)
822 {
823 #define SUNVMOF
824 #ifndef SUNVMOF
825 struct {
826 cell_t name;
827 cell_t nargs;
828 cell_t nreturns;
829 cell_t virt;
830 cell_t size;
831 cell_t align;
832 cell_t baseaddr;
833 } args;
834
835
836 args.name = ADR2CELL("claim");
837 args.nargs = 3;
838 args.nreturns = 1;
839 args.virt = virt;
840 args.size = size;
841 args.align = align;
842 if (openfirmware(&args) == -1)
843 return (void *)-1;
844 return args.baseaddr;
845 #else
846 /*
847 * Sun Ultra machines run the firmware with VM enabled,
848 * so you need to handle allocating and mapping both
849 * virtual and physical memory. Ugh.
850 */
851
852 paddr_t paddr;
853 void* newvirt = NULL;
854
855 if (virt == NULL) {
856 if ((virt = (void*)OF_alloc_virt(size, align)) == (void*)-1) {
857 printf("OF_alloc_virt(%d,%d) failed w/%p\n", size, align, virt);
858 return (void *)-1;
859 }
860 } else {
861 if ((newvirt = (void*)OF_claim_virt((vaddr_t)virt, size)) == (void*)-1) {
862 printf("OF_claim_virt(%p,%d) failed w/%p\n", virt, size, newvirt);
863 return (void *)-1;
864 }
865 }
866 if ((paddr = OF_alloc_phys(size, align)) == (paddr_t)-1) {
867 printf("OF_alloc_phys(%d,%d) failed\n", size, align);
868 OF_free_virt((vaddr_t)virt, size);
869 return (void *)-1;
870 }
871 if (OF_map_phys(paddr, size, (vaddr_t)virt, -1) == -1) {
872 printf("OF_map_phys(0x%lx,%d,%p,%d) failed\n",
873 (u_long)paddr, size, virt, -1);
874 OF_free_phys((paddr_t)paddr, size);
875 OF_free_virt((vaddr_t)virt, size);
876 return (void *)-1;
877 }
878 return (void *)virt;
879 #endif
880 }
881