~kris/9p

9hist

1865821ab4a1ed85445ddca66de17fcd26eabfe7 — David du Colombier 25 years ago 266f08c
Plan 9 from Bell Labs 2001-08-21
4 files changed, 21 insertions(+), 76 deletions(-)

M bitsy/l.s
M bitsy/power.c
M pc/sdata.c
M port/page.c
M bitsy/l.s => bitsy/l.s +16 -26
@@ 473,11 473,11 @@ TEXT gotolabel(SB), $-4
	MOVW	$1, R0
	RET

/* save the state machine in power_resume[] for an upcoming suspend
/* save the state machine in power_state[] for an upcoming suspend
 */
TEXT setpowerlabel(SB), $-4
	MOVW	$power_resume+0(SB), R0
	/* svc */				/* power_resume[]: what */
	MOVW	$power_state+0(SB), R0
	/* svc */				/* power_state[]: what */
	MOVW	R1, 0(R0)
	MOVW	R2, 4(R0)
	MOVW	R3, 8(R0)


@@ 558,7 558,7 @@ TEXT setpowerlabel(SB), $-4
/* Entered after a resume from suspend state.
 * The bootldr jumps here after a processor reset.
 */
TEXT sa1100_power_resume(SB), $-4
TEXT power_resume(SB), $-4
	MOVW	$setR12(SB), R12		/* load the SB */
	/* SVC mode, interrupts disabled */
	MOVW	$(PsrDirq|PsrDfiq|PsrMsvc), R1


@@ 566,7 566,7 @@ TEXT sa1100_power_resume(SB), $-4
	/* gotopowerlabel() */
	/* svc */

	MOVW	$power_resume+0(SB), R0
	MOVW	$power_state+0(SB), R0
	MOVW	56(R0), R1		/* R1: SPSR, R2: CPSR */
	MOVW	60(R0), R2
	MOVW	R1, SPSR


@@ 677,9 677,9 @@ TEXT power_down(SB), $-4
	MOVW	gpioregs+0(SB),R6
	MOVW	memconfregs+0(SB),R5
	MOVW	powerregs+0(SB),R3
	MOVW	0x1c(R5),R1
	ORR		$0x30400000,R1
	MOVW	R1,refr-4(SP)
	MOVW	0x1c(R5),R4
	ORR		$0x30400000,R4
	AND		$(~0xfff0),R4
	MOVW	$0x80000003,R2
	MOVW	R2,0xc(R3)
	MOVW	$15,R2


@@ 688,7 688,7 @@ TEXT power_down(SB), $-4
	MOVW	R2,0x10(R3)
	MOVW	$0,R2
	MOVW	R2,0x18(R3)
	MOVW	$sa1100_power_resume+0(SB),R2
	MOVW	$power_resume+0(SB),R2
	MOVW	R2,0x8(R3)
	MOVW	$0,R2
	MOVW	R2,0x4(R6)


@@ 705,44 705,34 @@ l13:	SUB		$1,R0
l14:	SUB		$1,R0
	BGT		l14
	MOVW	powerregs+0(SB),R5
	MOVW	refr-4(SP),R4
	AND		$(~0xfff0),R4
	ORR		$0x80000000,R4,R6
	AND		$(~0x80100000),R6,R11

	MOVW	memconfregs+0(SB),R3
	MOVW	(R3),R12
	MOVW	0x0(R3),R12
	AND		$(~0x30003),R12

	MOVW	0x10(R3),R2
	AND		$0xfffcfffc,R2
	AND		$(~0x00030003),R2
	MOVW	R2,0x10(R3)
	MOVW	0x14(R3),R2
	AND		$0xfffcfffc,R2
	AND		$(~0x00030003),R2
	MOVW	R2,0x14(R3)
	MOVW	0x2c(R3),R2
	AND		$0xfffcfffc,R2
	AND		$(~0x00030003),R2
	MOVW	R2,0x2c(R3)
	MOVW	R0,R0			/* filler */

	MOVW	$1,R2
	MOVW	R4,0x1c(R3)
//	MOVW	R6,0x1c(R3)
//	MOVW	R12,(R3)
	MOVW	R12,0x0(R3)
