Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */