[PATCH 3/7] drm/msm: Add a `preempt_record_size` field

2024-08-16 Thread Antonino Maniscalco
Adds a field to `adreno_info` to store the GPU specific preempt record
size.

Signed-off-by: Antonino Maniscalco 
---
 drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 3 +++
 drivers/gpu/drm/msm/adreno/adreno_gpu.h   | 1 +
 2 files changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c 
b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
index 68ba9aed5506..4cee54d57646 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
@@ -1190,6 +1190,7 @@ static const struct adreno_info a7xx_gpus[] = {
.protect = &a730_protect,
},
.address_space_size = SZ_16G,
+   .preempt_record_size = 2860 * SZ_1K,
}, {
.chip_ids = ADRENO_CHIP_IDS(0x43050a01), /* "C510v2" */
.family = ADRENO_7XX_GEN2,
@@ -1209,6 +1210,7 @@ static const struct adreno_info a7xx_gpus[] = {
.gmu_chipid = 0x7020100,
},
.address_space_size = SZ_16G,
+   .preempt_record_size = 4192 * SZ_1K,
}, {
.chip_ids = ADRENO_CHIP_IDS(0x43050c01), /* "C512v2" */
.family = ADRENO_7XX_GEN2,
@@ -1245,6 +1247,7 @@ static const struct adreno_info a7xx_gpus[] = {
.gmu_chipid = 0x7090100,
},
.address_space_size = SZ_16G,
+   .preempt_record_size = 3572 * SZ_1K,
}
 };
 DECLARE_ADRENO_GPULIST(a7xx);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index 1ab523a163a0..6b1888280a83 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -111,6 +111,7 @@ struct adreno_info {
 * {SHRT_MAX, 0} sentinal.
 */
struct adreno_speedbin *speedbins;
+   u64 preempt_record_size;
 };
 
 #define ADRENO_CHIP_IDS(tbl...) (uint32_t[]) { tbl, 0 }

-- 
2.46.0



[PATCH 6/7] drm/msm/A6XX: Add a flag to allow preemption to submitqueue_create

2024-08-16 Thread Antonino Maniscalco
Some userspace changes are necessary so add a flag for userspace to
advertise support for preemption.

Signed-off-by: Antonino Maniscalco 
---
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 12 
 include/uapi/drm/msm_drm.h|  5 -
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index 1a90db5759b8..86357016db8d 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -453,8 +453,10 @@ static void a7xx_submit(struct msm_gpu *gpu, struct 
msm_gem_submit *submit)
OUT_PKT7(ring, CP_SET_MARKER, 1);
OUT_RING(ring, 0x101); /* IFPC disable */
 
-   OUT_PKT7(ring, CP_SET_MARKER, 1);
-   OUT_RING(ring, 0x00d); /* IB1LIST start */
+   if (submit->queue->flags & MSM_SUBMITQUEUE_ALLOW_PREEMPT) {
+   OUT_PKT7(ring, CP_SET_MARKER, 1);
+   OUT_RING(ring, 0x00d); /* IB1LIST start */
+   }
 
/* Submit the commands */
for (i = 0; i < submit->nr_cmds; i++) {
@@ -485,8 +487,10 @@ static void a7xx_submit(struct msm_gpu *gpu, struct 
msm_gem_submit *submit)
update_shadow_rptr(gpu, ring);
}
 
-   OUT_PKT7(ring, CP_SET_MARKER, 1);
-   OUT_RING(ring, 0x00e); /* IB1LIST end */
+   if (submit->queue->flags & MSM_SUBMITQUEUE_ALLOW_PREEMPT) {
+   OUT_PKT7(ring, CP_SET_MARKER, 1);
+   OUT_RING(ring, 0x00e); /* IB1LIST end */
+   }
 
get_stats_counter(ring, REG_A7XX_RBBM_PERFCTR_CP(0),
rbmemptr_stats(ring, index, cpcycles_end));
diff --git a/include/uapi/drm/msm_drm.h b/include/uapi/drm/msm_drm.h
index 3fca72f73861..f37858db34e6 100644
--- a/include/uapi/drm/msm_drm.h
+++ b/include/uapi/drm/msm_drm.h
@@ -345,7 +345,10 @@ struct drm_msm_gem_madvise {
  * backwards compatibility as a "default" submitqueue
  */
 
-#define MSM_SUBMITQUEUE_FLAGS (0)
+#define MSM_SUBMITQUEUE_ALLOW_PREEMPT  0x0001
+#define MSM_SUBMITQUEUE_FLAGS  ( \
+   MSM_SUBMITQUEUE_ALLOW_PREEMPT | \
+   0)
 
 /*
  * The submitqueue priority should be between 0 and MSM_PARAM_PRIORITIES-1,

-- 
2.46.0



[PATCH 1/7] drm/msm: Fix bv_fence being used as bv_rptr

2024-08-16 Thread Antonino Maniscalco
The bv_fence field of rbmemptrs was being used incorrectly as the BV
rptr shadow pointer in some places.

Add a bv_rptr field and change the code to use that instead.

Signed-off-by: Antonino Maniscalco 
---
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 2 +-
 drivers/gpu/drm/msm/msm_ringbuffer.h  | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index bcaec86ac67a..32a4faa93d7f 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -1132,7 +1132,7 @@ static int hw_init(struct msm_gpu *gpu)
/* ..which means "always" on A7xx, also for BV shadow */
if (adreno_is_a7xx(adreno_gpu)) {
gpu_write64(gpu, REG_A7XX_CP_BV_RB_RPTR_ADDR,
-   rbmemptr(gpu->rb[0], bv_fence));
+   rbmemptr(gpu->rb[0], bv_rptr));
}
 
/* Always come up on rb 0 */
diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.h 
b/drivers/gpu/drm/msm/msm_ringbuffer.h
index 0d6beb8cd39a..40791b2ade46 100644
--- a/drivers/gpu/drm/msm/msm_ringbuffer.h
+++ b/drivers/gpu/drm/msm/msm_ringbuffer.h
@@ -31,6 +31,7 @@ struct msm_rbmemptrs {
volatile uint32_t rptr;
volatile uint32_t fence;
/* Introduced on A7xx */
+   volatile uint32_t bv_rptr;
volatile uint32_t bv_fence;
 
volatile struct msm_gpu_submit_stats stats[MSM_GPU_SUBMIT_STATS_COUNT];

-- 
2.46.0



[PATCH 5/7] drm/msm/A6xx: Add traces for preemption

2024-08-16 Thread Antonino Maniscalco
Add trace points corresponding to preemption being triggered and being
completed for latency measurement purposes.

Signed-off-by: Antonino Maniscalco 
---
 drivers/gpu/drm/msm/adreno/a6xx_preempt.c |  7 +++
 drivers/gpu/drm/msm/msm_gpu_trace.h   | 28 
 2 files changed, 35 insertions(+)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_preempt.c 
b/drivers/gpu/drm/msm/adreno/a6xx_preempt.c
index 0d402a3bcf5a..2606835f3c6d 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_preempt.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_preempt.c
@@ -7,6 +7,7 @@
 #include "a6xx_gpu.h"
 #include "a6xx_gmu.xml.h"
 #include "msm_mmu.h"
+#include "msm_gpu_trace.h"
 
 #define FENCE_STATUS_WRITEDROPPED0_MASK 0x1
 #define FENCE_STATUS_WRITEDROPPED1_MASK 0x2
@@ -146,6 +147,8 @@ void a6xx_preempt_irq(struct msm_gpu *gpu)
 
set_preempt_state(a6xx_gpu, PREEMPT_NONE);
 
+   trace_msm_gpu_preemption_irq(a6xx_gpu->cur_ring->id);
+
/*
 * Retrigger preemption to avoid a deadlock that might occur when 
preemption
 * is skipped due to it being already in flight when requested.
@@ -262,6 +265,10 @@ void a6xx_preempt_trigger(struct msm_gpu *gpu)
 */
ring->skip_inline_wptr = false;
 
+   trace_msm_gpu_preemption_trigger(
+   a6xx_gpu->cur_ring ? a6xx_gpu->cur_ring->id : -1,
+   ring ? ring->id : -1);
+
spin_unlock_irqrestore(&ring->preempt_lock, flags);
 
gpu_write64(gpu,
diff --git a/drivers/gpu/drm/msm/msm_gpu_trace.h 
b/drivers/gpu/drm/msm/msm_gpu_trace.h
index ac40d857bc45..7f863282db0d 100644
--- a/drivers/gpu/drm/msm/msm_gpu_trace.h
+++ b/drivers/gpu/drm/msm/msm_gpu_trace.h
@@ -177,6 +177,34 @@ TRACE_EVENT(msm_gpu_resume,
TP_printk("%u", __entry->dummy)
 );
 
+TRACE_EVENT(msm_gpu_preemption_trigger,
+   TP_PROTO(int ring_id_from, int ring_id_to),
+   TP_ARGS(ring_id_from, ring_id_to),
+   TP_STRUCT__entry(
+   __field(int, ring_id_from)
+   __field(int, ring_id_to)
+   ),
+   TP_fast_assign(
+   __entry->ring_id_from = ring_id_from;
+   __entry->ring_id_to = ring_id_to;
+   ),
+   TP_printk("preempting %u -> %u",
+ __entry->ring_id_from,
+ __entry->ring_id_to)
+);
+
+TRACE_EVENT(msm_gpu_preemption_irq,
+   TP_PROTO(u32 ring_id),
+   TP_ARGS(ring_id),
+   TP_STRUCT__entry(
+   __field(u32, ring_id)
+   ),
+   TP_fast_assign(
+   __entry->ring_id = ring_id;
+   ),
+   TP_printk("preempted to %u", __entry->ring_id)
+);
+
 #endif
 
 #undef TRACE_INCLUDE_PATH

-- 
2.46.0



[PATCH 7/7] drm/msm/A6xx: Enable preemption for A7xx targets

2024-08-16 Thread Antonino Maniscalco
Initialize with 4 rings to enable preemption.

Signed-off-by: Antonino Maniscalco 
---
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index 86357016db8d..dfcbe08f2161 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -2598,7 +2598,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
}
 
if (is_a7xx)
-   ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs_a7xx, 1);
+   ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs_a7xx, 4);
else if (adreno_has_gmu_wrapper(adreno_gpu))
ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs_gmuwrapper, 
1);
else

-- 
2.46.0



[PATCH 0/7] Preemption support for A7XX

2024-08-16 Thread Antonino Maniscalco
This series implements preemption for A7XX targets, which allows the GPU to
switch to an higher priority ring when work is pushed to it, reducing latency
for high priority submissions.

This series enables L1 preemption with skip_save_restore which requires
the following userspace patches to function:

https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30544

A flag is added to `msm_gem_submit` to only allow submissions from compatible
userspace to be preempted, therefore maintaining compatibility.

Some commits from this series are based on a previous series to enable
preemption on A6XX targets:

https://lkml.kernel.org/1520489185-21828-1-git-send-email-smase...@codeaurora.org

Signed-off-by: Antonino Maniscalco 
---
Antonino Maniscalco (7):
  drm/msm: Fix bv_fence being used as bv_rptr
  drm/msm: Add submitqueue setup and close
  drm/msm: Add a `preempt_record_size` field
  drm/msm/A6xx: Implement preemption for A7XX targets
  drm/msm/A6xx: Add traces for preemption
  drm/msm/A6XX: Add a flag to allow preemption to submitqueue_create
  drm/msm/A6xx: Enable preemption for A7xx targets

 drivers/gpu/drm/msm/Makefile  |   1 +
 drivers/gpu/drm/msm/adreno/a6xx_catalog.c |   3 +
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 339 ++-
 drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 168 
 drivers/gpu/drm/msm/adreno/a6xx_preempt.c | 441 ++
 drivers/gpu/drm/msm/adreno/adreno_gpu.h   |   1 +
 drivers/gpu/drm/msm/msm_gpu.h |   7 +
 drivers/gpu/drm/msm/msm_gpu_trace.h   |  28 ++
 drivers/gpu/drm/msm/msm_ringbuffer.h  |   8 +
 drivers/gpu/drm/msm/msm_submitqueue.c |  10 +
 include/uapi/drm/msm_drm.h|   5 +-
 11 files changed, 995 insertions(+), 16 deletions(-)
---
base-commit: 7c626ce4bae1ac14f60076d00eafe71af30450ba
change-id: 20240815-preemption-a750-t-fcee9a844b39

Best regards,
-- 
Antonino Maniscalco 



[PATCH 4/7] drm/msm/A6xx: Implement preemption for A7XX targets

2024-08-16 Thread Antonino Maniscalco
This patch implements preemption feature for A6xx targets, this allows
the GPU to switch to a higher priority ringbuffer if one is ready. A6XX
hardware as such supports multiple levels of preemption granularities,
ranging from coarse grained(ringbuffer level) to a more fine grained
such as draw-call level or a bin boundary level preemption. This patch
enables the basic preemption level, with more fine grained preemption
support to follow.

Signed-off-by: Sharat Masetty 
Signed-off-by: Antonino Maniscalco 
---
 drivers/gpu/drm/msm/Makefile  |   1 +
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 323 +-
 drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 168 
 drivers/gpu/drm/msm/adreno/a6xx_preempt.c | 434 ++
 drivers/gpu/drm/msm/msm_ringbuffer.h  |   7 +
 5 files changed, 924 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index f5e2838c6a76..32e915109a59 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -23,6 +23,7 @@ adreno-y := \
adreno/a6xx_gpu.o \
adreno/a6xx_gmu.o \
adreno/a6xx_hfi.o \
+   adreno/a6xx_preempt.o \
 
 adreno-$(CONFIG_DEBUG_FS) += adreno/a5xx_debugfs.o \
 
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index 32a4faa93d7f..1a90db5759b8 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -16,6 +16,83 @@
 
 #define GPU_PAS_ID 13
 
