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