root/usr/src/uts/sun4v/sys/vcc_impl.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 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _VCC_IMPL_H
#define _VCC_IMPL_H

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

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/stream.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/ioctl.h>
#include <sys/vcc.h>

#define     VCC_DEV_TO_INST(dev)                (getminor(dev))
#define     VCC_INST_TO_DEV(instance)           (instance)

#define     VCC_DRIVER_NAME                     "vcc"
#define     VCC_NAME                            VCC_DRIVER_NAME

/*
 * VCC Port States
 */

/*
 * There is one lock in port structure to protect the states of the port.
 * States of the port are:
 * 1. VCC_PORT_AVAIL
 * 2. VCC_PORT_OPEN
 * 3. VCC_PORT_USE_READ_LDC  - There is a thread doing vcc_read.
 * 4. VCC_PORT_USE_WRITE_LDC - There is a thread doing vcc_write.
 * 6. VCC_PORT_LDC_DATA_READY - Data is ready from ldc.
 * 5. VCC_PORT_LDC_WRITE_READY - Ldc has space to receive data.
 * 7. VCC_PORT_LDC_CHANNEL_READY - Ldc channel is up.
 * 8. VCC_PORT_ADDED            - A new port was added.
 * 9. VCC_PORT_TERM_RD          - Terminal read is enabled vs suspended
 * 10. VCC_PORT_TERM_WR         - Terminal write is enabled vc suspended
 * 11. VCC_PORT_NONBLOCK        - A port was opened with non blocking flag.
 * 12. VCC_PORT_LDC_LINK_DOWN
 *
 *
 * Code flow for port to transit from one state to another is as the follows:
 *
 * 1. VCC_PORT_AVAIL
 *
 *          Transition from unavailable to available
 *              - obtain port lock
 *              Transit port to available and added states
 *              - release port lock
 *              - obtain softstate lock
 *              Increase total number of ports
 *              - release softsate lock
 *
 *              after download added port to vntsd
 *              - obtain port lock
 *              Transit port to not added state
 *              - release port lock
 *
 *          Transition from available to unavailable
 *              - obtain port lock
 *              - cv_wait read available
 *              Transit port to read unavailable
 *              - cv_wait write available
 *              Transit port to write unavailable
 *              Transit port to not ready. (close ldc channel)
 *              Transit port to deleted state
 *              Transit port to read and write available
 *              - cv_broadcast
 *              - release lock
 *
 *              vntsd close the deleted port
 *              - obtained port lock
 *              Transit port to close and deleted state
 *              - release port lock
 *
 *              after vntsd deletion of the port
 *              - obtain softstate lock
 *              - cv_wait port table unlocked
 *              Transit softstate to port table locked
 *              - release softstate lock
 *              - obtain port lock
 *              Transit port to unavailable
 *              destroy port lock
 *              - obtain softstate lock
 *              Transit softstate to port table unlocked
 *              - cv_broadcast
 *              - release softsate lock
 *
 * 2. VCC_PORT_OPEN
 *
 *          Transition from close to open
 *              - obtain port lock
 *              transit port to open
 *              - release port lock
 *
 *          Transition from open to close
 *              - obtain port lock
 *              - cv_wait read available
 *              Transit port to read unavailable
 *              - cv_wait write available
 *              Transit port to write unavailable
 *              Transit port to not ready. (close ldc channel)
 *              Transit port to close state
 *              Transit port to read and write available
 *              - cv_broadcast
 *              - release lock
 *
 * 3. VCC_PORT_USE_READ_LDC/VCC_PORT_USE_WRITE_LDC
 *          Transition from read availale/write available
 *          to read unavailable/write unavailable
 *              - obtain port lock
 *              - cv_wait read available
 *              Transit to read/write unavailable
 *              - release port lock
 *
 *          Transition from read unavailale/write unavailable
 *          to read available/write available
 *              - obtain port lock
 *              Transit to read/write available
 *              - cv_broadcast
 *              - release port lock
 *
 * 4. VCC_PORT_LDC_CHANNEL_READY
 *          Transition from data not ready to data ready
 *              - obtain port lock
 *              Transit to data ready
 *              - cv_broadcast
 *              - release port lock
 *
 *          Transition from data ready to data not ready
 *              - obtain port lock
 *              Transit to data not ready
 *              - release port lock
 */

#define     VCC_PORT_AVAIL              0x1     /* port is configured */
#define     VCC_PORT_OPEN               0x2     /* port is opened */
#define     VCC_PORT_LDC_CHANNEL_READY  0x4     /* ready for data transfer */
#define     VCC_PORT_USE_READ_LDC       0x8     /* read lock */
#define     VCC_PORT_USE_WRITE_LDC      0x10    /* write lock */
#define     VCC_PORT_LDC_DATA_READY     0x20    /* data ready */
#define     VCC_PORT_LDC_WRITE_READY    0x40    /* ldc ready receive data */
#define     VCC_PORT_ADDED              0x80    /* added, no ack from vntsd */
#define     VCC_PORT_UPDATED            0x100   /* updated, no ack from vntsd */
#define     VCC_PORT_TERM_RD            0x200   /* suspend write */
#define     VCC_PORT_TERM_WR            0x400   /* suspend read */
#define     VCC_PORT_NONBLOCK           0x800   /* open with non block flag */
#define     VCC_PORT_LDC_LINK_DOWN      0x1000  /* ldc link down */

