summaryrefslogtreecommitdiff
path: root/drivers/media/pci/intel/ipu6/ipu6-cpd.h
blob: e0e4fdeca902fc84052d44bbb77773fbe3734a96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* 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 */