+/* IFPC & Preemption static powerup restore list */
+static const uint32_t a7xx_pwrup_reglist[] = {
+   REG_A6XX_UCHE_TRAP_BASE,
+   REG_A6XX_UCHE_TRAP_BASE + 1,
+   REG_A6XX_UCHE_WRITE_THRU_BASE,
+   REG_A6XX_UCHE_WRITE_THRU_BASE + 1,
+   REG_A6XX_UCHE_GMEM_RANGE_MIN,
+   REG_A6XX_UCHE_GMEM_RANGE_MIN + 1,
+   REG_A6XX_UCHE_GMEM_RANGE_MAX,
+   REG_A6XX_UCHE_GMEM_RANGE_MAX + 1,
+   REG_A6XX_UCHE_CACHE_WAYS,
+   REG_A6XX_UCHE_MODE_CNTL,
+   REG_A6XX_RB_NC_MODE_CNTL,
+   REG_A6XX_RB_CMP_DBG_ECO_CNTL,
+   REG_A7XX_GRAS_NC_MODE_CNTL,
+   REG_A6XX_RB_CONTEXT_SWITCH_GMEM_SAVE_RESTORE,
+   REG_A6XX_UCHE_GBIF_GX_CONFIG,
+   REG_A6XX_UCHE_CLIENT_PF,
+};
+
+static const uint32_t a7xx_ifpc_pwrup_reglist[] = {
+   REG_A6XX_TPL1_NC_MODE_CNTL,
+   REG_A6XX_SP_NC_MODE_CNTL,
+   REG_A6XX_CP_DBG_ECO_CNTL,
+   REG_A6XX_CP_PROTECT_CNTL,
+   REG_A6XX_CP_PROTECT(0),
+   REG_A6XX_CP_PROTECT(1),
+   REG_A6XX_CP_PROTECT(2),
+   REG_A6XX_CP_PROTECT(3),
+   REG_A6XX_CP_PROTECT(4),
+   REG_A6XX_CP_PROTECT(5),
+   REG_A6XX_CP_PROTECT(6),
+   REG_A6XX_CP_PROTECT(7),
+   REG_A6XX_CP_PROTECT(8),
+   REG_A6XX_CP_PROTECT(9),
+   REG_A6XX_CP_PROTECT(10),
+   REG_A6XX_CP_PROTECT(11),
+   REG_A6XX_CP_PROTECT(12),
+   REG_A6XX_CP_PROTECT(13),
+   REG_A6XX_CP_PROTECT(14),
+   REG_A6XX_CP_PROTECT(15),
+   REG_A6XX_CP_PROTECT(16),
+   REG_A6XX_CP_PROTECT(17),
+   REG_A6XX_CP_PROTECT(18),
+   REG_A6XX_CP_PROTECT(19),
+   REG_A6XX_CP_PROTECT(20),
+   REG_A6XX_CP_PROTECT(21),
+   REG_A6XX_CP_PROTECT(22),
+   REG_A6XX_CP_PROTECT(23),
+   REG_A6XX_CP_PROTECT(24),
+   REG_A6XX_CP_PROTECT(25),
+   REG_A6XX_CP_PROTECT(26),
+   REG_A6XX_CP_PROTECT(27),
+   REG_A6XX_CP_PROTECT(28),
+   REG_A6XX_CP_PROTECT(29),
+   REG_A6XX_CP_PROTECT(30),
+   REG_A6XX_CP_PROTECT(31),
+   REG_A6XX_CP_PROTECT(32),
+   REG_A6XX_CP_PROTECT(33),
+   REG_A6XX_CP_PROTECT(34),
+   REG_A6XX_CP_PROTECT(35),
+   REG_A6XX_CP_PROTECT(36),
+   REG_A6XX_CP_PROTECT(37),
+   REG_A6XX_CP_PROTECT(38),
+   REG_A6XX_CP_PROTECT(39),
+   REG_A6XX_CP_PROTECT(40),
+   REG_A6XX_CP_PROTECT(41),
+   REG_A6XX_CP_PROTECT(42),
+   REG_A6XX_CP_PROTECT(43),
+   REG_A6XX_CP_PROTECT(44),
+   REG_A6XX_CP_PROTECT(45),
+   REG_A6XX_CP_PROTECT(46),
+   REG_A6XX_CP_PROTECT(47),
+   REG_A6XX_CP_AHB_CNTL,
+};
+
+
 static inline bool _a6xx_check_idle(struct msm_gpu *gpu)
 {
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
@@ -68,6 +145,8 @@ static void update_shadow_rptr(struct msm_gpu *gpu, struct 
msm_ringbuffer *ring)
 
 static void a6xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring)
 {
+   struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
+   struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
uint32_t wptr;
unsigned long flags;
 
@@ -81,12 +160,26 @@ static void a6xx_flush(struct msm_gpu *gpu, struct 
msm_ringbuffer *ring)
/* Make sure to wrap wptr if we need to */
wptr = get_wptr(ring);
 
-   spin_unlock_irqrestore(&ring->preempt_lock, flags);
-
/* Make sure everything is posted before making a decision */
mb();
 
-   gpu_write(gpu, REG_A6XX_CP_RB_WPTR, wptr);
+   /* Update HW if this is the current ring and we are not in preempt*/
+  

Re: [REGRESSION][BISECTED] vmwgfx crashes with command buffer error after update

2024-08-16 Thread Brad Spengler
Hi all,

> While we were still debugging the issue Brad (also CC'ed) messaged me
> that they were seeing similar failures in their ESXi based test
> pipelines except for one box that was running on legacy BIOS (so maybe
> that is relevant). They noticed this because they had set panic_on_warn.

Just to clarify, it was actually the inverse: all the legacy
BIOS-booting systems triggered the warning, and the UEFI one did not.

Thanks for the report!

-Brad


[PATCH 2/7] drm/msm: Add submitqueue setup and close

2024-08-16 Thread Antonino Maniscalco
This patch adds a bit of infrastructure to give the different Adreno
targets the flexibility to setup the submitqueues per their needs.

Signed-off-by: Sharat Masetty 
---
 drivers/gpu/drm/msm/msm_gpu.h |  7 +++
 drivers/gpu/drm/msm/msm_submitqueue.c | 10 ++
 2 files changed, 17 insertions(+)

diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h
index 1f02bb9956be..70f5c18e5aee 100644
--- a/drivers/gpu/drm/msm/msm_gpu.h
+++ b/drivers/gpu/drm/msm/msm_gpu.h
@@ -92,6 +92,10 @@ struct msm_gpu_funcs {
 * for cmdstream that is buffered in this FIFO upstream of the CP fw.
 */
bool (*progress)(struct msm_gpu *gpu, struct msm_ringbuffer *ring);
+   int (*submitqueue_setup)(struct msm_gpu *gpu,
+   struct msm_gpu_submitqueue *queue);
+   void (*submitqueue_close)(struct msm_gpu *gpu,
+   struct msm_gpu_submitqueue *queue);
 };
 
 /* Additional state for iommu faults: */
@@ -522,6 +526,9 @@ struct msm_gpu_submitqueue {
struct mutex lock;
struct kref ref;
struct drm_sched_entity *entity;
+   struct msm_gpu *gpu;
+   struct drm_gem_object *bo;
+   uint64_t bo_iova;
 };
 
 struct msm_gpu_state_bo {
diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c 
b/drivers/gpu/drm/msm/msm_submitqueue.c
index 0e803125a325..4ffb336d9a60 100644
--- a/drivers/gpu/drm/msm/msm_submitqueue.c
+++ b/drivers/gpu/drm/msm/msm_submitqueue.c
@@ -71,6 +71,11 @@ void msm_submitqueue_destroy(struct kref *kref)
struct msm_gpu_submitqueue *queue = container_of(kref,
struct msm_gpu_submitqueue, ref);
 
+   struct msm_gpu *gpu = queue->gpu;
+
+   if (gpu && gpu->funcs->submitqueue_close)
+   gpu->funcs->submitqueue_close(gpu, queue);
+
idr_destroy(&queue->fence_idr);
 
msm_file_private_put(queue->ctx);
@@ -160,6 +165,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct 
msm_file_private *ctx,
 {
struct msm_drm_private *priv = drm->dev_private;
struct msm_gpu_submitqueue *queue;
+   struct msm_gpu *gpu = priv->gpu;
enum drm_sched_priority sched_prio;
unsigned ring_nr;
int ret;
@@ -195,6 +201,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct 
msm_file_private *ctx,
 
queue->ctx = msm_file_private_get(ctx);
queue->id = ctx->queueid++;
+   queue->gpu = gpu;
 
if (id)
*id = queue->id;
@@ -207,6 +214,9 @@ int msm_submitqueue_create(struct drm_device *drm, struct 
msm_file_private *ctx,
 
write_unlock(&ctx->queuelock);
 
+   if (gpu && gpu->funcs->submitqueue_setup)
+   gpu->funcs->submitqueue_setup(gpu, queue);
+
return 0;
 }
 

-- 
2.46.0



[PATCH] Revert "misc: fastrpc: Restrict untrusted app to attach to privileged PD"

2024-08-16 Thread Griffin Kroah-Hartman
This reverts commit bab2f5e8fd5d2f759db26b78d9db57412888f187.

Joel reported that this commit breaks userspace and stops sensors in
SDM845 from working. Also breaks other qcom SoC devices running postmarketOS.

Cc: stable 
Cc: Ekansh Gupta 
Cc: Dmitry Baryshkov 
Cc: Srinivas Kandagatla 
Cc: Greg Kroah-Hartman 
Reported-by: Joel Selvaraj 
Link: 
https://lore.kernel.org/r/9a9f5646-a554-4b65-8122-d212bb665...@umsystem.edu
Signed-off-by: Griffin Kroah-Hartman 
---
 drivers/misc/fastrpc.c  | 22 +++---
 include/uapi/misc/fastrpc.h |  3 ---
 2 files changed, 3 insertions(+), 22 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 5204fda51da3..339d126414d4 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -2085,16 +2085,6 @@ static int fastrpc_req_mem_map(struct fastrpc_user *fl, 
char __user *argp)
return err;
 }
 
-static int is_attach_rejected(struct fastrpc_user *fl)
-{
-   /* Check if the device node is non-secure */
-   if (!fl->is_secure_dev) {
-   dev_dbg(&fl->cctx->rpdev->dev, "untrusted app trying to attach 
to privileged DSP PD\n");
-   return -EACCES;
-   }
-   return 0;
-}
-
 static long fastrpc_device_ioctl(struct file *file, unsigned int cmd,
 unsigned long arg)
 {
@@ -2107,19 +2097,13 @@ static long fastrpc_device_ioctl(struct file *file, 
unsigned int cmd,
err = fastrpc_invoke(fl, argp);
break;
case FASTRPC_IOCTL_INIT_ATTACH:
-   err = is_attach_rejected(fl);
-   if (!err)
-   err = fastrpc_init_attach(fl, ROOT_PD);
+   err = fastrpc_init_attach(fl, ROOT_PD);
break;
case FASTRPC_IOCTL_INIT_ATTACH_SNS:
-   err = is_attach_rejected(fl);
-   if (!err)
-   err = fastrpc_init_attach(fl, SENSORS_PD);
+   err = fastrpc_init_attach(fl, SENSORS_PD);
break;
case FASTRPC_IOCTL_INIT_CREATE_STATIC:
-   err = is_attach_rejected(fl);
-   if (!err)
-   err = fastrpc_init_create_static_process(fl, argp);
+   err = fastrpc_init_create_static_process(fl, argp);
break;
case FASTRPC_IOCTL_INIT_CREATE:
err = fastrpc_init_create_process(fl, argp);
diff --git a/include/uapi/misc/fastrpc.h b/include/uapi/misc/fastrpc.h
index 91583690bddc..f33d914d8f46 100644
--- a/include/uapi/misc/fastrpc.h
+++ b/include/uapi/misc/fastrpc.h
@@ -8,14 +8,11 @@
 #define FASTRPC_IOCTL_ALLOC_DMA_BUFF   _IOWR('R', 1, struct 
fastrpc_alloc_dma_buf)
 #define FASTRPC_IOCTL_FREE_DMA_BUFF_IOWR('R', 2, __u32)
 #define FASTRPC_IOCTL_INVOKE   _IOWR('R', 3, struct fastrpc_invoke)
-/* This ioctl is only supported with secure device nodes */
 #define FASTRPC_IOCTL_INIT_ATTACH  _IO('R', 4)
 #define FASTRPC_IOCTL_INIT_CREATE  _IOWR('R', 5, struct 
fastrpc_init_create)
 #define FASTRPC_IOCTL_MMAP _IOWR('R', 6, struct fastrpc_req_mmap)
 #define FASTRPC_IOCTL_MUNMAP   _IOWR('R', 7, struct fastrpc_req_munmap)
-/* This ioctl is only supported with secure device nodes */
 #define FASTRPC_IOCTL_INIT_ATTACH_SNS  _IO('R', 8)
-/* This ioctl is only supported with secure device nodes */
 #define FASTRPC_IOCTL_INIT_CREATE_STATIC _IOWR('R', 9, struct 
fastrpc_init_create_static)
 #define FASTRPC_IOCTL_MEM_MAP  _IOWR('R', 10, struct fastrpc_mem_map)
 #define FASTRPC_IOCTL_MEM_UNMAP_IOWR('R', 11, struct 
fastrpc_mem_unmap)
-- 
2.46.0



[PATCH v4] rockchip/drm: vop2: add support for gamma LUT

2024-08-16 Thread Piotr Zalewski
Add support for gamma LUT in VOP2 driver. The implementation was inspired
by one found in VOP1 driver. Blue and red channels in gamma LUT register
write were swapped with respect to how gamma LUT values are written in
VOP1. If the current SoC is RK3566 or RK3568 and gamma LUT is to be
written, full modeset is triggered to synchronize disable, write, enable
process and hint userspace that it is not seamless transition[1]. If the
current SoC is RK3588 full modeset isn't triggered because gamma LUT need
not to be disabled before the LUT write[1]. In case of RK356x as well as
RK3588 respective LUT port sel register write was added before the LUT
write[2]. In case of RK3588, gamma update enable bit is set after setting
gamma LUT enable bit[2]. Gamma size is set and drm color management is
enabled for each video port's CRTC except ones which have no associated
device. Tested on RK3566 (Pinetab2).

[1] 
https://lore.kernel.org/linux-rockchip/CAPj87rOM=j0zmuWL9frGKV1xzPbJrk=q9ip7f_hapynbcqp...@mail.gmail.com/
[2] 
https://lore.kernel.org/linux-rockchip/7d998e4c-e1d3-4e8b-af76-c5bc83b43...@rock-chips.com/

Helped-by: Daniel Stone 
Helped-by: Dragan Simic 
Helped-by: Diederik de Haas 
Helped-by: Andy Yan 
Signed-off-by: Piotr Zalewski 
---

Notes:
WASN'T tested on RK3588.

Changes in v4:
- rework the implementation to better utilize DRM atomic updates[2]
- handle the RK3588 case[2][3]

Changes in v3:
- v3 is patch v2 "resend", by mistake the incremental patch was
sent in v2

Changes in v2:
- Apply code styling corrections[1]
- Move gamma LUT write inside the vop2 lock

Link to v3: 
https://lore.kernel.org/linux-rockchip/TkgKVivuaLFLILPY-n3iZo_8KF-daKdqdu-0_e0HP-5Ar_8DALDeNWog2suwWKjX7eomcbGET0KZe7DlzdhK2YM6CbLbeKeFZr-MJzJMtw0=@proton.me/
Link to v2: 
https://lore.kernel.org/linux-rockchip/Hk03HDb6wSSHWtEFZHUye06HR0-9YzP5nCHx9A8_kHzWSZawDrU1o1pjEGkCOJFoRg0nTB4BWEv6V0XBOjF4-0Mj44lp2TrjaQfnytzp-Pk=@proton.me/T/#u
Link to v1: 
https://lore.kernel.org/linux-rockchip/9736eadf6a9d8e97eef919c6b3d88...@manjaro.org/T/#t

[1] 
https://lore.kernel.org/linux-rockchip/d019761504b540600d9fc7a585d6f...@manjaro.org
[2] 
https://lore.kernel.org/linux-rockchip/CAPj87rOM=j0zmuWL9frGKV1xzPbJrk=q9ip7f_hapynbcqp...@mail.gmail.com
[3] 
https://lore.kernel.org/linux-rockchip/7d998e4c-e1d3-4e8b-af76-c5bc83b43...@rock-chips.com

 drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 148 +++
 drivers/gpu/drm/rockchip/rockchip_drm_vop2.h |   5 +
 2 files changed, 153 insertions(+)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 9873172e3fd3..fe7657984909 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -278,6 +278,15 @@ static u32 vop2_readl(struct vop2 *vop2, u32 offset)
return val;
 }
 
+static u32 vop2_vp_read(struct vop2_video_port *vp, u32 offset)
+{
+   u32 val;
+
+   regmap_read(vp->vop2->map, vp->data->offset + offset, &val);
+
+   return val;
+}
+
 static void vop2_win_write(const struct vop2_win *win, unsigned int reg, u32 v)
 {
regmap_field_write(win->reg[reg], v);
@@ -998,6 +1007,30 @@ static void vop2_disable(struct vop2 *vop2)
clk_disable_unprepare(vop2->hclk);
 }
 
+static void vop2_vp_dsp_lut_disable(struct vop2_video_port *vp)
+{
+   u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL);
+
+   dsp_ctrl &= ~RK3568_VP_DSP_CTRL__DSP_LUT_EN;
+   vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl);
+}
+
+static void vop2_vp_dsp_lut_enable(struct vop2_video_port *vp)
+{
+   u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL);
+
+   dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_LUT_EN;
+   vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl);
+}
+
+static void vop2_vp_dsp_lut_update_enable(struct vop2_video_port *vp)
+{
+   u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL);
+
+   dsp_ctrl |= RK3588_VP_DSP_CTRL__GAMMA_UPDATE_EN;
+   vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl);
+}
+
 static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,
 struct drm_atomic_state *state)
 {
@@ -1482,6 +1515,24 @@ static bool vop2_crtc_mode_fixup(struct drm_crtc *crtc,
return true;
 }
 
+static void vop2_crtc_write_gamma_lut(struct vop2 *vop2, struct drm_crtc *crtc)
+{
+   const struct vop2_video_port *vp = to_vop2_video_port(crtc);
+   const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id];
+
+   struct drm_color_lut *lut = crtc->state->gamma_lut->data;
+   unsigned int i, bpc = ilog2(vp_data->gamma_lut_len);
+   u32 word;
+
+   for (i = 0; i < crtc->gamma_size; i++) {
+   word = (drm_color_lut_extract(lut[i].blue, bpc) << (2 * bpc)) |
+   (drm_color_lut_extract(lut[i].green, bpc) << bpc) |
+   drm_color_lut_extract(lut[i].red, b

Re: [PATCH 0/9] fbdev: Use backlight power constants

2024-08-16 Thread Thomas Zimmermann

Ping for review

Am 31.07.24 um 14:33 schrieb Thomas Zimmermann:

Commit a1cacb8a8e70 ("backlight: Add BACKLIGHT_POWER_ constants for
power states") introduced dedicated constants for backlight power states.
Convert fbdev drivers to the new constants.

The new constants replace the fbdev constants. This is part of a larger
effort to make kernel subsystems more independent from fbdev code and
headers.

Thomas Zimmermann (9):
   fbdev: atmel_lcdfb: Use backlight power constants
   fbdev: aty128fb: Use backlight power constants
   fbdev: atyfb: Use backlight power constants
   fbdev: chipsfb: Use backlight power constants
   fbdev: nvidiafb: Use backlight power constants
   fbdev: omapfb: Use backlight power constants
   fbdev: radeonfb: Use backlight power constants
   fbdev: rivafb: Use backlight power constants
   fbdev: sh_mobile_lcdc_fb: Use backlight power constants

  drivers/video/fbdev/atmel_lcdfb.c   | 4 ++--
  drivers/video/fbdev/aty/aty128fb.c  | 6 +++---
  drivers/video/fbdev/aty/atyfb_base.c| 2 +-
  drivers/video/fbdev/aty/radeon_backlight.c  | 2 +-
  drivers/video/fbdev/chipsfb.c   | 2 +-
  drivers/video/fbdev/nvidia/nv_backlight.c   | 2 +-
  drivers/video/fbdev/omap2/omapfb/displays/panel-dsi-cm.c| 4 ++--
  .../fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c  | 2 +-
  drivers/video/fbdev/riva/fbdev.c| 2 +-
  drivers/video/fbdev/sh_mobile_lcdcfb.c  | 6 +++---
  10 files changed, 16 insertions(+), 16 deletions(-)



--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)



[PATCH v3 RESEND 0/2] drm/bridge: imx: Add i.MX93 parallel display format configuration support

2024-08-16 Thread Liu Ying
Hi,

This patch set aims to add NXP i.MX93 parallel display format configuration
DRM bridge driver support. i.MX93 mediamix blk-ctrl contains one
DISPLAY_MUX register which configures parallel display format by using
the "PARALLEL_DISP_FORMAT" field. i.MX93 LCDIF display controller's
parallel output connects with this piece of small logic to configure
parallel display format.

Patch 1/2 adds NXP i.MX93 parallel display format configuration subnode
in i.MX93 mediamix blk-ctrl dt-binding.

Patch 2/2 adds NXP i.MX93 parallel display format configuration DRM bridge
driver support.

v2->v3:
* Define i.MX93 parallel display format configuration subnode in
  i.MX93 mediamix blk-ctrl dt-binding. (Rob)
* Resend with Conor's R-b tag on patch 1/2 and with the patch set rebased
  upon v6.11-rc1.

v1->v2:
* Set *num_input_fmts to zero in case
  imx93_pdfc_bridge_atomic_get_input_bus_fmts() returns NULL in patch 2/2.
* Replace .remove callback with .remove_new callback in
  imx93_pdfc_bridge_driver in patch 2/2.


Liu Ying (2):
  dt-bindings: soc: imx93-media-blk-ctrl: Add PDFC subnode to schema and
example
  drm/bridge: imx: Add i.MX93 parallel display format configuration
support

 .../soc/imx/fsl,imx93-media-blk-ctrl.yaml |  68 ++
 drivers/gpu/drm/bridge/imx/Kconfig|   8 +
 drivers/gpu/drm/bridge/imx/Makefile   |   1 +
 drivers/gpu/drm/bridge/imx/imx93-pdfc.c   | 209 ++
 4 files changed, 286 insertions(+)
 create mode 100644 drivers/gpu/drm/bridge/imx/imx93-pdfc.c

-- 
2.34.1



[PATCH v3 RESEND 1/2] dt-bindings: soc: imx93-media-blk-ctrl: Add PDFC subnode to schema and example

2024-08-16 Thread Liu Ying
i.MX93 SoC mediamix blk-ctrl contains one DISPLAY_MUX register which
configures parallel display format by using the "PARALLEL_DISP_FORMAT"
field. Document the Parallel Display Format Configuration(PDFC) subnode
and add the subnode to example.

Signed-off-by: Liu Ying 
Reviewed-by: Conor Dooley 
---
v2->v3:
* Newly introduced to replace the standalone dt-binding in v1 and v2. (Rob)
* Resend with Conor's R-b tag and with the patch rebased upon v6.11-rc1.

 .../soc/imx/fsl,imx93-media-blk-ctrl.yaml | 68 +++
 1 file changed, 68 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/soc/imx/fsl,imx93-media-blk-ctrl.yaml 
b/Documentation/devicetree/bindings/soc/imx/fsl,imx93-media-blk-ctrl.yaml
index b3554e7f9e76..3f550c30d93d 100644
--- a/Documentation/devicetree/bindings/soc/imx/fsl,imx93-media-blk-ctrl.yaml
+++ b/Documentation/devicetree/bindings/soc/imx/fsl,imx93-media-blk-ctrl.yaml
@@ -24,6 +24,12 @@ properties:
   reg:
 maxItems: 1
 
+  '#address-cells':
+const: 1
+
+  '#size-cells':
+const: 1
+
   '#power-domain-cells':
 const: 1
 
@@ -46,9 +52,43 @@ properties:
   - const: csi
   - const: dsi
 
+  bridge@60:
+type: object
+additionalProperties: false
+
+properties:
+  compatible:
+const: nxp,imx93-pdfc
+
+  reg:
+maxItems: 1
+
+  ports:
+$ref: /schemas/graph.yaml#/properties/ports
+
+properties:
+  port@0:
+$ref: /schemas/graph.yaml#/properties/port
+description: Input port node to receive pixel data.
+
+  port@1:
+$ref: /schemas/graph.yaml#/properties/port
+description: Output port node to downstream pixel data receivers.
+
+required:
+  - port@0
+  - port@1
+
+required:
+  - compatible
+  - reg
+  - ports
+
 required:
   - compatible
   - reg
+  - '#address-cells'
+  - '#size-cells'
   - power-domains
   - clocks
   - clock-names
@@ -76,5 +116,33 @@ examples:
<&clk IMX93_CLK_MIPI_DSI_GATE>;
clock-names = "apb", "axi", "nic", "disp", "cam",
  "pxp", "lcdif", "isi", "csi", "dsi";
+  #address-cells = <1>;
+  #size-cells = <1>;
   #power-domain-cells = <1>;
+
+  bridge@60 {
+compatible = "nxp,imx93-pdfc";
+reg = <0x60 0x4>;
+
+ports {
+  #address-cells = <1>;
+  #size-cells = <0>;
+
+  port@0 {
+reg = <0>;
+
+pdfc_from_lcdif: endpoint {
+  remote-endpoint = <&lcdif_to_pdfc>;
+};
+  };
+
+  port@1 {
+reg = <1>;
+
+pdfc_to_panel: endpoint {
+  remote-endpoint = <&panel_from_pdfc>;
+};
+  };
+};
+  };
 };
-- 
2.34.1



[PATCH v3 RESEND 2/2] drm/bridge: imx: Add i.MX93 parallel display format configuration support

2024-08-16 Thread Liu Ying
NXP i.MX93 mediamix blk-ctrl contains one DISPLAY_MUX register which
configures parallel display format by using the "PARALLEL_DISP_FORMAT"
field. Add a DRM bridge driver to support the display format configuration.

Signed-off-by: Liu Ying 
---
v2->v3:
* No change.
* Resend with the patch rebased upon v6.11-rc1.

v1->v2:
* Set *num_input_fmts to zero in case
  imx93_pdfc_bridge_atomic_get_input_bus_fmts() returns NULL.
* Replace .remove callback with .remove_new callback in
  imx93_pdfc_bridge_driver.

 drivers/gpu/drm/bridge/imx/Kconfig  |   8 +
 drivers/gpu/drm/bridge/imx/Makefile |   1 +
 drivers/gpu/drm/bridge/imx/imx93-pdfc.c | 209 
 3 files changed, 218 insertions(+)
 create mode 100644 drivers/gpu/drm/bridge/imx/imx93-pdfc.c

diff --git a/drivers/gpu/drm/bridge/imx/Kconfig 
b/drivers/gpu/drm/bridge/imx/Kconfig
index 8dd89efa8ea7..088241575857 100644
--- a/drivers/gpu/drm/bridge/imx/Kconfig
+++ b/drivers/gpu/drm/bridge/imx/Kconfig
@@ -78,4 +78,12 @@ config DRM_IMX93_MIPI_DSI
  Choose this to enable MIPI DSI controller found in Freescale i.MX93
  processor.
 
+config DRM_IMX93_PARALLEL_DISP_FMT_CONFIG
+   tristate "NXP i.MX93 parallel display format configuration"
+   depends on OF
+   select DRM_KMS_HELPER
+   help
+ Choose this to enable parallel display format configuration
+ found in NXP i.MX93 processor.
+
 endif # ARCH_MXC || COMPILE_TEST
diff --git a/drivers/gpu/drm/bridge/imx/Makefile 
b/drivers/gpu/drm/bridge/imx/Makefile
index edb0a7b71b30..8d3499fb7fba 100644
--- a/drivers/gpu/drm/bridge/imx/Makefile
+++ b/drivers/gpu/drm/bridge/imx/Makefile
@@ -7,3 +7,4 @@ obj-$(CONFIG_DRM_IMX8QXP_PIXEL_COMBINER) += 
imx8qxp-pixel-combiner.o
 obj-$(CONFIG_DRM_IMX8QXP_PIXEL_LINK) += imx8qxp-pixel-link.o
 obj-$(CONFIG_DRM_IMX8QXP_PIXEL_LINK_TO_DPI) += imx8qxp-pxl2dpi.o
 obj-$(CONFIG_DRM_IMX93_MIPI_DSI) += imx93-mipi-dsi.o
+obj-$(CONFIG_DRM_IMX93_PARALLEL_DISP_FMT_CONFIG) += imx93-pdfc.o
diff --git a/drivers/gpu/drm/bridge/imx/imx93-pdfc.c 
b/drivers/gpu/drm/bridge/imx/imx93-pdfc.c
new file mode 100644
index ..61e01b503be5
--- /dev/null
+++ b/drivers/gpu/drm/bridge/imx/imx93-pdfc.c
@@ -0,0 +1,209 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Copyright 2022,2023 NXP
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#define DRIVER_NAME"imx93_pdfc"
+
+#define DISPLAY_MUX0x60
+#define  PARALLEL_DISP_FORMAT  0x700
+
+enum imx93_pdfc_format {
+   RGB888_TO_RGB888 = 0x0,
+   RGB888_TO_RGB666 = 0x1 << 8,
+   RGB565_TO_RGB565 = 0x2 << 8,
+};
+
+struct imx93_pdfc {
+   struct drm_bridge bridge;
+   struct drm_bridge *next_bridge;
+   struct device *dev;
+   struct regmap *regmap;
+   u32 format;
+};
+
+static int imx93_pdfc_bridge_attach(struct drm_bridge *bridge,
+   enum drm_bridge_attach_flags flags)
+{
+   struct imx93_pdfc *pdfc = bridge->driver_private;
+
+   return drm_bridge_attach(bridge->encoder, pdfc->next_bridge, bridge, 
flags);
+}
+
+static void
+imx93_pdfc_bridge_atomic_enable(struct drm_bridge *bridge,
+   struct drm_bridge_state *old_bridge_state)
+{
+   struct imx93_pdfc *pdfc = bridge->driver_private;
+
+   regmap_update_bits(pdfc->regmap, DISPLAY_MUX, PARALLEL_DISP_FORMAT,
+  pdfc->format);
+}
+
+static const u32 imx93_pdfc_bus_output_fmts[] = {
+   MEDIA_BUS_FMT_RGB888_1X24,
+   MEDIA_BUS_FMT_RGB666_1X18,
+   MEDIA_BUS_FMT_RGB565_1X16,
+   MEDIA_BUS_FMT_FIXED
+};
+
+static bool imx93_pdfc_bus_output_fmt_supported(u32 fmt)
+{
+   int i;
+
+   for (i = 0; i < ARRAY_SIZE(imx93_pdfc_bus_output_fmts); i++) {
+   if (imx93_pdfc_bus_output_fmts[i] == fmt)
+   return true;
+   }
+
+   return false;
+}
+
+static u32 *
+imx93_pdfc_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+   struct drm_bridge_state 
*bridge_state,
+   struct drm_crtc_state *crtc_state,
+   struct drm_connector_state 
*conn_state,
+   u32 output_fmt,
+   unsigned int *num_input_fmts)
+{
+   u32 *input_fmts;
+
+   *num_input_fmts = 0;
+
+   if (!imx93_pdfc_bus_output_fmt_supported(output_fmt))
+   return NULL;
+
+   input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
+   if (!input_fmts)
+   return NULL;
+
+   switch (output_fmt) {
+   case MEDIA_BUS_FMT_RGB888_1X24:
+   case MEDIA_BUS_FMT_RGB565_1X16:
+   input_fmts[0] = output_fmt;
+   break;
+   case MEDIA_BUS_FMT_RGB666_1X18:
+   case MEDIA_BUS_FMT_FIXED:
+   input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;

Re: [PATCH 0/9] fbdev: Use backlight power constants

2024-08-16 Thread Jani Nikula
On Fri, 16 Aug 2024, Thomas Zimmermann  wrote:
> Ping for review

On the series,

Reviewed-by: Jani Nikula 



>
> Am 31.07.24 um 14:33 schrieb Thomas Zimmermann:
>> Commit a1cacb8a8e70 ("backlight: Add BACKLIGHT_POWER_ constants for
>> power states") introduced dedicated constants for backlight power states.
>> Convert fbdev drivers to the new constants.
>>
>> The new constants replace the fbdev constants. This is part of a larger
>> effort to make kernel subsystems more independent from fbdev code and
>> headers.
>>
>> Thomas Zimmermann (9):
>>fbdev: atmel_lcdfb: Use backlight power constants
>>fbdev: aty128fb: Use backlight power constants
>>fbdev: atyfb: Use backlight power constants
>>fbdev: chipsfb: Use backlight power constants
>>fbdev: nvidiafb: Use backlight power constants
>>fbdev: omapfb: Use backlight power constants
>>fbdev: radeonfb: Use backlight power constants
>>fbdev: rivafb: Use backlight power constants
>>fbdev: sh_mobile_lcdc_fb: Use backlight power constants
>>
>>   drivers/video/fbdev/atmel_lcdfb.c   | 4 ++--
>>   drivers/video/fbdev/aty/aty128fb.c  | 6 +++---
>>   drivers/video/fbdev/aty/atyfb_base.c| 2 +-
>>   drivers/video/fbdev/aty/radeon_backlight.c  | 2 +-
>>   drivers/video/fbdev/chipsfb.c   | 2 +-
>>   drivers/video/fbdev/nvidia/nv_backlight.c   | 2 +-
>>   drivers/video/fbdev/omap2/omapfb/displays/panel-dsi-cm.c| 4 ++--
>>   .../fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c  | 2 +-
>>   drivers/video/fbdev/riva/fbdev.c| 2 +-
>>   drivers/video/fbdev/sh_mobile_lcdcfb.c  | 6 +++---
>>   10 files changed, 16 insertions(+), 16 deletions(-)
>>

-- 
Jani Nikula, Intel


Re: [PATCH] drm/i915/gem: Remove unnecessary cast

2024-08-16 Thread Andi Shyti
Hi Rodrigo,

On Thu, Aug 15, 2024 at 02:58:25PM -0400, Rodrigo Vivi wrote:
> On Wed, Aug 14, 2024 at 07:59:47PM +0200, Andi Shyti wrote:
> > The cast from "long" to "unsigned long" is unnecessary. Remove
> > it.
> 
> I don't believe we can be that bold in this statement.
> Some static analyzer tools might not agree and tell that
> if the start or end are negative values we could have
> undefined behavior.

Right, but we do check for negative values before. If we reach
this point I'm sure this is positive and I'm also sure that a
positive long fits into an unsigned long.

Maybe I should have been clearer in the commit log.

> > In this case, the variables "start" and "end" are of type long
> > because they need to account for the possibility of negative
> > values. However, they are subsequently moved to "unsigned long"
> > since addresses are typically handled as unsigned values.
> 
> right, but the static analyzer tools won't agree and complain
> and people will start try to add this back.
> 
> Do we really need this patch?

It's a cleanup, like removing trailing spaces, none of them is
really needed :-)

Trivial removals of unnecessary casts are normally done around
the kernel, but, of course we can drop this patch.

Thanks,
Andi


[PULL] drm-misc-next

2024-08-16 Thread Thomas Zimmermann
Hi Dave, Sima,

this is the weekly PR for drm-misc-next. Mostly small cleanups and
improvements. Rockchip received support for more modes and displays.

Best regards
Thomas

drm-misc-next-2024-08-16:
drm-misc-next for v6.12:

Core Changes:

ci:
- Update dependencies

docs:
- Cleanups

edid:
- Improve debug logging
- Clean up interface

fbdev emulation:
- Remove old fbdev hooks
- Update documentation

panic:
- Cleanups

Driver Changes:

amdgpu:
- Remove usage of old fbdev hooks
- Use backlight constants

ast:
- Fix timeout loop for DP link training

hisilicon:
- hibmc: Cleanups

mipi-dsi:
- Improve error handling
- startek-kd070fhfid015: Use new error handling

nouveau:
- Remove usage of old fbdev hooks

panel:
- Use backlight constants

radeon:
- Use backlight constants

rockchip:
- Improve DP sink-capability reporting
- Cleanups
- dw_hdmi: Support 4k@60Hz; Cleanups
- vop: Support RGB display on Rockchip RK3066; Support 4096px width

tilcdc:
- Use backlight constants
The following changes since commit 4e996697a443a214887ef81b008c344d183b5659:

  Merge tag 'drm-misc-next-2024-08-09' of 
https://gitlab.freedesktop.org/drm/misc/kernel into drm-next (2024-08-09 
10:41:59 +0200)

are available in the Git repository at:

  https://gitlab.freedesktop.org/drm/misc/kernel.git 
tags/drm-misc-next-2024-08-16

for you to fetch changes up to 8befe8fa5a4e4b30787b17e078d9d7b5cb92ea19:

  drm/tilcdc: Use backlight power constants (2024-08-16 09:28:01 +0200)


drm-misc-next for v6.12:

Core Changes:

ci:
- Update dependencies

docs:
- Cleanups

edid:
- Improve debug logging
- Clean up interface

fbdev emulation:
- Remove old fbdev hooks
- Update documentation

panic:
- Cleanups

Driver Changes:

amdgpu:
- Remove usage of old fbdev hooks
- Use backlight constants

ast:
- Fix timeout loop for DP link training

hisilicon:
- hibmc: Cleanups

mipi-dsi:
- Improve error handling
- startek-kd070fhfid015: Use new error handling

nouveau:
- Remove usage of old fbdev hooks

panel:
- Use backlight constants

radeon:
- Use backlight constants

rockchip:
- Improve DP sink-capability reporting
- Cleanups
- dw_hdmi: Support 4k@60Hz; Cleanups
- vop: Support RGB display on Rockchip RK3066; Support 4096px width

tilcdc:
- Use backlight constants


Alex Bee (1):
  drm/rockchip: vop: Allow 4096px width scaling

Andy Shevchenko (1):
  drm: fixed: Don't use "proxy" headers

Christophe JAILLET (1):
  drm/rockchip: Constify struct drm_encoder_helper_funcs

Cristian Ciocaltea (5):
  drm/rockchip: Explicitly include bits header
  drm/rockchip: dw_hdmi: Use modern drm_device based logging
  drm/rockchip: dw_hdmi: Simplify clock handling
  drm/rockchip: dw_hdmi: Use devm_regulator_get_enable()
  drm/rockchip: dw_hdmi: Drop superfluous assignments of mpll_cfg, cur_ctr 
and phy_config

Dan Carpenter (1):
  drm/ast: astdp: fix loop timeout check

Daniel Yang (1):
  drm/connector: kerneldoc: Fix two missing newlines in drm_connector.c

Dragan Simic (1):
  drm/rockchip: cdn-dp: Clean up a few logged messages

Jani Nikula (4):
  drm/edid: reduce DisplayID log spamming
  drm/rockchip: cdn-dp: get rid of drm_edid_raw()
  drm/i915/gvt: stop using drm_edid_block_valid()
  drm/edid: make drm_edid_block_valid() static

Jocelyn Falempe (5):
  drm/panic: Remove space before "!" in panic message
  drm/panic: Remove useless export symbols
  drm/panic: Move drm_panic_register prototype to drm_crtc_internal.h
  drm/panic: Move copyright notice to the top
  drm/panic: Add panic description

Jonas Karlman (3):
  drm/rockchip: dw_hdmi: Fix reading EDID when using a forced mode
  drm/rockchip: dw_hdmi: Allow High TMDS Bit Rates
  drm/rockchip: dw_hdmi: Add max_tmds_clock validation

Louis Chauvet (1):
  drm/vkms: Formatting and typo fix

Mohammed Anees (1):
  drm: Add missing documentation for struct drm_plane_size_hint

Tejas Vipin (2):
  drm/mipi-dsi: add more multi functions for better error handling
  drm/panel: startek-kd070fhfid015: transition to mipi_dsi wrapped functions

Thomas Zimmermann (18):
  Merge drm/drm-next into drm-misc-next
  drm: Do delayed switcheroo in drm_lastclose()
  drm/amdgpu: Do not set struct drm_driver.lastclose
  drm/nouveau: Do not set struct drm_driver.lastclose
  drm/nouveau: Do not set struct drm_mode_config_funcs.output_poll_changed
  drm/nouveau: Implement switcheroo reprobe with drm_client_dev_hotplug()
  drm/fbdev-helper: Update documentation on obsolete callbacks
  drm/fbdev-helper: Remove drm_fb_helper_output_poll_changed()
  drm: Remove struct drm_driver.lastclose
  drm: Remove struct drm_mode_config_funcs.output_poll_changed
  drm/amdgpu: Use backlight power constants
  drm/panel: panel-novatak-nt35510: Use backlight power constants
  drm/panel: pa

Re: (subset) [PATCH v4 0/6] arm64: qcom: sa8775p: enable remoteprocs - ADSP, CDSP and GPDSP

2024-08-16 Thread Srinivas Kandagatla


On Mon, 05 Aug 2024 19:08:01 +0200, Bartosz Golaszewski wrote:
> Add DT bindings, relevant DT defines, DTS nodes and driver changes
> required to enable the remoteprocs on sa8775p.
> 
> To: Bjorn Andersson 
> To: Mathieu Poirier 
> To: Rob Herring 
> To: Krzysztof Kozlowski 
> To: Conor Dooley 
> To: Manivannan Sadhasivam 
> To: Jassi Brar 
> To: Konrad Dybcio 
> Cc: linux-arm-...@vger.kernel.org
> Cc: linux-remotep...@vger.kernel.org
> Cc: devicet...@vger.kernel.org
> Cc: linux-ker...@vger.kernel.org
> Signed-off-by: Bartosz Golaszewski 
> 
> [...]

Applied, thanks!

[1/6] dt-bindings: misc: qcom,fastrpc: increase the max number of iommus
  commit: 42a21d00aac515fad1f9a10052c6e9710c6f7813
[4/6] misc: fastrpc: Add support for cdsp1 remoteproc
  commit: 590c42d9e278f8e6bf6d673f3101ac102369efc7

Best regards,
-- 
Srinivas Kandagatla 



[PATCH 0/2] drm/panel: simple: Add ON Tat Industrial Company KD50G21-40NT-A1 panel

2024-08-16 Thread Liu Ying
Hi,

This patch series aims at adding ON Tat Industrial Company KD50G21-40NT-A1
5" WVGA LCD panel support.  The panel has a DPI interface.

The LCD module specification can be found at:
https://cdn-shop.adafruit.com/datasheets/KD50G21-40NT-A1.pdf

Liu Ying (2):
  dt-bindings: display: panel-simple: Add On Tat Industrial Company
KD50G21-40NT-A1
  drm/panel: simple: Add ON Tat Industrial Company KD50G21-40NT-A1 panel

 .../bindings/display/panel/panel-simple.yaml  |  2 ++
 drivers/gpu/drm/panel/panel-simple.c  | 36 +++
 2 files changed, 38 insertions(+)

-- 
2.34.1



[PATCH 2/2] drm/panel: simple: Add ON Tat Industrial Company KD50G21-40NT-A1 panel

2024-08-16 Thread Liu Ying
ON Tat Industrial Company KD50G21-40NT-A1 is a 5" WVGA LCD panel with DPI
interface.

The LCD module specification can be found at:
https://cdn-shop.adafruit.com/datasheets/KD50G21-40NT-A1.pdf

Signed-off-by: Liu Ying 
---
 drivers/gpu/drm/panel/panel-simple.c | 36 
 1 file changed, 36 insertions(+)

diff --git a/drivers/gpu/drm/panel/panel-simple.c 
b/drivers/gpu/drm/panel/panel-simple.c
index bf40057c5cf3..89963df80917 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -3478,6 +3478,39 @@ static const struct panel_desc olimex_lcd_olinuxino_43ts 
= {
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
 };
 
+static const struct display_timing ontat_kd50g21_40nt_a1_timing = {
+   .pixelclock = { 3000, 3000, 5000 },
+   .hactive = { 800, 800, 800 },
+   .hfront_porch = { 1, 40, 255 },
+   .hback_porch = { 1, 40, 87 },
+   .hsync_len = { 1, 48, 87 },
+   .vactive = { 480, 480, 480 },
+   .vfront_porch = { 1, 13, 255 },
+   .vback_porch = { 1, 29, 29 },
+   .vsync_len = { 3, 3, 31 },
+   .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
+DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
+};
+
+static const struct panel_desc ontat_kd50g21_40nt_a1 = {
+   .timings = &ontat_kd50g21_40nt_a1_timing,
+   .num_timings = 1,
+   .bpc = 8,
+   .size = {
+   .width = 108,
+   .height = 65,
+   },
+   .delay = {
+   .prepare = 147, /* 5 VSDs */
+   .enable = 147,  /* 5 VSDs */
+   .disable = 88,  /* 3 VSDs */
+   .unprepare = 117,   /* 4 VSDs */
+   },
+   .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+   .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
+   .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
 /*
  * 800x480 CVT. The panel appears to be quite accepting, at least as far as
  * pixel clocks, but this is the timing that was being used in the Adafruit
@@ -4837,6 +4870,9 @@ static const struct of_device_id platform_of_match[] = {
}, {
.compatible = "olimex,lcd-olinuxino-43-ts",
.data = &olimex_lcd_olinuxino_43ts,
+   }, {
+   .compatible = "ontat,kd50g21-40nt-a1",
+   .data = &ontat_kd50g21_40nt_a1,
}, {
.compatible = "ontat,yx700wv03",
.data = &ontat_yx700wv03,
-- 
2.34.1



[PATCH 1/2] dt-bindings: display: panel-simple: Add On Tat Industrial Company KD50G21-40NT-A1

2024-08-16 Thread Liu Ying
Document On Tat Industrial Company KD50G21-40NT-A1 5" WVGA TFT LCD panel.

The LCD module specification can be found at:
https://cdn-shop.adafruit.com/datasheets/KD50G21-40NT-A1.pdf

Signed-off-by: Liu Ying 
---
 .../devicetree/bindings/display/panel/panel-simple.yaml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml 
b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
index 8a87e0100dcb..c72a13b70efa 100644
--- a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
+++ b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
@@ -222,6 +222,8 @@ properties:
   - okaya,rs800480t-7x0gp
 # Olimex 4.3" TFT LCD panel
   - olimex,lcd-olinuxino-43-ts
+# On Tat Industrial Company 5" DPI TFT panel.
+  - ontat,kd50g21-40nt-a1
 # On Tat Industrial Company 7" DPI TFT panel.
   - ontat,yx700wv03
 # OrtusTech COM37H3M05DTC Blanview 3.7" VGA portrait TFT-LCD panel
-- 
2.34.1



Re: [PATCH v3 RESEND 2/2] drm/bridge: imx: Add i.MX93 parallel display format configuration support

2024-08-16 Thread Krzysztof Kozlowski
On 16/08/2024 10:09, Liu Ying wrote:
> NXP i.MX93 mediamix blk-ctrl contains one DISPLAY_MUX register which
> configures parallel display format by using the "PARALLEL_DISP_FORMAT"
> field. Add a DRM bridge driver to support the display format configuration.
> 
> Signed-off-by: Liu Ying 
> ---

...

> +
> +static int imx93_pdfc_bridge_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct imx93_pdfc *pdfc;
> + int ret;
> +
> + pdfc = devm_kzalloc(dev, sizeof(*pdfc), GFP_KERNEL);
> + if (!pdfc)
> + return -ENOMEM;
> +
> + pdfc->regmap = syscon_node_to_regmap(dev->of_node->parent);
> + if (IS_ERR(pdfc->regmap)) {
> + ret = PTR_ERR(pdfc->regmap);
> + if (ret != -EPROBE_DEFER)
> + DRM_DEV_ERROR(dev, "failed to get regmap: %d\n", ret);
> + return ret;

Nope, you just open-coded dev_err_probe. Syntax is - return
dev_err_probe(). if you need wrapper for DRM, add such.

> + }
> +
> + pdfc->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
> + if (IS_ERR(pdfc->next_bridge)) {
> + ret = PTR_ERR(pdfc->next_bridge);
> + if (ret != -EPROBE_DEFER)
> + DRM_DEV_ERROR(dev, "failed to get next bridge: %d\n", 
> ret);
> + return ret;

Ditto


> + }
> +

...

> +MODULE_DESCRIPTION("NXP i.MX93 parallel display format configuration 
> driver");
> +MODULE_AUTHOR("Liu Ying ");
> +MODULE_LICENSE("GPL v2");
> +MODULE_ALIAS("platform:" DRIVER_NAME);

Which other driver needs this platform alias?

Best regards,
Krzysztof



Re: [PATCH 1/2] dt-bindings: display: panel-simple: Add On Tat Industrial Company KD50G21-40NT-A1

2024-08-16 Thread Krzysztof Kozlowski
On 16/08/2024 10:50, Liu Ying wrote:
> Document On Tat Industrial Company KD50G21-40NT-A1 5" WVGA TFT LCD panel.
> 
> The LCD module specification can be found at:
> https://cdn-shop.adafruit.com/datasheets/KD50G21-40NT-A1.pdf
> 
> Signed-off-by: Liu Ying 
> ---
>  .../devicetree/bindings/display/panel/panel-simple.yaml | 2 ++
>  1 file changed, 2 insertions(+)

Acked-by: Krzysztof Kozlowski 

Best regards,
Krzysztof



Re: [PATCH v3 RESEND 2/2] drm/bridge: imx: Add i.MX93 parallel display format configuration support

2024-08-16 Thread Liu Ying
On 08/16/2024, Krzysztof Kozlowski wrote:
> On 16/08/2024 10:09, Liu Ying wrote:
>> NXP i.MX93 mediamix blk-ctrl contains one DISPLAY_MUX register which
>> configures parallel display format by using the "PARALLEL_DISP_FORMAT"
>> field. Add a DRM bridge driver to support the display format configuration.
>>
>> Signed-off-by: Liu Ying 
>> ---
> 
> ...
> 
>> +
>> +static int imx93_pdfc_bridge_probe(struct platform_device *pdev)
>> +{
>> +struct device *dev = &pdev->dev;
>> +struct imx93_pdfc *pdfc;
>> +int ret;
>> +
>> +pdfc = devm_kzalloc(dev, sizeof(*pdfc), GFP_KERNEL);
>> +if (!pdfc)
>> +return -ENOMEM;
>> +
>> +pdfc->regmap = syscon_node_to_regmap(dev->of_node->parent);
>> +if (IS_ERR(pdfc->regmap)) {
>> +ret = PTR_ERR(pdfc->regmap);
>> +if (ret != -EPROBE_DEFER)
>> +DRM_DEV_ERROR(dev, "failed to get regmap: %d\n", ret);
>> +return ret;
> 
> Nope, you just open-coded dev_err_probe. Syntax is - return
> dev_err_probe(). if you need wrapper for DRM, add such.

Will use dev_err_probe().

> 
>> +}
>> +
>> +pdfc->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
>> +if (IS_ERR(pdfc->next_bridge)) {
>> +ret = PTR_ERR(pdfc->next_bridge);
>> +if (ret != -EPROBE_DEFER)
>> +DRM_DEV_ERROR(dev, "failed to get next bridge: %d\n", 
>> ret);
>> +return ret;
> 
> Ditto

Will use dev_err_probe().

> 
> 
>> +}
>> +
> 
> ...
> 
>> +MODULE_DESCRIPTION("NXP i.MX93 parallel display format configuration 
>> driver");
>> +MODULE_AUTHOR("Liu Ying ");
>> +MODULE_LICENSE("GPL v2");
>> +MODULE_ALIAS("platform:" DRIVER_NAME);
> 
> Which other driver needs this platform alias?

Quote include/linux/module.h:

"
/* For userspace: you can also call me... */
 
#define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)   
"

Anything wrong with using MODULE_ALIAS() here?

> 
> Best regards,
> Krzysztof
> 

-- 
Regards,
Liu Ying



Re: [PATCH v6 09/12] drm/ttm/pool: Provide a helper to shrink pages

2024-08-16 Thread Thomas Hellström
On Wed, 2024-08-07 at 23:38 +, Matthew Brost wrote:
> On Wed, Jul 03, 2024 at 05:38:10PM +0200, Thomas Hellström wrote:
> > Provide a helper to shrink ttm_tt page-vectors on a per-page
> > basis. A ttm_backup backend could then in theory get away with
> > allocating a single temporary page for each struct ttm_tt.
> > 
> > This is accomplished by splitting larger pages before trying to
> > back them up.
> > 
> > In the future we could allow ttm_backup to handle backing up
> > large pages as well, but currently there's no benefit in
> > doing that, since the shmem backup backend would have to
> > split those anyway to avoid allocating too much temporary
> > memory, and if the backend instead inserts pages into the
> > swap-cache, those are split on reclaim by the core.
> > 
> > Due to potential backup- and recover errors, allow partially
> > swapped
> > out struct ttm_tt's, although mark them as swapped out stopping
> > them
> > from being swapped out a second time. More details in the
> > ttm_pool.c
> > DOC section.
> > 
> > v2:
> > - A couple of cleanups and error fixes in ttm_pool_back_up_tt.
> > - s/back_up/backup/
> > - Add a writeback parameter to the exported interface.
> > 
> > Cc: Christian König 
> > Cc: Somalapuram Amaranath 
> > Cc: Matthew Brost 
> > Cc: 
> > Signed-off-by: Thomas Hellström 
> > ---
> >  drivers/gpu/drm/ttm/ttm_pool.c | 397
> > +++--
> >  drivers/gpu/drm/ttm/ttm_tt.c   |  37 +++
> >  include/drm/ttm/ttm_pool.h |   5 +
> >  include/drm/ttm/ttm_tt.h   |  20 ++
> >  4 files changed, 446 insertions(+), 13 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > b/drivers/gpu/drm/ttm/ttm_pool.c
> > index 6e1fd6985ffc..38e50cf81b0a 100644
> > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > @@ -41,6 +41,7 @@
> >  #include 
> >  #endif
> >  
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > @@ -58,6 +59,32 @@ struct ttm_pool_dma {
> >     unsigned long vaddr;
> >  };
> >  
> > +/**
> > + * struct ttm_pool_tt_restore - State representing restore from
> > backup
> > + * @alloced_pages: Total number of already allocated pages for the
> > ttm_tt.
> > + * @restored_pages: Number of (sub) pages restored from swap for
> > this
> > + *  chunk of 1 << @order pages.
> > + * @first_page: The ttm page ptr representing for @old_pages[0].
> > + * @caching_divide: Page pointer where subsequent pages are
> > cached.
> > + * @old_pages: Backup copy of page pointers that were replaced by
> > the new
> > + *    page allocation.
> > + * @pool: The pool used for page allocation while restoring.
> > + * @order: The order of the last page allocated while restoring.
> > + *
> > + * Recovery from backup might fail when we've recovered less than
> > the
> > + * full ttm_tt. In order not to loose any data (yet), keep
> > information
> > + * around that allows us to restart a failed ttm backup recovery.
> > + */
> > +struct ttm_pool_tt_restore {
> > +   pgoff_t alloced_pages;
> > +   pgoff_t restored_pages;
> > +   struct page **first_page;
> > +   struct page **caching_divide;
> > +   struct ttm_pool *pool;
> > +   unsigned int order;
> > +   struct page *old_pages[];
> > +};
> > +
> >  static unsigned long page_pool_size;
> >  
> >  MODULE_PARM_DESC(page_pool_size, "Number of pages in the WC/UC/DMA
> > pool");
> > @@ -354,11 +381,102 @@ static unsigned int
> > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> >     return p->private;
> >  }
> >  
> > +/*
> > + * To be able to insert single pages into backup directly,
> > + * we need to split multi-order page allocations and make them
> > look
> > + * like single-page allocations.
> > + */
> > +static void ttm_pool_split_for_swap(struct ttm_pool *pool, struct
> > page *p)
> > +{
> > +   unsigned int order = ttm_pool_page_order(pool, p);
> > +   pgoff_t nr;
> > +
> > +   if (!order)
> > +   return;
> > +
> > +   split_page(p, order);
> > +   nr = 1UL << order;
> > +   while (nr--)
> > +   (p++)->private = 0;
> > +}
> > +
> > +/**
> > + * DOC: Partial backup and restoration of a struct ttm_tt.
> > + *
> > + * Swapout using ttm_backup::ops::backup_page() and swapin using
> > + * ttm_backup::ops::copy_backed_up_page() may fail.
> > + * The former most likely due to lack of swap-space or memory, the
> > latter due
> > + * to lack of memory or because of signal interruption during
> > waits.
> > + *
> > + * Backupfailure is easily handled by using a ttm_tt pages vector
> > that holds
> > + * both swap entries and page pointers. This has to be taken into
> > account when
> > + * restoring such a ttm_tt from backup, and when freeing it while
> > backed up.
> > + * When restoring, for simplicity, new pages are actually
> > allocated from the
> > + * pool and the contents of any old pages are copied in and then
> > the old pages
> > + * are released.
> > + *
> > + * For restoration failures, the struct ttm_pool_tt_restore holds
> >

Re: Switch reference counting to GEM instead of TTM

2024-08-16 Thread Thomas Hellström
On Tue, 2024-07-16 at 14:35 +0200, Christian König wrote:
> Hello everyone,
> 
> to make use of drm_exec it is necessary to have TTM drivers actually
> use
> the GEM reference count instead of the TTM one.
> 
> This patch set is a start to do that. It switches all uses of
> ttm_bo_get/put to the GEM counterpart and then makes ttm_bo_get
> private
> to TTM.

For xe
Acked-by: Thomas Hellström 


> 
> Netx step is to completely remove the TTM refcounting.

This is probably going to be a bit complicated, and in particular IMO
we must ensure that the refcount resurrection doesn't leak to the gem
refcount and annotate the driver callbacks that might get called with
deleted (gem refcount 0) objects.

/Thomas


> 
> Please review and/or comment.
> 
> Cheers,
> Christian.
> 
> 



[PATCH 2/2] arm64: dts: qcom: sa8775p: fix the fastrpc label

2024-08-16 Thread Bartosz Golaszewski
From: Bartosz Golaszewski 

The fastrpc driver uses the label to determine the domain ID and create
the device nodes. It should be "cdsp1" as this is the engine we use here.

Fixes: df54dcb34ff2 ("arm64: dts: qcom: sa8775p: add ADSP, CDSP and GPDSP 
nodes")
Reported-by: Ekansh Gupta 
Signed-off-by: Bartosz Golaszewski 
---
 arch/arm64/boot/dts/qcom/sa8775p.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/qcom/sa8775p.dtsi 
b/arch/arm64/boot/dts/qcom/sa8775p.dtsi
index 801e8a92359d..5b9b68c634f5 100644
--- a/arch/arm64/boot/dts/qcom/sa8775p.dtsi
+++ b/arch/arm64/boot/dts/qcom/sa8775p.dtsi
@@ -4046,7 +4046,7 @@ IPCC_MPROC_SIGNAL_GLINK_QMP
fastrpc {
compatible = "qcom,fastrpc";
qcom,glink-channels = 
"fastrpcglink-apps-dsp";
-   label = "cdsp";
+   label = "cdsp1";
#address-cells = <1>;
#size-cells = <0>;
 
-- 
2.43.0



[PATCH 1/2] dt-bindings: misc: qcom,fastrpc: document new domain ID

2024-08-16 Thread Bartosz Golaszewski
From: Bartosz Golaszewski 

Add "cdsp1" as the new supported label for the CDSP1 fastrpc domain.

Signed-off-by: Bartosz Golaszewski 
---
 Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml 
b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
index c27a8f33d8d7..2a5b18982804 100644
--- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
+++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
@@ -26,6 +26,7 @@ properties:
   - mdsp
   - sdsp
   - cdsp
+  - cdsp1
 
   memory-region:
 maxItems: 1
-- 
2.43.0



Re: [PATCH 1/2] dt-bindings: misc: qcom, fastrpc: document new domain ID

2024-08-16 Thread Krzysztof Kozlowski
On 16/08/2024 12:23, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski 
> 
> Add "cdsp1" as the new supported label for the CDSP1 fastrpc domain.
> 
> Signed-off-by: Bartosz Golaszewski 
> ---
>  Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml 
> b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> index c27a8f33d8d7..2a5b18982804 100644
> --- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> +++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> @@ -26,6 +26,7 @@ properties:
>- mdsp
>- sdsp
>- cdsp
> +  - cdsp1

Are there more than one cdsp domains? Why adding suffixes? Driver source
code does not have "cdsp1" domain, so this is confusing.

Best regards,
Krzysztof



Re: [PATCH net-next v19 06/13] memory-provider: dmabuf devmem memory provider

2024-08-16 Thread Mina Almasry
On Thu, Aug 15, 2024 at 9:22 PM Jakub Kicinski  wrote:
>
> On Wed, 14 Aug 2024 17:32:53 +0100 Pavel Begunkov wrote:
> > > This is where I get a bit confused. Jakub did mention that it is
> > > desirable for core to verify that the driver did the right thing,
> > > instead of trusting that a driver did the right thing without
> > > verifying. Relying on a flag from the driver opens the door for the
> > > driver to say "I support this" but actually not create the mp
> > > page_pool. In my mind the explicit check is superior to getting
> > > feedback from the driver.
> >
> > You can apply the same argument to anything, but not like
> > after each for example ->ndo_start_xmit we dig into the
> > interface's pending queue to make sure it was actually queued.
> >
> > And even if you check that there is a page pool, the driver
> > can just create an empty pool that it'll never use. There
> > are always ways to make it wrong.
> >
> > Yes, there is a difference, and I'm not against it as a
> > WARN_ON_ONCE after failing it in a more explicit way.
> >
> > Jakub might have a different opinion on how it should look
> > like, and we can clarify on that, but I do believe it's a
> > confusing interface that can be easily made better.
>
> My queue API RFC patches had configuration arguments, not sure if this
> is the right version but you'll get the idea:
> https://github.com/kuba-moo/linux/blob/qcfg/include/net/netdev_cfg.h#L43-L50
> This way we can _tell_ the driver what the config should be. That part
> got lost somewhere along the way, because perhaps in its embryonic form
> it doesn't make sense.
>
> We can bring it back, add HDS with threshold of 0, to it, and a bit for
> non-readable memory. On top of that "capability bits" in struct
> netdev_queue_mgmt_ops to mark that the driver pays attention to particular
> fields of the config.
>
> Not sure if it should block the series, but that'd be the way I'd do it
> (for now?)
>

I'm not sure I want to go into a rabbit hole of adding configuration
via the queue API, blocking this series . We had discussed this months
back and figured that it's a significant undertaking on its own. I'm
not sure GVE has HDS threshold capability for example, and I'm also
not sure how to coexist header split negotiability via the queue API
when an ethtool API exists alongside it. I think this is worthy of
separating in its own follow up series.

For now detecting that the driver was able to create the page_pool
with the correct memory provider in core should be sufficient. Also
asking the driver to set a
netdev_rx_queue->unreadable_netmem_supported flag should also be
sufficient. I've implemented both locally and they work well.

> I'd keep the current check with a WARN_ON_ONCE(), tho.
> Given the absence of tests driver developers can use.
> Especially those who _aren't_ supporting the feature.
>

Yes what I have locally is the driver setting
netdev_rx_queue->unreadable_netmem_supported when header split is
turned on, and additionally a WARN_ON_ONCE around the check in core. I
was about to send that when I read your email. I'm hoping we don't
have to go through the scope creep of adding configuration via the
queue API, which I think is a very significant undertaking.

> > > and cons to each approach; I don't see a showstopping reason to go
> > > with one over the other.
> > >
> > >> And page_pool_check_memory_provider() is not that straightforward,
> > >> it doesn't walk through pools of a queue.
> > >
> > > Right, we don't save the pp of a queue, only a netdev. The outer loop
> > > checks all the pps of the netdev to find one with the correct binding,
> > > and the inner loop checks that this binding is attached to the correct
> > > queue.
> >
> > That's the thing, I doubt about the second part.
> >
> > net_devmem_bind_dmabuf_to_queue() {
> >   err = xa_alloc(&binding->bound_rxqs, &xa_idx, rxq);
> >   if (err)
> >   return err;
> >
> >   netdev_rx_queue_restart();
> >
> >   // page_pool_check_memory_provider
> >   ...
> >   xa_for_each(&binding->bound_rxqs, xa_idx, binding_rxq) {
> >   if (rxq == binding_rxq)
> >   return success;
> > }
> >
> > Can't b4 the patches for some reason, but that's the highlight
> > from the patchset, correct me if I'm wrong. That xa_for_each
> > check is always true because you put the queue in there right
> > before it, and I don't that anyone could've erased it.
> >
> > The problem here is that it seems the ->bound_rxqs state doesn't
> > depend on what page pools were actually created and with what mp.
>
> FWIW I don't understand the point of walking the xa either.
> Just check the queue number of the pp you found matches,
> page pool params are saved in the page pool. No?
>

Yes, I changed this check to check pool->p.queue, and it works fine.

-- 
Thanks,
Mina


Re: [PATCH 4/7] drm/msm/A6xx: Implement preemption for A7XX targets

2024-08-16 Thread kernel test robot
Hi Antonino,

kernel test robot noticed the following build warnings:

[auto build test WARNING on 7c626ce4bae1ac14f60076d00eafe71af30450ba]

url:
https://github.com/intel-lab-lkp/linux/commits/Antonino-Maniscalco/drm-msm-Fix-bv_fence-being-used-as-bv_rptr/20240816-023442
base:   7c626ce4bae1ac14f60076d00eafe71af30450ba
patch link:
https://lore.kernel.org/r/20240815-preemption-a750-t-v1-4-7bda26c34037%40gmail.com
patch subject: [PATCH 4/7] drm/msm/A6xx: Implement preemption for A7XX targets
config: i386-buildonly-randconfig-001-20240816 
(https://download.01.org/0day-ci/archive/20240816/202408161951.81zgvcj5-...@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20240816/202408161951.81zgvcj5-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202408161951.81zgvcj5-...@intel.com/

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/msm/adreno/a6xx_preempt.c: In function 'update_wptr':
>> drivers/gpu/drm/msm/adreno/a6xx_preempt.c:49:24: warning: unused variable 
>> 'cur_wptr' [-Wunused-variable]
  49 | uint32_t wptr, cur_wptr;
 |^~~~


vim +/cur_wptr +49 drivers/gpu/drm/msm/adreno/a6xx_preempt.c

44  
45  /* Write the most recent wptr for the given ring into the hardware */
46  static inline void update_wptr(struct msm_gpu *gpu, struct 
msm_ringbuffer *ring)
47  {
48  unsigned long flags;
  > 49  uint32_t wptr, cur_wptr;
50  
51  if (!ring)
52  return;
53  
54  spin_lock_irqsave(&ring->preempt_lock, flags);
55  
56  if (ring->skip_inline_wptr) {
57  wptr = get_wptr(ring);
58  
59  gpu_write(gpu, REG_A6XX_CP_RB_WPTR, wptr);
60  
61  ring->skip_inline_wptr = false;
62  }
63  
64  spin_unlock_irqrestore(&ring->preempt_lock, flags);
65  }
66  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


Re: [PATCH v3 RESEND 2/2] drm/bridge: imx: Add i.MX93 parallel display format configuration support

2024-08-16 Thread Krzysztof Kozlowski
On 16/08/2024 11:44, Liu Ying wrote:
> On 08/16/2024, Krzysztof Kozlowski wrote:
>> On 16/08/2024 10:09, Liu Ying wrote:
>>> NXP i.MX93 mediamix blk-ctrl contains one DISPLAY_MUX register which
>>> configures parallel display format by using the "PARALLEL_DISP_FORMAT"
>>> field. Add a DRM bridge driver to support the display format configuration.
>>>
>>> Signed-off-by: Liu Ying 
>>> ---
>>
>> ...
>>
>>> +
>>> +static int imx93_pdfc_bridge_probe(struct platform_device *pdev)
>>> +{
>>> +   struct device *dev = &pdev->dev;
>>> +   struct imx93_pdfc *pdfc;
>>> +   int ret;
>>> +
>>> +   pdfc = devm_kzalloc(dev, sizeof(*pdfc), GFP_KERNEL);
>>> +   if (!pdfc)
>>> +   return -ENOMEM;
>>> +
>>> +   pdfc->regmap = syscon_node_to_regmap(dev->of_node->parent);
>>> +   if (IS_ERR(pdfc->regmap)) {
>>> +   ret = PTR_ERR(pdfc->regmap);
>>> +   if (ret != -EPROBE_DEFER)
>>> +   DRM_DEV_ERROR(dev, "failed to get regmap: %d\n", ret);
>>> +   return ret;
>>
>> Nope, you just open-coded dev_err_probe. Syntax is - return
>> dev_err_probe(). if you need wrapper for DRM, add such.
> 
> Will use dev_err_probe().
> 
>>
>>> +   }
>>> +
>>> +   pdfc->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
>>> +   if (IS_ERR(pdfc->next_bridge)) {
>>> +   ret = PTR_ERR(pdfc->next_bridge);
>>> +   if (ret != -EPROBE_DEFER)
>>> +   DRM_DEV_ERROR(dev, "failed to get next bridge: %d\n", 
>>> ret);
>>> +   return ret;
>>
>> Ditto
> 
> Will use dev_err_probe().
> 
>>
>>
>>> +   }
>>> +
>>
>> ...
>>
>>> +MODULE_DESCRIPTION("NXP i.MX93 parallel display format configuration 
>>> driver");
>>> +MODULE_AUTHOR("Liu Ying ");
>>> +MODULE_LICENSE("GPL v2");
>>> +MODULE_ALIAS("platform:" DRIVER_NAME);
>>
>> Which other driver needs this platform alias?
> 
> Quote include/linux/module.h:
> 
> "
> /* For userspace: you can also call me... */  
>
> #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)   
> "
> 
> Anything wrong with using MODULE_ALIAS() here?

Yes, it redundant. Do not answer with question to the question.

Are you adding random code that you cannot justify? It looks like this
if you cannot answer why do you need it.

Form letter:

You should not need MODULE_ALIAS() in normal cases. If you need it,
usually it means your device ID table is wrong (e.g. misses either
entries or MODULE_DEVICE_TABLE()). MODULE_ALIAS() is not a substitute
for incomplete ID table.

Best regards,
Krzysztof



Re: [PATCH 1/2] dt-bindings: misc: qcom, fastrpc: document new domain ID

2024-08-16 Thread Bartosz Golaszewski
On Fri, Aug 16, 2024 at 1:21 PM Krzysztof Kozlowski  wrote:
>
> On 16/08/2024 12:23, Bartosz Golaszewski wrote:
> > From: Bartosz Golaszewski 
> >
> > Add "cdsp1" as the new supported label for the CDSP1 fastrpc domain.
> >
> > Signed-off-by: Bartosz Golaszewski 
> > ---
> >  Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml 
> > b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> > index c27a8f33d8d7..2a5b18982804 100644
> > --- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> > +++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
> > @@ -26,6 +26,7 @@ properties:
> >- mdsp
> >- sdsp
> >- cdsp
> > +  - cdsp1
>
> Are there more than one cdsp domains? Why adding suffixes? Driver source
> code does not have "cdsp1" domain, so this is confusing.
>
> Best regards,
> Krzysztof
>

It does, Srini picked up this patch earlier today. I'm not an expert
in fast RPC but it looks like the domain ID number matters here.

Bart

[1] 
https://lore.kernel.org/all/20240805-topic-sa8775p-iot-remoteproc-v4-4-86affdc72...@linaro.org/


[PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper

2024-08-16 Thread Thomas Zimmermann
The color mode specified on the kernel command line gives the user's
preferred color depth and number of bits per pixel. Move the
color-mode-to-format conversion form fbdev helpers into a 4CC helper,
so that is can be shared among DRM clients.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/drm_fb_helper.c | 70 +++--
 drivers/gpu/drm/drm_fourcc.c| 30 +-
 include/drm/drm_fourcc.h|  1 +
 3 files changed, 45 insertions(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 29c53f9f449c..af1fe79c701d 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1441,67 +1441,27 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo 
*var,
 EXPORT_SYMBOL(drm_fb_helper_pan_display);
 
 static uint32_t drm_fb_helper_find_format(struct drm_fb_helper *fb_helper, 
const uint32_t *formats,
- size_t format_count, uint32_t bpp, 
uint32_t depth)
+ size_t format_count, unsigned int 
color_mode)
 {
struct drm_device *dev = fb_helper->dev;
uint32_t format;
size_t i;
 
-   /*
-* Do not consider YUV or other complicated formats
-* for framebuffers. This means only legacy formats
-* are supported (fmt->depth is a legacy field), but
-* the framebuffer emulation can only deal with such
-* formats, specifically RGB/BGA formats.
-*/
-   format = drm_mode_legacy_fb_format(bpp, depth);
-   if (!format)
-   goto err;
+   format = drm_driver_color_mode_format(dev, color_mode);
+   if (!format) {
+   drm_info(dev, "unsupported color mode of %d\n", color_mode);
+   return DRM_FORMAT_INVALID;
+   }
 
for (i = 0; i < format_count; ++i) {
if (formats[i] == format)
return format;
}
-
-err:
-   /* We found nothing. */
-   drm_warn(dev, "bpp/depth value of %u/%u not supported\n", bpp, depth);
+   drm_warn(dev, "format %p4cc not supported\n", &format);
 
return DRM_FORMAT_INVALID;
 }
 
-static uint32_t drm_fb_helper_find_color_mode_format(struct drm_fb_helper 
*fb_helper,
-const uint32_t *formats, 
size_t format_count,
-unsigned int color_mode)
-{
-   struct drm_device *dev = fb_helper->dev;
-   uint32_t bpp, depth;
-
-   switch (color_mode) {
-   case 1:
-   case 2:
-   case 4:
-   case 8:
-   case 16:
-   case 24:
-   bpp = depth = color_mode;
-   break;
-   case 15:
-   bpp = 16;
-   depth = 15;
-   break;
-   case 32:
-   bpp = 32;
-   depth = 24;
-   break;
-   default:
-   drm_info(dev, "unsupported color mode of %d\n", color_mode);
-   return DRM_FORMAT_INVALID;
-   }
-
-   return drm_fb_helper_find_format(fb_helper, formats, format_count, bpp, 
depth);
-}
-
 static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
  struct drm_fb_helper_surface_size *sizes)
 {
@@ -1531,10 +1491,10 @@ static int __drm_fb_helper_find_sizes(struct 
drm_fb_helper *fb_helper,
if (!cmdline_mode->bpp_specified)
continue;
 
-   surface_format = 
drm_fb_helper_find_color_mode_format(fb_helper,
- 
plane->format_types,
- 
plane->format_count,
- 
cmdline_mode->bpp);
+   surface_format = drm_fb_helper_find_format(fb_helper,
+  
plane->format_types,
+  
plane->format_count,
+  
cmdline_mode->bpp);
if (surface_format != DRM_FORMAT_INVALID)
break; /* found supported format */
}
@@ -1544,10 +1504,10 @@ static int __drm_fb_helper_find_sizes(struct 
drm_fb_helper *fb_helper,
break; /* found supported format */
 
/* try preferred color mode */
-   surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
- 
plane->format_types,
- 
plane->format_count,
- 
fb_helper->preferred_bpp);
+

[PATCH 02/86] drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info

2024-08-16 Thread Thomas Zimmermann
Call vga_switcheroo_client_fb_set() with the PCI device from the
instance of struct fb_info. All fbdev clients now run these calls.
For non-PCI devices or drivers without vga-switcheroo, this does
nothing. For i915 and radeon, it allows these drivers to use a
common fbdev client.

The device is the same as the one stored in struct drm_client and
struct drm_fb_helper, so there is no difference in behavior. Some
NULL-pointer checks are being removed, where those pointers cannot
be NULL.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/drm_fb_helper.c | 15 +++
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index af1fe79c701d..13095d38aa42 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -562,8 +562,12 @@ EXPORT_SYMBOL(drm_fb_helper_release_info);
  */
 void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper)
 {
-   if (fb_helper && fb_helper->info)
-   unregister_framebuffer(fb_helper->info);
+   struct fb_info *info = fb_helper->info;
+   struct device *dev = info->device;
+
+   if (dev_is_pci(dev))
+   vga_switcheroo_client_fb_set(to_pci_dev(dev), NULL);
+   unregister_framebuffer(fb_helper->info);
 }
 EXPORT_SYMBOL(drm_fb_helper_unregister_info);
 
@@ -1615,6 +1619,7 @@ static int drm_fb_helper_single_fb_probe(struct 
drm_fb_helper *fb_helper)
struct drm_client_dev *client = &fb_helper->client;
struct drm_device *dev = fb_helper->dev;
struct drm_fb_helper_surface_size sizes;
+   struct fb_info *info;
int ret;
 
ret = drm_fb_helper_find_sizes(fb_helper, &sizes);
@@ -1632,9 +1637,11 @@ static int drm_fb_helper_single_fb_probe(struct 
drm_fb_helper *fb_helper)
 
strcpy(fb_helper->fb->comm, "[fbcon]");
 
+   info = fb_helper->info;
+
/* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */
-   if (dev_is_pci(dev->dev))
-   vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), 
fb_helper->info);
+   if (dev_is_pci(info->device))
+   vga_switcheroo_client_fb_set(to_pci_dev(info->device), info);
 
return 0;
 }
-- 
2.46.0



[PATCH 08/86] drm/arm/hdlcd: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The hdlcd driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Liviu Dudau 
---
 drivers/gpu/drm/arm/hdlcd_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index 32be9e370049..f5d358f3893b 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -23,6 +23,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -228,6 +229,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
 static const struct drm_driver hdlcd_driver = {
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops = &fops,
.name = "hdlcd",
.desc = "ARM HDLCD Controller DRM",
@@ -299,7 +301,7 @@ static int hdlcd_drm_bind(struct device *dev)
if (ret)
goto err_register;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 05/86] drm/fbdev-dma: Support struct drm_driver.fbdev_probe

2024-08-16 Thread Thomas Zimmermann
Rework fbdev probing to support fbdev_probe in struct drm_driver
and reimplement the old fb_probe callback on top of it. Provide an
initializer macro for struct drm_driver that sets the callback
according to the kernel configuration.

This change allows the common fbdev client to run on top of DMA-
based DRM drivers.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/drm_fbdev_dma.c | 60 -
 include/drm/drm_fbdev_dma.h | 12 +++
 2 files changed, 48 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 7ef5a48c8029..aeccf7f7a522 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -86,6 +86,40 @@ static const struct fb_ops drm_fbdev_dma_fb_ops = {
 
 static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
 struct drm_fb_helper_surface_size 
*sizes)
+{
+   return drm_fbdev_dma_driver_fbdev_probe(fb_helper, sizes);
+}
+
+static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
+struct drm_clip_rect *clip)
+{
+   struct drm_device *dev = helper->dev;
+   int ret;
+
+   /* Call damage handlers only if necessary */
+   if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+   return 0;
+
+   if (helper->fb->funcs->dirty) {
+   ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+   if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", 
ret))
+   return ret;
+   }
+
+   return 0;
+}
+
+static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
+   .fb_probe = drm_fbdev_dma_helper_fb_probe,
+   .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
+};
+
+/*
+ * struct drm_fb_helper
+ */
+
+int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+struct drm_fb_helper_surface_size *sizes)
 {
struct drm_client_dev *client = &fb_helper->client;
struct drm_device *dev = fb_helper->dev;
@@ -119,6 +153,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct 
drm_fb_helper *fb_helper,
goto err_drm_client_buffer_delete;
}
 
