sun3mmu.h 4.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
/*
 * Definitions for Sun3 custom MMU.
 */
#ifndef __SUN3_MMU_H__
#define __SUN3_MMU_H__

A
Al Viro 已提交
7
#include <linux/types.h>
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
#include <asm/movs.h>
#include <asm/sun3-head.h>

/* MMU characteristics. */
#define SUN3_SEGMAPS_PER_CONTEXT	2048
#define SUN3_PMEGS_NUM			256
#define SUN3_CONTEXTS_NUM               8

#define SUN3_PMEG_SIZE_BITS	 17
#define SUN3_PMEG_SIZE		 (1 << SUN3_PMEG_SIZE_BITS)
#define SUN3_PMEG_MASK		 (SUN3_PMEG_SIZE - 1)

#define SUN3_PTE_SIZE_BITS       13
#define SUN3_PTE_SIZE		 (1 << SUN3_PTE_SIZE_BITS)
#define SUN3_PTE_MASK		 (SUN3_PTE_SIZE - 1)

#define SUN3_CONTROL_MASK       (0x0FFFFFFC)
#define SUN3_INVALID_PMEG	255
#define SUN3_INVALID_CONTEXT 255

#define AC_IDPROM     0x00000000    /* 34  ID PROM, R/O, byte, 32 bytes      */
#define AC_PAGEMAP    0x10000000    /* 3   Pagemap R/W, long                 */
#define AC_SEGMAP     0x20000000    /* 3   Segment map, byte                 */
#define AC_CONTEXT    0x30000000    /* 34c current mmu-context               */
#define AC_SENABLE    0x40000000    /* 34c system dvma/cache/reset enable reg*/
#define AC_UDVMA_ENB  0x50000000    /* 34  Not used on Sun boards, byte      */
#define AC_BUS_ERROR  0x60000000    /* 34  Cleared on read, byte.            */
#define AC_SYNC_ERR   0x60000000    /*   c fault type                        */
#define AC_SYNC_VA    0x60000004    /*   c fault virtual address             */
#define AC_ASYNC_ERR  0x60000008    /*   c asynchronous fault type           */
#define AC_ASYNC_VA   0x6000000c    /*   c async fault virtual address       */
#define AC_LEDS       0x70000000    /* 34  Zero turns on LEDs, byte          */
#define AC_CACHETAGS  0x80000000    /* 34c direct access to the VAC tags     */
#define AC_CACHEDDATA 0x90000000    /* 3 c direct access to the VAC data     */
#define AC_UDVMA_MAP  0xD0000000    /* 4   Not used on Sun boards, byte      */
#define AC_VME_VECTOR 0xE0000000    /* 4   For non-Autovector VME, byte      */
#define AC_BOOT_SCC   0xF0000000    /* 34  bypass to access Zilog 8530. byte.*/

#define SUN3_PAGE_CHG_MASK (SUN3_PAGE_PGNUM_MASK \
			    | SUN3_PAGE_ACCESSED | SUN3_PAGE_MODIFIED)

/* Bus access type within PTE. */
#define SUN3_PAGE_TYPE_MASK   (0x0c000000)
#define SUN3_PAGE_TYPE_MEMORY (0x00000000)
#define SUN3_PAGE_TYPE_IO     (0x04000000)
#define SUN3_PAGE_TYPE_VME16  (0x08000000)
#define SUN3_PAGE_TYPE_VME32  (0x0c000000)

/* Mask for page number within PTE. */
#define SUN3_PAGE_PGNUM_MASK (0x0007FFFF)

/* Bits within bus-error register. */
#define SUN3_BUSERR_WATCHDOG	(0x01)
#define SUN3_BUSERR_unused	(0x02)
#define SUN3_BUSERR_FPAENERR	(0x04)
#define SUN3_BUSERR_FPABERR	(0x08)
#define SUN3_BUSERR_VMEBERR	(0x10)
#define SUN3_BUSERR_TIMEOUT	(0x20)
#define SUN3_BUSERR_PROTERR	(0x40)
#define SUN3_BUSERR_INVALID	(0x80)

#ifndef __ASSEMBLY__

/* Read bus error status register (implicitly clearing it). */
static inline unsigned char sun3_get_buserr(void)
{
	unsigned char sfc, c;

	GET_SFC (sfc);
	SET_SFC (FC_CONTROL);
	GET_CONTROL_BYTE (AC_BUS_ERROR, c);
	SET_SFC (sfc);

	return c;
}

/* Read segmap from hardware MMU. */
static inline unsigned long sun3_get_segmap(unsigned long addr)
{
        register unsigned long entry;
        unsigned char c, sfc;

        GET_SFC (sfc);
        SET_SFC (FC_CONTROL);
        GET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), c);
        SET_SFC (sfc);
        entry = c;

        return entry;
}

/* Write segmap to hardware MMU. */
static inline void sun3_put_segmap(unsigned long addr, unsigned long entry)
{
        unsigned char sfc;

        GET_DFC (sfc);
        SET_DFC (FC_CONTROL);
        SET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), entry);
	SET_DFC (sfc);

        return;
}

/* Read PTE from hardware MMU. */
static inline unsigned long sun3_get_pte(unsigned long addr)
{
        register unsigned long entry;
        unsigned char sfc;

        GET_SFC (sfc);
        SET_SFC (FC_CONTROL);
        GET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry);
        SET_SFC (sfc);

        return entry;
}

/* Write PTE to hardware MMU. */
static inline void sun3_put_pte(unsigned long addr, unsigned long entry)
{
        unsigned char sfc;

        GET_DFC (sfc);
        SET_DFC (FC_CONTROL);
        SET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry);
	SET_DFC (sfc);

        return;
}

/* get current context */
static inline unsigned char sun3_get_context(void)
{
	unsigned char sfc, c;

	GET_SFC(sfc);
	SET_SFC(FC_CONTROL);
	GET_CONTROL_BYTE(AC_CONTEXT, c);
	SET_SFC(sfc);

	return c;
}

/* set alternate context */
static inline void sun3_put_context(unsigned char c)
{
	unsigned char dfc;
	GET_DFC(dfc);
	SET_DFC(FC_CONTROL);
	SET_CONTROL_BYTE(AC_CONTEXT, c);
	SET_DFC(dfc);

	return;
}

A
Al Viro 已提交
164
extern void __iomem *sun3_ioremap(unsigned long phys, unsigned long size,
L
Linus Torvalds 已提交
165 166 167 168 169 170 171
			  unsigned long type);

extern int sun3_map_test(unsigned long addr, char *val);

#endif	/* !__ASSEMBLY__ */

#endif	/* !__SUN3_MMU_H__ */