//	MOVW	R11,0x1c(R3)
	MOVW	R2,0(R5)
	MOVW	R2,0x0(R5)

slloop:
	B		slloop			/* loop waiting for sleep */

TEXT	coma(SB), $-4
	MOVW	$1,R1
	MOVW	$(MEMCONFREGS+0x1c),R2
	MOVW	$(POWERREGS+0x0),R3
//	MOVW	R0,(R2)
	MOVW	R1,(R3)
comaloop:
	B		comaloop

/* The first MCR instruction of this function needs to be on a cache-line
 * boundary; to make this happen, it will be copied (in trap.c).
 *

M bitsy/power.c => bitsy/power.c +2 -47
@@ 13,11 13,11 @@
 * it's only used up to 164/4.
 * it's only used by routines in l.s
 */
ulong	power_resume[200/4];
ulong	power_state[200/4];
Rendez	powerr;
ulong	powerflag = 0;	/* set to start power-off sequence */

extern void	sa1100_power_resume(void);
extern void	power_resume(void);
extern int		setpowerlabel(void);
extern void	_start(void);
extern Uart	sa1110uart[];


@@ 143,50 143,6 @@ gpiorestore(GPIOregs *to, GPIOregs *from)

void	(*restart)(void) = nil;

static void
sa1100_power_off(void)
{
	ulong refr;

	/* Set KAPD and EAPD bits */
	refr = memconfregs->mdrefr;
	refr |= 1<<REFR_kapd | 1 <<REFR_eapd | 1<<REFR_k1db2;

	/* enable wakeup by µcontroller, on/off switch
	 * or real-time clock alarm
	 */
	powerregs->pwer =  1 << IRQrtc | 1 << IRQgpio0 | 1 << IRQgpio1;

	/* clear previous reset status */
	resetregs->rcsr =  RCSR_all;

	/* disable internal oscillator, float CS lines */
	powerregs->pcfr = PCFR_opde|PCFR_fp|PCFR_fs;
	powerregs->pgsr = 0;
	/* set resume address. The loader jumps to it */
	powerregs->pspr = (ulong)sa1100_power_resume;

	/* set all GPIOs to input mode  */
	gpioregs->direction = 0;

	/* set lowest clock; delay to avoid resume hangs on fast sa1110 */
	memconfregs->mdrefr |= 1<<22;
	µdelay(90);
	powerregs->ppcr = 0;
	µdelay(90);

	memconfregs->msc0 &= ~0x30003;
	memconfregs->msc1 &= ~0x30003;
	memconfregs->msc2 &= ~0x30003;
	refr &= ~0xfff0;
	memconfregs->mdrefr = refr;	/* Clear dri 0 ⋯ 11 */
	refr |= 1<<REFR_slfrsh;

	memconfregs->mdrefr = refr;	/* Set selfrefresh */
	powerregs->pmcr = PCFR_suspend;
	for(;;);
}

static int
bitno(ulong x)
{


@@ 262,7 218,6 @@ deepsleep(void) {
	cacheflush();
	delay(100);
	power_down();
//	sa1100_power_off();
	/* no return */
}


M pc/sdata.c => pc/sdata.c +1 -1
@@ 606,7 606,7 @@ retry:
	atadmamode(drive);	

	if(DEBUG & DbgCONFIG){
		print("dev %2.2uX port %uX config %4.4uX capabilities %4.4uX",
		print("dev %2.2uX port %uX config %4.4uX cap %4.4uX",
			dev, cmdport,
			iconfig, drive->info[Icapabilities]);
		print(" mwdma %4.4uX", drive->info[Imwdma]);

M port/page.c => port/page.c +2 -2
@@ 57,8 57,8 @@ pageinit(void)
	swapalloc.highwater = (palloc.user*5)/100;
	swapalloc.headroom = swapalloc.highwater + (swapalloc.highwater/4);

	print("%lud free pages\n", palloc.user);
	print("%ludK bytes\n", pm);
	print("%lud free pages, ", palloc.user);
	print("%ludK bytes, ", pm);
	print("%ludK swap\n", vm);
}