root/usr/src/uts/common/sys/av/iec61883.h
/*
 * 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 2002 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_AV_IEC61883_H
#define _SYS_AV_IEC61883_H

/*
 * IEC 61883 interfaces
 */

#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

/* current interface version */
#define IEC61883_IMPL_MKVER(major, minor) (((major) << 8) | (minor))
#define IEC61883_IMPL_VER_MAJOR(ver)    (((ver) >> 8) & 0xff)
#define IEC61883_IMPL_VER_MINOR(ver)    ((ver) & 0xff)
#define IEC61883_V1_0                   IEC61883_IMPL_MKVER(1, 0)

/*
 * asyncronous request (ARQ)
 */
typedef struct iec61883_arq {
        int             arq_type;       /* type */
        int             arq_len;        /* length */
        union {
                uint32_t        quadlet;
                uint64_t        octlet;
                uint8_t         buf[8];
        } arq_data;                     /* data */
} iec61883_arq_t;

/* ARQ types (arq_type) */
enum {
        IEC61883_ARQ_FCP_CMD,
        IEC61883_ARQ_FCP_RESP,
        IEC61883_ARQ_BUS_RESET
};

/*
 * IEC61883_ISOCH_INIT argument
 */
typedef struct iec61883_isoch_init {
        int             ii_version;     /* interface version */
        int             ii_pkt_size;    /* packet size */
        int             ii_frame_size;  /* packets/frame */
        int             ii_frame_cnt;   /* # of frames */
        int             ii_direction;   /* xfer direction */
        int             ii_bus_speed;   /* bus speed */
        uint64_t        ii_channel;     /* channel mask */
        int             ii_dbs;         /* DBS */
        int             ii_fn;          /* FN */
        int             ii_rate_n;      /* rate numerator */
        int             ii_rate_d;      /* rate denominator */
        int             ii_ts_mode;     /* timestamp mode */
        int             ii_flags;       /* flags */
        int             ii_handle;      /* isoch handle */
        int             ii_frame_rcnt;  /* # of frames */
        off_t           ii_mmap_off;    /* mmap offset */
        int             ii_rchannel;    /* channel */
        int             ii_error;       /* error code */
} iec61883_isoch_init_t;

/* xfer directions (ii_direction) */
enum {
        IEC61883_DIR_RECV,
        IEC61883_DIR_XMIT
};

/* bus speeds (ii_bus_speed) */
enum {
        IEC61883_S100,
        IEC61883_S200,
        IEC61883_S400
};

/* special rate coefficients (ii_rate_n, ii_rate_d) */
#define IEC61883_RATE_N_DV_NTSC         1
#define IEC61883_RATE_D_DV_NTSC         0
#define IEC61883_RATE_N_DV_PAL          2
#define IEC61883_RATE_D_DV_PAL          0

/* timestamp modes (ii_ts_mode) */
enum {
        IEC61883_TS_NONE        = 0,
        IEC61883_TS_SYT         = 0x0206
};

/* error codes (ii_error) */
enum {
        IEC61883_ERR_NOMEM      = 1,
        IEC61883_ERR_NOCHANNEL,
        IEC61883_ERR_PKT_SIZE,
        IEC61883_ERR_VERSION,
        IEC61883_ERR_INVAL,
        IEC61883_ERR_OTHER
};

/*
 * data transfer strusture
 */
typedef struct iec61883_xfer {
        int     xf_empty_idx;   /* first empty frame */
        int     xf_empty_cnt;   /* empty frame count */
        int     xf_full_idx;    /* first full frame */
        int     xf_full_cnt;    /* full frame count */
        int     xf_error;       /* error */
} iec61883_xfer_t;

/*
 * IEC61883_RECV argument
 */
typedef struct iec61883_recv {
        int             rx_handle;      /* isoch handle */
        int             rx_flags;       /* flags */
        iec61883_xfer_t rx_xfer;        /* xfer params */
} iec61883_recv_t;

/*
 * IEC61883_XMIT argument
 */
typedef struct iec61883_xmit {
        int             tx_handle;      /* isoch handle */
        int             tx_flags;       /* flags */
        iec61883_xfer_t tx_xfer;        /* xfer params */
        int             tx_miss_cnt;    /* missed cycles */
} iec61883_xmit_t;

/*
 * IEC61883_PLUG_INIT argument
 */
typedef struct iec61883_plug_init {
        int             pi_ver;         /* interface version */
        int             pi_loc;         /* plug location */
        int             pi_type;        /* plug type */
        int             pi_num;         /* plug number */
        int             pi_flags;       /* flags */
        int             pi_handle;      /* plug handle */
        int             pi_rnum;        /* plug number */
} iec61883_plug_init_t;

/* plug locations (pi_loc) */
enum {
        IEC61883_LOC_LOCAL,
        IEC61883_LOC_REMOTE
};

/* plug types (pi_type) */
enum {
        IEC61883_PLUG_IN,
        IEC61883_PLUG_OUT,
        IEC61883_PLUG_MASTER_IN,
        IEC61883_PLUG_MASTER_OUT
};

