1
0
Files
2022-09-29 17:59:04 +03:00

329 lines
8.9 KiB
C

/**************************************************************************
* *
* Copyright (C) 1994 Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
#ident "$Revision: 1.35 $"
#ifndef _HUB_H_
#define _HUB_H_
#include <sys/SN/agent.h>
#if defined(_LANGUAGE_C)
#include <sys/SN/slotnum.h>
#endif
#include <sys/SN/SN0/ip27config.h>
#include <rtc.h>
#define HUB_FLAG_GMASTER IIO_SCRATCH_BIT0_0
#define HUB_FLAG_IO_DISABLE IIO_SCRATCH_BIT0_1
#define HUB_FLAG_HAVE_IOC3 IIO_SCRATCH_BIT0_2
#define HUB_FLAG_HAVE_ELSC IIO_SCRATCH_BIT0_3
#define HUB_FLAG_ALIVE_A IIO_SCRATCH_BIT0_4
#define HUB_FLAG_ALIVE_B IIO_SCRATCH_BIT0_5
#define HUB_FLAG_DISPLAY_TAKEN IIO_SCRATCH_BIT0_6
#define HUB_FLAG_PMASTER IIO_SCRATCH_BIT0_7
#ifdef _LANGUAGE_C
#define HUB_FLAG_SET(flag, state) \
SD(LOCAL_HUB(IIO_SCRATCH_REG0), (state) ? \
LD(LOCAL_HUB(IIO_SCRATCH_REG0)) | (flag) : \
LD(LOCAL_HUB(IIO_SCRATCH_REG0)) & ~(flag))
#define HUB_FLAG_GET(flag) \
((LD(LOCAL_HUB(IIO_SCRATCH_REG0)) & (flag)) != 0)
#endif /* _LANGUAGE_C */
#define HUB_LOCK_PRINT 10
#define HUB_LOCK_FPROM 12
#define HUB_LOCK_I2C 15
#define HUB_LOCK_JUNKUART 16
#define HUB_LOCK_IOC3UART 17
#define HUB_LOCK_NIC 18
#if _LANGUAGE_ASSEMBLY
#define HUB_CPU_GET() \
dli v0, LOCAL_HUB(0); \
ld v0, PI_CPU_NUM(v0);
/*
* The following is used in entry.s and only uses k0 and k1.
*/
#define HUB_LED_SET(leds) \
dli k1, IP27CONFIG_SN00_ADDR; \
lw k1, (k1); \
dli k0, LOCAL_HUB(PI_CPU_NUM); \
bnez k1, 98f; \
nop; \
ld k1, (k0); \
dli k0, LOCAL_HUB(MD_LED0); \
b 99f; \
dsll k1, 3; \
98: /* Sn00 LED code */ \
ld k1, (k0); \
dli k0, LOCAL_HUB(MD_UREG1_0); \
dsll k1, 5; \
99: daddu k0, k1; \
or k1, zero, leds; \
sd k1, (k0)
#define HUB_LED_SET_REMOTE(nasid, cpu, leds) \
dli k0, IP27CONFIG_SN00_ADDR_NODE(0); \
or k1, zero, nasid; \
dsll k1, NASID_SHFT; \
daddu k0, k1; \
lw k0, (k0); \
bnez k0, 98f; \
nop; \
dli k0, REMOTE_HUB(0, MD_LED0); \
daddu k0, k1; \
or k1, zero, cpu; \
b 99f; \
dsll k1, 3; \
98: /* Sn00 LED code */ \
dli k0, REMOTE_HUB(0, MD_UREG1_4); \
daddu k0, k1; \
or k1, zero, cpu; \
dsll k1, 5; \
99: daddu k0, k1; \
or k1, zero, leds; \
sd k1, (k0)
#define HUB_LED_FLASH(leds) \
or s0, zero, leds; \
99: HUB_LED_SET(s0); \
li a0, 500000; \
jal rtc_sleep; \
nop; \
HUB_LED_SET(0); \
li a0, 500000; \
jal rtc_sleep; \
nop; \
b 99b; \
nop
#define HUB_LED_PAUSE(leds) \
HUB_LED_SET(leds); \
dli a0, 1000000; \
jal rtc_sleep; \
nop
#define HUB_TRIGGER() \
dli v0, LOCAL_HUB(PI_CPU_NUM); \
dli v1, 0x11111111; \
sd v1, (v0) /* For logic analyzer */
#endif /* _LANGUAGE_ASSEMBLY */
#if _LANGUAGE_C
int hub_cpu_get(void);
int hub_kego(void); /* Returns TRUE if KEGO */
void hub_halt(void);
void hub_halt_remote(nasid_t nasid, int cpu);
int hub_num_local_cpus(void);
int hub_local_master(void);
int hub_local_slave(void);
#define hub_global_master_set(gmaster) \
HUB_FLAG_SET(HUB_FLAG_GMASTER, (gmaster))
#define hub_global_master() \
(hub_local_master() && HUB_FLAG_GET(HUB_FLAG_GMASTER))
#define hub_partition_master_set(pmaster) \
HUB_FLAG_SET(HUB_FLAG_PMASTER, (pmaster))
#define hub_partition_master() \
((get_BSR() & BSR_PART) ? (hub_local_master() && \
HUB_FLAG_GET(HUB_FLAG_PMASTER)) : (hub_global_master()))
#define hub_alive_set(cpu, alive) \
HUB_FLAG_SET((cpu) ? HUB_FLAG_ALIVE_B : \
HUB_FLAG_ALIVE_A, (alive))
#define hub_alive(cpu) \
HUB_FLAG_GET((cpu) ? HUB_FLAG_ALIVE_B : \
HUB_FLAG_ALIVE_A)
#define hub_io_disable_set(io_disable) \
HUB_FLAG_SET(HUB_FLAG_IO_DISABLE, (io_disable))
#define hub_io_disable() \
HUB_FLAG_GET(HUB_FLAG_IO_DISABLE)
#define hub_have_ioc3_set(have_ioc3) \
HUB_FLAG_SET(HUB_FLAG_HAVE_IOC3, (have_ioc3))
#define hub_have_ioc3() \
HUB_FLAG_GET(HUB_FLAG_HAVE_IOC3)
#define hub_have_elsc_set(have_elsc) \
HUB_FLAG_SET(HUB_FLAG_HAVE_ELSC, (have_elsc))
#define hub_have_elsc() \
HUB_FLAG_GET(HUB_FLAG_HAVE_ELSC)
#define hub_set_display_taken() \
HUB_FLAG_SET(HUB_FLAG_DISPLAY_TAKEN,1)
#define hub_display_taken() \
HUB_FLAG_GET(HUB_FLAG_DISPLAY_TAKEN)
#define hub_reset_fence_set(nasid) \
REMOTE_HUB_S(nasid, NI_PROTECTION, 0)
#define hub_reset_fence_clear(nasid) \
REMOTE_HUB_S(nasid, NI_PROTECTION, 1)
void hub_display_digits(int slot, __uint64_t val);
void hub_led_elsc_set(__uint64_t val);
void hub_led_set(__uint64_t leds);
void hub_led_set_remote(nasid_t nasid, int cpu, __uint64_t leds);
void hub_led_show(__uint64_t leds);
void hub_led_flash(__uint64_t leds);
void hub_led_pause(__uint64_t leds);
#define hub_trigger() \
SD(LOCAL_HUB(PI_CPU_NUM), 0x11111111) /* For logic analyzer */
#endif /* _LANGUAGE_C */
#if _LANGUAGE_ASSEMBLY
/*
* Defines: HUB_INT_SET : Sets INT_PEND0/1 bit 'intnum'
* HUB_INT_SET_REMOTE : Sets INT_PEND0/1 bit 'intnum' in remote hub
* HUB_INT_CLEAR : Clears INT_PEND0/1 bit 'intnum'
* HUB_INT_CLEAR_REMOTE: Clears INT_PEND0/1 bit 'intnum' in remote hub
* HUB_INT_TEST : Sets v0 to value of INT_PEND0/1 bit 'intnum'
* HUB_INT_TEST_REMOTE : Like HUB_INT_TEST but for remote node
*
* Parameters: intnum must be a register or constant in the range 0 to 122.
* intnum0 must be a register or constant in the range 0 to 63.
* Destroys: v0-v1
*/
#define HUB_INT_SET(intnum) \
or v0, zero, intnum; \
or v0, 0x100; \
dli v1, LOCAL_HUB(0); \
sd v0, PI_INT_PEND_MOD(v1)
#define HUB_INT_SET_REMOTE(nasid, intnum) \
or v0, zero, intnum; \
or v0, 0x100; \
or v1, zero, nasid; \
dsll v1, NASID_SHFT; \
daddu v1, IO_BASE + (1 << SWIN_SIZE_BITS) + 0x800000; \
sd v0, PI_INT_PEND_MOD(v1)
#define HUB_INT_CLEAR(intnum) \
or v0, zero, intnum; \
dli v1, LOCAL_HUB(0); \
sd v0, PI_INT_PEND_MOD(v1)
#define HUB_INT_CLEAR_REMOTE(nasid, intnum) \
or v0, zero, intnum; \
or v1, zero, nasid; \
dsll v1, NASID_SHFT; \
daddu v1, IO_BASE + (1 << SWIN_SIZE_BITS) + 0x800000; \
sd v0, PI_INT_PEND_MOD(v1)
#define HUB_INT_TEST(intnum) \
dli v0, LOCAL_HUB(0); \
or v1, zero, intnum; \
bge v1, 64, 91f; \
nop; \
b 92f; \
ld v0, PI_INT_PEND0(v0); \
91: ld v0, PI_INT_PEND1(v0); \
sub v1, 64; \
92: dsrl v0, v1; \
and v0, 1
#define HUB_INT_TEST_REMOTE(nasid, intnum) \
or v1, zero, intnum; \
or v0, zero, nasid; \
dsll v0, NASID_SHFT; \
daddu v0, IO_BASE + (1 << SWIN_SIZE_BITS) + 0x800000; \
bge v1, 64, 91f; \
nop; \
b 92f; \
ld v0, PI_INT_PEND0(v0); \
91: ld v0, PI_INT_PEND1(v0); \
sub v1, 64; \
92: dsrl v0, v1; \
and v0, 1
#endif /* _LANGUAGE_ASSEMBLY */
#if _LANGUAGE_C
#define hub_int_set(intnum) \
SD(LOCAL_HUB(PI_INT_PEND_MOD), 0x100 | (intnum))
#define hub_int_set_remote(nasid, intnum) \
SD(REMOTE_HUB(nasid, PI_INT_PEND_MOD), 0x100 | (intnum))
#define hub_int_clear(intnum) \
SD(LOCAL_HUB(PI_INT_PEND_MOD), (intnum))
#define hub_int_clear_remote(nasid, intnum) \
SD(REMOTE_HUB(nasid, PI_INT_PEND_MOD), (intnum))
#define hub_int_test(intnum) \
((intnum) < 64 ? \
LD(LOCAL_HUB(PI_INT_PEND0)) >> (intnum) & 1 : \
LD(LOCAL_HUB(PI_INT_PEND1)) >> (intnum) - 64 & 1)
#define hub_int_test_remote(nasid, intnum) \
((intnum) < 64 ? \
LD(REMOTE_HUB(nasid, PI_INT_PEND0)) >> (intnum) & 1 : \
LD(REMOTE_HUB(nasid, PI_INT_PEND1)) >> (intnum) - 64 & 1)
void hub_int_set_all(__uint64_t mask1, __uint64_t mask0);
void hub_int_get_all(__uint64_t *mask1, __uint64_t *mask0);
void hub_int_mask_out(int intnum);
void hub_int_mask_in(int intnum);
void hub_int_set_mask(__uint64_t mask1, __uint64_t mask0);
void hub_int_get_mask(__uint64_t *mask1, __uint64_t *mask0);
int hub_int_diag(void);
int intrpt_diag(int diag_mode);
#endif /* _LANGUAGE_C */
#if _LANGUAGE_C
#ifdef RTL
#define HUB_REGS_PI 0x01
#define HUB_REGS_MD 0x02
#define HUB_REGS_NI 0x04
#define HUB_REGS_II 0x08
#define HUB_REGS_CORE 0x10
#define HUB_REGS_ALL 0xff
void hub_init_regs(int mask);
void hub_access_regs(int mask);
#endif
void hub_barrier(void);
int hub_lock_timeout(int level, rtc_time_t timeout);
void hub_lock(int level);
void hub_unlock(int level);
int hub_nic_get(nasid_t nasid, int verbose, __uint64_t *nicp);
#endif /* _LANGUAGE_C */
#endif /*_HUB_H_ */