forked from mirrors/linux
		
	misc: IBM Virtual Management Channel Driver (VMC)
This driver is a logical device which provides an interface between the hypervisor and a management partition. This interface is like a message passing interface. This management partition is intended to provide an alternative to HMC-based system management. VMC enables the Management LPAR to provide basic logical partition functions: - Logical Partition Configuration - Boot, start, and stop actions for individual partitions - Display of partition status - Management of virtual Ethernet - Management of virtual Storage - Basic system management This driver is to be used for the POWER Virtual Management Channel Virtual Adapter on the PowerPC platform. It provides a character device which allows for both request/response and async message support through the /dev/ibmvmc node. Signed-off-by: Bryant G. Ly <bryantly@linux.vnet.ibm.com> Reviewed-by: Steven Royer <seroyer@linux.vnet.ibm.com> Reviewed-by: Adam Reznechek <adreznec@linux.vnet.ibm.com> Reviewed-by: Randy Dunlap <rdunlap@infradead.org> Tested-by: Taylor Jakobson <tjakobs@us.ibm.com> Tested-by: Brad Warrum <bwarrum@us.ibm.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									5b7d127726
								
							
						
					
					
						commit
						0eca353e7a
					
				
					 8 changed files with 2876 additions and 0 deletions
				
			
		|  | @ -327,6 +327,7 @@ Code  Seq#(hex)	Include File		Comments | ||||||
| 0xCA	80-BF	uapi/scsi/cxlflash_ioctl.h | 0xCA	80-BF	uapi/scsi/cxlflash_ioctl.h | ||||||
| 0xCB	00-1F	CBM serial IEC bus	in development: | 0xCB	00-1F	CBM serial IEC bus	in development: | ||||||
| 					<mailto:michael.klein@puffin.lb.shuttle.de> | 					<mailto:michael.klein@puffin.lb.shuttle.de> | ||||||
|  | 0xCC	00-0F	drivers/misc/ibmvmc.h    pseries VMC driver | ||||||
| 0xCD	01	linux/reiserfs_fs.h | 0xCD	01	linux/reiserfs_fs.h | ||||||
| 0xCF	02	fs/cifs/ioctl.c | 0xCF	02	fs/cifs/ioctl.c | ||||||
| 0xDB	00-0F	drivers/char/mwave/mwavepub.h | 0xDB	00-0F	drivers/char/mwave/mwavepub.h | ||||||
|  |  | ||||||
							
								
								
									
										226
									
								
								Documentation/misc-devices/ibmvmc.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								Documentation/misc-devices/ibmvmc.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,226 @@ | ||||||
|  | .. SPDX-License-Identifier: GPL-2.0+ | ||||||
|  | ====================================================== | ||||||
|  | IBM Virtual Management Channel Kernel Driver (IBMVMC) | ||||||
|  | ====================================================== | ||||||
|  | 
 | ||||||
|  | :Authors: | ||||||
|  | 	Dave Engebretsen <engebret@us.ibm.com>, | ||||||
|  | 	Adam Reznechek <adreznec@linux.vnet.ibm.com>, | ||||||
|  | 	Steven Royer <seroyer@linux.vnet.ibm.com>, | ||||||
|  | 	Bryant G. Ly <bryantly@linux.vnet.ibm.com>, | ||||||
|  | 
 | ||||||
|  | Introduction | ||||||
|  | ============ | ||||||
|  | 
 | ||||||
|  | Note: Knowledge of virtualization technology is required to understand | ||||||
|  | this document. | ||||||
|  | 
 | ||||||
|  | A good reference document would be: | ||||||
|  | 
 | ||||||
|  | https://openpowerfoundation.org/wp-content/uploads/2016/05/LoPAPR_DRAFT_v11_24March2016_cmt1.pdf | ||||||
|  | 
 | ||||||
