diff options
Diffstat (limited to 'usr/src/uts/sun4u/sys/sbdpriv.h')
| -rw-r--r-- | usr/src/uts/sun4u/sys/sbdpriv.h | 753 |
1 files changed, 753 insertions, 0 deletions
diff --git a/usr/src/uts/sun4u/sys/sbdpriv.h b/usr/src/uts/sun4u/sys/sbdpriv.h new file mode 100644 index 0000000000..4f15ebb8c7 --- /dev/null +++ b/usr/src/uts/sun4u/sys/sbdpriv.h @@ -0,0 +1,753 @@ +/* + * 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 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _SYS_SBDPRIV_H +#define _SYS_SBDPRIV_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/processor.h> +#include <sys/obpdefs.h> +#include <sys/memlist.h> +#include <sys/sbd_ioctl.h> +#include <sys/mem_config.h> +#include <sys/sbd.h> +#ifdef DEBUG +#include <sys/promif.h> +#endif + + +/* + * This structure passes the information when the caller requests to + * reserve a portion of unconfigured memory. It is also used to release + * previously reserved memory + */ +struct sbd_mres { + uint64_t new_base_pa; /* new base addr for physintalled */ + uint64_t reserved_pa; /* addr of the reserved mem */ + uint64_t size; /* size of the reserved chunk. */ +}; + +int sbd_memory_reserve(dev_info_t *, uint64_t, struct sbd_mres *); +int sbd_memory_release(dev_info_t *, uint64_t, struct sbd_mres *); + +/* This error type is used inside sbd only */ +typedef struct { + int e_errno; + int e_code; + char e_rsc[MAXPATHLEN]; +} sbderror_t; + +#include <sys/sbd.h> +#include <sys/sbd_error.h> + +typedef enum { + SBD_STATE_EMPTY = 0, + SBD_STATE_OCCUPIED, + SBD_STATE_CONNECTED, + SBD_STATE_UNCONFIGURED, + SBD_STATE_PARTIAL, + SBD_STATE_CONFIGURED, + SBD_STATE_RELEASE, + SBD_STATE_UNREFERENCED, + SBD_STATE_FATAL, + SBD_STATE_MAX +} sbd_istate_t; + +typedef struct { + sbderror_t *errp; + sbd_flags_t flags; +} sbd_treeinfo_t; + +/* + * generic flags (sbd_handle.h_flags) + */ +#define SBD_FLAG_DEVI_FORCE 0x00000001 + +/* mirror of SBD_FLAG_FORCE from sbd_ioctl.h */ +#define SBD_IOCTL_FLAG_FORCE 0x00000004 + +#define SBD_USER_FLAG_MASK 0x0000ffff + +#define SBD_KERN_FLAG_MASK 0xffff0000 /* no flags in use */ + +/* + * Translation macros for sbd->sbdp flags + */ +#define SBD_2_SBDP_FLAGS(f) (((f) & SBD_IOCTL_FLAG_FORCE) ? \ + SBDP_IOCTL_FLAG_FORCE : 0) + +typedef struct sbd_handle { + void *h_sbd; + sbderror_t *h_err; + dev_t h_dev; /* dev_t of opened device */ + int h_cmd; /* ioctl argument */ + int h_mode; /* device open mode */ + sbd_flags_t h_flags; + sbd_ioctl_arg_t *h_iap; /* points to kernel copy of ioargs */ + sbdp_opts_t h_opts; /* points to the platform options */ +} sbd_handle_t; + +#define SBD_HD2ERR(hd) ((hd)->h_err) +#define SBD_GET_ERR(ep) ((ep)->e_code) +#define SBD_SET_ERR(ep, ec) ((ep)->e_code = (ec)) +#define SBD_GET_ERRNO(ep) ((ep)->e_errno) +#define SBD_SET_ERRNO(ep, en) ((ep)->e_errno = (en)) +#define SBD_GET_ERRSTR(ep) ((ep)->e_rsc) + +#define SBD_SET_ERRSTR(ep, es) \ +{ \ + if ((es) && (*(es) != '\0')) \ + (void) strncpy((ep)->e_rsc, (es), MAXPATHLEN); \ +} + +#define SBD_SET_IOCTL_ERR(ierr, code, rsc) \ +{ \ + (ierr)->e_code = (int)(code); \ + if ((rsc) && (*(rsc) != '\0')) \ + bcopy((caddr_t)(rsc), \ + (caddr_t)(ierr)->e_rsc, \ + sizeof ((ierr)->e_rsc)); \ +} + +#define SBD_FREE_ERR(ep) \ + ((ep)->e_rsc[0] = '\0') + +#define SBD_GET_PERR(spe, ep) \ + (ep)->e_errno = EIO; \ + (ep)->e_code = (spe)->e_code; \ + if (*((spe)->e_rsc) != '\0') \ + bcopy((caddr_t)((spe)->e_rsc), \ + (caddr_t)((ep))->e_rsc, \ + sizeof (((ep))->e_rsc)); + +/* + * dev_t is shared by PIM and PSM layers. + * + * Format = 31......16,15.......0 + * | PIM | PSM | + */ +#define _SBD_DEVPIM_SHIFT 16 +#define _SBD_DEVPIM_MASK 0xffff +#define _SBD_DEVPSM_MASK 0xffff + +#define SBD_GET_MINOR2INST(d) (((d) >> _SBD_DEVPIM_SHIFT) & _SBD_DEVPIM_MASK) +#define SBD_MAKE_MINOR(i, m) \ + ((((i) & _SBD_DEVPIM_MASK) << _SBD_DEVPIM_SHIFT) | \ + ((m) & _SBD_DEVPSM_MASK)) + +#define GETSTRUCT(t, n) \ + ((t *)kmem_zalloc((size_t)(n) * sizeof (t), KM_SLEEP)) +#define FREESTRUCT(p, t, n) \ + (kmem_free((caddr_t)(p), sizeof (t) * (size_t)(n))) + +#define GET_SOFTC(i) ddi_get_soft_state(sbd_g.softsp, (i)) +#define ALLOC_SOFTC(i) ddi_soft_state_zalloc(sbd_g.softsp, (i)) +#define FREE_SOFTC(i) ddi_soft_state_free(sbd_g.softsp, (i)) + +/* + * Per instance soft-state structure. + */ +typedef struct sbd_softstate { + void *sbd_boardlist; + int max_boards; + int wnode; +} sbd_softstate_t; + +/* + * dr Global data elements + */ +typedef struct { + sbd_softstate_t *softsp; /* pointer to initialize soft state */ +} sbd_global; + +typedef struct { + sbderror_t dv_error; + dev_info_t *dv_dip; +} sbd_devlist_t; + +extern int plat_max_io_units_per_board(); +extern int plat_max_cmp_units_per_board(); +extern int plat_max_cpu_units_per_board(); +extern int plat_max_mem_units_per_board(); +#define MAX_IO_UNITS_PER_BOARD plat_max_io_units_per_board() +#define MAX_CMP_UNITS_PER_BOARD plat_max_cmp_units_per_board() +#define MAX_CPU_UNITS_PER_BOARD plat_max_cpu_units_per_board() +#define MAX_MEM_UNITS_PER_BOARD plat_max_mem_units_per_board() +#define SBD_MAX_UNITS_PER_BOARD 8 +/* If any of the max units exceeds 5, this must be adjusted */ + +#define SBD_MAX_INSTANCES 16 + +#define SBD_NUM_STATES ((int)SBD_STATE_MAX) + +#ifdef DEBUG +#define SBD_DEVICE_TRANSITION(sb, nt, un, st) \ +{ \ + int _ostate, _nstate; \ + _ostate = (int)((sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state); \ + _nstate = (int)(st); \ + PR_STATE("BOARD %d (%s.%d) STATE: %s(%d) -> %s(%d)\n", \ + (sb)->sb_num, \ + sbd_ct_str[nt], (un), \ + sbd_state_str[_ostate], _ostate, \ + sbd_state_str[_nstate], _nstate); \ + (void) drv_getparm(TIME, \ + (void *)&(sb)->sb_dev[NIX(nt)][un].u_common.sbdev_time); \ + (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state = (st); \ + (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_ostate = ostate_cvt(st); \ + send_event = 1; \ +} +#define SBD_BOARD_TRANSITION(sb, st) \ +{ \ + PR_STATE("BOARD %d STATE: %s(%d) -> %s(%d)\n", \ + (sb)->sb_num, \ + sbd_state_str[(int)(sb)->sb_state], (int)(sb)->sb_state, \ + sbd_state_str[(int)(st)], (int)(st)); \ + (sb)->sb_pstate = (sb)->sb_state; \ + (sb)->sb_state = (st); \ + send_event = 1; \ +} +#else /* DEBUG */ +#define SBD_DEVICE_TRANSITION(sb, nt, un, st) \ +{ \ + (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state = (st); \ + (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_ostate = ostate_cvt(st); \ + (void) drv_getparm(TIME, \ + (void *)&(sb)->sb_dev[NIX(nt)][un].u_common.sbdev_time); \ + send_event = 1; \ +} +#define SBD_BOARD_TRANSITION(sb, st) \ + ((sb)->sb_pstate = (sb)->sb_state, (sb)->sb_state = (st), \ + send_event = 1) +#endif /* DEBUG */ + +#define SBD_DEVICE_STATE(sb, nt, un) \ + ((sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state) +#define SBD_BOARD_STATE(sb) \ + ((sb)->sb_state) +#define SBD_BOARD_PSTATE(sb) \ + ((sb)->sb_pstate) + +typedef uint32_t sbd_devset_t; + +/* + * sbd_priv_handle_t MUST appear first. + */ +typedef struct sbd_priv_handle { + sbd_handle_t sh_handle; + void *sh_arg; /* raw ioctl arg */ + sbd_devset_t sh_devset; /* based on h_dev */ + sbd_devset_t sh_orig_devset; /* what client requested */ + sbderror_t sh_err; + struct sbd_priv_handle *sh_next; +} sbd_priv_handle_t; + +#define SBD_MAXNUM_NT 3 +#define NIX(t) (((t) == SBD_COMP_CPU) ? 0 : \ + ((t) == SBD_COMP_MEM) ? 1 : \ + ((t) == SBD_COMP_IO) ? 2 : \ + ((t) == SBD_COMP_CMP) ? 0 : SBD_MAXNUM_NT) + +#define SBD_NUM_MC_PER_BOARD 4 + + +typedef struct sbd_common_unit { + sbd_istate_t sbdev_state; + sbd_cond_t sbdev_cond; + sbd_state_t sbdev_ostate; + time_t sbdev_time; + int sbdev_busy; + void *sbdev_sbp; + int sbdev_unum; + sbd_comp_type_t sbdev_type; + dev_info_t *sbdev_dip; +} sbd_common_unit_t; + +typedef struct sbd_mem_unit { + sbd_common_unit_t sbm_cm; + sbd_istate_t sbm_state; /* mem-unit state */ + uint_t sbm_flags; + pfn_t sbm_basepfn; + pgcnt_t sbm_npages; + pgcnt_t sbm_pageslost; + /* + * The following fields are used during + * the memory detach process only. sbm_mlist + * will be used to store the board memlist + * following a detach. The memlist will be + * used to re-attach the board when configuring + * the unit directly after an unconfigure. + */ + struct sbd_mem_unit *sbm_peer; + struct memlist *sbm_mlist; + struct memlist *sbm_del_mlist; + memhandle_t sbm_memhandle; + pfn_t sbm_alignment_mask; + pfn_t sbm_slice_offset; + /* + * The following field is used to support the + * representation of all memory controllers on + * a board with one sbd_mem_unit_t. + */ + dev_info_t *sbm_dip[SBD_NUM_MC_PER_BOARD]; + /* + * The following field determines if the memory on this board + * is part of an interleave across boards + */ + int sbm_interleave; +} sbd_mem_unit_t; + +/* + * Currently only maintain state information for individual + * components. + */ +typedef struct sbd_cpu_unit { + sbd_common_unit_t sbc_cm; /* cpu-unit state */ + processorid_t sbc_cpu_id; + cpu_flag_t sbc_cpu_flags; + ushort_t sbc_pad1; + int sbc_cpu_impl; + int sbc_speed; + int sbc_ecache; +} sbd_cpu_unit_t; + +typedef struct sbd_io_unit { + sbd_common_unit_t sbi_cm; /* io-unit state */ +} sbd_io_unit_t; + +typedef union { + sbd_common_unit_t u_common; + sbd_mem_unit_t _mu; + sbd_cpu_unit_t _cu; + sbd_io_unit_t _iu; +} sbd_dev_unit_t; + +typedef struct { + sbd_priv_handle_t *sb_handle; + int sb_ref; /* # of handle references */ + int sb_num; /* board number */ + void *sb_softsp; /* pointer to soft state */ + dev_info_t *sb_topdip; /* top devinfo of instance */ + sbd_istate_t sb_state; /* (current) board state */ + sbd_istate_t sb_pstate; /* previous board state */ + sbd_cond_t sb_cond; /* condition */ + sbd_state_t sb_rstate; /* receptacle state */ + sbd_state_t sb_ostate; /* occupant state */ + /* + * 0=CPU, 1=MEM, 2=IO, 3=NULL + */ + dev_info_t **sb_devlist[SBD_MAXNUM_NT + 1]; + + sbd_devset_t sb_dev_present; /* present mask */ + sbd_devset_t sb_dev_attached; /* attached mask */ + sbd_devset_t sb_dev_released; /* released mask */ + sbd_devset_t sb_dev_unreferenced; /* unreferenced mask */ + sbd_dev_unit_t *sb_dev[SBD_MAXNUM_NT]; + + char *sb_cpupath[SBD_MAX_UNITS_PER_BOARD]; + char *sb_mempath[SBD_MAX_UNITS_PER_BOARD]; + char *sb_iopath[SBD_MAX_UNITS_PER_BOARD]; + + int sb_ndev; /* number of devs */ + int sb_errno; /* store errno */ + int sb_busy; /* drain in progress */ + int sb_assigned; + int sb_flags; + kmutex_t sb_flags_mutex; /* mutex to protect flags */ + int sb_wnode; + int sb_memaccess_ok; + sbd_stat_t sb_stat; /* cached board status */ + processorid_t sb_cpuid; /* for starfire connect */ + time_t sb_time; /* time of last board op */ + kmutex_t sb_mutex; + kmutex_t sb_slock; /* status - unconfig, discon */ +} sbd_board_t; + +/* definitions for sb_flags */ +#define SBD_BOARD_STATUS_CACHED 1 + +#define SBD_GET_BOARD_MEMUNIT(sb, un) \ + (&((sb)->sb_dev[NIX(SBD_COMP_MEM)][un]._mu)) +#define SBD_GET_BOARD_CPUUNIT(sb, un) \ + (&((sb)->sb_dev[NIX(SBD_COMP_CPU)][un]._cu)) +#define SBD_GET_BOARD_IOUNIT(sb, un) \ + (&((sb)->sb_dev[NIX(SBD_COMP_IO)][un]._iu)) + +typedef ushort_t boardset_t; /* assumes 16 boards max */ + +#define BOARDSET(b) ((boardset_t)(1 << (b))) +#define BOARD_IN_SET(bs, b) (((bs) & BOARDSET(b)) != 0) +#define BOARD_ADD(bs, b) ((bs) |= BOARDSET(b)) +#define BOARD_DEL(bs, b) ((bs) &= ~BOARDSET(b)) + +/* + * Format of sbd_devset_t bit masks: + * + * 32 16 8 4 0 + * |....|....|...I|IIII|....|...M|CCCC|CCCC| + * 1 = indicates respective component present/attached. + * I = I/O, M = Memory, C = CPU. + */ +#define DEVSET_ANYUNIT (-1) +#define _NT2DEVPOS(t, u) ((NIX(t) << 3) + (u)) +#define _DEVSET_MASK 0x001f01ff +#define _CMP_DEVSET_MASK 0x11 +#define DEVSET(t, u) \ + (((u) == DEVSET_ANYUNIT) ? \ + (sbd_devset_t)((0xff << _NT2DEVPOS((t), 0)) & _DEVSET_MASK) : \ + (((t) == SBD_COMP_CMP) ? \ + (sbd_devset_t)(_CMP_DEVSET_MASK << _NT2DEVPOS((t), (u))) : \ + (sbd_devset_t)(1 << _NT2DEVPOS((t), (u))))) + +#define DEVSET_IN_SET(ds, t, u) (((ds) & DEVSET((t), (u))) != 0) +#define DEVSET_ADD(ds, t, u) ((ds) |= DEVSET((t), (u))) +#define DEVSET_DEL(ds, t, u) ((ds) &= ~DEVSET((t), (u))) +#define DEVSET_GET_UNITSET(ds, t) \ + (((ds) & DEVSET((t), DEVSET_ANYUNIT)) >> _NT2DEVPOS((t), 0)) +/* + * Ops for sbd_board_t.sb_dev_present + */ +#define SBD_DEV_IS_PRESENT(bp, nt, un) \ + DEVSET_IN_SET((bp)->sb_dev_present, (nt), (un)) +#define SBD_DEV_SET_PRESENT(bp, nt, un) \ + DEVSET_ADD((bp)->sb_dev_present, (nt), (un)) +#define SBD_DEV_CLR_PRESENT(bp, nt, un) \ + DEVSET_DEL((bp)->sb_dev_present, (nt), (un)) +/* + * Ops for sbd_board_t.sb_dev_attached + */ +#define SBD_DEV_IS_ATTACHED(bp, nt, un) \ + DEVSET_IN_SET((bp)->sb_dev_attached, (nt), (un)) +#define SBD_DEV_SET_ATTACHED(bp, nt, un) \ + DEVSET_ADD((bp)->sb_dev_attached, (nt), (un)) +#define SBD_DEV_CLR_ATTACHED(bp, nt, un) \ + DEVSET_DEL((bp)->sb_dev_attached, (nt), (un)) +/* + * Ops for sbd_board_t.sb_dev_released + */ +#define SBD_DEV_IS_RELEASED(bp, nt, un) \ + DEVSET_IN_SET((bp)->sb_dev_released, (nt), (un)) +#define SBD_DEV_SET_RELEASED(bp, nt, un) \ + DEVSET_ADD((bp)->sb_dev_released, (nt), (un)) +#define SBD_DEV_CLR_RELEASED(bp, nt, un) \ + DEVSET_DEL((bp)->sb_dev_released, (nt), (un)) +/* + * Ops for sbd_board_t.sb_dev_unreferenced + */ +#define SBD_DEV_IS_UNREFERENCED(bp, nt, un) \ + DEVSET_IN_SET((bp)->sb_dev_unreferenced, (nt), (un)) +#define SBD_DEV_SET_UNREFERENCED(bp, nt, un) \ + DEVSET_ADD((bp)->sb_dev_unreferenced, (nt), (un)) +#define SBD_DEV_CLR_UNREFERENCED(bp, nt, un) \ + DEVSET_DEL((bp)->sb_dev_unreferenced, (nt), (un)) + +#define SBD_DEVS_PRESENT(bp) \ + ((bp)->sb_dev_present) +#define SBD_DEVS_ATTACHED(bp) \ + ((bp)->sb_dev_attached) +#define SBD_DEVS_RELEASED(bp) \ + ((bp)->sb_dev_released) +#define SBD_DEVS_UNREFERENCED(bp) \ + ((bp)->sb_dev_unreferenced) +#define SBD_DEVS_UNATTACHED(bp) \ + ((bp)->sb_dev_present & ~(bp)->sb_dev_attached) +#define SBD_DEVS_CONFIGURE(bp, devs) \ + ((bp)->sb_dev_attached = (devs)) +#define SBD_DEVS_DISCONNECT(bp, devs) \ + ((bp)->sb_dev_present &= ~(devs)) +#define SBD_DEVS_CANCEL(bp, devs) \ + ((bp)->sb_dev_released &= ~(devs), \ + (bp)->sb_dev_unreferenced &= ~(devs)) + +/* + * return values from sbd_cancel_cpu + */ +#define SBD_CPUERR_NONE 0 +#define SBD_CPUERR_RECOVERABLE -1 +#define SBD_CPUERR_FATAL -2 + +/* + * sbd_board_t.sbmem[].sbm_flags + */ +#define SBD_MFLAG_RESERVED 0x01 /* mem unit reserved for delete */ +#define SBD_MFLAG_SOURCE 0x02 /* source brd of copy/rename op */ +#define SBD_MFLAG_TARGET 0x04 /* board selected as target */ +#define SBD_MFLAG_MEMUPSIZE 0x08 /* move from big to small board */ +#define SBD_MFLAG_MEMDOWNSIZE 0x10 /* move from small to big board */ +#define SBD_MFLAG_MEMRESIZE 0x18 /* move to different size board */ +#define SBD_MFLAG_RELOWNER 0x20 /* memory release (delete) owner */ +#define SBD_MFLAG_RELDONE 0x40 + +typedef struct { + int sfio_cmd; + void *sfio_arg; +} sbd_ioctl_t; + +/* + * 32bit support for sbd_ioctl_t. + */ +typedef struct { + int32_t sfio_cmd; + uint32_t sfio_arg; +} sbd_ioctl32_t; + +/* + * PSM-DR layers are only allowed to use lower 16 bits of dev_t. + * B - bottom 4 bits are for the slot number. + * D - device type chosen (0 = indicates all devices in slot). + * U - unit number if specific device type chosen. + * X - not used. + * + * Upper Lower + * XXXXUUUUDDDDBBBB + * + * Note that this format only allows attachment points to + * either represent all the units on a board or one particular + * unit. A more general specification would permit any combination + * of specific units and types to be represented by individual + * attachment points. + */ +#define SBD_DEV_SLOTMASK 0x000f +/* + * These device level definitions are primarily for unit testing. + */ +#define SBD_DEV_UNITMASK 0x0f00 +#define SBD_DEV_UNITSHIFT 8 +#define SBD_DEV_CPU 0x0010 +#define SBD_DEV_MEM 0x0020 +#define SBD_DEV_IO 0x0040 +#define SBD_DEV_TYPEMASK (SBD_DEV_CPU | SBD_DEV_MEM | SBD_DEV_IO) +#define SBD_DEV_TYPESHIFT 4 + +/* + * Slot, Instance, and Minor number Macro definitions + */ +#define SLOT2DEV(s) ((s) & SBD_DEV_SLOTMASK) +#define SBDGETSLOT(unit) ((unit) & SBD_DEV_SLOTMASK) +/* + * The following is primarily for unit testing. + */ +#define ALLCPU2DEV(s) (SBD_DEV_CPU | SLOT2DEV(s)) +#define ALLMEM2DEV(s) (SBD_DEV_MEM | SLOT2DEV(s)) +#define ALLIO2DEV(s) (SBD_DEV_IO | SLOT2DEV(s)) +#define _UNIT2DEV(u) (((u) << SBD_DEV_UNITSHIFT) & \ + SBD_DEV_UNITMASK) +#define CPUUNIT2DEV(s, c) (_UNIT2DEV(c) | ALLCPU2DEV(s)) +#define MEMUNIT2DEV(s, m) (_UNIT2DEV(m) | ALLMEM2DEV(s)) +#define IOUNIT2DEV(s, i) (_UNIT2DEV(i) | ALLIO2DEV(s)) + +#define DEV_IS_ALLUNIT(d) (((d) & SBD_DEV_UNITMASK) == 0) +#define _DEV_IS_ALLTYPE(d) (((d) & SBD_DEV_TYPEMASK) == 0) +#define DEV_IS_ALLBOARD(d) (DEV_IS_ALLUNIT(d) && _DEV_IS_ALLTYPE(d)) +#define DEV_IS_CPU(d) ((d) & SBD_DEV_CPU) +#define DEV_IS_MEM(d) ((d) & SBD_DEV_MEM) +#define DEV_IS_IO(d) ((d) & SBD_DEV_IO) +#define DEV_IS_ALLCPU(d) (DEV_IS_ALLUNIT(d) && DEV_IS_CPU(d)) +#define DEV_IS_ALLMEM(d) (DEV_IS_ALLUNIT(d) && DEV_IS_MEM(d)) +#define DEV_IS_ALLIO(d) (DEV_IS_ALLUNIT(d) && DEV_IS_IO(d)) +#define DEV2UNIT(d) \ + ((((d) & SBD_DEV_UNITMASK) >> SBD_DEV_UNITSHIFT) - 1) +#define DEV2NT(d) \ + (DEV_IS_MEM(d) ? SBD_COMP_MEM : \ + DEV_IS_CPU(d) ? SBD_COMP_CPU : \ + DEV_IS_IO(d) ? SBD_COMP_IO : SBD_COMP_UNKNOWN) + +/* + * Macros to cast between PIM and PSM layers of the following + * structures: + * board_t <-> sbd_board_t + * sbd_handle_t <-> sbd_priv_handle_t + * sbderror_t <-> sbderror_t + * slot -> board_t + * slot -> sbd_board_t + * sbd_board_t -> sbd_handle_t + * sbd_handle -> sbderror_t + */ +#define SBDH2BD(bd) ((sbd_board_t *)(bd)) + +#define HD2MACHHD(hd) ((sbd_priv_handle_t *)(hd)) +#define MACHHD2HD(mhd) ((sbd_handle_t *)&((mhd)->sh_handle)) + +#define ERR2MACHERR(err) ((sbderror_t *)(err)) +#define MACHERR2ERR(merr) ((sbderror_t *)(merr)) + +#define BSLOT2MACHBD(b) (&(sbd_boardlist[b])) +#define BSLOT2BD(slot) MACHBD2BD(BSLOT2MACHBD(slot)) + +#define MACHBD2HD(sbp) MACHHD2HD((sbp)->sb_handle) + +#define HD2MACHERR(hd) ERR2MACHERR(SBD_HD2ERR(hd)) + +#define MACHSRHD2HD(srh) ((srh)->sr_dr_handlep) + +/* + * CMP Specific Helpers + */ +#define MAX_CORES_PER_CMP 2 +#define SBD_CMP_CORE_UNUM(cmp, core) ((cmp + (core * 512)) +#define SBD_CMP_NUM(unum) (unum & 0x3) + +/* + * Some stuff to assist in debug. + */ +#ifdef DEBUG +#define SBD_DBG_STATE 0x00000001 +#define SBD_DBG_QR 0x00000002 +#define SBD_DBG_CPU 0x00000004 +#define SBD_DBG_MEM 0x00000008 +#define SBD_DBG_IO 0x00000010 +#define SBD_DBG_HW 0x00000020 +#define SBD_DBG_BYP 0x00000040 + +#define PR_ALL if (sbd_debug) printf +#define PR_STATE if (sbd_debug & SBD_DBG_STATE) printf +#define PR_QR if (sbd_debug & SBD_DBG_QR) prom_printf +#define PR_CPU if (sbd_debug & SBD_DBG_CPU) printf +#define PR_MEM if (sbd_debug & SBD_DBG_MEM) printf +#define PR_IO if (sbd_debug & SBD_DBG_IO) printf +#define PR_HW if (sbd_debug & SBD_DBG_HW) printf +#define PR_BYP if (sbd_debug & SBD_DBG_BYP) prom_printf + +#define SBD_MEMLIST_DUMP(ml) memlist_dump(ml) + +extern uint_t sbd_debug; +#else /* DEBUG */ +#define PR_ALL if (0) printf +#define PR_STATE PR_ALL +#define PR_QR PR_ALL +#define PR_CPU PR_ALL +#define PR_MEM PR_ALL +#define PR_IO PR_ALL +#define PR_HW PR_ALL +#define PR_BYP PR_ALL + +#define SBD_MEMLIST_DUMP(ml) +#endif /* DEBUG */ +extern char *sbd_state_str[]; +extern char *sbd_ct_str[]; + +/* + * event flag + */ +extern char send_event; + +/* + * IMPORTANT: + * The following two defines are also coded into OBP, so if they + * need to change here, don't forget to change OBP also. + */ +#define SBD_OBP_PROBE_GOOD 0 +#define SBD_OBP_PROBE_BAD 1 + +extern int sbd_setup_instance(int, dev_info_t *, int, int, + caddr_t); +extern int sbd_teardown_instance(int, caddr_t); +extern int sbd_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, + char *event); + +extern sbd_comp_type_t sbd_cm_type(char *name); +extern sbd_state_t ostate_cvt(sbd_istate_t state); +extern void sbd_cpu_set_prop(sbd_cpu_unit_t *cp, dev_info_t *dip); +extern int sbd_cpu_flags(sbd_handle_t *hp, sbd_devset_t devset, + sbd_dev_stat_t *dsp); +extern int sbd_disconnect_cpu(sbd_handle_t *hp, int unit); +extern int sbd_connect_cpu(sbd_board_t *sbp, int unit); +extern int sbd_disconnect_mem(sbd_handle_t *hp, int unit); + +extern int sbd_pre_detach_mem(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_post_attach_mem(sbd_handle_t *, + sbd_devlist_t *, int); +extern int sbd_post_detach_mem(sbd_handle_t *, + sbd_devlist_t *, int); +extern int sbd_post_attach_cpu(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_pre_release_cpu(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_pre_detach_cpu(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_post_detach_cpu(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_pre_attach_mem(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_pre_release_mem(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_disconnect_io(sbd_handle_t *hp, int unit); +extern void sbd_check_devices(dev_info_t *dip, int *refcount, + sbd_handle_t *handle); +extern struct memlist *sbd_get_memlist(sbd_mem_unit_t *mp, sbderror_t *ep); +extern void sbd_init_mem_unit(sbd_board_t *sbp, int unit, + sbderror_t *ep); +extern void sbd_release_mem_done(sbd_handle_t *hp, int unit); +extern void sbd_release_cleanup(sbd_handle_t *hp); +extern int sbd_cancel_cpu(sbd_handle_t *hp, int unit); +extern void sbd_init_err(sbderror_t *ep); +extern int sbd_cancel_mem(sbd_handle_t *hp, int unit); +extern sbd_comp_type_t sbd_get_devtype(sbd_handle_t *hp, dev_info_t *dip); +extern int sbd_get_board(dev_info_t *dip); +extern int sfhw_get_base_physaddr(dev_info_t *dip, + uint64_t *basepa); +extern int sbd_pre_attach_cpu(sbd_handle_t *hp, + sbd_devlist_t *devlist, int devnum); +extern int sbd_move_memory(sbd_handle_t *hp, sbd_board_t + *s_bp, sbd_board_t *t_bp); +extern void memlist_delete(struct memlist *mlist); +extern struct memlist *memlist_dup(struct memlist *mlist); +extern void memlist_dump(struct memlist *mlist); +extern int memlist_intersect(struct memlist *alist, + struct memlist *blist); +extern int sbd_juggle_bootproc(sbd_handle_t *hp, + processorid_t cpuid); + +extern sbd_cond_t sbd_get_comp_cond(dev_info_t *); +void sbd_attach_mem(sbd_handle_t *hp, sbderror_t *ep); +int sbd_release_mem(sbd_handle_t *hp, dev_info_t *dip, + int unit); + +int sbd_get_memhandle(sbd_handle_t *hp, dev_info_t *dip, + memhandle_t *mhp); +int sbd_detach_memory(sbd_handle_t *hp, sbderror_t *ep, + sbd_mem_unit_t *s_mp, int unit); +void sbd_release_memory_done(void *arg, int error); +int sbd_set_err_in_hdl(sbd_handle_t *hp, sbderror_t *ep); +sbdp_handle_t *sbd_get_sbdp_handle(sbd_board_t *sbp, + sbd_handle_t *hp); +void sbd_release_sbdp_handle(sbdp_handle_t *hp); +void sbd_reset_error_sbdph(sbdp_handle_t *hp); +extern int sbd_is_cmp_child(dev_info_t *dip); + +typedef const char *const fn_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_SBDPRIV_H */ |
