open-gpu-kernel-modules/kernel-open/nvidia/ioctl_common_nvswitch.h
2022-05-09 13:18:59 -07:00

145 lines
6.1 KiB
C

/*
* SPDX-FileCopyrightText: Copyright (c) 2019 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef _IOCTL_COMMON_NVSWITCH_H_
#define _IOCTL_COMMON_NVSWITCH_H_
#ifdef __cplusplus
extern "C"
{
#endif
#define NVSWITCH_DEV_IO_TYPE 'd'
#define NVSWITCH_CTL_IO_TYPE 'c'
/*
* Defines for IOCTL Hints
*
* NVSWITCH_IO_READ_ONLY :
* Only reads parameters from the kernel and does not pass any to it
*
* NVSWITCH_IO_WRITE_ONLY :
* Only writes parameters to the kernel, but does not want anything back.
*
* NVSWITCH_IO_WRITE_READ :
* Writes data to the kernel and wants information back
*
* NVSWITCH_IO_DEFAULT :
* Don't copy anything into the kernel, nor copy anything back.
*/
#define NVSWITCH_IO_READ_ONLY 0x0
#define NVSWITCH_IO_WRITE_ONLY 0x1
#define NVSWITCH_IO_WRITE_READ 0x2
#define NVSWITCH_IO_DEFAULT 0x3
#if (defined(_WIN32) || defined(_WIN64))
/*
* Values of less than 0x800 are reserved for Microsoft.
* Values of 0x800 and higher can be used by vendors.
*/
#define IOCTL_START_INDEX 0x800
/*
* Macro for defining new IOCTLs in a platform independent way.
*/
#define NVSWITCH_IOCTL_CODE(ioType, ctrl, paramType, direction) \
CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_START_INDEX + ctrl, METHOD_BUFFERED, \
(FILE_READ_DATA | FILE_WRITE_DATA))
#else
/*
* Macro for defining new IOCTLs in a platform independent way.
*
* Select Linux specific IOCTL defining macro (_IO, _IOR, _IOW, _IOWR)
* based on IOCTL direction.
*/
#define NVSWITCH_IOCTL_CODE(ioType, ctrl, paramType, direction) \
((direction == NVSWITCH_IO_READ_ONLY) ? _IOR(ioType, ctrl, paramType) : \
(direction == NVSWITCH_IO_WRITE_ONLY) ? _IOW(ioType, ctrl, paramType) : \
(direction == NVSWITCH_IO_WRITE_READ) ? _IOWR(ioType, ctrl, paramType) : \
_IO(ioType, ctrl))
#endif // (defined(_WIN32) || defined(_WIN64))
/*
* NVSWITCH_NVLINK_MAX_LANES is used by both internal and exteranl IOCTLs.
*/
#define NVSWITCH_NVLINK_MAX_LANES 4
/*
* Common Fabric State enums
*
* Definitions:
* Driver Fabric State is intended to reflect the state of the driver and
* fabric manager. Once FM sets the Driver State to CONFIGURED, it is
* expected the FM will send heartbeat updates. If the heartbeat is not
* received before the session timeout, then the driver reports status
* as MANAGER_TIMEOUT.
*
* Device Fabric State reflects the state of the nvswitch device.
* FM sets the Device Fabric State to CONFIGURED once FM is managing the
* device. If the Device Fabric State is BLACKLISTED then the device is
* not available for use; opens fail for a blacklisted device, and interrupts
* are disabled.
*
* Blacklist Reason provides additional detail of why a device is blacklisted.
*/
typedef enum nvswitch_driver_fabric_state
{
NVSWITCH_DRIVER_FABRIC_STATE_OFFLINE = 0, // offline (No driver loaded)
NVSWITCH_DRIVER_FABRIC_STATE_STANDBY, // driver up, no FM
NVSWITCH_DRIVER_FABRIC_STATE_CONFIGURED, // driver up, FM up
NVSWITCH_DRIVER_FABRIC_STATE_MANAGER_TIMEOUT, // driver up, FM timed out
NVSWITCH_DRIVER_FABRIC_STATE_MANAGER_ERROR, // driver up, FM in error state
NVSWITCH_DRIVER_FABRIC_STATE_COUNT
} NVSWITCH_DRIVER_FABRIC_STATE;
typedef enum nvswitch_device_fabric_state
{
NVSWITCH_DEVICE_FABRIC_STATE_OFFLINE = 0, // offline: No driver, no FM
NVSWITCH_DEVICE_FABRIC_STATE_STANDBY, // driver up, no FM, not blacklisted
NVSWITCH_DEVICE_FABRIC_STATE_CONFIGURED, // driver up, FM up, not blacklisted
NVSWITCH_DEVICE_FABRIC_STATE_BLACKLISTED, // device is blacklisted
NVSWITCH_DEVICE_FABRIC_STATE_COUNT
} NVSWITCH_DEVICE_FABRIC_STATE;
typedef enum nvswitch_device_blacklist_mode
{
NVSWITCH_DEVICE_BLACKLIST_REASON_NONE = 0, // device is not blacklisted
NVSWITCH_DEVICE_BLACKLIST_REASON_MANUAL_OUT_OF_BAND, // manually blacklisted by out-of-band client
NVSWITCH_DEVICE_BLACKLIST_REASON_MANUAL_IN_BAND, // manually blacklisted by in-band OS config
NVSWITCH_DEVICE_BLACKLIST_REASON_MANUAL_PEER, // FM indicates blacklisted due to peer manual blacklisted
NVSWITCH_DEVICE_BLACKLIST_REASON_TRUNK_LINK_FAILURE, // FM indicates blacklisted due to trunk link failure
NVSWITCH_DEVICE_BLACKLIST_REASON_TRUNK_LINK_FAILURE_PEER, // FM indicates blacklisted due to trunk link failure of peer
NVSWITCH_DEVICE_BLACKLIST_REASON_ACCESS_LINK_FAILURE, // FM indicates blacklisted due to access link failure
NVSWITCH_DEVICE_BLACKLIST_REASON_ACCESS_LINK_FAILURE_PEER, // FM indicates blacklisted due to access link failure of peer
NVSWITCH_DEVICE_BLACKLIST_REASON_UNSPEC_DEVICE_FAILURE, // FM indicates blacklisted due to unspecified device failure
NVSWITCH_DEVICE_BLACKLIST_REASON_UNSPEC_DEVICE_FAILURE_PEER // FM indicates blacklisted due to unspec device failure of peer
} NVSWITCH_DEVICE_BLACKLIST_REASON;
#ifdef __cplusplus
}
#endif // __cplusplus
#endif //_IOCTL_COMMON_NVSWITCH_H_