hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
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
/* SPDX-License-Identifier: MIT */
/*
 * Copyright © 2019 Intel Corporation
 */
 
#ifndef _INTEL_UC_FW_ABI_H
#define _INTEL_UC_FW_ABI_H
 
#include <linux/types.h>
#include <linux/build_bug.h>
 
/**
 * DOC: Firmware Layout
 *
 * The GuC/HuC firmware layout looks like this::
 *
 *      +======================================================================+
 *      |  Firmware blob                                                       |
 *      +===============+===============+============+============+============+
 *      |  CSS header   |     uCode     |  RSA key   |  modulus   |  exponent  |
 *      +===============+===============+============+============+============+
 *       <-header size->                 <---header size continued ----------->
 *       <--- size ----------------------------------------------------------->
 *                                       <-key size->
 *                                                    <-mod size->
 *                                                                 <-exp size->
 *
 * The firmware may or may not have modulus key and exponent data. The header,
 * uCode and RSA signature are must-have components that will be used by driver.
 * Length of each components, which is all in dwords, can be found in header.
 * In the case that modulus and exponent are not present in fw, a.k.a truncated
 * image, the length value still appears in header.
 *
 * Driver will do some basic fw size validation based on the following rules:
 *
 * 1. Header, uCode and RSA are must-have components.
 * 2. All firmware components, if they present, are in the sequence illustrated
 *    in the layout table above.
 * 3. Length info of each component can be found in header, in dwords.
 * 4. Modulus and exponent key are not required by driver. They may not appear
 *    in fw. So driver will load a truncated firmware in this case.
 */
 
struct uc_css_header {
   u32 module_type;
   /*
    * header_size includes all non-uCode bits, including css_header, rsa
    * key, modulus key and exponent data.
    */
   u32 header_size_dw;
   u32 header_version;
   u32 module_id;
   u32 module_vendor;
   u32 date;
#define CSS_DATE_DAY            (0xFF << 0)
#define CSS_DATE_MONTH            (0xFF << 8)
#define CSS_DATE_YEAR            (0xFFFF << 16)
   u32 size_dw; /* uCode plus header_size_dw */
   u32 key_size_dw;
   u32 modulus_size_dw;
   u32 exponent_size_dw;
   u32 time;
#define CSS_TIME_HOUR            (0xFF << 0)
#define CSS_DATE_MIN            (0xFF << 8)
#define CSS_DATE_SEC            (0xFFFF << 16)
   char username[8];
   char buildnumber[12];
   u32 sw_version;
#define CSS_SW_VERSION_UC_MAJOR        (0xFF << 16)
#define CSS_SW_VERSION_UC_MINOR        (0xFF << 8)
#define CSS_SW_VERSION_UC_PATCH        (0xFF << 0)
   u32 reserved[14];
   u32 header_info;
} __packed;
static_assert(sizeof(struct uc_css_header) == 128);
 
#endif /* _INTEL_UC_FW_ABI_H */