Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * bcm2835 (e.g. raspberry pi) 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 "arm.h"

#include "../port/netif.h"
#include "etherif.h"

#define POWERREGS       (VIRTIO+0x100000)

enum {
        Wdogfreq        = 65536,
        Wdogtime        = 5,    /* 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,
};

void
archreset(void)
{
        fpon();
}

void
archreboot(void)
{
        u32int *r;

        r = (u32int*)POWERREGS;
        r[Wdog] = Password | 1;
        r[Rstc] = Password | (r[Rstc] & ~CfgMask) | CfgReset;
        coherence();
        for(;;)
                ;
}

static 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);
}
        
void
cpuidprint(void)
{
        print("cpu%d: %dMHz ARM1176JZF-S\n", m->machno, m->cpumhz);
}

void
archbcmlink(void)
{
        addclock0link(wdogfeed, HZ);
}

int
archether(unsigned ctlrno, Ether *ether)
{
        switch(ctlrno) {
        case 0:
                ether->type = "usb";
                ether->ctlrno = ctlrno;
                ether->irq = -1;
                ether->nopt = 0;
                ether->mbps = 100;
                return 1;
        }
        return -1;
}