Skip to content

Commit 1caf3f7

Browse files
yu-chen-surfrafaeljw
authored andcommitted
ACPI: pfr_update: Add more debug information when firmware update failed
Users reported insufficient error information for debugging during firmware update failures on certain platforms. Add verbose error logs in the error code path to enhance debuggability. Reported-by: "Govindarajulu, Hariganesh" <hariganesh.govindarajulu@intel.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> Link: https://patch.msgid.link/20250604022956.3723438-1-yu.c.chen@intel.com Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent d0b3b7b commit 1caf3f7

1 file changed

Lines changed: 48 additions & 15 deletions

File tree

drivers/acpi/pfr_update.c

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,11 @@ static int query_capability(struct pfru_update_cap_info *cap_hdr,
127127
pfru_dev->rev_id,
128128
PFRU_FUNC_QUERY_UPDATE_CAP,
129129
NULL, ACPI_TYPE_PACKAGE);
130-
if (!out_obj)
130+
if (!out_obj) {
131+
dev_dbg(pfru_dev->parent_dev,
132+
"Query cap failed with no object\n");
131133
return ret;
134+
}
132135

133136
if (out_obj->package.count < CAP_NR_IDX ||
134137
out_obj->package.elements[CAP_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
@@ -141,13 +144,17 @@ static int query_capability(struct pfru_update_cap_info *cap_hdr,
141144
out_obj->package.elements[CAP_DRV_SVN_IDX].type != ACPI_TYPE_INTEGER ||
142145
out_obj->package.elements[CAP_PLAT_ID_IDX].type != ACPI_TYPE_BUFFER ||
143146
out_obj->package.elements[CAP_OEM_ID_IDX].type != ACPI_TYPE_BUFFER ||
144-
out_obj->package.elements[CAP_OEM_INFO_IDX].type != ACPI_TYPE_BUFFER)
147+
out_obj->package.elements[CAP_OEM_INFO_IDX].type != ACPI_TYPE_BUFFER) {
148+
dev_dbg(pfru_dev->parent_dev,
149+
"Query cap failed with invalid package count/type\n");
145150
goto free_acpi_buffer;
151+
}
146152

147153
cap_hdr->status = out_obj->package.elements[CAP_STATUS_IDX].integer.value;
148154
if (cap_hdr->status != DSM_SUCCEED) {
149155
ret = -EBUSY;
150-
dev_dbg(pfru_dev->parent_dev, "Error Status:%d\n", cap_hdr->status);
156+
dev_dbg(pfru_dev->parent_dev, "Query cap Error Status:%d\n",
157+
cap_hdr->status);
151158
goto free_acpi_buffer;
152159
}
153160

@@ -193,24 +200,32 @@ static int query_buffer(struct pfru_com_buf_info *info,
193200
out_obj = acpi_evaluate_dsm_typed(handle, &pfru_guid,
194201
pfru_dev->rev_id, PFRU_FUNC_QUERY_BUF,
195202
NULL, ACPI_TYPE_PACKAGE);
196-
if (!out_obj)
203+
if (!out_obj) {
204+
dev_dbg(pfru_dev->parent_dev,
205+
"Query buf failed with no object\n");
197206
return ret;
207+
}
198208

199209
if (out_obj->package.count < BUF_NR_IDX ||
200210
out_obj->package.elements[BUF_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
201211
out_obj->package.elements[BUF_EXT_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
202212
out_obj->package.elements[BUF_ADDR_LOW_IDX].type != ACPI_TYPE_INTEGER ||
203213
out_obj->package.elements[BUF_ADDR_HI_IDX].type != ACPI_TYPE_INTEGER ||
204-
out_obj->package.elements[BUF_SIZE_IDX].type != ACPI_TYPE_INTEGER)
214+
out_obj->package.elements[BUF_SIZE_IDX].type != ACPI_TYPE_INTEGER) {
215+
dev_dbg(pfru_dev->parent_dev,
216+
"Query buf failed with invalid package count/type\n");
205217
goto free_acpi_buffer;
218+
}
206219

207220
info->status = out_obj->package.elements[BUF_STATUS_IDX].integer.value;
208221
info->ext_status =
209222
out_obj->package.elements[BUF_EXT_STATUS_IDX].integer.value;
210223
if (info->status != DSM_SUCCEED) {
211224
ret = -EBUSY;
212-
dev_dbg(pfru_dev->parent_dev, "Error Status:%d\n", info->status);
213-
dev_dbg(pfru_dev->parent_dev, "Error Extended Status:%d\n", info->ext_status);
225+
dev_dbg(pfru_dev->parent_dev,
226+
"Query buf failed with Error Status:%d\n", info->status);
227+
dev_dbg(pfru_dev->parent_dev,
228+
"Query buf failed with Error Extended Status:%d\n", info->ext_status);
214229

215230
goto free_acpi_buffer;
216231
}
@@ -295,12 +310,16 @@ static bool applicable_image(const void *data, struct pfru_update_cap_info *cap,
295310
m_img_hdr = data + size;
296311

297312
type = get_image_type(m_img_hdr, pfru_dev);
298-
if (type < 0)
313+
if (type < 0) {
314+
dev_dbg(pfru_dev->parent_dev, "Invalid image type\n");
299315
return false;
316+
}
300317

301318
size = adjust_efi_size(m_img_hdr, size);
302-
if (size < 0)
319+
if (size < 0) {
320+
dev_dbg(pfru_dev->parent_dev, "Invalid image size\n");
303321
return false;
322+
}
304323

305324
auth = data + size;
306325
size += sizeof(u64) + auth->auth_info.hdr.len;
@@ -346,17 +365,23 @@ static int start_update(int action, struct pfru_device *pfru_dev)
346365
out_obj = acpi_evaluate_dsm_typed(handle, &pfru_guid,
347366
pfru_dev->rev_id, PFRU_FUNC_START,
348367
&in_obj, ACPI_TYPE_PACKAGE);
349-
if (!out_obj)
368+
if (!out_obj) {
369+
dev_dbg(pfru_dev->parent_dev,
370+
"Update failed to start with no object\n");
350371
return ret;
372+
}
351373

352374
if (out_obj->package.count < UPDATE_NR_IDX ||
353375
out_obj->package.elements[UPDATE_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
354376
out_obj->package.elements[UPDATE_EXT_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
355377
out_obj->package.elements[UPDATE_AUTH_TIME_LOW_IDX].type != ACPI_TYPE_INTEGER ||
356378
out_obj->package.elements[UPDATE_AUTH_TIME_HI_IDX].type != ACPI_TYPE_INTEGER ||
357379
out_obj->package.elements[UPDATE_EXEC_TIME_LOW_IDX].type != ACPI_TYPE_INTEGER ||
358-
out_obj->package.elements[UPDATE_EXEC_TIME_HI_IDX].type != ACPI_TYPE_INTEGER)
380+
out_obj->package.elements[UPDATE_EXEC_TIME_HI_IDX].type != ACPI_TYPE_INTEGER) {
381+
dev_dbg(pfru_dev->parent_dev,
382+
"Update failed with invalid package count/type\n");
359383
goto free_acpi_buffer;
384+
}
360385

361386
update_result.status =
362387
out_obj->package.elements[UPDATE_STATUS_IDX].integer.value;
@@ -365,8 +390,10 @@ static int start_update(int action, struct pfru_device *pfru_dev)
365390

366391
if (update_result.status != DSM_SUCCEED) {
367392
ret = -EBUSY;
368-
dev_dbg(pfru_dev->parent_dev, "Error Status:%d\n", update_result.status);
369-
dev_dbg(pfru_dev->parent_dev, "Error Extended Status:%d\n",
393+
dev_dbg(pfru_dev->parent_dev,
394+
"Update failed with Error Status:%d\n", update_result.status);
395+
dev_dbg(pfru_dev->parent_dev,
396+
"Update failed with Error Extended Status:%d\n",
370397
update_result.ext_status);
371398

372399
goto free_acpi_buffer;
@@ -450,8 +477,10 @@ static ssize_t pfru_write(struct file *file, const char __user *buf,
450477
if (ret)
451478
return ret;
452479

453-
if (len > buf_info.buf_size)
480+
if (len > buf_info.buf_size) {
481+
dev_dbg(pfru_dev->parent_dev, "Capsule image size too large\n");
454482
return -EINVAL;
483+
}
455484

456485
iov.iov_base = (void __user *)buf;
457486
iov.iov_len = len;
@@ -460,10 +489,14 @@ static ssize_t pfru_write(struct file *file, const char __user *buf,
460489
/* map the communication buffer */
461490
phy_addr = (phys_addr_t)((buf_info.addr_hi << 32) | buf_info.addr_lo);
462491
buf_ptr = memremap(phy_addr, buf_info.buf_size, MEMREMAP_WB);
463-
if (!buf_ptr)
492+
if (!buf_ptr) {
493+
dev_dbg(pfru_dev->parent_dev, "Failed to remap the buffer\n");
464494
return -ENOMEM;
495+
}
465496

466497
if (!copy_from_iter_full(buf_ptr, len, &iter)) {
498+
dev_dbg(pfru_dev->parent_dev,
499+
"Failed to copy the data from the user space buffer\n");
467500
ret = -EINVAL;
468501
goto unmap;
469502
}

0 commit comments

Comments
 (0)