Skip to content
This repository was archived by the owner on May 5, 2025. It is now read-only.

Commit 95c430b

Browse files
GraspEmptybuildslave
authored andcommitted
Support SBL self update trigger by fastboot
Change-Id: I0c9f2de5f1fcfc54c176e066188f4a3d5d17e061 Tracked-On: https://jira01.devtools.intel.com/browse/OAM-67224 Signed-off-by: sunxunou <[email protected]> Reviewed-on: https://android.intel.com:443/558731
1 parent 820e102 commit 95c430b

File tree

2 files changed

+64
-79
lines changed

2 files changed

+64
-79
lines changed

drivers/abl/capsule_msg.c

Lines changed: 27 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -186,34 +186,16 @@ typedef enum {
186186
EnumFileSystemMax
187187
} SBL_OS_FILE_SYSTEM_TYPE;
188188

189-
static BOOLEAN capsule_request_slot_b;
190-
191189
static EFI_STATUS cse4sbl_capsule_msg_write(CSE_MSG *msg)
192190
{
193-
uint8_t *msg_buf, *msg_buf_p, msg_slen;
191+
uint8_t *msg_buf;
194192
unsigned status;
195193

196-
// It's temporary patch before SBL officially support HECI cmd trigger fw update"
197-
outb(0x40, 0x70);
198-
if (capsule_request_slot_b) {
199-
ewdbg("%s: Capsule requested, set CMOS 0x5B value for ICL KBL hack",__func__);
200-
outb(0x5B, 0x71);
201-
} else {
202-
ewdbg("%s: Capsule requested, set CMOS 0x5A value for ICL KBL hack",__func__);
203-
outb(0x5A, 0x71);
204-
}
205-
return EFI_SUCCESS;
206-
207194
msg_buf = malloc(CSE_USRCMD_SIZE);
208195
if (!msg_buf)
209196
return EFI_OUT_OF_RESOURCES;
210-
memset(msg_buf, 0, CSE_USRCMD_SIZE);
211-
msg_buf_p = msg_buf;
212197

213-
msg_slen = offsetof(CSE_MSG, cdata_payload);
214-
msg_buf_p = (uint8_t *)memcpy(msg_buf_p, (uint8_t *)msg, msg_slen) + msg_slen;
215-
msg_slen = msg->cdata_payload_size;
216-
msg_buf_p = (uint8_t *)memcpy(msg_buf_p, msg->cdata_payload, msg_slen) + msg_slen;
198+
memcpy(msg_buf, (uint8_t *)msg, sizeof(CSE_MSG));
217199

218200
status = heci_send_user_command(msg_buf, CSE_USRCMD_SIZE);
219201

@@ -241,10 +223,6 @@ static EFI_STATUS cse4sbl_capsule_cmd_create(CSE_CMD **cmd, size_t *cmd_size, co
241223
ewdbg("capsule buffer: %s", buf); /* Buffer format example: "m1:@0" */
242224

243225
partition = buf[1] - '0';
244-
if (partition == 2)
245-
capsule_request_slot_b = TRUE;
246-
else
247-
capsule_request_slot_b = FALSE;
248226
memset(name, 0, sizeof(name));
249227
strncpy(name, buf + 3, sizeof(name) - 1); /* Number 3 is start index of name in buffer. */
250228

@@ -263,56 +241,44 @@ static EFI_STATUS cse4sbl_capsule_cmd_create(CSE_CMD **cmd, size_t *cmd_size, co
263241

264242
(*cmd)->dev_addr = boot_dev->diskbus;
265243
(*cmd)->dev_type = device_map[boot_dev->type];
266-
(*cmd)->fs_type = (uint8_t)EnumFileSystemTypeAuto;
244+
if (buf[0] == 'm')
245+
(*cmd)->fs_type = EnumFileSystemMax;
246+
else
247+
(*cmd)->fs_type = EnumFileSystemTypeFat;
248+
249+
if (name[0] == '@')
250+
(*cmd)->LbaAddr = strtoull(name+1, NULL, 0);
251+
else {
252+
memset((*cmd)->FileName, 0, MAX_FILE_LEN);
253+
strncpy((char *)(*cmd)->FileName, name, MAX_FILE_LEN - 1);
254+
}
255+
267256
(*cmd)->hw_part = 0;
268257
(*cmd)->sw_part = partition;
269-
(*cmd)->file_path.image_lba_addr = strtoull(name+1, NULL, 16);
270-
(*cmd)->file_path.image_length = 0;
271-
(*cmd)->file_path.reserved = 0;
272258
return EFI_SUCCESS;
273259
}
274260

275-
static int get_cse_msg_sum(CSE_MSG *msg, CSE_CMD *cmd, size_t cmd_size)
276-
{
277-
size_t i = 0;
278-
char *p = NULL, sum = 0;
279-
280-
p = (char *)msg;
281-
for (i = 0; i < offsetof(CSE_MSG, cdata_payload); ++i)
282-
sum += p[i];
283-
284-
sum -= msg->check_sum;
285-
286-
p = (char *)cmd;
287-
for (i = 0; i < cmd_size; ++i)
288-
sum += p[i];
289-
290-
return -sum;
291-
}
292-
293261
/* If multiple payload is needed, the cmd and cmd_size could be changed to array */
294-
static EFI_STATUS cse4sbl_capsule_msg_create(CSE_MSG **msg, CSE_CMD *cmd, size_t cmd_size)
262+
static EFI_STATUS cse4sbl_capsule_msg_create(CSE_MSG **msg, CSE_CMD *cmd, __attribute__((__unused__)) size_t cmd_size)
295263
{
296-
union _cdata_header cdh;
297-
298-
cdh.data = 0;
299-
cdh.tag = CDATA_TAG_USER_CMD;
300-
cdh.length = (sizeof(cdh) + cmd_size) / 4;
301-
302264
*msg = malloc(sizeof(CSE_MSG));
303265
if (!(*msg))
304266
return EFI_OUT_OF_RESOURCES;
305267

306-
(*msg)->magic = NVRAM_VALID_FLAG;
307-
(*msg)->total_size = offsetof(CSE_MSG, cdata_payload) + cmd_size;
308-
(*msg)->revision = 0;
309-
(*msg)->check_sum = get_cse_msg_sum(*msg, cmd, cmd_size);
268+
cdata_blob_t *cdb = &(*msg)->cdb;
269+
cdb->Signature = CFG_DATA_SIGNATURE;
270+
cdb->HeaderLength = sizeof(cdata_blob_t);
271+
cdb->UsedLength = sizeof(CSE_MSG);
272+
cdb->TotalLength = CSE_USRCMD_SIZE;
310273

311-
memset((*msg)->reserved, 0, 2);
274+
cdata_header_t *cdh = &(*msg)->cdh;
275+
cdh->ncond = 1;
276+
cdh->length = sizeof(cdata_header_t) + sizeof(CSE_CMD);
277+
cdh->version = 1;
278+
cdh->tag = CDATA_CAPSULE_TAG;
279+
cdh->Condition.Value = 0xFFFFFFFF;
312280

313-
(*msg)->cdata_header.data = cdh.data;
314-
(*msg)->cdata_payload = (char *)cmd;
315-
(*msg)->cdata_payload_size = cmd_size;
281+
memcpy(&((*msg)->cmd), cmd, sizeof(CSE_CMD));
316282

317283
return EFI_SUCCESS;
318284
}

drivers/abl/capsule_msg.h

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -62,30 +62,49 @@ union _cdata_header {
6262
};
6363

6464
#ifdef CAPSULE4SBL
65-
struct capsule_image_info {
66-
uint64_t image_lba_addr;
67-
uint32_t image_length;
68-
uint32_t reserved;
69-
};
65+
/* SBL Conventions */
66+
#define SIGNATURE_16(A, B) ((A) | (B << 8))
67+
#define SIGNATURE_32(A, B, C, D) (SIGNATURE_16 (A, B) | (SIGNATURE_16 (C, D) << 16))
68+
#define CFG_DATA_SIGNATURE SIGNATURE_32('C', 'F', 'G', 'D')
69+
#define MAX_FILE_LEN 16
70+
#define CDATA_CAPSULE_TAG 0xE00
71+
72+
typedef struct cdata_cond {
73+
uint32_t Value; // Bit masks on supported platforms
74+
} __attribute__((__packed__)) cdata_cond_t;
75+
76+
typedef struct cdata_header {
77+
uint32_t ncond : 2; // [1:0] #of condition words present
78+
uint32_t length : 10; // [11:2] total size of item (in dwords)
79+
uint32_t flags : 4; // [15:12] unused/reserved so far
80+
uint32_t version : 4; // [19:16] item (payload) format version
81+
uint32_t tag : 12; // [31:20] identifies item (in payload)
82+
struct cdata_cond Condition;
83+
} __attribute__((__packed__)) cdata_header_t ;
84+
85+
typedef struct cdata_blob {
86+
uint32_t Signature;
87+
uint8_t HeaderLength;
88+
uint8_t Attribute;
89+
uint8_t Reserved[2];
90+
uint32_t UsedLength;
91+
uint32_t TotalLength;
92+
} __attribute__((__packed__)) cdata_blob_t;
7093

7194
typedef struct cse4sbl_capsule_cmd {
7295
uint32_t dev_addr;
73-
uint8_t dev_type;
74-
uint8_t fs_type;
75-
uint8_t hw_part;
76-
uint8_t sw_part;
77-
struct capsule_image_info file_path;
96+
uint8_t dev_type;
97+
uint8_t hw_part;
98+
uint8_t sw_part;
99+
uint8_t fs_type;
100+
uint8_t FileName[MAX_FILE_LEN];
101+
uint32_t LbaAddr;
78102
} __attribute__((__packed__)) CSE_CMD;
79103

80104
typedef struct cse4sbl_capsule_msg {
81-
uint16_t magic;
82-
uint16_t total_size;
83-
char revision;
84-
char check_sum;
85-
char reserved[2];
86-
union _cdata_header cdata_header;
87-
char *cdata_payload;
88-
uint32_t cdata_payload_size;
105+
struct cdata_blob cdb;
106+
struct cdata_header cdh;
107+
struct cse4sbl_capsule_cmd cmd;
89108
} __attribute__((__packed__)) CSE_MSG;
90109
#else
91110
typedef struct cse4abl_capsule_cmd {

0 commit comments

Comments
 (0)