1 /* $NetBSD: amiga_init.c,v 1.9 2010/01/24 15:39:50 phx Exp $ */
2
3 /*
4 * Copyright (c) 1994 Michael L. Hitch
5 * Copyright (c) 1993 Markus Wild
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 Markus Wild.
19 * 4. The name of the author 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 THE AUTHOR ``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 THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: amiga_init.c,v 1.9 2010/01/24 15:39:50 phx Exp $");
36
37 #include <sys/param.h>
38 #include <amiga/amiga/cc.h>
39 #include <amiga/amiga/cia.h>
40 #include <amiga/amiga/custom.h>
41 #include <amiga/amiga/cfdev.h>
42 #include <amiga/amiga/memlist.h>
43
44 int machineid;
45
46 vaddr_t CHIPMEMADDR;
47 vaddr_t chipmem_start;
48 vaddr_t chipmem_end;
49
50 u_long boot_fphystart, boot_fphysize, cphysize;
51 u_long boot_flags;
52
53 char *esym; /* start address of cfdev/memlist-area */
54
55 struct boot_memlist *memlist;
56
57 struct cfdev *cfdev;
58 int ncfdev;
59
60 u_long scsi_nosync;
61 int shift_nosync;
62
63 void set_boot_args(int, u_long, u_long, u_long, char *, int, u_long, u_long);
64
65
66 /*
67 * called from locore.S, before initppc()
68 */
69 void
set_boot_args(int boot_howto,u_long fstart,u_long fsize,u_long csize,char * esymaddr,int cpuid,u_long flags,u_long inhsync)70 set_boot_args(int boot_howto, u_long fstart, u_long fsize, u_long csize,
71 char *esymaddr, int cpuid, u_long flags, u_long inhsync)
72 {
73 char *end_loaded;
74
75 boothowto = boot_howto;
76 boot_fphystart = fstart;
77 boot_fphysize = fsize;
78 cphysize = csize;
79 esym = end_loaded = esymaddr;
80 machineid = cpuid;
81 boot_flags = flags;
82 scsi_nosync = inhsync;
83
84 /*
85 * The kernel ends at end_loaded, plus the cfdev and memlist
86 * structures we placed there in the loader.
87 * esym already takes a potential symbol-table into account.
88 */
89 ncfdev = *(int *)end_loaded;
90 cfdev = (struct cfdev *)(end_loaded + sizeof(int));
91 end_loaded += sizeof(int) + ncfdev * sizeof(struct cfdev);
92 memlist = (struct boot_memlist *)end_loaded;
93
94 CHIPMEMADDR = 0x0;
95 chipmem_start = CHIPMEMADDR;
96 chipmem_end = (vaddr_t)csize;
97
98 CIAADDR = 0xbfd000;
99 CIAAbase = CIAADDR + 0x1001;
100 CIABbase = CIAADDR;
101
102 CUSTOMADDR = 0xdff000;
103 CUSTOMbase = CUSTOMADDR;
104 }
105
106 /*
107 * called by cc_init_chipmem() from amiga/amiga/cc.c
108 */
109 void *
chipmem_steal(long amount)110 chipmem_steal(long amount)
111 {
112
113 /* steal from top of chipmem, as amiga68k does */
114 vaddr_t p = chipmem_end - amount;
115 if (p & 1)
116 p = p - 1;
117 chipmem_end = p;
118 if(chipmem_start > chipmem_end)
119 panic("not enough chip memory");
120 return((void *)p);
121 }
122
123 /*
124 * Used by certain drivers currently to allocate zorro II or chip mem
125 * for bounce buffers. For amigappc we will only return chip memory.
126 */
127 void *
alloc_z2mem(long amount)128 alloc_z2mem(long amount)
129 {
130
131 return (alloc_chipmem(amount));
132 }
133