+   fb_helper->funcs = &drm_fbdev_dma_helper_funcs;
fb_helper->buffer = buffer;
fb_helper->fb = fb;
 
@@ -165,30 +200,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct 
drm_fb_helper *fb_helper,
drm_client_framebuffer_delete(buffer);
return ret;
 }
-
-static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
-struct drm_clip_rect *clip)
-{
-   struct drm_device *dev = helper->dev;
-   int ret;
-
-   /* Call damage handlers only if necessary */
-   if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
-   return 0;
-
-   if (helper->fb->funcs->dirty) {
-   ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
-   if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", 
ret))
-   return ret;
-   }
-
-   return 0;
-}
-
-static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
-   .fb_probe = drm_fbdev_dma_helper_fb_probe,
-   .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
-};
+EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
 
 /*
  * struct drm_client_funcs
diff --git a/include/drm/drm_fbdev_dma.h b/include/drm/drm_fbdev_dma.h
index 2da7ee784133..6ae4de46497c 100644
--- a/include/drm/drm_fbdev_dma.h
+++ b/include/drm/drm_fbdev_dma.h
@@ -4,12 +4,24 @@
 #define DRM_FBDEV_DMA_H
 
 struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
+int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+struct drm_fb_helper_surface_size *sizes);
+
+#define DRM_FBDEV_DMA_DRIVER_OPS \
+   .fbdev_probe = drm_fbdev_dma_driver_fbdev_probe
+
 void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp);
 #else
 static inline void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int 
preferred_bpp)
 { }
+
+#define DRM_FBDEV_DMA_DRIVER_OPS \
+   .fbdev_probe = NULL
+
 #endif
 
 #endif
-- 
2.46.0



[PATCH 04/86] drm: Add client-agnostic setup helper

2024-08-16 Thread Thomas Zimmermann
DRM may support multiple in-kernel clients that run as soon as a DRM
driver has been registered. To select the client(s) in a single place,
introduce drm_client_setup().

Drivers that call the new helper automatically instantiate the kernel's
configured default clients. Only fbdev emulation is currently supported.
Later versions can add support for DRM-based logging, a boot logo or even
a console.

Some drivers handle the color mode for clients internally. Provide the
helper drm_client_setup_with_color_mode() for them.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/Makefile   |  1 +
 drivers/gpu/drm/drm_client_setup.c | 55 ++
 include/drm/drm_client_setup.h | 12 +++
 3 files changed, 68 insertions(+)
 create mode 100644 drivers/gpu/drm/drm_client_setup.c
 create mode 100644 include/drm/drm_client_setup.h

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 0beb55d028a8..e7fc77d1d573 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -129,6 +129,7 @@ drm_kms_helper-y := \
drm_atomic_helper.o \
drm_atomic_state_helper.o \
drm_bridge_connector.o \
+   drm_client_setup.o \
drm_crtc_helper.o \
drm_damage_helper.o \
drm_encoder_slave.o \
diff --git a/drivers/gpu/drm/drm_client_setup.c 
b/drivers/gpu/drm/drm_client_setup.c
new file mode 100644
index ..2e3315f5c3e2
--- /dev/null
+++ b/drivers/gpu/drm/drm_client_setup.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: MIT
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/**
+ * drm_client_setup() - Setup in-kernel DRM clients
+ * @dev: DRM device
+ * @format: Preferred color format for the device. Use NULL, unless
+ *  there is clearly a driver-preferred format.
+ *
+ * This function sets up the in-kernel DRM clients. Restore, hotplug
+ * events and teardown are all taken care of.
+ *
+ * Drivers should call drm_client_setup() after registering the new
+ * DRM device with drm_dev_register(). This function is safe to call
+ * even when there are no connectors present. Setup will be retried
+ * on the next hotplug event.
+ *
+ * The clients are destroyed by drm_dev_unregister().
+ */
+void drm_client_setup(struct drm_device *dev, const struct drm_format_info 
*format)
+{
+   int ret;
+
+   if (!format)
+   format = drm_format_info(DRM_FORMAT_XRGB);
+
+   ret = drm_fbdev_client_setup(dev, format);
+   if (ret)
+   drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
+}
+EXPORT_SYMBOL(drm_client_setup);
+
+/**
+ * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color 
mode
+ * @dev: DRM device
+ * @color_mode: Preferred color mode for the device
+ *
+ * This function sets up the in-kernel DRM clients. It is equivalent
+ * to drm_client_setup(), but expects a color mode as second argument.
+ *
+ * Do not use this function in new drivers. Prefer drm_client_setup() with a
+ * format of NULL.
+ */
+void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int 
color_mode)
+{
+   uint32_t fmt = drm_driver_color_mode_format(dev, color_mode);
+
+   drm_client_setup(dev, drm_format_info(fmt));
+}
+EXPORT_SYMBOL(drm_client_setup_with_color_mode);
diff --git a/include/drm/drm_client_setup.h b/include/drm/drm_client_setup.h
new file mode 100644
index ..f5fd1fabd4b1
--- /dev/null
+++ b/include/drm/drm_client_setup.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_CLIENT_SETUP_H
+#define DRM_CLIENT_SETUP_H
+
+struct drm_device;
+struct drm_format_info;
+
+void drm_client_setup(struct drm_device *dev, const struct drm_format_info 
*format);
+void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int 
color_mode);
+
+#endif
-- 
2.46.0



