linux-loongson/include/linux/hid-over-spi.h
Even Xu 9d8d51735a HID: intel-thc-hid: intel-quickspi: Add HIDSPI protocol implementation
Intel QuickSPI driver uses THC hardware to accelerate HID over SPI
(HIDSPI) protocol flow.

This patch implements all data flows described in HID over SPI protocol
SPEC by using THC hardware layer APIs.

HID over SPI SPEC:
https://www.microsoft.com/download/details.aspx?id=103325

Co-developed-by: Xinpeng Sun <xinpeng.sun@intel.com>
Signed-off-by: Xinpeng Sun <xinpeng.sun@intel.com>
Signed-off-by: Even Xu <even.xu@intel.com>
Tested-by: Rui Zhang <rui1.zhang@intel.com>
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Tested-by: Aaron Ma <aaron.ma@canonical.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
2025-01-09 10:14:16 +01:00

156 lines
4.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright 2024 Intel Corporation */
#ifndef _HID_OVER_SPI_H_
#define _HID_OVER_SPI_H_
#include <linux/bits.h>
#include <linux/types.h>
/* Input report type definition in HIDSPI protocol */
enum input_report_type {
INVALID_INPUT_REPORT_TYPE_0 = 0,
DATA = 1,
INVALID_TYPE_2 = 2,
RESET_RESPONSE = 3,
COMMAND_RESPONSE = 4,
GET_FEATURE_RESPONSE = 5,
INVALID_TYPE_6 = 6,
DEVICE_DESCRIPTOR_RESPONSE = 7,
REPORT_DESCRIPTOR_RESPONSE = 8,
SET_FEATURE_RESPONSE = 9,
OUTPUT_REPORT_RESPONSE = 10,
GET_INPUT_REPORT_RESPONSE = 11,
INVALID_INPUT_REPORT_TYPE = 0xF,
};
/* Output report type definition in HIDSPI protocol */
enum output_report_type {
INVALID_OUTPUT_REPORT_TYPE_0 = 0,
DEVICE_DESCRIPTOR = 1,
REPORT_DESCRIPTOR = 2,
SET_FEATURE = 3,
GET_FEATURE = 4,
OUTPUT_REPORT = 5,
GET_INPUT_REPORT = 6,
COMMAND_CONTENT = 7,
};
/* Set power command ID for output report */
#define HIDSPI_SET_POWER_CMD_ID 1
/* Power state definition in HIDSPI protocol */
enum hidspi_power_state {
HIDSPI_ON = 1,
HIDSPI_SLEEP = 2,
HIDSPI_OFF = 3,
};
/**
* Input report header definition in HIDSPI protocol
* Report header size is 32bits, it includes:
* protocol_ver: [0:3] Current supported HIDSPI protocol version, must be 0x3
* reserved0: [4:7] Reserved bits
* input_report_len: [8:21] Input report length in number bytes divided by 4
* last_frag_flag: [22]Indicate if this packet is last fragment.
* 1 - indicates last fragment
* 0 - indicates additional fragments
* reserved1: [23] Reserved bits
* @sync_const: [24:31] Used to validate input report header, must be 0x5A
*/
#define HIDSPI_INPUT_HEADER_SIZE sizeof(u32)
#define HIDSPI_INPUT_HEADER_VER GENMASK(3, 0)
#define HIDSPI_INPUT_HEADER_REPORT_LEN GENMASK(21, 8)
#define HIDSPI_INPUT_HEADER_LAST_FLAG BIT(22)
#define HIDSPI_INPUT_HEADER_SYNC GENMASK(31, 24)
/**
* struct input_report_body_header - Input report body header definition in HIDSPI protocol
* @input_report_type: indicate input report type, reference to enum input_report_type
* @content_len: this input report body packet length
* @content_id: indicate this input report's report id
*/
struct input_report_body_header {
u8 input_report_type;
__le16 content_len;
u8 content_id;
} __packed;
#define HIDSPI_INPUT_BODY_HEADER_SIZE sizeof(struct input_report_body_header)
/**
* struct input_report_body - Input report body definition in HIDSPI protocol
* @body_hdr: input report body header
* @content: input report body content
*/
struct input_report_body {
struct input_report_body_header body_hdr;
u8 content[];
} __packed;
#define HIDSPI_INPUT_BODY_SIZE(content_len) ((content_len) + HIDSPI_INPUT_BODY_HEADER_SIZE)
/**
* struct output_report_header - Output report header definition in HIDSPI protocol
* @report_type: output report type, reference to enum output_report_type
* @content_len: length of content
* @content_id: 0x00 - descriptors
* report id - Set/Feature feature or Input/Output Reports
* command opcode - for commands
*/
struct output_report_header {
u8 report_type;
__le16 content_len;
u8 content_id;
} __packed;
#define HIDSPI_OUTPUT_REPORT_HEADER_SIZE sizeof(struct output_report_header)
/**
* struct output_report - Output report definition in HIDSPI protocol
* @output_hdr: output report header
* @content: output report content
*/
struct output_report {
struct output_report_header output_hdr;
u8 content[];
} __packed;
#define HIDSPI_OUTPUT_REPORT_SIZE(content_len) ((content_len) + HIDSPI_OUTPUT_REPORT_HEADER_SIZE)
/**
* struct hidspi_dev_descriptor - HIDSPI device descriptor definition
* @dev_desc_len: The length of the complete device descriptor, fixed to 0x18 (24).
* @bcd_ver: The version number of the HIDSPI protocol supported.
* In binary coded decimal (BCD) format. Must be fixed to 0x0300.
* @rep_desc_len: The length of the report descriptor
* @max_input_len: The length of the largest possible HID input (or feature) report
* @max_output_len: The length of the largest output (or feature) report
* @max_frag_len: The length of the largest fragment, where a fragment represents
* the body of an input report.
* @vendor_id: Device manufacturers vendor ID
* @product_id: Device unique model/product ID
* @version_id: Devices unique version
* @flags: Specify flags for the devices operation
* @reserved: Reserved and should be 0
*/
struct hidspi_dev_descriptor {
__le16 dev_desc_len;
__le16 bcd_ver;
__le16 rep_desc_len;
__le16 max_input_len;
__le16 max_output_len;
__le16 max_frag_len;
__le16 vendor_id;
__le16 product_id;
__le16 version_id;
__le16 flags;
__le32 reserved;
};
#define HIDSPI_DEVICE_DESCRIPTOR_SIZE sizeof(struct hidspi_dev_descriptor)
#define HIDSPI_INPUT_DEVICE_DESCRIPTOR_SIZE \
(HIDSPI_INPUT_BODY_HEADER_SIZE + HIDSPI_DEVICE_DESCRIPTOR_SIZE)
#endif /* _HID_OVER_SPI_H_ */