diff options
Diffstat (limited to 'usr/src/uts/sun4u/starfire/sys/cpu_sgn.h')
| -rw-r--r-- | usr/src/uts/sun4u/starfire/sys/cpu_sgn.h | 354 |
1 files changed, 0 insertions, 354 deletions
diff --git a/usr/src/uts/sun4u/starfire/sys/cpu_sgn.h b/usr/src/uts/sun4u/starfire/sys/cpu_sgn.h deleted file mode 100644 index 8c14d34f3b..0000000000 --- a/usr/src/uts/sun4u/starfire/sys/cpu_sgn.h +++ /dev/null @@ -1,354 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright (c) 2000 by Sun Microsystems, Inc. - * All rights reserved. - */ - -#ifndef _CPU_SGN_H -#define _CPU_SGN_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ASM -#include <sys/types.h> -#include <sys/cpuvar.h> -#endif /* _ASM */ - -/* - * BBSRAM virtual address - 64 bits max. - */ -typedef uint64_t vaddr_t; - -/* - * Special type for BBSRAM offsets (rather than pointers). - * This must be a 32 bit value - */ -typedef uint32_t bboff_t; - -/* - * As long as each component of the revision is less than - * 256, this trick will work. So we check for that and generate a - * syntax error if the SID is out of range. - */ -#define SIGB_MBOX_SIZE 64 -/* reserved space - rounds size of sigblock_t to 512 */ -#define SIGB_RESV 16 - -#define BASE_ADDR_T_OFFSET 0xFE0 /* BBSRAM base_addr_t offset */ - -#define CVC_OUT_SIZ 1024 /* cvc output buffer size */ -#define CVC_IN_SIZ 256 /* cvc input buffer size */ - -/* make sure the assembler doesn't see the C code */ -#ifndef _ASM - -/* - * The reserved hardware interrupt 7F is used as a pointer structure - * to the two processors' signature blocks in bbsram. Each trap entry - * is 32 bytes, so this structure is always present at bbsram offset - * 0xFE0. - * Over time, we may discover other items that need pointers, that don't - * logically fit in the sigblocks themselves. This structure declares - * the global use of these 8 words. - * The spare_x words are reserved in case a design change calls for - * using 64-bit virtual addresses instead of offsets. This is - * considered unlikely. - * - * The offsets and this structure are normally created by POST when it - * initially creates the sigblocks. Subsequent programs may move the - * sigblocks in bbsram as they see fit, as long as this structure is changed - * to reflect the new location. - */ - -typedef struct { - bboff_t sigblk_offset_0; /* BBSRAM sig block 0 offset */ - uint32_t spare_0; /* spare word just in case */ - bboff_t sigblk_offset_1; /* BBSRAM sig block 1 offset */ - uint32_t spare_1; /* another just in case */ - uint32_t pad[4]; /* trap is 8 32-bit words long */ -} base_addr_t; - - -/* - * The following are used in the flag field of the mailbox structure. - * They are used to synchronize access with the mailbox between the - * SSP and Host, and indicate direction of the given message. - */ -#define SIGB_MBOX_EMPTY 0 -#define SIGB_MBOX_BUSY 1 -#define HOST_TO_CBS 2 -#define CBS_TO_HOST 3 - -/* for sigblk polling */ -#define SIGB_INTR_OFF 0x00 -#define SIGB_INTR_SEND 0xFF - -typedef short mboxflag_t; - -/* - * BE CAREFUL with modifications. To optimize transfers on the - * bootbus between the kernel and mailbox, try to make sure the data - * field falls on a 16 byte boundary. - */ -typedef struct { -/* 0 */ short intr; -/* 2 */ mboxflag_t flag; -/* 4 */ int32_t len; -/* 8 */ uint32_t cmd; -/* c */ char data[SIGB_MBOX_SIZE]; -} sigbmbox_t; /* sizeof = 76 (0x4c) = 19X */ - -typedef struct { - uchar_t cvc_output_buf[CVC_OUT_SIZ]; - uchar_t cvc_input_buf[CVC_IN_SIZ]; - uchar_t cvc_obp_input_flag; /* !=0 -> OBP wants CVC input */ -} sigb_cvc_t; - -/* - * Every CPU signature, state, or substate transition is captured - * in the ring buffer. OS or OBP will be the writer of the ring buffer - * and control board executive (via JTAG) will be the sole reader. Because of - * space limitation in the BBSRAM, the ring buffer can only be 64 entries big. - * A ring buffer is necessary because of the speed difference between the - * reader and writer, and to prevent race condition. - * - * The ring buffer structure contains two pointers, one for reading and - * one for writing, and the buffer itself. The last 6 bits in each of the - * pointer identify an entry in the buffer. The read pointer represents - * the next entry the reader should read. The write pointer represents the - * next entry the writer is going to write. For the reader, the ring buffer - * contains un-read entries if the read and write pointers are different. - * - * In most situations, the reader should be able to keep up with the - * writer. However, in the case where the writer is transitioning - * rapidly, the reader may not be able to keep up and causes an overflow. - * When an overflow happens, instead of suspending the writer, the - * writer continues to write. - * - * The first transition that causes an overflow has 2 consequences - * because of this continuous write action: - * 1. The ring buffer is flushed, all previous transitions history are lost. - * - * Flushing the ring buffer is acceptable since the reader is not - * able to keep up with rapid transitions, it is better off to start - * from the current transition than trying to catch up. - * - * 2. The new transition is recorded in the ring buffer. However, bcecause of - * the way the write pointer is updated, both the read and write pointers - * will be identical which makes the reader thinks there is no transition to - * read. - * - * Even though the reader does not see the most current signature/state in the - * ring buffer, it can be found in the signature block data structure. - * The reader can do a read in the signature block to obtain the current - * signature/block if the read/write pointers indicate the buffer is empty. - * The problem will go away once the writer starts writing again. - * - * Initial condition: - * rd_ptr = 0 - * wr_ptr = 0 - * - * To write a signature into the ring buffer, the steps are: - * 1. write signature into ringbuf[wr_ptr] - * 2. increment wr_ptr by 1 modulo SIGB_RB_SIZ using RB_IDX_MASK - * - * Note: the writer always writes to the ring buffer and the signature - * field in the signature block data structure. - * - * To read a signature from the ring buffer, the steps are: - * 1. compare rd_ptr and wr_ptr - * 2. if they are not equal then - * read signature ringbuf[rd_ptr] - * increment rd_ptr by 1 modulo SIGB_RB_SIZ using RB_IDX_MASK - * save a copy of the signature locally - * return the signature - * 3. else - * read signature from the signature block data structure - * if signature is not the same as the last signature then - * return the signature - * - */ - -#define SIGB_RB_SIZ 64 /* ring buffer size */ -#define RB_IDX_MASK 0x3f /* mask to determine read/write index */ - -typedef struct { -/* 0 */ uchar_t rd_ptr; /* entry to read */ -/* 1 */ uchar_t wr_ptr; /* next entry to write */ -/* 4 */ sig_state_t ringbuf[SIGB_RB_SIZ]; -} sigb_ringbuf_t; /* sizeof = 260 (0x104) = 65X */ - -typedef struct cpu_sgnblk { -/* 0 */ uint32_t sigb_magic; /* SIGBLOCK_MAGIC */ -/* 4 */ uint32_t sigb_version; /* changes with each SID */ -/* 8 */ uint32_t sigb_flags; /* struct sigblock status */ -/* c */ uint32_t sigb_heartbeat; /* prog's heartbeat */ - -/* 10 */ uint32_t sigb_leds; /* Software LED */ -/* 14 */ sig_state_t sigb_signature; /* Current signature & state */ - - /* - * sigb_ringbuf captures the last SIGB_RB_SIZ signature/state - * transitions. - */ -/* 18 */ sigb_ringbuf_t sigb_ringbuf; - - /* - * sigb_host_mbox is intended for msgs targeted for the Host and - * follows the protocol: - * SSP -> [cmd] -> Host -> [resp] -> SSP. - */ -/* 11c */ sigbmbox_t sigb_host_mbox; - -/* 168 */ char sigb_idn[sizeof (sigbmbox_t)]; - -/* 1b4 */ bboff_t sigb_obp_mbox; /* OBP/DHLP mailbox. */ - -/* 1b8 */ bboff_t sigb_postconfig; /* config info from POST */ - -/* 1bc */ uint32_t sigb_post; /* POST opaque */ - -/* 1c0 */ bboff_t sigb_slavep; /* Slave startup block offset */ - -/* 1c4 */ bboff_t sigb_resetinfo_off; /* Resetinfo offset */ - -/* 1c8 */ bboff_t sigb_cvc_off; /* CVC offset */ - -/* 1cc */ bboff_t sigb_eeprom_off; /* EEPROM offset */ - -/* 1d0 */ vaddr_t sigb_wdog_reset_vec; /* Watchdog Reset Vector */ - -/* 1d8 */ vaddr_t sigb_xir_reset_vec; /* XIR Reset vector */ - -/* 1e0 */ vaddr_t sigb_sir_reset_vec; /* SIR Reset Vector */ - -/* 1e8 */ vaddr_t sigb_red_state_reset_vec; /* RED State Reset Vector */ - -/* 1f0 */ uchar_t sigb_resv_array[SIGB_RESV]; /* reserved space */ -} cpu_sgnblk_t; /* sizeof = 512 (0x200) = 128X */ - -#endif /* _ASM */ - -/* - * Mailbox commands. - * - * The commands are listed here so that they are in a central place - * for all users of the signature block mailbox. Want to be careful - * that some subsystems don't accidently use the same value for a - * command. For this reason we introduce a cookie for each subsystem. - */ - -#define SIGB_HANDLER_BUSY (-2) -#define SIGB_BAD_MBOX_CMD (-1) -#define SSP_CMD ('S' << 8) /* generic SSP */ -#define SSP_CMD_SUCCESS (SSP_CMD | 0x1) -#define SSP_GOTO_OBP (SSP_CMD | 0x2) -#define SSP_GOTO_PANIC (SSP_CMD | 0x3) -#define SSP_ENVIRON (SSP_CMD | 0x4) /* environmental intr */ - -#ifdef _KERNEL - -#ifdef _STARFIRE - -extern void juggle_sgnblk_poll(struct cpu *); -extern int sgnblk_poll_register(void (*)(processorid_t, cpu_sgnblk_t *)); -extern int sgnblk_poll_unregister(void (*)(processorid_t, cpu_sgnblk_t *)); -extern int sgnblk_poll_reference(void (*)(cpu_sgnblk_t *, void *), void *); -extern void sgnblk_poll_unreference(void (*)(cpu_sgnblk_t *, void *)); - -extern cpu_sgnblk_t *cpu_sgnblkp[NCPU]; - -/* - * Starfire specific signatures - */ -#define POST_SIG SIG_BLD('P', 'O') -#define DHLP_SIG SIG_BLD('D', 'H') - -/* - * Starfire specific Sigblock states. - */ -#define SIGBST_NONE 0 /* no state */ -#define SIGBST_RUN 1 /* running */ -#define SIGBST_EXIT 2 /* finished */ -#define SIGBST_PRERUN 3 /* pre-exec */ -#define SIGBST_ARBSTOP 4 /* transient arbstop state */ -#define SIGBST_RESET 5 /* reset */ -#define SIGBST_POWEROFF 6 /* no power */ -#define SIGBST_DETACHED 7 /* spinning in OBP after DR DETACH */ -#define SIGBST_CALLBACK 8 /* kernel calling back into OBP */ -#define SIGBST_WATCHDOG 9 /* OBP running after watchdog */ -#define SIGBST_WATCHDOG_SYNC 10 /* OBP "sync" after watchdog reset */ -#define SIGBST_OFFLINE 11 /* cpu offline */ -#define SIGBST_BOOTING 12 /* booting */ -#define SIGBST_UNKNOWN 13 /* unknown */ -#define SIGBST_XIR 14 /* OBP running after XIR */ -#define SIGBST_XIR_SYNC 15 /* OBP trying "sync" in XIR */ -#define SIGBST_SIR 16 /* OBP running after SIR */ -#define SIGBST_SIR_SYNC 17 /* OBP trying "sync" in SIR */ -#define SIGBST_REDMODE 18 /* OBP running after REDMODE */ -#define SIGBST_REDMODE_SYNC 19 /* OBP trying "sync" in REDMODE */ -#define SIGBST_QUIESCED 20 /* system quiesced */ -#define SIGBST_QUIESCE_INPROGRESS 21 /* system quiesce in-progress */ -#define SIGBST_RESUME_INPROGRESS 22 /* system resume in-progress */ - -/* - * Starfire specific Sigblock sub-states - */ -#define EXIT_NULL 0 -#define EXIT_HALT 1 -#define EXIT_ENVIRON 2 -#define EXIT_REBOOT 3 -#define EXIT_PANIC1 4 -#define EXIT_PANIC2 5 -#define EXIT_HUNG 6 -#define EXIT_WATCH 7 -#define EXIT_PANIC_REBOOT 8 -#define EXIT_WATCHDOG_REBOOT 9 -#define EXIT_SOFT_INIT_RESET 10 /* SIR */ -#define EXIT_EXTERN_INIT_RESET 11 /* XIR */ -#define EXIT_REDMODE_REBOOT 12 /* REDMODE */ -#define EXIT_OBP_RESET 13 /* OBP RESET */ - -#else - -#define REGISTER_BBUS_INTR() -#define CPU_SGN_MAPIN(cpuid) -#define CPU_SGN_MAPOUT(cpuid) -#define CPU_SGN_EXISTS(cpuid) (0) -#define SGN_CPU_IS_OS(cpuid) (0) -#define SGN_CPU_IS_OBP(cpuid) (0) -#define SGN_CPU_STATE_IS_DETACHED(cpuid) (0) - -#endif /* _STARFIRE */ - -#endif /* _KERNEL */ - -#ifdef __cplusplus -} -#endif - -#endif /* _CPU_SGN_H */ |