[PATCH 00/86] drm: Provide client setup helper and convert drivers

2024-08-16 Thread Thomas Zimmermann
Provide drm_client_setup() to initialize in-kernel DRM clients. Then
convert all drivers to the new interface. Remove old interfaces for
the fbdev client.

So far, the only supported DRM client in the kernel is for fbdev
emulation with its fbcon support. Long term, we want to move away
from fbcon. Possible replacements are DRM-based loggers, boot-up
logos or maybe even a console. The exact kind of client should be
configurable by the user. You can find examples of such clients at
[1] and [2].

To do this, we need one single interface for drivers to initialize
the configured in-kernel clients, replacing the current call to
initialize fbdev emulation. The fbdev emulation also depends on the
DRM driver's management, so drivers differ in what fbdev code they
run. We need to abstract this as well.

This patchset addresses these topics. While there are many patches,
most of them are small, straight-forward changes to drivers or
rearrange existing code.

Patches 1 to 3 add a driver-neutral setup function for the fbdev
client. The new callback fbdev_probe in struct drm_driver creates
the GEM buffer for fbdev output. It replaces the existing callback
fb_probe from struct drm_fb_helper_funcs, which currently does the
same. The client code is equal to code in exisisting fbdev emulation,
except for its use of fbdev_probe.

