162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Definitions for Sun3 custom MMU. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#ifndef __SUN3_MMU_H__ 662306a36Sopenharmony_ci#define __SUN3_MMU_H__ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/types.h> 962306a36Sopenharmony_ci#include <asm/movs.h> 1062306a36Sopenharmony_ci#include <asm/sun3-head.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* MMU characteristics. */ 1362306a36Sopenharmony_ci#define SUN3_SEGMAPS_PER_CONTEXT 2048 1462306a36Sopenharmony_ci#define SUN3_PMEGS_NUM 256 1562306a36Sopenharmony_ci#define SUN3_CONTEXTS_NUM 8 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define SUN3_PMEG_SIZE_BITS 17 1862306a36Sopenharmony_ci#define SUN3_PMEG_SIZE (1 << SUN3_PMEG_SIZE_BITS) 1962306a36Sopenharmony_ci#define SUN3_PMEG_MASK (SUN3_PMEG_SIZE - 1) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define SUN3_PTE_SIZE_BITS 13 2262306a36Sopenharmony_ci#define SUN3_PTE_SIZE (1 << SUN3_PTE_SIZE_BITS) 2362306a36Sopenharmony_ci#define SUN3_PTE_MASK (SUN3_PTE_SIZE - 1) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define SUN3_CONTROL_MASK (0x0FFFFFFC) 2662306a36Sopenharmony_ci#define SUN3_INVALID_PMEG 255 2762306a36Sopenharmony_ci#define SUN3_INVALID_CONTEXT 255 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define AC_IDPROM 0x00000000 /* 34 ID PROM, R/O, byte, 32 bytes */ 3062306a36Sopenharmony_ci#define AC_PAGEMAP 0x10000000 /* 3 Pagemap R/W, long */ 3162306a36Sopenharmony_ci#define AC_SEGMAP 0x20000000 /* 3 Segment map, byte */ 3262306a36Sopenharmony_ci#define AC_CONTEXT 0x30000000 /* 34c current mmu-context */ 3362306a36Sopenharmony_ci#define AC_SENABLE 0x40000000 /* 34c system dvma/cache/reset enable reg*/ 3462306a36Sopenharmony_ci#define AC_UDVMA_ENB 0x50000000 /* 34 Not used on Sun boards, byte */ 3562306a36Sopenharmony_ci#define AC_BUS_ERROR 0x60000000 /* 34 Cleared on read, byte. */ 3662306a36Sopenharmony_ci#define AC_SYNC_ERR 0x60000000 /* c fault type */ 3762306a36Sopenharmony_ci#define AC_SYNC_VA 0x60000004 /* c fault virtual address */ 3862306a36Sopenharmony_ci#define AC_ASYNC_ERR 0x60000008 /* c asynchronous fault type */ 3962306a36Sopenharmony_ci#define AC_ASYNC_VA 0x6000000c /* c async fault virtual address */ 4062306a36Sopenharmony_ci#define AC_LEDS 0x70000000 /* 34 Zero turns on LEDs, byte */ 4162306a36Sopenharmony_ci#define AC_CACHETAGS 0x80000000 /* 34c direct access to the VAC tags */ 4262306a36Sopenharmony_ci#define AC_CACHEDDATA 0x90000000 /* 3 c direct access to the VAC data */ 4362306a36Sopenharmony_ci#define AC_UDVMA_MAP 0xD0000000 /* 4 Not used on Sun boards, byte */ 4462306a36Sopenharmony_ci#define AC_VME_VECTOR 0xE0000000 /* 4 For non-Autovector VME, byte */ 4562306a36Sopenharmony_ci#define AC_BOOT_SCC 0xF0000000 /* 34 bypass to access Zilog 8530. byte.*/ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define SUN3_PAGE_CHG_MASK (SUN3_PAGE_PGNUM_MASK \ 4862306a36Sopenharmony_ci | SUN3_PAGE_ACCESSED | SUN3_PAGE_MODIFIED) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* Bus access type within PTE. */ 5162306a36Sopenharmony_ci#define SUN3_PAGE_TYPE_MASK (0x0c000000) 5262306a36Sopenharmony_ci#define SUN3_PAGE_TYPE_MEMORY (0x00000000) 5362306a36Sopenharmony_ci#define SUN3_PAGE_TYPE_IO (0x04000000) 5462306a36Sopenharmony_ci#define SUN3_PAGE_TYPE_VME16 (0x08000000) 5562306a36Sopenharmony_ci#define SUN3_PAGE_TYPE_VME32 (0x0c000000) 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* Mask for page number within PTE. */ 5862306a36Sopenharmony_ci#define SUN3_PAGE_PGNUM_MASK (0x0007FFFF) 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* Bits within bus-error register. */ 6162306a36Sopenharmony_ci#define SUN3_BUSERR_WATCHDOG (0x01) 6262306a36Sopenharmony_ci#define SUN3_BUSERR_unused (0x02) 6362306a36Sopenharmony_ci#define SUN3_BUSERR_FPAENERR (0x04) 6462306a36Sopenharmony_ci#define SUN3_BUSERR_FPABERR (0x08) 6562306a36Sopenharmony_ci#define SUN3_BUSERR_VMEBERR (0x10) 6662306a36Sopenharmony_ci#define SUN3_BUSERR_TIMEOUT (0x20) 6762306a36Sopenharmony_ci#define SUN3_BUSERR_PROTERR (0x40) 6862306a36Sopenharmony_ci#define SUN3_BUSERR_INVALID (0x80) 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* Read bus error status register (implicitly clearing it). */ 7362306a36Sopenharmony_cistatic inline unsigned char sun3_get_buserr(void) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci unsigned char sfc, c; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci GET_SFC (sfc); 7862306a36Sopenharmony_ci SET_SFC (FC_CONTROL); 7962306a36Sopenharmony_ci GET_CONTROL_BYTE (AC_BUS_ERROR, c); 8062306a36Sopenharmony_ci SET_SFC (sfc); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci return c; 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* Read segmap from hardware MMU. */ 8662306a36Sopenharmony_cistatic inline unsigned long sun3_get_segmap(unsigned long addr) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci register unsigned long entry; 8962306a36Sopenharmony_ci unsigned char c, sfc; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci GET_SFC (sfc); 9262306a36Sopenharmony_ci SET_SFC (FC_CONTROL); 9362306a36Sopenharmony_ci GET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), c); 9462306a36Sopenharmony_ci SET_SFC (sfc); 9562306a36Sopenharmony_ci entry = c; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci return entry; 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* Write segmap to hardware MMU. */ 10162306a36Sopenharmony_cistatic inline void sun3_put_segmap(unsigned long addr, unsigned long entry) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci unsigned char sfc; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci GET_DFC (sfc); 10662306a36Sopenharmony_ci SET_DFC (FC_CONTROL); 10762306a36Sopenharmony_ci SET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), entry); 10862306a36Sopenharmony_ci SET_DFC (sfc); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci return; 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* Read PTE from hardware MMU. */ 11462306a36Sopenharmony_cistatic inline unsigned long sun3_get_pte(unsigned long addr) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci register unsigned long entry; 11762306a36Sopenharmony_ci unsigned char sfc; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci GET_SFC (sfc); 12062306a36Sopenharmony_ci SET_SFC (FC_CONTROL); 12162306a36Sopenharmony_ci GET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry); 12262306a36Sopenharmony_ci SET_SFC (sfc); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci return entry; 12562306a36Sopenharmony_ci} 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/* Write PTE to hardware MMU. */ 12862306a36Sopenharmony_cistatic inline void sun3_put_pte(unsigned long addr, unsigned long entry) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci unsigned char sfc; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci GET_DFC (sfc); 13362306a36Sopenharmony_ci SET_DFC (FC_CONTROL); 13462306a36Sopenharmony_ci SET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry); 13562306a36Sopenharmony_ci SET_DFC (sfc); 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci return; 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* get current context */ 14162306a36Sopenharmony_cistatic inline unsigned char sun3_get_context(void) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci unsigned char sfc, c; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci GET_SFC(sfc); 14662306a36Sopenharmony_ci SET_SFC(FC_CONTROL); 14762306a36Sopenharmony_ci GET_CONTROL_BYTE(AC_CONTEXT, c); 14862306a36Sopenharmony_ci SET_SFC(sfc); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci return c; 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/* set alternate context */ 15462306a36Sopenharmony_cistatic inline void sun3_put_context(unsigned char c) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci unsigned char dfc; 15762306a36Sopenharmony_ci GET_DFC(dfc); 15862306a36Sopenharmony_ci SET_DFC(FC_CONTROL); 15962306a36Sopenharmony_ci SET_CONTROL_BYTE(AC_CONTEXT, c); 16062306a36Sopenharmony_ci SET_DFC(dfc); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci return; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ciextern void __iomem *sun3_ioremap(unsigned long phys, unsigned long size, 16662306a36Sopenharmony_ci unsigned long type); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ciextern int sun3_map_test(unsigned long addr, char *val); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci#endif /* !__SUN3_MMU_H__ */ 173