Commit fb26412f authored by Bingbu Cao's avatar Bingbu Cao Committed by Hans Verkuil

media: intel/ipu6: CPD parsing for get firmware components

For IPU6, firmware is generated and released as signed Code Partition
Directory (CPD) format file which is aligned with the SPI flash code
partition definition. The CPD format includes CPD header, manifest,
metadata and module data. The driver parses them according to the CPD
layout to acquire each component.
Signed-off-by: default avatarBingbu Cao <bingbu.cao@intel.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent ab29a247
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2015--2024 Intel Corporation */
#ifndef IPU6_CPD_H
#define IPU6_CPD_H
struct ipu6_device;
struct ipu6_bus_device;
#define IPU6_CPD_SIZE_OF_FW_ARCH_VERSION 7
#define IPU6_CPD_SIZE_OF_SYSTEM_VERSION 11
#define IPU6_CPD_SIZE_OF_COMPONENT_NAME 12
#define IPU6_CPD_METADATA_EXTN_TYPE_IUNIT 0x10
#define IPU6_CPD_METADATA_IMAGE_TYPE_RESERVED 0
#define IPU6_CPD_METADATA_IMAGE_TYPE_BOOTLOADER 1
#define IPU6_CPD_METADATA_IMAGE_TYPE_MAIN_FIRMWARE 2
#define IPU6_CPD_PKG_DIR_PSYS_SERVER_IDX 0
#define IPU6_CPD_PKG_DIR_ISYS_SERVER_IDX 1
#define IPU6_CPD_PKG_DIR_CLIENT_PG_TYPE 3
#define IPU6_CPD_METADATA_HASH_KEY_SIZE 48
#define IPU6SE_CPD_METADATA_HASH_KEY_SIZE 32
struct ipu6_cpd_module_data_hdr {
u32 hdr_len;
u32 endian;
u32 fw_pkg_date;
u32 hive_sdk_date;
u32 compiler_date;
u32 target_platform_type;
u8 sys_ver[IPU6_CPD_SIZE_OF_SYSTEM_VERSION];
u8 fw_arch_ver[IPU6_CPD_SIZE_OF_FW_ARCH_VERSION];
u8 rsvd[2];
} __packed;
/*
* ipu6_cpd_hdr structure updated as the chksum and
* sub_partition_name is unused on host side
* CSE layout version 1.6 for IPU6SE (hdr_len = 0x10)
* CSE layout version 1.7 for IPU6 (hdr_len = 0x14)
*/
struct ipu6_cpd_hdr {
u32 hdr_mark;
u32 ent_cnt;
u8 hdr_ver;
u8 ent_ver;
u8 hdr_len;
} __packed;
struct ipu6_cpd_ent {
u8 name[IPU6_CPD_SIZE_OF_COMPONENT_NAME];
u32 offset;
u32 len;
u8 rsvd[4];
} __packed;
struct ipu6_cpd_metadata_cmpnt_hdr {
u32 id;
u32 size;
u32 ver;
} __packed;
struct ipu6_cpd_metadata_cmpnt {
struct ipu6_cpd_metadata_cmpnt_hdr hdr;
u8 sha2_hash[IPU6_CPD_METADATA_HASH_KEY_SIZE];
u32 entry_point;
u32 icache_base_offs;
u8 attrs[16];
} __packed;
struct ipu6se_cpd_metadata_cmpnt {
struct ipu6_cpd_metadata_cmpnt_hdr hdr;
u8 sha2_hash[IPU6SE_CPD_METADATA_HASH_KEY_SIZE];
u32 entry_point;
u32 icache_base_offs;
u8 attrs[16];
} __packed;
struct ipu6_cpd_metadata_extn {
u32 extn_type;
u32 len;
u32 img_type;
u8 rsvd[16];
} __packed;
struct ipu6_cpd_client_pkg_hdr {
u32 prog_list_offs;
u32 prog_list_size;
u32 prog_desc_offs;
u32 prog_desc_size;
u32 pg_manifest_offs;
u32 pg_manifest_size;
u32 prog_bin_offs;
u32 prog_bin_size;
} __packed;
int ipu6_cpd_create_pkg_dir(struct ipu6_bus_device *adev, const void *src);
void ipu6_cpd_free_pkg_dir(struct ipu6_bus_device *adev);
int ipu6_cpd_validate_cpd_file(struct ipu6_device *isp, const void *cpd_file,
unsigned long cpd_file_size);
#endif /* IPU6_CPD_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment