1 /* SPDX-License-Identifier: GPL-2.0-only */
6 #include <console/console.h>
7 #include <soc/intel/common/mma.h>
10 #define MMA_TEST_METADATA_FILENAME "mma_test_metadata.bin"
11 #define MMA_TEST_NAME_TAG "MMA_TEST_NAME"
12 #define MMA_TEST_PARAM_TAG "MMA_TEST_PARAM"
13 #define TEST_NAME_MAX_SIZE 30
14 #define TEST_PARAM_MAX_SIZE 100
15 #define MMA_DATA_SIGNATURE (('M' << 0) | ('M' << 8) | \
16 ('A' << 16) | ('D' << 24))
18 struct mma_data_container
{
19 uint32_t mma_signature
; /* "MMAD" */
20 uint8_t mma_data
[]; /* Variable size, platform/run time dependent. */
24 * Format of the MMA test metadata file, stored under CBFS
25 * MMA_TEST_NAME=xxxxxx.efi;MMA_TEST_PARAM=xxxxxx.bin;
28 /* Returns index in haystack after 'LABEL='
29 * string is found, < 0 on error.
31 static int find_label(const char *haystack
, size_t haystack_sz
,
38 label_sz
= strlen(label
);
40 if (label_sz
+ 1 >= haystack_sz
)
43 /* Handle '=' follow label. i.e. LABEL= */
44 search_sz
= haystack_sz
- label_sz
- 1;
45 for (i
= 0; i
< search_sz
; i
++) {
46 if (!strncmp(&haystack
[i
], label
, label_sz
))
53 if (haystack
[i
+ label_sz
] != '=')
56 return i
+ label_sz
+ 1;
60 * Fill in value in dest field located by LABEL=.
61 * Returns 0 on success, < 0 on error.
63 static int label_value(const char *haystack
, size_t haystack_sz
,
64 const char *label
, char *dest
, size_t dest_sz
)
71 memset(dest
, 0, dest_sz
);
73 /* Allow for NULL termination. */
75 val_index
= find_label(haystack
, haystack_sz
, label
);
79 val_begin
= val_index
;
83 for (val_end
= val_begin
; val_end
< haystack_sz
; val_end
++) {
84 if (haystack
[val_end
] == ';') {
85 val_sz
= val_end
- val_begin
;
90 if (val_end
== haystack_sz
)
96 memcpy(dest
, &haystack
[val_begin
], val_sz
);
101 int mma_map_param(struct mma_config_param
*mma_cfg
)
103 void *mma_test_metadata
;
104 size_t mma_test_metadata_file_len
;
105 char test_filename
[TEST_NAME_MAX_SIZE
],
106 test_param_filename
[TEST_PARAM_MAX_SIZE
];
107 bool metadata_parse_flag
= true;
109 printk(BIOS_DEBUG
, "MMA: Entry %s\n", __func__
);
111 mma_test_metadata
= cbfs_ro_map(MMA_TEST_METADATA_FILENAME
,
112 &mma_test_metadata_file_len
);
113 if (!mma_test_metadata
) {
114 printk(BIOS_DEBUG
, "MMA: Failed to map %s\n",
115 MMA_TEST_METADATA_FILENAME
);
119 if (label_value(mma_test_metadata
, mma_test_metadata_file_len
,
120 MMA_TEST_NAME_TAG
, test_filename
,
121 TEST_NAME_MAX_SIZE
)) {
122 printk(BIOS_DEBUG
, "MMA: Failed to get %s\n",
124 metadata_parse_flag
= false;
127 if (metadata_parse_flag
&&
128 label_value(mma_test_metadata
, mma_test_metadata_file_len
,
129 MMA_TEST_PARAM_TAG
, test_param_filename
,
130 TEST_PARAM_MAX_SIZE
)) {
131 printk(BIOS_DEBUG
, "MMA: Failed to get %s\n",
133 metadata_parse_flag
= false;
136 cbfs_unmap(mma_test_metadata
);
138 if (!metadata_parse_flag
)
141 printk(BIOS_DEBUG
, "MMA: Got MMA_TEST_NAME=%s MMA_TEST_PARAM=%s\n",
142 test_filename
, test_param_filename
);
144 mma_cfg
->test_content
= cbfs_ro_map(test_filename
, &mma_cfg
->test_content_size
);
145 if (!mma_cfg
->test_content
) {
146 printk(BIOS_DEBUG
, "MMA: Failed to map %s\n", test_filename
);
150 mma_cfg
->test_param
= cbfs_ro_map(test_param_filename
, &mma_cfg
->test_param_size
);
151 if (!mma_cfg
->test_param
) {
152 printk(BIOS_DEBUG
, "MMA: Failed to map %s\n", test_param
);
156 printk(BIOS_DEBUG
, "MMA: %s exit success\n", __func__
);
161 static void save_mma_results_data(void *unused
)
165 struct mma_data_container
*mma_data
;
166 size_t mma_data_size
;
168 printk(BIOS_DEBUG
, "MMA: Entry %s\n", __func__
);
170 if (fsp_locate_mma_results(&mma_hob
, &mma_hob_size
)) {
172 "MMA: results data Hob not present\n");
176 mma_data_size
= ALIGN_UP(mma_hob_size
, 16) +
177 sizeof(struct mma_data_container
);
179 mma_data
= cbmem_add(CBMEM_ID_MMA_DATA
, mma_data_size
);
181 if (mma_data
== NULL
) {
183 "MMA: CBMEM was not available to save the MMA data.\n");
187 /*clear the mma_data before coping the actual data */
188 memset(mma_data
, 0, mma_data_size
);
191 "MMA: copy MMA data to CBMEM(src %p, dest %p, %u bytes)\n",
192 mma_hob
, mma_data
, mma_hob_size
);
194 mma_data
->mma_signature
= MMA_DATA_SIGNATURE
;
195 memcpy(mma_data
->mma_data
, mma_hob
, mma_hob_size
);
197 printk(BIOS_DEBUG
, "MMA: %s exit successfully\n", __func__
);
200 BOOT_STATE_INIT_ENTRY(BS_WRITE_TABLES
, BS_ON_ENTRY
,
201 save_mma_results_data
, NULL
);