/* special plug number (pi_num) */
enum {
        IEC61883_PLUG_ANY       = -1
};

/*
 * IEC61883_PLUG_REG_READ argument
 */
typedef struct iec61883_plug_reg_val {
        int             pr_handle;      /* plug handle */
        uint32_t        pr_val;         /* register value */
} iec61883_plug_reg_val_t;

/*
 * IEC61883_PLUG_REG_CAS argument
 */
typedef struct iec61883_plug_reg_lock {
        int             pl_handle;      /* plug handle */
        uint32_t        pl_arg;         /* compare arg */
        uint32_t        pl_data;        /* write value */
        uint32_t        pl_old;         /* original value */
} iec61883_plug_reg_lock_t;

/*
 * IEC61883_NODE_GET_TEXT_LEAF argument
 */
typedef struct iec61883_node_text_leaf {
        int             tl_parent;      /* ROM parent */
        int             tl_num;         /* leaf number */
        int             tl_len;         /* buffer length */
        uint32_t        *tl_data;       /* data buffer */
        int             tl_cnt;         /* leaf count */
        int             tl_rlen;        /* real length */
        uint32_t        tl_spec;        /* specifier */
        uint32_t        tl_lang_id;     /* language id */
        uint32_t        tl_desc_entry;  /* entry described by this leaf */
} iec61883_node_text_leaf_t;

/* ROM parent types (tl_parent) */
enum {
        IEC61883_ROM_ROOT,      /* leaf in the root directory */
        IEC61883_ROM_UNIT       /* leaf in the unit directory */
};

/* ioctl codes */
#define IEC61883_IMPL_IOC               ('i' << 8)
#define IEC61883_IMPL_MKIOC(c)          (c | IEC61883_IMPL_IOC)

#define IEC61883_ISOCH_INIT             IEC61883_IMPL_MKIOC(0x01)
#define IEC61883_ISOCH_FINI             IEC61883_IMPL_MKIOC(0x02)
#define IEC61883_START                  IEC61883_IMPL_MKIOC(0x03)
#define IEC61883_STOP                   IEC61883_IMPL_MKIOC(0x04)
#define IEC61883_RECV                   IEC61883_IMPL_MKIOC(0x05)
#define IEC61883_XMIT                   IEC61883_IMPL_MKIOC(0x06)
#define IEC61883_PLUG_INIT              IEC61883_IMPL_MKIOC(0x07)
#define IEC61883_PLUG_FINI              IEC61883_IMPL_MKIOC(0x08)
#define IEC61883_PLUG_REG_READ          IEC61883_IMPL_MKIOC(0x09)
#define IEC61883_PLUG_REG_CAS           IEC61883_IMPL_MKIOC(0x0A)
#define IEC61883_ARQ_GET_IBUF_SIZE      IEC61883_IMPL_MKIOC(0x0B)
#define IEC61883_ARQ_SET_IBUF_SIZE      IEC61883_IMPL_MKIOC(0x0C)
#define IEC61883_NODE_GET_BUS_NAME      IEC61883_IMPL_MKIOC(0x0D)
#define IEC61883_NODE_GET_UID           IEC61883_IMPL_MKIOC(0x0E)
#define IEC61883_NODE_GET_TEXT_LEAF     IEC61883_IMPL_MKIOC(0x0F)


/* 32-bit structures for the drivers */
#ifdef _KERNEL
typedef struct iec61883_isoch_init32 {
        int             ii_version;     /* interface version */
        int             ii_pkt_size;    /* packet size */
        int             ii_frame_size;  /* packets/frame */
        int             ii_frame_cnt;   /* # of frames */
        int             ii_direction;   /* xfer direction */
        int             ii_bus_speed;   /* bus speed */
        uint64_t        ii_channel;     /* channel mask */
        int             ii_dbs;         /* DBS */
        int             ii_fn;          /* FN */
        int             ii_rate_n;      /* rate numerator */
        int             ii_rate_d;      /* rate denominator */
        int             ii_ts_mode;     /* timestamp mode */
        int             ii_flags;       /* flags */
        int             ii_handle;      /* isoch handle */
        int             ii_frame_rcnt;  /* # of frames */
        int32_t         ii_mmap_off;    /* mmap offset */
        int             ii_rchannel;    /* channel */
        int             ii_error;       /* error code */
} iec61883_isoch_init32_t;

typedef struct iec61883_node_text_leaf32 {
        int             tl_parent;      /* ROM parent */
        int             tl_num;         /* leaf number */
        int             tl_len;         /* buffer length */
        caddr32_t       tl_data;        /* data buffer */
        int             tl_cnt;         /* leaf count */
        int             tl_rlen;        /* real length */
        uint32_t        tl_spec;        /* specifier */
        uint32_t        tl_lang_id;     /* language id */
        uint32_t        tl_desc_entry;  /* entry described by this leaf */
} iec61883_node_text_leaf32_t;
#endif /* _KERNEL */

#ifdef __cplusplus
}
#endif

#endif /* _SYS_AV_IEC61883_H */