Patch 4 adds drm_client_setup(), a client-agnostic interface to
initialize the in-kernel DRM clients. It only supports the new fbdev
emulation setup, but additional clients will be added here. Hopefully
this will hide future changes to DRM client initialization from
drivers.

Patches 5 to 49 rework all drivers with GEM memory management based
on DMA helpers. This is fairly straigh-forward. The fbdev-dma helpers
provide an implementation of the fbdev_probe helpers. Each driver
sets the new callback in its instance of struct drm_driver and calls
drm_client_setup(). Then the old fbdev-dma client goes away.

Patches 50 to 63 do the same for drivers with SHMEM-based GEM memory
management. The fbdev client code is again the same as before, except
for the fbdev_probe callback.

Patches 64 to 73 do the same for drivers with TTM-based GEM memory
management.

Patches 74 to 85 do the same for the remaining drivers with custom
fbdev emulation. As before, the new fbdev client code is mostly the
same the old one; except for the fbdev_probe function. The changes
for i915/xe and omapdrm are a bit mor einvolved, but nothing too
complicated.

Patch 86 removes the obsolete fb_probe callback from struct
drm_fb_helper_funcs.

This patchset has been tested on various hardware with the various
memory managers involved.

[1] 
https://lore.kernel.org/dri-devel/20240801100640.462606-4-jfale...@redhat.com/
[2] https://lists.freedesktop.org/archives/dri-devel/2019-March/212113.html

Thomas Zimmermann (86):
  drm/fbdev-helper: Move color-mode lookup into 4CC format helper
  drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info
  drm/fbdev: Add memory-agnostic fbdev client
  drm: Add client-agnostic setup helper
  drm/fbdev-dma: Support struct drm_driver.fbdev_probe
  drm/arcgpu: Run DRM default client setup
  drm/arm/komeda: Run DRM default client setup
  drm/arm/hdlcd: Run DRM default client setup
  drm/arm/malidp: Run DRM default client setup
  drm/aspeed: Run DRM default client setup
  drm/atmel-hdlcd: Run DRM default client setup
  drm/fsl-dcu: Run DRM default client setup
  drm/hisilicon/kirin: Run DRM default client setup
  drm/hx8357d: Run DRM default client setup
  drm/ili9163: Run DRM default client setup
  drm/ili9225: Run DRM default client setup
  drm/ili9341: Run DRM default client setup
  drm/ili9486: Run DRM default client setup
  drm/imx/dcss: Run DRM default client setup
  drm/imx/ipuv3: Run DRM default client setup
  drm/imx/lcdc: Run DRM default client setup
  drm/ingenic: Run DRM default client setup
  drm/kmb: Run DRM default client setup
  drm/logicvc: Run DRM default client setup
  drm/mcde: Run DRM default client setup
  drm/mediatek: Run DRM default client setup
  drm/meson: Run DRM default client setup
  drm/mi0283qt: Run DRM default client setup
  drm/mxsfb/lcdif: Run DRM default client setup
  drm/msxfb: Run DRM default client setup
  drm/panel/ili9341: Run DRM default client setup
  drm/panel-mipi-dbi: Run DRM default client setup
  drm/pl111: Run DRM default client setup
  drm/renesas/rcar-du: Run DRM default client setup
  drm/renesas/rz-du: Run DRM default client setup
  drm/renesas/shmobile: Run DRM default client setup
  drm/repaper: Run DRM default client setup
  drm/rockchip: Run DRM default client setup
  drm/sti: Run DRM default client setup
  drm/stm: Run DRM default client setup
  drm/sun4i: Run DRM default client setup
  drm/tidss: Run DRM default client setup
  drm/tilcdc: Run DRM default client setup
  drm/st7586: Run DRM default client setup
  drm/st7735r: Run DRM default client setup
  drm/tve200: Run DRM default client setup
  drm/vc4: Run DRM default client setup
  drm

[PATCH 03/86] drm/fbdev: Add memory-agnostic fbdev client

2024-08-16 Thread Thomas Zimmermann
Add an fbdev client that can work with any memory manager. The
client implementation is ther same as existing code in fbdev-dma or
fbdev-shmem.

Provide struct drm_driver.fbdev_probe for the new client to allocate
the surface GEM buffer. The new callback replaces fb_probe of struct
drm_fb_helper_funcs, which does the same.

To use the new client, DRM drivers set fbdev_probe in their struct
drm_driver instance and call drm_fbdev_client_setup(). Probing and
creating the fbdev surface buffer is now independent from the other
operations in struct drm_fb_helper.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/Makefile   |   4 +-
 drivers/gpu/drm/drm_fb_helper.c|  15 ++--
 drivers/gpu/drm/drm_fbdev_client.c | 132 +
 include/drm/drm_drv.h  |  18 
 include/drm/drm_fbdev_client.h |  19 +
 5 files changed, 181 insertions(+), 7 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_fbdev_client.c
 create mode 100644 include/drm/drm_fbdev_client.h

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 68cc9258ffc4..0beb55d028a8 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -144,7 +144,9 @@ drm_kms_helper-y := \
drm_self_refresh_helper.o \
drm_simple_kms_helper.o
 drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
-drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
+drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
+   drm_fbdev_client.o \
+   drm_fb_helper.o
 obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
 
 #
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 13095d38aa42..31e255c2b04a 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -492,8 +492,8 @@ EXPORT_SYMBOL(drm_fb_helper_init);
  * @fb_helper: driver-allocated fbdev helper
  *
  * A helper to alloc fb_info and the member cmap. Called by the driver
- * within the fb_probe fb_helper callback function. Drivers do not
- * need to release the allocated fb_info structure themselves, this is
+ * within the struct &drm_driver.fbdev_probe callback function. Drivers do
+ * not need to release the allocated fb_info structure themselves, this is
  * automatically done when calling drm_fb_helper_fini().
  *
  * RETURNS:
