Lines Matching +full:rx +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0-only
127 * +------------------------------------------+
130 * +------------------------------------------+
136 * +------------------------------------------+
143 * +------------------------------------------+
159 struct sahara_packet *rx; member
195 if (image_id == context->active_image_id) in sahara_find_image()
198 if (context->active_image_id != SAHARA_IMAGE_ID_NONE) { in sahara_find_image()
199 dev_err(&context->mhi_dev->dev, "image id %d is not valid as %d is active\n", in sahara_find_image()
200 image_id, context->active_image_id); in sahara_find_image()
201 return -EINVAL; in sahara_find_image()
204 if (image_id >= context->table_size || !context->image_table[image_id]) { in sahara_find_image()
205 dev_err(&context->mhi_dev->dev, "request for unknown image: %d\n", image_id); in sahara_find_image()
206 return -EINVAL; in sahara_find_image()
210 * This image might be optional. The device may continue without it. in sahara_find_image()
211 * Only the device knows. Suppress error messages that could suggest an in sahara_find_image()
214 ret = firmware_request_nowarn(&context->firmware, in sahara_find_image()
215 context->image_table[image_id], in sahara_find_image()
216 &context->mhi_dev->dev); in sahara_find_image()
218 dev_dbg(&context->mhi_dev->dev, "request for image id %d / file %s failed %d\n", in sahara_find_image()
219 image_id, context->image_table[image_id], ret); in sahara_find_image()
223 context->active_image_id = image_id; in sahara_find_image()
230 if (context->active_image_id != SAHARA_IMAGE_ID_NONE) in sahara_release_image()
231 release_firmware(context->firmware); in sahara_release_image()
232 context->active_image_id = SAHARA_IMAGE_ID_NONE; in sahara_release_image()
239 context->is_mem_dump_mode = false; in sahara_send_reset()
241 context->tx[0]->cmd = cpu_to_le32(SAHARA_RESET_CMD); in sahara_send_reset()
242 context->tx[0]->length = cpu_to_le32(SAHARA_RESET_LENGTH); in sahara_send_reset()
244 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_send_reset()
247 dev_err(&context->mhi_dev->dev, "Unable to send reset response %d\n", ret); in sahara_send_reset()
254 dev_dbg(&context->mhi_dev->dev, in sahara_hello()
256 le32_to_cpu(context->rx->length), in sahara_hello()
257 le32_to_cpu(context->rx->hello.version), in sahara_hello()
258 le32_to_cpu(context->rx->hello.version_compat), in sahara_hello()
259 le32_to_cpu(context->rx->hello.max_length), in sahara_hello()
260 le32_to_cpu(context->rx->hello.mode)); in sahara_hello()
262 if (le32_to_cpu(context->rx->length) != SAHARA_HELLO_LENGTH) { in sahara_hello()
263 dev_err(&context->mhi_dev->dev, "Malformed hello packet - length %d\n", in sahara_hello()
264 le32_to_cpu(context->rx->length)); in sahara_hello()
267 if (le32_to_cpu(context->rx->hello.version) != SAHARA_VERSION) { in sahara_hello()
268 dev_err(&context->mhi_dev->dev, "Unsupported hello packet - version %d\n", in sahara_hello()
269 le32_to_cpu(context->rx->hello.version)); in sahara_hello()
273 if (le32_to_cpu(context->rx->hello.mode) != SAHARA_MODE_IMAGE_TX_PENDING && in sahara_hello()
274 le32_to_cpu(context->rx->hello.mode) != SAHARA_MODE_IMAGE_TX_COMPLETE && in sahara_hello()
275 le32_to_cpu(context->rx->hello.mode) != SAHARA_MODE_MEMORY_DEBUG) { in sahara_hello()
276 dev_err(&context->mhi_dev->dev, "Unsupported hello packet - mode %d\n", in sahara_hello()
277 le32_to_cpu(context->rx->hello.mode)); in sahara_hello()
281 context->tx[0]->cmd = cpu_to_le32(SAHARA_HELLO_RESP_CMD); in sahara_hello()
282 context->tx[0]->length = cpu_to_le32(SAHARA_HELLO_LENGTH); in sahara_hello()
283 context->tx[0]->hello_resp.version = cpu_to_le32(SAHARA_VERSION); in sahara_hello()
284 context->tx[0]->hello_resp.version_compat = cpu_to_le32(SAHARA_VERSION); in sahara_hello()
285 context->tx[0]->hello_resp.status = cpu_to_le32(SAHARA_SUCCESS); in sahara_hello()
286 context->tx[0]->hello_resp.mode = context->rx->hello_resp.mode; in sahara_hello()
288 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_hello()
291 dev_err(&context->mhi_dev->dev, "Unable to send hello response %d\n", ret); in sahara_hello()
300 dev_dbg(&context->mhi_dev->dev, in sahara_read_data()
302 le32_to_cpu(context->rx->length), in sahara_read_data()
303 le32_to_cpu(context->rx->read_data.image), in sahara_read_data()
304 le32_to_cpu(context->rx->read_data.offset), in sahara_read_data()
305 le32_to_cpu(context->rx->read_data.length)); in sahara_read_data()
307 if (le32_to_cpu(context->rx->length) != SAHARA_READ_DATA_LENGTH) { in sahara_read_data()
308 dev_err(&context->mhi_dev->dev, "Malformed read_data packet - length %d\n", in sahara_read_data()
309 le32_to_cpu(context->rx->length)); in sahara_read_data()
313 image_id = le32_to_cpu(context->rx->read_data.image); in sahara_read_data()
314 data_offset = le32_to_cpu(context->rx->read_data.offset); in sahara_read_data()
315 data_len = le32_to_cpu(context->rx->read_data.length); in sahara_read_data()
324 * Image is released when the device is done with it via in sahara_read_data()
326 * device to retry the operation with a modification, or decide to be in sahara_read_data()
333 …dev_err(&context->mhi_dev->dev, "Malformed read_data packet - data len %d exceeds max xfer size %d… in sahara_read_data()
339 if (data_offset >= context->firmware->size) { in sahara_read_data()
340 …dev_err(&context->mhi_dev->dev, "Malformed read_data packet - data offset %d exceeds file size %zu… in sahara_read_data()
341 data_offset, context->firmware->size); in sahara_read_data()
346 if (size_add(data_offset, data_len) > context->firmware->size) { in sahara_read_data()
347 …dev_err(&context->mhi_dev->dev, "Malformed read_data packet - data offset %d and length %d exceeds… in sahara_read_data()
348 data_offset, data_len, context->firmware->size); in sahara_read_data()
356 memcpy(context->tx[i], &context->firmware->data[data_offset], pkt_data_len); in sahara_read_data()
359 data_len -= pkt_data_len; in sahara_read_data()
361 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, in sahara_read_data()
362 context->tx[i], pkt_data_len, in sahara_read_data()
365 dev_err(&context->mhi_dev->dev, "Unable to send read_data response %d\n", in sahara_read_data()
376 dev_dbg(&context->mhi_dev->dev, in sahara_end_of_image()
378 le32_to_cpu(context->rx->length), in sahara_end_of_image()
379 le32_to_cpu(context->rx->end_of_image.image), in sahara_end_of_image()
380 le32_to_cpu(context->rx->end_of_image.status)); in sahara_end_of_image()
382 if (le32_to_cpu(context->rx->length) != SAHARA_END_OF_IMAGE_LENGTH) { in sahara_end_of_image()
383 dev_err(&context->mhi_dev->dev, "Malformed end_of_image packet - length %d\n", in sahara_end_of_image()
384 le32_to_cpu(context->rx->length)); in sahara_end_of_image()
388 if (context->active_image_id != SAHARA_IMAGE_ID_NONE && in sahara_end_of_image()
389 le32_to_cpu(context->rx->end_of_image.image) != context->active_image_id) { in sahara_end_of_image()
390 …dev_err(&context->mhi_dev->dev, "Malformed end_of_image packet - image %d is not the active image\… in sahara_end_of_image()
391 le32_to_cpu(context->rx->end_of_image.image)); in sahara_end_of_image()
397 if (le32_to_cpu(context->rx->end_of_image.status)) in sahara_end_of_image()
400 context->tx[0]->cmd = cpu_to_le32(SAHARA_DONE_CMD); in sahara_end_of_image()
401 context->tx[0]->length = cpu_to_le32(SAHARA_DONE_LENGTH); in sahara_end_of_image()
403 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_end_of_image()
406 dev_dbg(&context->mhi_dev->dev, "Unable to send done response %d\n", ret); in sahara_end_of_image()
413 dev_dbg(&context->mhi_dev->dev, in sahara_memory_debug64()
415 le32_to_cpu(context->rx->length), in sahara_memory_debug64()
416 le64_to_cpu(context->rx->memory_debug64.table_address), in sahara_memory_debug64()
417 le64_to_cpu(context->rx->memory_debug64.table_length)); in sahara_memory_debug64()
419 if (le32_to_cpu(context->rx->length) != SAHARA_MEM_DEBUG64_LENGTH) { in sahara_memory_debug64()
420 dev_err(&context->mhi_dev->dev, "Malformed memory debug64 packet - length %d\n", in sahara_memory_debug64()
421 le32_to_cpu(context->rx->length)); in sahara_memory_debug64()
425 context->dump_table_address = le64_to_cpu(context->rx->memory_debug64.table_address); in sahara_memory_debug64()
426 context->dump_table_length = le64_to_cpu(context->rx->memory_debug64.table_length); in sahara_memory_debug64()
428 if (context->dump_table_length % sizeof(struct sahara_debug_table_entry64) != 0 || in sahara_memory_debug64()
429 !context->dump_table_length) { in sahara_memory_debug64()
430 dev_err(&context->mhi_dev->dev, "Malformed memory debug64 packet - table length %lld\n", in sahara_memory_debug64()
431 context->dump_table_length); in sahara_memory_debug64()
437 * the device, and the device responds with the raw data. If the device in sahara_memory_debug64()
443 context->is_mem_dump_mode = true; in sahara_memory_debug64()
448 * no known device will exceed this. in sahara_memory_debug64()
450 if (context->dump_table_length > SAHARA_PACKET_MAX_SIZE) { in sahara_memory_debug64()
451 …dev_err(&context->mhi_dev->dev, "Memory dump table length %lld exceeds supported size. Discarding … in sahara_memory_debug64()
452 context->dump_table_length); in sahara_memory_debug64()
457 context->tx[0]->cmd = cpu_to_le32(SAHARA_MEM_READ64_CMD); in sahara_memory_debug64()
458 context->tx[0]->length = cpu_to_le32(SAHARA_MEM_READ64_LENGTH); in sahara_memory_debug64()
459 context->tx[0]->memory_read64.memory_address = cpu_to_le64(context->dump_table_address); in sahara_memory_debug64()
460 context->tx[0]->memory_read64.memory_length = cpu_to_le64(context->dump_table_length); in sahara_memory_debug64()
462 context->rx_size_requested = context->dump_table_length; in sahara_memory_debug64()
464 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_memory_debug64()
467 dev_err(&context->mhi_dev->dev, "Unable to send read for dump table %d\n", ret); in sahara_memory_debug64()
475 switch (le32_to_cpu(context->rx->cmd)) { in sahara_processing()
495 dev_err(&context->mhi_dev->dev, "Unknown command %d\n", in sahara_processing()
496 le32_to_cpu(context->rx->cmd)); in sahara_processing()
500 ret = mhi_queue_buf(context->mhi_dev, DMA_FROM_DEVICE, context->rx, in sahara_processing()
503 dev_err(&context->mhi_dev->dev, "Unable to requeue rx buf %d\n", ret); in sahara_processing()
516 table_nents = context->dump_table_length / sizeof(*dev_table); in sahara_parse_dump_table()
517 context->dump_images_left = table_nents; in sahara_parse_dump_table()
520 dev_table = (struct sahara_debug_table_entry64 *)(context->rx); in sahara_parse_dump_table()
522 /* Do not trust the device, ensure the strings are terminated */ in sahara_parse_dump_table()
523 dev_table[i].description[SAHARA_TABLE_ENTRY_STR_LEN - 1] = 0; in sahara_parse_dump_table()
524 dev_table[i].filename[SAHARA_TABLE_ENTRY_STR_LEN - 1] = 0; in sahara_parse_dump_table()
533 dev_dbg(&context->mhi_dev->dev, in sahara_parse_dump_table()
556 context->mem_dump_sz = dump_length; in sahara_parse_dump_table()
557 context->mem_dump = vzalloc(dump_length); in sahara_parse_dump_table()
558 if (!context->mem_dump) { in sahara_parse_dump_table()
565 dump_meta = context->mem_dump; in sahara_parse_dump_table()
566 dump_meta->magic = SAHARA_DUMP_V1_MAGIC; in sahara_parse_dump_table()
567 dump_meta->version = SAHARA_DUMP_V1_VER; in sahara_parse_dump_table()
568 dump_meta->dump_size = dump_length; in sahara_parse_dump_table()
569 dump_meta->table_size = context->dump_table_length; in sahara_parse_dump_table()
571 image_out_table = context->mem_dump + sizeof(*dump_meta); in sahara_parse_dump_table()
583 context->mem_dump_freespace = &image_out_table[i]; in sahara_parse_dump_table()
586 context->dump_table_length = 0; in sahara_parse_dump_table()
589 context->dump_image = &image_out_table[0]; in sahara_parse_dump_table()
590 dump_length = min(context->dump_image->length, SAHARA_READ_MAX_SIZE); in sahara_parse_dump_table()
595 context->dump_image_offset = dump_length; in sahara_parse_dump_table()
597 context->tx[0]->cmd = cpu_to_le32(SAHARA_MEM_READ64_CMD); in sahara_parse_dump_table()
598 context->tx[0]->length = cpu_to_le32(SAHARA_MEM_READ64_LENGTH); in sahara_parse_dump_table()
599 context->tx[0]->memory_read64.memory_address = cpu_to_le64(context->dump_image->address); in sahara_parse_dump_table()
600 context->tx[0]->memory_read64.memory_length = cpu_to_le64(dump_length); in sahara_parse_dump_table()
602 context->rx_size_requested = dump_length; in sahara_parse_dump_table()
604 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_parse_dump_table()
607 dev_err(&context->mhi_dev->dev, "Unable to send read for dump content %d\n", ret); in sahara_parse_dump_table()
615 memcpy(context->mem_dump_freespace, context->rx, context->rx_size); in sahara_parse_dump_image()
616 context->mem_dump_freespace += context->rx_size; in sahara_parse_dump_image()
618 if (context->dump_image_offset >= context->dump_image->length) { in sahara_parse_dump_image()
620 context->dump_image++; in sahara_parse_dump_image()
621 context->dump_images_left--; in sahara_parse_dump_image()
622 context->dump_image_offset = 0; in sahara_parse_dump_image()
624 if (!context->dump_images_left) { in sahara_parse_dump_image()
626 dev_coredumpv(context->mhi_dev->mhi_cntrl->cntrl_dev, in sahara_parse_dump_image()
627 context->mem_dump, in sahara_parse_dump_image()
628 context->mem_dump_sz, in sahara_parse_dump_image()
630 context->mem_dump = NULL; in sahara_parse_dump_image()
637 dump_length = context->dump_image->length - context->dump_image_offset; in sahara_parse_dump_image()
643 context->tx[0]->cmd = cpu_to_le32(SAHARA_MEM_READ64_CMD); in sahara_parse_dump_image()
644 context->tx[0]->length = cpu_to_le32(SAHARA_MEM_READ64_LENGTH); in sahara_parse_dump_image()
645 context->tx[0]->memory_read64.memory_address = in sahara_parse_dump_image()
646 cpu_to_le64(context->dump_image->address + context->dump_image_offset); in sahara_parse_dump_image()
647 context->tx[0]->memory_read64.memory_length = cpu_to_le64(dump_length); in sahara_parse_dump_image()
649 context->dump_image_offset += dump_length; in sahara_parse_dump_image()
650 context->rx_size_requested = dump_length; in sahara_parse_dump_image()
652 ret = mhi_queue_buf(context->mhi_dev, DMA_TO_DEVICE, context->tx[0], in sahara_parse_dump_image()
655 dev_err(&context->mhi_dev->dev, in sahara_parse_dump_image()
665 * We should get the expected raw data, but if the device has an error in sahara_dump_processing()
668 if (context->rx_size != context->rx_size_requested && in sahara_dump_processing()
669 context->rx_size != SAHARA_END_OF_IMAGE_LENGTH) { in sahara_dump_processing()
670 dev_err(&context->mhi_dev->dev, in sahara_dump_processing()
672 context->rx_size_requested, in sahara_dump_processing()
673 context->rx_size); in sahara_dump_processing()
677 if (context->rx_size == SAHARA_END_OF_IMAGE_LENGTH && in sahara_dump_processing()
678 le32_to_cpu(context->rx->cmd) == SAHARA_END_OF_IMAGE_CMD) { in sahara_dump_processing()
679 dev_err(&context->mhi_dev->dev, in sahara_dump_processing()
681 le32_to_cpu(context->rx->end_of_image.status)); in sahara_dump_processing()
685 if (context->rx_size == SAHARA_END_OF_IMAGE_LENGTH && in sahara_dump_processing()
686 le32_to_cpu(context->rx->cmd) != SAHARA_END_OF_IMAGE_CMD) { in sahara_dump_processing()
687 dev_err(&context->mhi_dev->dev, in sahara_dump_processing()
689 le32_to_cpu(context->rx->cmd)); in sahara_dump_processing()
699 if (context->dump_table_length) in sahara_dump_processing()
704 ret = mhi_queue_buf(context->mhi_dev, DMA_FROM_DEVICE, context->rx, in sahara_dump_processing()
707 dev_err(&context->mhi_dev->dev, "Unable to requeue rx buf %d\n", ret); in sahara_dump_processing()
712 vfree(context->mem_dump); in sahara_dump_processing()
713 context->mem_dump = NULL; in sahara_dump_processing()
723 context = devm_kzalloc(&mhi_dev->dev, sizeof(*context), GFP_KERNEL); in sahara_mhi_probe()
725 return -ENOMEM; in sahara_mhi_probe()
727 context->rx = devm_kzalloc(&mhi_dev->dev, SAHARA_PACKET_MAX_SIZE, GFP_KERNEL); in sahara_mhi_probe()
728 if (!context->rx) in sahara_mhi_probe()
729 return -ENOMEM; in sahara_mhi_probe()
743 context->tx[i] = devm_kzalloc(&mhi_dev->dev, SAHARA_PACKET_MAX_SIZE, GFP_KERNEL); in sahara_mhi_probe()
744 if (!context->tx[i]) in sahara_mhi_probe()
745 return -ENOMEM; in sahara_mhi_probe()
748 context->mhi_dev = mhi_dev; in sahara_mhi_probe()
749 INIT_WORK(&context->fw_work, sahara_processing); in sahara_mhi_probe()
750 INIT_WORK(&context->dump_work, sahara_dump_processing); in sahara_mhi_probe()
751 context->image_table = aic100_image_table; in sahara_mhi_probe()
752 context->table_size = ARRAY_SIZE(aic100_image_table); in sahara_mhi_probe()
753 context->active_image_id = SAHARA_IMAGE_ID_NONE; in sahara_mhi_probe()
754 dev_set_drvdata(&mhi_dev->dev, context); in sahara_mhi_probe()
760 ret = mhi_queue_buf(mhi_dev, DMA_FROM_DEVICE, context->rx, SAHARA_PACKET_MAX_SIZE, MHI_EOT); in sahara_mhi_probe()
771 struct sahara_context *context = dev_get_drvdata(&mhi_dev->dev); in sahara_mhi_remove()
773 cancel_work_sync(&context->fw_work); in sahara_mhi_remove()
774 cancel_work_sync(&context->dump_work); in sahara_mhi_remove()
775 vfree(context->mem_dump); in sahara_mhi_remove()
786 struct sahara_context *context = dev_get_drvdata(&mhi_dev->dev); in sahara_mhi_dl_xfer_cb()
788 if (!mhi_result->transaction_status) { in sahara_mhi_dl_xfer_cb()
789 context->rx_size = mhi_result->bytes_xferd; in sahara_mhi_dl_xfer_cb()
790 if (context->is_mem_dump_mode) in sahara_mhi_dl_xfer_cb()
791 schedule_work(&context->dump_work); in sahara_mhi_dl_xfer_cb()
793 schedule_work(&context->fw_work); in sahara_mhi_dl_xfer_cb()