On 2020-09-21 2:59 PM, Andy Shevchenko wrote: > On Mon, Sep 21, 2020 at 01:54:13PM +0200, Cezary Rojewski wrote: >> Declare global and stream IPC message handlers for all known message >> types. ... >> +int catpt_coredump(struct catpt_dev *cdev) >> +{ >> + struct catpt_dump_section_hdr *hdr; >> + size_t dump_size, regs_size; >> + u8 *dump, *pos; >> + int i, j; >> + >> + regs_size = CATPT_SHIM_REGS_SIZE; >> + regs_size += CATPT_DMA_COUNT * CATPT_DMA_REGS_SIZE; >> + regs_size += CATPT_SSP_COUNT * CATPT_SSP_REGS_SIZE; >> + dump_size = resource_size(&cdev->dram); >> + dump_size += resource_size(&cdev->iram); >> + dump_size += regs_size; > >> + dump_size += 4 * sizeof(*hdr) + 20; /* hdrs and fw hash */ > > Function is full of hard coded 20s. Can you provide descriptive macro? > Will declare CATPT_DUMP_HASH_SIZE instead of hardcodes, sure. >> + dump = vzalloc(dump_size); >> + if (!dump) >> + return -ENOMEM; >> + >> + pos = dump; >> + >> + hdr = (struct catpt_dump_section_hdr *)pos; >> + hdr->magic = CATPT_DUMP_MAGIC; >> + hdr->core_id = cdev->spec->core_id; >> + hdr->section_id = CATPT_DUMP_SECTION_ID_FILE; >> + hdr->size = dump_size - sizeof(*hdr); >> + pos += sizeof(*hdr); >> + >> + for (i = j = 0; i < FW_INFO_SIZE_MAX; i++) >> + if (cdev->ipc.config.fw_info[i] == ' ') >> + if (++j == 4) >> + break; > >> + for (j = ++i; j < FW_INFO_SIZE_MAX && j - i < 20; j++) { > > This should have static_assert() at the place where you define both constants > (2nd is mentioned above 20). > >> + if (cdev->ipc.config.fw_info[j] == ' ') >> + break; >> + *(pos + j - i) = cdev->ipc.config.fw_info[j]; >> + } >> + pos += 20; > > These two for-loops should have some comment to explain what's going on. > Actually, after poking my FW friends again I realized that it's just dumping 20chars from "hash" segment of fw_info (struct catpt_fw_ready, field: fw_info[]). So, this could be replaced by: /* navigate to fifth info segment (fw hash) */ for (i = j = 0; i < FW_INFO_SIZE_MAX; i++) /* info segments are separated by space each */ if (cdev->ipc.config.fw_info[i] == ' ') if (++j == 4) break; memcpy(pos, &cdev->ipc.config.fw_info[++i], CATPT_DUMP_HASH_SIZE); pos += CATPT_DUMP_HASH_SIZE; Existing for-loops were based on internal solution. Half of the code isn't needed afterall.. Czarek