xref: /plan9/sys/src/9/bcm/archbcm.c (revision da091934ad5a991038edbfec621ba4743b1dcd18)
15d9de2d3SDavid du Colombier /*
25d9de2d3SDavid du Colombier  * bcm2835 (e.g. raspberry pi) architecture-specific stuff
35d9de2d3SDavid du Colombier  */
45d9de2d3SDavid du Colombier 
55d9de2d3SDavid du Colombier #include "u.h"
65d9de2d3SDavid du Colombier #include "../port/lib.h"
75d9de2d3SDavid du Colombier #include "mem.h"
85d9de2d3SDavid du Colombier #include "dat.h"
95d9de2d3SDavid du Colombier #include "fns.h"
105d9de2d3SDavid du Colombier #include "../port/error.h"
115d9de2d3SDavid du Colombier #include "io.h"
125d9de2d3SDavid du Colombier #include "arm.h"
135d9de2d3SDavid du Colombier 
145d9de2d3SDavid du Colombier #include "../port/netif.h"
155d9de2d3SDavid du Colombier #include "etherif.h"
165d9de2d3SDavid du Colombier 
175d9de2d3SDavid du Colombier #define	POWERREGS	(VIRTIO+0x100000)
185d9de2d3SDavid du Colombier 
195d9de2d3SDavid du Colombier enum {
205d9de2d3SDavid du Colombier 	Wdogfreq	= 65536,
21*da091934SDavid du Colombier 	Wdogtime	= 5,	/* seconds, ≤ 15 */
225d9de2d3SDavid du Colombier };
235d9de2d3SDavid du Colombier 
245d9de2d3SDavid du Colombier /*
255d9de2d3SDavid du Colombier  * Power management / watchdog registers
265d9de2d3SDavid du Colombier  */
275d9de2d3SDavid du Colombier enum {
285d9de2d3SDavid du Colombier 	Rstc		= 0x1c>>2,
295d9de2d3SDavid du Colombier 		Password	= 0x5A<<24,
305d9de2d3SDavid du Colombier 		CfgMask		= 0x03<<4,
315d9de2d3SDavid du Colombier 		CfgReset	= 0x02<<4,
32*da091934SDavid du Colombier 	Rsts		= 0x20>>2,
335d9de2d3SDavid du Colombier 	Wdog		= 0x24>>2,
345d9de2d3SDavid du Colombier };
355d9de2d3SDavid du Colombier 
365d9de2d3SDavid du Colombier void
archreset(void)375d9de2d3SDavid du Colombier archreset(void)
385d9de2d3SDavid du Colombier {
395d9de2d3SDavid du Colombier 	fpon();
405d9de2d3SDavid du Colombier }
415d9de2d3SDavid du Colombier 
425d9de2d3SDavid du Colombier void
archreboot(void)435d9de2d3SDavid du Colombier archreboot(void)
445d9de2d3SDavid du Colombier {
455d9de2d3SDavid du Colombier 	u32int *r;
465d9de2d3SDavid du Colombier 
475d9de2d3SDavid du Colombier 	r = (u32int*)POWERREGS;
485d9de2d3SDavid du Colombier 	r[Wdog] = Password | 1;
495d9de2d3SDavid du Colombier 	r[Rstc] = Password | (r[Rstc] & ~CfgMask) | CfgReset;
505d9de2d3SDavid du Colombier 	coherence();
515d9de2d3SDavid du Colombier 	for(;;)
525d9de2d3SDavid du Colombier 		;
535d9de2d3SDavid du Colombier }
545d9de2d3SDavid du Colombier 
55*da091934SDavid du Colombier static void
wdogfeed(void)56*da091934SDavid du Colombier wdogfeed(void)
57*da091934SDavid du Colombier {
58*da091934SDavid du Colombier 	u32int *r;
59*da091934SDavid du Colombier 
60*da091934SDavid du Colombier 	r = (u32int*)POWERREGS;
61*da091934SDavid du Colombier 	r[Wdog] = Password | (Wdogtime * Wdogfreq);
62*da091934SDavid du Colombier 	r[Rstc] = Password | (r[Rstc] & ~CfgMask) | CfgReset;
63*da091934SDavid du Colombier }
64*da091934SDavid du Colombier 
65*da091934SDavid du Colombier void
wdogoff(void)66*da091934SDavid du Colombier wdogoff(void)
67*da091934SDavid du Colombier {
68*da091934SDavid du Colombier 	u32int *r;
69*da091934SDavid du Colombier 
70*da091934SDavid du Colombier 	r = (u32int*)POWERREGS;
71*da091934SDavid du Colombier 	r[Rstc] = Password | (r[Rstc] & ~CfgMask);
72*da091934SDavid du Colombier }
73*da091934SDavid du Colombier 
745d9de2d3SDavid du Colombier void
cpuidprint(void)755d9de2d3SDavid du Colombier cpuidprint(void)
765d9de2d3SDavid du Colombier {
775d9de2d3SDavid du Colombier 	print("cpu%d: %dMHz ARM1176JZF-S\n", m->machno, m->cpumhz);
785d9de2d3SDavid du Colombier }
795d9de2d3SDavid du Colombier 
805d9de2d3SDavid du Colombier void
archbcmlink(void)815d9de2d3SDavid du Colombier archbcmlink(void)
825d9de2d3SDavid du Colombier {
83*da091934SDavid du Colombier 	addclock0link(wdogfeed, HZ);
845d9de2d3SDavid du Colombier }
855d9de2d3SDavid du Colombier 
865d9de2d3SDavid du Colombier int
archether(unsigned ctlrno,Ether * ether)875d9de2d3SDavid du Colombier archether(unsigned ctlrno, Ether *ether)
885d9de2d3SDavid du Colombier {
895d9de2d3SDavid du Colombier 	switch(ctlrno) {
905d9de2d3SDavid du Colombier 	case 0:
915d9de2d3SDavid du Colombier 		ether->type = "usb";
925d9de2d3SDavid du Colombier 		ether->ctlrno = ctlrno;
935d9de2d3SDavid du Colombier 		ether->irq = -1;
945d9de2d3SDavid du Colombier 		ether->nopt = 0;
955d9de2d3SDavid du Colombier 		ether->mbps = 100;
965d9de2d3SDavid du Colombier 		return 1;
975d9de2d3SDavid du Colombier 	}
985d9de2d3SDavid du Colombier 	return -1;
995d9de2d3SDavid du Colombier }
1005d9de2d3SDavid du Colombier 
101