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: Dave Airlie <airlied@redhat.com> From: Sean Paul <sean@poorly.run> Link: https://patchwork.freedesktop.org/patch/msgid/20190508205153.GA91135@art_vandelay
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# 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);
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
|
|
||||||
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 \
|
|||||||
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))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 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)
|
|||||||
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:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
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 @@
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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 {
|
|||||||
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 @@
|
|||||||
/* 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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
|
|
||||||
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,15 +395,14 @@ static int panfrost_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
err = panfrost_device_init(pfdev);
|
err = panfrost_device_init(pfdev);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
if (err != -EPROBE_DEFER)
|
||||||
dev_err(&pdev->dev, "Fatal error during GPU init\n");
|
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) {
|
||||||
|
if (err != -EPROBE_DEFER)
|
||||||
dev_err(&pdev->dev, "Fatal error during devfreq init\n");
|
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)
|
|||||||
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 @@
|
|||||||
/* 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 @@
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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);
|
|||||||
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,
|
||||||
|
|||||||
Reference in New Issue
Block a user