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