1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2020-2021 Intel Corporation.
6 #include "iosm_ipc_coredump.h"
9 * ipc_coredump_collect - To collect coredump
10 * @devlink: Pointer to devlink instance.
11 * @data: Pointer to snapshot
12 * @entry: ID of requested snapshot
13 * @region_size: Region size
15 * Returns: 0 on success, error on failure
17 int ipc_coredump_collect(struct iosm_devlink *devlink, u8 **data, int entry,
20 int ret, bytes_to_read, bytes_read = 0, i = 0;
24 data_ptr = vmalloc(region_size);
28 remaining = devlink->cd_file_info[entry].actual_size;
29 ret = ipc_devlink_send_cmd(devlink, rpsi_cmd_coredump_get, entry);
31 dev_err(devlink->dev, "Send coredump_get cmd failed");
34 while (remaining > 0) {
35 bytes_to_read = min(remaining, MAX_DATA_SIZE);
37 ret = ipc_imem_sys_devlink_read(devlink, data_ptr + i,
38 bytes_to_read, &bytes_read);
40 dev_err(devlink->dev, "CD data read failed");
43 remaining -= bytes_read;
57 * ipc_coredump_get_list - Get coredump list from modem
58 * @devlink: Pointer to devlink instance.
59 * @cmd: RPSI command to be sent
61 * Returns: 0 on success, error on failure
63 int ipc_coredump_get_list(struct iosm_devlink *devlink, u16 cmd)
65 u32 byte_read, num_entries, file_size;
66 struct iosm_cd_table *cd_table;
67 u8 size[MAX_SIZE_LEN], i;
71 cd_table = kzalloc(MAX_CD_LIST_SIZE, GFP_KERNEL);
77 ret = ipc_devlink_send_cmd(devlink, cmd, MAX_CD_LIST_SIZE);
79 dev_err(devlink->dev, "rpsi_cmd_coredump_start failed");
83 ret = ipc_imem_sys_devlink_read(devlink, (u8 *)cd_table,
84 MAX_CD_LIST_SIZE, &byte_read);
86 dev_err(devlink->dev, "Coredump data is invalid");
90 if (byte_read != MAX_CD_LIST_SIZE)
93 if (cmd == rpsi_cmd_coredump_start) {
94 num_entries = le32_to_cpu(cd_table->list.num_entries);
95 if (num_entries == 0 || num_entries > IOSM_NOF_CD_REGION) {
100 for (i = 0; i < num_entries; i++) {
101 file_size = le32_to_cpu(cd_table->list.entry[i].size);
102 filename = cd_table->list.entry[i].filename;
104 if (file_size > devlink->cd_file_info[i].default_size) {
109 devlink->cd_file_info[i].actual_size = file_size;
110 dev_dbg(devlink->dev, "file: %s actual size %d",
111 filename, file_size);
112 devlink_flash_update_status_notify(devlink->devlink_ctx,
115 snprintf(size, sizeof(size), "%d", file_size);
116 devlink_flash_update_status_notify(devlink->devlink_ctx,