linux/drivers/misc/ibmvmc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+
   2 *
   3 * linux/drivers/misc/ibmvmc.h
   4 *
   5 * IBM Power Systems Virtual Management Channel Support.
   6 *
   7 * Copyright (c) 2004, 2018 IBM Corp.
   8 *   Dave Engebretsen engebret@us.ibm.com
   9 *   Steven Royer seroyer@linux.vnet.ibm.com
  10 *   Adam Reznechek adreznec@linux.vnet.ibm.com
  11 *   Bryant G. Ly <bryantly@linux.vnet.ibm.com>
  12 */
  13#ifndef IBMVMC_H
  14#define IBMVMC_H
  15
  16#include <linux/types.h>
  17#include <linux/cdev.h>
  18
  19#include <asm/vio.h>
  20
  21#define IBMVMC_PROTOCOL_VERSION    0x0101
  22
  23#define MIN_BUF_POOL_SIZE 16
  24#define MIN_HMCS          1
  25#define MIN_MTU           4096
  26#define MAX_BUF_POOL_SIZE 64
  27#define MAX_HMCS          2
  28#define MAX_MTU           (4 * 4096)
  29#define DEFAULT_BUF_POOL_SIZE 32
  30#define DEFAULT_HMCS          1
  31#define DEFAULT_MTU           4096
  32#define HMC_ID_LEN        32
  33
  34#define VMC_INVALID_BUFFER_ID 0xFFFF
  35
  36/* ioctl numbers */
  37#define VMC_BASE             0xCC
  38#define VMC_IOCTL_SETHMCID   _IOW(VMC_BASE, 0x00, unsigned char *)
  39#define VMC_IOCTL_QUERY      _IOR(VMC_BASE, 0x01, struct ibmvmc_query_struct)
  40#define VMC_IOCTL_REQUESTVMC _IOR(VMC_BASE, 0x02, u32)
  41
  42#define VMC_MSG_CAP          0x01
  43#define VMC_MSG_CAP_RESP     0x81
  44#define VMC_MSG_OPEN         0x02
  45#define VMC_MSG_OPEN_RESP    0x82
  46#define VMC_MSG_CLOSE        0x03
  47#define VMC_MSG_CLOSE_RESP   0x83
  48#define VMC_MSG_ADD_BUF      0x04
  49#define VMC_MSG_ADD_BUF_RESP 0x84
  50#define VMC_MSG_REM_BUF      0x05
  51#define VMC_MSG_REM_BUF_RESP 0x85
  52#define VMC_MSG_SIGNAL       0x06
  53
  54#define VMC_MSG_SUCCESS 0
  55#define VMC_MSG_INVALID_HMC_INDEX 1
  56#define VMC_MSG_INVALID_BUFFER_ID 2
  57#define VMC_MSG_CLOSED_HMC        3
  58#define VMC_MSG_INTERFACE_FAILURE 4
  59#define VMC_MSG_NO_BUFFER         5
  60
  61#define VMC_BUF_OWNER_ALPHA 0
  62#define VMC_BUF_OWNER_HV    1
  63
  64enum ibmvmc_states {
  65        ibmvmc_state_sched_reset  = -1,
  66        ibmvmc_state_initial      = 0,
  67        ibmvmc_state_crqinit      = 1,
  68        ibmvmc_state_capabilities = 2,
  69        ibmvmc_state_ready        = 3,
  70        ibmvmc_state_failed       = 4,
  71};
  72
  73enum ibmhmc_states {
  74        /* HMC connection not established */
  75        ibmhmc_state_free    = 0,
  76
  77        /* HMC connection established (open called) */
  78        ibmhmc_state_initial = 1,
  79
  80        /* open msg sent to HV, due to ioctl(1) call */
  81        ibmhmc_state_opening = 2,
  82
  83        /* HMC connection ready, open resp msg from HV */
  84        ibmhmc_state_ready   = 3,
  85
  86        /* HMC connection failure */
  87        ibmhmc_state_failed  = 4,
  88};
  89
  90struct ibmvmc_buffer {
  91        u8 valid;       /* 1 when DMA storage allocated to buffer          */
  92        u8 free;        /* 1 when buffer available for the Alpha Partition */
  93        u8 owner;
  94        u16 id;
  95        u32 size;
  96        u32 msg_len;
  97        dma_addr_t dma_addr_local;
  98        dma_addr_t dma_addr_remote;
  99        void *real_addr_local;
 100};
 101
 102struct ibmvmc_admin_crq_msg {
 103        u8 valid;       /* RPA Defined           */
 104        u8 type;        /* ibmvmc msg type       */
 105        u8 status;      /* Response msg status. Zero is success and on failure,
 106                         * either 1 - General Failure, or 2 - Invalid Version is
 107                         * returned.
 108                         */
 109        u8 rsvd[2];
 110        u8 max_hmc;     /* Max # of independent HMC connections supported */
 111        __be16 pool_size;       /* Maximum number of buffers supported per HMC
 112                                 * connection
 113                                 */
 114        __be32 max_mtu;         /* Maximum message size supported (bytes) */
 115        __be16 crq_size;        /* # of entries available in the CRQ for the
 116                                 * source partition. The target partition must
 117                                 * limit the number of outstanding messages to
 118                                 * one half or less.
 119                                 */
 120        __be16 version; /* Indicates the code level of the management partition
 121                         * or the hypervisor with the high-order byte
 122                         * indicating a major version and the low-order byte
 123                         * indicating a minor version.
 124                         */
 125};
 126
 127struct ibmvmc_crq_msg {
 128        u8 valid;     /* RPA Defined           */
 129        u8 type;      /* ibmvmc msg type       */
 130        u8 status;    /* Response msg status   */
 131        union {
 132                u8 rsvd;  /* Reserved              */
 133                u8 owner;
 134        } var1;
 135        u8 hmc_session; /* Session Identifier for the current VMC connection */
 136        u8 hmc_index;   /* A unique HMC Idx would be used if multiple management
 137                         * applications running concurrently were desired
 138                         */
 139        union {
 140                __be16 rsvd;
 141                __be16 buffer_id;
 142        } var2;
 143        __be32 rsvd;
 144        union {
 145                __be32 rsvd;
 146                __be32 lioba;
 147                __be32 msg_len;
 148        } var3;
 149};
 150
 151/* an RPA command/response transport queue */
 152struct crq_queue {
 153        struct ibmvmc_crq_msg *msgs;
 154        int size, cur;
 155        dma_addr_t msg_token;
 156        spinlock_t lock;
 157};
 158
 159/* VMC server adapter settings */
 160struct crq_server_adapter {
 161        struct device *dev;
 162        struct crq_queue queue;
 163        u32 liobn;
 164        u32 riobn;
 165        struct tasklet_struct work_task;
 166        wait_queue_head_t reset_wait_queue;
 167        struct task_struct *reset_task;
 168};
 169
 170/* Driver wide settings */
 171struct ibmvmc_struct {
 172        u32 state;
 173        u32 max_mtu;
 174        u32 max_buffer_pool_size;
 175        u32 max_hmc_index;
 176        struct crq_server_adapter *adapter;
 177        struct cdev cdev;
 178        u32 vmc_drc_index;
 179};
 180
 181struct ibmvmc_file_session;
 182
 183/* Connection specific settings */
 184struct ibmvmc_hmc {
 185        u8 session;
 186        u8 index;
 187        u32 state;
 188        struct crq_server_adapter *adapter;
 189        spinlock_t lock;
 190        unsigned char hmc_id[HMC_ID_LEN];
 191        struct ibmvmc_buffer buffer[MAX_BUF_POOL_SIZE];
 192        unsigned short queue_outbound_msgs[MAX_BUF_POOL_SIZE];
 193        int queue_head, queue_tail;
 194        struct ibmvmc_file_session *file_session;
 195};
 196
 197struct ibmvmc_file_session {
 198        struct file *file;
 199        struct ibmvmc_hmc *hmc;
 200        bool valid;
 201};
 202
 203struct ibmvmc_query_struct {
 204        int have_vmc;
 205        int state;
 206        int vmc_drc_index;
 207};
 208
 209#endif /* __IBMVMC_H */
 210