/* 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 0 x47485349 /* 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_ */
Messung V0.5 in Prozent C=84 H=95 G=89
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland