266 lines
6.1 KiB
C
266 lines
6.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* ISHTP firmware loader header
|
|
*
|
|
* Copyright (c) 2024, Intel Corporation.
|
|
*/
|
|
|
|
#ifndef _ISHTP_LOADER_H_
|
|
#define _ISHTP_LOADER_H_
|
|
|
|
#include <linux/bits.h>
|
|
#include <linux/jiffies.h>
|
|
#include <linux/sizes.h>
|
|
#include <linux/types.h>
|
|
|
|
#include "ishtp-dev.h"
|
|
|
|
struct work_struct;
|
|
|
|
#define LOADER_MSG_SIZE \
|
|
(IPC_PAYLOAD_SIZE - sizeof(struct ishtp_msg_hdr))
|
|
|
|
/*
|
|
* ISHTP firmware loader protocol definition
|
|
*/
|
|
#define LOADER_CMD_XFER_QUERY 0 /* SW -> FW */
|
|
#define LOADER_CMD_XFER_FRAGMENT 1 /* SW -> FW */
|
|
#define LOADER_CMD_START 2 /* SW -> FW */
|
|
|
|
/* Only support DMA mode */
|
|
#define LOADER_XFER_MODE_DMA BIT(0)
|
|
|
|
/**
|
|
* union loader_msg_header - ISHTP firmware loader message header
|
|
* @command: Command type
|
|
* @is_response: Indicates if the message is a response
|
|
* @has_next: Indicates if there is a next message
|
|
* @reserved: Reserved for future use
|
|
* @status: Status of the message
|
|
* @val32: entire header as a 32-bit value
|
|
*/
|
|
union loader_msg_header {
|
|
struct {
|
|
__u32 command:7;
|
|
__u32 is_response:1;
|
|
__u32 has_next:1;
|
|
__u32 reserved:15;
|
|
__u32 status:8;
|
|
};
|
|
__u32 val32;
|
|
};
|
|
|
|
/**
|
|
* struct loader_xfer_query - ISHTP firmware loader transfer query packet
|
|
* @header: Header of the message
|
|
* @image_size: Size of the image
|
|
*/
|
|
struct loader_xfer_query {
|
|
__le32 header;
|
|
__le32 image_size;
|
|
};
|
|
|
|
/**
|
|
* struct loader_version - ISHTP firmware loader version
|
|
* @value: Value of the version
|
|
* @major: Major version
|
|
* @minor: Minor version
|
|
* @hotfix: Hotfix version
|
|
* @build: Build version
|
|
*/
|
|
struct loader_version {
|
|
union {
|
|
__le32 value;
|
|
struct {
|
|
__u8 major;
|
|
__u8 minor;
|
|
__u8 hotfix;
|
|
__u8 build;
|
|
};
|
|
};
|
|
};
|
|
|
|
/**
|
|
* struct loader_capability - ISHTP firmware loader capability
|
|
* @max_fw_image_size: Maximum firmware image size
|
|
* @support_mode: Support mode
|
|
* @reserved: Reserved for future use
|
|
* @platform: Platform
|
|
* @max_dma_buf_size: Maximum DMA buffer size, multiples of 4096
|
|
*/
|
|
struct loader_capability {
|
|
__le32 max_fw_image_size;
|
|
__le16 support_mode;
|
|
__u8 reserved;
|
|
__u8 platform;
|
|
__le32 max_dma_buf_size;
|
|
};
|
|
|
|
/**
|
|
* struct loader_xfer_query_ack - ISHTP firmware loader transfer query acknowledgment
|
|
* @header: Header of the message
|
|
* @version_major: ISH Major version
|
|
* @version_minor: ISH Minor version
|
|
* @version_hotfix: ISH Hotfix version
|
|
* @version_build: ISH Build version
|
|
* @protocol_version: Protocol version
|
|
* @loader_version: Loader version
|
|
* @capability: Loader capability
|
|
*/
|
|
struct loader_xfer_query_ack {
|
|
__le32 header;
|
|
__le16 version_major;
|
|
__le16 version_minor;
|
|
__le16 version_hotfix;
|
|
__le16 version_build;
|
|
__le32 protocol_version;
|
|
struct loader_version loader_version;
|
|
struct loader_capability capability;
|
|
};
|
|
|
|
/**
|
|
* struct loader_xfer_fragment - ISHTP firmware loader transfer fragment
|
|
* @header: Header of the message
|
|
* @xfer_mode: Transfer mode
|
|
* @offset: Offset
|
|
* @size: Size
|
|
* @is_last: Is last
|
|
*/
|
|
struct loader_xfer_fragment {
|
|
__le32 header;
|
|
__le32 xfer_mode;
|
|
__le32 offset;
|
|
__le32 size;
|
|
__le32 is_last;
|
|
};
|
|
|
|
/**
|
|
* struct loader_xfer_fragment_ack - ISHTP firmware loader transfer fragment acknowledgment
|
|
* @header: Header of the message
|
|
*/
|
|
struct loader_xfer_fragment_ack {
|
|
__le32 header;
|
|
};
|
|
|
|
/**
|
|
* struct fragment_dscrpt - ISHTP firmware loader fragment descriptor
|
|
* @ddr_adrs: The address in host DDR
|
|
* @fw_off: The offset of the fragment in the fw image
|
|
* @length: The length of the fragment
|
|
*/
|
|
struct fragment_dscrpt {
|
|
__le64 ddr_adrs;
|
|
__le32 fw_off;
|
|
__le32 length;
|
|
};
|
|
|
|
#define FRAGMENT_MAX_NUM \
|
|
((LOADER_MSG_SIZE - sizeof(struct loader_xfer_dma_fragment)) / \
|
|
sizeof(struct fragment_dscrpt))
|
|
|
|
/**
|
|
* struct loader_xfer_dma_fragment - ISHTP firmware loader transfer DMA fragment
|
|
* @fragment: Fragment
|
|
* @fragment_cnt: How many descriptors in the fragment_tbl
|
|
* @fragment_tbl: Fragment table
|
|
*/
|
|
struct loader_xfer_dma_fragment {
|
|
struct loader_xfer_fragment fragment;
|
|
__le32 fragment_cnt;
|
|
struct fragment_dscrpt fragment_tbl[] __counted_by(fragment_cnt);
|
|
};
|
|
|
|
/**
|
|
* struct loader_start - ISHTP firmware loader start
|
|
* @header: Header of the message
|
|
*/
|
|
struct loader_start {
|
|
__le32 header;
|
|
};
|
|
|
|
/**
|
|
* struct loader_start_ack - ISHTP firmware loader start acknowledgment
|
|
* @header: Header of the message
|
|
*/
|
|
struct loader_start_ack {
|
|
__le32 header;
|
|
};
|
|
|
|
union loader_recv_message {
|
|
__le32 header;
|
|
struct loader_xfer_query_ack query_ack;
|
|
struct loader_xfer_fragment_ack fragment_ack;
|
|
struct loader_start_ack start_ack;
|
|
__u8 raw_data[LOADER_MSG_SIZE];
|
|
};
|
|
|
|
/*
|
|
* ISHTP firmware loader internal use
|
|
*/
|
|
/* ISHTP firmware loader command timeout */
|
|
#define ISHTP_LOADER_TIMEOUT msecs_to_jiffies(100)
|
|
|
|
/* ISHTP firmware loader retry times */
|
|
#define ISHTP_LOADER_RETRY_TIMES 3
|
|
|
|
/**
|
|
* struct ish_firmware_variant - ISH firmware variant
|
|
* @device: PCI Device ID
|
|
* @filename: The firmware file name
|
|
*/
|
|
struct ish_firmware_variant {
|
|
unsigned short device;
|
|
const char *filename;
|
|
};
|
|
|
|
/*
|
|
* ISHTP firmware loader API for ISHTP hbm
|
|
*/
|
|
|
|
/* ISHTP capability bit for firmware loader */
|
|
#define ISHTP_SUPPORT_CAP_LOADER BIT(4)
|
|
|
|
/* Firmware loader address */
|
|
#define ISHTP_LOADER_CLIENT_ADDR 16
|
|
|
|
/**
|
|
* ishtp_loader_work - The work function to start the firmware loading process
|
|
* @work: The work structure
|
|
*/
|
|
void ishtp_loader_work(struct work_struct *work);
|
|
|
|
/* ISH Manifest alignment in binary is 4KB aligned */
|
|
#define ISH_MANIFEST_ALIGNMENT SZ_4K
|
|
|
|
/* Signature for ISH global manifest */
|
|
#define ISH_GLOBAL_SIG 0x47485349 /* FourCC 'I', 'S', 'H', 'G' */
|
|
|
|
struct version_in_manifest {
|
|
__le16 major;
|
|
__le16 minor;
|
|
__le16 hotfix;
|
|
__le16 build;
|
|
};
|
|
|
|
/**
|
|
* struct ish_global_manifest - global manifest for ISH
|
|
* @sig_fourcc: Signature FourCC, should be 'I', 'S', 'H', 'G'.
|
|
* @len: Length of the manifest.
|
|
* @header_version: Version of the manifest header.
|
|
* @flags: Flags for additional information.
|
|
* @base_ver: Base version of Intel's released firmware.
|
|
* @reserved: Reserved space for future use.
|
|
* @prj_ver: Vendor-customized project version.
|
|
*/
|
|
struct ish_global_manifest {
|
|
__le32 sig_fourcc;
|
|
__le32 len;
|
|
__le32 header_version;
|
|
__le32 flags;
|
|
struct version_in_manifest base_ver;
|
|
__le32 reserved[13];
|
|
struct version_in_manifest prj_ver;
|
|
};
|
|
|
|
#endif /* _ISHTP_LOADER_H_ */
|