/* Poll Flags */
#define     VCC_POLL_CONFIG         0x1     /* poll configuration change  */

/* Poll evnets */
#define     VCC_POLL_ADD_PORT       0x10    /* add a console port */
#define     VCC_POLL_UPDATE_PORT    0x20    /* update a console port  */

/* softstate port table state */
#define     VCC_LOCK_PORT_TBL           0x1

/* VCC limits */
#define     VCC_MAX_PORTS           0x800           /* number of domains */
#define     VCC_MAX_MINORS          VCC_MAX_PORTS   /* number of minors */


#define     VCC_MAX_PORT_MINORS         (VCC_MAX_MINORS - 1)
#define     VCC_CONTROL_MINOR_IDX       (VCC_MAX_MINORS - 1)

/* size of vcc message data */
#define     VCC_MTU_SZ              56

/* Default values */
#define     VCC_HDR_SZ              8       /* header size */
#define     VCC_BUF_SZ              (VCC_HDR_SZ + VCC_MTU_SZ)

#define     VCC_CONTROL_PORT        0x7ff   /* port 2047 is control port  */
#define     VCC_INST_SHIFT          11
#define     VCC_INVALID_CHANNEL     -1
#define     VCC_NO_PID_BLOCKING     -1

#define     VCC_MINOR_NAME_PREFIX   "ldom-" /* device name prefix */

/* HV message data type */
#define     LDC_CONSOLE_CTRL        0x1     /* ctrl msg */
#define     LDC_CONSOLE_DATA        0x2     /* data msg */

/* HV control messages */
#define     LDC_CONSOLE_BREAK       -1      /* brk */
#define     LDC_CONSOLE_HUP         -2      /* hup */

/*  minor number to port number */
#define     VCCPORT(p, minor)       (p->minor_tbl[(minor & \
    VCC_CONTROL_PORT)].portno)

/*  minor number to minor pointer */
#define     VCCMINORP(p, minor)     (&(p->minor_tbl[(minor & \
    VCC_CONTROL_PORT)]))

/* minor number to instance */
#define     VCCINST(minor)          ((minor) >> VCC_INST_SHIFT)


/* hv console packet format */
typedef struct vcc_msg {
        uint8_t         type;               /* type - data or ctrl */
        uint8_t         size;               /* data size */
        uint16_t        unused;             /* not used */
        int32_t         ctrl_msg;           /* data if type is ctrl */
        uint8_t         data[VCC_MTU_SZ];   /* data if type is data */
} vcc_msg_t;

/*
 *  minor node to port mapping table
 */
typedef struct vcc_minor {
        uint_t          portno;                     /* port number */
        char            domain_name[MAXPATHLEN];    /* doman name */
} vcc_minor_t;

/* console port structure */
typedef struct vcc_port {

        kmutex_t        lock;           /* protects port */
        kcondvar_t      read_cv;        /* cv to sleep for reads */
        kcondvar_t      write_cv;       /* cv to sleep for writes */

        uint_t          number;         /* port number */
        uint32_t        status;         /* port status */

        char            group_name[MAXPATHLEN];
        uint64_t        tcp_port;       /* tcp port num */

        struct  termios term;           /* terminal emulation */

        vcc_minor_t     *minorp;        /* pointer to minor table entry */

        uint64_t        ldc_id;         /* Channel number */
        ldc_handle_t    ldc_handle;     /* Channel handle */
        ldc_status_t    ldc_status;     /* Channel Status */

        uint_t          pollflag;       /* indicated poll status */
        struct pollhead poll;
        uint32_t        pollevent;
        pid_t           valid_pid;      /* pid that allows cb_ops */

} vcc_port_t;

/*
 * vcc  driver's soft state structure
 */
typedef struct vcc {

        /* protects vcc_t (soft state)  */
        kmutex_t                lock;

        uint_t                  status;

        dev_info_t              *dip;                      /* dev_info */

        mdeg_node_spec_t        *md_ispecp;                /* mdeg prop spec */
        mdeg_handle_t           mdeg_hdl;                  /* mdeg handle */

        vcc_port_t              port[VCC_MAX_PORTS];       /* port table */
        uint_t                  num_ports;                 /* avail ports */

        vcc_minor_t             minor_tbl[VCC_MAX_PORTS];   /* minor table */
        uint_t                  minors_assigned;           /* assigned minors */
} vcc_t;

#ifdef __cplusplus
}
#endif

#endif  /* _VCC_IMPL_H */