@@ -1612,7 +1612,7 @@ static int drm_fb_helper_find_sizes(struct drm_fb_helper 
*fb_helper,
 
 /*
  * Allocates the backing storage and sets up the fbdev info structure through
- * the ->fb_probe callback.
+ * the ->fbdev_probe callback.
  */
 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 {
@@ -1631,7 +1631,10 @@ static int drm_fb_helper_single_fb_probe(struct 
drm_fb_helper *fb_helper)
}
 
/* push down into drivers */
-   ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
+   if (dev->driver->fbdev_probe)
+   ret = dev->driver->fbdev_probe(fb_helper, &sizes);
+   else
+   ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
if (ret < 0)
return ret;
 
@@ -1705,7 +1708,7 @@ static void drm_fb_helper_fill_var(struct fb_info *info,
  * instance and the drm framebuffer allocated in &drm_fb_helper.fb.
  *
  * Drivers should call this (or their equivalent setup code) from their
- * &drm_fb_helper_funcs.fb_probe callback after having allocated the fbdev
+ * &drm_driver.fbdev_probe callback after having allocated the fbdev
  * backing storage framebuffer.
  */
 void drm_fb_helper_fill_info(struct fb_info *info,
@@ -1861,7 +1864,7 @@ __drm_fb_helper_initial_config_and_unlock(struct 
drm_fb_helper *fb_helper)
  * Note that this also registers the fbdev and so allows userspace to call into
  * the driver through the fbdev interfaces.
  *
- * This function will call down into the &drm_fb_helper_funcs.fb_probe callback
+ * This function will call down into the &drm_driver.fbdev_probe callback
  * to let the driver allocate and initialize the fbdev info structure and the
  * drm framebuffer used to back the fbdev. drm_fb_helper_fill_info() is 
provided
  * as a helper to setup simple default values for the fbdev info structure.
diff --git a/drivers/gpu/drm/drm_fbdev_client.c 
b/drivers/gpu/drm/drm_fbdev_client.c
new file mode 100644
index ..5fd07539c382
--- /dev/null
+++ b/drivers/gpu/drm/drm_fbdev_client.c
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: MIT
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/*
+ * struct drm_client_funcs
+ */
+
+static void drm_fbdev_client_unregister(struct drm_client_dev *client)
+{
+   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+   if (fb_helper->info) {
+   drm_fb_helper_unregister_info(fb_helper);
+   } else {
+   drm_client_release(&fb_helper->client);
+   drm_fb_helper_unprepare(fb_helper);
+   kfree(fb_helper);
+   }
+}
+
+static int drm_fbdev_client_restore(

[PATCH 06/86] drm/arcgpu: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Alexey Brodkin 
---
 drivers/gpu/drm/tiny/arcpgu.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/arcpgu.c b/drivers/gpu/drm/tiny/arcpgu.c
index 4f8f3172379e..5f74b4576522 100644
--- a/drivers/gpu/drm/tiny/arcpgu.c
+++ b/drivers/gpu/drm/tiny/arcpgu.c
@@ -7,6 +7,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -371,6 +372,7 @@ static const struct drm_driver arcpgu_drm_driver = {
.patchlevel = 0,
.fops = &arcpgu_drm_ops,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 #ifdef CONFIG_DEBUG_FS
.debugfs_init = arcpgu_debugfs_init,
 #endif
@@ -394,7 +396,7 @@ static int arcpgu_probe(struct platform_device *pdev)
if (ret)
goto err_unload;
 
-   drm_fbdev_dma_setup(&arcpgu->drm, 16);
+   drm_client_setup(&arcpgu->drm, drm_format_info(DRM_FORMAT_RGB565));
 
return 0;
 
-- 
2.46.0



[PATCH 15/86] drm/ili9163: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/tiny/ili9163.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9163.c b/drivers/gpu/drm/tiny/ili9163.c
index 86f9d8834901..5eb39ca1a855 100644
--- a/drivers/gpu/drm/tiny/ili9163.c
+++ b/drivers/gpu/drm/tiny/ili9163.c
@@ -8,6 +8,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -113,6 +114,7 @@ static struct drm_driver ili9163_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &ili9163_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "ili9163",
.desc   = "Ilitek ILI9163",
@@ -185,7 +187,7 @@ static int ili9163_probe(struct spi_device *spi)
if (ret)
return ret;
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 07/86] drm/arm/komeda: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The komeda driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Liviu Dudau 
---
 drivers/gpu/drm/arm/display/komeda/komeda_drv.c | 4 ++--
 drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index 55c3773befde..6d475bb34002 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -9,7 +9,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 #include 
 #include 
 #include "komeda_dev.h"
@@ -84,7 +84,7 @@ static int komeda_platform_probe(struct platform_device *pdev)
}
 
dev_set_drvdata(dev, mdrv);
-   drm_fbdev_dma_setup(&mdrv->kms->base, 32);
+   drm_client_setup(&mdrv->kms->base, NULL);
 
return 0;
 
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
index fe46b0ebefea..f3314261925c 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -58,6 +59,7 @@ static irqreturn_t komeda_kms_irq_handler(int irq, void *data)
 static const struct drm_driver komeda_kms_driver = {
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(komeda_gem_dma_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops = &komeda_cma_fops,
.name = "komeda",
.desc = "Arm Komeda Display Processor driver",
-- 
2.46.0



[PATCH 09/86] drm/arm/malidp: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The malidp driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Liviu Dudau 
---
 drivers/gpu/drm/arm/malidp_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/malidp_drv.c
index 6682131d2910..4cb25004b84f 100644
--- a/drivers/gpu/drm/arm/malidp_drv.c
+++ b/drivers/gpu/drm/arm/malidp_drv.c
@@ -18,6 +18,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -562,6 +563,7 @@ static void malidp_debugfs_init(struct drm_minor *minor)
 static const struct drm_driver malidp_driver = {
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(malidp_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 #ifdef CONFIG_DEBUG_FS
.debugfs_init = malidp_debugfs_init,
 #endif
@@ -852,7 +854,7 @@ static int malidp_bind(struct device *dev)
if (ret)
goto register_fail;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 10/86] drm/aspeed: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The aspeed driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Joel Stanley 
Cc: Andrew Jeffery 
---
 drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c 
b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
index a7a6b70220eb..e1efe08fdfad 100644
--- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
+++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
@@ -14,6 +14,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -339,7 +340,7 @@ static int aspeed_gfx_probe(struct platform_device *pdev)
if (ret)
goto err_unload;
 
-   drm_fbdev_dma_setup(&priv->drm, 32);
+   drm_client_setup(&priv->drm, NULL);
return 0;
 
 err_unload:
-- 
2.46.0



[PATCH 13/86] drm/hisilicon/kirin: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The kirin driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Xinliang Liu 
Cc: Tian Tao 
Cc: Xinwei Kong 
Cc: Sumit Semwal 
Cc: Yongqin Liu 
Cc: John Stultz 
---
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 2 ++
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 4 ++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c 
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
index 871f79a6b17e..5616c3917c03 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
@@ -25,6 +25,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -925,6 +926,7 @@ static const struct drm_driver ade_driver = {
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops = &ade_fops,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.name = "kirin",
.desc = "Hisilicon Kirin620 SoC DRM Driver",
.date = "20150718",
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c 
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
index 12666985686b..86a3a1faff49 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
@@ -18,8 +18,8 @@
 #include 
 
 #include 
+#include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -237,7 +237,7 @@ static int kirin_drm_bind(struct device *dev)
if (ret)
goto err_kms_cleanup;
 
-   drm_fbdev_dma_setup(drm_dev, 32);
+   drm_client_setup(drm_dev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 14/86] drm/hx8357d: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/tiny/hx8357d.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/hx8357d.c b/drivers/gpu/drm/tiny/hx8357d.c
index 2e631282edeb..6b0d1846cfcf 100644
--- a/drivers/gpu/drm/tiny/hx8357d.c
+++ b/drivers/gpu/drm/tiny/hx8357d.c
@@ -17,6 +17,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -194,6 +195,7 @@ static const struct drm_driver hx8357d_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &hx8357d_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "hx8357d",
.desc   = "HX8357D",
@@ -256,7 +258,7 @@ static int hx8357d_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 11/86] drm/atmel-hdlcd: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Sam Ravnborg 
Cc: Boris Brezillon 
Cc: Nicolas Ferre 
Cc: Alexandre Belloni 
Cc: Claudiu Beznea 
---
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c 
b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 9ce429f889ca..f529352d4bb2 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -18,8 +18,10 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -865,7 +867,7 @@ static int atmel_hlcdc_dc_drm_probe(struct platform_device 
*pdev)
if (ret)
goto err_unload;
 
-   drm_fbdev_dma_setup(ddev, 24);
+   drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB888));
 
return 0;
 
-- 
2.46.0



[PATCH 16/86] drm/ili9225: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: David Lechner 
---
 drivers/gpu/drm/tiny/ili9225.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9225.c b/drivers/gpu/drm/tiny/ili9225.c
index b6b7a49147bf..875e2d09729a 100644
--- a/drivers/gpu/drm/tiny/ili9225.c
+++ b/drivers/gpu/drm/tiny/ili9225.c
@@ -17,6 +17,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -360,6 +361,7 @@ static const struct drm_driver ili9225_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &ili9225_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.name   = "ili9225",
.desc   = "Ilitek ILI9225",
.date   = "20171106",
@@ -426,7 +428,7 @@ static int ili9225_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 19/86] drm/imx/dcss: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The dcss driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Laurentiu Palcu 
Cc: Lucas Stach 
Cc: Shawn Guo 
Cc: Sascha Hauer 
Cc: Pengutronix Kernel Team 
Cc: Fabio Estevam 
---
 drivers/gpu/drm/imx/dcss/dcss-kms.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.c 
b/drivers/gpu/drm/imx/dcss/dcss-kms.c
index d0ea4e97cded..3ec721afc30c 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-kms.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-kms.c
@@ -6,6 +6,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -28,6 +29,7 @@ static const struct drm_mode_config_funcs 
dcss_drm_mode_config_funcs = {
 static const struct drm_driver dcss_kms_driver = {
.driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &dcss_cma_fops,
.name   = "imx-dcss",
.desc   = "i.MX8MQ Display Subsystem",
@@ -145,7 +147,7 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
if (ret)
goto cleanup_crtc;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return kms;
 
-- 
2.46.0



[PATCH 12/86] drm/fsl-dcu: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup_with_color_mode() to run the kernel's default
client setup for DRM. Set fbdev_probe in struct drm_driver, so that
the client setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Stefan Agner 
Cc: Alison Wang 
---
 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c 
b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index ab6c0c6cd0e2..2b3f15f0dc56 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -19,6 +19,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -156,6 +157,7 @@ static const struct drm_driver fsl_dcu_drm_driver = {
.load   = fsl_dcu_load,
.unload = fsl_dcu_unload,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &fsl_dcu_drm_fops,
.name   = "fsl-dcu-drm",
.desc   = "Freescale DCU DRM",
@@ -333,7 +335,7 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
if (ret < 0)
goto put;
 
-   drm_fbdev_dma_setup(drm, legacyfb_depth);
+   drm_client_setup_with_color_mode(drm, legacyfb_depth);
 
return 0;
 
-- 
2.46.0



[PATCH 26/86] drm/mediatek: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The mediatek driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Chun-KuaIng Hu 
Cc: Philipp Zabel 
Cc: Matthias Brugger 
Cc: AngeloGioacchino Del Regno 
---
 drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c 
b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 77b50c56c124..b1309a70fdcd 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -14,6 +14,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -610,6 +611,7 @@ static const struct drm_driver mtk_drm_driver = {
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 
.dumb_create = mtk_gem_dumb_create,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 
.gem_prime_import = mtk_gem_prime_import,
.gem_prime_import_sg_table = mtk_gem_prime_import_sg_table,
@@ -666,7 +668,7 @@ static int mtk_drm_bind(struct device *dev)
if (ret < 0)
goto err_deinit;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 18/86] drm/ili9486: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Kamlesh Gurudasani 
---
 drivers/gpu/drm/tiny/ili9486.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9486.c b/drivers/gpu/drm/tiny/ili9486.c
index 70d366260041..7e46a720d5e2 100644
--- a/drivers/gpu/drm/tiny/ili9486.c
+++ b/drivers/gpu/drm/tiny/ili9486.c
@@ -15,6 +15,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -172,6 +173,7 @@ static const struct drm_driver ili9486_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &ili9486_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "ili9486",
.desc   = "Ilitek ILI9486",
@@ -247,7 +249,7 @@ static int ili9486_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 20/86] drm/imx/ipuv3: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup_with_color_mode() to run the kernel's default
client setup for DRM. Set fbdev_probe in struct drm_driver, so that
the client setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Philipp Zabel 
Cc: Shawn Guo 
Cc: Sascha Hauer 
Cc: Pengutronix Kernel Team 
Cc: Fabio Estevam 
---
 drivers/gpu/drm/imx/ipuv3/imx-drm-core.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c 
b/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c
index 4cfabcf7375a..30299f423d62 100644
--- a/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c
@@ -15,6 +15,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -163,6 +164,7 @@ static int imx_drm_dumb_create(struct drm_file *file_priv,
 static const struct drm_driver imx_drm_driver = {
.driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(imx_drm_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
.ioctls = imx_drm_ioctls,
.num_ioctls = ARRAY_SIZE(imx_drm_ioctls),
.fops   = &imx_drm_driver_fops,
@@ -249,7 +251,7 @@ static int imx_drm_bind(struct device *dev)
if (ret)
goto err_poll_fini;
 
-   drm_fbdev_dma_setup(drm, legacyfb_depth);
+   drm_client_setup_with_color_mode(drm, legacyfb_depth);
 
return 0;
 
-- 
2.46.0



[PATCH 17/86] drm/ili9341: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/tiny/ili9341.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9341.c b/drivers/gpu/drm/tiny/ili9341.c
index 8bcada30af71..c1dfdfbbd30c 100644
--- a/drivers/gpu/drm/tiny/ili9341.c
+++ b/drivers/gpu/drm/tiny/ili9341.c
@@ -16,6 +16,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -150,6 +151,7 @@ static const struct drm_driver ili9341_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &ili9341_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "ili9341",
.desc   = "Ilitek ILI9341",
@@ -218,7 +220,7 @@ static int ili9341_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 25/86] drm/mcde: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The mcde driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Linus Walleij 
---
 drivers/gpu/drm/mcde/mcde_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c
index 10c06440c7e7..6f4e0f3bf532 100644
--- a/drivers/gpu/drm/mcde/mcde_drv.c
+++ b/drivers/gpu/drm/mcde/mcde_drv.c
@@ -67,6 +67,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -212,6 +213,7 @@ static const struct drm_driver mcde_drm_driver = {
.minor = 0,
.patchlevel = 0,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int mcde_drm_bind(struct device *dev)
@@ -237,7 +239,7 @@ static int mcde_drm_bind(struct device *dev)
if (ret < 0)
goto unbind;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 23/86] drm/kmb: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Anitha Chrisanthus 
Cc: Edmund Dea 
---
 drivers/gpu/drm/kmb/kmb_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 169b83987ce2..0274ab9caa85 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -14,6 +14,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -441,6 +442,7 @@ static const struct drm_driver kmb_driver = {
/* GEM Operations */
.fops = &fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.name = "kmb-drm",
.desc = "KEEMBAY DISPLAY DRIVER",
.date = DRIVER_DATE,
@@ -561,7 +563,7 @@ static int kmb_probe(struct platform_device *pdev)
if (ret)
goto err_register;
 
-   drm_fbdev_dma_setup(&kmb->drm, 0);
+   drm_client_setup(&kmb->drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 21/86] drm/imx/lcdc: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Shawn Guo 
Cc: Sascha Hauer 
Cc: Pengutronix Kernel Team 
Cc: Fabio Estevam 
---
 drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c 
b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
index 36668455aee8..3215c4acd675 100644
--- a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
+++ b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
@@ -3,6 +3,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -348,6 +349,7 @@ static struct drm_driver imx_lcdc_drm_driver = {
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops = &imx_lcdc_drm_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.name = "imx-lcdc",
.desc = "i.MX LCDC driver",
.date = "20200716",
@@ -501,7 +503,7 @@ static int imx_lcdc_probe(struct platform_device *pdev)
if (ret)
return dev_err_probe(dev, ret, "Cannot register device\n");
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 22/86] drm/ingenic: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The ingenic driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Paul Cercueil 
---
 drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c 
b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 39fa291f43dd..056b70b63554 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -24,6 +24,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -960,6 +961,7 @@ static const struct drm_driver ingenic_drm_driver_data = {
.fops   = &ingenic_drm_fops,
.gem_create_object  = ingenic_drm_gem_create_object,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static const struct drm_plane_funcs ingenic_drm_primary_plane_funcs = {
@@ -1399,7 +1401,7 @@ static int ingenic_drm_bind(struct device *dev, bool 
has_components)
goto err_clk_notifier_unregister;
}
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 27/86] drm/meson: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The meson driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Neil Armstrong 
Cc: Kevin Hilman 
Cc: Jerome Brunet 
Cc: Martin Blumenstingl 
---
 drivers/gpu/drm/meson/meson_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/meson/meson_drv.c 
b/drivers/gpu/drm/meson/meson_drv.c
index 4bd0baa2a4f5..2f76f48da38d 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -17,6 +17,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -98,6 +99,7 @@ static const struct drm_driver meson_driver = {
 
/* DMA Ops */
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(meson_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 
/* Misc */
.fops   = &fops,
@@ -353,7 +355,7 @@ static int meson_drv_bind_master(struct device *dev, bool 
has_components)
if (ret)
goto uninstall_irq;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 24/86] drm/logicvc: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The logicvc driver specifies a preferred color mode from the value
in struct drm_mode_config. Use it to select the default format.

Signed-off-by: Thomas Zimmermann 
Cc: Paul Kocialkowski 
---
 drivers/gpu/drm/logicvc/logicvc_drm.c | 11 +--
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/logicvc/logicvc_drm.c 
b/drivers/gpu/drm/logicvc/logicvc_drm.c
index 01a37e28c080..88a978f3f088 100644
--- a/drivers/gpu/drm/logicvc/logicvc_drm.c
+++ b/drivers/gpu/drm/logicvc/logicvc_drm.c
@@ -16,8 +16,10 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -55,6 +57,7 @@ static struct drm_driver logicvc_drm_driver = {
.minor  = 0,
 

DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(logicvc_drm_gem_dma_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static struct regmap_config logicvc_drm_regmap_config = {
@@ -301,7 +304,6 @@ static int logicvc_drm_probe(struct platform_device *pdev)
struct regmap *regmap = NULL;
struct resource res;
void __iomem *base;
-   unsigned int preferred_bpp;
int irq;
int ret;
 
@@ -441,15 +443,12 @@ static int logicvc_drm_probe(struct platform_device *pdev)
 
switch (drm_dev->mode_config.preferred_depth) {
case 16:
-   preferred_bpp = 16;
+   drm_client_setup(drm_dev, drm_format_info(DRM_FORMAT_RGB565));
break;
-   case 24:
-   case 32:
default:
-   preferred_bpp = 32;
+   drm_client_setup(drm_dev, NULL);
break;
}
-   drm_fbdev_dma_setup(drm_dev, preferred_bpp);
 
return 0;
 
-- 
2.46.0



[PATCH 28/86] drm/mi0283qt: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: "Noralf Trønnes" 
---
 drivers/gpu/drm/tiny/mi0283qt.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/mi0283qt.c b/drivers/gpu/drm/tiny/mi0283qt.c
index cdc5423990ca..f1461c55dba6 100644
--- a/drivers/gpu/drm/tiny/mi0283qt.c
+++ b/drivers/gpu/drm/tiny/mi0283qt.c
@@ -14,6 +14,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -154,6 +155,7 @@ static const struct drm_driver mi0283qt_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &mi0283qt_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "mi0283qt",
.desc   = "Multi-Inno MI0283QT",
@@ -226,7 +228,7 @@ static int mi0283qt_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 32/86] drm/panel-mipi-dbi: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: "Noralf Trønnes" 
---
 drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/panel-mipi-dbi.c 
b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
index f753cdffe6f8..e66729b31bd6 100644
--- a/drivers/gpu/drm/tiny/panel-mipi-dbi.c
+++ b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
@@ -15,6 +15,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -264,6 +265,7 @@ static const struct drm_driver panel_mipi_dbi_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &panel_mipi_dbi_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "panel-mipi-dbi",
.desc   = "MIPI DBI compatible display panel",
@@ -388,7 +390,7 @@ static int panel_mipi_dbi_spi_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 33/86] drm/pl111: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup_with_color_mode() to run the kernel's default
client setup for DRM. Set fbdev_probe in struct drm_driver, so that
the client setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/pl111/pl111_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/pl111/pl111_drv.c 
b/drivers/gpu/drm/pl111/pl111_drv.c
index 02e6b74d5016..13362150b9c6 100644
--- a/drivers/gpu/drm/pl111/pl111_drv.c
+++ b/drivers/gpu/drm/pl111/pl111_drv.c
@@ -47,6 +47,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -225,6 +226,7 @@ static const struct drm_driver pl111_drm_driver = {
.patchlevel = 0,
.dumb_create = drm_gem_dma_dumb_create,
.gem_prime_import_sg_table = pl111_gem_import_sg_table,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 
 #if defined(CONFIG_DEBUG_FS)
.debugfs_init = pl111_debugfs_init,
@@ -305,7 +307,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
if (ret < 0)
goto dev_put;
 
-   drm_fbdev_dma_setup(drm, priv->variant->fb_depth);
+   drm_client_setup_with_color_mode(drm, priv->variant->fb_depth);
 
return 0;
 
-- 
2.46.0



[PATCH 34/86] drm/renesas/rcar-du: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The rcar-du driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Laurent Pinchart 
Cc: Kieran Bingham 
---
 drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c 
b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
index fb719d9aff10..4e0bafc86f50 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
@@ -19,6 +19,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -606,6 +607,7 @@ static const struct drm_driver rcar_du_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.dumb_create= rcar_du_dumb_create,
.gem_prime_import_sg_table = rcar_du_gem_prime_import_sg_table,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &rcar_du_fops,
.name   = "rcar-du",
.desc   = "Renesas R-Car Display Unit",
@@ -716,7 +718,7 @@ static int rcar_du_probe(struct platform_device *pdev)
 
drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
 
-   drm_fbdev_dma_setup(&rcdu->ddev, 32);
+   drm_client_setup(&rcdu->ddev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 29/86] drm/mxsfb/lcdif: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The lcdif driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Marek Vasut 
Cc: Stefan Agner 
Cc: Shawn Guo 
Cc: Sascha Hauer 
Cc: Pengutronix Kernel Team 
Cc: Fabio Estevam 
---
 drivers/gpu/drm/mxsfb/lcdif_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c 
b/drivers/gpu/drm/mxsfb/lcdif_drv.c
index 0f895b8a99d6..58ccad9c425d 100644
--- a/drivers/gpu/drm/mxsfb/lcdif_drv.c
+++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c
@@ -16,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -243,6 +244,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
 static const struct drm_driver lcdif_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &fops,
.name   = "imx-lcdif",
.desc   = "i.MX LCDIF Controller DRM",
@@ -275,7 +277,7 @@ static int lcdif_probe(struct platform_device *pdev)
if (ret)
goto err_unload;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 31/86] drm/panel/ili9341: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Neil Armstrong 
Cc: Jessica Zhang 
---
 drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c 
b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
index 775d5d5e828c..0ef9f7b59ccb 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
@@ -31,6 +31,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -591,6 +592,7 @@ static struct drm_driver ili9341_dbi_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &ili9341_dbi_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "ili9341",
.desc   = "Ilitek ILI9341",
@@ -651,7 +653,7 @@ static int ili9341_dbi_probe(struct spi_device *spi, struct 
gpio_desc *dc,
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 38/86] drm/rockchip: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Sandy Huang 
Cc: "Heiko Stübner" 
Cc: Andy Yan 
---
 drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 44d769d9234d..83ea6cc8cd21 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -17,6 +17,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -191,7 +192,7 @@ static int rockchip_drm_bind(struct device *dev)
if (ret)
goto err_kms_helper_poll_fini;
 
-   drm_fbdev_dma_setup(drm_dev, 0);
+   drm_client_setup(drm_dev, NULL);
 
return 0;
 err_kms_helper_poll_fini:
@@ -226,6 +227,7 @@ static const struct drm_driver rockchip_drm_driver = {
.driver_features= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
.dumb_create= rockchip_gem_dumb_create,
.gem_prime_import_sg_table  = rockchip_gem_prime_import_sg_table,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &rockchip_drm_driver_fops,
.name   = DRIVER_NAME,
.desc   = DRIVER_DESC,
-- 
2.46.0



[PATCH 36/86] drm/renesas/shmobile: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Laurent Pinchart 
Cc: Geert Uytterhoeven 
---
 drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c 
b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
index ff2883c7fd46..e82624836c97 100644
--- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
+++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
@@ -18,8 +18,10 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -101,6 +103,7 @@ DEFINE_DRM_GEM_DMA_FOPS(shmob_drm_fops);
 static const struct drm_driver shmob_drm_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &shmob_drm_fops,
.name   = "shmob-drm",
.desc   = "Renesas SH Mobile DRM",
@@ -257,7 +260,7 @@ static int shmob_drm_probe(struct platform_device *pdev)
if (ret < 0)
goto err_modeset_cleanup;
 
-   drm_fbdev_dma_setup(ddev, 16);
+   drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB565));
 
return 0;
 
-- 
2.46.0



[PATCH 30/86] drm/msxfb: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The msxfb driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Marek Vasut 
Cc: Stefan Agner 
Cc: Shawn Guo 
Cc: Sascha Hauer 
Cc: Pengutronix Kernel Team 
Cc: Fabio Estevam 
---
 drivers/gpu/drm/mxsfb/mxsfb_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c 
b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
index cb5ce4e81fc7..34a98717b72c 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
@@ -19,6 +19,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -331,6 +332,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
 static const struct drm_driver mxsfb_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &fops,
.name   = "mxsfb-drm",
.desc   = "MXSFB Controller DRM",
@@ -364,7 +366,7 @@ static int mxsfb_probe(struct platform_device *pdev)
if (ret)
goto err_unload;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 44/86] drm/st7586: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: David Lechner 
---
 drivers/gpu/drm/tiny/st7586.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/st7586.c b/drivers/gpu/drm/tiny/st7586.c
index b9c6ed352182..97013685c62f 100644
--- a/drivers/gpu/drm/tiny/st7586.c
+++ b/drivers/gpu/drm/tiny/st7586.c
@@ -13,6 +13,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -290,6 +291,7 @@ static const struct drm_driver st7586_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &st7586_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "st7586",
.desc   = "Sitronix ST7586",
@@ -371,7 +373,7 @@ static int st7586_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 37/86] drm/repaper: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: "Noralf Trønnes" 
---
 drivers/gpu/drm/tiny/repaper.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/repaper.c b/drivers/gpu/drm/tiny/repaper.c
index 1f78aa3d26bb..77944eb17b3c 100644
--- a/drivers/gpu/drm/tiny/repaper.c
+++ b/drivers/gpu/drm/tiny/repaper.c
@@ -22,6 +22,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -913,6 +914,7 @@ static const struct drm_driver repaper_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &repaper_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.name   = "repaper",
.desc   = "Pervasive Displays RePaper e-ink panels",
.date   = "20170405",
@@ -1118,7 +1120,7 @@ static int repaper_probe(struct spi_device *spi)
 
DRM_DEBUG_DRIVER("SPI speed: %uMHz\n", spi->max_speed_hz / 100);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 46/86] drm/tve200: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Linus Walleij 
---
 drivers/gpu/drm/tve200/tve200_drv.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/tve200/tve200_drv.c 
b/drivers/gpu/drm/tve200/tve200_drv.c
index acce210e2554..b84f0abfdcc7 100644
--- a/drivers/gpu/drm/tve200/tve200_drv.c
+++ b/drivers/gpu/drm/tve200/tve200_drv.c
@@ -39,8 +39,10 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -149,6 +151,7 @@ static const struct drm_driver tve200_drm_driver = {
.minor = 0,
.patchlevel = 0,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int tve200_probe(struct platform_device *pdev)
@@ -221,11 +224,7 @@ static int tve200_probe(struct platform_device *pdev)
if (ret < 0)
goto clk_disable;
 
-   /*
-* Passing in 16 here will make the RGB565 mode the default
-* Passing in 32 will use XRGB mode
-*/
-   drm_fbdev_dma_setup(drm, 16);
+   drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB565));
 
return 0;
 
-- 
2.46.0



[PATCH 42/86] drm/tidss: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The tidss driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Jyri Sarha 
Cc: Tomi Valkeinen 
---
 drivers/gpu/drm/tidss/tidss_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tidss/tidss_drv.c 
b/drivers/gpu/drm/tidss/tidss_drv.c
index d15f836dca95..2428b9aaa003 100644
--- a/drivers/gpu/drm/tidss/tidss_drv.c
+++ b/drivers/gpu/drm/tidss/tidss_drv.c
@@ -11,6 +11,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -109,6 +110,7 @@ static const struct drm_driver tidss_driver = {
.fops   = &tidss_fops,
.release= tidss_release,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.name   = "tidss",
.desc   = "TI Keystone DSS",
.date   = "20180215",
@@ -186,7 +188,7 @@ static int tidss_probe(struct platform_device *pdev)
goto err_irq_uninstall;
}
 
-   drm_fbdev_dma_setup(ddev, 32);
+   drm_client_setup(ddev, NULL);
 
dev_dbg(dev, "%s done\n", __func__);
 
-- 
2.46.0



[PATCH 39/86] drm/sti: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The sti driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Alain Volmat 
---
 drivers/gpu/drm/sti/sti_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sti/sti_drv.c b/drivers/gpu/drm/sti/sti_drv.c
index 1799c12babf5..65f180c8e8e2 100644
--- a/drivers/gpu/drm/sti/sti_drv.c
+++ b/drivers/gpu/drm/sti/sti_drv.c
@@ -15,6 +15,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -136,6 +137,7 @@ static const struct drm_driver sti_driver = {
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
.fops = &sti_driver_fops,
DRM_GEM_DMA_DRIVER_OPS,
+   DRM_FBDEV_DMA_DRIVER_OPS,
 
.debugfs_init = sti_drm_dbg_init,
 
@@ -203,7 +205,7 @@ static int sti_bind(struct device *dev)
 
drm_mode_config_reset(ddev);
 
-   drm_fbdev_dma_setup(ddev, 32);
+   drm_client_setup(ddev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 47/86] drm/vc4: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Maxime Ripard 
Cc: Dave Stevenson 
Cc: Raspberry Pi Kernel Maintenance 
---
 drivers/gpu/drm/vc4/vc4_drv.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index c133e96b8aca..f83eea9af105 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -32,8 +32,10 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -212,6 +214,7 @@ const struct drm_driver vc4_drm_driver = {
.gem_create_object = vc4_create_object,
 
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(vc4_bo_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 
.ioctls = vc4_drm_ioctls,
.num_ioctls = ARRAY_SIZE(vc4_drm_ioctls),
@@ -389,7 +392,7 @@ static int vc4_drm_bind(struct device *dev)
if (ret < 0)
goto err;
 
-   drm_fbdev_dma_setup(drm, 16);
+   drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB565));
 
return 0;
 
-- 
2.46.0



[PATCH 50/86] drm/fbdev-shmem: Support struct drm_driver.fbdev_probe

2024-08-16 Thread Thomas Zimmermann
Rework fbdev probing to support fbdev_probe in struct drm_driver
and reimplement the old fb_probe callback on top of it. Provide an
initializer macro for struct drm_driver that sets the callback
according to the kernel configuration.

This change allows the common fbdev client to run on top of SHMEM-
based DRM drivers.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/drm_fbdev_shmem.c | 60 ++-
 include/drm/drm_fbdev_shmem.h | 11 ++
 2 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c 
b/drivers/gpu/drm/drm_fbdev_shmem.c
index 0c785007f11b..3bca333917d1 100644
--- a/drivers/gpu/drm/drm_fbdev_shmem.c
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -107,6 +107,40 @@ static struct page *drm_fbdev_shmem_get_page(struct 
fb_info *info, unsigned long
 
 static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
   struct drm_fb_helper_surface_size 
*sizes)
+{
+   return drm_fbdev_shmem_driver_fbdev_probe(fb_helper, sizes);
+}
+
+static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
+  struct drm_clip_rect *clip)
+{
+   struct drm_device *dev = helper->dev;
+   int ret;
+
+   /* Call damage handlers only if necessary */
+   if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+   return 0;
+
+   if (helper->fb->funcs->dirty) {
+   ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+   if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", 
ret))
+   return ret;
+   }
+
+   return 0;
+}
+
+static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
+   .fb_probe = drm_fbdev_shmem_helper_fb_probe,
+   .fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
+};
+
+/*
+ * struct drm_driver
+ */
+
+int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+  struct drm_fb_helper_surface_size *sizes)
 {
struct drm_client_dev *client = &fb_helper->client;
struct drm_device *dev = fb_helper->dev;
@@ -139,6 +173,7 @@ static int drm_fbdev_shmem_helper_fb_probe(struct 
drm_fb_helper *fb_helper,
goto err_drm_client_buffer_delete;
}
 
+   fb_helper->funcs = &drm_fbdev_shmem_helper_funcs;
fb_helper->buffer = buffer;
fb_helper->fb = fb;
 
@@ -182,30 +217,7 @@ static int drm_fbdev_shmem_helper_fb_probe(struct 
drm_fb_helper *fb_helper,
drm_client_framebuffer_delete(buffer);
return ret;
 }
-
-static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
-  struct drm_clip_rect *clip)
-{
-   struct drm_device *dev = helper->dev;
-   int ret;
-
-   /* Call damage handlers only if necessary */
-   if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
-   return 0;
-
-   if (helper->fb->funcs->dirty) {
-   ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
-   if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", 
ret))
-   return ret;
-   }
-
-   return 0;
-}
-
-static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
-   .fb_probe = drm_fbdev_shmem_helper_fb_probe,
-   .fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
-};
+EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
 
 /*
  * struct drm_client_funcs
diff --git a/include/drm/drm_fbdev_shmem.h b/include/drm/drm_fbdev_shmem.h
index fb43cadd1950..3a5d1efa9d55 100644
--- a/include/drm/drm_fbdev_shmem.h
+++ b/include/drm/drm_fbdev_shmem.h
@@ -4,12 +4,23 @@
 #define DRM_FBDEV_SHMEM_H
 
 struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
+int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+  struct drm_fb_helper_surface_size 
*sizes);
+
+#define DRM_FBDEV_SHMEM_DRIVER_OPS \
+   .fbdev_probe = drm_fbdev_shmem_driver_fbdev_probe
+
 void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp);
 #else
 static inline void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int 
preferred_bpp)
 { }
+
+#define DRM_FBDEV_SHMEM_DRIVER_OPS \
+   .fbdev_probe = NULL
 #endif
 
 #endif
-- 
2.46.0



[PATCH 40/86] drm/stm: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Yannick Fertre 
Cc: Raphael Gallais-Pou 
Cc: Philippe Cornu 
Cc: Maxime Coquelin 
Cc: Alexandre Torgue 
---
 drivers/gpu/drm/stm/drv.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/stm/drv.c b/drivers/gpu/drm/stm/drv.c
index e1232f74dfa5..569d7d654965 100644
--- a/drivers/gpu/drm/stm/drv.c
+++ b/drivers/gpu/drm/stm/drv.c
@@ -18,8 +18,10 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -66,6 +68,7 @@ static const struct drm_driver drv_driver = {
.patchlevel = 0,
.fops = &drv_driver_fops,
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(stm_gem_dma_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int drv_load(struct drm_device *ddev)
@@ -206,7 +209,7 @@ static int stm_drm_platform_probe(struct platform_device 
*pdev)
if (ret)
goto err_unload;
 
-   drm_fbdev_dma_setup(ddev, 16);
+   drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB565));
 
return 0;
 
-- 
2.46.0



[PATCH 41/86] drm/sun4i: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The sun4i driver specifies as preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Maxime Ripard 
Cc: Chen-Yu Tsai 
Cc: Jernej Skrabec 
Cc: Samuel Holland 
---
 drivers/gpu/drm/sun4i/sun4i_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c 
b/drivers/gpu/drm/sun4i/sun4i_drv.c
index 35d7a7ffd208..c3342789e3b0 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -16,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -55,6 +56,7 @@ static const struct drm_driver sun4i_drv_driver = {
 
/* GEM Operations */
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_sun4i_gem_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int sun4i_drv_bind(struct device *dev)
@@ -111,7 +113,7 @@ static int sun4i_drv_bind(struct device *dev)
if (ret)
goto finish_poll;
 
