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