aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-01-28 19:01:54 -0500
committerDave Airlie <airlied@redhat.com>2016-01-28 19:01:54 -0500
commit2081e78a5cb2e14e4980a8aaddd8e4899cc7557b (patch)
treefff5c8f17670c6235d88e989cc74dcdd8d6b0b6e
parent55ce625fc5e3a87e46a14c2cb062a3579f79b7e0 (diff)
parenta0a5ab3e99b8e617221caabf074dcabd1659b9d8 (diff)
Merge branch 'drm-etnaviv-fixes' of git://git.pengutronix.de/git/lst/linux into drm-fixes
A bunch of etnaviv fixes for 4.5-rc. Most of them are fixing things in code paths that will only be hit if something goes wrong, which have been unearthed by more extensive testing. The only thing that doesn't really qualify as fixes is an UAPI extension that userspace wants to rely on being present, so I want to fast-track this into 4.5 before etnaviv ends up in a released kernel. * 'drm-etnaviv-fixes' of git://git.pengutronix.de/git/lst/linux: drm/etnaviv: call correct function when trying to vmap a DMABUF drm/etnaviv: rename etnaviv_gem_vaddr to etnaviv_gem_vmap drm/etnaviv: fix get pages error path in etnaviv_gem_vaddr drm/etnaviv: fix memory leak in IOMMU init path drm/etnaviv: add further minor features and varyings count drm/etnaviv: add helper for comparing model/revision IDs drm/etnaviv: add helper to extract bitfields drm/etnaviv: use defined constants for the chip model drm/etnaviv: update common and state_hi xml.h files drm/etnaviv: ignore VG GPUs with FE2.0 drm/etnaviv: fix failure path if model is zero drm/etnaviv: hold object lock while getting pages for coredump drm/etnaviv: remove owner assignment from platform_driver
-rw-r--r--drivers/gpu/drm/etnaviv/common.xml.h59
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_drv.c1
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_drv.h2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_dump.c6
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c36
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.h1
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c10
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.c189
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.h9
-rw-r--r--drivers/gpu/drm/etnaviv/state_hi.xml.h26
-rw-r--r--include/uapi/drm/etnaviv_drm.h3
11 files changed, 255 insertions, 87 deletions
diff --git a/drivers/gpu/drm/etnaviv/common.xml.h b/drivers/gpu/drm/etnaviv/common.xml.h
index 9e585d51fb78..e881482b5971 100644
--- a/drivers/gpu/drm/etnaviv/common.xml.h
+++ b/drivers/gpu/drm/etnaviv/common.xml.h
@@ -8,8 +8,8 @@ http://0x04.net/cgit/index.cgi/rules-ng-ng
8git clone git://0x04.net/rules-ng-ng 8git clone git://0x04.net/rules-ng-ng
9 9
10The rules-ng-ng source files this header was generated from are: 10The rules-ng-ng source files this header was generated from are:
11- state_vg.xml ( 5973 bytes, from 2015-03-25 11:26:01) 11- state_hi.xml ( 24309 bytes, from 2015-12-12 09:02:53)
12- common.xml ( 18437 bytes, from 2015-03-25 11:27:41) 12- common.xml ( 18379 bytes, from 2015-12-12 09:02:53)
13 13
14Copyright (C) 2015 14Copyright (C) 2015
15*/ 15*/
@@ -30,15 +30,19 @@ Copyright (C) 2015
30#define ENDIAN_MODE_NO_SWAP 0x00000000 30#define ENDIAN_MODE_NO_SWAP 0x00000000
31#define ENDIAN_MODE_SWAP_16 0x00000001 31#define ENDIAN_MODE_SWAP_16 0x00000001
32#define ENDIAN_MODE_SWAP_32 0x00000002 32#define ENDIAN_MODE_SWAP_32 0x00000002
33#define chipModel_GC200 0x00000200
33#define chipModel_GC300 0x00000300 34#define chipModel_GC300 0x00000300
34#define chipModel_GC320 0x00000320 35#define chipModel_GC320 0x00000320
36#define chipModel_GC328 0x00000328
35#define chipModel_GC350 0x00000350 37#define chipModel_GC350 0x00000350
36#define chipModel_GC355 0x00000355 38#define chipModel_GC355 0x00000355
37#define chipModel_GC400 0x00000400 39#define chipModel_GC400 0x00000400
38#define chipModel_GC410 0x00000410 40#define chipModel_GC410 0x00000410
39#define chipModel_GC420 0x00000420 41#define chipModel_GC420 0x00000420
42#define chipModel_GC428 0x00000428
40#define chipModel_GC450 0x00000450 43#define chipModel_GC450 0x00000450
41#define chipModel_GC500 0x00000500 44#define chipModel_GC500 0x00000500
45#define chipModel_GC520 0x00000520
42#define chipModel_GC530 0x00000530 46#define chipModel_GC530 0x00000530
43#define chipModel_GC600 0x00000600 47#define chipModel_GC600 0x00000600
44#define chipModel_GC700 0x00000700 48#define chipModel_GC700 0x00000700
@@ -46,9 +50,16 @@ Copyright (C) 2015
46#define chipModel_GC860 0x00000860 50#define chipModel_GC860 0x00000860
47#define chipModel_GC880 0x00000880 51#define chipModel_GC880 0x00000880
48#define chipModel_GC1000 0x00001000 52#define chipModel_GC1000 0x00001000
53#define chipModel_GC1500 0x00001500
49#define chipModel_GC2000 0x00002000 54#define chipModel_GC2000 0x00002000
50#define chipModel_GC2100 0x00002100 55#define chipModel_GC2100 0x00002100
56#define chipModel_GC2200 0x00002200
57#define chipModel_GC2500 0x00002500
58#define chipModel_GC3000 0x00003000
51#define chipModel_GC4000 0x00004000 59#define chipModel_GC4000 0x00004000
60#define chipModel_GC5000 0x00005000
61#define chipModel_GC5200 0x00005200
62#define chipModel_GC6400 0x00006400
52#define RGBA_BITS_R 0x00000001 63#define RGBA_BITS_R 0x00000001
53#define RGBA_BITS_G 0x00000002 64#define RGBA_BITS_G 0x00000002
54#define RGBA_BITS_B 0x00000004 65#define RGBA_BITS_B 0x00000004
@@ -160,7 +171,7 @@ Copyright (C) 2015
160#define chipMinorFeatures2_UNK8 0x00000100 171#define chipMinorFeatures2_UNK8 0x00000100
161#define chipMinorFeatures2_UNK9 0x00000200 172#define chipMinorFeatures2_UNK9 0x00000200
162#define chipMinorFeatures2_UNK10 0x00000400 173#define chipMinorFeatures2_UNK10 0x00000400
163#define chipMinorFeatures2_SAMPLERBASE_16 0x00000800 174#define chipMinorFeatures2_HALTI1 0x00000800
164#define chipMinorFeatures2_UNK12 0x00001000 175#define chipMinorFeatures2_UNK12 0x00001000
165#define chipMinorFeatures2_UNK13 0x00002000 176#define chipMinorFeatures2_UNK13 0x00002000
166#define chipMinorFeatures2_UNK14 0x00004000 177#define chipMinorFeatures2_UNK14 0x00004000
@@ -189,7 +200,7 @@ Copyright (C) 2015
189#define chipMinorFeatures3_UNK5 0x00000020 200#define chipMinorFeatures3_UNK5 0x00000020
190#define chipMinorFeatures3_UNK6 0x00000040 201#define chipMinorFeatures3_UNK6 0x00000040
191#define chipMinorFeatures3_UNK7 0x00000080 202#define chipMinorFeatures3_UNK7 0x00000080
192#define chipMinorFeatures3_UNK8 0x00000100 203#define chipMinorFeatures3_FAST_MSAA 0x00000100
193#define chipMinorFeatures3_UNK9 0x00000200 204#define chipMinorFeatures3_UNK9 0x00000200
194#define chipMinorFeatures3_BUG_FIXES10 0x00000400 205#define chipMinorFeatures3_BUG_FIXES10 0x00000400
195#define chipMinorFeatures3_UNK11 0x00000800 206#define chipMinorFeatures3_UNK11 0x00000800
@@ -199,7 +210,7 @@ Copyright (C) 2015
199#define chipMinorFeatures3_UNK15 0x00008000 210#define chipMinorFeatures3_UNK15 0x00008000
200#define chipMinorFeatures3_UNK16 0x00010000 211#define chipMinorFeatures3_UNK16 0x00010000
201#define chipMinorFeatures3_UNK17 0x00020000 212#define chipMinorFeatures3_UNK17 0x00020000
202#define chipMinorFeatures3_UNK18 0x00040000 213#define chipMinorFeatures3_ACE 0x00040000
203#define chipMinorFeatures3_UNK19 0x00080000 214#define chipMinorFeatures3_UNK19 0x00080000
204#define chipMinorFeatures3_UNK20 0x00100000 215#define chipMinorFeatures3_UNK20 0x00100000
205#define chipMinorFeatures3_UNK21 0x00200000 216#define chipMinorFeatures3_UNK21 0x00200000
@@ -207,7 +218,7 @@ Copyright (C) 2015
207#define chipMinorFeatures3_UNK23 0x00800000 218#define chipMinorFeatures3_UNK23 0x00800000
208#define chipMinorFeatures3_UNK24 0x01000000 219#define chipMinorFeatures3_UNK24 0x01000000
209#define chipMinorFeatures3_UNK25 0x02000000 220#define chipMinorFeatures3_UNK25 0x02000000
210#define chipMinorFeatures3_UNK26 0x04000000 221#define chipMinorFeatures3_NEW_HZ 0x04000000
211#define chipMinorFeatures3_UNK27 0x08000000 222#define chipMinorFeatures3_UNK27 0x08000000
212#define chipMinorFeatures3_UNK28 0x10000000 223#define chipMinorFeatures3_UNK28 0x10000000
213#define chipMinorFeatures3_UNK29 0x20000000 224#define chipMinorFeatures3_UNK29 0x20000000
@@ -229,9 +240,9 @@ Copyright (C) 2015
229#define chipMinorFeatures4_UNK13 0x00002000 240#define chipMinorFeatures4_UNK13 0x00002000
230#define chipMinorFeatures4_UNK14 0x00004000 241#define chipMinorFeatures4_UNK14 0x00004000
231#define chipMinorFeatures4_UNK15 0x00008000 242#define chipMinorFeatures4_UNK15 0x00008000
232#define chipMinorFeatures4_UNK16 0x00010000 243#define chipMinorFeatures4_HALTI2 0x00010000
233#define chipMinorFeatures4_UNK17 0x00020000 244#define chipMinorFeatures4_UNK17 0x00020000
234#define chipMinorFeatures4_UNK18 0x00040000 245#define chipMinorFeatures4_SMALL_MSAA 0x00040000
235#define chipMinorFeatures4_UNK19 0x00080000 246#define chipMinorFeatures4_UNK19 0x00080000
236#define chipMinorFeatures4_UNK20 0x00100000 247#define chipMinorFeatures4_UNK20 0x00100000
237#define chipMinorFeatures4_UNK21 0x00200000 248#define chipMinorFeatures4_UNK21 0x00200000
@@ -245,5 +256,37 @@ Copyright (C) 2015
245#define chipMinorFeatures4_UNK29 0x20000000 256#define chipMinorFeatures4_UNK29 0x20000000
246#define chipMinorFeatures4_UNK30 0x40000000 257#define chipMinorFeatures4_UNK30 0x40000000
247#define chipMinorFeatures4_UNK31 0x80000000 258#define chipMinorFeatures4_UNK31 0x80000000
259#define chipMinorFeatures5_UNK0 0x00000001
260#define chipMinorFeatures5_UNK1 0x00000002
261#define chipMinorFeatures5_UNK2 0x00000004
262#define chipMinorFeatures5_UNK3 0x00000008
263#define chipMinorFeatures5_UNK4 0x00000010
264#define chipMinorFeatures5_UNK5 0x00000020
265#define chipMinorFeatures5_UNK6 0x00000040
266#define chipMinorFeatures5_UNK7 0x00000080
267#define chipMinorFeatures5_UNK8 0x00000100
268#define chipMinorFeatures5_HALTI3 0x00000200
269#define chipMinorFeatures5_UNK10 0x00000400
270#define chipMinorFeatures5_UNK11 0x00000800
271#define chipMinorFeatures5_UNK12 0x00001000
272#define chipMinorFeatures5_UNK13 0x00002000
273#define chipMinorFeatures5_UNK14 0x00004000
274#define chipMinorFeatures5_UNK15 0x00008000
275#define chipMinorFeatures5_UNK16 0x00010000
276#define chipMinorFeatures5_UNK17 0x00020000
277#define chipMinorFeatures5_UNK18 0x00040000
278#define chipMinorFeatures5_UNK19 0x00080000
279#define chipMinorFeatures5_UNK20 0x00100000
280#define chipMinorFeatures5_UNK21 0x00200000
281#define chipMinorFeatures5_UNK22 0x00400000
282#define chipMinorFeatures5_UNK23 0x00800000
283#define chipMinorFeatures5_UNK24 0x01000000
284#define chipMinorFeatures5_UNK25 0x02000000
285#define chipMinorFeatures5_UNK26 0x04000000
286#define chipMinorFeatures5_UNK27 0x08000000
287#define chipMinorFeatures5_UNK28 0x10000000
288#define chipMinorFeatures5_UNK29 0x20000000
289#define chipMinorFeatures5_UNK30 0x40000000
290#define chipMinorFeatures5_UNK31 0x80000000
248 291
249#endif /* COMMON_XML */ 292#endif /* COMMON_XML */
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 5c89ebb52fd2..e8858985f01e 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -668,7 +668,6 @@ static struct platform_driver etnaviv_platform_driver = {
668 .probe = etnaviv_pdev_probe, 668 .probe = etnaviv_pdev_probe,
669 .remove = etnaviv_pdev_remove, 669 .remove = etnaviv_pdev_remove,
670 .driver = { 670 .driver = {
671 .owner = THIS_MODULE,
672 .name = "etnaviv", 671 .name = "etnaviv",
673 .of_match_table = dt_match, 672 .of_match_table = dt_match,
674 }, 673 },
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
index d6bd438bd5be..1cd6046e76b1 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
@@ -85,7 +85,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
85 struct dma_buf_attachment *attach, struct sg_table *sg); 85 struct dma_buf_attachment *attach, struct sg_table *sg);
86int etnaviv_gem_prime_pin(struct drm_gem_object *obj); 86int etnaviv_gem_prime_pin(struct drm_gem_object *obj);
87void etnaviv_gem_prime_unpin(struct drm_gem_object *obj); 87void etnaviv_gem_prime_unpin(struct drm_gem_object *obj);
88void *etnaviv_gem_vaddr(struct drm_gem_object *obj); 88void *etnaviv_gem_vmap(struct drm_gem_object *obj);
89int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op, 89int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
90 struct timespec *timeout); 90 struct timespec *timeout);
91int etnaviv_gem_cpu_fini(struct drm_gem_object *obj); 91int etnaviv_gem_cpu_fini(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_dump.c b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
index bf8fa859e8be..4a29eeadbf1e 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_dump.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
@@ -201,7 +201,9 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
201 201
202 obj = vram->object; 202 obj = vram->object;
203 203
204 mutex_lock(&obj->lock);
204 pages = etnaviv_gem_get_pages(obj); 205 pages = etnaviv_gem_get_pages(obj);
206 mutex_unlock(&obj->lock);
205 if (pages) { 207 if (pages) {
206 int j; 208 int j;
207 209
@@ -213,8 +215,8 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
213 215
214 iter.hdr->iova = cpu_to_le64(vram->iova); 216 iter.hdr->iova = cpu_to_le64(vram->iova);
215 217
216 vaddr = etnaviv_gem_vaddr(&obj->base); 218 vaddr = etnaviv_gem_vmap(&obj->base);
217 if (vaddr && !IS_ERR(vaddr)) 219 if (vaddr)
218 memcpy(iter.data, vaddr, obj->base.size); 220 memcpy(iter.data, vaddr, obj->base.size);
219 221
220 etnaviv_core_dump_header(&iter, ETDUMP_BUF_BO, iter.data + 222 etnaviv_core_dump_header(&iter, ETDUMP_BUF_BO, iter.data +
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 9f77c3b94cc6..4b519e4309b2 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -353,25 +353,39 @@ void etnaviv_gem_put_iova(struct etnaviv_gpu *gpu, struct drm_gem_object *obj)
353 drm_gem_object_unreference_unlocked(obj); 353 drm_gem_object_unreference_unlocked(obj);
354} 354}
355 355
356void *etnaviv_gem_vaddr(struct drm_gem_object *obj) 356void *etnaviv_gem_vmap(struct drm_gem_object *obj)
357{ 357{
358 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); 358 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
359 359
360 mutex_lock(&etnaviv_obj->lock); 360 if (etnaviv_obj->vaddr)
361 if (!etnaviv_obj->vaddr) { 361 return etnaviv_obj->vaddr;
362 struct page **pages = etnaviv_gem_get_pages(etnaviv_obj);
363
364 if (IS_ERR(pages))
365 return ERR_CAST(pages);
366 362
367 etnaviv_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, 363 mutex_lock(&etnaviv_obj->lock);
368 VM_MAP, pgprot_writecombine(PAGE_KERNEL)); 364 /*
369 } 365 * Need to check again, as we might have raced with another thread
366 * while waiting for the mutex.
367 */
368 if (!etnaviv_obj->vaddr)
369 etnaviv_obj->vaddr = etnaviv_obj->ops->vmap(etnaviv_obj);
370 mutex_unlock(&etnaviv_obj->lock); 370 mutex_unlock(&etnaviv_obj->lock);
371 371
372 return etnaviv_obj->vaddr; 372 return etnaviv_obj->vaddr;
373} 373}
374 374
375static void *etnaviv_gem_vmap_impl(struct etnaviv_gem_object *obj)
376{
377 struct page **pages;
378
379 lockdep_assert_held(&obj->lock);
380
381 pages = etnaviv_gem_get_pages(obj);
382 if (IS_ERR(pages))
383 return NULL;
384
385 return vmap(pages, obj->base.size >> PAGE_SHIFT,
386 VM_MAP, pgprot_writecombine(PAGE_KERNEL));
387}
388
375static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op) 389static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op)
376{ 390{
377 if (op & ETNA_PREP_READ) 391 if (op & ETNA_PREP_READ)
@@ -522,6 +536,7 @@ static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj)
522static const struct etnaviv_gem_ops etnaviv_gem_shmem_ops = { 536static const struct etnaviv_gem_ops etnaviv_gem_shmem_ops = {
523 .get_pages = etnaviv_gem_shmem_get_pages, 537 .get_pages = etnaviv_gem_shmem_get_pages,
524 .release = etnaviv_gem_shmem_release, 538 .release = etnaviv_gem_shmem_release,
539 .vmap = etnaviv_gem_vmap_impl,
525}; 540};
526 541
527void etnaviv_gem_free_object(struct drm_gem_object *obj) 542void etnaviv_gem_free_object(struct drm_gem_object *obj)
@@ -866,6 +881,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)
866static const struct etnaviv_gem_ops etnaviv_gem_userptr_ops = { 881static const struct etnaviv_gem_ops etnaviv_gem_userptr_ops = {
867 .get_pages = etnaviv_gem_userptr_get_pages, 882 .get_pages = etnaviv_gem_userptr_get_pages,
868 .release = etnaviv_gem_userptr_release, 883 .release = etnaviv_gem_userptr_release,
884 .vmap = etnaviv_gem_vmap_impl,
869}; 885};
870 886
871int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file, 887int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file,
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
index a300b4b3d545..ab5df8147a5f 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
@@ -78,6 +78,7 @@ struct etnaviv_gem_object *to_etnaviv_bo(struct drm_gem_object *obj)
78struct etnaviv_gem_ops { 78struct etnaviv_gem_ops {
79 int (*get_pages)(struct etnaviv_gem_object *); 79 int (*get_pages)(struct etnaviv_gem_object *);
80 void (*release)(struct etnaviv_gem_object *); 80 void (*release)(struct etnaviv_gem_object *);
81 void *(*vmap)(struct etnaviv_gem_object *);
81}; 82};
82 83
83static inline bool is_active(struct etnaviv_gem_object *etnaviv_obj) 84static inline bool is_active(struct etnaviv_gem_object *etnaviv_obj)
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
index e94db4f95770..4e67395f5fa1 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
@@ -31,7 +31,7 @@ struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj)
31 31
32void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj) 32void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj)
33{ 33{
34 return etnaviv_gem_vaddr(obj); 34 return etnaviv_gem_vmap(obj);
35} 35}
36 36
37void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) 37void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
@@ -77,9 +77,17 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
77 drm_prime_gem_destroy(&etnaviv_obj->base, etnaviv_obj->sgt); 77 drm_prime_gem_destroy(&etnaviv_obj->base, etnaviv_obj->sgt);
78} 78}
79 79
80static void *etnaviv_gem_prime_vmap_impl(struct etnaviv_gem_object *etnaviv_obj)
81{
82 lockdep_assert_held(&etnaviv_obj->lock);
83
84 return dma_buf_vmap(etnaviv_obj->base.import_attach->dmabuf);
85}
86
80static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = { 87static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = {
81 /* .get_pages should never be called */ 88 /* .get_pages should never be called */
82 .release = etnaviv_gem_prime_release, 89 .release = etnaviv_gem_prime_release,
90 .vmap = etnaviv_gem_prime_vmap_impl,
83}; 91};
84 92
85struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev, 93struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 056a72e6ed26..a33162cf4f4c 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -72,6 +72,14 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
72 *value = gpu->identity.minor_features3; 72 *value = gpu->identity.minor_features3;
73 break; 73 break;
74 74
75 case ETNAVIV_PARAM_GPU_FEATURES_5:
76 *value = gpu->identity.minor_features4;
77 break;
78
79 case ETNAVIV_PARAM_GPU_FEATURES_6:
80 *value = gpu->identity.minor_features5;
81 break;
82
75 case ETNAVIV_PARAM_GPU_STREAM_COUNT: 83 case ETNAVIV_PARAM_GPU_STREAM_COUNT:
76 *value = gpu->identity.stream_count; 84 *value = gpu->identity.stream_count;
77 break; 85 break;
@@ -112,6 +120,10 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
112 *value = gpu->identity.num_constants; 120 *value = gpu->identity.num_constants;
113 break; 121 break;
114 122
123 case ETNAVIV_PARAM_GPU_NUM_VARYINGS:
124 *value = gpu->identity.varyings_count;
125 break;
126
115 default: 127 default:
116 DBG("%s: invalid param: %u", dev_name(gpu->dev), param); 128 DBG("%s: invalid param: %u", dev_name(gpu->dev), param);
117 return -EINVAL; 129 return -EINVAL;
@@ -120,46 +132,56 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
120 return 0; 132 return 0;
121} 133}
122 134
135
136#define etnaviv_is_model_rev(gpu, mod, rev) \
137 ((gpu)->identity.model == chipModel_##mod && \
138 (gpu)->identity.revision == rev)
139#define etnaviv_field(val, field) \
140 (((val) & field##__MASK) >> field##__SHIFT)
141
123static void etnaviv_hw_specs(struct etnaviv_gpu *gpu) 142static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
124{ 143{
125 if (gpu->identity.minor_features0 & 144 if (gpu->identity.minor_features0 &
126 chipMinorFeatures0_MORE_MINOR_FEATURES) { 145 chipMinorFeatures0_MORE_MINOR_FEATURES) {
127 u32 specs[2]; 146 u32 specs[4];
147 unsigned int streams;
128 148
129 specs[0] = gpu_read(gpu, VIVS_HI_CHIP_SPECS); 149 specs[0] = gpu_read(gpu, VIVS_HI_CHIP_SPECS);
130 specs[1] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_2); 150 specs[1] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_2);
131 151 specs[2] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_3);
132 gpu->identity.stream_count = 152 specs[3] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_4);
133 (specs[0] & VIVS_HI_CHIP_SPECS_STREAM_COUNT__MASK) 153
134 >> VIVS_HI_CHIP_SPECS_STREAM_COUNT__SHIFT; 154 gpu->identity.stream_count = etnaviv_field(specs[0],
135 gpu->identity.register_max = 155 VIVS_HI_CHIP_SPECS_STREAM_COUNT);
136 (specs[0] & VIVS_HI_CHIP_SPECS_REGISTER_MAX__MASK) 156 gpu->identity.register_max = etnaviv_field(specs[0],
137 >> VIVS_HI_CHIP_SPECS_REGISTER_MAX__SHIFT; 157 VIVS_HI_CHIP_SPECS_REGISTER_MAX);
138 gpu->identity.thread_count = 158 gpu->identity.thread_count = etnaviv_field(specs[0],
139 (specs[0] & VIVS_HI_CHIP_SPECS_THREAD_COUNT__MASK) 159 VIVS_HI_CHIP_SPECS_THREAD_COUNT);
140 >> VIVS_HI_CHIP_SPECS_THREAD_COUNT__SHIFT; 160 gpu->identity.vertex_cache_size = etnaviv_field(specs[0],
141 gpu->identity.vertex_cache_size = 161 VIVS_HI_CHIP_SPECS_VERTEX_CACHE_SIZE);
142 (specs[0] & VIVS_HI_CHIP_SPECS_VERTEX_CACHE_SIZE__MASK) 162 gpu->identity.shader_core_count = etnaviv_field(specs[0],
143 >> VIVS_HI_CHIP_SPECS_VERTEX_CACHE_SIZE__SHIFT; 163 VIVS_HI_CHIP_SPECS_SHADER_CORE_COUNT);
144 gpu->identity.shader_core_count = 164 gpu->identity.pixel_pipes = etnaviv_field(specs[0],
145 (specs[0] & VIVS_HI_CHIP_SPECS_SHADER_CORE_COUNT__MASK) 165 VIVS_HI_CHIP_SPECS_PIXEL_PIPES);
146 >> VIVS_HI_CHIP_SPECS_SHADER_CORE_COUNT__SHIFT;
147 gpu->identity.pixel_pipes =
148 (specs[0] & VIVS_HI_CHIP_SPECS_PIXEL_PIPES__MASK)
149 >> VIVS_HI_CHIP_SPECS_PIXEL_PIPES__SHIFT;
150 gpu->identity.vertex_output_buffer_size = 166 gpu->identity.vertex_output_buffer_size =
151 (specs[0] & VIVS_HI_CHIP_SPECS_VERTEX_OUTPUT_BUFFER_SIZE__MASK) 167 etnaviv_field(specs[0],
152 >> VIVS_HI_CHIP_SPECS_VERTEX_OUTPUT_BUFFER_SIZE__SHIFT; 168 VIVS_HI_CHIP_SPECS_VERTEX_OUTPUT_BUFFER_SIZE);
153 169
154 gpu->identity.buffer_size = 170 gpu->identity.buffer_size = etnaviv_field(specs[1],
155 (specs[1] & VIVS_HI_CHIP_SPECS_2_BUFFER_SIZE__MASK) 171 VIVS_HI_CHIP_SPECS_2_BUFFER_SIZE);
156 >> VIVS_HI_CHIP_SPECS_2_BUFFER_SIZE__SHIFT; 172 gpu->identity.instruction_count = etnaviv_field(specs[1],
157 gpu->identity.instruction_count = 173 VIVS_HI_CHIP_SPECS_2_INSTRUCTION_COUNT);
158 (specs[1] & VIVS_HI_CHIP_SPECS_2_INSTRUCTION_COUNT__MASK) 174 gpu->identity.num_constants = etnaviv_field(specs[1],
159 >> VIVS_HI_CHIP_SPECS_2_INSTRUCTION_COUNT__SHIFT; 175 VIVS_HI_CHIP_SPECS_2_NUM_CONSTANTS);
160 gpu->identity.num_constants = 176
161 (specs[1] & VIVS_HI_CHIP_SPECS_2_NUM_CONSTANTS__MASK) 177 gpu->identity.varyings_count = etnaviv_field(specs[2],
162 >> VIVS_HI_CHIP_SPECS_2_NUM_CONSTANTS__SHIFT; 178 VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT);
179
180 /* This overrides the value from older register if non-zero */
181 streams = etnaviv_field(specs[3],
182 VIVS_HI_CHIP_SPECS_4_STREAM_COUNT);
183 if (streams)
184 gpu->identity.stream_count = streams;
163 } 185 }
164 186
165 /* Fill in the stream count if not specified */ 187 /* Fill in the stream count if not specified */
@@ -173,7 +195,7 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
173 /* Convert the register max value */ 195 /* Convert the register max value */
174 if (gpu->identity.register_max) 196 if (gpu->identity.register_max)
175 gpu->identity.register_max = 1 << gpu->identity.register_max; 197 gpu->identity.register_max = 1 << gpu->identity.register_max;
176 else if (gpu->identity.model == 0x0400) 198 else if (gpu->identity.model == chipModel_GC400)
177 gpu->identity.register_max = 32; 199 gpu->identity.register_max = 32;
178 else 200 else
179 gpu->identity.register_max = 64; 201 gpu->identity.register_max = 64;
@@ -181,10 +203,10 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
181 /* Convert thread count */ 203 /* Convert thread count */
182 if (gpu->identity.thread_count) 204 if (gpu->identity.thread_count)
183 gpu->identity.thread_count = 1 << gpu->identity.thread_count; 205 gpu->identity.thread_count = 1 << gpu->identity.thread_count;
184 else if (gpu->identity.model == 0x0400) 206 else if (gpu->identity.model == chipModel_GC400)
185 gpu->identity.thread_count = 64; 207 gpu->identity.thread_count = 64;
186 else if (gpu->identity.model == 0x0500 || 208 else if (gpu->identity.model == chipModel_GC500 ||
187 gpu->identity.model == 0x0530) 209 gpu->identity.model == chipModel_GC530)
188 gpu->identity.thread_count = 128; 210 gpu->identity.thread_count = 128;
189 else 211 else
190 gpu->identity.thread_count = 256; 212 gpu->identity.thread_count = 256;
@@ -206,7 +228,7 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
206 if (gpu->identity.vertex_output_buffer_size) { 228 if (gpu->identity.vertex_output_buffer_size) {
207 gpu->identity.vertex_output_buffer_size = 229 gpu->identity.vertex_output_buffer_size =
208 1 << gpu->identity.vertex_output_buffer_size; 230 1 << gpu->identity.vertex_output_buffer_size;
209 } else if (gpu->identity.model == 0x0400) { 231 } else if (gpu->identity.model == chipModel_GC400) {
210 if (gpu->identity.revision < 0x4000) 232 if (gpu->identity.revision < 0x4000)
211 gpu->identity.vertex_output_buffer_size = 512; 233 gpu->identity.vertex_output_buffer_size = 512;
212 else if (gpu->identity.revision < 0x4200) 234 else if (gpu->identity.revision < 0x4200)
@@ -219,9 +241,8 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
219 241
220 switch (gpu->identity.instruction_count) { 242 switch (gpu->identity.instruction_count) {
221 case 0: 243 case 0:
222 if ((gpu->identity.model == 0x2000 && 244 if (etnaviv_is_model_rev(gpu, GC2000, 0x5108) ||
223 gpu->identity.revision == 0x5108) || 245 gpu->identity.model == chipModel_GC880)
224 gpu->identity.model == 0x880)
225 gpu->identity.instruction_count = 512; 246 gpu->identity.instruction_count = 512;
226 else 247 else
227 gpu->identity.instruction_count = 256; 248 gpu->identity.instruction_count = 256;
@@ -242,6 +263,30 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
242 263
243 if (gpu->identity.num_constants == 0) 264 if (gpu->identity.num_constants == 0)
244 gpu->identity.num_constants = 168; 265 gpu->identity.num_constants = 168;
266
267 if (gpu->identity.varyings_count == 0) {
268 if (gpu->identity.minor_features1 & chipMinorFeatures1_HALTI0)
269 gpu->identity.varyings_count = 12;
270 else
271 gpu->identity.varyings_count = 8;
272 }
273
274 /*
275 * For some cores, two varyings are consumed for position, so the
276 * maximum varying count needs to be reduced by one.
277 */
278 if (etnaviv_is_model_rev(gpu, GC5000, 0x5434) ||
279 etnaviv_is_model_rev(gpu, GC4000, 0x5222) ||
280 etnaviv_is_model_rev(gpu, GC4000, 0x5245) ||
281 etnaviv_is_model_rev(gpu, GC4000, 0x5208) ||
282 etnaviv_is_model_rev(gpu, GC3000, 0x5435) ||
283 etnaviv_is_model_rev(gpu, GC2200, 0x5244) ||
284 etnaviv_is_model_rev(gpu, GC2100, 0x5108) ||
285 etnaviv_is_model_rev(gpu, GC2000, 0x5108) ||
286 etnaviv_is_model_rev(gpu, GC1500, 0x5246) ||
287 etnaviv_is_model_rev(gpu, GC880, 0x5107) ||
288 etnaviv_is_model_rev(gpu, GC880, 0x5106))
289 gpu->identity.varyings_count -= 1;
245} 290}
246 291
247static void etnaviv_hw_identify(struct etnaviv_gpu *gpu) 292static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
@@ -251,12 +296,10 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
251 chipIdentity = gpu_read(gpu, VIVS_HI_CHIP_IDENTITY); 296 chipIdentity = gpu_read(gpu, VIVS_HI_CHIP_IDENTITY);
252 297
253 /* Special case for older graphic cores. */ 298 /* Special case for older graphic cores. */
254 if (((chipIdentity & VIVS_HI_CHIP_IDENTITY_FAMILY__MASK) 299 if (etnaviv_field(chipIdentity, VIVS_HI_CHIP_IDENTITY_FAMILY) == 0x01) {
255 >> VIVS_HI_CHIP_IDENTITY_FAMILY__SHIFT) == 0x01) { 300 gpu->identity.model = chipModel_GC500;
256 gpu->identity.model = 0x500; /* gc500 */ 301 gpu->identity.revision = etnaviv_field(chipIdentity,
257 gpu->identity.revision = 302 VIVS_HI_CHIP_IDENTITY_REVISION);
258 (chipIdentity & VIVS_HI_CHIP_IDENTITY_REVISION__MASK)
259 >> VIVS_HI_CHIP_IDENTITY_REVISION__SHIFT;
260 } else { 303 } else {
261 304
262 gpu->identity.model = gpu_read(gpu, VIVS_HI_CHIP_MODEL); 305 gpu->identity.model = gpu_read(gpu, VIVS_HI_CHIP_MODEL);
@@ -269,13 +312,12 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
269 * same. Only for GC400 family. 312 * same. Only for GC400 family.
270 */ 313 */
271 if ((gpu->identity.model & 0xff00) == 0x0400 && 314 if ((gpu->identity.model & 0xff00) == 0x0400 &&
272 gpu->identity.model != 0x0420) { 315 gpu->identity.model != chipModel_GC420) {
273 gpu->identity.model = gpu->identity.model & 0x0400; 316 gpu->identity.model = gpu->identity.model & 0x0400;
274 } 317 }
275 318
276 /* Another special case */ 319 /* Another special case */
277 if (gpu->identity.model == 0x300 && 320 if (etnaviv_is_model_rev(gpu, GC300, 0x2201)) {
278 gpu->identity.revision == 0x2201) {
279 u32 chipDate = gpu_read(gpu, VIVS_HI_CHIP_DATE); 321 u32 chipDate = gpu_read(gpu, VIVS_HI_CHIP_DATE);
280 u32 chipTime = gpu_read(gpu, VIVS_HI_CHIP_TIME); 322 u32 chipTime = gpu_read(gpu, VIVS_HI_CHIP_TIME);
281 323
@@ -295,11 +337,13 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
295 gpu->identity.features = gpu_read(gpu, VIVS_HI_CHIP_FEATURE); 337 gpu->identity.features = gpu_read(gpu, VIVS_HI_CHIP_FEATURE);
296 338
297 /* Disable fast clear on GC700. */ 339 /* Disable fast clear on GC700. */
298 if (gpu->identity.model == 0x700) 340 if (gpu->identity.model == chipModel_GC700)
299 gpu->identity.features &= ~chipFeatures_FAST_CLEAR; 341 gpu->identity.features &= ~chipFeatures_FAST_CLEAR;
300 342
301 if ((gpu->identity.model == 0x500 && gpu->identity.revision < 2) || 343 if ((gpu->identity.model == chipModel_GC500 &&
302 (gpu->identity.model == 0x300 && gpu->identity.revision < 0x2000)) { 344 gpu->identity.revision < 2) ||
345 (gpu->identity.model == chipModel_GC300 &&
346 gpu->identity.revision < 0x2000)) {
303 347
304 /* 348 /*
305 * GC500 rev 1.x and GC300 rev < 2.0 doesn't have these 349 * GC500 rev 1.x and GC300 rev < 2.0 doesn't have these
@@ -309,6 +353,8 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
309 gpu->identity.minor_features1 = 0; 353 gpu->identity.minor_features1 = 0;
310 gpu->identity.minor_features2 = 0; 354 gpu->identity.minor_features2 = 0;
311 gpu->identity.minor_features3 = 0; 355 gpu->identity.minor_features3 = 0;
356 gpu->identity.minor_features4 = 0;
357 gpu->identity.minor_features5 = 0;
312 } else 358 } else
313 gpu->identity.minor_features0 = 359 gpu->identity.minor_features0 =
314 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_0); 360 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_0);
@@ -321,6 +367,10 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
321 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_2); 367 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_2);
322 gpu->identity.minor_features3 = 368 gpu->identity.minor_features3 =
323 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_3); 369 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_3);
370 gpu->identity.minor_features4 =
371 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_4);
372 gpu->identity.minor_features5 =
373 gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_5);
324 } 374 }
325 375
326 /* GC600 idle register reports zero bits where modules aren't present */ 376 /* GC600 idle register reports zero bits where modules aren't present */
@@ -441,10 +491,9 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu)
441{ 491{
442 u16 prefetch; 492 u16 prefetch;
443 493
444 if (gpu->identity.model == chipModel_GC320 && 494 if ((etnaviv_is_model_rev(gpu, GC320, 0x5007) ||
445 gpu_read(gpu, VIVS_HI_CHIP_TIME) != 0x2062400 && 495 etnaviv_is_model_rev(gpu, GC320, 0x5220)) &&
446 (gpu->identity.revision == 0x5007 || 496 gpu_read(gpu, VIVS_HI_CHIP_TIME) != 0x2062400) {
447 gpu->identity.revision == 0x5220)) {
448 u32 mc_memory_debug; 497 u32 mc_memory_debug;
449 498
450 mc_memory_debug = gpu_read(gpu, VIVS_MC_DEBUG_MEMORY) & ~0xff; 499 mc_memory_debug = gpu_read(gpu, VIVS_MC_DEBUG_MEMORY) & ~0xff;
@@ -466,7 +515,7 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu)
466 VIVS_HI_AXI_CONFIG_ARCACHE(2)); 515 VIVS_HI_AXI_CONFIG_ARCACHE(2));
467 516
468 /* GC2000 rev 5108 needs a special bus config */ 517 /* GC2000 rev 5108 needs a special bus config */
469 if (gpu->identity.model == 0x2000 && gpu->identity.revision == 0x5108) { 518 if (etnaviv_is_model_rev(gpu, GC2000, 0x5108)) {
470 u32 bus_config = gpu_read(gpu, VIVS_MC_BUS_CONFIG); 519 u32 bus_config = gpu_read(gpu, VIVS_MC_BUS_CONFIG);
471 bus_config &= ~(VIVS_MC_BUS_CONFIG_FE_BUS_CONFIG__MASK | 520 bus_config &= ~(VIVS_MC_BUS_CONFIG_FE_BUS_CONFIG__MASK |
472 VIVS_MC_BUS_CONFIG_TX_BUS_CONFIG__MASK); 521 VIVS_MC_BUS_CONFIG_TX_BUS_CONFIG__MASK);
@@ -511,8 +560,16 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
511 560
512 if (gpu->identity.model == 0) { 561 if (gpu->identity.model == 0) {
513 dev_err(gpu->dev, "Unknown GPU model\n"); 562 dev_err(gpu->dev, "Unknown GPU model\n");
514 pm_runtime_put_autosuspend(gpu->dev); 563 ret = -ENXIO;
515 return -ENXIO; 564 goto fail;
565 }
566
567 /* Exclude VG cores with FE2.0 */
568 if (gpu->identity.features & chipFeatures_PIPE_VG &&
569 gpu->identity.features & chipFeatures_FE20) {
570 dev_info(gpu->dev, "Ignoring GPU with VG and FE2.0\n");
571 ret = -ENXIO;
572 goto fail;
516 } 573 }
517 574
518 ret = etnaviv_hw_reset(gpu); 575 ret = etnaviv_hw_reset(gpu);
@@ -539,10 +596,9 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
539 goto fail; 596 goto fail;
540 } 597 }
541 598
542 /* TODO: we will leak here memory - fix it! */
543
544 gpu->mmu = etnaviv_iommu_new(gpu, iommu, version); 599 gpu->mmu = etnaviv_iommu_new(gpu, iommu, version);
545 if (!gpu->mmu) { 600 if (!gpu->mmu) {
601 iommu_domain_free(iommu);
546 ret = -ENOMEM; 602 ret = -ENOMEM;
547 goto fail; 603 goto fail;
548 } 604 }
@@ -552,7 +608,7 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
552 if (!gpu->buffer) { 608 if (!gpu->buffer) {
553 ret = -ENOMEM; 609 ret = -ENOMEM;
554 dev_err(gpu->dev, "could not create command buffer\n"); 610 dev_err(gpu->dev, "could not create command buffer\n");
555 goto fail; 611 goto destroy_iommu;
556 } 612 }
557 if (gpu->buffer->paddr - gpu->memory_base > 0x80000000) { 613 if (gpu->buffer->paddr - gpu->memory_base > 0x80000000) {
558 ret = -EINVAL; 614 ret = -EINVAL;
@@ -582,6 +638,9 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
582free_buffer: 638free_buffer:
583 etnaviv_gpu_cmdbuf_free(gpu->buffer); 639 etnaviv_gpu_cmdbuf_free(gpu->buffer);
584 gpu->buffer = NULL; 640 gpu->buffer = NULL;
641destroy_iommu:
642 etnaviv_iommu_destroy(gpu->mmu);
643 gpu->mmu = NULL;
585fail: 644fail:
586 pm_runtime_mark_last_busy(gpu->dev); 645 pm_runtime_mark_last_busy(gpu->dev);
587 pm_runtime_put_autosuspend(gpu->dev); 646 pm_runtime_put_autosuspend(gpu->dev);
@@ -642,6 +701,10 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m)
642 gpu->identity.minor_features2); 701 gpu->identity.minor_features2);
643 seq_printf(m, "\t minor_features3: 0x%08x\n", 702 seq_printf(m, "\t minor_features3: 0x%08x\n",
644 gpu->identity.minor_features3); 703 gpu->identity.minor_features3);
704 seq_printf(m, "\t minor_features4: 0x%08x\n",
705 gpu->identity.minor_features4);
706 seq_printf(m, "\t minor_features5: 0x%08x\n",
707 gpu->identity.minor_features5);
645 708
646 seq_puts(m, "\tspecs\n"); 709 seq_puts(m, "\tspecs\n");
647 seq_printf(m, "\t stream_count: %d\n", 710 seq_printf(m, "\t stream_count: %d\n",
@@ -664,6 +727,8 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m)
664 gpu->identity.instruction_count); 727 gpu->identity.instruction_count);
665 seq_printf(m, "\t num_constants: %d\n", 728 seq_printf(m, "\t num_constants: %d\n",
666 gpu->identity.num_constants); 729 gpu->identity.num_constants);
730 seq_printf(m, "\t varyings_count: %d\n",
731 gpu->identity.varyings_count);
667 732
668 seq_printf(m, "\taxi: 0x%08x\n", axi); 733 seq_printf(m, "\taxi: 0x%08x\n", axi);
669 seq_printf(m, "\tidle: 0x%08x\n", idle); 734 seq_printf(m, "\tidle: 0x%08x\n", idle);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
index c75d50359ab0..f233ac4c7c1c 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
@@ -46,6 +46,12 @@ struct etnaviv_chip_identity {
46 /* Supported minor feature 3 fields. */ 46 /* Supported minor feature 3 fields. */
47 u32 minor_features3; 47 u32 minor_features3;
48 48
49 /* Supported minor feature 4 fields. */
50 u32 minor_features4;
51
52 /* Supported minor feature 5 fields. */
53 u32 minor_features5;
54
49 /* Number of streams supported. */ 55 /* Number of streams supported. */
50 u32 stream_count; 56 u32 stream_count;
51 57
@@ -75,6 +81,9 @@ struct etnaviv_chip_identity {
75 81
76 /* Buffer size */ 82 /* Buffer size */
77 u32 buffer_size; 83 u32 buffer_size;
84
85 /* Number of varyings */
86 u8 varyings_count;
78}; 87};
79 88
80struct etnaviv_event { 89struct etnaviv_event {
diff --git a/drivers/gpu/drm/etnaviv/state_hi.xml.h b/drivers/gpu/drm/etnaviv/state_hi.xml.h
index 0064f2640396..6a7de5f1454a 100644
--- a/drivers/gpu/drm/etnaviv/state_hi.xml.h
+++ b/drivers/gpu/drm/etnaviv/state_hi.xml.h
@@ -8,8 +8,8 @@ http://0x04.net/cgit/index.cgi/rules-ng-ng
8git clone git://0x04.net/rules-ng-ng 8git clone git://0x04.net/rules-ng-ng
9 9
10The rules-ng-ng source files this header was generated from are: 10The rules-ng-ng source files this header was generated from are:
11- state_hi.xml ( 23420 bytes, from 2015-03-25 11:47:21) 11- state_hi.xml ( 24309 bytes, from 2015-12-12 09:02:53)
12- common.xml ( 18437 bytes, from 2015-03-25 11:27:41) 12- common.xml ( 18437 bytes, from 2015-12-12 09:02:53)
13 13
14Copyright (C) 2015 14Copyright (C) 2015
15*/ 15*/
@@ -182,8 +182,25 @@ Copyright (C) 2015
182 182
183#define VIVS_HI_CHIP_MINOR_FEATURE_3 0x00000088 183#define VIVS_HI_CHIP_MINOR_FEATURE_3 0x00000088
184 184
185#define VIVS_HI_CHIP_SPECS_3 0x0000008c
186#define VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__MASK 0x000001f0
187#define VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__SHIFT 4
188#define VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT(x) (((x) << VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__SHIFT) & VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__MASK)
189#define VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__MASK 0x00000007
190#define VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__SHIFT 0
191#define VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT(x) (((x) << VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__SHIFT) & VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__MASK)
192
185#define VIVS_HI_CHIP_MINOR_FEATURE_4 0x00000094 193#define VIVS_HI_CHIP_MINOR_FEATURE_4 0x00000094
186 194
195#define VIVS_HI_CHIP_SPECS_4 0x0000009c
196#define VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__MASK 0x0001f000
197#define VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__SHIFT 12
198#define VIVS_HI_CHIP_SPECS_4_STREAM_COUNT(x) (((x) << VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__SHIFT) & VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__MASK)
199
200#define VIVS_HI_CHIP_MINOR_FEATURE_5 0x000000a0
201
202#define VIVS_HI_CHIP_PRODUCT_ID 0x000000a8
203
187#define VIVS_PM 0x00000000 204#define VIVS_PM 0x00000000
188 205
189#define VIVS_PM_POWER_CONTROLS 0x00000100 206#define VIVS_PM_POWER_CONTROLS 0x00000100
@@ -206,6 +223,11 @@ Copyright (C) 2015
206#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_FE 0x00000001 223#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_FE 0x00000001
207#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_DE 0x00000002 224#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_DE 0x00000002
208#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_PE 0x00000004 225#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_PE 0x00000004
226#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_SH 0x00000008
227#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_PA 0x00000010
228#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_SE 0x00000020
229#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_RA 0x00000040
230#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_TX 0x00000080
209 231
210#define VIVS_PM_PULSE_EATER 0x0000010c 232#define VIVS_PM_PULSE_EATER 0x0000010c
211 233
diff --git a/include/uapi/drm/etnaviv_drm.h b/include/uapi/drm/etnaviv_drm.h
index 4cc989ad6851..f95e1c43c3fb 100644
--- a/include/uapi/drm/etnaviv_drm.h
+++ b/include/uapi/drm/etnaviv_drm.h
@@ -48,6 +48,8 @@ struct drm_etnaviv_timespec {
48#define ETNAVIV_PARAM_GPU_FEATURES_2 0x05 48#define ETNAVIV_PARAM_GPU_FEATURES_2 0x05
49#define ETNAVIV_PARAM_GPU_FEATURES_3 0x06 49#define ETNAVIV_PARAM_GPU_FEATURES_3 0x06
50#define ETNAVIV_PARAM_GPU_FEATURES_4 0x07 50#define ETNAVIV_PARAM_GPU_FEATURES_4 0x07
51#define ETNAVIV_PARAM_GPU_FEATURES_5 0x08
52#define ETNAVIV_PARAM_GPU_FEATURES_6 0x09
51 53
52#define ETNAVIV_PARAM_GPU_STREAM_COUNT 0x10 54#define ETNAVIV_PARAM_GPU_STREAM_COUNT 0x10
53#define ETNAVIV_PARAM_GPU_REGISTER_MAX 0x11 55#define ETNAVIV_PARAM_GPU_REGISTER_MAX 0x11
@@ -59,6 +61,7 @@ struct drm_etnaviv_timespec {
59#define ETNAVIV_PARAM_GPU_BUFFER_SIZE 0x17 61#define ETNAVIV_PARAM_GPU_BUFFER_SIZE 0x17
60#define ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT 0x18 62#define ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT 0x18
61#define ETNAVIV_PARAM_GPU_NUM_CONSTANTS 0x19 63#define ETNAVIV_PARAM_GPU_NUM_CONSTANTS 0x19
64#define ETNAVIV_PARAM_GPU_NUM_VARYINGS 0x1a
62 65
63#define ETNA_MAX_PIPES 4 66#define ETNA_MAX_PIPES 4
64 67