207 lines
7.9 KiB
C
207 lines
7.9 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
||
/**
|
||
* Copyright (c) 2024-2025 CALCULET Technologies Ltd. All rights reserved.
|
||
*/
|
||
|
||
#ifndef _CALCULET_IOCTL_H_
|
||
#define _CALCULET_IOCTL_H_
|
||
|
||
#define CALCULET_DRV_VER_MAJOR 1
|
||
#define CALCULET_DRV_VER_MINOR 0
|
||
#define CALCULET_DRV_VER_REVISION 0
|
||
|
||
#define _STRINGIFY_EXPANDED( x ) #x
|
||
#define _STRINGIFY_NUMBER( x ) _STRINGIFY_EXPANDED(x)
|
||
#define CALCULET_DRV_VER _STRINGIFY_NUMBER(CALCULET_DRV_VER_MAJOR) "." _STRINGIFY_NUMBER(CALCULET_DRV_VER_MINOR) "." _STRINGIFY_NUMBER(CALCULET_DRV_VER_REVISION)
|
||
|
||
#define CALCULET_READ_CHANNELS 8
|
||
#define CALCULET_WRITE_CHANNELS 8
|
||
#define CALCULET_TOTAL_CHANNELS (CALCULET_READ_CHANNELS + CALCULET_WRITE_CHANNELS)
|
||
#define CALCULET_MAX_CHANNELS 32
|
||
|
||
#define KS1_MAX_DEVICES 64 // 最大支持的KS1设备数量
|
||
#define KS1_MAX_PATH_LEN 512 // 设备路径最大长度
|
||
#define KS1_MAX_STRING_LEN 256 // 一般字符串最大长度
|
||
#define KS1_MAX_UUID_LEN 64 // UUID字符串最大长度
|
||
#define KS1_MAX_CHIPS 16 // 最大Chip数量
|
||
#define MAX_PROCESS_ENTRIES 100 // 最大进程数
|
||
|
||
#ifdef __linux__
|
||
#ifndef __KERNEL__
|
||
#include <stdint.h>
|
||
#include <sys/types.h>
|
||
#else
|
||
#include <linux/types.h>
|
||
#include <linux/limits.h>
|
||
#include <linux/kernel.h>
|
||
#endif
|
||
|
||
#include <linux/ioctl.h>
|
||
|
||
#define _IOW_ _IOW
|
||
#define _IOR_ _IOR
|
||
#define _IOWR_ _IOWR
|
||
#define _IO_ _IO
|
||
|
||
#define CALCULET_GENERAL_IOCTL_MAGIC 'g'
|
||
#define CALCULET_DMA_IOCTL_MAGIC 'd'
|
||
#define CALCULET_SOC_IOCTL_MAGIC 's'
|
||
#define CALCULET_NNC_IOCTL_MAGIC 'n'
|
||
#define CALCULET_PCI_EP_IOCTL_MAGIC 'p'
|
||
#define CALCULET_PROC_IOCTL_MAGIC 'r'
|
||
|
||
#else
|
||
#error "unsupported platform!"
|
||
#endif
|
||
|
||
#pragma pack(push, 1)
|
||
// 传输方向枚举
|
||
enum calculet_transfer_direction {
|
||
TRANSFER_C2H_DIRECTION = 0, //device->host
|
||
TRANSFER_H2C_DIRECTION, //host->device
|
||
TRANSFER_MAX_ENUM = INT_MAX,
|
||
};
|
||
|
||
// BAR类型枚举
|
||
enum calculet_bar_type {
|
||
CALCULET_PCIE_BAR2 = 2,
|
||
CALCULET_PCIE_BAR4 = 4,
|
||
};
|
||
|
||
// BAR64传输参数
|
||
struct calculet_bar64_transfer_params {
|
||
enum calculet_transfer_direction transfer_direction; //传输方向
|
||
enum calculet_bar_type bar_type; //访问bar类型(2或4)
|
||
uint64_t bar_offset; //基于bar的地址偏移
|
||
uint64_t bar_data; //读或写bar的值
|
||
};
|
||
|
||
// BAR32传输参数
|
||
struct calculet_bar32_transfer_params {
|
||
enum calculet_transfer_direction transfer_direction; //传输方向
|
||
enum calculet_bar_type bar_type; //访问bar类型(2或4)
|
||
uint64_t bar_offset; //基于bar的地址偏移
|
||
uint32_t bar_data; //读或写bar的值
|
||
};
|
||
|
||
// DMA传输通道参数
|
||
struct calculet_dma_transfer_channels_params {
|
||
enum calculet_transfer_direction dma_transfer_direction; //传输方向
|
||
int dma_channel_id; //dma通道index(0~7)
|
||
size_t dma_channel_size; //dma传输一包数据大小(字节)
|
||
uint8_t *host_address; //应用层读或写buffer虚拟地址
|
||
uint64_t device_address; //要访问device的绝对地址
|
||
};
|
||
|
||
// 进程信息结构体
|
||
struct calculet_process_info_user {
|
||
int32_t pid; // 进程ID
|
||
int32_t ppid; // 父进程ID
|
||
uint32_t uid; // 用户ID
|
||
char comm[16]; // 进程名称(TASK_COMM_LEN)
|
||
uint8_t is_active; // 是否活跃
|
||
uint8_t reserved[3]; // 对齐保留字段
|
||
};
|
||
|
||
// 进程信息列表结构体
|
||
struct calculet_process_info_list_user {
|
||
int32_t count; // 进程数量
|
||
int32_t board_index; // 板卡索引
|
||
struct calculet_process_info_user processes[MAX_PROCESS_ENTRIES];
|
||
};
|
||
|
||
struct calculet_ioc_info {
|
||
// 设备基本识别信息
|
||
char product_name[KS1_MAX_STRING_LEN]; // 产品名称
|
||
char serial_number[KS1_MAX_STRING_LEN]; // 序列号
|
||
char product_number[KS1_MAX_STRING_LEN]; // PN号
|
||
char calculet_uuid[KS1_MAX_UUID_LEN]; // calculet唯一标识符
|
||
|
||
// 设备硬件信息
|
||
uint16_t device_id; // 设备ID
|
||
uint16_t vendor_id; // 厂商ID
|
||
uint16_t subsystem_device; // 子系统ID
|
||
uint16_t subsystem_vendor; // 子系统厂商ID
|
||
|
||
// PCI信息
|
||
struct {
|
||
uint8_t domain; // PCI域
|
||
uint8_t bus; // PCI总线
|
||
uint8_t device; // PCI设备
|
||
uint8_t function; // PCI功能
|
||
uint8_t link_speed; // PCI速率
|
||
uint8_t link_width; // PCI位宽
|
||
} pci_info;
|
||
|
||
// 版本信息
|
||
struct {
|
||
uint32_t major; // 驱动主版本号
|
||
uint32_t minor; // 驱动次版本号
|
||
char string[KS1_MAX_STRING_LEN]; // 版本字符串
|
||
} driver_version;
|
||
char firmware_version[12]; // 固件版本
|
||
|
||
// 硬件规格(固定参数)
|
||
uint64_t total_memory; // 总显存大小 (0x004C, 8字节)
|
||
double memory_bandwidth; // 显存带宽 (0x0054)
|
||
uint32_t ddr_frequency; // DDR频率 (0x005C)
|
||
uint32_t max_power_limit; // KS1 TDP上限 (0x0060)
|
||
uint32_t temp_limit_ks1; // KS1温度上限 (0x0064)
|
||
};
|
||
|
||
struct calculet_msi_req {
|
||
uint32_t msi_req; // 自定义msi 请求号(0~15)
|
||
};
|
||
|
||
struct calculet_sn_info {
|
||
uint32_t chip_id;
|
||
char sn[KS1_MAX_STRING_LEN];
|
||
};
|
||
|
||
#pragma pack(pop)
|
||
|
||
// 通用ioctl代码
|
||
enum calculet_general_ioctl_code {
|
||
CALCULET_BOARD_INFO_CODE,
|
||
CALCULET_BAR64_TRANSFER_CODE,
|
||
CALCULET_BAR32_TRANSFER_CODE,
|
||
CALCULET_GET_SN_CODE,
|
||
CALCULET_GENERAL_IOCTL_MAX_NR,
|
||
};
|
||
|
||
// DMA ioctl代码
|
||
enum calculet_dma_ioctl_code {
|
||
CALCULET_BLOCK_DMA_TRANSFER_CODE,
|
||
CALCULET_DMA_INTERRUPT_POLL_CODE,
|
||
CALCULET_EP_MSI_REQ_CODE,
|
||
CALCULET_SOFT_RESET_CODE,
|
||
CALCULET_DMA_IOCTL_MAX_NR,
|
||
};
|
||
|
||
// 进程信息ioctl代码
|
||
enum calculet_proc_ioctl_code {
|
||
CALCULET_GET_PROCESS_LIST_CODE,
|
||
CALCULET_PROC_IOCTL_MAX_NR,
|
||
};
|
||
|
||
// ioctl定义
|
||
// 获取calculet_ioc_info结构体所有参数
|
||
#define CALCULET_BOARD_INFO _IOWR_(CALCULET_GENERAL_IOCTL_MAGIC, CALCULET_BOARD_INFO_CODE, struct calculet_ioc_info)
|
||
// 64bit访问bar
|
||
#define CALCULET_BAR64_TRANSFER _IOWR_(CALCULET_GENERAL_IOCTL_MAGIC, CALCULET_BAR64_TRANSFER_CODE, struct calculet_bar64_transfer_params)
|
||
// 32bit访问bar
|
||
#define CALCULET_BAR32_TRANSFER _IOWR_(CALCULET_GENERAL_IOCTL_MAGIC, CALCULET_BAR32_TRANSFER_CODE, struct calculet_bar32_transfer_params)
|
||
// 获取SN信息
|
||
#define CALCULET_GET_SN _IOWR_(CALCULET_GENERAL_IOCTL_MAGIC, CALCULET_GET_SN_CODE, struct calculet_sn_info)
|
||
// dma传输
|
||
#define CALCULET_BLOCK_DMA_TRANSFER _IOWR_(CALCULET_DMA_IOCTL_MAGIC, CALCULET_BLOCK_DMA_TRANSFER_CODE, struct calculet_dma_transfer_channels_params)
|
||
// 轮询中断
|
||
#define CALCULET_INTERRUPT_POLL _IO_(CALCULET_DMA_IOCTL_MAGIC, CALCULET_DMA_INTERRUPT_POLL_CODE)
|
||
// device主动发起MSI中断(可用于jobq回馈)
|
||
#define CALCULET_EP_MSI_REQ _IOW_(CALCULET_PCI_EP_IOCTL_MAGIC, CALCULET_EP_MSI_REQ_CODE, struct calculet_msi_req)
|
||
// softreset
|
||
#define CALCULET_SOFT_RESET _IO_(CALCULET_PCI_EP_IOCTL_MAGIC, CALCULET_SOFT_RESET_CODE)
|
||
// 进程信息
|
||
#define CALCULET_GET_PROCESS_LIST _IOWR_(CALCULET_PROC_IOCTL_MAGIC, CALCULET_GET_PROCESS_LIST_CODE, struct calculet_process_info_list_user)
|
||
|
||
#endif /* _CALCULET_IOCTL_H_ */ |