root/usr/src/uts/sun4v/sys/drctl.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 (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _SYS_DRCTL_H
#define _SYS_DRCTL_H

#ifdef  __cplusplus
extern "C" {
#endif


#define DRCTL_DEV "/devices/pseudo/drctl@0:drctl"

typedef enum {
        DRCTL_CPU_CONFIG_REQUEST = 1,
        DRCTL_CPU_CONFIG_NOTIFY,
        DRCTL_CPU_UNCONFIG_REQUEST,
        DRCTL_CPU_UNCONFIG_NOTIFY,
        DRCTL_MEM_CONFIG_REQUEST,
        DRCTL_MEM_CONFIG_NOTIFY,
        DRCTL_MEM_UNCONFIG_REQUEST,
        DRCTL_MEM_UNCONFIG_NOTIFY,
        DRCTL_IO_CONFIG_REQUEST,
        DRCTL_IO_CONFIG_NOTIFY,
        DRCTL_IO_UNCONFIG_REQUEST,
        DRCTL_IO_UNCONFIG_NOTIFY,
        DRCTL_DRC_BLOCK
} drctl_cmds_t;

/*
 * Responses to/from the daemon for a reconfig request.
 */
typedef enum {
        DRCTL_STATUS_INIT,              /* to daemon */
        DRCTL_STATUS_ALLOW,             /* from daemon */
        DRCTL_STATUS_DENY,              /* from daemon */
        DRCTL_STATUS_CONFIG_SUCCESS,    /* to daemon */
        DRCTL_STATUS_CONFIG_FAILURE     /* to daemon */
} drctl_status_t;

/*
 * Each resource descriptor consists of a common header
 * followed by a resource-specific structure.
 */

typedef struct drctl_rsrc_cpu {
        int             id;
} drctl_rsrc_cpu_t;

typedef struct drctl_rsrc_memory {
        uint64_t        size;
        uint64_t        addr;
} drctl_rsrc_mem_t;

typedef struct drctl_rsrc_dev {
        char            path[1];
} drctl_rsrc_dev_t;

typedef struct drctl_rsrc {
        drctl_status_t  status;
        uint64_t        offset;
        union {
                drctl_rsrc_cpu_t cpu;
                drctl_rsrc_mem_t mem;
                drctl_rsrc_dev_t dev;
        } un;
} drctl_rsrc_t;

#define res_cpu_id      un.cpu.id
#define res_mem_size    un.mem.size
#define res_mem_addr    un.mem.addr
#define res_dev_path    un.dev.path

/*
 * Response structure passed back by drctl to its clients
 * (resource-specific DR modules).
 */
typedef enum {
        DRCTL_RESP_ERR,
        DRCTL_RESP_OK
} drctl_resp_type_t;

typedef struct drctl_resp {
        drctl_resp_type_t resp_type;
        union {
                char err_msg[1];
                drctl_rsrc_t  resources[1];
        } un;
} drctl_resp_t;

#define resp_err_msg            un.err_msg
#define resp_resources          un.resources

/*
 * Message sent to DR daemon
 */
typedef struct drd_msg {
        uint_t          cmd;
        uint_t          count;
        int             flags;
        drctl_rsrc_t    data[1];
} drd_msg_t;

typedef void *drctl_cookie_t;

/*
 * DR RSMs (resource-specific modules) call these functions to
 * initialize or finalize a DR request.  A request may include
 * multiple resources of the same type.  The _init call returns
 * a cookie which must be supplied on by the corresponding
 * _fini call.
 */
extern int drctl_config_init(int, int,
    drctl_rsrc_t *, int, drctl_resp_t **, size_t *, drctl_cookie_t);
extern int drctl_config_fini(drctl_cookie_t, drctl_rsrc_t *, int);
extern void drctl_block(void);
extern int drctl_tryblock(void);
extern void drctl_unblock(void);

/*
 * Values for the 2nd arg (flags) of drctl_config_init
 */
#define DRCTL_FLAG_FORCE 1


#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_DRCTL_H */