mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Initial files for adding a new fwctl driver for the AMD/Pensando PDS devices. This sets up a simple auxiliary_bus driver that registers with fwctl subsystem. It expects that a pds_core device has set up the auxiliary_device pds_core.fwctl Link: https://patch.msgid.link/r/20250320194412.67983-5-shannon.nelson@amd.com Reviewed-by: Leon Romanovsky <leonro@nvidia.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
141 lines
4.6 KiB
C
141 lines
4.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
/* Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES.
|
|
*/
|
|
#ifndef _UAPI_FWCTL_H
|
|
#define _UAPI_FWCTL_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/ioctl.h>
|
|
|
|
#define FWCTL_TYPE 0x9A
|
|
|
|
/**
|
|
* DOC: General ioctl format
|
|
*
|
|
* The ioctl interface follows a general format to allow for extensibility. Each
|
|
* ioctl is passed a structure pointer as the argument providing the size of
|
|
* the structure in the first u32. The kernel checks that any structure space
|
|
* beyond what it understands is 0. This allows userspace to use the backward
|
|
* compatible portion while consistently using the newer, larger, structures.
|
|
*
|
|
* ioctls use a standard meaning for common errnos:
|
|
*
|
|
* - ENOTTY: The IOCTL number itself is not supported at all
|
|
* - E2BIG: The IOCTL number is supported, but the provided structure has
|
|
* non-zero in a part the kernel does not understand.
|
|
* - EOPNOTSUPP: The IOCTL number is supported, and the structure is
|
|
* understood, however a known field has a value the kernel does not
|
|
* understand or support.
|
|
* - EINVAL: Everything about the IOCTL was understood, but a field is not
|
|
* correct.
|
|
* - ENOMEM: Out of memory.
|
|
* - ENODEV: The underlying device has been hot-unplugged and the FD is
|
|
* orphaned.
|
|
*
|
|
* As well as additional errnos, within specific ioctls.
|
|
*/
|
|
enum {
|
|
FWCTL_CMD_BASE = 0,
|
|
FWCTL_CMD_INFO = 0,
|
|
FWCTL_CMD_RPC = 1,
|
|
};
|
|
|
|
enum fwctl_device_type {
|
|
FWCTL_DEVICE_TYPE_ERROR = 0,
|
|
FWCTL_DEVICE_TYPE_MLX5 = 1,
|
|
FWCTL_DEVICE_TYPE_CXL = 2,
|
|
FWCTL_DEVICE_TYPE_PDS = 4,
|
|
};
|
|
|
|
/**
|
|
* struct fwctl_info - ioctl(FWCTL_INFO)
|
|
* @size: sizeof(struct fwctl_info)
|
|
* @flags: Must be 0
|
|
* @out_device_type: Returns the type of the device from enum fwctl_device_type
|
|
* @device_data_len: On input the length of the out_device_data memory. On
|
|
* output the size of the kernel's device_data which may be larger or
|
|
* smaller than the input. Maybe 0 on input.
|
|
* @out_device_data: Pointer to a memory of device_data_len bytes. Kernel will
|
|
* fill the entire memory, zeroing as required.
|
|
*
|
|
* Returns basic information about this fwctl instance, particularly what driver
|
|
* is being used to define the device_data format.
|
|
*/
|
|
struct fwctl_info {
|
|
__u32 size;
|
|
__u32 flags;
|
|
__u32 out_device_type;
|
|
__u32 device_data_len;
|
|
__aligned_u64 out_device_data;
|
|
};
|
|
#define FWCTL_INFO _IO(FWCTL_TYPE, FWCTL_CMD_INFO)
|
|
|
|
/**
|
|
* enum fwctl_rpc_scope - Scope of access for the RPC
|
|
*
|
|
* Refer to fwctl.rst for a more detailed discussion of these scopes.
|
|
*/
|
|
enum fwctl_rpc_scope {
|
|
/**
|
|
* @FWCTL_RPC_CONFIGURATION: Device configuration access scope
|
|
*
|
|
* Read/write access to device configuration. When configuration
|
|
* is written to the device it remains in a fully supported state.
|
|
*/
|
|
FWCTL_RPC_CONFIGURATION = 0,
|
|
/**
|
|
* @FWCTL_RPC_DEBUG_READ_ONLY: Read only access to debug information
|
|
*
|
|
* Readable debug information. Debug information is compatible with
|
|
* kernel lockdown, and does not disclose any sensitive information. For
|
|
* instance exposing any encryption secrets from this information is
|
|
* forbidden.
|
|
*/
|
|
FWCTL_RPC_DEBUG_READ_ONLY = 1,
|
|
/**
|
|
* @FWCTL_RPC_DEBUG_WRITE: Writable access to lockdown compatible debug information
|
|
*
|
|
* Allows write access to data in the device which may leave a fully
|
|
* supported state. This is intended to permit intensive and possibly
|
|
* invasive debugging. This scope will taint the kernel.
|
|
*/
|
|
FWCTL_RPC_DEBUG_WRITE = 2,
|
|
/**
|
|
* @FWCTL_RPC_DEBUG_WRITE_FULL: Write access to all debug information
|
|
*
|
|
* Allows read/write access to everything. Requires CAP_SYS_RAW_IO, so
|
|
* it is not required to follow lockdown principals. If in doubt
|
|
* debugging should be placed in this scope. This scope will taint the
|
|
* kernel.
|
|
*/
|
|
FWCTL_RPC_DEBUG_WRITE_FULL = 3,
|
|
};
|
|
|
|
/**
|
|
* struct fwctl_rpc - ioctl(FWCTL_RPC)
|
|
* @size: sizeof(struct fwctl_rpc)
|
|
* @scope: One of enum fwctl_rpc_scope, required scope for the RPC
|
|
* @in_len: Length of the in memory
|
|
* @out_len: Length of the out memory
|
|
* @in: Request message in device specific format
|
|
* @out: Response message in device specific format
|
|
*
|
|
* Deliver a Remote Procedure Call to the device FW and return the response. The
|
|
* call's parameters and return are marshaled into linear buffers of memory. Any
|
|
* errno indicates that delivery of the RPC to the device failed. Return status
|
|
* originating in the device during a successful delivery must be encoded into
|
|
* out.
|
|
*
|
|
* The format of the buffers matches the out_device_type from FWCTL_INFO.
|
|
*/
|
|
struct fwctl_rpc {
|
|
__u32 size;
|
|
__u32 scope;
|
|
__u32 in_len;
|
|
__u32 out_len;
|
|
__aligned_u64 in;
|
|
__aligned_u64 out;
|
|
};
|
|
#define FWCTL_RPC _IO(FWCTL_TYPE, FWCTL_CMD_RPC)
|
|
|
|
#endif
|