Commit eb85d03e authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-next-fixes-2019-05-08' of...

Merge tag 'drm-misc-next-fixes-2019-05-08' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

- A handful of fixes from -next that just missed feature freeze
- More panfrost fixes that went directly in -misc-next-fixes (various)
- Fix searchpaths during build (Masahiro)
- msm patch to fix the driver for chips without zap shader (Rob)
- Fix freeing imported buffers in drm_gem_cma_free_object() (Noralf)

Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Rob Clark <robdclark@chromium.org>
Cc: Noralf Trønnes <noralf@tronnes.org>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Sean Paul <sean@poorly.run>
Link: https://patchwork.freedesktop.org/patch/msgid/20190508205153.GA91135@art_vandelay
parents f2e8d169 15273ffd
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
# Makefile for the drm device driver. This driver provides support for the # Makefile for the drm device driver. This driver provides support for the
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
FULL_AMD_PATH=$(src)/.. FULL_AMD_PATH=$(srctree)/$(src)/..
DISPLAY_FOLDER_NAME=display DISPLAY_FOLDER_NAME=display
FULL_AMD_DISPLAY_PATH = $(FULL_AMD_PATH)/$(DISPLAY_FOLDER_NAME) FULL_AMD_DISPLAY_PATH = $(FULL_AMD_PATH)/$(DISPLAY_FOLDER_NAME)
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
ccflags-y := \ ccflags-y := \
-I$(src)/../include \ -I $(srctree)/$(src)/../include \
-I$(src) -I $(srctree)/$(src)
komeda-y := \ komeda-y := \
komeda_drv.o \ komeda_drv.o \
......
...@@ -1416,12 +1416,6 @@ EXPORT_SYMBOL(drm_mode_create_scaling_mode_property); ...@@ -1416,12 +1416,6 @@ EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
* *
* The driver may place further restrictions within these minimum * The driver may place further restrictions within these minimum
* and maximum bounds. * and maximum bounds.
*
* The semantics for the vertical blank timestamp differ when
* variable refresh rate is active. The vertical blank timestamp
* is defined to be an estimate using the current mode's fixed
* refresh rate timings. The semantics for the page-flip event
* timestamp remain the same.
*/ */
/** /**
......
...@@ -186,13 +186,13 @@ void drm_gem_cma_free_object(struct drm_gem_object *gem_obj) ...@@ -186,13 +186,13 @@ void drm_gem_cma_free_object(struct drm_gem_object *gem_obj)
cma_obj = to_drm_gem_cma_obj(gem_obj); cma_obj = to_drm_gem_cma_obj(gem_obj);
if (cma_obj->vaddr) { if (gem_obj->import_attach) {
dma_free_wc(gem_obj->dev->dev, cma_obj->base.size,
cma_obj->vaddr, cma_obj->paddr);
} else if (gem_obj->import_attach) {
if (cma_obj->vaddr) if (cma_obj->vaddr)
dma_buf_vunmap(gem_obj->import_attach->dmabuf, cma_obj->vaddr); dma_buf_vunmap(gem_obj->import_attach->dmabuf, cma_obj->vaddr);
drm_prime_gem_destroy(gem_obj, cma_obj->sgt); drm_prime_gem_destroy(gem_obj, cma_obj->sgt);
} else if (cma_obj->vaddr) {
dma_free_wc(gem_obj->dev->dev, cma_obj->base.size,
cma_obj->vaddr, cma_obj->paddr);
} }
drm_gem_object_release(gem_obj); drm_gem_object_release(gem_obj);
......
...@@ -5,5 +5,5 @@ GVT_SOURCE := gvt.o aperture_gm.o handlers.o vgpu.o trace_points.o firmware.o \ ...@@ -5,5 +5,5 @@ GVT_SOURCE := gvt.o aperture_gm.o handlers.o vgpu.o trace_points.o firmware.o \
execlist.o scheduler.o sched_policy.o mmio_context.o cmd_parser.o debugfs.o \ execlist.o scheduler.o sched_policy.o mmio_context.o cmd_parser.o debugfs.o \
fb_decoder.o dmabuf.o page_track.o fb_decoder.o dmabuf.o page_track.o
ccflags-y += -I$(src) -I$(src)/$(GVT_DIR) ccflags-y += -I $(srctree)/$(src) -I $(srctree)/$(src)/$(GVT_DIR)/
i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE)) i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE))
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
ccflags-y := -Idrivers/gpu/drm/msm ccflags-y := -I $(srctree)/$(src)
ccflags-y += -Idrivers/gpu/drm/msm/disp/dpu1 ccflags-y += -I $(srctree)/$(src)/disp/dpu1
ccflags-$(CONFIG_DRM_MSM_DSI) += -Idrivers/gpu/drm/msm/dsi ccflags-$(CONFIG_DRM_MSM_DSI) += -I $(srctree)/$(src)/dsi
msm-y := \ msm-y := \
adreno/adreno_device.o \ adreno/adreno_device.o \
......
...@@ -527,6 +527,7 @@ static int a6xx_hw_init(struct msm_gpu *gpu) ...@@ -527,6 +527,7 @@ static int a6xx_hw_init(struct msm_gpu *gpu)
dev_warn_once(gpu->dev->dev, dev_warn_once(gpu->dev->dev,
"Zap shader not enabled - using SECVID_TRUST_CNTL instead\n"); "Zap shader not enabled - using SECVID_TRUST_CNTL instead\n");
gpu_write(gpu, REG_A6XX_RBBM_SECVID_TRUST_CNTL, 0x0); gpu_write(gpu, REG_A6XX_RBBM_SECVID_TRUST_CNTL, 0x0);
ret = 0;
} }
out: out:
......
ccflags-y += -I$(src)/include ccflags-y += -I $(srctree)/$(src)/include
ccflags-y += -I$(src)/include/nvkm ccflags-y += -I $(srctree)/$(src)/include/nvkm
ccflags-y += -I$(src)/nvkm ccflags-y += -I $(srctree)/$(src)/nvkm
ccflags-y += -I$(src) ccflags-y += -I $(srctree)/$(src)
# NVKM - HW resource manager # NVKM - HW resource manager
#- code also used by various userspace tools/tests #- code also used by various userspace tools/tests
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
config DRM_PANFROST config DRM_PANFROST
tristate "Panfrost (DRM support for ARM Mali Midgard/Bifrost GPUs)" tristate "Panfrost (DRM support for ARM Mali Midgard/Bifrost GPUs)"
depends on DRM depends on DRM
depends on ARM || ARM64 || COMPILE_TEST depends on ARM || ARM64 || (COMPILE_TEST && !GENERIC_ATOMIC64)
depends on MMU depends on MMU
select DRM_SCHED select DRM_SCHED
select IOMMU_SUPPORT select IOMMU_SUPPORT
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include "panfrost_device.h" #include "panfrost_device.h"
#include "panfrost_devfreq.h"
#include "panfrost_features.h" #include "panfrost_features.h"
#include "panfrost_issues.h" #include "panfrost_issues.h"
#include "panfrost_gpu.h" #include "panfrost_gpu.h"
......
...@@ -98,6 +98,7 @@ int panfrost_device_init(struct panfrost_device *pfdev) ...@@ -98,6 +98,7 @@ int panfrost_device_init(struct panfrost_device *pfdev)
struct resource *res; struct resource *res;
mutex_init(&pfdev->sched_lock); mutex_init(&pfdev->sched_lock);
mutex_init(&pfdev->reset_lock);
INIT_LIST_HEAD(&pfdev->scheduled_jobs); INIT_LIST_HEAD(&pfdev->scheduled_jobs);
spin_lock_init(&pfdev->hwaccess_lock); spin_lock_init(&pfdev->hwaccess_lock);
......
...@@ -78,6 +78,7 @@ struct panfrost_device { ...@@ -78,6 +78,7 @@ struct panfrost_device {
struct list_head scheduled_jobs; struct list_head scheduled_jobs;
struct mutex sched_lock; struct mutex sched_lock;
struct mutex reset_lock;
struct { struct {
struct devfreq *devfreq; struct devfreq *devfreq;
......
...@@ -3,8 +3,6 @@ ...@@ -3,8 +3,6 @@
/* Copyright 2019 Linaro, Ltd., Rob Herring <robh@kernel.org> */ /* Copyright 2019 Linaro, Ltd., Rob Herring <robh@kernel.org> */
/* Copyright 2019 Collabora ltd. */ /* Copyright 2019 Collabora ltd. */
#include <linux/bitfield.h>
#include <linux/dma-mapping.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
...@@ -172,13 +170,27 @@ static int panfrost_ioctl_submit(struct drm_device *dev, void *data, ...@@ -172,13 +170,27 @@ static int panfrost_ioctl_submit(struct drm_device *dev, void *data,
{ {
struct panfrost_device *pfdev = dev->dev_private; struct panfrost_device *pfdev = dev->dev_private;
struct drm_panfrost_submit *args = data; struct drm_panfrost_submit *args = data;
struct drm_syncobj *sync_out; struct drm_syncobj *sync_out = NULL;
struct panfrost_job *job; struct panfrost_job *job;
int ret = 0; int ret = 0;
if (!args->jc)
return -EINVAL;
if (args->requirements && args->requirements != PANFROST_JD_REQ_FS)
return -EINVAL;
if (args->out_sync > 0) {
sync_out = drm_syncobj_find(file, args->out_sync);
if (!sync_out)
return -ENODEV;
}
job = kzalloc(sizeof(*job), GFP_KERNEL); job = kzalloc(sizeof(*job), GFP_KERNEL);
if (!job) if (!job) {
return -ENOMEM; ret = -ENOMEM;
goto fail_out_sync;
}
kref_init(&job->refcount); kref_init(&job->refcount);
...@@ -190,25 +202,24 @@ static int panfrost_ioctl_submit(struct drm_device *dev, void *data, ...@@ -190,25 +202,24 @@ static int panfrost_ioctl_submit(struct drm_device *dev, void *data,
ret = panfrost_copy_in_sync(dev, file, args, job); ret = panfrost_copy_in_sync(dev, file, args, job);
if (ret) if (ret)
goto fail; goto fail_job;
ret = panfrost_lookup_bos(dev, file, args, job); ret = panfrost_lookup_bos(dev, file, args, job);
if (ret) if (ret)
goto fail; goto fail_job;
ret = panfrost_job_push(job); ret = panfrost_job_push(job);
if (ret) if (ret)
goto fail; goto fail_job;
/* Update the return sync object for the job */ /* Update the return sync object for the job */
sync_out = drm_syncobj_find(file, args->out_sync); if (sync_out)
if (sync_out) {
drm_syncobj_replace_fence(sync_out, job->render_done_fence); drm_syncobj_replace_fence(sync_out, job->render_done_fence);
drm_syncobj_put(sync_out);
}
fail: fail_job:
panfrost_job_put(job); panfrost_job_put(job);
fail_out_sync:
drm_syncobj_put(sync_out);
return ret; return ret;
} }
...@@ -384,16 +395,15 @@ static int panfrost_probe(struct platform_device *pdev) ...@@ -384,16 +395,15 @@ static int panfrost_probe(struct platform_device *pdev)
err = panfrost_device_init(pfdev); err = panfrost_device_init(pfdev);
if (err) { if (err) {
dev_err(&pdev->dev, "Fatal error during GPU init\n"); if (err != -EPROBE_DEFER)
dev_err(&pdev->dev, "Fatal error during GPU init\n");
goto err_out0; goto err_out0;
} }
dma_set_mask_and_coherent(pfdev->dev,
DMA_BIT_MASK(FIELD_GET(0xff00, pfdev->features.mmu_features)));
err = panfrost_devfreq_init(pfdev); err = panfrost_devfreq_init(pfdev);
if (err) { if (err) {
dev_err(&pdev->dev, "Fatal error during devfreq init\n"); if (err != -EPROBE_DEFER)
dev_err(&pdev->dev, "Fatal error during devfreq init\n");
goto err_out1; goto err_out1;
} }
...@@ -410,6 +420,7 @@ static int panfrost_probe(struct platform_device *pdev) ...@@ -410,6 +420,7 @@ static int panfrost_probe(struct platform_device *pdev)
err_out1: err_out1:
panfrost_device_fini(pfdev); panfrost_device_fini(pfdev);
err_out0: err_out0:
pm_runtime_disable(pfdev->dev);
drm_dev_put(ddev); drm_dev_put(ddev);
return err; return err;
} }
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
/* Called DRM core on the last userspace/kernel unreference of the /* Called DRM core on the last userspace/kernel unreference of the
* BO. * BO.
*/ */
void panfrost_gem_free_object(struct drm_gem_object *obj) static void panfrost_gem_free_object(struct drm_gem_object *obj)
{ {
struct panfrost_gem_object *bo = to_panfrost_bo(obj); struct panfrost_gem_object *bo = to_panfrost_bo(obj);
struct panfrost_device *pfdev = obj->dev->dev_private; struct panfrost_device *pfdev = obj->dev->dev_private;
......
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
/* Copyright 2018 Marty E. Plummer <hanetzer@startmail.com> */ /* Copyright 2018 Marty E. Plummer <hanetzer@startmail.com> */
/* Copyright 2019 Linaro, Ltd., Rob Herring <robh@kernel.org> */ /* Copyright 2019 Linaro, Ltd., Rob Herring <robh@kernel.org> */
/* Copyright 2019 Collabora ltd. */ /* Copyright 2019 Collabora ltd. */
#include <linux/bitfield.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/iopoll.h> #include <linux/iopoll.h>
...@@ -276,13 +278,13 @@ static void panfrost_gpu_init_features(struct panfrost_device *pfdev) ...@@ -276,13 +278,13 @@ static void panfrost_gpu_init_features(struct panfrost_device *pfdev)
pfdev->features.hw_issues); pfdev->features.hw_issues);
dev_info(pfdev->dev, "Features: L2:0x%08x Shader:0x%08x Tiler:0x%08x Mem:0x%0x MMU:0x%08x AS:0x%x JS:0x%x", dev_info(pfdev->dev, "Features: L2:0x%08x Shader:0x%08x Tiler:0x%08x Mem:0x%0x MMU:0x%08x AS:0x%x JS:0x%x",
gpu_read(pfdev, GPU_L2_FEATURES), pfdev->features.l2_features,
gpu_read(pfdev, GPU_CORE_FEATURES), pfdev->features.core_features,
gpu_read(pfdev, GPU_TILER_FEATURES), pfdev->features.tiler_features,
gpu_read(pfdev, GPU_MEM_FEATURES), pfdev->features.mem_features,
gpu_read(pfdev, GPU_MMU_FEATURES), pfdev->features.mmu_features,
gpu_read(pfdev, GPU_AS_PRESENT), pfdev->features.as_present,
gpu_read(pfdev, GPU_JS_PRESENT)); pfdev->features.js_present);
dev_info(pfdev->dev, "shader_present=0x%0llx l2_present=0x%0llx", dev_info(pfdev->dev, "shader_present=0x%0llx l2_present=0x%0llx",
pfdev->features.shader_present, pfdev->features.l2_present); pfdev->features.shader_present, pfdev->features.l2_present);
...@@ -332,6 +334,9 @@ int panfrost_gpu_init(struct panfrost_device *pfdev) ...@@ -332,6 +334,9 @@ int panfrost_gpu_init(struct panfrost_device *pfdev)
panfrost_gpu_init_features(pfdev); panfrost_gpu_init_features(pfdev);
dma_set_mask_and_coherent(pfdev->dev,
DMA_BIT_MASK(FIELD_GET(0xff00, pfdev->features.mmu_features)));
irq = platform_get_irq_byname(to_platform_device(pfdev->dev), "gpu"); irq = platform_get_irq_byname(to_platform_device(pfdev->dev), "gpu");
if (irq <= 0) if (irq <= 0)
return -ENODEV; return -ENODEV;
......
...@@ -384,6 +384,8 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job) ...@@ -384,6 +384,8 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
job_read(pfdev, JS_TAIL_LO(js)), job_read(pfdev, JS_TAIL_LO(js)),
sched_job); sched_job);
mutex_lock(&pfdev->reset_lock);
for (i = 0; i < NUM_JOB_SLOTS; i++) for (i = 0; i < NUM_JOB_SLOTS; i++)
drm_sched_stop(&pfdev->js->queue[i].sched); drm_sched_stop(&pfdev->js->queue[i].sched);
...@@ -406,6 +408,8 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job) ...@@ -406,6 +408,8 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
/* restart scheduler after GPU is usable again */ /* restart scheduler after GPU is usable again */
for (i = 0; i < NUM_JOB_SLOTS; i++) for (i = 0; i < NUM_JOB_SLOTS; i++)
drm_sched_start(&pfdev->js->queue[i].sched, true); drm_sched_start(&pfdev->js->queue[i].sched, true);
mutex_unlock(&pfdev->reset_lock);
} }
static const struct drm_sched_backend_ops panfrost_sched_ops = { static const struct drm_sched_backend_ops panfrost_sched_ops = {
......
...@@ -448,6 +448,14 @@ static int rockchip_drm_platform_remove(struct platform_device *pdev) ...@@ -448,6 +448,14 @@ static int rockchip_drm_platform_remove(struct platform_device *pdev)
return 0; return 0;
} }
static void rockchip_drm_platform_shutdown(struct platform_device *pdev)
{
struct drm_device *drm = platform_get_drvdata(pdev);
if (drm)
drm_atomic_helper_shutdown(drm);
}
static const struct of_device_id rockchip_drm_dt_ids[] = { static const struct of_device_id rockchip_drm_dt_ids[] = {
{ .compatible = "rockchip,display-subsystem", }, { .compatible = "rockchip,display-subsystem", },
{ /* sentinel */ }, { /* sentinel */ },
...@@ -457,6 +465,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids); ...@@ -457,6 +465,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);
static struct platform_driver rockchip_drm_platform_driver = { static struct platform_driver rockchip_drm_platform_driver = {
.probe = rockchip_drm_platform_probe, .probe = rockchip_drm_platform_probe,
.remove = rockchip_drm_platform_remove, .remove = rockchip_drm_platform_remove,
.shutdown = rockchip_drm_platform_shutdown,
.driver = { .driver = {
.name = "rockchip-drm", .name = "rockchip-drm",
.of_match_table = rockchip_drm_dt_ids, .of_match_table = rockchip_drm_dt_ids,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment