diff options
author | Vijayakumar <vsubbu@nvidia.com> | 2016-08-19 09:18:06 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2016-09-19 02:34:21 -0400 |
commit | 4ae85fd8c9bc24cac0ab2da7401df1f4cfc7a143 (patch) | |
tree | 9654a73acb0519878918611bd57047e7b971f152 /drivers | |
parent | 4894ebbda5bcf3f93a79cbce95dad1585996b19d (diff) |
gpu: nvgpu: fix handling of return data in pmu messages
Irrespective generic MSG ptr, pick up data that PMU sends
as response to commands
JIRA DNVGPU-85
Change-Id: I97dd2abcd9e2a7ad7bfe1270f9905a5b69e196f3
Signed-off-by: Vijayakumar <vsubbu@nvidia.com>
Reviewed-on: http://git-master/r/1205119
Reviewed-on: http://git-master/r/1205447
(cherry picked from commit b1130124157acb2cfb4d04a0dd6ee8c4c0c830e5)
Reviewed-on: http://git-master/r/1222684
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index f64aa608..2540ab12 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |||
@@ -3748,21 +3748,24 @@ static int pmu_response_handle(struct pmu_gk20a *pmu, | |||
3748 | if (seq->msg) { | 3748 | if (seq->msg) { |
3749 | if (seq->msg->hdr.size >= msg->hdr.size) { | 3749 | if (seq->msg->hdr.size >= msg->hdr.size) { |
3750 | memcpy(seq->msg, msg, msg->hdr.size); | 3750 | memcpy(seq->msg, msg, msg->hdr.size); |
3751 | if (pv->pmu_allocation_get_dmem_size(pmu, | 3751 | } else { |
3752 | pv->get_pmu_seq_out_a_ptr(seq)) != 0) { | ||
3753 | pmu_copy_from_dmem(pmu, | ||
3754 | pv->pmu_allocation_get_dmem_offset(pmu, | ||
3755 | pv->get_pmu_seq_out_a_ptr(seq)), | ||
3756 | seq->out_payload, | ||
3757 | pv->pmu_allocation_get_dmem_size(pmu, | ||
3758 | pv->get_pmu_seq_out_a_ptr(seq)), 0); | ||
3759 | } | ||
3760 | } else { | ||
3761 | gk20a_err(dev_from_gk20a(g), | 3752 | gk20a_err(dev_from_gk20a(g), |
3762 | "sequence %d msg buffer too small", | 3753 | "sequence %d msg buffer too small", |
3763 | seq->id); | 3754 | seq->id); |
3764 | } | 3755 | } |
3765 | } | 3756 | } |
3757 | if (pv->pmu_allocation_get_dmem_size(pmu, | ||
3758 | pv->get_pmu_seq_out_a_ptr(seq)) != 0) { | ||
3759 | gk20a_err(dev_from_gk20a(g), "dmem offs %x size %x\n", pv->pmu_allocation_get_dmem_offset(pmu,pv->get_pmu_seq_out_a_ptr(seq)), pv->pmu_allocation_get_dmem_size(pmu, | ||
3760 | pv->get_pmu_seq_out_a_ptr(seq))); | ||
3761 | gk20a_err(dev_from_gk20a(g), "copying to %p \n", seq->out_payload); | ||
3762 | pmu_copy_from_dmem(pmu, | ||
3763 | pv->pmu_allocation_get_dmem_offset(pmu, | ||
3764 | pv->get_pmu_seq_out_a_ptr(seq)), | ||
3765 | seq->out_payload, | ||
3766 | pv->pmu_allocation_get_dmem_size(pmu, | ||
3767 | pv->get_pmu_seq_out_a_ptr(seq)), 0); | ||
3768 | } | ||
3766 | } else | 3769 | } else |
3767 | seq->callback = NULL; | 3770 | seq->callback = NULL; |
3768 | if (pv->pmu_allocation_get_dmem_size(pmu, | 3771 | if (pv->pmu_allocation_get_dmem_size(pmu, |
@@ -4584,6 +4587,7 @@ int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd, | |||
4584 | 4587 | ||
4585 | 4588 | ||
4586 | seq->state = PMU_SEQ_STATE_USED; | 4589 | seq->state = PMU_SEQ_STATE_USED; |
4590 | |||
4587 | err = pmu_write_cmd(pmu, cmd, queue_id, timeout); | 4591 | err = pmu_write_cmd(pmu, cmd, queue_id, timeout); |
4588 | if (err) | 4592 | if (err) |
4589 | seq->state = PMU_SEQ_STATE_PENDING; | 4593 | seq->state = PMU_SEQ_STATE_PENDING; |