Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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__ */