-   drm_fbdev_dma_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
dev_set_drvdata(dev, drm);
 
-- 
2.46.0



[PATCH 48/86] drm/xlnx: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Laurent Pinchart 
Cc: Tomi Valkeinen 
Cc: Michal Simek 
---
 drivers/gpu/drm/xlnx/zynqmp_kms.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xlnx/zynqmp_kms.c 
b/drivers/gpu/drm/xlnx/zynqmp_kms.c
index bd1368df7870..f26b119322d5 100644
--- a/drivers/gpu/drm/xlnx/zynqmp_kms.c
+++ b/drivers/gpu/drm/xlnx/zynqmp_kms.c
@@ -14,6 +14,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -402,6 +403,7 @@ static const struct drm_driver zynqmp_dpsub_drm_driver = {
  DRIVER_ATOMIC,
 
DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(zynqmp_dpsub_dumb_create),
+   DRM_FBDEV_DMA_DRIVER_OPS,
 
.fops   = &zynqmp_dpsub_drm_fops,
 
@@ -523,7 +525,7 @@ int zynqmp_dpsub_drm_init(struct zynqmp_dpsub *dpsub)
goto err_poll_fini;
 
/* Initialize fbdev generic emulation. */
-   drm_fbdev_dma_setup(drm, 24);
+   drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB888));
 
return 0;
 
-- 
2.46.0



[PATCH 53/86] drm/gm12u320: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Hans de Goede 
---
 drivers/gpu/drm/tiny/gm12u320.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/gm12u320.c b/drivers/gpu/drm/tiny/gm12u320.c
