root/usr/src/uts/sun4u/lw8/sys/sgfru.h
/*
 * 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
 * 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 2001 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SGFRU_H
#define _SGFRU_H

#pragma ident   "%Z%%M% %I%     %E% SMI"

#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/types.h>

/*
 * sgfru driver ioctl definitions
 */

#define FRU_PSEUDO_DEV          "/devices/pseudo/sgfru@0:sgfru"
/* see SCAPP source file FruRegistry.java */
#define SEG_PROTIGNCKS          (1 << 30)
#define SEG_PROTOPAQUE          (1 << 29)
#define SEG_PROTFIXED           (1 << 28)

#ifdef _KERNEL
#define _SGFRU_KERNEL_OR_FRU
#endif

#ifdef _SGFRU
#define _SGFRU_KERNEL_OR_FRU
#endif

#ifdef _SGFRU_KERNEL_OR_FRU
#define SEG_NAME_LEN 2
#endif

/*
 * Generic typedefs and defines.
 *
 * All sgfru ioctls accept either a fru_info_t (a handle and a count),
 * a frup_info_t (which is a fru_info_t plus a pointer to a preallocated
 * data buffer), or an append_info_t (which is a packet_t plus a frup_info_t).
 *
 * The count is always the space allocated for a specific number of items,
 * aka the calloc model.
 */
typedef int32_t         fru_cnt_t;      /* count for number of objects */
#ifdef _SGFRU_KERNEL_OR_FRU
typedef uint64_t        fru_hdl_t;      /* SC_handle, opaque handle for SCAPP */

typedef fru_hdl_t       container_hdl_t; /* container handle */
typedef fru_hdl_t       section_hdl_t;  /* section handle */
typedef fru_hdl_t       segment_hdl_t;  /* segment handle */
typedef fru_hdl_t       packet_hdl_t;   /* packet handle */

typedef struct {
        section_hdl_t   handle;         /* for use in operations on section */
        uint32_t        offset;         /* bytes from container beginning */
        uint32_t        length;         /*  length of section in bytes */
        uint32_t        protected;      /* non-zero if write-protected */
        int32_t         version;        /* version of section header, or -1 */
} section_t;

typedef struct {
        segment_hdl_t   handle;         /* for use in operations on segment */
        char            name[SEG_NAME_LEN]; /* from container section header */
        uint32_t        descriptor;     /* ditto */
        uint32_t        offset;         /* ditto */
        uint32_t        length;         /* ditto */
} segment_t;

typedef uint64_t  tag_t;

typedef struct {
        packet_hdl_t    handle;         /* for use in operations on packet */
        tag_t           tag;            /* packet tag */
} packet_t;
#endif

typedef struct {
        fru_hdl_t       hdl;            /* generic fru handle */
        fru_cnt_t       cnt;            /* generic fru count */
} fru_info_t;

typedef fru_info_t      section_info_t; /* section handle and count */
typedef fru_info_t      segment_info_t; /* segment handle and count */
typedef fru_info_t      packet_info_t;  /* packet handle and count */

typedef struct {
        fru_info_t      fru_info;       /* handle and count */
        void            *frus;          /* pointer to opaque buffer */
} frup_info_t;

#define fru_hdl         fru_info.hdl
#define fru_cnt         fru_info.cnt

typedef frup_info_t     sections_t;     /* section handle, count, pointer */
typedef frup_info_t     segments_t;     /* segment handle, count, pointer */
typedef frup_info_t     packets_t;      /* packet handle, count, pointer */
typedef frup_info_t     payload_t;      /* payload handle, count, pointer */

typedef struct {
        packet_t        packet;         /* packet info */
        payload_t       payload;        /* handle, count, pointer to buffer */
} append_info_t;

#define payload_hdl     payload.fru_hdl
#define payload_cnt     payload.fru_cnt
#define payload_data    payload.frus

#if defined(_SYSCALL32)

typedef struct {
        fru_info_t      fru_info;       /* handle and count */
        caddr32_t       frus;           /* 32 bit pointer to opaque buffer */
} frup32_info_t;

typedef struct {
        packet_t        packet;         /* packet info */
        frup32_info_t   payload;        /* handle, count, 32 bit pointer */
} append32_info_t;

#endif  /* _SYSCALL32 */

/*
 * Request: section_info_t, with container handle
 * Receive: section_info_t, with current section count
 */
#define SGFRU_GETNUMSECTIONS            0x0001

/*
 * Request: sections_t, with container handle, max count, preallocated buffer
 * Receive: sections_t, with section_t array and actual count
 */
#define SGFRU_GETSECTIONS               0x0002

/*
 * Request: segment_info_t, with section handle
 * Receive: segment_info_t, with current segment count
 */
#define SGFRU_GETNUMSEGMENTS            0x0003

/*
 * Request: segments_t, with section handle, max count, preallocated buffer
 * Receive: segments_t, with segment_t array and actual count
 */
#define SGFRU_GETSEGMENTS               0x0004

/*
 * Request: segments_t, with section handle and segment_t
 * Receive: updated segments_t with section handle and new segment handle
 */
#define SGFRU_ADDSEGMENT                0x0005

/*
 * Request: segment_info_t, with segment handle
 * Receive: segment_info_t, with updated section handle
 */
#define SGFRU_DELETESEGMENT             0x0006

/*
 * Request: segments_t, with segment handle, max count, preallocated buffer
 * Receive: segments_t, with segment raw data and actual count
 */
#define SGFRU_READRAWSEGMENT            0x0007

/*
 * Request: segments_t, with segment handle, max count, data buffer
 * Receive: segments_t, with segment data and actual count
 */
#define SGFRU_WRITERAWSEGMENT           0x0008

/*
 * Request: packet_info_t, with segment handle
 * Receive: packet_info_t, with current packet count
 */
#define SGFRU_GETNUMPACKETS             0x0009

/*
 * Request: packet_info_t, with segment handle, max count, preallocated buffer
 * Receive: packet_info_t, with packet array and actual count
 */
#define SGFRU_GETPACKETS                0x000a

/*
 * Request: append_info_t, with packet_t, segment handle, count and data
 * Receive: updated append_info_t with segment handle and new packet handle
 */
#define SGFRU_APPENDPACKET              0x000b

/*
 * Request: packet_info_t, with packet handle
 * Receive: packet_info_t, with updated segment handle
 */
#define SGFRU_DELETEPACKET              0x000c

/*
 * Request: payload_t, with packet handle, max count, and payload data buffer
 * Receive: payload_t, with payload data and actual count
 */
#define SGFRU_GETPAYLOAD                0x000d

/*
 * Request: payload_t, with packet handle, max count, and payload data buffer
 * Receive: payload_t, with new packet handle and actual count
 */
#define SGFRU_UPDATEPAYLOAD             0x000e

#ifdef  __cplusplus
}
#endif

#endif  /* _SGFRU_H */