xref: /netbsd-src/sys/arch/acorn32/dev/md_hooks.c (revision 454af1c0e885cbba6b59706391f770d646303f8c)
1*454af1c0Sdsl /*	$NetBSD: md_hooks.c,v 1.10 2009/03/14 15:35:58 dsl Exp $	*/
27d4a1addSreinoud 
37d4a1addSreinoud /*
47d4a1addSreinoud  * Copyright (c) 1995 Gordon W. Ross
57d4a1addSreinoud  * All rights reserved.
67d4a1addSreinoud  *
77d4a1addSreinoud  * Redistribution and use in source and binary forms, with or without
87d4a1addSreinoud  * modification, are permitted provided that the following conditions
97d4a1addSreinoud  * are met:
107d4a1addSreinoud  * 1. Redistributions of source code must retain the above copyright
117d4a1addSreinoud  *    notice, this list of conditions and the following disclaimer.
127d4a1addSreinoud  * 2. Redistributions in binary form must reproduce the above copyright
137d4a1addSreinoud  *    notice, this list of conditions and the following disclaimer in the
147d4a1addSreinoud  *    documentation and/or other materials provided with the distribution.
157d4a1addSreinoud  * 3. The name of the author may not be used to endorse or promote products
167d4a1addSreinoud  *    derived from this software without specific prior written permission.
177d4a1addSreinoud  *
187d4a1addSreinoud  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
197d4a1addSreinoud  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
207d4a1addSreinoud  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
217d4a1addSreinoud  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
227d4a1addSreinoud  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
237d4a1addSreinoud  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
247d4a1addSreinoud  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
257d4a1addSreinoud  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
267d4a1addSreinoud  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
277d4a1addSreinoud  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
287d4a1addSreinoud  */
297d4a1addSreinoud 
301b7326b5Slukem #include <sys/cdefs.h>
31*454af1c0Sdsl __KERNEL_RCSID(0, "$NetBSD: md_hooks.c,v 1.10 2009/03/14 15:35:58 dsl Exp $");
321b7326b5Slukem 
337d4a1addSreinoud #include "opt_md.h"
347d4a1addSreinoud 
357d4a1addSreinoud #include <sys/param.h>
367d4a1addSreinoud #include <sys/reboot.h>
377d4a1addSreinoud #include <sys/device.h>
387d4a1addSreinoud #include <sys/systm.h>
397d4a1addSreinoud 
407d4a1addSreinoud #include <uvm/uvm_extern.h>
417d4a1addSreinoud 
427d4a1addSreinoud #include <dev/md.h>
437d4a1addSreinoud 
44d213d804Slukem #ifdef	MEMORY_DISK_ROOT_SIZE
45d213d804Slukem #define ROOTBYTES (MEMORY_DISK_ROOT_SIZE << DEV_BSHIFT)
467d4a1addSreinoud 
477d4a1addSreinoud /*
487d4a1addSreinoud  * This array will be patched to contain a file-system image.
497d4a1addSreinoud  * See the program:  src/distrib/sun3/common/rdsetroot.c
507d4a1addSreinoud  */
5105d0665fSjdolecek size_t md_root_size = ROOTBYTES;
527d4a1addSreinoud char md_root_image[ROOTBYTES] = "|This is the root ramdisk!\n";
537d4a1addSreinoud 
54d213d804Slukem #else	/* MEMORY_DISK_ROOT_SIZE */
557d4a1addSreinoud 
5605d0665fSjdolecek size_t md_root_size = 0;		/* set by machdep.c */
577d4a1addSreinoud static struct md_conf *bootmd = NULL;
587d4a1addSreinoud 
5902cdf4d2Sdsl extern int load_memory_disc_from_floppy(struct md_conf *md, dev_t dev);
607d4a1addSreinoud 
617d4a1addSreinoud #include "fdc.h"
62d213d804Slukem #endif	/* MEMORY_DISK_ROOT_SIZE */
637d4a1addSreinoud 
647d4a1addSreinoud void
md_attach_hook(int unit,struct md_conf * md)65*454af1c0Sdsl md_attach_hook(int unit, struct md_conf *md)
667d4a1addSreinoud {
677d4a1addSreinoud 	if (unit == 0) {
68d213d804Slukem #ifdef MEMORY_DISK_ROOT_SIZE
697d4a1addSreinoud 		/* Setup root ramdisk */
7053524e44Schristos 		md->md_addr = (void *) md_root_image;
717d4a1addSreinoud 		md->md_size = (size_t)  md_root_size;
727d4a1addSreinoud 		md->md_type = MD_KMEM_FIXED;
73d213d804Slukem #else	/* MEMORY_DISK_ROOT_SIZE */
74710f40a8Slukem #ifdef OLD_MEMORY_DISK_SIZE
7505d0665fSjdolecek 		if (md_root_size == 0 && OLD_MEMORY_DISK_SIZE)
7605d0665fSjdolecek 			md_root_size = (OLD_MEMORY_DISK_SIZE << DEV_BSHIFT);
77710f40a8Slukem #endif	/* OLD_MEMORY_DISK_SIZE */
7805d0665fSjdolecek 		if (md_root_size != 0) {
7905d0665fSjdolecek 			md->md_size = round_page(md_root_size);
8053524e44Schristos 			md->md_addr = (void *)uvm_km_alloc(kernel_map,
816b2d8b66Syamt 			    md_root_size, 0, UVM_KMF_WIRED | UVM_KMF_ZERO);
827d4a1addSreinoud 			md->md_type = MD_KMEM_FIXED;
837d4a1addSreinoud 			bootmd = md;
847d4a1addSreinoud 		}
85d213d804Slukem #endif	/* MEMORY_DISK_ROOT_SIZE */
867d4a1addSreinoud 		printf("md%d: allocated %ldK (%ld blocks)\n", unit, (long)md->md_size / 1024, (long)md->md_size / DEV_BSIZE);
877d4a1addSreinoud 	}
887d4a1addSreinoud }
897d4a1addSreinoud 
907d4a1addSreinoud 
917d4a1addSreinoud /*
927d4a1addSreinoud  * This is called during open (i.e. mountroot)
937d4a1addSreinoud  */
947d4a1addSreinoud 
957d4a1addSreinoud void
md_open_hook(int unit,struct md_conf * md)96*454af1c0Sdsl md_open_hook(int unit, struct md_conf *md)
977d4a1addSreinoud {
987d4a1addSreinoud 	if (unit == 0) {
997d4a1addSreinoud 		/* The root memory disk only works single-user. */
1007d4a1addSreinoud 		boothowto |= RB_SINGLE;
101d213d804Slukem #if !defined(MEMORY_DISK_ROOT_SIZE) && NFDC > 0
1027d4a1addSreinoud 		load_memory_disc_from_floppy(bootmd, makedev(17, 1));	/* XXX 1.44MB FD */
1037d4a1addSreinoud #endif
1047d4a1addSreinoud 	}
1057d4a1addSreinoud }
106