summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c68
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,
3438clean_up: 3444clean_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;