diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-07-25 09:12:40 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-07-25 09:12:40 +0200 |
commit | 706926f8184456e44dd509eb057e59884907b1ec (patch) | |
tree | 8ee9849bbdc611244b4067f721d2ec1a37050581 /sys/src/9/bcm64 | |
parent | 3bc4e5a6d568889eeeb2d0b7d443c0a3e02fb499 (diff) |
bcm64: add config for raspberry pi 4
Diffstat (limited to 'sys/src/9/bcm64')
-rw-r--r-- | sys/src/9/bcm64/archbcm4.c | 175 | ||||
-rw-r--r-- | sys/src/9/bcm64/mkfile | 2 | ||||
-rw-r--r-- | sys/src/9/bcm64/pi4 | 63 |
3 files changed, 239 insertions, 1 deletions
diff --git a/sys/src/9/bcm64/archbcm4.c b/sys/src/9/bcm64/archbcm4.c new file mode 100644 index 000000000..3598a3610 --- /dev/null +++ b/sys/src/9/bcm64/archbcm4.c @@ -0,0 +1,175 @@ +/* + * bcm2711 (e.g.raspberry pi 4) architecture-specific stuff + */ + +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "../port/error.h" +#include "io.h" +#include "sysreg.h" + +typedef struct Mbox Mbox; +typedef struct Mboxes Mboxes; + +#define POWERREGS (VIRTIO+0x100000) + +Soc soc = { + .dramsize = 0x40000000, + .busdram = 0xC0000000, + .iosize = 0x03000000, + .busio = 0x7C000000, + .physio = 0xFC000000, + .virtio = VIRTIO2, + .armlocal = 0xFF800000, + .pciwin = 0x0600000000ULL, +}; + +enum { + Wdogfreq = 65536, + Wdogtime = 10, /* seconds, ≤ 15 */ +}; + +/* + * Power management / watchdog registers + */ +enum { + Rstc = 0x1c>>2, + Password = 0x5A<<24, + CfgMask = 0x03<<4, + CfgReset = 0x02<<4, + Rsts = 0x20>>2, + Wdog = 0x24>>2, +}; + +/* + * Arm local regs for smp + */ +struct Mbox { + u32int doorbell; + u32int mbox1; + u32int mbox2; + u32int startcpu; +}; +struct Mboxes { + Mbox set[4]; + Mbox clr[4]; +}; + +enum { + Mboxregs = 0x80, +}; + +void +archreset(void) +{ +} + +void +archreboot(void) +{ + u32int *r; + + r = (u32int*)POWERREGS; + r[Wdog] = Password | 1; + r[Rstc] = Password | (r[Rstc] & ~CfgMask) | CfgReset; + coherence(); + for(;;) + ; +} + +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) +{ + u32int r, part; + char *p; + + r = sysrd(MIDR_EL1); + part = (r >> 4) & 0xFFF; + switch(part){ + case 0xc07: + p = seprint(buf, buf + size, "Cortex-A7"); + break; + case 0xd03: + p = seprint(buf, buf + size, "Cortex-A53"); + break; + case 0xd08: + p = seprint(buf, buf + size, "Cortex-A72"); + break; + default: + p = seprint(buf, buf + size, "Unknown-%#x", part); + break; + } + seprint(p, buf + size, " r%udp%ud", (r >> 20) & 0xF, r & 0xF); + return buf; +} + +void +cpuidprint(void) +{ + char name[64]; + + cputype2name(name, sizeof name); + iprint("cpu%d: %dMHz ARM %s\n", m->machno, m->cpumhz, name); +} + +int +getncpus(void) +{ + int n, max; + char *p; + + n = 4; + if(n > MAXMACH) + n = MAXMACH; + p = getconf("*ncpu"); + if(p && (max = atoi(p)) > 0 && n > max) + n = max; + return n; +} + +void +mboxclear(uint cpu) +{ + Mboxes *mb; + + mb = (Mboxes*)(ARMLOCAL + Mboxregs); + mb->clr[cpu].mbox1 = 1; +} + +void +wakecpu(uint cpu) +{ + Mboxes *mb; + + mb = (Mboxes*)(ARMLOCAL + Mboxregs); + mb->set[cpu].mbox1 = 1; +} + +void +archbcm4link(void) +{ + // addclock0link(wdogfeed, HZ); +} diff --git a/sys/src/9/bcm64/mkfile b/sys/src/9/bcm64/mkfile index d63f47b7e..51ca9bedd 100644 --- a/sys/src/9/bcm64/mkfile +++ b/sys/src/9/bcm64/mkfile @@ -1,5 +1,5 @@ CONF=pi3 -CONFLIST=pi3 +CONFLIST=pi3 pi4 loadaddr=0xffffffffc0080000 diff --git a/sys/src/9/bcm64/pi4 b/sys/src/9/bcm64/pi4 new file mode 100644 index 000000000..dcadced27 --- /dev/null +++ b/sys/src/9/bcm64/pi4 @@ -0,0 +1,63 @@ +dev + root + cons + swap + env + pipe + proc + mnt + srv + shr + dup + arch + ssl + tls + cap + fs + ether netif + ip arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium inferno + draw screen swcursor + mouse mouse + uart gpio +# gpio gpio + sd + usb + dtracy + +link + gisb + pci + archbcm4 + ethergenet ethermii + ethermedium + loopbackmedium + usbxhci pci + +ip + tcp + udp + il + ipifc + icmp + icmp6 + ipmux + +misc + uartmini + uartpl011 +# sdmmc emmc + dma + gic + vcore + + dtracysys + dtracytimer + +port + int cpuserver = 0; + +bootdir + /$objtype/bin/paqfs + /$objtype/bin/auth/factotum + bootfs.paq + boot |