mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-23 05:18:55 +00:00
Removed default-sample-phase property for base rk322x-box device tree Enabled spdif out for rk322x-current and -dev flavours Removed reserved node in device tree, u-boot v2020.10 and OPTEE autoconfigure reserved zones automatically
403 lines
14 KiB
Diff
403 lines
14 KiB
Diff
From 0898302e2ab75165acf8ad43726e67f3f0f6ab32 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Zimmermann <tzimmermann@suse.de>
|
|
Date: Wed, 23 Sep 2020 12:21:51 +0200
|
|
Subject: [PATCH] drm/rockchip: Convert to drm_gem_object_funcs
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
GEM object functions deprecate several similar callback interfaces in
|
|
struct drm_driver. This patch replaces the per-driver callbacks with
|
|
per-instance callbacks in rockchip. The only exception is gem_prime_mmap,
|
|
which is non-trivial to convert.
|
|
|
|
v3:
|
|
* update documentation
|
|
|
|
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
|
|
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Acked-by: Christian König <christian.koenig@amd.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200923102159.24084-15-tzimmermann@suse.de
|
|
(cherry picked from commit 0d590af3140d0f84c537a9ad252aecc780ed7aa5)
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 5 -----
|
|
drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 12 +++++++++++-
|
|
2 files changed, 11 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
|
|
index 0f3eb392fe39..b7654f5e4225 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
|
|
@@ -212,15 +212,10 @@ static const struct file_operations rockchip_drm_driver_fops = {
|
|
static struct drm_driver rockchip_drm_driver = {
|
|
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
|
|
.lastclose = drm_fb_helper_lastclose,
|
|
- .gem_vm_ops = &drm_gem_cma_vm_ops,
|
|
- .gem_free_object_unlocked = rockchip_gem_free_object,
|
|
.dumb_create = rockchip_gem_dumb_create,
|
|
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
|
|
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
|
|
- .gem_prime_get_sg_table = rockchip_gem_prime_get_sg_table,
|
|
.gem_prime_import_sg_table = rockchip_gem_prime_import_sg_table,
|
|
- .gem_prime_vmap = rockchip_gem_prime_vmap,
|
|
- .gem_prime_vunmap = rockchip_gem_prime_vunmap,
|
|
.gem_prime_mmap = rockchip_gem_mmap_buf,
|
|
.fops = &rockchip_drm_driver_fops,
|
|
.name = DRIVER_NAME,
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
|
index 62e5d0970525..1cf4631461c9 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
|
@@ -295,6 +295,14 @@ static void rockchip_gem_release_object(struct rockchip_gem_object *rk_obj)
|
|
kfree(rk_obj);
|
|
}
|
|
|
|
+static const struct drm_gem_object_funcs rockchip_gem_object_funcs = {
|
|
+ .free = rockchip_gem_free_object,
|
|
+ .get_sg_table = rockchip_gem_prime_get_sg_table,
|
|
+ .vmap = rockchip_gem_prime_vmap,
|
|
+ .vunmap = rockchip_gem_prime_vunmap,
|
|
+ .vm_ops = &drm_gem_cma_vm_ops,
|
|
+};
|
|
+
|
|
static struct rockchip_gem_object *
|
|
rockchip_gem_alloc_object(struct drm_device *drm, unsigned int size)
|
|
{
|
|
@@ -309,6 +317,8 @@ static struct rockchip_gem_object *
|
|
|
|
obj = &rk_obj->base;
|
|
|
|
+ obj->funcs = &rockchip_gem_object_funcs;
|
|
+
|
|
drm_gem_object_init(drm, obj, size);
|
|
|
|
return rk_obj;
|
|
@@ -337,7 +347,7 @@ rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
|
|
}
|
|
|
|
/*
|
|
- * rockchip_gem_free_object - (struct drm_driver)->gem_free_object_unlocked
|
|
+ * rockchip_gem_free_object - (struct drm_gem_object_funcs)->free
|
|
* callback function
|
|
*/
|
|
void rockchip_gem_free_object(struct drm_gem_object *obj)
|
|
|
|
From 411c1e880514d8903890c1fe67c4b532d8f0c21c Mon Sep 17 00:00:00 2001
|
|
From: Thomas Zimmermann <tzimmermann@suse.de>
|
|
Date: Mon, 28 Sep 2020 10:16:43 +0200
|
|
Subject: [PATCH] drm/rockchip: Include <drm/drm_gem_cma_helper> for
|
|
drm_gem_cm_vm_ops
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Include <drm/drm_gem_cma_helper.h> to get drm_gem_cma_vm_ops. Fallout
|
|
from the recent conversion to GEM object functions.
|
|
|
|
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
|
|
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Reported-by: kernel test robot <lkp@intel.com>
|
|
Fixes: 0d590af3140d ("drm/rockchip: Convert to drm_gem_object_funcs")
|
|
Cc: Thomas Zimmermann <tzimmermann@suse.de>
|
|
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Cc: Christian König <christian.koenig@amd.com>
|
|
Cc: Sandy Huang <hjc@rock-chips.com>
|
|
Cc: "Heiko Stübner" <heiko@sntech.de>
|
|
Cc: dri-devel@lists.freedesktop.org
|
|
Cc: linux-arm-kernel@lists.infradead.org
|
|
Cc: linux-rockchip@lists.infradead.org
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200928081643.8575-1-tzimmermann@suse.de
|
|
(cherry picked from commit 8f7db83e6abf863c6a2cfddbe7086f1e3251fdbf)
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
|
index 1cf4631461c9..7d5ebb10323b 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
|
@@ -10,6 +10,7 @@
|
|
|
|
#include <drm/drm.h>
|
|
#include <drm/drm_gem.h>
|
|
+#include <drm/drm_gem_cma_helper.h>
|
|
#include <drm/drm_prime.h>
|
|
#include <drm/drm_vma_manager.h>
|
|
|
|
|
|
From 4ddb01c2866cd57b134d739e9e88e00dc88453ae Mon Sep 17 00:00:00 2001
|
|
From: Qinglang Miao <miaoqinglang@huawei.com>
|
|
Date: Mon, 21 Sep 2020 21:10:19 +0800
|
|
Subject: [PATCH] drm/panfrost: simplify the return expression of
|
|
cz_ih_hw_init()
|
|
|
|
Simplify the return expression.
|
|
|
|
Signed-off-by: Qinglang Miao <miaoqinglang@huawei.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Reviewed-by: Steven Price <steven.price@arm.com>
|
|
Signed-off-by: Steven Price <steven.price@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200921131019.91558-1-miaoqinglang@huawei.com
|
|
(cherry picked from commit 3c4641d4e75618fa1b5501b9ae9c19f765d75725)
|
|
---
|
|
drivers/gpu/drm/panfrost/panfrost_device.c | 8 +-------
|
|
1 file changed, 1 insertion(+), 7 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
index e6896733838a..ea8d31863c50 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
@@ -18,19 +18,13 @@
|
|
|
|
static int panfrost_reset_init(struct panfrost_device *pfdev)
|
|
{
|
|
- int err;
|
|
-
|
|
pfdev->rstc = devm_reset_control_array_get(pfdev->dev, false, true);
|
|
if (IS_ERR(pfdev->rstc)) {
|
|
dev_err(pfdev->dev, "get reset failed %ld\n", PTR_ERR(pfdev->rstc));
|
|
return PTR_ERR(pfdev->rstc);
|
|
}
|
|
|
|
- err = reset_control_deassert(pfdev->rstc);
|
|
- if (err)
|
|
- return err;
|
|
-
|
|
- return 0;
|
|
+ return reset_control_deassert(pfdev->rstc);
|
|
}
|
|
|
|
static void panfrost_reset_fini(struct panfrost_device *pfdev)
|
|
|
|
From b75473ce0e84aa528eef4f805c95fc5e2f6f766a Mon Sep 17 00:00:00 2001
|
|
From: Qinglang Miao <miaoqinglang@huawei.com>
|
|
Date: Mon, 21 Sep 2020 21:10:21 +0800
|
|
Subject: [PATCH] drm/panfrost: simplify the return expression of
|
|
panfrost_devfreq_target()
|
|
|
|
Simplify the return expression.
|
|
|
|
Signed-off-by: Qinglang Miao <miaoqinglang@huawei.com>
|
|
Reviewed-by: Steven Price <steven.price@arm.com>
|
|
Signed-off-by: Steven Price <steven.price@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200921131021.91604-1-miaoqinglang@huawei.com
|
|
(cherry picked from commit 0c5036590bde1407a6250ea027e836815353820f)
|
|
---
|
|
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 7 +------
|
|
1 file changed, 1 insertion(+), 6 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
|
index 8ab025d0035f..913eaa6d0bc6 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
|
@@ -29,18 +29,13 @@ static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
|
|
u32 flags)
|
|
{
|
|
struct dev_pm_opp *opp;
|
|
- int err;
|
|
|
|
opp = devfreq_recommended_opp(dev, freq, flags);
|
|
if (IS_ERR(opp))
|
|
return PTR_ERR(opp);
|
|
dev_pm_opp_put(opp);
|
|
|
|
- err = dev_pm_opp_set_rate(dev, *freq);
|
|
- if (err)
|
|
- return err;
|
|
-
|
|
- return 0;
|
|
+ return dev_pm_opp_set_rate(dev, *freq);
|
|
}
|
|
|
|
static void panfrost_devfreq_reset(struct panfrost_devfreq *pfdevfreq)
|
|
|
|
From f3f98ffb76cdbf06f0549ce904007a7725b76c6f Mon Sep 17 00:00:00 2001
|
|
From: Rikard Falkeborn <rikard.falkeborn@gmail.com>
|
|
Date: Sun, 4 Oct 2020 22:06:53 +0200
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Constify dw_hdmi_i2s_ops
|
|
|
|
The only usage of dw_hdmi_i2s_ops is to assign its address to the ops
|
|
field in the hdmi_codec_pdata struct, which is a const pointer. Make it
|
|
const to allow the compiler to put it in read-only memory.
|
|
|
|
Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com>
|
|
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20201004200653.14702-1-rikard.falkeborn@gmail.com
|
|
(cherry picked from commit f3d52908f6baffc21ba45058103d0226ca5cb073)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
|
|
index 9fef6413741d..feb04f127b55 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
|
|
@@ -170,7 +170,7 @@ static int dw_hdmi_i2s_hook_plugged_cb(struct device *dev, void *data,
|
|
return dw_hdmi_set_plugged_cb(hdmi, fn, codec_dev);
|
|
}
|
|
|
|
-static struct hdmi_codec_ops dw_hdmi_i2s_ops = {
|
|
+static const struct hdmi_codec_ops dw_hdmi_i2s_ops = {
|
|
.hw_params = dw_hdmi_i2s_hw_params,
|
|
.audio_startup = dw_hdmi_i2s_audio_startup,
|
|
.audio_shutdown = dw_hdmi_i2s_audio_shutdown,
|
|
|
|
From 5855d31b6f0e36aea731afe3b8dff3c470efa46b Mon Sep 17 00:00:00 2001
|
|
From: Boris Brezillon <boris.brezillon@collabora.com>
|
|
Date: Fri, 2 Oct 2020 14:25:06 +0200
|
|
Subject: [PATCH] drm/panfrost: Fix job timeout handling
|
|
|
|
If more than two jobs end up timeout-ing concurrently, only one of them
|
|
(the one attached to the scheduler acquiring the lock) is fully handled.
|
|
The other one remains in a dangling state where it's no longer part of
|
|
the scheduling queue, but still blocks something in scheduler, leading
|
|
to repetitive timeouts when new jobs are queued.
|
|
|
|
Let's make sure all bad jobs are properly handled by the thread
|
|
acquiring the lock.
|
|
|
|
v3:
|
|
- Add Steven's R-b
|
|
- Don't take the sched_lock when stopping the schedulers
|
|
|
|
v2:
|
|
- Fix the subject prefix
|
|
- Stop the scheduler before returning from panfrost_job_timedout()
|
|
- Call cancel_delayed_work_sync() after drm_sched_stop() to make sure
|
|
no timeout handlers are in flight when we reset the GPU (Steven Price)
|
|
- Make sure we release the reset lock before restarting the
|
|
schedulers (Steven Price)
|
|
|
|
Fixes: f3ba91228e8e ("drm/panfrost: Add initial panfrost driver")
|
|
Cc: <stable@vger.kernel.org>
|
|
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
|
|
Reviewed-by: Steven Price <steven.price@arm.com>
|
|
Signed-off-by: Steven Price <steven.price@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20201002122506.1374183-1-boris.brezillon@collabora.com
|
|
(cherry picked from commit 1a11a88cfd9a97e13be8bc880c4795f9844fbbec)
|
|
---
|
|
drivers/gpu/drm/panfrost/panfrost_job.c | 62 ++++++++++++++++++++++++++++-----
|
|
1 file changed, 53 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
|
|
index 30e7b7196dab..d0469e944143 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
|
|
@@ -25,7 +25,8 @@
|
|
|
|
struct panfrost_queue_state {
|
|
struct drm_gpu_scheduler sched;
|
|
-
|
|
+ bool stopped;
|
|
+ struct mutex lock;
|
|
u64 fence_context;
|
|
u64 emit_seqno;
|
|
};
|
|
@@ -369,6 +370,24 @@ void panfrost_job_enable_interrupts(struct panfrost_device *pfdev)
|
|
job_write(pfdev, JOB_INT_MASK, irq_mask);
|
|
}
|
|
|
|
+static bool panfrost_scheduler_stop(struct panfrost_queue_state *queue,
|
|
+ struct drm_sched_job *bad)
|
|
+{
|
|
+ bool stopped = false;
|
|
+
|
|
+ mutex_lock(&queue->lock);
|
|
+ if (!queue->stopped) {
|
|
+ drm_sched_stop(&queue->sched, bad);
|
|
+ if (bad)
|
|
+ drm_sched_increase_karma(bad);
|
|
+ queue->stopped = true;
|
|
+ stopped = true;
|
|
+ }
|
|
+ mutex_unlock(&queue->lock);
|
|
+
|
|
+ return stopped;
|
|
+}
|
|
+
|
|
static void panfrost_job_timedout(struct drm_sched_job *sched_job)
|
|
{
|
|
struct panfrost_job *job = to_panfrost_job(sched_job);
|
|
@@ -392,19 +411,39 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
|
|
job_read(pfdev, JS_TAIL_LO(js)),
|
|
sched_job);
|
|
|
|
+ /* Scheduler is already stopped, nothing to do. */
|
|
+ if (!panfrost_scheduler_stop(&pfdev->js->queue[js], sched_job))
|
|
+ return;
|
|
+
|
|
if (!mutex_trylock(&pfdev->reset_lock))
|
|
return;
|
|
|
|
for (i = 0; i < NUM_JOB_SLOTS; i++) {
|
|
struct drm_gpu_scheduler *sched = &pfdev->js->queue[i].sched;
|
|
|
|
- drm_sched_stop(sched, sched_job);
|
|
- if (js != i)
|
|
- /* Ensure any timeouts on other slots have finished */
|
|
+ /*
|
|
+ * If the queue is still active, make sure we wait for any
|
|
+ * pending timeouts.
|
|
+ */
|
|
+ if (!pfdev->js->queue[i].stopped)
|
|
cancel_delayed_work_sync(&sched->work_tdr);
|
|
- }
|
|
|
|
- drm_sched_increase_karma(sched_job);
|
|
+ /*
|
|
+ * If the scheduler was not already stopped, there's a tiny
|
|
+ * chance a timeout has expired just before we stopped it, and
|
|
+ * drm_sched_stop() does not flush pending works. Let's flush
|
|
+ * them now so the timeout handler doesn't get called in the
|
|
+ * middle of a reset.
|
|
+ */
|
|
+ if (panfrost_scheduler_stop(&pfdev->js->queue[i], NULL))
|
|
+ cancel_delayed_work_sync(&sched->work_tdr);
|
|
+
|
|
+ /*
|
|
+ * Now that we cancelled the pending timeouts, we can safely
|
|
+ * reset the stopped state.
|
|
+ */
|
|
+ pfdev->js->queue[i].stopped = false;
|
|
+ }
|
|
|
|
spin_lock_irqsave(&pfdev->js->job_lock, flags);
|
|
for (i = 0; i < NUM_JOB_SLOTS; i++) {
|
|
@@ -421,11 +460,11 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
|
|
for (i = 0; i < NUM_JOB_SLOTS; i++)
|
|
drm_sched_resubmit_jobs(&pfdev->js->queue[i].sched);
|
|
|
|
+ mutex_unlock(&pfdev->reset_lock);
|
|
+
|
|
/* restart scheduler after GPU is usable again */
|
|
for (i = 0; i < NUM_JOB_SLOTS; i++)
|
|
drm_sched_start(&pfdev->js->queue[i].sched, true);
|
|
-
|
|
- mutex_unlock(&pfdev->reset_lock);
|
|
}
|
|
|
|
static const struct drm_sched_backend_ops panfrost_sched_ops = {
|
|
@@ -558,6 +597,7 @@ int panfrost_job_open(struct panfrost_file_priv *panfrost_priv)
|
|
int ret, i;
|
|
|
|
for (i = 0; i < NUM_JOB_SLOTS; i++) {
|
|
+ mutex_init(&js->queue[i].lock);
|
|
sched = &js->queue[i].sched;
|
|
ret = drm_sched_entity_init(&panfrost_priv->sched_entity[i],
|
|
DRM_SCHED_PRIORITY_NORMAL, &sched,
|
|
@@ -570,10 +610,14 @@ int panfrost_job_open(struct panfrost_file_priv *panfrost_priv)
|
|
|
|
void panfrost_job_close(struct panfrost_file_priv *panfrost_priv)
|
|
{
|
|
+ struct panfrost_device *pfdev = panfrost_priv->pfdev;
|
|
+ struct panfrost_job_slot *js = pfdev->js;
|
|
int i;
|
|
|
|
- for (i = 0; i < NUM_JOB_SLOTS; i++)
|
|
+ for (i = 0; i < NUM_JOB_SLOTS; i++) {
|
|
drm_sched_entity_destroy(&panfrost_priv->sched_entity[i]);
|
|
+ mutex_destroy(&js->queue[i].lock);
|
|
+ }
|
|
}
|
|
|
|
int panfrost_job_is_idle(struct panfrost_device *pfdev)
|