Skip to content

Commit 00f4471

Browse files
author
Thomas Zimmermann
committed
Merge drm/drm-next into drm-misc-next
Backmerge to prepare for i915-ttm topic branch. Signed-off-by: Thomas Zimmermann <[email protected]>
2 parents 352a81b + 1bd8a7d commit 00f4471

File tree

126 files changed

+2065
-2788
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+2065
-2788
lines changed

drivers/gpu/drm/etnaviv/etnaviv_dump.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static void etnaviv_core_dump_header(struct core_dump_iterator *iter,
7575
hdr->file_size = cpu_to_le32(data_end - iter->data);
7676

7777
iter->hdr++;
78-
iter->data += hdr->file_size;
78+
iter->data += le32_to_cpu(hdr->file_size);
7979
}
8080

8181
static void etnaviv_core_dump_registers(struct core_dump_iterator *iter,
@@ -85,8 +85,8 @@ static void etnaviv_core_dump_registers(struct core_dump_iterator *iter,
8585
unsigned int i;
8686

8787
for (i = 0; i < ARRAY_SIZE(etnaviv_dump_registers); i++, reg++) {
88-
reg->reg = etnaviv_dump_registers[i];
89-
reg->value = gpu_read(gpu, etnaviv_dump_registers[i]);
88+
reg->reg = cpu_to_le32(etnaviv_dump_registers[i]);
89+
reg->value = cpu_to_le32(gpu_read(gpu, etnaviv_dump_registers[i]));
9090
}
9191

9292
etnaviv_core_dump_header(iter, ETDUMP_BUF_REG, reg);
@@ -207,7 +207,7 @@ void etnaviv_core_dump(struct etnaviv_gem_submit *submit)
207207
if (!IS_ERR(pages)) {
208208
int j;
209209

210-
iter.hdr->data[0] = bomap - bomap_start;
210+
iter.hdr->data[0] = cpu_to_le32((bomap - bomap_start));
211211

212212
for (j = 0; j < obj->base.size >> PAGE_SHIFT; j++)
213213
*bomap++ = cpu_to_le64(page_to_phys(*pages++));

drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
8080
/* Don't drop the pages for imported dmabuf, as they are not
8181
* ours, just free the array we allocated:
8282
*/
83-
if (etnaviv_obj->pages)
84-
kvfree(etnaviv_obj->pages);
83+
kvfree(etnaviv_obj->pages);
8584

8685
drm_prime_gem_destroy(&etnaviv_obj->base, etnaviv_obj->sgt);
8786
}

drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -612,14 +612,10 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
612612
err_submit_cmds:
613613
if (ret && (out_fence_fd >= 0))
614614
put_unused_fd(out_fence_fd);
615-
if (stream)
616-
kvfree(stream);
617-
if (bos)
618-
kvfree(bos);
619-
if (relocs)
620-
kvfree(relocs);
621-
if (pmrs)
622-
kvfree(pmrs);
615+
kvfree(stream);
616+
kvfree(bos);
617+
kvfree(relocs);
618+
kvfree(pmrs);
623619

624620
return ret;
625621
}

drivers/gpu/drm/etnaviv/etnaviv_gpu.c

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@
2727
#include "state_hi.xml.h"
2828
#include "cmdstream.xml.h"
2929

30-
#ifndef PHYS_OFFSET
31-
#define PHYS_OFFSET 0
32-
#endif
33-
3430
static const struct platform_device_id gpu_ids[] = {
3531
{ .name = "etnaviv-gpu,2d" },
3632
{ },
@@ -156,6 +152,18 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
156152
*value = ~0ULL;
157153
break;
158154

155+
case ETNAVIV_PARAM_GPU_PRODUCT_ID:
156+
*value = gpu->identity.product_id;
157+
break;
158+
159+
case ETNAVIV_PARAM_GPU_CUSTOMER_ID:
160+
*value = gpu->identity.customer_id;
161+
break;
162+
163+
case ETNAVIV_PARAM_GPU_ECO_ID:
164+
*value = gpu->identity.eco_id;
165+
break;
166+
159167
default:
160168
DBG("%s: invalid param: %u", dev_name(gpu->dev), param);
161169
return -EINVAL;
@@ -724,6 +732,7 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu)
724732
int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
725733
{
726734
struct etnaviv_drm_private *priv = gpu->drm->dev_private;
735+
dma_addr_t cmdbuf_paddr;
727736
int ret, i;
728737

729738
ret = pm_runtime_get_sync(gpu->dev);
@@ -766,28 +775,6 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
766775
if (ret)
767776
goto fail;
768777

769-
/*
770-
* Set the GPU linear window to be at the end of the DMA window, where
771-
* the CMA area is likely to reside. This ensures that we are able to
772-
* map the command buffers while having the linear window overlap as
773-
* much RAM as possible, so we can optimize mappings for other buffers.
774-
*
775-
* For 3D cores only do this if MC2.0 is present, as with MC1.0 it leads
776-
* to different views of the memory on the individual engines.
777-
*/
778-
if (!(gpu->identity.features & chipFeatures_PIPE_3D) ||
779-
(gpu->identity.minor_features0 & chipMinorFeatures0_MC20)) {
780-
u32 dma_mask = (u32)dma_get_required_mask(gpu->dev);
781-
if (dma_mask < PHYS_OFFSET + SZ_2G)
782-
priv->mmu_global->memory_base = PHYS_OFFSET;
783-
else
784-
priv->mmu_global->memory_base = dma_mask - SZ_2G + 1;
785-
} else if (PHYS_OFFSET >= SZ_2G) {
786-
dev_info(gpu->dev, "Need to move linear window on MC1.0, disabling TS\n");
787-
priv->mmu_global->memory_base = PHYS_OFFSET;
788-
gpu->identity.features &= ~chipFeatures_FAST_CLEAR;
789-
}
790-
791778
/*
792779
* If the GPU is part of a system with DMA addressing limitations,
793780
* request pages for our SHM backend buffers from the DMA32 zone to
@@ -804,6 +791,31 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
804791
goto fail;
805792
}
806793

794+
/*
795+
* Set the GPU linear window to cover the cmdbuf region, as the GPU
796+
* won't be able to start execution otherwise. The alignment to 128M is
797+
* chosen arbitrarily but helps in debugging, as the MMU offset
798+
* calculations are much more straight forward this way.
799+
*
800+
* On MC1.0 cores the linear window offset is ignored by the TS engine,
801+
* leading to inconsistent memory views. Avoid using the offset on those
802+
* cores if possible, otherwise disable the TS feature.
803+
*/
804+
cmdbuf_paddr = ALIGN_DOWN(etnaviv_cmdbuf_get_pa(&gpu->buffer), SZ_128M);
805+
806+
if (!(gpu->identity.features & chipFeatures_PIPE_3D) ||
807+
(gpu->identity.minor_features0 & chipMinorFeatures0_MC20)) {
808+
if (cmdbuf_paddr >= SZ_2G)
809+
priv->mmu_global->memory_base = SZ_2G;
810+
else
811+
priv->mmu_global->memory_base = cmdbuf_paddr;
812+
} else if (cmdbuf_paddr + SZ_128M >= SZ_2G) {
813+
dev_info(gpu->dev,
814+
"Need to move linear window on MC1.0, disabling TS\n");
815+
gpu->identity.features &= ~chipFeatures_FAST_CLEAR;
816+
priv->mmu_global->memory_base = SZ_2G;
817+
}
818+
807819
/* Setup event management */
808820
spin_lock_init(&gpu->event_spinlock);
809821
init_completion(&gpu->event_free);
@@ -1771,10 +1783,8 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
17711783

17721784
/* Get Interrupt: */
17731785
gpu->irq = platform_get_irq(pdev, 0);
1774-
if (gpu->irq < 0) {
1775-
dev_err(dev, "failed to get irq: %d\n", gpu->irq);
1786+
if (gpu->irq < 0)
17761787
return gpu->irq;
1777-
}
17781788

17791789
err = devm_request_irq(&pdev->dev, gpu->irq, irq_handler, 0,
17801790
dev_name(gpu->dev), gpu);

drivers/gpu/drm/etnaviv/etnaviv_hwdb.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,37 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = {
3737
.minor_features10 = 0x0,
3838
.minor_features11 = 0x0,
3939
},
40+
{
41+
.model = 0x7000,
42+
.revision = 0x6204,
43+
.product_id = ~0U,
44+
.customer_id = ~0U,
45+
.eco_id = 0,
46+
.stream_count = 16,
47+
.register_max = 64,
48+
.thread_count = 512,
49+
.shader_core_count = 2,
50+
.vertex_cache_size = 16,
51+
.vertex_output_buffer_size = 1024,
52+
.pixel_pipes = 1,
53+
.instruction_count = 512,
54+
.num_constants = 320,
55+
.buffer_size = 0,
56+
.varyings_count = 16,
57+
.features = 0xe0287c8d,
58+
.minor_features0 = 0xc1589eff,
59+
.minor_features1 = 0xfefbfad9,
60+
.minor_features2 = 0xeb9d4fbf,
61+
.minor_features3 = 0xedfffced,
62+
.minor_features4 = 0xdb0dafc7,
63+
.minor_features5 = 0x3b5ac333,
64+
.minor_features6 = 0xfcce6000,
65+
.minor_features7 = 0xfffbfa6f,
66+
.minor_features8 = 0x00e10ef3,
67+
.minor_features9 = 0x04c8003c,
68+
.minor_features10 = 0x00004060,
69+
.minor_features11 = 0x00000024,
70+
},
4071
{
4172
.model = 0x7000,
4273
.revision = 0x6214,

drivers/gpu/drm/exynos/exynos5433_drm_decon.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,13 @@ static void decon_swreset(struct decon_context *ctx)
513513
static void decon_atomic_enable(struct exynos_drm_crtc *crtc)
514514
{
515515
struct decon_context *ctx = crtc->ctx;
516+
int ret;
516517

517-
pm_runtime_get_sync(ctx->dev);
518+
ret = pm_runtime_resume_and_get(ctx->dev);
519+
if (ret < 0) {
520+
DRM_DEV_ERROR(ctx->dev, "failed to enable DECON device.\n");
521+
return;
522+
}
518523

519524
exynos_drm_pipe_clk_enable(crtc, true);
520525

drivers/gpu/drm/exynos/exynos7_drm_decon.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,11 +531,16 @@ static void decon_init(struct decon_context *ctx)
531531
static void decon_atomic_enable(struct exynos_drm_crtc *crtc)
532532
{
533533
struct decon_context *ctx = crtc->ctx;
534+
int ret;
534535

535536
if (!ctx->suspended)
536537
return;
537538

538-
pm_runtime_get_sync(ctx->dev);
539+
ret = pm_runtime_resume_and_get(ctx->dev);
540+
if (ret < 0) {
541+
DRM_DEV_ERROR(ctx->dev, "failed to enable DECON device.\n");
542+
return;
543+
}
539544

540545
decon_init(ctx);
541546

drivers/gpu/drm/exynos/exynos_drm_dsi.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1383,7 +1383,12 @@ static void exynos_dsi_enable(struct drm_encoder *encoder)
13831383
if (dsi->state & DSIM_STATE_ENABLED)
13841384
return;
13851385

1386-
pm_runtime_get_sync(dsi->dev);
1386+
ret = pm_runtime_resume_and_get(dsi->dev);
1387+
if (ret < 0) {
1388+
dev_err(dsi->dev, "failed to enable DSI device.\n");
1389+
return;
1390+
}
1391+
13871392
dsi->state |= DSIM_STATE_ENABLED;
13881393

13891394
if (dsi->panel) {

drivers/gpu/drm/exynos/exynos_drm_fimc.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1085,8 +1085,14 @@ static int fimc_commit(struct exynos_drm_ipp *ipp,
10851085
{
10861086
struct fimc_context *ctx =
10871087
container_of(ipp, struct fimc_context, ipp);
1088+
int ret;
1089+
1090+
ret = pm_runtime_resume_and_get(ctx->dev);
1091+
if (ret < 0) {
1092+
dev_err(ctx->dev, "failed to enable FIMC device.\n");
1093+
return ret;
1094+
}
10881095

1089-
pm_runtime_get_sync(ctx->dev);
10901096
ctx->task = task;
10911097

10921098
fimc_src_set_fmt(ctx, task->src.buf.fourcc, task->src.buf.modifier);

drivers/gpu/drm/exynos/exynos_drm_fimd.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,13 +343,18 @@ static void fimd_enable_shadow_channel_path(struct fimd_context *ctx,
343343
writel(val, ctx->regs + SHADOWCON);
344344
}
345345

346-
static void fimd_clear_channels(struct exynos_drm_crtc *crtc)
346+
static int fimd_clear_channels(struct exynos_drm_crtc *crtc)
347347
{
348348
struct fimd_context *ctx = crtc->ctx;
349349
unsigned int win, ch_enabled = 0;
350+
int ret;
350351

351352
/* Hardware is in unknown state, so ensure it gets enabled properly */
352-
pm_runtime_get_sync(ctx->dev);
353+
ret = pm_runtime_resume_and_get(ctx->dev);
354+
if (ret < 0) {
355+
dev_err(ctx->dev, "failed to enable FIMD device.\n");
356+
return ret;
357+
}
353358

354359
clk_prepare_enable(ctx->bus_clk);
355360
clk_prepare_enable(ctx->lcd_clk);
@@ -384,6 +389,8 @@ static void fimd_clear_channels(struct exynos_drm_crtc *crtc)
384389
clk_disable_unprepare(ctx->bus_clk);
385390

386391
pm_runtime_put(ctx->dev);
392+
393+
return 0;
387394
}
388395

389396

@@ -905,7 +912,10 @@ static void fimd_atomic_enable(struct exynos_drm_crtc *crtc)
905912

906913
ctx->suspended = false;
907914

908-
pm_runtime_get_sync(ctx->dev);
915+
if (pm_runtime_resume_and_get(ctx->dev) < 0) {
916+
dev_warn(ctx->dev, "failed to enable FIMD device.\n");
917+
return;
918+
}
909919

910920
/* if vblank was enabled status, enable it again. */
911921
if (test_and_clear_bit(0, &ctx->irq_flags))
@@ -1089,8 +1099,13 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
10891099
if (ctx->encoder)
10901100
exynos_dpi_bind(drm_dev, ctx->encoder);
10911101

1092-
if (is_drm_iommu_supported(drm_dev))
1093-
fimd_clear_channels(ctx->crtc);
1102+
if (is_drm_iommu_supported(drm_dev)) {
1103+
int ret;
1104+
1105+
ret = fimd_clear_channels(ctx->crtc);
1106+
if (ret < 0)
1107+
return ret;
1108+
}
10941109

10951110
return exynos_drm_register_dma(drm_dev, dev, &ctx->dma_priv);
10961111
}

drivers/gpu/drm/exynos/exynos_drm_g2d.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,14 @@ static void g2d_runqueue_worker(struct work_struct *work)
892892
g2d->runqueue_node = g2d_get_runqueue_node(g2d);
893893

894894
if (g2d->runqueue_node) {
895-
pm_runtime_get_sync(g2d->dev);
895+
int ret;
896+
897+
ret = pm_runtime_resume_and_get(g2d->dev);
898+
if (ret < 0) {
899+
dev_err(g2d->dev, "failed to enable G2D device.\n");
900+
return;
901+
}
902+
896903
g2d_dma_start(g2d, g2d->runqueue_node);
897904
}
898905
}

drivers/gpu/drm/exynos/exynos_drm_gsc.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,12 @@ static int gsc_commit(struct exynos_drm_ipp *ipp,
11181118
struct gsc_context *ctx = container_of(ipp, struct gsc_context, ipp);
11191119
int ret;
11201120

1121-
pm_runtime_get_sync(ctx->dev);
1121+
ret = pm_runtime_resume_and_get(ctx->dev);
1122+
if (ret < 0) {
1123+
dev_err(ctx->dev, "failed to enable GScaler device.\n");
1124+
return ret;
1125+
}
1126+
11221127
ctx->task = task;
11231128

11241129
ret = gsc_reset(ctx);

drivers/gpu/drm/exynos/exynos_drm_mic.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,9 @@ static void mic_pre_enable(struct drm_bridge *bridge)
268268
if (mic->enabled)
269269
goto unlock;
270270

271-
ret = pm_runtime_get_sync(mic->dev);
272-
if (ret < 0) {
273-
pm_runtime_put_noidle(mic->dev);
271+
ret = pm_runtime_resume_and_get(mic->dev);
272+
if (ret < 0)
274273
goto unlock;
275-
}
276274

277275
mic_set_path(mic, 1);
278276

drivers/gpu/drm/exynos/exynos_drm_rotator.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,13 @@ static int rotator_commit(struct exynos_drm_ipp *ipp,
219219
{
220220
struct rot_context *rot =
221221
container_of(ipp, struct rot_context, ipp);
222+
int ret;
222223

223-
pm_runtime_get_sync(rot->dev);
224+
ret = pm_runtime_resume_and_get(rot->dev);
225+
if (ret < 0) {
226+
dev_err(rot->dev, "failed to enable ROTATOR device.\n");
227+
return ret;
228+
}
224229
rot->task = task;
225230

226231
rotator_src_set_fmt(rot, task->src.buf.fourcc);

0 commit comments

Comments
 (0)