Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/*
 * sheevaplug machine assist, definitions
 * arm926ej-s processor at 1.2GHz
 *
 * loader uses R11 as scratch.
 */
#include "mem.h"
#include "arm.h"

#undef B                                        /* B is for 'botch' */

#define PADDR(a)        ((a) & ~KZERO)
#define KADDR(a)        (KZERO|(a))

#define L1X(va)         (((((va))>>20) & 0x0fff)<<2)

#define MACHADDR        (L1-MACHSIZE)

#define PTEDRAM         (Dom0|L1AP(Krw)|Section|Cached|Buffered)
#define PTEIO           (Dom0|L1AP(Krw)|Section)

/* wave at the user; clobbers R1 & R7; needs R12 (SB) set */
#define PUTC(c) \
        ISB; \
        MOVW    $PHYSCONS, R7; \
        MOVW    $(c), R1; \
        MOVW    R1, (R7); \
        ISB

/* new instructions */
#define CLZ(s, d) WORD  $(0xe16f0f10 | (d) << 12 | (s)) /* count leading 0s */

#define DMB     \
        MCR     CpSC, 0, R0, C(CpCACHE), C(CpCACHEwb), CpCACHEdmbarr
/*
 * data synchronisation barrier (formerly drain write buffer).
 * waits for cache flushes, eviction buffer drain, tlb flushes,
 * branch-prediction flushes, writes to memory; the lot.
 * on sheeva, also flushes L2 eviction buffer.
 * zeroes R0.
 */
#define DSB     \
        MOVW    $0, R0; \
        MCR     CpSC, 0, R0, C(CpCACHE), C(CpCACHEwb), CpCACHEwait
/*
 * prefetch flush; zeroes R0.
 * arm926ej-s manual says we need to sync with l2 cache in isb,
 * and uncached load is the easiest way.  doesn't seem to matter.
 */
#define ISB     \
        MOVW    $0, R0; \
        MCR     CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvi), CpCACHEwait
//      MOVW    (R0), R0; MOVW $0, R0

/* zeroes R0 */
#define BARRIERS        ISB; DSB

/*
 * invoked with PTE bits in R2, pa in R3, PTE pointed to by R4.
 * fill PTE pointed to by R4 and increment R4 past it.
 * increment R3 by a MB.  clobbers R1.
 */
#define FILLPTE() \
        ORR     R3, R2, R1;                     /* pte bits in R2, pa in R3 */ \
        MOVW    R1, (R4); \
        ADD     $4, R4;                         /* bump PTE address */ \
        ADD     $MiB, R3;                       /* bump pa */ \

/* zero PTE pointed to by R4 and increment R4 past it. assumes R0 is 0. */
#define ZEROPTE() \
        MOVW    R0, (R4); \
        ADD     $4, R4;                         /* bump PTE address */

Generated by GNU Enscript 1.6.6.