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

239 lines
6.8 KiB
C

/*
* SPDX-FileCopyrightText: Copyright (c) 2017-2022 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_NVSWITCH_H_
#define _IOCTL_NVSWITCH_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include "ioctl_common_nvswitch.h"
#include "nvCpuUuid.h"
/* 4 chars for "SWX-" prefix + 36 chars for UUID string + 1 char for '\0' */
#define NVSWITCH_UUID_STRING_LENGTH 41
#define NVSWITCH_NIBBLE_TO_CHAR(nibble) \
(((nibble) > 9) ? (((nibble) - 10) + 'A') : ((nibble) + '0'))
static NV_INLINE
NvU32 nvswitch_uuid_to_string(NvUuid *uuid, char *str, NvU32 strLen)
{
int i;
int j = 0;
if ((uuid == NULL) || (str == NULL) || (strLen < NVSWITCH_UUID_STRING_LENGTH))
{
return 0;
}
str[j++] = 'S';
str[j++] = 'W';
str[j++] = 'X';
str[j++] = '-';
for (i = 0; i < NV_UUID_LEN; i++)
{
if ((i == 4) || (i == 6) || (i == 8) || (i == 10))
{
str[j++] = '-';
}
str[j++] = NVSWITCH_NIBBLE_TO_CHAR((uuid->uuid[i] & 0xF0) >> 4);
str[j++] = NVSWITCH_NIBBLE_TO_CHAR(uuid->uuid[i] & 0x0F);
}
str[j++] = '\0';
return j;
}
/*
* This file defines IOCTL calls that work with nvidia-nvswitchctl
* (device agnostic) node.
*/
#define NVSWITCH_VERSION_STRING_LENGTH 64
/*
* Version string
*/
typedef struct
{
char version[NVSWITCH_VERSION_STRING_LENGTH];
} NVSWITCH_VERSION;
/*
* NVSWITCH_CTL_CHECK_VERSION
*
* The interface will check if the client's version is supported by the driver.
*
* Parameters:
* user[in]
* Version of the interface that the client is compiled with.
* kernel[out]
* Version of the interface that the kernel driver is compiled with.
* is_compatible[out]
* Set to true, if user and kernel version are compatible.
*/
typedef struct
{
NVSWITCH_VERSION user;
NVSWITCH_VERSION kernel;
NvBool is_compatible;
} NVSWITCH_CHECK_VERSION_PARAMS;
/*
* Max devices supported by the driver
*
* See ctrl_dev_nvswitch.h for preprocessor definition modification guidelines.
*/
#define NVSWITCH_MAX_DEVICES 64
/*
* NVSWITCH_CTL_GET_DEVICES
*
* This control call will be removed soon. Use NVSWITCH_CTL_GET_DEVICES_V2 instead.
*
* Provides information about registered NvSwitch devices.
*
* Parameters:
* deviceInstance[out]
* Device instance of the device. This is same as the device minor number
* for Linux platforms.
*/
typedef struct
{
NvU32 deviceInstance;
NvU32 pciDomain;
NvU32 pciBus;
NvU32 pciDevice;
NvU32 pciFunction;
/* See ctrl_dev_nvswitch.h for struct definition modification guidelines */
} NVSWITCH_DEVICE_INSTANCE_INFO;
typedef struct
{
NvU32 deviceCount;
NVSWITCH_DEVICE_INSTANCE_INFO info[NVSWITCH_MAX_DEVICES];
/* See ctrl_dev_nvswitch.h for struct definition modification guidelines */
} NVSWITCH_GET_DEVICES_PARAMS;
/*
* NVSWITCH_CTL_GET_DEVICES_V2
*
* Provides information about registered NvSwitch devices.
* V2 adds a UUID field to the device instance info struct
*
* Parameters:
* deviceInstance[out]
* Device instance of the device. This is same as the device minor number
* for Linux platforms.
*/
typedef struct
{
NvU32 deviceInstance;
NvUuid uuid;
NvU32 pciDomain;
NvU32 pciBus;
NvU32 pciDevice;
NvU32 pciFunction;
NVSWITCH_DRIVER_FABRIC_STATE driverState;
NVSWITCH_DEVICE_FABRIC_STATE deviceState;
NVSWITCH_DEVICE_BLACKLIST_REASON deviceReason;
NvU32 physId;
/* See ctrl_dev_nvswitch.h for struct definition modification guidelines */
} NVSWITCH_DEVICE_INSTANCE_INFO_V2;
#define NVSWITCH_INVALID_PHYS_ID NV_U32_MAX
typedef struct
{
NvU32 deviceCount;
NVSWITCH_DEVICE_INSTANCE_INFO_V2 info[NVSWITCH_MAX_DEVICES];
/* See ctrl_dev_nvswitch.h for struct definition modification guidelines */
} NVSWITCH_GET_DEVICES_V2_PARAMS;
#define NVSWITCH_DEVICE_NAME_STRING_LENGTH 10
/*
* CTRL_NVSWITCH_GET_DEVICE_NODES
*
* Provides a mapping of the VMWare kernel device names (vmfgx[N]) and registered
* NVSwitch devices (nvidia-nvswitch[N]).
*
* This IOCTL is only implemented for VMWare.
*
* Parameters:
* deviceInstance[out]
* Device instance of the device. This is same as the device minor number
* for VMWare platforms.
* dev_name[out]
* VMWare kernel device name of the nvswitch device (vmfgx[N])
*/
typedef struct
{
NvU32 deviceInstance;
NvUuid uuid;
NvU8 dev_name[NVSWITCH_DEVICE_NAME_STRING_LENGTH];
/* See ctrl_dev_nvswitch.h for struct definition modification guidelines */
} NVSWITCH_DEVICE_NODE_INFO;
typedef struct
{
NvU32 deviceCount;
NVSWITCH_DEVICE_NODE_INFO info[NVSWITCH_MAX_DEVICES];
/* See ctrl_dev_nvswitch.h for struct definition modification guidelines */
} NVSWITCH_GET_DEVICE_NODES_PARAMS;
#define CTRL_NVSWITCH_GET_DEVICES 0x01
#define CTRL_NVSWITCH_CHECK_VERSION 0x02
#define CTRL_NVSWITCH_GET_DEVICES_V2 0x03
#define CTRL_NVSWITCH_GET_DEVICE_NODES 0x04
/*
* Nvswitchctl (device agnostic) IOCTLs
*/
#define IOCTL_NVSWITCH_GET_DEVICES \
NVSWITCH_IOCTL_CODE(NVSWITCH_CTL_IO_TYPE, CTRL_NVSWITCH_GET_DEVICES, NVSWITCH_GET_DEVICES_PARAMS, \
NVSWITCH_IO_READ_ONLY)
#define IOCTL_NVSWITCH_CHECK_VERSION \
NVSWITCH_IOCTL_CODE(NVSWITCH_CTL_IO_TYPE, CTRL_NVSWITCH_CHECK_VERSION, NVSWITCH_CHECK_VERSION_PARAMS, \
NVSWITCH_IO_WRITE_READ)
#define IOCTL_NVSWITCH_GET_DEVICES_V2 \
NVSWITCH_IOCTL_CODE(NVSWITCH_CTL_IO_TYPE, CTRL_NVSWITCH_GET_DEVICES_V2, NVSWITCH_GET_DEVICES_V2_PARAMS, \
NVSWITCH_IO_READ_ONLY)
#define IOCTL_NVSWITCH_GET_DEVICE_NODES \
NVSWITCH_IOCTL_CODE(NVSWITCH_CTL_IO_TYPE, CTRL_NVSWITCH_GET_DEVICE_NODES, NVSWITCH_GET_DEVICE_NODES_PARAMS, \
NVSWITCH_IO_READ_ONLY)
#ifdef __cplusplus
}
#endif
#endif //_IOCTL_NVSWITCH_H_