Lines Matching +full:rx +full:- +full:mode

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