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); }