summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
authorVijayakumar Subbu <vsubbu@nvidia.com>2016-08-12 23:53:27 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-09-19 02:34:13 -0400
commit4894ebbda5bcf3f93a79cbce95dad1585996b19d (patch)
tree2a82436653ca81f37aa920a4ae986f208f81cb14 /drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
parent3351916f567dc9aacb2b05cae911a8e5573de996 (diff)
gpu: nvgpu: fix pmu msg and command queue init
Offset needs to be calculated for individual queues from init ack content Bug 200229814 Signed-off-by: Vijayakumar Subbu <vsubbu@nvidia.com> Change-Id: I93276b9cbab48e7fc42fb6c2a8edf382afb82f71 Reviewed-on: http://git-master/r/1202291 (cherry picked from commit 0e0abd478a13a5163e2b83d07307ed7136c4920e) Reviewed-on: http://git-master/r/1205442 (cherry picked from commit f402cc2a9d0be05b5b95d5d0acbfc66f3b78b309) Reviewed-on: http://git-master/r/1222683 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index a2609dbb..f64aa608 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -1148,10 +1148,15 @@ static void get_pmu_init_msg_pmu_queue_params_v3(struct pmu_queue *queue,
1148{ 1148{
1149 struct pmu_init_msg_pmu_v3 *init = 1149 struct pmu_init_msg_pmu_v3 *init =
1150 (struct pmu_init_msg_pmu_v3 *)pmu_init_msg; 1150 (struct pmu_init_msg_pmu_v3 *)pmu_init_msg;
1151 1151 u32 current_ptr = 0;
1152 u8 i;
1152 queue->index = init->queue_index[id]; 1153 queue->index = init->queue_index[id];
1153 queue->offset = init->queue_offset;
1154 queue->size = init->queue_size[id]; 1154 queue->size = init->queue_size[id];
1155 if (id != 0) {
1156 for ( i = 0 ; i < id; i++)
1157 current_ptr += init->queue_size[i];
1158 }
1159 queue->offset = init->queue_offset + current_ptr;
1155} 1160}
1156 1161
1157static void *get_pmu_sequence_in_alloc_ptr_v3(struct pmu_sequence *seq) 1162static void *get_pmu_sequence_in_alloc_ptr_v3(struct pmu_sequence *seq)
@@ -2493,6 +2498,7 @@ static int pmu_queue_tail(struct pmu_gk20a *pmu, struct pmu_queue *queue,
2493 gk20a_writel(g, 2498 gk20a_writel(g,
2494 pwr_pmu_queue_tail_r(queue->index), 2499 pwr_pmu_queue_tail_r(queue->index),
2495 pwr_pmu_queue_tail_address_f(*tail)); 2500 pwr_pmu_queue_tail_address_f(*tail));
2501
2496 } else { 2502 } else {
2497 if (!set) 2503 if (!set)
2498 *tail = pwr_pmu_msgq_tail_val_v( 2504 *tail = pwr_pmu_msgq_tail_val_v(
@@ -2681,14 +2687,14 @@ static bool pmu_queue_is_empty(struct pmu_gk20a *pmu,
2681static bool pmu_queue_has_room(struct pmu_gk20a *pmu, 2687static bool pmu_queue_has_room(struct pmu_gk20a *pmu,
2682 struct pmu_queue *queue, u32 size, bool *need_rewind) 2688 struct pmu_queue *queue, u32 size, bool *need_rewind)
2683{ 2689{
2684 u32 head, tail, free; 2690 u32 head, tail;
2685 bool rewind = false; 2691 bool rewind = false;
2692 int free;
2686 2693
2687 size = ALIGN(size, QUEUE_ALIGNMENT); 2694 size = ALIGN(size, QUEUE_ALIGNMENT);
2688 2695
2689 pmu_queue_head(pmu, queue, &head, QUEUE_GET); 2696 pmu_queue_head(pmu, queue, &head, QUEUE_GET);
2690 pmu_queue_tail(pmu, queue, &tail, QUEUE_GET); 2697 pmu_queue_tail(pmu, queue, &tail, QUEUE_GET);
2691
2692 if (head >= tail) { 2698 if (head >= tail) {
2693 free = queue->offset + queue->size - head; 2699 free = queue->offset + queue->size - head;
2694 free -= PMU_CMD_HDR_SIZE; 2700 free -= PMU_CMD_HDR_SIZE;
@@ -2711,6 +2717,7 @@ static bool pmu_queue_has_room(struct pmu_gk20a *pmu,
2711static int pmu_queue_push(struct pmu_gk20a *pmu, 2717static int pmu_queue_push(struct pmu_gk20a *pmu,
2712 struct pmu_queue *queue, void *data, u32 size) 2718 struct pmu_queue *queue, void *data, u32 size)
2713{ 2719{
2720
2714 gk20a_dbg_fn(""); 2721 gk20a_dbg_fn("");
2715 2722
2716 if (!queue->opened && queue->oflag == OFLAG_WRITE){ 2723 if (!queue->opened && queue->oflag == OFLAG_WRITE){
@@ -3570,7 +3577,6 @@ static int pmu_process_init_msg(struct pmu_gk20a *pmu,
3570 3577
3571 pmu_copy_from_dmem(pmu, tail, 3578 pmu_copy_from_dmem(pmu, tail,
3572 (u8 *)&msg->hdr, PMU_MSG_HDR_SIZE, 0); 3579 (u8 *)&msg->hdr, PMU_MSG_HDR_SIZE, 0);
3573
3574 if (msg->hdr.unit_id != PMU_UNIT_INIT) { 3580 if (msg->hdr.unit_id != PMU_UNIT_INIT) {
3575 gk20a_err(dev_from_gk20a(g), 3581 gk20a_err(dev_from_gk20a(g),
3576 "expecting init msg"); 3582 "expecting init msg");
@@ -4359,6 +4365,7 @@ static int pmu_write_cmd(struct pmu_gk20a *pmu, struct pmu_cmd *cmd,
4359 4365
4360 queue = &pmu->queue[queue_id]; 4366 queue = &pmu->queue[queue_id];
4361 4367
4368
4362 do { 4369 do {
4363 err = pmu_queue_open_write(pmu, queue, cmd->hdr.size); 4370 err = pmu_queue_open_write(pmu, queue, cmd->hdr.size);
4364 if (err == -EAGAIN && time_before(jiffies, end_jiffies)) 4371 if (err == -EAGAIN && time_before(jiffies, end_jiffies))
@@ -4372,6 +4379,7 @@ static int pmu_write_cmd(struct pmu_gk20a *pmu, struct pmu_cmd *cmd,
4372 4379
4373 pmu_queue_push(pmu, queue, cmd, cmd->hdr.size); 4380 pmu_queue_push(pmu, queue, cmd, cmd->hdr.size);
4374 4381
4382
4375 err = pmu_queue_close(pmu, queue, true); 4383 err = pmu_queue_close(pmu, queue, true);
4376 4384
4377clean_up: 4385clean_up: