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
|
@ -327,6 +327,7 @@ Code Seq#(hex) Include File Comments
|
|||
0xCA 80-BF uapi/scsi/cxlflash_ioctl.h
|
||||
0xCB 00-1F CBM serial IEC bus in development:
|
||||
<mailto:michael.klein@puffin.lb.shuttle.de>
|
||||
0xCC 00-0F drivers/misc/ibmvmc.h pseries VMC driver
|
||||
0xCD 01 linux/reiserfs_fs.h
|
||||
0xCF 02 fs/cifs/ioctl.c
|
||||
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
|
||||
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
|
||||
M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
|
|
|
@ -279,6 +279,7 @@
|
|||
#define H_GET_MPP_X 0x314
|
||||
#define H_SET_MODE 0x31C
|
||||
#define H_CLEAR_HPT 0x358
|
||||
#define H_REQUEST_VMC 0x360
|
||||
#define H_RESIZE_HPT_PREPARE 0x36C
|
||||
#define H_RESIZE_HPT_COMMIT 0x370
|
||||
#define H_REGISTER_PROC_TBL 0x37C
|
||||
|
|
|
@ -113,6 +113,20 @@ config IBM_ASM
|
|||
for information on the specific driver level and support statement
|
||||
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
|
||||
tristate "Sensable PHANToM (PCI)"
|
||||
depends on PCI
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#
|
||||
|
||||
obj-$(CONFIG_IBM_ASM) += ibmasm/
|
||||
obj-$(CONFIG_IBMVMC) += ibmvmc.o
|
||||
obj-$(CONFIG_AD525X_DPOT) += ad525x_dpot.o
|
||||
obj-$(CONFIG_AD525X_DPOT_I2C) += ad525x_dpot-i2c.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