index e0defb1d134f..ade312fde803 100644
--- a/drivers/gpu/drm/tiny/gm12u320.c
+++ b/drivers/gpu/drm/tiny/gm12u320.c
@@ -9,6 +9,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -625,6 +626,7 @@ static const struct drm_driver gm12u320_drm_driver = {
.fops= &gm12u320_fops,
DRM_GEM_SHMEM_DRIVER_OPS,
.gem_prime_import = gm12u320_gem_prime_import,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 static const struct drm_mode_config_funcs gm12u320_mode_config_funcs = {
@@ -699,7 +701,7 @@ static int gm12u320_usb_probe(struct usb_interface 
*interface,
if (ret)
goto err_put_device;
 
-   drm_fbdev_shmem_setup(dev, 0);
+   drm_client_setup(dev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 35/86] drm/renesas/rz-du: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The rz-du driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Biju Das 
---
 drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c 
b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
index e5eca8691a33..53f9e1b7fa87 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
@@ -13,6 +13,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -68,6 +69,7 @@ DEFINE_DRM_GEM_DMA_FOPS(rzg2l_du_fops);
 static const struct drm_driver rzg2l_du_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.dumb_create= rzg2l_du_dumb_create,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.fops   = &rzg2l_du_fops,
.name   = "rzg2l-du",
.desc   = "Renesas RZ/G2L Display Unit",
@@ -149,7 +151,7 @@ static int rzg2l_du_probe(struct platform_device *pdev)
 
drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
 
-   drm_fbdev_dma_setup(&rcdu->ddev, 32);
+   drm_client_setup(&rcdu->ddev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 45/86] drm/st7735r: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: David Lechner 
---
 drivers/gpu/drm/tiny/st7735r.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/st7735r.c b/drivers/gpu/drm/tiny/st7735r.c
index 1676da00883d..0747ebd999cc 100644
--- a/drivers/gpu/drm/tiny/st7735r.c
+++ b/drivers/gpu/drm/tiny/st7735r.c
@@ -17,6 +17,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -155,6 +156,7 @@ static const struct drm_driver st7735r_driver = {
.driver_features= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops   = &st7735r_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+   DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init   = mipi_dbi_debugfs_init,
.name   = "st7735r",
.desc   = "Sitronix ST7735R",
@@ -241,7 +243,7 @@ static int st7735r_probe(struct spi_device *spi)
 
spi_set_drvdata(spi, drm);
 
-   drm_fbdev_dma_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 54/86] drm/gud: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: "Noralf Trønnes" 
---
 drivers/gpu/drm/gud/gud_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c
index ac6bbf920c72..09ccdc1dc1a2 100644
--- a/drivers/gpu/drm/gud/gud_drv.c
+++ b/drivers/gpu/drm/gud/gud_drv.c
@@ -15,6 +15,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -376,6 +377,7 @@ static const struct drm_driver gud_drm_driver = {
.fops   = &gud_fops,
DRM_GEM_SHMEM_DRIVER_OPS,
.gem_prime_import   = gud_gem_prime_import,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 
.name   = "gud",
.desc   = "Generic USB Display",
@@ -622,7 +624,7 @@ static int gud_probe(struct usb_interface *intf, const 
struct usb_device_id *id)
 
drm_kms_helper_poll_init(drm);
 
-   drm_fbdev_shmem_setup(drm, 0);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 55/86] drm/hyperv_drm: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Deepak Rawat 
---
 drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c 
b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
index ff93e08d5036..3077ce5470f6 100644
--- a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
+++ b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
@@ -10,6 +10,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -36,6 +37,7 @@ static struct drm_driver hyperv_driver = {
 
.fops= &hv_fops,
DRM_GEM_SHMEM_DRIVER_OPS,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 static int hyperv_pci_probe(struct pci_dev *pdev,
@@ -149,7 +151,7 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
goto err_free_mmio;
}
 
-   drm_fbdev_shmem_setup(dev, 0);
+   drm_client_setup(dev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 51/86] drm/ast: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The ast driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Dave Airlie 
Cc: Thomas Zimmermann 
Cc: Jocelyn Falempe 
---
 drivers/gpu/drm/ast/ast_drv.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c
index 225817087b4d..debdfd0e197e 100644
--- a/drivers/gpu/drm/ast/ast_drv.c
+++ b/drivers/gpu/drm/ast/ast_drv.c
@@ -32,6 +32,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -64,7 +65,8 @@ static const struct drm_driver ast_driver = {
.minor = DRIVER_MINOR,
.patchlevel = DRIVER_PATCHLEVEL,
 
-   DRM_GEM_SHMEM_DRIVER_OPS
+   DRM_GEM_SHMEM_DRIVER_OPS,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 /*
@@ -360,7 +362,7 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
if (ret)
return ret;
 
-   drm_fbdev_shmem_setup(drm, 32);
+   drm_client_setup(drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 67/86] drm/hisilicon/hibmc: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The hibmc driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Xinliang Liu 
Cc: Tian Tao 
Cc: Xinwei Kong 
Cc: Sumit Semwal 
Cc: Yongqin Liu 
Cc: John Stultz 
---
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 9f9b19ea0587..866a9ecaf8b9 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -16,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -63,6 +64,7 @@ static const struct drm_driver hibmc_driver = {
.debugfs_init   = drm_vram_mm_debugfs_init,
.dumb_create= hibmc_dumb_create,
.dumb_map_offset= drm_gem_ttm_dumb_map_offset,
+   DRM_FBDEV_TTM_DRIVER_OPS,
 };
 
 static int __maybe_unused hibmc_pm_suspend(struct device *dev)
@@ -339,7 +341,7 @@ static int hibmc_pci_probe(struct pci_dev *pdev,
goto err_unload;
}
 
-   drm_fbdev_ttm_setup(dev, 32);
+   drm_client_setup(dev, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 52/86] drm/cirrus: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Dave Airlie 
Cc: Gerd Hoffmann 
---
 drivers/gpu/drm/tiny/cirrus.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/cirrus.c b/drivers/gpu/drm/tiny/cirrus.c
index 751326e3d9c3..a9003c0fd2d9 100644
--- a/drivers/gpu/drm/tiny/cirrus.c
+++ b/drivers/gpu/drm/tiny/cirrus.c
@@ -27,6 +27,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -662,6 +663,7 @@ static const struct drm_driver cirrus_driver = {
 
.fops= &cirrus_fops,
DRM_GEM_SHMEM_DRIVER_OPS,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 static int cirrus_pci_probe(struct pci_dev *pdev,
@@ -716,7 +718,7 @@ static int cirrus_pci_probe(struct pci_dev *pdev,
if (ret)
return ret;
 
-   drm_fbdev_shmem_setup(dev, 16);
+   drm_client_setup(dev, drm_format_info(DRM_FORMAT_RGB565));
return 0;
 }
 
-- 
2.46.0



[PATCH 58/86] drm/simpledrm: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Thomas Zimmermann 
Cc: Javier Martinez Canillas 
---
 drivers/gpu/drm/tiny/simpledrm.c | 9 +++--
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
index d19e10289428..484901e5e2f4 100644
--- a/drivers/gpu/drm/tiny/simpledrm.c
+++ b/drivers/gpu/drm/tiny/simpledrm.c
@@ -12,6 +12,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -1009,6 +1010,7 @@ DEFINE_DRM_GEM_FOPS(simpledrm_fops);
 
 static struct drm_driver simpledrm_driver = {
DRM_GEM_SHMEM_DRIVER_OPS,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
.name   = DRIVER_NAME,
.desc   = DRIVER_DESC,
.date   = DRIVER_DATE,
@@ -1026,7 +1028,6 @@ static int simpledrm_probe(struct platform_device *pdev)
 {
struct simpledrm_device *sdev;
struct drm_device *dev;
-   unsigned int color_mode;
int ret;
 
sdev = simpledrm_device_create(&simpledrm_driver, pdev);
@@ -1038,11 +1039,7 @@ static int simpledrm_probe(struct platform_device *pdev)
if (ret)
return ret;
 
-   color_mode = drm_format_info_bpp(sdev->format, 0);
-   if (color_mode == 16)
-   color_mode = sdev->format->depth; // can be 15 or 16
-
-   drm_fbdev_shmem_setup(dev, color_mode);
+   drm_client_setup(dev, sdev->format);
 
return 0;
 }
-- 
2.46.0



[PATCH 56/86] drm/mgag200: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Dave Airlie i
Cc: Thomas Zimmermann 
Cc: Jocelyn Falempe 
---
 drivers/gpu/drm/mgag200/mgag200_drv.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c 
b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 6623ee4e3277..96a06c59edad 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -11,9 +11,11 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -129,6 +131,7 @@ static const struct drm_driver mgag200_driver = {
.minor = DRIVER_MINOR,
.patchlevel = DRIVER_PATCHLEVEL,
DRM_GEM_SHMEM_DRIVER_OPS,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 /*
@@ -314,7 +317,7 @@ mgag200_pci_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
 * FIXME: A 24-bit color depth does not work with 24 bpp on
 * G200ER. Force 32 bpp.
 */
-   drm_fbdev_shmem_setup(dev, 32);
+   drm_client_setup(dev, drm_format_info(DRM_FORMAT_XRGB));
 
return 0;
 }
-- 
2.46.0



[PATCH 62/86] drm/vkms: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Rodrigo Siqueira 
Cc: Melissa Wen 
Cc: "Maíra Canal" 
Cc: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 0c1a713b7b7b..2d1e95cb66e5 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -16,6 +16,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -112,6 +113,7 @@ static const struct drm_driver vkms_driver = {
.release= vkms_release,
.fops   = &vkms_driver_fops,
DRM_GEM_SHMEM_DRIVER_OPS,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 
.name   = DRIVER_NAME,
.desc   = DRIVER_DESC,
@@ -225,7 +227,7 @@ static int vkms_create(struct vkms_config *config)
if (ret)
goto out_devres;
 
-   drm_fbdev_shmem_setup(&vkms_device->drm, 0);
+   drm_client_setup(&vkms_device->drm, NULL);
 
return 0;
 
-- 
2.46.0



[PATCH 66/86] drm/bochs: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The bochs driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Gerd Hoffmann 
---
 drivers/gpu/drm/tiny/bochs.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/bochs.c b/drivers/gpu/drm/tiny/bochs.c
index 31fc5d839e10..fb69f70043d5 100644
--- a/drivers/gpu/drm/tiny/bochs.c
+++ b/drivers/gpu/drm/tiny/bochs.c
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -604,6 +605,7 @@ static const struct drm_driver bochs_driver = {
.major  = 1,
.minor  = 0,
DRM_GEM_VRAM_DRIVER,
+   DRM_FBDEV_TTM_DRIVER_OPS,
 };
 
 /* -- */
@@ -667,7 +669,7 @@ static int bochs_pci_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent
if (ret)
goto err_hw_fini;
 
-   drm_fbdev_ttm_setup(dev, 32);
+   drm_client_setup(dev, NULL);
return ret;
 
 err_hw_fini:
-- 
2.46.0



[PATCH 60/86] drm/udl: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Dave Airlie 
Cc: Sean Paul 
Cc: Thomas Zimmermann 
---
 drivers/gpu/drm/udl/udl_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index 280a09a6e2ad..8d8ae40f945c 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -6,6 +6,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -73,6 +74,7 @@ static const struct drm_driver driver = {
.fops = &udl_driver_fops,
DRM_GEM_SHMEM_DRIVER_OPS,
.gem_prime_import = udl_driver_gem_prime_import,
+   DRM_FBDEV_SHMEM_DRIVER_OPS,
 
.name = DRIVER_NAME,
.desc = DRIVER_DESC,
@@ -117,7 +119,7 @@ static int udl_usb_probe(struct usb_interface *interface,
 
DRM_INFO("Initialized udl on minor %d\n", udl->drm.primary->index);
 
-   drm_fbdev_shmem_setup(&udl->drm, 0);
+   drm_client_setup(&udl->drm, NULL);
 
return 0;
 }
-- 
2.46.0



[PATCH 73/86] drm/fbdev-ttm: Remove obsolete setup function

2024-08-16 Thread Thomas Zimmermann
The old setup function drm_fbdev_ttm_setup() is unused. Remove it and
its internal callbacks. New drivers should call drm_client_setup()
instead.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/drm_fbdev_ttm.c | 119 
 include/drm/drm_fbdev_ttm.h |   6 --
 2 files changed, 125 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
index d799cbe944cd..73d35d59590c 100644
--- a/drivers/gpu/drm/drm_fbdev_ttm.c
+++ b/drivers/gpu/drm/drm_fbdev_ttm.c
@@ -65,15 +65,6 @@ static const struct fb_ops drm_fbdev_ttm_fb_ops = {
.fb_destroy = drm_fbdev_ttm_fb_destroy,
 };
 
-/*
- * This function uses the client API to create a framebuffer backed by a dumb 
buffer.
- */
-static int drm_fbdev_ttm_helper_fb_probe(struct drm_fb_helper *fb_helper,
-struct drm_fb_helper_surface_size 
*sizes)
-{
-   return drm_fbdev_ttm_driver_fbdev_probe(fb_helper, sizes);
-}
-
 static void drm_fbdev_ttm_damage_blit_real(struct drm_fb_helper *fb_helper,
   struct drm_clip_rect *clip,
   struct iosys_map *dst)
@@ -172,7 +163,6 @@ static int drm_fbdev_ttm_helper_fb_dirty(struct 
drm_fb_helper *helper,
 }
 
 static const struct drm_fb_helper_funcs drm_fbdev_ttm_helper_funcs = {
-   .fb_probe = drm_fbdev_ttm_helper_fb_probe,
.fb_dirty = drm_fbdev_ttm_helper_fb_dirty,
 };
 
@@ -251,112 +241,3 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper 
*fb_helper,
return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_ttm_driver_fbdev_probe);
-
-static void drm_fbdev_ttm_client_unregister(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-   if (fb_helper->info) {
-   drm_fb_helper_unregister_info(fb_helper);
-   } else {
-   drm_client_release(&fb_helper->client);
-   drm_fb_helper_unprepare(fb_helper);
-   kfree(fb_helper);
-   }
-}
-
-static int drm_fbdev_ttm_client_restore(struct drm_client_dev *client)
-{
-   drm_fb_helper_lastclose(client->dev);
-
-   return 0;
-}
-
-static int drm_fbdev_ttm_client_hotplug(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-   struct drm_device *dev = client->dev;
-   int ret;
-
-   if (dev->fb_helper)
-   return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-   ret = drm_fb_helper_init(dev, fb_helper);
-   if (ret)
-   goto err_drm_err;
-
-   if (!drm_drv_uses_atomic_modeset(dev))
-   drm_helper_disable_unused_functions(dev);
-
-   ret = drm_fb_helper_initial_config(fb_helper);
-   if (ret)
-   goto err_drm_fb_helper_fini;
-
-   return 0;
-
-err_drm_fb_helper_fini:
-   drm_fb_helper_fini(fb_helper);
-err_drm_err:
-   drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
-   return ret;
-}
-
-static const struct drm_client_funcs drm_fbdev_ttm_client_funcs = {
-   .owner  = THIS_MODULE,
-   .unregister = drm_fbdev_ttm_client_unregister,
-   .restore= drm_fbdev_ttm_client_restore,
-   .hotplug= drm_fbdev_ttm_client_hotplug,
-};
-
-/**
- * drm_fbdev_ttm_setup() - Setup fbdev emulation for TTM-based drivers
- * @dev: DRM device
- * @preferred_bpp: Preferred bits per pixel for the device.
- *
- * This function sets up fbdev emulation for TTM-based drivers that support
- * dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_ttm_setup() shall be called after the DRM driver registered
- * the new DRM device with drm_dev_register().
- *
- * Restore, hotplug events and teardown are all taken care of. Drivers that do
- * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
- * Simple drivers might use drm_mode_config_helper_suspend().
- *
- * In order to provide fixed mmap-able memory ranges, fbdev emulation
- * uses a shadow buffer in system memory. The implementation blits the shadow
- * fbdev buffer onto the real buffer in regular intervals.
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev is destroyed by drm_dev_unregister().
- */
-void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{
-   struct drm_fb_helper *fb_helper;
-   int ret;
-
-   drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-   drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-   fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-   if (!fb_helper)
-   return;
-   drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, 
&drm_fbdev_ttm_helper_funcs);
-
-   ret = drm_client_init(dev, &fb_helper->client, "fbdev", 
&drm_fbdev_ttm_client_funcs);

[PATCH 70/86] drm/qxl: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The qxl driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Dave Airlie 
Cc: Gerd Hoffmann 
---
 drivers/gpu/drm/qxl/qxl_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index 5eb3f5719fdf..4ef1c134d6dd 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -118,7 +119,7 @@ qxl_pci_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
if (ret)
goto modeset_cleanup;
 
-   drm_fbdev_ttm_setup(&qdev->ddev, 32);
+   drm_client_setup(&qdev->ddev, NULL);
return 0;
 
 modeset_cleanup:
@@ -293,6 +294,7 @@ static struct drm_driver qxl_driver = {
.debugfs_init = qxl_debugfs_init,
 #endif
.gem_prime_import_sg_table = qxl_gem_prime_import_sg_table,
+   DRM_FBDEV_TTM_DRIVER_OPS,
.fops = &qxl_fops,
.ioctls = qxl_ioctls,
.num_ioctls = ARRAY_SIZE(qxl_ioctls),
-- 
2.46.0



[PATCH 63/86] drm/fbdev-shmem: Remove obsolete setup function

2024-08-16 Thread Thomas Zimmermann
The old setup function drm_fbdev_shmem_setup() is unused. Remove it
and its internal callbacks. New drivers should call drm_client_setup()
instead.

Signed-off-by: Thomas Zimmermann 
---
 drivers/gpu/drm/drm_fbdev_shmem.c | 120 +-
 include/drm/drm_fbdev_shmem.h |   6 --
 2 files changed, 1 insertion(+), 125 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c 
b/drivers/gpu/drm/drm_fbdev_shmem.c
index 3bca333917d1..f824369baacd 100644
--- a/drivers/gpu/drm/drm_fbdev_shmem.c
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -2,15 +2,13 @@
 
 #include 
 
-#include 
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 
-#include 
-
 /*
  * struct fb_ops
  */
@@ -105,12 +103,6 @@ static struct page *drm_fbdev_shmem_get_page(struct 
fb_info *info, unsigned long
  * struct drm_fb_helper
  */
 
-static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
-  struct drm_fb_helper_surface_size 
*sizes)
-{
-   return drm_fbdev_shmem_driver_fbdev_probe(fb_helper, sizes);
-}
-
 static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
   struct drm_clip_rect *clip)
 {
@@ -131,7 +123,6 @@ static int drm_fbdev_shmem_helper_fb_dirty(struct 
drm_fb_helper *helper,
 }
 
 static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
-   .fb_probe = drm_fbdev_shmem_helper_fb_probe,
.fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
 };
 
@@ -218,112 +209,3 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct 
drm_fb_helper *fb_helper,
return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
-
-/*
- * struct drm_client_funcs
- */
-
-static void drm_fbdev_shmem_client_unregister(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-   if (fb_helper->info) {
-   drm_fb_helper_unregister_info(fb_helper);
-   } else {
-   drm_client_release(&fb_helper->client);
-   drm_fb_helper_unprepare(fb_helper);
-   kfree(fb_helper);
-   }
-}
-
-static int drm_fbdev_shmem_client_restore(struct drm_client_dev *client)
-{
-   drm_fb_helper_lastclose(client->dev);
-
-   return 0;
-}
-
-static int drm_fbdev_shmem_client_hotplug(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-   struct drm_device *dev = client->dev;
-   int ret;
-
-   if (dev->fb_helper)
-   return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-   ret = drm_fb_helper_init(dev, fb_helper);
-   if (ret)
-   goto err_drm_err;
-
-   if (!drm_drv_uses_atomic_modeset(dev))
-   drm_helper_disable_unused_functions(dev);
-
-   ret = drm_fb_helper_initial_config(fb_helper);
-   if (ret)
-   goto err_drm_fb_helper_fini;
-
-   return 0;
-
-err_drm_fb_helper_fini:
-   drm_fb_helper_fini(fb_helper);
-err_drm_err:
-   drm_err(dev, "fbdev-shmem: Failed to setup emulation (ret=%d)\n", ret);
-   return ret;
-}
-
-static const struct drm_client_funcs drm_fbdev_shmem_client_funcs = {
-   .owner  = THIS_MODULE,
-   .unregister = drm_fbdev_shmem_client_unregister,
-   .restore= drm_fbdev_shmem_client_restore,
-   .hotplug= drm_fbdev_shmem_client_hotplug,
-};
-
-/**
- * drm_fbdev_shmem_setup() - Setup fbdev emulation for GEM SHMEM helpers
- * @dev: DRM device
- * @preferred_bpp: Preferred bits per pixel for the device.
- * 32 is used if this is zero.
- *
- * This function sets up fbdev emulation for GEM DMA drivers that support
- * dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_shmem_setup() shall be called after the DRM driver registered
- * the new DRM device with drm_dev_register().
- *
- * Restore, hotplug events and teardown are all taken care of. Drivers that do
- * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
- * Simple drivers might use drm_mode_config_helper_suspend().
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev is destroyed by drm_dev_unregister().
- */
-void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{
-   struct drm_fb_helper *fb_helper;
-   int ret;
-
-   drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-   drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-   fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-   if (!fb_helper)
-   return;
-   drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, 
&drm_fbdev_shmem_helper_funcs);
-
-   ret = drm_client_init(dev, &fb_helper->client, "fbdev", 
&drm_fbdev_shmem_client_funcs);
-   if (ret) {
-   drm_err(dev, "Failed to re

[PATCH 43/86] drm/tilcdc: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Call drm_client_setup_with_color_mode() to run the kernel's default
client setup for DRM. Set fbdev_probe in struct drm_driver, so that
the client setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Jyri Sarha 
Cc: Tomi Valkeinen 
---
 drivers/gpu/drm/tilcdc/tilcdc_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c 
b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index cd5eefa06060..3ee9fc3bf84a 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -14,6 +14,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -374,7 +375,8 @@ static int tilcdc_init(const struct drm_driver *ddrv, 
struct device *dev)
goto init_failed;
priv->is_registered = true;
 
-   drm_fbdev_dma_setup(ddev, bpp);
+   drm_client_setup_with_color_mode(ddev, bpp);
+
return 0;
 
 init_failed:
-- 
2.46.0



[PATCH 75/86] drm/exynos-drm: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The exynos-drm driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann 
Cc: Inki Dae 
Cc: Seung-Woo Kim 
Cc: Kyungmin Park 
---
 drivers/gpu/drm/exynos/exynos_drm_drv.c   |   4 +-
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 101 ++
 drivers/gpu/drm/exynos/exynos_drm_fbdev.h |  15 ++--
 3 files changed, 19 insertions(+), 101 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 7c59e1164a48..2a466d8179f4 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -15,6 +15,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -111,6 +112,7 @@ static const struct drm_driver exynos_drm_driver = {
.dumb_create= exynos_drm_gem_dumb_create,
.gem_prime_import   = exynos_drm_gem_prime_import,
.gem_prime_import_sg_table  = exynos_drm_gem_prime_import_sg_table,
+   EXYNOS_DRM_FBDEV_DRIVER_OPS,
.ioctls = exynos_ioctls,
.num_ioctls = ARRAY_SIZE(exynos_ioctls),
.fops   = &exynos_drm_driver_fops,
@@ -288,7 +290,7 @@ static int exynos_drm_bind(struct device *dev)
if (ret < 0)
goto err_cleanup_poll;
 
-   exynos_drm_fbdev_setup(drm);
+   drm_client_setup(drm, NULL);
 
return 0;
 
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c 
b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index a379c8ca435a..73fa7b77d8d0 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -22,9 +22,6 @@
 #include "exynos_drm_fb.h"
 #include "exynos_drm_fbdev.h"
 
-#define MAX_CONNECTOR  4
-#define PREFERRED_BPP  32
-
 static int exynos_drm_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
struct drm_fb_helper *helper = info->par;
@@ -87,8 +84,11 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper 
*helper,
return 0;
 }
 
-static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
-   struct drm_fb_helper_surface_size *sizes)
+static const struct drm_fb_helper_funcs exynos_drm_fbdev_helper_funcs = {
+};
+
+int exynos_drm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+   struct drm_fb_helper_surface_size 
*sizes)
 {
struct exynos_drm_gem *exynos_gem;
struct drm_device *dev = helper->dev;
@@ -120,6 +120,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper 
*helper,
ret = PTR_ERR(helper->fb);
goto err_destroy_gem;
}
+   helper->funcs = &exynos_drm_fbdev_helper_funcs;
 
ret = exynos_drm_fbdev_update(helper, sizes, exynos_gem);
if (ret < 0)
@@ -134,93 +135,3 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper 
*helper,
exynos_drm_gem_destroy(exynos_gem);
return ret;
 }
-
-static const struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
-   .fb_probe = exynos_drm_fbdev_create,
-};
-
-/*
- * struct drm_client
- */
-
-static void exynos_drm_fbdev_client_unregister(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-   if (fb_helper->info) {
-   drm_fb_helper_unregister_info(fb_helper);
-   } else {
-   drm_client_release(&fb_helper->client);
-   drm_fb_helper_unprepare(fb_helper);
-   kfree(fb_helper);
-   }
-}
-
-static int exynos_drm_fbdev_client_restore(struct drm_client_dev *client)
-{
-   drm_fb_helper_lastclose(client->dev);
-
-   return 0;
-}
-
-static int exynos_drm_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-   struct drm_device *dev = client->dev;
-   int ret;
-
-   if (dev->fb_helper)
-   return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-   ret = drm_fb_helper_init(dev, fb_helper);
-   if (ret)
-   goto err_drm_err;
-
-   if (!drm_drv_uses_atomic_modeset(dev))
-   drm_helper_disable_unused_functions(dev);
-
-   ret = drm_fb_helper_initial_config(fb_helper);
-   if (ret)
-   goto err_drm_fb_helper_fini;
-
-   return 0;
-
-err_drm_fb_helper_fini:
-   drm_fb_helper_fini(fb_helper);
-err_drm_err:
-   drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret)

[PATCH 76/86] drm/gma500: Run DRM default client setup

2024-08-16 Thread Thomas Zimmermann
Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

Signed-off-by: Thomas Zimmermann 
Cc: Patrik Jakobsson 
---
 drivers/gpu/drm/gma500/fbdev.c   | 100 +++
 drivers/gpu/drm/gma500/psb_drv.c |   4 +-
 drivers/gpu/drm/gma500/psb_drv.h |  12 +++-
 3 files changed, 19 insertions(+), 97 deletions(-)

diff --git a/drivers/gpu/drm/gma500/fbdev.c b/drivers/gpu/drm/gma500/fbdev.c
index 98b44974d42d..8edefea2ef59 100644
--- a/drivers/gpu/drm/gma500/fbdev.c
+++ b/drivers/gpu/drm/gma500/fbdev.c
@@ -143,12 +143,15 @@ static const struct fb_ops psb_fbdev_fb_ops = {
.fb_destroy = psb_fbdev_fb_destroy,
 };
 
+static const struct drm_fb_helper_funcs psb_fbdev_fb_helper_funcs = {
+};
+
 /*
- * struct drm_fb_helper_funcs
+ * struct drm_driver
  */
 
-static int psb_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
- struct drm_fb_helper_surface_size *sizes)
+int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+struct drm_fb_helper_surface_size *sizes)
 {
struct drm_device *dev = fb_helper->dev;
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
@@ -206,6 +209,7 @@ static int psb_fbdev_fb_probe(struct drm_fb_helper 
*fb_helper,
goto err_drm_gem_object_put;
}
 
+   fb_helper->funcs = &psb_fbdev_fb_helper_funcs;
fb_helper->fb = fb;
 
info = drm_fb_helper_alloc_info(fb_helper);
@@ -246,93 +250,3 @@ static int psb_fbdev_fb_probe(struct drm_fb_helper 
*fb_helper,
drm_gem_object_put(obj);
return ret;
 }
-
-static const struct drm_fb_helper_funcs psb_fbdev_fb_helper_funcs = {
-   .fb_probe = psb_fbdev_fb_probe,
-};
-
-/*
- * struct drm_client_funcs and setup code
- */
-
-static void psb_fbdev_client_unregister(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-   if (fb_helper->info) {
-   drm_fb_helper_unregister_info(fb_helper);
-   } else {
-   drm_fb_helper_unprepare(fb_helper);
-   drm_client_release(&fb_helper->client);
-   kfree(fb_helper);
-   }
-}
-
-static int psb_fbdev_client_restore(struct drm_client_dev *client)
-{
-   drm_fb_helper_lastclose(client->dev);
-
-   return 0;
-}
-
-static int psb_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-   struct drm_device *dev = client->dev;
-   int ret;
-
-   if (dev->fb_helper)
-   return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-   ret = drm_fb_helper_init(dev, fb_helper);
-   if (ret)
-   goto err_drm_err;
-
-   if (!drm_drv_uses_atomic_modeset(dev))
-   drm_helper_disable_unused_functions(dev);
-
-   ret = drm_fb_helper_initial_config(fb_helper);
-   if (ret)
-   goto err_drm_fb_helper_fini;
-
-   return 0;
-
-err_drm_fb_helper_fini:
-   drm_fb_helper_fini(fb_helper);
-err_drm_err:
-   drm_err(dev, "Failed to setup gma500 fbdev emulation (ret=%d)\n", ret);
-   return ret;
-}
-
-static const struct drm_client_funcs psb_fbdev_client_funcs = {
-   .owner  = THIS_MODULE,
-   .unregister = psb_fbdev_client_unregister,
-   .restore= psb_fbdev_client_restore,
-   .hotplug= psb_fbdev_client_hotplug,
-};
-
-void psb_fbdev_setup(struct drm_psb_private *dev_priv)
-{
-   struct drm_device *dev = &dev_priv->dev;
-   struct drm_fb_helper *fb_helper;
-   int ret;
-
-   fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-   if (!fb_helper)
-   return;
-   drm_fb_helper_prepare(dev, fb_helper, 32, &psb_fbdev_fb_helper_funcs);
-
-   ret = drm_client_init(dev, &fb_helper->client, "fbdev-gma500", 
&psb_fbdev_client_funcs);
-   if (ret) {
-   drm_err(dev, "Failed to register client: %d\n", ret);
-   goto err_drm_fb_helper_unprepare;
-   }
-
-   drm_client_register(&fb_helper->client);
-
-   return;
-
-err_drm_fb_helper_unprepare:
-   drm_fb_helper_unprepare(fb_helper);
-   kfree(fb_helper);
-}
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 8b64f61ffaf9..43deefef6ad2 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -20,6 +20,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -475,7 +476,7 @@ static int psb_pci_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
if (ret)
return ret;
 
-   psb

  1   2   3   >