^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Definitions for Sun3 custom MMU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #ifndef __SUN3_MMU_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #define __SUN3_MMU_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/movs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/sun3-head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /* MMU characteristics. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define SUN3_SEGMAPS_PER_CONTEXT 2048
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define SUN3_PMEGS_NUM 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define SUN3_CONTEXTS_NUM 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define SUN3_PMEG_SIZE_BITS 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define SUN3_PMEG_SIZE (1 << SUN3_PMEG_SIZE_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SUN3_PMEG_MASK (SUN3_PMEG_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define SUN3_PTE_SIZE_BITS 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define SUN3_PTE_SIZE (1 << SUN3_PTE_SIZE_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define SUN3_PTE_MASK (SUN3_PTE_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define SUN3_CONTROL_MASK (0x0FFFFFFC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define SUN3_INVALID_PMEG 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define SUN3_INVALID_CONTEXT 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define AC_IDPROM 0x00000000 /* 34 ID PROM, R/O, byte, 32 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define AC_PAGEMAP 0x10000000 /* 3 Pagemap R/W, long */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define AC_SEGMAP 0x20000000 /* 3 Segment map, byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define AC_CONTEXT 0x30000000 /* 34c current mmu-context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define AC_SENABLE 0x40000000 /* 34c system dvma/cache/reset enable reg*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define AC_UDVMA_ENB 0x50000000 /* 34 Not used on Sun boards, byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define AC_BUS_ERROR 0x60000000 /* 34 Cleared on read, byte. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define AC_SYNC_ERR 0x60000000 /* c fault type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define AC_SYNC_VA 0x60000004 /* c fault virtual address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define AC_ASYNC_ERR 0x60000008 /* c asynchronous fault type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define AC_ASYNC_VA 0x6000000c /* c async fault virtual address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define AC_LEDS 0x70000000 /* 34 Zero turns on LEDs, byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define AC_CACHETAGS 0x80000000 /* 34c direct access to the VAC tags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define AC_CACHEDDATA 0x90000000 /* 3 c direct access to the VAC data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define AC_UDVMA_MAP 0xD0000000 /* 4 Not used on Sun boards, byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define AC_VME_VECTOR 0xE0000000 /* 4 For non-Autovector VME, byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define AC_BOOT_SCC 0xF0000000 /* 34 bypass to access Zilog 8530. byte.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define SUN3_PAGE_CHG_MASK (SUN3_PAGE_PGNUM_MASK \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) | SUN3_PAGE_ACCESSED | SUN3_PAGE_MODIFIED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* Bus access type within PTE. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define SUN3_PAGE_TYPE_MASK (0x0c000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define SUN3_PAGE_TYPE_MEMORY (0x00000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define SUN3_PAGE_TYPE_IO (0x04000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define SUN3_PAGE_TYPE_VME16 (0x08000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define SUN3_PAGE_TYPE_VME32 (0x0c000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* Mask for page number within PTE. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define SUN3_PAGE_PGNUM_MASK (0x0007FFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* Bits within bus-error register. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define SUN3_BUSERR_WATCHDOG (0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define SUN3_BUSERR_unused (0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define SUN3_BUSERR_FPAENERR (0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define SUN3_BUSERR_FPABERR (0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define SUN3_BUSERR_VMEBERR (0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define SUN3_BUSERR_TIMEOUT (0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define SUN3_BUSERR_PROTERR (0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define SUN3_BUSERR_INVALID (0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Read bus error status register (implicitly clearing it). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static inline unsigned char sun3_get_buserr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) unsigned char sfc, c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) GET_SFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) SET_SFC (FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) GET_CONTROL_BYTE (AC_BUS_ERROR, c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) SET_SFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Read segmap from hardware MMU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static inline unsigned long sun3_get_segmap(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) register unsigned long entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) unsigned char c, sfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) GET_SFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) SET_SFC (FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) GET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) SET_SFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) entry = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) return entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* Write segmap to hardware MMU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) static inline void sun3_put_segmap(unsigned long addr, unsigned long entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) unsigned char sfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) GET_DFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) SET_DFC (FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) SET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) SET_DFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* Read PTE from hardware MMU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static inline unsigned long sun3_get_pte(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) register unsigned long entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) unsigned char sfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) GET_SFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) SET_SFC (FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) GET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) SET_SFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) return entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* Write PTE to hardware MMU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static inline void sun3_put_pte(unsigned long addr, unsigned long entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) unsigned char sfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) GET_DFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) SET_DFC (FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) SET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) SET_DFC (sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* get current context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static inline unsigned char sun3_get_context(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) unsigned char sfc, c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) GET_SFC(sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) SET_SFC(FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) GET_CONTROL_BYTE(AC_CONTEXT, c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) SET_SFC(sfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) return c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* set alternate context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static inline void sun3_put_context(unsigned char c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) unsigned char dfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) GET_DFC(dfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) SET_DFC(FC_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) SET_CONTROL_BYTE(AC_CONTEXT, c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) SET_DFC(dfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) extern void __iomem *sun3_ioremap(unsigned long phys, unsigned long size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) unsigned long type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) extern int sun3_map_test(unsigned long addr, char *val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #endif /* !__ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #endif /* !__SUN3_MMU_H__ */