162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * turbosparc.h:  Defines specific to the TurboSparc module.
462306a36Sopenharmony_ci *            This is SRMMU stuff.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef _SPARC_TURBOSPARC_H
962306a36Sopenharmony_ci#define _SPARC_TURBOSPARC_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <asm/asi.h>
1262306a36Sopenharmony_ci#include <asm/pgtsrmmu.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* Bits in the SRMMU control register for TurboSparc modules.
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci * -------------------------------------------------------------------
1762306a36Sopenharmony_ci * |impl-vers| RSV| PMC |PE|PC| RSV |BM| RFR |IC|DC|PSO|RSV|ICS|NF|ME|
1862306a36Sopenharmony_ci * -------------------------------------------------------------------
1962306a36Sopenharmony_ci *  31    24 23-21 20-19 18 17 16-15 14 13-10  9  8  7  6-3   2  1  0
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci * BM: Boot Mode -- 0 = not in boot mode, 1 = in boot mode
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * This indicates whether the TurboSparc is in boot-mode or not.
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * IC: Instruction Cache -- 0 = off, 1 = on
2662306a36Sopenharmony_ci * DC: Data Cache -- 0 = off, 1 = 0n
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * These bits enable the on-cpu TurboSparc split I/D caches.
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci * ICS: ICache Snooping -- 0 = disable, 1 = enable snooping of icache
3162306a36Sopenharmony_ci * NF: No Fault -- 0 = faults generate traps, 1 = faults don't trap
3262306a36Sopenharmony_ci * ME: MMU enable -- 0 = mmu not translating, 1 = mmu translating
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define TURBOSPARC_MMUENABLE    0x00000001
3762306a36Sopenharmony_ci#define TURBOSPARC_NOFAULT      0x00000002
3862306a36Sopenharmony_ci#define TURBOSPARC_ICSNOOP	0x00000004
3962306a36Sopenharmony_ci#define TURBOSPARC_PSO          0x00000080
4062306a36Sopenharmony_ci#define TURBOSPARC_DCENABLE     0x00000100   /* Enable data cache */
4162306a36Sopenharmony_ci#define TURBOSPARC_ICENABLE     0x00000200   /* Enable instruction cache */
4262306a36Sopenharmony_ci#define TURBOSPARC_BMODE        0x00004000
4362306a36Sopenharmony_ci#define TURBOSPARC_PARITYODD	0x00020000   /* Parity odd, if enabled */
4462306a36Sopenharmony_ci#define TURBOSPARC_PCENABLE	0x00040000   /* Enable parity checking */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* Bits in the CPU configuration register for TurboSparc modules.
4762306a36Sopenharmony_ci *
4862306a36Sopenharmony_ci * -------------------------------------------------------
4962306a36Sopenharmony_ci * |IOClk|SNP|AXClk| RAH |  WS |  RSV  |SBC|WT|uS2|SE|SCC|
5062306a36Sopenharmony_ci * -------------------------------------------------------
5162306a36Sopenharmony_ci *    31   30 29-28 27-26 25-23   22-8  7-6  5  4   3 2-0
5262306a36Sopenharmony_ci *
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define TURBOSPARC_SCENABLE 0x00000008	 /* Secondary cache enable */
5662306a36Sopenharmony_ci#define TURBOSPARC_uS2	    0x00000010   /* Swift compatibility mode */
5762306a36Sopenharmony_ci#define TURBOSPARC_WTENABLE 0x00000020	 /* Write thru for dcache */
5862306a36Sopenharmony_ci#define TURBOSPARC_SNENABLE 0x40000000	 /* DVMA snoop enable */
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#ifndef __ASSEMBLY__
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* Bits [13:5] select one of 512 instruction cache tags */
6362306a36Sopenharmony_cistatic inline void turbosparc_inv_insn_tag(unsigned long addr)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci        __asm__ __volatile__("sta %%g0, [%0] %1\n\t"
6662306a36Sopenharmony_ci			     : /* no outputs */
6762306a36Sopenharmony_ci			     : "r" (addr), "i" (ASI_M_TXTC_TAG)
6862306a36Sopenharmony_ci			     : "memory");
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* Bits [13:5] select one of 512 data cache tags */
7262306a36Sopenharmony_cistatic inline void turbosparc_inv_data_tag(unsigned long addr)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci        __asm__ __volatile__("sta %%g0, [%0] %1\n\t"
7562306a36Sopenharmony_ci			     : /* no outputs */
7662306a36Sopenharmony_ci			     : "r" (addr), "i" (ASI_M_DATAC_TAG)
7762306a36Sopenharmony_ci			     : "memory");
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic inline void turbosparc_flush_icache(void)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	unsigned long addr;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci        for (addr = 0; addr < 0x4000; addr += 0x20)
8562306a36Sopenharmony_ci                turbosparc_inv_insn_tag(addr);
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline void turbosparc_flush_dcache(void)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	unsigned long addr;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci        for (addr = 0; addr < 0x4000; addr += 0x20)
9362306a36Sopenharmony_ci                turbosparc_inv_data_tag(addr);
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic inline void turbosparc_idflash_clear(void)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	unsigned long addr;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci        for (addr = 0; addr < 0x4000; addr += 0x20) {
10162306a36Sopenharmony_ci                turbosparc_inv_insn_tag(addr);
10262306a36Sopenharmony_ci                turbosparc_inv_data_tag(addr);
10362306a36Sopenharmony_ci	}
10462306a36Sopenharmony_ci}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cistatic inline void turbosparc_set_ccreg(unsigned long regval)
10762306a36Sopenharmony_ci{
10862306a36Sopenharmony_ci	__asm__ __volatile__("sta %0, [%1] %2\n\t"
10962306a36Sopenharmony_ci			     : /* no outputs */
11062306a36Sopenharmony_ci			     : "r" (regval), "r" (0x600), "i" (ASI_M_MMUREGS)
11162306a36Sopenharmony_ci			     : "memory");
11262306a36Sopenharmony_ci}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistatic inline unsigned long turbosparc_get_ccreg(void)
11562306a36Sopenharmony_ci{
11662306a36Sopenharmony_ci	unsigned long regval;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	__asm__ __volatile__("lda [%1] %2, %0\n\t"
11962306a36Sopenharmony_ci			     : "=r" (regval)
12062306a36Sopenharmony_ci			     : "r" (0x600), "i" (ASI_M_MMUREGS));
12162306a36Sopenharmony_ci	return regval;
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#endif /* !(_SPARC_TURBOSPARC_H) */
127