xref: /original-bsd/sys/vax/mdec/hpboot.c (revision 8f26171a)
12faf5ee6Smckusick /*
27a4751a2Skarels  * Copyright (c) 1980,1986 Regents of the University of California.
32faf5ee6Smckusick  * All rights reserved.  The Berkeley software License Agreement
42faf5ee6Smckusick  * specifies the terms and conditions for redistribution.
52faf5ee6Smckusick  */
62faf5ee6Smckusick 
7*8f26171aSkarels /* "@(#)hpboot.c	7.2 (Berkeley) 08/28/86" */
8*8f26171aSkarels #include <sys/disklabel.h>
92faf5ee6Smckusick 
104a4da72bSsam 
114a4da72bSsam /*
124a4da72bSsam  * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from
137a4751a2Skarels  * boot sectors of file system and sets it up to run.
147a4751a2Skarels  * Reads from the controller and drive passed in from the boot
157a4751a2Skarels  * rom.
167a4751a2Skarels  *   R1:  address of the boot device's adapter
177a4751a2Skarels  *   R2:  controller number of the boot device
187a4751a2Skarels  *   R3:  unit number of the boot device
197a4751a2Skarels  *   R5:  software boot control flags
207a4751a2Skarels  *   R6:  address of driver subroutine from ROM
217a4751a2Skarels  *   SP:  base address of usable memory + 0x200
224a4da72bSsam  */
234a4da72bSsam 	.set	BOOTSIZE,15		/* size of boot in sectors */
244a4da72bSsam 	.set	RELOC,0x70000
254a4da72bSsam /* MBA registers */
264a4da72bSsam 	.set	M_cr,4			/* MBA control reg */
277a4751a2Skarels 	.set	M_sr,8			/* MBA status reg */
284a4da72bSsam 	.set	M_var,12		/* MBA virt addr reg */
294a4da72bSsam 	.set	M_bc,16			/* MBA byte count reg */
304a4da72bSsam 	.set	M_map,0x800		/* start of MBA map reg's */
314a4da72bSsam 	.set	MBAinit,1		/* MBA init bit in MBA control reg */
327a4751a2Skarels 	.set	MBABUSY,0x80000000	/* MBA SR: data transfer busy */
337a4751a2Skarels 	.set	pMBABUSY,31		/* bit position of  MBABUSY */
344a4da72bSsam /* Drive information */
354a4da72bSsam 	.set	RP,0x400		/* start of drive registers */
367a4751a2Skarels 	.set	RPDR,0x80		/* offset per drive unit */
377a4751a2Skarels 	.set	RP_cr,0			/* control status register */
387a4751a2Skarels 	.set	RP_sr,4			/* drive status reg */
397a4751a2Skarels 	.set	RP_stk,0x14		/* desired track/sector reg */
407a4751a2Skarels 	.set	RP_dt,0x18		/* drive type reg */
417a4751a2Skarels 	.set	RP_off,0x24		/* RP offset reg */
427a4751a2Skarels 	.set	RP_cyl,0x28		/* desired cyl reg */
434a4da72bSsam 	.set	RPBPSECT,512		/* bytes per sector */
444a4da72bSsam /* RP?? function codes, status bits  */
454a4da72bSsam 	.set	RP_GO,1			/* go */
464a4da72bSsam 	.set	RP_RED,070		/* read */
474a4da72bSsam 	.set	RP_DC,010		/* drive clear */
484a4da72bSsam 	.set	RP_RIP,020		/* read in preset */
494a4da72bSsam 	.set	RP_FMT,0x1000		/* format 22 */
504a4da72bSsam 	.set	RP_MOL,0x1000		/* medium on line */
514a4da72bSsam 	.set	RP_DRY,0200		/* drive ready */
524a4da72bSsam 	.set	RP_ERR,040000		/* composite error */
534a4da72bSsam 	.set	RP_pDRY,7		/* bit position of RP_DRY */
544a4da72bSsam 	.set	RP_pERR,14		/* bit position of RP_ERR */
554a4da72bSsam 
564a4da72bSsam init:
574a4da72bSsam 	.word	0			/* entry mask for DEC monitor */
584a4da72bSsam 	nop;nop;nop;nop;nop;nop;nop;nop	/* some no-ops for 750 boot to skip */
594a4da72bSsam 	nop;nop;
604a4da72bSsam start:
617a4751a2Skarels 	clrl	r10			/* major("/dev/hp0a") */
627a4751a2Skarels 	extzv	$13,$2,r1,r4		/* get MBA number from R1 */
637a4751a2Skarels 	insv	r4,$24,$8,r10		/* set MBA number */
647a4751a2Skarels 	insv	r3,$16,$8,r10		/* drive number */
657a4751a2Skarels 	extzv	$12,$4,r5,r4		/* get partition from r5 */
667a4751a2Skarels 	bicw2	$0xf000,r5		/* remove from r5 */
677a4751a2Skarels 	insv	r4,$8,$4,r10		/* set partition */
684a4da72bSsam 	movl	r5,r11
697a4751a2Skarels 	movl	r1,r9			/* save adaptor address */
707a4751a2Skarels 	movl	r3,r8			/* and unit number */
71*8f26171aSkarels 	brw	start0
72*8f26171aSkarels 
73*8f26171aSkarels /*
74*8f26171aSkarels  * Leave space for pack label.
75*8f26171aSkarels  */
76*8f26171aSkarels pad:
77*8f26171aSkarels 	.space	LABELOFFSET - (pad - init)
78*8f26171aSkarels packlabel:
79*8f26171aSkarels 	.space	d_end_
80*8f26171aSkarels 
81*8f26171aSkarels start0:
824a4da72bSsam 	movl	$RELOC,sp
834a4da72bSsam 	moval	init,r6
844a4da72bSsam 	movc3	$end,(r6),(sp)
854a4da72bSsam 	jmp	*$RELOC+start1
864a4da72bSsam /* running relocated */
874a4da72bSsam start1:
884a4da72bSsam 	movl	$MBAinit,M_cr(r9)
894a4da72bSsam /* read-in-preset the drive and set format */
907a4751a2Skarels 	mull2	$RPDR,r8
917a4751a2Skarels 	movab	RP(r9)[r8],r8
927a4751a2Skarels 	movl	$RP_RIP+RP_GO,RP_cr(r8)
937a4751a2Skarels 	movl	$RP_FMT,RP_off(r8)
944a4da72bSsam 
954a4da72bSsam 	.set	PROGSIZE,(BOOTSIZE*RPBPSECT)
964a4da72bSsam start2:
977a4751a2Skarels 	movl	$0,RP_cyl(r8)
987a4751a2Skarels 	movl	$1,RP_stk(r8)
994a4da72bSsam 	movl	$-PROGSIZE,M_bc(r9)
1004a4da72bSsam /* set up MASSBUS map for DMA */
1014a4da72bSsam 	clrl	r0
1024a4da72bSsam 1:
1034a4da72bSsam 	bisl3	$0x80000000,r0,M_map(r9)[r0]
1044a4da72bSsam 	aobleq	$BOOTSIZE,r0,1b
1054a4da72bSsam 	clrl	M_var(r9)
1067a4751a2Skarels 	movl	$RP_RED+RP_GO,RP_cr(r8)
1074a4da72bSsam rprdy:
1087a4751a2Skarels 	movl	RP_sr(r8),r0
1094a4da72bSsam 	bbc	$RP_pDRY,r0,rprdy
1104a4da72bSsam 	bbs	$RP_pERR,r0,rperr
1117a4751a2Skarels rprdy2:
1127a4751a2Skarels 	bbs	$pMBABUSY,M_sr(r9),rprdy2
1137a4751a2Skarels 
1147a4751a2Skarels /* Eagles are too fast for the controller. Slow the thing down. */
1157a4751a2Skarels /* (May not be needed with wait for mba above.) */
116c65273c1Ssam 	clrl	r3
117c65273c1Ssam buzz:	acbl	$2000,$1,r3,buzz
1184a4da72bSsam 	bicpsw	$2
1194a4da72bSsam 	jbr	clear
1204a4da72bSsam rperr:
1214a4da72bSsam 	halt
1224a4da72bSsam /* clear core and execute program */
1234a4da72bSsam clear:
1244a4da72bSsam 	movl	$PROGSIZE,r3
1254a4da72bSsam clrcor:
1264a4da72bSsam 	clrq	(r3)
1274a4da72bSsam 	acbl	$RELOC,$8,r3,clrcor
1284a4da72bSsam /* run loaded program */
1294a4da72bSsam 	calls	$0,*$0
1304a4da72bSsam 	brw	start2
1314a4da72bSsam 
1324a4da72bSsam end:
133