aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2017-09-24 09:15:24 -0400
committerLucas Stach <l.stach@pengutronix.de>2017-10-10 05:45:43 -0400
commit4fc3e66adb291cc3ec4a360c75221e9fbf416938 (patch)
treea2cf78e6748d027b40ea1dff5877a7b4b7683596
parent8d3d56cef4412a37cea3ce32e730976620aaeb58 (diff)
drm/etnaviv: extend etnaviv_gpu_cmdbuf_new(..) with nr_pmrs
This commits extends etnaviv_gpu_cmdbuf_new(..) to define the number of struct etnaviv_perfmon elements gets used. Changes from v1 -> v2: - make use of goto as requested by Lucas Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c15
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.h2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.c2
4 files changed, 17 insertions, 4 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c b/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c
index 633e0f07cbac..66ac79558bbd 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c
@@ -19,6 +19,7 @@
19#include "etnaviv_cmdbuf.h" 19#include "etnaviv_cmdbuf.h"
20#include "etnaviv_gpu.h" 20#include "etnaviv_gpu.h"
21#include "etnaviv_mmu.h" 21#include "etnaviv_mmu.h"
22#include "etnaviv_perfmon.h"
22 23
23#define SUBALLOC_SIZE SZ_256K 24#define SUBALLOC_SIZE SZ_256K
24#define SUBALLOC_GRANULE SZ_4K 25#define SUBALLOC_GRANULE SZ_4K
@@ -87,9 +88,10 @@ void etnaviv_cmdbuf_suballoc_destroy(struct etnaviv_cmdbuf_suballoc *suballoc)
87 88
88struct etnaviv_cmdbuf * 89struct etnaviv_cmdbuf *
89etnaviv_cmdbuf_new(struct etnaviv_cmdbuf_suballoc *suballoc, u32 size, 90etnaviv_cmdbuf_new(struct etnaviv_cmdbuf_suballoc *suballoc, u32 size,
90 size_t nr_bos) 91 size_t nr_bos, size_t nr_pmrs)
91{ 92{
92 struct etnaviv_cmdbuf *cmdbuf; 93 struct etnaviv_cmdbuf *cmdbuf;
94 struct etnaviv_perfmon_request *pmrs;
93 size_t sz = size_vstruct(nr_bos, sizeof(cmdbuf->bo_map[0]), 95 size_t sz = size_vstruct(nr_bos, sizeof(cmdbuf->bo_map[0]),
94 sizeof(*cmdbuf)); 96 sizeof(*cmdbuf));
95 int granule_offs, order, ret; 97 int granule_offs, order, ret;
@@ -98,6 +100,12 @@ etnaviv_cmdbuf_new(struct etnaviv_cmdbuf_suballoc *suballoc, u32 size,
98 if (!cmdbuf) 100 if (!cmdbuf)
99 return NULL; 101 return NULL;
100 102
103 sz = sizeof(*pmrs) * nr_pmrs;
104 pmrs = kzalloc(sz, GFP_KERNEL);
105 if (!pmrs)
106 goto out_free_cmdbuf;
107
108 cmdbuf->pmrs = pmrs;
101 cmdbuf->suballoc = suballoc; 109 cmdbuf->suballoc = suballoc;
102 cmdbuf->size = size; 110 cmdbuf->size = size;
103 111
@@ -124,6 +132,10 @@ retry:
124 cmdbuf->vaddr = suballoc->vaddr + cmdbuf->suballoc_offset; 132 cmdbuf->vaddr = suballoc->vaddr + cmdbuf->suballoc_offset;
125 133
126 return cmdbuf; 134 return cmdbuf;
135
136out_free_cmdbuf:
137 kfree(cmdbuf);
138 return NULL;
127} 139}
128 140
129void etnaviv_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf) 141void etnaviv_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf)
@@ -139,6 +151,7 @@ void etnaviv_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf)
139 suballoc->free_space = 1; 151 suballoc->free_space = 1;
140 mutex_unlock(&suballoc->lock); 152 mutex_unlock(&suballoc->lock);
141 wake_up_all(&suballoc->free_event); 153 wake_up_all(&suballoc->free_event);
154 kfree(cmdbuf->pmrs);
142 kfree(cmdbuf); 155 kfree(cmdbuf);
143} 156}
144 157
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.h b/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.h
index 1b549f0d59a0..b6348b9f2a9d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.h
@@ -53,7 +53,7 @@ void etnaviv_cmdbuf_suballoc_destroy(struct etnaviv_cmdbuf_suballoc *suballoc);
53 53
54struct etnaviv_cmdbuf * 54struct etnaviv_cmdbuf *
55etnaviv_cmdbuf_new(struct etnaviv_cmdbuf_suballoc *suballoc, u32 size, 55etnaviv_cmdbuf_new(struct etnaviv_cmdbuf_suballoc *suballoc, u32 size,
56 size_t nr_bos); 56 size_t nr_bos, size_t nr_pmrs);
57void etnaviv_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf); 57void etnaviv_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf);
58 58
59u32 etnaviv_cmdbuf_get_va(struct etnaviv_cmdbuf *buf); 59u32 etnaviv_cmdbuf_get_va(struct etnaviv_cmdbuf *buf);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 026ef4e02f85..41abdfc7cb00 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -350,7 +350,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
350 stream = kvmalloc_array(1, args->stream_size, GFP_KERNEL); 350 stream = kvmalloc_array(1, args->stream_size, GFP_KERNEL);
351 cmdbuf = etnaviv_cmdbuf_new(gpu->cmdbuf_suballoc, 351 cmdbuf = etnaviv_cmdbuf_new(gpu->cmdbuf_suballoc,
352 ALIGN(args->stream_size, 8) + 8, 352 ALIGN(args->stream_size, 8) + 8,
353 args->nr_bos); 353 args->nr_bos, 0);
354 if (!bos || !relocs || !stream || !cmdbuf) { 354 if (!bos || !relocs || !stream || !cmdbuf) {
355 ret = -ENOMEM; 355 ret = -ENOMEM;
356 goto err_submit_cmds; 356 goto err_submit_cmds;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 8d961bc238d4..7b61071af0de 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -726,7 +726,7 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
726 } 726 }
727 727
728 /* Create buffer: */ 728 /* Create buffer: */
729 gpu->buffer = etnaviv_cmdbuf_new(gpu->cmdbuf_suballoc, PAGE_SIZE, 0); 729 gpu->buffer = etnaviv_cmdbuf_new(gpu->cmdbuf_suballoc, PAGE_SIZE, 0, 0);
730 if (!gpu->buffer) { 730 if (!gpu->buffer) {
731 ret = -ENOMEM; 731 ret = -ENOMEM;
732 dev_err(gpu->dev, "could not create command buffer\n"); 732 dev_err(gpu->dev, "could not create command buffer\n");