162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * obio.h: Some useful locations in 0xFXXXXXXXX PA obio space on sun4d. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1997 Jakub Jelinek <jj@sunsite.mff.cuni.cz> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _SPARC_OBIO_H 962306a36Sopenharmony_ci#define _SPARC_OBIO_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/asi.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* This weird monster likes to use the very upper parts of 1462306a36Sopenharmony_ci 36bit PA for these things :) */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* CSR space (for each XDBUS) 1762306a36Sopenharmony_ci * ------------------------------------------------------------------------ 1862306a36Sopenharmony_ci * | 0xFE | DEVID | | XDBUS ID | | 1962306a36Sopenharmony_ci * ------------------------------------------------------------------------ 2062306a36Sopenharmony_ci * 35 28 27 20 19 10 9 8 7 0 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define CSR_BASE_ADDR 0xe0000000 2462306a36Sopenharmony_ci#define CSR_CPU_SHIFT (32 - 4 - 5) 2562306a36Sopenharmony_ci#define CSR_XDBUS_SHIFT 8 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define CSR_BASE(cpu) (((CSR_BASE_ADDR >> CSR_CPU_SHIFT) + cpu) << CSR_CPU_SHIFT) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* ECSR space (not for each XDBUS) 3062306a36Sopenharmony_ci * ------------------------------------------------------------------------ 3162306a36Sopenharmony_ci * | 0xF | DEVID[7:1] | | 3262306a36Sopenharmony_ci * ------------------------------------------------------------------------ 3362306a36Sopenharmony_ci * 35 32 31 25 24 0 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define ECSR_BASE_ADDR 0x00000000 3762306a36Sopenharmony_ci#define ECSR_CPU_SHIFT (32 - 5) 3862306a36Sopenharmony_ci#define ECSR_DEV_SHIFT (32 - 8) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define ECSR_BASE(cpu) ((cpu) << ECSR_CPU_SHIFT) 4162306a36Sopenharmony_ci#define ECSR_DEV_BASE(devid) ((devid) << ECSR_DEV_SHIFT) 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* Bus Watcher */ 4462306a36Sopenharmony_ci#define BW_LOCAL_BASE 0xfff00000 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define BW_CID 0x00000000 4762306a36Sopenharmony_ci#define BW_DBUS_CTRL 0x00000008 4862306a36Sopenharmony_ci#define BW_DBUS_DATA 0x00000010 4962306a36Sopenharmony_ci#define BW_CTRL 0x00001000 5062306a36Sopenharmony_ci#define BW_INTR_TABLE 0x00001040 5162306a36Sopenharmony_ci#define BW_INTR_TABLE_CLEAR 0x00001080 5262306a36Sopenharmony_ci#define BW_PRESCALER 0x000010c0 5362306a36Sopenharmony_ci#define BW_PTIMER_LIMIT 0x00002000 5462306a36Sopenharmony_ci#define BW_PTIMER_COUNTER2 0x00002004 5562306a36Sopenharmony_ci#define BW_PTIMER_NDLIMIT 0x00002008 5662306a36Sopenharmony_ci#define BW_PTIMER_CTRL 0x0000200c 5762306a36Sopenharmony_ci#define BW_PTIMER_COUNTER 0x00002010 5862306a36Sopenharmony_ci#define BW_TIMER_LIMIT 0x00003000 5962306a36Sopenharmony_ci#define BW_TIMER_COUNTER2 0x00003004 6062306a36Sopenharmony_ci#define BW_TIMER_NDLIMIT 0x00003008 6162306a36Sopenharmony_ci#define BW_TIMER_CTRL 0x0000300c 6262306a36Sopenharmony_ci#define BW_TIMER_COUNTER 0x00003010 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* BW Control */ 6562306a36Sopenharmony_ci#define BW_CTRL_USER_TIMER 0x00000004 /* Is User Timer Free run enabled */ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/* Boot Bus */ 6862306a36Sopenharmony_ci#define BB_LOCAL_BASE 0xf0000000 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define BB_STAT1 0x00100000 7162306a36Sopenharmony_ci#define BB_STAT2 0x00120000 7262306a36Sopenharmony_ci#define BB_STAT3 0x00140000 7362306a36Sopenharmony_ci#define BB_LEDS 0x002e0000 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* Bits in BB_STAT2 */ 7662306a36Sopenharmony_ci#define BB_STAT2_AC_INTR 0x04 /* Aiee! 5ms and power is gone... */ 7762306a36Sopenharmony_ci#define BB_STAT2_TMP_INTR 0x10 /* My Penguins are burning. Are you able to smell it? */ 7862306a36Sopenharmony_ci#define BB_STAT2_FAN_INTR 0x20 /* My fan refuses to work */ 7962306a36Sopenharmony_ci#define BB_STAT2_PWR_INTR 0x40 /* On SC2000, one of the two ACs died. Ok, we go on... */ 8062306a36Sopenharmony_ci#define BB_STAT2_MASK (BB_STAT2_AC_INTR|BB_STAT2_TMP_INTR|BB_STAT2_FAN_INTR|BB_STAT2_PWR_INTR) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* Cache Controller */ 8362306a36Sopenharmony_ci#define CC_BASE 0x1F00000 8462306a36Sopenharmony_ci#define CC_DATSTREAM 0x1F00000 /* Data stream register */ 8562306a36Sopenharmony_ci#define CC_DATSIZE 0x1F0003F /* Size */ 8662306a36Sopenharmony_ci#define CC_SRCSTREAM 0x1F00100 /* Source stream register */ 8762306a36Sopenharmony_ci#define CC_DESSTREAM 0x1F00200 /* Destination stream register */ 8862306a36Sopenharmony_ci#define CC_RMCOUNT 0x1F00300 /* Count of references and misses */ 8962306a36Sopenharmony_ci#define CC_IPEN 0x1F00406 /* Pending Interrupts */ 9062306a36Sopenharmony_ci#define CC_IMSK 0x1F00506 /* Interrupt Mask */ 9162306a36Sopenharmony_ci#define CC_ICLR 0x1F00606 /* Clear pending Interrupts */ 9262306a36Sopenharmony_ci#define CC_IGEN 0x1F00704 /* Generate Interrupt register */ 9362306a36Sopenharmony_ci#define CC_STEST 0x1F00804 /* Internal self-test */ 9462306a36Sopenharmony_ci#define CC_CREG 0x1F00A04 /* Control register */ 9562306a36Sopenharmony_ci#define CC_SREG 0x1F00B00 /* Status register */ 9662306a36Sopenharmony_ci#define CC_RREG 0x1F00C04 /* Reset register */ 9762306a36Sopenharmony_ci#define CC_EREG 0x1F00E00 /* Error code register */ 9862306a36Sopenharmony_ci#define CC_CID 0x1F00F04 /* Component ID */ 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic inline int bw_get_intr_mask(int sbus_level) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci int mask; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci __asm__ __volatile__ ("lduha [%1] %2, %0" : 10762306a36Sopenharmony_ci "=r" (mask) : 10862306a36Sopenharmony_ci "r" (BW_LOCAL_BASE + BW_INTR_TABLE + (sbus_level << 3)), 10962306a36Sopenharmony_ci "i" (ASI_M_CTL)); 11062306a36Sopenharmony_ci return mask; 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic inline void bw_clear_intr_mask(int sbus_level, int mask) 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci __asm__ __volatile__ ("stha %0, [%1] %2" : : 11662306a36Sopenharmony_ci "r" (mask), 11762306a36Sopenharmony_ci "r" (BW_LOCAL_BASE + BW_INTR_TABLE_CLEAR + (sbus_level << 3)), 11862306a36Sopenharmony_ci "i" (ASI_M_CTL)); 11962306a36Sopenharmony_ci} 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistatic inline unsigned int bw_get_prof_limit(int cpu) 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci unsigned int limit; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci __asm__ __volatile__ ("lda [%1] %2, %0" : 12662306a36Sopenharmony_ci "=r" (limit) : 12762306a36Sopenharmony_ci "r" (CSR_BASE(cpu) + BW_PTIMER_LIMIT), 12862306a36Sopenharmony_ci "i" (ASI_M_CTL)); 12962306a36Sopenharmony_ci return limit; 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic inline void bw_set_prof_limit(int cpu, unsigned int limit) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci __asm__ __volatile__ ("sta %0, [%1] %2" : : 13562306a36Sopenharmony_ci "r" (limit), 13662306a36Sopenharmony_ci "r" (CSR_BASE(cpu) + BW_PTIMER_LIMIT), 13762306a36Sopenharmony_ci "i" (ASI_M_CTL)); 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic inline unsigned int bw_get_ctrl(int cpu) 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci unsigned int ctrl; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci __asm__ __volatile__ ("lda [%1] %2, %0" : 14562306a36Sopenharmony_ci "=r" (ctrl) : 14662306a36Sopenharmony_ci "r" (CSR_BASE(cpu) + BW_CTRL), 14762306a36Sopenharmony_ci "i" (ASI_M_CTL)); 14862306a36Sopenharmony_ci return ctrl; 14962306a36Sopenharmony_ci} 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic inline void bw_set_ctrl(int cpu, unsigned int ctrl) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci __asm__ __volatile__ ("sta %0, [%1] %2" : : 15462306a36Sopenharmony_ci "r" (ctrl), 15562306a36Sopenharmony_ci "r" (CSR_BASE(cpu) + BW_CTRL), 15662306a36Sopenharmony_ci "i" (ASI_M_CTL)); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic inline unsigned int cc_get_ipen(void) 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci unsigned int pending; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci __asm__ __volatile__ ("lduha [%1] %2, %0" : 16462306a36Sopenharmony_ci "=r" (pending) : 16562306a36Sopenharmony_ci "r" (CC_IPEN), 16662306a36Sopenharmony_ci "i" (ASI_M_MXCC)); 16762306a36Sopenharmony_ci return pending; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic inline void cc_set_iclr(unsigned int clear) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci __asm__ __volatile__ ("stha %0, [%1] %2" : : 17362306a36Sopenharmony_ci "r" (clear), 17462306a36Sopenharmony_ci "r" (CC_ICLR), 17562306a36Sopenharmony_ci "i" (ASI_M_MXCC)); 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cistatic inline unsigned int cc_get_imsk(void) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci unsigned int mask; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci __asm__ __volatile__ ("lduha [%1] %2, %0" : 18362306a36Sopenharmony_ci "=r" (mask) : 18462306a36Sopenharmony_ci "r" (CC_IMSK), 18562306a36Sopenharmony_ci "i" (ASI_M_MXCC)); 18662306a36Sopenharmony_ci return mask; 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic inline void cc_set_imsk(unsigned int mask) 19062306a36Sopenharmony_ci{ 19162306a36Sopenharmony_ci __asm__ __volatile__ ("stha %0, [%1] %2" : : 19262306a36Sopenharmony_ci "r" (mask), 19362306a36Sopenharmony_ci "r" (CC_IMSK), 19462306a36Sopenharmony_ci "i" (ASI_M_MXCC)); 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic inline unsigned int cc_get_imsk_other(int cpuid) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci unsigned int mask; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci __asm__ __volatile__ ("lduha [%1] %2, %0" : 20262306a36Sopenharmony_ci "=r" (mask) : 20362306a36Sopenharmony_ci "r" (ECSR_BASE(cpuid) | CC_IMSK), 20462306a36Sopenharmony_ci "i" (ASI_M_CTL)); 20562306a36Sopenharmony_ci return mask; 20662306a36Sopenharmony_ci} 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cistatic inline void cc_set_imsk_other(int cpuid, unsigned int mask) 20962306a36Sopenharmony_ci{ 21062306a36Sopenharmony_ci __asm__ __volatile__ ("stha %0, [%1] %2" : : 21162306a36Sopenharmony_ci "r" (mask), 21262306a36Sopenharmony_ci "r" (ECSR_BASE(cpuid) | CC_IMSK), 21362306a36Sopenharmony_ci "i" (ASI_M_CTL)); 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic inline void cc_set_igen(unsigned int gen) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci __asm__ __volatile__ ("sta %0, [%1] %2" : : 21962306a36Sopenharmony_ci "r" (gen), 22062306a36Sopenharmony_ci "r" (CC_IGEN), 22162306a36Sopenharmony_ci "i" (ASI_M_MXCC)); 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci#endif /* !(_SPARC_OBIO_H) */ 227