dr.h revision df3cd224ef765c29101e4110546062199562f757
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (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
* 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 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_DR_H
#define _SYS_DR_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/processor.h>
#include <sys/sbd_ioctl.h>
#include <sys/mem_config.h>
#define DR_MAXNUM_NT 3
/* used to map sbd_comp_type_t to array index */
#define NIX(t) \
(((t) == SBD_COMP_CPU) ? 0 : \
((t) == SBD_COMP_MEM) ? 1 : \
((t) == SBD_COMP_IO) ? 2 : \
((t) == SBD_COMP_CMP) ? 0 : DR_MAXNUM_NT)
#define BIX(t) \
(((t) == SBD_COMP_CPU) ? 0 : \
((t) == SBD_COMP_MEM) ? 32 : \
((t) == SBD_COMP_IO) ? 40 : \
((t) == SBD_COMP_CMP) ? 0 : 0)
#define NMASK(t) \
/*
* helper macros for constructing and reporting internal error messages.
* NOTE: each module which uses one or more this these macros is expected
* to supply a char *dr_ie_fmt string containing the SCCS filename
* expansion macro (percent M percent) and a sprintf %d to render the
* line number argument.
*/
#define DR_INTERNAL_ERROR(hp) \
#define DR_OP_INTERNAL_ERROR(hp) \
#define DR_DEV_INTERNAL_ERROR(cp) \
/*
* TODO: Simplify or get rid of this.
* Macros for keeping an error code and an associated list of integers.
*/
#define DR_MAX_ERR_INT (32)
/*
* Format of dr_devset_t bit masks:
*
* 64 48 40 32 24 16 8 0
* |....|...I|IIII|IIII|....|...M|CCCC|CCCC|CCCC|CCCC|CCCC|CCCC|CCCC|CCCC|
*
* I = I/O, M = Memory, C = CPU.
*/
#define _NT2DEVPOS(t, u) (BIX(t) + (u))
#define DEVSET(t, u) \
(((u) == DEVSET_ANYUNIT) ? \
((t) == SBD_COMP_CMP) ? \
(_CMP_DEVSET_MASK << _NT2DEVPOS((t), (u))) : \
(DEVSET_ONEUNIT << _NT2DEVPOS((t), (u))))
#define DEVSET_GET_UNITSET(ds, t) \
/*
* Ops for dr_board_t.b_dev_*
*/
(cp)->sbdev_type, \
(cp)->sbdev_unum)
(cp)->sbdev_type, \
(cp)->sbdev_unum)
(cp)->sbdev_type, \
(cp)->sbdev_unum)
/*
* Ops for dr_board_t.b_dev_present
*/
/*
* Ops for dr_board_t.b_dev_attached
*/
/*
* Ops for dr_board_t.b_dev_released
*/
/*
* Ops for dr_board_t.b_dev_unreferenced
*/
#define DR_DEVS_PRESENT(bp) \
((bp)->b_dev_present)
#define DR_DEVS_ATTACHED(bp) \
((bp)->b_dev_attached)
#define DR_DEVS_RELEASED(bp) \
((bp)->b_dev_released)
#define DR_DEVS_UNREFERENCED(bp) \
((bp)->b_dev_unreferenced)
#define DR_DEVS_UNATTACHED(bp) \
/*
* CMP Specific Helpers
*/
/*
* DR_UNUM2SBD_UNUM should be set to (unum & (max #of CMP on board - 1))
* for all the platforms. So far, all sun4u platforms supported have
* the same limit so 0x3 works. One day we might have to make this
* a platform specific macro.
*/
(d == SBD_COMP_CPU) ? (n & 0x3) : \
(d == SBD_COMP_CMP) ? (n & 0x3) : \
(n))
/*
* Some stuff to assist in debug.
*/
#ifdef DEBUG
#define DRDBG_STATE 0x00000001
#define DRDBG_QR 0x00000002
#define DRDBG_CPU 0x00000004
#define DRDBG_MEM 0x00000008
#define DRDBG_IO 0x00000010
#else /* DEBUG */
#endif /* DEBUG */
/*
* dr_board_t b_sflags.
*/
typedef const char *fn_t;
/*
* Unsafe devices based on dr.conf prop "unsupported-io-drivers"
*/
typedef struct {
char **devnames;
/*
* Device states.
* PARTIAL state is really only relevant for board state.
*/
typedef enum {
DR_STATE_EMPTY = 0,
DR_STATE_PARTIAL, /* part connected, part configured */
} dr_state_t;
typedef struct dr_handle {
int h_op_intr; /* nz if op interrupted */
int h_cmd; /* PIM ioctl argument */
int h_mode; /* device open mode */
} dr_handle_t;
typedef struct dr_common_unit {
int sbdev_busy;
int sbdev_unum;
char sbdev_path[MAXNAMELEN];
typedef struct dr_mem_unit {
/*
* 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 dr_mem_unit *sbm_peer;
struct memlist *sbm_del_mlist;
/*
* Currently only maintain state information for individual
* components.
*/
typedef struct dr_cpu_unit {
int sbc_speed;
int sbc_ecache;
int sbc_cpu_impl;
typedef struct dr_io_unit {
} dr_io_unit_t;
typedef union {
typedef struct dr_board {
int b_sflags; /* for serializing status */
int b_busy;
int b_assigned;
char b_type[MAXNAMELEN];
int b_num; /* board number */
int b_ndev; /* # of devices on board */
char b_path[MAXNAMELEN];
} dr_board_t;
/*
* dr_quiesce.c interfaces
*/
struct dr_sr_handle;
typedef struct dr_sr_handle dr_sr_handle_t;
int len, int *refcount_non_gldv3);
/*
* dr_cpu.c interface
*/
/*
* dr_mem.c interface
*/
/*
* dr_io.c interface
*/
/*
* dr.c interface
*/
extern char *dr_nt_to_dev_type(int type);
#ifdef __cplusplus
}
#endif
#endif /* _SYS_DR_H */