summaryrefslogtreecommitdiff
path: root/sys/src/9/bcm/archbcm.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-10-20 19:56:31 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-10-20 19:56:31 +0200
commit83e20b4df18d539db59c8e1090f77a6565df250e (patch)
treed42f2d4c7fdd8cb1526131515690bc9229150505 /sys/src/9/bcm/archbcm.c
parent796e5e6000677a39577d545e4603ce251e7cbfe9 (diff)
bcm: import changes for raspi2/3 from richard miller
Diffstat (limited to 'sys/src/9/bcm/archbcm.c')
-rw-r--r--sys/src/9/bcm/archbcm.c71
1 files changed, 69 insertions, 2 deletions
diff --git a/sys/src/9/bcm/archbcm.c b/sys/src/9/bcm/archbcm.c
index eb9c4c2d8..443a9b709 100644
--- a/sys/src/9/bcm/archbcm.c
+++ b/sys/src/9/bcm/archbcm.c
@@ -1,5 +1,5 @@
/*
- * bcm2835 (e.g. raspberry pi) architecture-specific stuff
+ * bcm2835 (e.g. original raspberry pi) architecture-specific stuff
*/
#include "u.h"
@@ -13,8 +13,19 @@
#define POWERREGS (VIRTIO+0x100000)
+Soc soc = {
+ .dramsize = 512*MiB,
+ .physio = 0x20000000,
+ .busdram = 0x40000000,
+ .busio = 0x7E000000,
+ .armlocal = 0,
+ .l1ptedramattrs = Cached | Buffered,
+ .l2ptedramattrs = Cached | Buffered,
+};
+
enum {
Wdogfreq = 65536,
+ Wdogtime = 10, /* seconds, ≤ 15 */
};
/*
@@ -25,6 +36,7 @@ enum {
Password = 0x5A<<24,
CfgMask = 0x03<<4,
CfgReset = 0x02<<4,
+ Rsts = 0x20>>2,
Wdog = 0x24>>2,
};
@@ -48,13 +60,68 @@ archreboot(void)
}
void
+wdogfeed(void)
+{
+ u32int *r;
+
+ r = (u32int*)POWERREGS;
+ r[Wdog] = Password | (Wdogtime * Wdogfreq);
+ r[Rstc] = Password | (r[Rstc] & ~CfgMask) | CfgReset;
+}
+
+void
+wdogoff(void)
+{
+ u32int *r;
+
+ r = (u32int*)POWERREGS;
+ r[Rstc] = Password | (r[Rstc] & ~CfgMask);
+}
+
+char *
+cputype2name(char *buf, int size)
+{
+ seprint(buf, buf + size, "1176JZF-S");
+ return buf;
+}
+
+void
cpuidprint(void)
{
- print("cpu%d: %dMHz ARM1176JZF-S\n", m->machno, m->cpumhz);
+ char name[64];
+
+ cputype2name(name, sizeof name);
+ delay(50); /* let uart catch up */
+ print("cpu%d: %dMHz ARM %s\n", m->machno, m->cpumhz, name);
+}
+
+int
+getncpus(void)
+{
+ return 1;
+}
+
+int
+startcpus(uint)
+{
+ return 1;
}
void
archbcmlink(void)
{
+ addclock0link(wdogfeed, HZ);
+}
+
+int
+l2ap(int ap)
+{
+ return (AP(3, (ap))|AP(2, (ap))|AP(1, (ap))|AP(0, (ap)));
+}
+
+int
+cmpswap(long *addr, long old, long new)
+{
+ return cas32(addr, old, new);
}