diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index fc8d130c..275fbd4e 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |||
@@ -2438,6 +2438,7 @@ static int pmu_init_perfmon(struct pmu_gk20a *pmu) | |||
2438 | struct pmu_payload payload; | 2438 | struct pmu_payload payload; |
2439 | u32 seq; | 2439 | u32 seq; |
2440 | u32 data; | 2440 | u32 data; |
2441 | int err = 0; | ||
2441 | 2442 | ||
2442 | gk20a_dbg_fn(""); | 2443 | gk20a_dbg_fn(""); |
2443 | 2444 | ||
@@ -2488,11 +2489,12 @@ static int pmu_init_perfmon(struct pmu_gk20a *pmu) | |||
2488 | gk20a_writel(g, pwr_pmu_idle_ctrl_r(2), data); | 2489 | gk20a_writel(g, pwr_pmu_idle_ctrl_r(2), data); |
2489 | 2490 | ||
2490 | if (!pmu->sample_buffer) | 2491 | if (!pmu->sample_buffer) |
2491 | pmu->sample_buffer = gk20a_balloc(&pmu->dmem, | 2492 | err = pmu->dmem.alloc(&pmu->dmem, |
2492 | 2 * sizeof(u16)); | 2493 | &pmu->sample_buffer, 2 * sizeof(u16), |
2493 | if (!pmu->sample_buffer) { | 2494 | PMU_DMEM_ALLOC_ALIGNMENT); |
2495 | if (err) { | ||
2494 | gk20a_err(dev_from_gk20a(g), | 2496 | gk20a_err(dev_from_gk20a(g), |
2495 | "failed to allocate perfmon sample buffer"); | 2497 | "failed to allocate perfmon sample buffer"); |
2496 | return -ENOMEM; | 2498 | return -ENOMEM; |
2497 | } | 2499 | } |
2498 | 2500 | ||
@@ -2590,17 +2592,15 @@ static int pmu_process_init_msg(struct pmu_gk20a *pmu, | |||
2590 | for (i = 0; i < PMU_QUEUE_COUNT; i++) | 2592 | for (i = 0; i < PMU_QUEUE_COUNT; i++) |
2591 | pmu_queue_init(pmu, i, init); | 2593 | pmu_queue_init(pmu, i, init); |
2592 | 2594 | ||
2593 | if (!pmu->dmem.init) { | 2595 | if (!pmu->dmem.alloc) { |
2594 | /* Align start and end addresses */ | 2596 | /*Align start and end addresses*/ |
2595 | u32 start = ALIGN(pv->get_pmu_init_msg_pmu_sw_mg_off(init), | 2597 | u32 start = ALIGN(pv->get_pmu_init_msg_pmu_sw_mg_off(init), |
2596 | PMU_DMEM_ALLOC_ALIGNMENT); | 2598 | PMU_DMEM_ALLOC_ALIGNMENT); |
2597 | u32 end = (pv->get_pmu_init_msg_pmu_sw_mg_off(init) + | 2599 | u32 end = (pv->get_pmu_init_msg_pmu_sw_mg_off(init) + |
2598 | pv->get_pmu_init_msg_pmu_sw_mg_size(init)) & | 2600 | pv->get_pmu_init_msg_pmu_sw_mg_size(init)) & |
2599 | ~(PMU_DMEM_ALLOC_ALIGNMENT - 1); | 2601 | ~(PMU_DMEM_ALLOC_ALIGNMENT - 1); |
2600 | u32 size = end - start; | 2602 | u32 size = end - start; |
2601 | __gk20a_allocator_init(&pmu->dmem, NULL, "gk20a_pmu_dmem", | 2603 | gk20a_allocator_init(&pmu->dmem, "gk20a_pmu_dmem", start, size); |
2602 | start, size, | ||
2603 | PMU_DMEM_ALLOC_ALIGNMENT, 4, 0); | ||
2604 | } | 2604 | } |
2605 | 2605 | ||
2606 | pmu->pmu_ready = true; | 2606 | pmu->pmu_ready = true; |
@@ -2737,14 +2737,20 @@ static int pmu_response_handle(struct pmu_gk20a *pmu, | |||
2737 | seq->callback = NULL; | 2737 | seq->callback = NULL; |
2738 | if (pv->pmu_allocation_get_dmem_size(pmu, | 2738 | if (pv->pmu_allocation_get_dmem_size(pmu, |
2739 | pv->get_pmu_seq_in_a_ptr(seq)) != 0) | 2739 | pv->get_pmu_seq_in_a_ptr(seq)) != 0) |
2740 | gk20a_bfree(&pmu->dmem, | 2740 | pmu->dmem.free(&pmu->dmem, |
2741 | pv->pmu_allocation_get_dmem_offset(pmu, | 2741 | pv->pmu_allocation_get_dmem_offset(pmu, |
2742 | pv->get_pmu_seq_in_a_ptr(seq))); | 2742 | pv->get_pmu_seq_in_a_ptr(seq)), |
2743 | pv->pmu_allocation_get_dmem_size(pmu, | ||
2744 | pv->get_pmu_seq_in_a_ptr(seq)), | ||
2745 | PMU_DMEM_ALLOC_ALIGNMENT); | ||
2743 | if (pv->pmu_allocation_get_dmem_size(pmu, | 2746 | if (pv->pmu_allocation_get_dmem_size(pmu, |
2744 | pv->get_pmu_seq_out_a_ptr(seq)) != 0) | 2747 | pv->get_pmu_seq_out_a_ptr(seq)) != 0) |
2745 | gk20a_bfree(&pmu->dmem, | 2748 | pmu->dmem.free(&pmu->dmem, |
2746 | pv->pmu_allocation_get_dmem_offset(pmu, | 2749 | pv->pmu_allocation_get_dmem_offset(pmu, |
2747 | pv->get_pmu_seq_out_a_ptr(seq))); | 2750 | pv->get_pmu_seq_out_a_ptr(seq)), |
2751 | pv->pmu_allocation_get_dmem_size(pmu, | ||
2752 | pv->get_pmu_seq_out_a_ptr(seq)), | ||
2753 | PMU_DMEM_ALLOC_ALIGNMENT); | ||
2748 | 2754 | ||
2749 | if (seq->callback) | 2755 | if (seq->callback) |
2750 | seq->callback(g, msg, seq->cb_params, seq->desc, ret); | 2756 | seq->callback(g, msg, seq->cb_params, seq->desc, ret); |
@@ -3381,10 +3387,11 @@ int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd, | |||
3381 | pv->pmu_allocation_set_dmem_size(pmu, in, | 3387 | pv->pmu_allocation_set_dmem_size(pmu, in, |
3382 | (u16)max(payload->in.size, payload->out.size)); | 3388 | (u16)max(payload->in.size, payload->out.size)); |
3383 | 3389 | ||
3384 | *(pv->pmu_allocation_get_dmem_offset_addr(pmu, in)) = | 3390 | err = pmu->dmem.alloc(&pmu->dmem, |
3385 | gk20a_balloc(&pmu->dmem, | 3391 | pv->pmu_allocation_get_dmem_offset_addr(pmu, in), |
3386 | pv->pmu_allocation_get_dmem_size(pmu, in)); | 3392 | pv->pmu_allocation_get_dmem_size(pmu, in), |
3387 | if (!*(pv->pmu_allocation_get_dmem_offset_addr(pmu, in))) | 3393 | PMU_DMEM_ALLOC_ALIGNMENT); |
3394 | if (err) | ||
3388 | goto clean_up; | 3395 | goto clean_up; |
3389 | 3396 | ||
3390 | pmu_copy_to_dmem(pmu, (pv->pmu_allocation_get_dmem_offset(pmu, | 3397 | pmu_copy_to_dmem(pmu, (pv->pmu_allocation_get_dmem_offset(pmu, |
@@ -3405,12 +3412,11 @@ int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd, | |||
3405 | (u16)payload->out.size); | 3412 | (u16)payload->out.size); |
3406 | 3413 | ||
3407 | if (payload->out.buf != payload->in.buf) { | 3414 | if (payload->out.buf != payload->in.buf) { |
3408 | 3415 | err = pmu->dmem.alloc(&pmu->dmem, | |
3409 | *(pv->pmu_allocation_get_dmem_offset_addr(pmu, out)) = | 3416 | pv->pmu_allocation_get_dmem_offset_addr(pmu, out), |
3410 | gk20a_balloc(&pmu->dmem, | 3417 | pv->pmu_allocation_get_dmem_size(pmu, out), |
3411 | pv->pmu_allocation_get_dmem_size(pmu, out)); | 3418 | PMU_DMEM_ALLOC_ALIGNMENT); |
3412 | if (!*(pv->pmu_allocation_get_dmem_offset_addr(pmu, | 3419 | if (err) |
3413 | out))) | ||
3414 | goto clean_up; | 3420 | goto clean_up; |
3415 | } else { | 3421 | } else { |
3416 | BUG_ON(in == NULL); | 3422 | BUG_ON(in == NULL); |
@@ -3438,11 +3444,15 @@ int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd, | |||
3438 | clean_up: | 3444 | clean_up: |
3439 | gk20a_dbg_fn("fail"); | 3445 | gk20a_dbg_fn("fail"); |
3440 | if (in) | 3446 | if (in) |
3441 | gk20a_bfree(&pmu->dmem, | 3447 | pmu->dmem.free(&pmu->dmem, |
3442 | pv->pmu_allocation_get_dmem_offset(pmu, in)); | 3448 | pv->pmu_allocation_get_dmem_offset(pmu, in), |
3449 | pv->pmu_allocation_get_dmem_size(pmu, in), | ||
3450 | PMU_DMEM_ALLOC_ALIGNMENT); | ||
3443 | if (out) | 3451 | if (out) |
3444 | gk20a_bfree(&pmu->dmem, | 3452 | pmu->dmem.free(&pmu->dmem, |
3445 | pv->pmu_allocation_get_dmem_offset(pmu, out)); | 3453 | pv->pmu_allocation_get_dmem_offset(pmu, out), |
3454 | pv->pmu_allocation_get_dmem_size(pmu, out), | ||
3455 | PMU_DMEM_ALLOC_ALIGNMENT); | ||
3446 | 3456 | ||
3447 | pmu_seq_release(pmu, seq); | 3457 | pmu_seq_release(pmu, seq); |
3448 | return err; | 3458 | return err; |