|  | The Virtual Management Channel (VMC) is a logical device which provides an | ||||||
|  | interface between the hypervisor and a management partition. This interface | ||||||
|  | is like a message passing interface. This management partition is intended | ||||||
|  | to provide an alternative to systems that use a Hardware Management | ||||||
|  | Console (HMC) - based system management. | ||||||
|  | 
 | ||||||
|  | The primary hardware management solution that is developed by IBM relies | ||||||
|  | on an appliance server named the Hardware Management Console (HMC), | ||||||
|  | packaged as an external tower or rack-mounted personal computer. In a | ||||||
|  | Power Systems environment, a single HMC can manage multiple POWER | ||||||
|  | processor-based systems. | ||||||
|  | 
 | ||||||
|  | Management Application | ||||||
|  | ---------------------- | ||||||
|  | 
 | ||||||
|  | In the management partition, a management application exists which enables | ||||||
|  | a system administrator to configure the system’s partitioning | ||||||
|  | characteristics via a command line interface (CLI) or Representational | ||||||
|  | State Transfer Application (REST API's). | ||||||
|  | 
 | ||||||
|  | The management application runs on a Linux logical partition on a | ||||||
|  | POWER8 or newer processor-based server that is virtualized by PowerVM. | ||||||
|  | System configuration, maintenance, and control functions which | ||||||
|  | traditionally require an HMC can be implemented in the management | ||||||
|  | application using a combination of HMC to hypervisor interfaces and | ||||||
|  | existing operating system methods. This tool provides a subset of the | ||||||
|  | functions implemented by the HMC and enables basic partition configuration. | ||||||
|  | The set of HMC to hypervisor messages supported by the management | ||||||
|  | application component are passed to the hypervisor over a VMC interface, | ||||||
|  | which is defined below. | ||||||
|  | 
 | ||||||
|  | The VMC enables the management partition to provide basic partitioning | ||||||
|  | functions: | ||||||
|  | 
 | ||||||
|  | - Logical Partitioning Configuration | ||||||
|  | - Start, and stop actions for individual partitions | ||||||
|  | - Display of partition status | ||||||
|  | - Management of virtual Ethernet | ||||||
|  | - Management of virtual Storage | ||||||
|  | - Basic system management | ||||||
|  | 
 | ||||||
|  | Virtual Management Channel (VMC) | ||||||
|  | -------------------------------- | ||||||
|  | 
 | ||||||
|  | A logical device, called the Virtual Management Channel (VMC), is defined | ||||||
|  | for communicating between the management application and the hypervisor. It | ||||||
|  | basically creates the pipes that enable virtualization management | ||||||
|  | software. This device is presented to a designated management partition as | ||||||
|  | a virtual device. | ||||||
|  | 
 | ||||||
|  | This communication device uses Command/Response Queue (CRQ) and the | ||||||
|  | Remote Direct Memory Access (RDMA) interfaces. A three-way handshake is | ||||||
|  | defined that must take place to establish that both the hypervisor and | ||||||
|  | management partition sides of the channel are running prior to | ||||||
|  | sending/receiving any of the protocol messages. | ||||||
|  | 
 | ||||||
|  | This driver also utilizes Transport Event CRQs. CRQ messages are sent | ||||||
|  | when the hypervisor detects one of the peer partitions has abnormally | ||||||
|  | terminated, or one side has called H_FREE_CRQ to close their CRQ. | ||||||
|  | Two new classes of CRQ messages are introduced for the VMC device. VMC | ||||||
|  | Administrative messages are used for each partition using the VMC to | ||||||
|  | communicate capabilities to their partner. HMC Interface messages are used | ||||||
|  | for the actual flow of HMC messages between the management partition and | ||||||
|  | the hypervisor. As most HMC messages far exceed the size of a CRQ buffer, | ||||||
|  | a virtual DMA (RMDA) of the HMC message data is done prior to each HMC | ||||||
|  | Interface CRQ message. Only the management partition drives RDMA | ||||||
|  | operations; hypervisors never directly cause the movement of message data. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Terminology | ||||||
|  | ----------- | ||||||
|  | RDMA | ||||||
|  |         Remote Direct Memory Access is DMA transfer from the server to its | ||||||
|  |         client or from the server to its partner partition. DMA refers | ||||||
|  |         to both physical I/O to and from memory operations and to memory | ||||||
|  |         to memory move operations. | ||||||
|  | CRQ | ||||||
|  |         Command/Response Queue a facility which is used to communicate | ||||||
|  |         between partner partitions. Transport events which are signaled | ||||||
|  |         from the hypervisor to partition are also reported in this queue. | ||||||
|  | 
 | ||||||
|  | Example Management Partition VMC Driver Interface | ||||||
|  | ================================================= | ||||||
|  | 
 | ||||||
|  | This section provides an example for the management application | ||||||
|  | implementation where a device driver is used to interface to the VMC | ||||||
|  | device. This driver consists of a new device, for example /dev/ibmvmc, | ||||||
|  | which provides interfaces to open, close, read, write, and perform | ||||||
|  | ioctl’s against the VMC device. | ||||||
|  | 
 | ||||||
|  | VMC Interface Initialization | ||||||
|  | ---------------------------- | ||||||
|  | 
 | ||||||
|  | The device driver is responsible for initializing the VMC when the driver | ||||||
|  | is loaded. It first creates and initializes the CRQ. Next, an exchange of | ||||||
|  | VMC capabilities is performed to indicate the code version and number of | ||||||
|  | resources available in both the management partition and the hypervisor. | ||||||
|  | Finally, the hypervisor requests that the management partition create an | ||||||
|  | initial pool of VMC buffers, one buffer for each possible HMC connection, | ||||||
|  | which will be used for management application  session initialization. | ||||||
|  | Prior to completion of this initialization sequence, the device returns | ||||||
|  | EBUSY to open() calls. EIO is returned for all open() failures. | ||||||
|  | 
 | ||||||
|  | :: | ||||||
|  | 
 | ||||||
|  |         Management Partition		Hypervisor | ||||||
|  |                         CRQ INIT | ||||||
|  |         ----------------------------------------> | ||||||
|  |         	   CRQ INIT COMPLETE | ||||||
|  |         <---------------------------------------- | ||||||
|  |         	      CAPABILITIES | ||||||
|  |         ----------------------------------------> | ||||||
|  |         	 CAPABILITIES RESPONSE | ||||||
|  |         <---------------------------------------- | ||||||
|  |               ADD BUFFER (HMC IDX=0,1,..)         _ | ||||||
|  |         <----------------------------------------  | | ||||||
|  |         	  ADD BUFFER RESPONSE              | - Perform # HMCs Iterations | ||||||
|  |         ----------------------------------------> - | ||||||
|  | 
 | ||||||
|  | VMC Interface Open | ||||||
|  | ------------------ | ||||||
|  | 
 | ||||||
|  | After the basic VMC channel has been initialized, an HMC session level | ||||||
|  | connection can be established. The application layer performs an open() to | ||||||
|  | the VMC device and executes an ioctl() against it, indicating the HMC ID | ||||||
|  | (32 bytes of data) for this session. If the VMC device is in an invalid | ||||||
|  | state, EIO will be returned for the ioctl(). The device driver creates a | ||||||
|  | new HMC session value (ranging from 1 to 255) and HMC index value (starting | ||||||
|  | at index 0 and ranging to 254) for this HMC ID. The driver then does an | ||||||
|  | RDMA of the HMC ID to the hypervisor, and then sends an Interface Open | ||||||
|  | message to the hypervisor to establish the session over the VMC. After the | ||||||
|  | hypervisor receives this information, it sends Add Buffer messages to the | ||||||
|  | management partition to seed an initial pool of buffers for the new HMC | ||||||
|  | connection. Finally, the hypervisor sends an Interface Open Response | ||||||
|  | message, to indicate that it is ready for normal runtime messaging. The | ||||||
|  | following illustrates this VMC flow: | ||||||
|  | 
 | ||||||
|  | :: | ||||||
|  | 
 | ||||||
|  |         Management Partition             Hypervisor | ||||||
|  |         	      RDMA HMC ID | ||||||
|  |         ----------------------------------------> | ||||||
|  |         	    Interface Open | ||||||
|  |         ----------------------------------------> | ||||||
|  |         	      Add Buffer                  _ | ||||||
|  |         <----------------------------------------  | | ||||||
|  |         	  Add Buffer Response              | - Perform N Iterations | ||||||
|  |         ----------------------------------------> - | ||||||
|  |         	Interface Open Response | ||||||
|  |         <---------------------------------------- | ||||||
|  | 
 | ||||||
|  | VMC Interface Runtime | ||||||
|  | --------------------- | ||||||
|  | 
 | ||||||
|  | During normal runtime, the management application and the hypervisor | ||||||
|  | exchange HMC messages via the Signal VMC message and RDMA operations. When | ||||||
|  | sending data to the hypervisor, the management application performs a | ||||||
|  | write() to the VMC device, and the driver RDMA’s the data to the hypervisor | ||||||
|  | and then sends a Signal Message. If a write() is attempted before VMC | ||||||
|  | device buffers have been made available by the hypervisor, or no buffers | ||||||
|  | are currently available, EBUSY is returned in response to the write(). A | ||||||
|  | write() will return EIO for all other errors, such as an invalid device | ||||||
|  | state. When the hypervisor sends a message to the management, the data is | ||||||
|  | put into a VMC buffer and an Signal Message is sent to the VMC driver in | ||||||
|  | the management partition. The driver RDMA’s the buffer into the partition | ||||||
|  | and passes the data up to the appropriate management application via a | ||||||
|  | read() to the VMC device. The read() request blocks if there is no buffer | ||||||
|  | available to read. The management application may use select() to wait for | ||||||
|  | the VMC device to become ready with data to read. | ||||||
|  | 
 | ||||||
|  | :: | ||||||
|  | 
 | ||||||
|  |         Management Partition             Hypervisor | ||||||
|  |         		MSG RDMA | ||||||
|  |         ----------------------------------------> | ||||||
|  |         		SIGNAL MSG | ||||||
|  |         ----------------------------------------> | ||||||
|  |         		SIGNAL MSG | ||||||
|  |         <---------------------------------------- | ||||||
|  |         		MSG RDMA | ||||||
|  |         <---------------------------------------- | ||||||
|  | 
 | ||||||
|  | VMC Interface Close | ||||||
|  | ------------------- | ||||||
|  | 
 | ||||||
|  | HMC session level connections are closed by the management partition when | ||||||
|  | the application layer performs a close() against the device. This action | ||||||
|  | results in an Interface Close message flowing to the hypervisor, which | ||||||
|  | causes the session to be terminated. The device driver must free any | ||||||
|  | storage allocated for buffers for this HMC connection. | ||||||
|  | 
 | ||||||
|  | :: | ||||||
|  | 
 | ||||||
|  |         Management Partition             Hypervisor | ||||||
|  |         	     INTERFACE CLOSE | ||||||
|  |         ----------------------------------------> | ||||||
|  |                 INTERFACE CLOSE RESPONSE | ||||||
|  |         <---------------------------------------- | ||||||
|  | 
 | ||||||
|  | Additional Information | ||||||
|  | ====================== | ||||||
|  | 
 | ||||||
|  | For more information on the documentation for CRQ Messages, VMC Messages, | ||||||
|  | HMC interface Buffers, and signal messages please refer to the Linux on | ||||||
|  | Power Architecture Platform Reference. Section F. | ||||||
|  | @ -6757,6 +6757,12 @@ L:	linux-scsi@vger.kernel.org | ||||||
| S:	Supported | S:	Supported | ||||||
| F:	drivers/scsi/ibmvscsi/ibmvfc* | F:	drivers/scsi/ibmvscsi/ibmvfc* | ||||||
| 
 | 
 | ||||||
|  | IBM Power Virtual Management Channel Driver | ||||||
|  | M:	Bryant G. Ly <bryantly@linux.vnet.ibm.com> | ||||||
|  | M:	Steven Royer <seroyer@linux.vnet.ibm.com> | ||||||
|  | S:	Supported | ||||||
|  | F:	drivers/misc/ibmvmc.* | ||||||
|  | 
 | ||||||
| IBM Power Virtual SCSI Device Drivers | IBM Power Virtual SCSI Device Drivers | ||||||
| M:	Tyrel Datwyler <tyreld@linux.vnet.ibm.com> | M:	Tyrel Datwyler <tyreld@linux.vnet.ibm.com> | ||||||
| L:	linux-scsi@vger.kernel.org | L:	linux-scsi@vger.kernel.org | ||||||
|  |  | ||||||
|  | @ -279,6 +279,7 @@ | ||||||
| #define H_GET_MPP_X		0x314 | #define H_GET_MPP_X		0x314 | ||||||
| #define H_SET_MODE		0x31C | #define H_SET_MODE		0x31C | ||||||
| #define H_CLEAR_HPT		0x358 | #define H_CLEAR_HPT		0x358 | ||||||
|  | #define H_REQUEST_VMC		0x360 | ||||||
| #define H_RESIZE_HPT_PREPARE	0x36C | #define H_RESIZE_HPT_PREPARE	0x36C | ||||||
| #define H_RESIZE_HPT_COMMIT	0x370 | #define H_RESIZE_HPT_COMMIT	0x370 | ||||||
| #define H_REGISTER_PROC_TBL	0x37C | #define H_REGISTER_PROC_TBL	0x37C | ||||||
|  |  | ||||||
|  | @ -113,6 +113,20 @@ config IBM_ASM | ||||||
| 	  for information on the specific driver level and support statement | 	  for information on the specific driver level and support statement | ||||||
| 	  for your IBM server. | 	  for your IBM server. | ||||||
| 
 | 
 | ||||||
|  | config IBMVMC | ||||||
|  | 	tristate "IBM Virtual Management Channel support" | ||||||
|  | 	depends on PPC_PSERIES | ||||||
|  | 	help | ||||||
|  | 	  This is the IBM POWER Virtual Management Channel | ||||||
|  | 
 | ||||||
|  | 	  This driver is to be used for the POWER Virtual | ||||||
|  | 	  Management Channel virtual adapter on the PowerVM | ||||||
|  | 	  platform. It provides both request/response and | ||||||
|  | 	  async message support through the /dev/ibmvmc node. | ||||||
|  | 
 | ||||||
|  | 	  To compile this driver as a module, choose M here: the | ||||||
|  | 	  module will be called ibmvmc. | ||||||
|  | 
 | ||||||
| config PHANTOM | config PHANTOM | ||||||
| 	tristate "Sensable PHANToM (PCI)" | 	tristate "Sensable PHANToM (PCI)" | ||||||
| 	depends on PCI | 	depends on PCI | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #
 | #
 | ||||||
| 
 | 
 | ||||||
| obj-$(CONFIG_IBM_ASM)		+= ibmasm/ | obj-$(CONFIG_IBM_ASM)		+= ibmasm/ | ||||||
|  | obj-$(CONFIG_IBMVMC)		+= ibmvmc.o | ||||||
| obj-$(CONFIG_AD525X_DPOT)	+= ad525x_dpot.o | obj-$(CONFIG_AD525X_DPOT)	+= ad525x_dpot.o | ||||||
| obj-$(CONFIG_AD525X_DPOT_I2C)	+= ad525x_dpot-i2c.o | obj-$(CONFIG_AD525X_DPOT_I2C)	+= ad525x_dpot-i2c.o | ||||||
| obj-$(CONFIG_AD525X_DPOT_SPI)	+= ad525x_dpot-spi.o | obj-$(CONFIG_AD525X_DPOT_SPI)	+= ad525x_dpot-spi.o | ||||||
|  |  | ||||||
							
								
								
									
										2418
									
								
								drivers/misc/ibmvmc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2418
									
								
								drivers/misc/ibmvmc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										209
									
								
								drivers/misc/ibmvmc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								drivers/misc/ibmvmc.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,209 @@ | ||||||
|  | /* SPDX-License-Identifier: GPL-2.0+
 | ||||||
|  |  * | ||||||
|  |  * linux/drivers/misc/ibmvmc.h | ||||||
|  |  * | ||||||
|  |  * IBM Power Systems Virtual Management Channel Support. | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2004, 2018 IBM Corp. | ||||||
|  |  *   Dave Engebretsen engebret@us.ibm.com | ||||||
|  |  *   Steven Royer seroyer@linux.vnet.ibm.com | ||||||
|  |  *   Adam Reznechek adreznec@linux.vnet.ibm.com | ||||||
|  |  *   Bryant G. Ly <bryantly@linux.vnet.ibm.com> | ||||||
|  |  */ | ||||||
|  | #ifndef IBMVMC_H | ||||||
|  | #define IBMVMC_H | ||||||
|  | 
 | ||||||
|  | #include <linux/types.h> | ||||||
|  | #include <linux/cdev.h> | ||||||
|  | 
 | ||||||
|  | #include <asm/vio.h> | ||||||
|  | 
 | ||||||
|  | #define IBMVMC_PROTOCOL_VERSION    0x0101 | ||||||
|  | 
 | ||||||
|  | #define MIN_BUF_POOL_SIZE 16 | ||||||
|  | #define MIN_HMCS          1 | ||||||
|  | #define MIN_MTU           4096 | ||||||
|  | #define MAX_BUF_POOL_SIZE 64 | ||||||
|  | #define MAX_HMCS          2 | ||||||
|  | #define MAX_MTU           (4 * 4096) | ||||||
|  | #define DEFAULT_BUF_POOL_SIZE 32 | ||||||
|  | #define DEFAULT_HMCS          1 | ||||||
|  | #define DEFAULT_MTU           4096 | ||||||
|  | #define HMC_ID_LEN        32 | ||||||
|  | 
 | ||||||
|  | #define VMC_INVALID_BUFFER_ID 0xFFFF | ||||||
|  | 
 | ||||||
|  | /* ioctl numbers */ | ||||||
|  | #define VMC_BASE	     0xCC | ||||||
|  | #define VMC_IOCTL_SETHMCID   _IOW(VMC_BASE, 0x00, unsigned char *) | ||||||
|  | #define VMC_IOCTL_QUERY      _IOR(VMC_BASE, 0x01, struct ibmvmc_query_struct) | ||||||
|  | #define VMC_IOCTL_REQUESTVMC _IOR(VMC_BASE, 0x02, u32) | ||||||
|  | 
 | ||||||
|  | #define VMC_MSG_CAP          0x01 | ||||||
|  | #define VMC_MSG_CAP_RESP     0x81 | ||||||
|  | #define VMC_MSG_OPEN         0x02 | ||||||
|  | #define VMC_MSG_OPEN_RESP    0x82 | ||||||
|  | #define VMC_MSG_CLOSE        0x03 | ||||||
|  | #define VMC_MSG_CLOSE_RESP   0x83 | ||||||
|  | #define VMC_MSG_ADD_BUF      0x04 | ||||||
|  | #define VMC_MSG_ADD_BUF_RESP 0x84 | ||||||
|  | #define VMC_MSG_REM_BUF      0x05 | ||||||
|  | #define VMC_MSG_REM_BUF_RESP 0x85 | ||||||
|  | #define VMC_MSG_SIGNAL       0x06 | ||||||
|  | 
 | ||||||
|  | #define VMC_MSG_SUCCESS 0 | ||||||
|  | #define VMC_MSG_INVALID_HMC_INDEX 1 | ||||||
|  | #define VMC_MSG_INVALID_BUFFER_ID 2 | ||||||
|  | #define VMC_MSG_CLOSED_HMC        3 | ||||||
|  | #define VMC_MSG_INTERFACE_FAILURE 4 | ||||||
|  | #define VMC_MSG_NO_BUFFER         5 | ||||||
|  | 
 | ||||||
|  | #define VMC_BUF_OWNER_ALPHA 0 | ||||||
|  | #define VMC_BUF_OWNER_HV    1 | ||||||
|  | 
 | ||||||
|  | enum ibmvmc_states { | ||||||
|  | 	ibmvmc_state_sched_reset  = -1, | ||||||
|  | 	ibmvmc_state_initial      = 0, | ||||||
|  | 	ibmvmc_state_crqinit      = 1, | ||||||
|  | 	ibmvmc_state_capabilities = 2, | ||||||
|  | 	ibmvmc_state_ready        = 3, | ||||||
|  | 	ibmvmc_state_failed       = 4, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | enum ibmhmc_states { | ||||||
|  | 	/* HMC connection not established */ | ||||||
|  | 	ibmhmc_state_free    = 0, | ||||||
|  | 
 | ||||||
|  | 	/* HMC connection established (open called) */ | ||||||
|  | 	ibmhmc_state_initial = 1, | ||||||
|  | 
 | ||||||
|  | 	/* open msg sent to HV, due to ioctl(1) call */ | ||||||
|  | 	ibmhmc_state_opening = 2, | ||||||
|  | 
 | ||||||
|  | 	/* HMC connection ready, open resp msg from HV */ | ||||||
|  | 	ibmhmc_state_ready   = 3, | ||||||
|  | 
 | ||||||
|  | 	/* HMC connection failure */ | ||||||
|  | 	ibmhmc_state_failed  = 4, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ibmvmc_buffer { | ||||||
|  | 	u8 valid;	/* 1 when DMA storage allocated to buffer          */ | ||||||
|  | 	u8 free;	/* 1 when buffer available for the Alpha Partition */ | ||||||
|  | 	u8 owner; | ||||||
|  | 	u16 id; | ||||||
|  | 	u32 size; | ||||||
|  | 	u32 msg_len; | ||||||
|  | 	dma_addr_t dma_addr_local; | ||||||
|  | 	dma_addr_t dma_addr_remote; | ||||||
|  | 	void *real_addr_local; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ibmvmc_admin_crq_msg { | ||||||
|  | 	u8 valid;	/* RPA Defined           */ | ||||||
|  | 	u8 type;	/* ibmvmc msg type       */ | ||||||
|  | 	u8 status;	/* Response msg status. Zero is success and on failure,
 | ||||||
|  | 			 * either 1 - General Failure, or 2 - Invalid Version is | ||||||
|  | 			 * returned. | ||||||
|  | 			 */ | ||||||
|  | 	u8 rsvd[2]; | ||||||
|  | 	u8 max_hmc;	/* Max # of independent HMC connections supported */ | ||||||
|  | 	__be16 pool_size;	/* Maximum number of buffers supported per HMC
 | ||||||
|  | 				 * connection | ||||||
|  | 				 */ | ||||||
|  | 	__be32 max_mtu;		/* Maximum message size supported (bytes) */ | ||||||
|  | 	__be16 crq_size;	/* # of entries available in the CRQ for the
 | ||||||
|  | 				 * source partition. The target partition must | ||||||
|  | 				 * limit the number of outstanding messages to | ||||||
|  | 				 * one half or less. | ||||||
|  | 				 */ | ||||||
|  | 	__be16 version;	/* Indicates the code level of the management partition
 | ||||||
|  | 			 * or the hypervisor with the high-order byte | ||||||
|  | 			 * indicating a major version and the low-order byte | ||||||
|  | 			 * indicating a minor version. | ||||||
|  | 			 */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ibmvmc_crq_msg { | ||||||
|  | 	u8 valid;     /* RPA Defined           */ | ||||||
|  | 	u8 type;      /* ibmvmc msg type       */ | ||||||
|  | 	u8 status;    /* Response msg status   */ | ||||||
|  | 	union { | ||||||
|  | 		u8 rsvd;  /* Reserved              */ | ||||||
|  | 		u8 owner; | ||||||
|  | 	} var1; | ||||||
|  | 	u8 hmc_session;	/* Session Identifier for the current VMC connection */ | ||||||
|  | 	u8 hmc_index;	/* A unique HMC Idx would be used if multiple management
 | ||||||
|  | 			 * applications running concurrently were desired | ||||||
|  | 			 */ | ||||||
|  | 	union { | ||||||
|  | 		__be16 rsvd; | ||||||
|  | 		__be16 buffer_id; | ||||||
|  | 	} var2; | ||||||
|  | 	__be32 rsvd; | ||||||
|  | 	union { | ||||||
|  | 		__be32 rsvd; | ||||||
|  | 		__be32 lioba; | ||||||
|  | 		__be32 msg_len; | ||||||
|  | 	} var3; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* an RPA command/response transport queue */ | ||||||
|  | struct crq_queue { | ||||||
|  | 	struct ibmvmc_crq_msg *msgs; | ||||||
|  | 	int size, cur; | ||||||
|  | 	dma_addr_t msg_token; | ||||||
|  | 	spinlock_t lock; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* VMC server adapter settings */ | ||||||
|  | struct crq_server_adapter { | ||||||
|  | 	struct device *dev; | ||||||
|  | 	struct crq_queue queue; | ||||||
|  | 	u32 liobn; | ||||||
|  | 	u32 riobn; | ||||||
|  | 	struct tasklet_struct work_task; | ||||||
|  | 	wait_queue_head_t reset_wait_queue; | ||||||
|  | 	struct task_struct *reset_task; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Driver wide settings */ | ||||||
|  | struct ibmvmc_struct { | ||||||
|  | 	u32 state; | ||||||
|  | 	u32 max_mtu; | ||||||
|  | 	u32 max_buffer_pool_size; | ||||||
|  | 	u32 max_hmc_index; | ||||||
|  | 	struct crq_server_adapter *adapter; | ||||||
|  | 	struct cdev cdev; | ||||||
|  | 	u32 vmc_drc_index; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ibmvmc_file_session; | ||||||
|  | 
 | ||||||
|  | /* Connection specific settings */ | ||||||
|  | struct ibmvmc_hmc { | ||||||
|  | 	u8 session; | ||||||
|  | 	u8 index; | ||||||
|  | 	u32 state; | ||||||
|  | 	struct crq_server_adapter *adapter; | ||||||
|  | 	spinlock_t lock; | ||||||
|  | 	unsigned char hmc_id[HMC_ID_LEN]; | ||||||
|  | 	struct ibmvmc_buffer buffer[MAX_BUF_POOL_SIZE]; | ||||||
|  | 	unsigned short queue_outbound_msgs[MAX_BUF_POOL_SIZE]; | ||||||
|  | 	int queue_head, queue_tail; | ||||||
|  | 	struct ibmvmc_file_session *file_session; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ibmvmc_file_session { | ||||||
|  | 	struct file *file; | ||||||
|  | 	struct ibmvmc_hmc *hmc; | ||||||
|  | 	bool valid; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ibmvmc_query_struct { | ||||||
|  | 	int have_vmc; | ||||||
|  | 	int state; | ||||||
|  | 	int vmc_drc_index; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif /* __IBMVMC_H */ | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bryant G. Ly
						Bryant G. Ly