162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* spitfire.h: SpitFire/BlackBird/Cheetah inline MMU operations.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef _SPARC64_SPITFIRE_H
862306a36Sopenharmony_ci#define _SPARC64_SPITFIRE_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifdef CONFIG_SPARC64
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <asm/asi.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* The following register addresses are accessible via ASI_DMMU
1562306a36Sopenharmony_ci * and ASI_IMMU, that is there is a distinct and unique copy of
1662306a36Sopenharmony_ci * each these registers for each TLB.
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_ci#define TSB_TAG_TARGET		0x0000000000000000 /* All chips				*/
1962306a36Sopenharmony_ci#define TLB_SFSR		0x0000000000000018 /* All chips				*/
2062306a36Sopenharmony_ci#define TSB_REG			0x0000000000000028 /* All chips				*/
2162306a36Sopenharmony_ci#define TLB_TAG_ACCESS		0x0000000000000030 /* All chips				*/
2262306a36Sopenharmony_ci#define VIRT_WATCHPOINT		0x0000000000000038 /* All chips				*/
2362306a36Sopenharmony_ci#define PHYS_WATCHPOINT		0x0000000000000040 /* All chips				*/
2462306a36Sopenharmony_ci#define TSB_EXTENSION_P		0x0000000000000048 /* Ultra-III and later		*/
2562306a36Sopenharmony_ci#define TSB_EXTENSION_S		0x0000000000000050 /* Ultra-III and later, D-TLB only	*/
2662306a36Sopenharmony_ci#define TSB_EXTENSION_N		0x0000000000000058 /* Ultra-III and later		*/
2762306a36Sopenharmony_ci#define TLB_TAG_ACCESS_EXT	0x0000000000000060 /* Ultra-III+ and later		*/
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* These registers only exist as one entity, and are accessed
3062306a36Sopenharmony_ci * via ASI_DMMU only.
3162306a36Sopenharmony_ci */
3262306a36Sopenharmony_ci#define PRIMARY_CONTEXT		0x0000000000000008
3362306a36Sopenharmony_ci#define SECONDARY_CONTEXT	0x0000000000000010
3462306a36Sopenharmony_ci#define DMMU_SFAR		0x0000000000000020
3562306a36Sopenharmony_ci#define VIRT_WATCHPOINT		0x0000000000000038
3662306a36Sopenharmony_ci#define PHYS_WATCHPOINT		0x0000000000000040
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define SPITFIRE_HIGHEST_LOCKED_TLBENT	(64 - 1)
3962306a36Sopenharmony_ci#define CHEETAH_HIGHEST_LOCKED_TLBENT	(16 - 1)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define L1DCACHE_SIZE		0x4000
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define SUN4V_CHIP_INVALID	0x00
4462306a36Sopenharmony_ci#define SUN4V_CHIP_NIAGARA1	0x01
4562306a36Sopenharmony_ci#define SUN4V_CHIP_NIAGARA2	0x02
4662306a36Sopenharmony_ci#define SUN4V_CHIP_NIAGARA3	0x03
4762306a36Sopenharmony_ci#define SUN4V_CHIP_NIAGARA4	0x04
4862306a36Sopenharmony_ci#define SUN4V_CHIP_NIAGARA5	0x05
4962306a36Sopenharmony_ci#define SUN4V_CHIP_SPARC_M6	0x06
5062306a36Sopenharmony_ci#define SUN4V_CHIP_SPARC_M7	0x07
5162306a36Sopenharmony_ci#define SUN4V_CHIP_SPARC_M8	0x08
5262306a36Sopenharmony_ci#define SUN4V_CHIP_SPARC64X	0x8a
5362306a36Sopenharmony_ci#define SUN4V_CHIP_SPARC_SN	0x8b
5462306a36Sopenharmony_ci#define SUN4V_CHIP_UNKNOWN	0xff
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/*
5762306a36Sopenharmony_ci * The following CPU_ID_xxx constants are used
5862306a36Sopenharmony_ci * to identify the CPU type in the setup phase
5962306a36Sopenharmony_ci * (see head_64.S)
6062306a36Sopenharmony_ci */
6162306a36Sopenharmony_ci#define CPU_ID_NIAGARA1		('1')
6262306a36Sopenharmony_ci#define CPU_ID_NIAGARA2		('2')
6362306a36Sopenharmony_ci#define CPU_ID_NIAGARA3		('3')
6462306a36Sopenharmony_ci#define CPU_ID_NIAGARA4		('4')
6562306a36Sopenharmony_ci#define CPU_ID_NIAGARA5		('5')
6662306a36Sopenharmony_ci#define CPU_ID_M6		('6')
6762306a36Sopenharmony_ci#define CPU_ID_M7		('7')
6862306a36Sopenharmony_ci#define CPU_ID_M8		('8')
6962306a36Sopenharmony_ci#define CPU_ID_SONOMA1		('N')
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#ifndef __ASSEMBLY__
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cienum ultra_tlb_layout {
7462306a36Sopenharmony_ci	spitfire = 0,
7562306a36Sopenharmony_ci	cheetah = 1,
7662306a36Sopenharmony_ci	cheetah_plus = 2,
7762306a36Sopenharmony_ci	hypervisor = 3,
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciextern enum ultra_tlb_layout tlb_type;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciextern int sun4v_chip_type;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ciextern int cheetah_pcache_forced_on;
8562306a36Sopenharmony_civoid cheetah_enable_pcache(void);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define sparc64_highest_locked_tlbent()	\
8862306a36Sopenharmony_ci	(tlb_type == spitfire ? \
8962306a36Sopenharmony_ci	 SPITFIRE_HIGHEST_LOCKED_TLBENT : \
9062306a36Sopenharmony_ci	 CHEETAH_HIGHEST_LOCKED_TLBENT)
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ciextern int num_kernel_image_mappings;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* The data cache is write through, so this just invalidates the
9562306a36Sopenharmony_ci * specified line.
9662306a36Sopenharmony_ci */
9762306a36Sopenharmony_cistatic inline void spitfire_put_dcache_tag(unsigned long addr, unsigned long tag)
9862306a36Sopenharmony_ci{
9962306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
10062306a36Sopenharmony_ci			     "membar	#Sync"
10162306a36Sopenharmony_ci			     : /* No outputs */
10262306a36Sopenharmony_ci			     : "r" (tag), "r" (addr), "i" (ASI_DCACHE_TAG));
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/* The instruction cache lines are flushed with this, but note that
10662306a36Sopenharmony_ci * this does not flush the pipeline.  It is possible for a line to
10762306a36Sopenharmony_ci * get flushed but stale instructions to still be in the pipeline,
10862306a36Sopenharmony_ci * a flush instruction (to any address) is sufficient to handle
10962306a36Sopenharmony_ci * this issue after the line is invalidated.
11062306a36Sopenharmony_ci */
11162306a36Sopenharmony_cistatic inline void spitfire_put_icache_tag(unsigned long addr, unsigned long tag)
11262306a36Sopenharmony_ci{
11362306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
11462306a36Sopenharmony_ci			     "membar	#Sync"
11562306a36Sopenharmony_ci			     : /* No outputs */
11662306a36Sopenharmony_ci			     : "r" (tag), "r" (addr), "i" (ASI_IC_TAG));
11762306a36Sopenharmony_ci}
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_cistatic inline unsigned long spitfire_get_dtlb_data(int entry)
12062306a36Sopenharmony_ci{
12162306a36Sopenharmony_ci	unsigned long data;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
12462306a36Sopenharmony_ci			     : "=r" (data)
12562306a36Sopenharmony_ci			     : "r" (entry << 3), "i" (ASI_DTLB_DATA_ACCESS));
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* Clear TTE diag bits. */
12862306a36Sopenharmony_ci	data &= ~0x0003fe0000000000UL;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	return data;
13162306a36Sopenharmony_ci}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cistatic inline unsigned long spitfire_get_dtlb_tag(int entry)
13462306a36Sopenharmony_ci{
13562306a36Sopenharmony_ci	unsigned long tag;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
13862306a36Sopenharmony_ci			     : "=r" (tag)
13962306a36Sopenharmony_ci			     : "r" (entry << 3), "i" (ASI_DTLB_TAG_READ));
14062306a36Sopenharmony_ci	return tag;
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistatic inline void spitfire_put_dtlb_data(int entry, unsigned long data)
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
14662306a36Sopenharmony_ci			     "membar	#Sync"
14762306a36Sopenharmony_ci			     : /* No outputs */
14862306a36Sopenharmony_ci			     : "r" (data), "r" (entry << 3),
14962306a36Sopenharmony_ci			       "i" (ASI_DTLB_DATA_ACCESS));
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cistatic inline unsigned long spitfire_get_itlb_data(int entry)
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	unsigned long data;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
15762306a36Sopenharmony_ci			     : "=r" (data)
15862306a36Sopenharmony_ci			     : "r" (entry << 3), "i" (ASI_ITLB_DATA_ACCESS));
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	/* Clear TTE diag bits. */
16162306a36Sopenharmony_ci	data &= ~0x0003fe0000000000UL;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	return data;
16462306a36Sopenharmony_ci}
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_cistatic inline unsigned long spitfire_get_itlb_tag(int entry)
16762306a36Sopenharmony_ci{
16862306a36Sopenharmony_ci	unsigned long tag;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
17162306a36Sopenharmony_ci			     : "=r" (tag)
17262306a36Sopenharmony_ci			     : "r" (entry << 3), "i" (ASI_ITLB_TAG_READ));
17362306a36Sopenharmony_ci	return tag;
17462306a36Sopenharmony_ci}
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic inline void spitfire_put_itlb_data(int entry, unsigned long data)
17762306a36Sopenharmony_ci{
17862306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
17962306a36Sopenharmony_ci			     "membar	#Sync"
18062306a36Sopenharmony_ci			     : /* No outputs */
18162306a36Sopenharmony_ci			     : "r" (data), "r" (entry << 3),
18262306a36Sopenharmony_ci			       "i" (ASI_ITLB_DATA_ACCESS));
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistatic inline void spitfire_flush_dtlb_nucleus_page(unsigned long page)
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%%g0, [%0] %1\n\t"
18862306a36Sopenharmony_ci			     "membar	#Sync"
18962306a36Sopenharmony_ci			     : /* No outputs */
19062306a36Sopenharmony_ci			     : "r" (page | 0x20), "i" (ASI_DMMU_DEMAP));
19162306a36Sopenharmony_ci}
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cistatic inline void spitfire_flush_itlb_nucleus_page(unsigned long page)
19462306a36Sopenharmony_ci{
19562306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%%g0, [%0] %1\n\t"
19662306a36Sopenharmony_ci			     "membar	#Sync"
19762306a36Sopenharmony_ci			     : /* No outputs */
19862306a36Sopenharmony_ci			     : "r" (page | 0x20), "i" (ASI_IMMU_DEMAP));
19962306a36Sopenharmony_ci}
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci/* Cheetah has "all non-locked" tlb flushes. */
20262306a36Sopenharmony_cistatic inline void cheetah_flush_dtlb_all(void)
20362306a36Sopenharmony_ci{
20462306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%%g0, [%0] %1\n\t"
20562306a36Sopenharmony_ci			     "membar	#Sync"
20662306a36Sopenharmony_ci			     : /* No outputs */
20762306a36Sopenharmony_ci			     : "r" (0x80), "i" (ASI_DMMU_DEMAP));
20862306a36Sopenharmony_ci}
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistatic inline void cheetah_flush_itlb_all(void)
21162306a36Sopenharmony_ci{
21262306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%%g0, [%0] %1\n\t"
21362306a36Sopenharmony_ci			     "membar	#Sync"
21462306a36Sopenharmony_ci			     : /* No outputs */
21562306a36Sopenharmony_ci			     : "r" (0x80), "i" (ASI_IMMU_DEMAP));
21662306a36Sopenharmony_ci}
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci/* Cheetah has a 4-tlb layout so direct access is a bit different.
21962306a36Sopenharmony_ci * The first two TLBs are fully assosciative, hold 16 entries, and are
22062306a36Sopenharmony_ci * used only for locked and >8K sized translations.  One exists for
22162306a36Sopenharmony_ci * data accesses and one for instruction accesses.
22262306a36Sopenharmony_ci *
22362306a36Sopenharmony_ci * The third TLB is for data accesses to 8K non-locked translations, is
22462306a36Sopenharmony_ci * 2 way assosciative, and holds 512 entries.  The fourth TLB is for
22562306a36Sopenharmony_ci * instruction accesses to 8K non-locked translations, is 2 way
22662306a36Sopenharmony_ci * assosciative, and holds 128 entries.
22762306a36Sopenharmony_ci *
22862306a36Sopenharmony_ci * Cheetah has some bug where bogus data can be returned from
22962306a36Sopenharmony_ci * ASI_{D,I}TLB_DATA_ACCESS loads, doing the load twice fixes
23062306a36Sopenharmony_ci * the problem for me. -DaveM
23162306a36Sopenharmony_ci */
23262306a36Sopenharmony_cistatic inline unsigned long cheetah_get_ldtlb_data(int entry)
23362306a36Sopenharmony_ci{
23462306a36Sopenharmony_ci	unsigned long data;
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %%g0\n\t"
23762306a36Sopenharmony_ci			     "ldxa	[%1] %2, %0"
23862306a36Sopenharmony_ci			     : "=r" (data)
23962306a36Sopenharmony_ci			     : "r" ((0 << 16) | (entry << 3)),
24062306a36Sopenharmony_ci			     "i" (ASI_DTLB_DATA_ACCESS));
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	return data;
24362306a36Sopenharmony_ci}
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistatic inline unsigned long cheetah_get_litlb_data(int entry)
24662306a36Sopenharmony_ci{
24762306a36Sopenharmony_ci	unsigned long data;
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %%g0\n\t"
25062306a36Sopenharmony_ci			     "ldxa	[%1] %2, %0"
25162306a36Sopenharmony_ci			     : "=r" (data)
25262306a36Sopenharmony_ci			     : "r" ((0 << 16) | (entry << 3)),
25362306a36Sopenharmony_ci			     "i" (ASI_ITLB_DATA_ACCESS));
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	return data;
25662306a36Sopenharmony_ci}
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistatic inline unsigned long cheetah_get_ldtlb_tag(int entry)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	unsigned long tag;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
26362306a36Sopenharmony_ci			     : "=r" (tag)
26462306a36Sopenharmony_ci			     : "r" ((0 << 16) | (entry << 3)),
26562306a36Sopenharmony_ci			     "i" (ASI_DTLB_TAG_READ));
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	return tag;
26862306a36Sopenharmony_ci}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistatic inline unsigned long cheetah_get_litlb_tag(int entry)
27162306a36Sopenharmony_ci{
27262306a36Sopenharmony_ci	unsigned long tag;
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
27562306a36Sopenharmony_ci			     : "=r" (tag)
27662306a36Sopenharmony_ci			     : "r" ((0 << 16) | (entry << 3)),
27762306a36Sopenharmony_ci			     "i" (ASI_ITLB_TAG_READ));
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	return tag;
28062306a36Sopenharmony_ci}
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic inline void cheetah_put_ldtlb_data(int entry, unsigned long data)
28362306a36Sopenharmony_ci{
28462306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
28562306a36Sopenharmony_ci			     "membar	#Sync"
28662306a36Sopenharmony_ci			     : /* No outputs */
28762306a36Sopenharmony_ci			     : "r" (data),
28862306a36Sopenharmony_ci			       "r" ((0 << 16) | (entry << 3)),
28962306a36Sopenharmony_ci			       "i" (ASI_DTLB_DATA_ACCESS));
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistatic inline void cheetah_put_litlb_data(int entry, unsigned long data)
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
29562306a36Sopenharmony_ci			     "membar	#Sync"
29662306a36Sopenharmony_ci			     : /* No outputs */
29762306a36Sopenharmony_ci			     : "r" (data),
29862306a36Sopenharmony_ci			       "r" ((0 << 16) | (entry << 3)),
29962306a36Sopenharmony_ci			       "i" (ASI_ITLB_DATA_ACCESS));
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cistatic inline unsigned long cheetah_get_dtlb_data(int entry, int tlb)
30362306a36Sopenharmony_ci{
30462306a36Sopenharmony_ci	unsigned long data;
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %%g0\n\t"
30762306a36Sopenharmony_ci			     "ldxa	[%1] %2, %0"
30862306a36Sopenharmony_ci			     : "=r" (data)
30962306a36Sopenharmony_ci			     : "r" ((tlb << 16) | (entry << 3)), "i" (ASI_DTLB_DATA_ACCESS));
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	return data;
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic inline unsigned long cheetah_get_dtlb_tag(int entry, int tlb)
31562306a36Sopenharmony_ci{
31662306a36Sopenharmony_ci	unsigned long tag;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
31962306a36Sopenharmony_ci			     : "=r" (tag)
32062306a36Sopenharmony_ci			     : "r" ((tlb << 16) | (entry << 3)), "i" (ASI_DTLB_TAG_READ));
32162306a36Sopenharmony_ci	return tag;
32262306a36Sopenharmony_ci}
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_cistatic inline void cheetah_put_dtlb_data(int entry, unsigned long data, int tlb)
32562306a36Sopenharmony_ci{
32662306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
32762306a36Sopenharmony_ci			     "membar	#Sync"
32862306a36Sopenharmony_ci			     : /* No outputs */
32962306a36Sopenharmony_ci			     : "r" (data),
33062306a36Sopenharmony_ci			       "r" ((tlb << 16) | (entry << 3)),
33162306a36Sopenharmony_ci			       "i" (ASI_DTLB_DATA_ACCESS));
33262306a36Sopenharmony_ci}
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_cistatic inline unsigned long cheetah_get_itlb_data(int entry)
33562306a36Sopenharmony_ci{
33662306a36Sopenharmony_ci	unsigned long data;
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %%g0\n\t"
33962306a36Sopenharmony_ci			     "ldxa	[%1] %2, %0"
34062306a36Sopenharmony_ci			     : "=r" (data)
34162306a36Sopenharmony_ci			     : "r" ((2 << 16) | (entry << 3)),
34262306a36Sopenharmony_ci                               "i" (ASI_ITLB_DATA_ACCESS));
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	return data;
34562306a36Sopenharmony_ci}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_cistatic inline unsigned long cheetah_get_itlb_tag(int entry)
34862306a36Sopenharmony_ci{
34962306a36Sopenharmony_ci	unsigned long tag;
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	__asm__ __volatile__("ldxa	[%1] %2, %0"
35262306a36Sopenharmony_ci			     : "=r" (tag)
35362306a36Sopenharmony_ci			     : "r" ((2 << 16) | (entry << 3)), "i" (ASI_ITLB_TAG_READ));
35462306a36Sopenharmony_ci	return tag;
35562306a36Sopenharmony_ci}
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_cistatic inline void cheetah_put_itlb_data(int entry, unsigned long data)
35862306a36Sopenharmony_ci{
35962306a36Sopenharmony_ci	__asm__ __volatile__("stxa	%0, [%1] %2\n\t"
36062306a36Sopenharmony_ci			     "membar	#Sync"
36162306a36Sopenharmony_ci			     : /* No outputs */
36262306a36Sopenharmony_ci			     : "r" (data), "r" ((2 << 16) | (entry << 3)),
36362306a36Sopenharmony_ci			       "i" (ASI_ITLB_DATA_ACCESS));
36462306a36Sopenharmony_ci}
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci#endif /* !(__ASSEMBLY__) */
36762306a36Sopenharmony_ci#endif /* CONFIG_SPARC64 */
36862306a36Sopenharmony_ci#endif /* !(_SPARC64_SPITFIRE_H) */
369