Lines Matching +full:magic +full:- +full:packet

1 // SPDX-License-Identifier: GPL-2.0-only
119 u64 magic; member
127 * +------------------------------------------+
130 * +------------------------------------------+
136 * +------------------------------------------+
143 * +------------------------------------------+
145 * First is the metadata header. Userspace can use the magic number to verify
147 * New versions should keep the magic number location/value, and version
193 [12] = "qcom/aic200/aic200-nsp.bin",
201 [43] = "qcom/aic200/aic200-hlos.elf",
223 if (image_id == context->active_image_id) in sahara_find_image()
226 if (context->active_image_id != SAHARA_IMAGE_ID_NONE) { in sahara_find_image()
227 dev_err(&context->mhi_dev->dev, "image id %d is not valid as %d is active\n", in sahara_find_image()
228 image_id, context->active_image_id); in sahara_find_image()
229 return -EINVAL; in sahara_find_image()
232 if (image_id >= context->table_size || !context->image_table[image_id]) { in sahara_find_image()
233 dev_err(&context->mhi_dev->dev, "request for unknown image: %d\n", image_id); in sahara_find_image()
234 return -EINVAL; in sahara_find_image()
242 ret = firmware_request_nowarn(&context->firmware, in sahara_find_image()
243 context->image_table[image_id], in sahara_find_image()
244 &context->mhi_dev->dev); in sahara_find_image()
246 dev_dbg(&context->mhi_dev->dev, "request for image id %d / file %s failed %d\n", in sahara_find_image()
247 image_id, context->image_table[image_id], ret); in sahara_find_image()
251 context->active_image_id = image_id; in sahara_find_image()
258 if (context->active_image_id != SAHARA_IMAGE_ID_NONE) in sahara_release_image()
259 release_firmware(context->firmware); in sahara_release_image()
260 context->active_image_id = SAHARA_IMAGE_ID_NONE; in sahara_release_image()
267 context->is_mem_dump_mode = false; in sahara_send_reset()
269 context->tx[0]->cmd = cpu_to_le32(SAHARA_RESET_CMD); in sahara_send_reset()
270 context->tx[0]->length = cpu_to_le32(SAHARA_RESET_LENGTH); in sahara_send_reset()
272 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_send_reset()
275 dev_err(&context->mhi_dev->dev, "Unable to send reset response %d\n", ret); in sahara_send_reset()
282 dev_dbg(&context->mhi_dev->dev, in sahara_hello()
284 le32_to_cpu(context->rx->length), in sahara_hello()
285 le32_to_cpu(context->rx->hello.version), in sahara_hello()
286 le32_to_cpu(context->rx->hello.version_compat), in sahara_hello()
287 le32_to_cpu(context->rx->hello.max_length), in sahara_hello()
288 le32_to_cpu(context->rx->hello.mode)); in sahara_hello()
290 if (le32_to_cpu(context->rx->length) != SAHARA_HELLO_LENGTH) { in sahara_hello()
291 dev_err(&context->mhi_dev->dev, "Malformed hello packet - length %d\n", in sahara_hello()
292 le32_to_cpu(context->rx->length)); in sahara_hello()
295 if (le32_to_cpu(context->rx->hello.version) != SAHARA_VERSION) { in sahara_hello()
296 dev_err(&context->mhi_dev->dev, "Unsupported hello packet - version %d\n", in sahara_hello()
297 le32_to_cpu(context->rx->hello.version)); in sahara_hello()
301 if (le32_to_cpu(context->rx->hello.mode) != SAHARA_MODE_IMAGE_TX_PENDING && in sahara_hello()
302 le32_to_cpu(context->rx->hello.mode) != SAHARA_MODE_IMAGE_TX_COMPLETE && in sahara_hello()
303 le32_to_cpu(context->rx->hello.mode) != SAHARA_MODE_MEMORY_DEBUG) { in sahara_hello()
304 dev_err(&context->mhi_dev->dev, "Unsupported hello packet - mode %d\n", in sahara_hello()
305 le32_to_cpu(context->rx->hello.mode)); in sahara_hello()
309 context->tx[0]->cmd = cpu_to_le32(SAHARA_HELLO_RESP_CMD); in sahara_hello()
310 context->tx[0]->length = cpu_to_le32(SAHARA_HELLO_LENGTH); in sahara_hello()
311 context->tx[0]->hello_resp.version = cpu_to_le32(SAHARA_VERSION); in sahara_hello()
312 context->tx[0]->hello_resp.version_compat = cpu_to_le32(SAHARA_VERSION); in sahara_hello()
313 context->tx[0]->hello_resp.status = cpu_to_le32(SAHARA_SUCCESS); in sahara_hello()
314 context->tx[0]->hello_resp.mode = context->rx->hello_resp.mode; in sahara_hello()
316 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_hello()
319 dev_err(&context->mhi_dev->dev, "Unable to send hello response %d\n", ret); in sahara_hello()
328 dev_dbg(&context->mhi_dev->dev, in sahara_read_data()
330 le32_to_cpu(context->rx->length), in sahara_read_data()
331 le32_to_cpu(context->rx->read_data.image), in sahara_read_data()
332 le32_to_cpu(context->rx->read_data.offset), in sahara_read_data()
333 le32_to_cpu(context->rx->read_data.length)); in sahara_read_data()
335 if (le32_to_cpu(context->rx->length) != SAHARA_READ_DATA_LENGTH) { in sahara_read_data()
336 dev_err(&context->mhi_dev->dev, "Malformed read_data packet - length %d\n", in sahara_read_data()
337 le32_to_cpu(context->rx->length)); in sahara_read_data()
341 image_id = le32_to_cpu(context->rx->read_data.image); in sahara_read_data()
342 data_offset = le32_to_cpu(context->rx->read_data.offset); in sahara_read_data()
343 data_len = le32_to_cpu(context->rx->read_data.length); in sahara_read_data()
361 …dev_err(&context->mhi_dev->dev, "Malformed read_data packet - data len %d exceeds max xfer size %d… in sahara_read_data()
367 if (data_offset >= context->firmware->size) { in sahara_read_data()
368 …dev_err(&context->mhi_dev->dev, "Malformed read_data packet - data offset %d exceeds file size %zu… in sahara_read_data()
369 data_offset, context->firmware->size); in sahara_read_data()
374 if (size_add(data_offset, data_len) > context->firmware->size) { in sahara_read_data()
375 …dev_err(&context->mhi_dev->dev, "Malformed read_data packet - data offset %d and length %d exceeds… in sahara_read_data()
376 data_offset, data_len, context->firmware->size); in sahara_read_data()
384 memcpy(context->tx[i], &context->firmware->data[data_offset], pkt_data_len); in sahara_read_data()
387 data_len -= pkt_data_len; in sahara_read_data()
389 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, in sahara_read_data()
390 context->tx[i], pkt_data_len, in sahara_read_data()
393 dev_err(&context->mhi_dev->dev, "Unable to send read_data response %d\n", in sahara_read_data()
404 dev_dbg(&context->mhi_dev->dev, in sahara_end_of_image()
406 le32_to_cpu(context->rx->length), in sahara_end_of_image()
407 le32_to_cpu(context->rx->end_of_image.image), in sahara_end_of_image()
408 le32_to_cpu(context->rx->end_of_image.status)); in sahara_end_of_image()
410 if (le32_to_cpu(context->rx->length) != SAHARA_END_OF_IMAGE_LENGTH) { in sahara_end_of_image()
411 dev_err(&context->mhi_dev->dev, "Malformed end_of_image packet - length %d\n", in sahara_end_of_image()
412 le32_to_cpu(context->rx->length)); in sahara_end_of_image()
416 if (context->active_image_id != SAHARA_IMAGE_ID_NONE && in sahara_end_of_image()
417 le32_to_cpu(context->rx->end_of_image.image) != context->active_image_id) { in sahara_end_of_image()
418 …dev_err(&context->mhi_dev->dev, "Malformed end_of_image packet - image %d is not the active image\… in sahara_end_of_image()
419 le32_to_cpu(context->rx->end_of_image.image)); in sahara_end_of_image()
425 if (le32_to_cpu(context->rx->end_of_image.status)) in sahara_end_of_image()
428 context->tx[0]->cmd = cpu_to_le32(SAHARA_DONE_CMD); in sahara_end_of_image()
429 context->tx[0]->length = cpu_to_le32(SAHARA_DONE_LENGTH); in sahara_end_of_image()
431 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_end_of_image()
434 dev_dbg(&context->mhi_dev->dev, "Unable to send done response %d\n", ret); in sahara_end_of_image()
441 dev_dbg(&context->mhi_dev->dev, in sahara_memory_debug64()
443 le32_to_cpu(context->rx->length), in sahara_memory_debug64()
444 le64_to_cpu(context->rx->memory_debug64.table_address), in sahara_memory_debug64()
445 le64_to_cpu(context->rx->memory_debug64.table_length)); in sahara_memory_debug64()
447 if (le32_to_cpu(context->rx->length) != SAHARA_MEM_DEBUG64_LENGTH) { in sahara_memory_debug64()
448 dev_err(&context->mhi_dev->dev, "Malformed memory debug64 packet - length %d\n", in sahara_memory_debug64()
449 le32_to_cpu(context->rx->length)); in sahara_memory_debug64()
453 context->dump_table_address = le64_to_cpu(context->rx->memory_debug64.table_address); in sahara_memory_debug64()
454 context->dump_table_length = le64_to_cpu(context->rx->memory_debug64.table_length); in sahara_memory_debug64()
456 if (context->dump_table_length % sizeof(struct sahara_debug_table_entry64) != 0 || in sahara_memory_debug64()
457 !context->dump_table_length) { in sahara_memory_debug64()
458 dev_err(&context->mhi_dev->dev, "Malformed memory debug64 packet - table length %lld\n", in sahara_memory_debug64()
459 context->dump_table_length); in sahara_memory_debug64()
471 context->is_mem_dump_mode = true; in sahara_memory_debug64()
478 if (context->dump_table_length > SAHARA_PACKET_MAX_SIZE) { in sahara_memory_debug64()
479 …dev_err(&context->mhi_dev->dev, "Memory dump table length %lld exceeds supported size. Discarding … in sahara_memory_debug64()
480 context->dump_table_length); in sahara_memory_debug64()
485 context->tx[0]->cmd = cpu_to_le32(SAHARA_MEM_READ64_CMD); in sahara_memory_debug64()
486 context->tx[0]->length = cpu_to_le32(SAHARA_MEM_READ64_LENGTH); in sahara_memory_debug64()
487 context->tx[0]->memory_read64.memory_address = cpu_to_le64(context->dump_table_address); in sahara_memory_debug64()
488 context->tx[0]->memory_read64.memory_length = cpu_to_le64(context->dump_table_length); in sahara_memory_debug64()
490 context->rx_size_requested = context->dump_table_length; in sahara_memory_debug64()
492 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_memory_debug64()
495 dev_err(&context->mhi_dev->dev, "Unable to send read for dump table %d\n", ret); in sahara_memory_debug64()
503 switch (le32_to_cpu(context->rx->cmd)) { in sahara_processing()
523 dev_err(&context->mhi_dev->dev, "Unknown command %d\n", in sahara_processing()
524 le32_to_cpu(context->rx->cmd)); in sahara_processing()
528 ret = mhi_queue_buf(context->mhi_dev, DMA_FROM_DEVICE, context->rx, in sahara_processing()
531 dev_err(&context->mhi_dev->dev, "Unable to requeue rx buf %d\n", ret); in sahara_processing()
544 table_nents = context->dump_table_length / sizeof(*dev_table); in sahara_parse_dump_table()
545 context->dump_images_left = table_nents; in sahara_parse_dump_table()
548 dev_table = (struct sahara_debug_table_entry64 *)(context->rx); in sahara_parse_dump_table()
551 dev_table[i].description[SAHARA_TABLE_ENTRY_STR_LEN - 1] = 0; in sahara_parse_dump_table()
552 dev_table[i].filename[SAHARA_TABLE_ENTRY_STR_LEN - 1] = 0; in sahara_parse_dump_table()
561 dev_dbg(&context->mhi_dev->dev, in sahara_parse_dump_table()
584 context->mem_dump_sz = dump_length; in sahara_parse_dump_table()
585 context->mem_dump = vzalloc(dump_length); in sahara_parse_dump_table()
586 if (!context->mem_dump) { in sahara_parse_dump_table()
593 dump_meta = context->mem_dump; in sahara_parse_dump_table()
594 dump_meta->magic = SAHARA_DUMP_V1_MAGIC; in sahara_parse_dump_table()
595 dump_meta->version = SAHARA_DUMP_V1_VER; in sahara_parse_dump_table()
596 dump_meta->dump_size = dump_length; in sahara_parse_dump_table()
597 dump_meta->table_size = context->dump_table_length; in sahara_parse_dump_table()
599 image_out_table = context->mem_dump + sizeof(*dump_meta); in sahara_parse_dump_table()
611 context->mem_dump_freespace = &image_out_table[i]; in sahara_parse_dump_table()
614 context->dump_table_length = 0; in sahara_parse_dump_table()
617 context->dump_image = &image_out_table[0]; in sahara_parse_dump_table()
618 dump_length = min(context->dump_image->length, SAHARA_READ_MAX_SIZE); in sahara_parse_dump_table()
623 context->dump_image_offset = dump_length; in sahara_parse_dump_table()
625 context->tx[0]->cmd = cpu_to_le32(SAHARA_MEM_READ64_CMD); in sahara_parse_dump_table()
626 context->tx[0]->length = cpu_to_le32(SAHARA_MEM_READ64_LENGTH); in sahara_parse_dump_table()
627 context->tx[0]->memory_read64.memory_address = cpu_to_le64(context->dump_image->address); in sahara_parse_dump_table()
628 context->tx[0]->memory_read64.memory_length = cpu_to_le64(dump_length); in sahara_parse_dump_table()
630 context->rx_size_requested = dump_length; in sahara_parse_dump_table()
632 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_parse_dump_table()
635 dev_err(&context->mhi_dev->dev, "Unable to send read for dump content %d\n", ret); in sahara_parse_dump_table()
643 memcpy(context->mem_dump_freespace, context->rx, context->rx_size); in sahara_parse_dump_image()
644 context->mem_dump_freespace += context->rx_size; in sahara_parse_dump_image()
646 if (context->dump_image_offset >= context->dump_image->length) { in sahara_parse_dump_image()
648 context->dump_image++; in sahara_parse_dump_image()
649 context->dump_images_left--; in sahara_parse_dump_image()
650 context->dump_image_offset = 0; in sahara_parse_dump_image()
652 if (!context->dump_images_left) { in sahara_parse_dump_image()
654 dev_coredumpv(context->mhi_dev->mhi_cntrl->cntrl_dev, in sahara_parse_dump_image()
655 context->mem_dump, in sahara_parse_dump_image()
656 context->mem_dump_sz, in sahara_parse_dump_image()
658 context->mem_dump = NULL; in sahara_parse_dump_image()
665 dump_length = context->dump_image->length - context->dump_image_offset; in sahara_parse_dump_image()
671 context->tx[0]->cmd = cpu_to_le32(SAHARA_MEM_READ64_CMD); in sahara_parse_dump_image()
672 context->tx[0]->length = cpu_to_le32(SAHARA_MEM_READ64_LENGTH); in sahara_parse_dump_image()
673 context->tx[0]->memory_read64.memory_address = in sahara_parse_dump_image()
674 cpu_to_le64(context->dump_image->address + context->dump_image_offset); in sahara_parse_dump_image()
675 context->tx[0]->memory_read64.memory_length = cpu_to_le64(dump_length); in sahara_parse_dump_image()
677 context->dump_image_offset += dump_length; in sahara_parse_dump_image()
678 context->rx_size_requested = dump_length; in sahara_parse_dump_image()
680 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_parse_dump_image()
683 dev_err(&context->mhi_dev->dev, in sahara_parse_dump_image()
696 if (context->rx_size != context->rx_size_requested && in sahara_dump_processing()
697 context->rx_size != SAHARA_END_OF_IMAGE_LENGTH) { in sahara_dump_processing()
698 dev_err(&context->mhi_dev->dev, in sahara_dump_processing()
700 context->rx_size_requested, in sahara_dump_processing()
701 context->rx_size); in sahara_dump_processing()
705 if (context->rx_size == SAHARA_END_OF_IMAGE_LENGTH && in sahara_dump_processing()
706 le32_to_cpu(context->rx->cmd) == SAHARA_END_OF_IMAGE_CMD) { in sahara_dump_processing()
707 dev_err(&context->mhi_dev->dev, in sahara_dump_processing()
709 le32_to_cpu(context->rx->end_of_image.status)); in sahara_dump_processing()
713 if (context->rx_size == SAHARA_END_OF_IMAGE_LENGTH && in sahara_dump_processing()
714 le32_to_cpu(context->rx->cmd) != SAHARA_END_OF_IMAGE_CMD) { in sahara_dump_processing()
715 dev_err(&context->mhi_dev->dev, in sahara_dump_processing()
717 le32_to_cpu(context->rx->cmd)); in sahara_dump_processing()
727 if (context->dump_table_length) in sahara_dump_processing()
732 ret = mhi_queue_buf(context->mhi_dev, DMA_FROM_DEVICE, context->rx, in sahara_dump_processing()
735 dev_err(&context->mhi_dev->dev, "Unable to requeue rx buf %d\n", ret); in sahara_dump_processing()
740 vfree(context->mem_dump); in sahara_dump_processing()
741 context->mem_dump = NULL; in sahara_dump_processing()
751 context = devm_kzalloc(&mhi_dev->dev, sizeof(*context), GFP_KERNEL); in sahara_mhi_probe()
753 return -ENOMEM; in sahara_mhi_probe()
755 context->rx = devm_kzalloc(&mhi_dev->dev, SAHARA_PACKET_MAX_SIZE, GFP_KERNEL); in sahara_mhi_probe()
756 if (!context->rx) in sahara_mhi_probe()
757 return -ENOMEM; in sahara_mhi_probe()
771 context->tx[i] = devm_kzalloc(&mhi_dev->dev, SAHARA_PACKET_MAX_SIZE, GFP_KERNEL); in sahara_mhi_probe()
772 if (!context->tx[i]) in sahara_mhi_probe()
773 return -ENOMEM; in sahara_mhi_probe()
776 context->mhi_dev = mhi_dev; in sahara_mhi_probe()
777 INIT_WORK(&context->fw_work, sahara_processing); in sahara_mhi_probe()
778 INIT_WORK(&context->dump_work, sahara_dump_processing); in sahara_mhi_probe()
780 if (!strcmp(mhi_dev->mhi_cntrl->name, "AIC200")) { in sahara_mhi_probe()
781 context->image_table = aic200_image_table; in sahara_mhi_probe()
782 context->table_size = ARRAY_SIZE(aic200_image_table); in sahara_mhi_probe()
784 context->image_table = aic100_image_table; in sahara_mhi_probe()
785 context->table_size = ARRAY_SIZE(aic100_image_table); in sahara_mhi_probe()
788 context->active_image_id = SAHARA_IMAGE_ID_NONE; in sahara_mhi_probe()
789 dev_set_drvdata(&mhi_dev->dev, context); in sahara_mhi_probe()
795 ret = mhi_queue_buf(mhi_dev, DMA_FROM_DEVICE, context->rx, SAHARA_PACKET_MAX_SIZE, MHI_EOT); in sahara_mhi_probe()
806 struct sahara_context *context = dev_get_drvdata(&mhi_dev->dev); in sahara_mhi_remove()
808 cancel_work_sync(&context->fw_work); in sahara_mhi_remove()
809 cancel_work_sync(&context->dump_work); in sahara_mhi_remove()
810 vfree(context->mem_dump); in sahara_mhi_remove()
821 struct sahara_context *context = dev_get_drvdata(&mhi_dev->dev); in sahara_mhi_dl_xfer_cb()
823 if (!mhi_result->transaction_status) { in sahara_mhi_dl_xfer_cb()
824 context->rx_size = mhi_result->bytes_xferd; in sahara_mhi_dl_xfer_cb()
825 if (context->is_mem_dump_mode) in sahara_mhi_dl_xfer_cb()
826 schedule_work(&context->dump_work); in sahara_mhi_dl_xfer_cb()
828 schedule_work(&context->fw_work); in sahara_mhi_dl_xfer_cb()