/* 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 #include #include #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) /** * struct 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 */ struct loader_msg_header { __le32 command:7; __le32 is_response:1; __le32 has_next:1; __le32 reserved:15; __le32 status:8; }; /** * 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 { struct loader_msg_header 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 { struct loader_msg_header 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 { struct loader_msg_header 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 { struct loader_msg_header 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 { struct loader_msg_header header; }; /** * struct loader_start_ack - ISHTP firmware loader start acknowledgment * @header: Header of the message */ struct loader_start_ack { struct loader_msg_header header; }; union loader_recv_message { 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); #endif /* _ISHTP_LOADER_H_ */