nonguix/nongnu/packages/patches/rockchip_ebc_addition_extract_fbs.patch
Petr Hodina f10132da8c nongnu: Add linux-pinenote and linux-quartz64.
* nongnu/packages/linux.scm (linux-pinenote): New variable.
* nongnu/configs/pinenote_config: New file.
* nongnu/configs/pinenote_defconfig: New file.
* nongnu/configs/quartz64_defconfig: New file.
* nongnu/configs/quartz64b_defconfig: New file.
* nongnu/packages/patches/0001-Rudimentary-attempt-to-keep-PMIC-usable-after-suspen.patch: New file.
* nongnu/packages/patches/battery-level.patch: New file.
* nongnu/packages/patches/pinenote-battery-level.patch: New file.
* nongnu/packages/patches/pinenote-rockchip-ebc-patches-mw.patch: New file.
* nongnu/packages/patches/pinenote-touchscreen-1.patch: New file.
* nongnu/packages/patches/pinenote-touchscreen-2.patch: New file.
* nongnu/packages/patches/pinenote_defconfig.patch: New file.
* nongnu/packages/patches/rk3566-pinenote_dtsi.patch: New file.
* nongnu/packages/patches/rockchip_ebc_addition_extract_fbs.patch: New file.
* nongnu/packages/patches/rockchip_ebc_mw_20220624.patch: New file.
* nongnu/packages/patches/rockchip_ebc_patches_mw_20220712.patch: New file.
* nongnu/packages/patches/rockchip_ebc_patches_mw_20220730.patch: New file.
* nongnu/packages/patches/rockchip_ebc_patches_mw_20220804.patch: New file.
* nongnu/packages/patches/rockchip_ebc_patches_mw_20220808.patch: New file.
* nongnu/packages/patches/sdbus-cpp-remove-systemd.patch: New file.
* nongnu/packages/patches/touchscreen-driver-01.patch: New file.
* nongnu/packages/patches/touchscreen-driver-02.patch: New file.
* nongnu/packages/patches/wusb3801_patches_samsapti_20220725.patch: New file.
2023-01-14 09:10:10 +01:00

206 lines
7.1 KiB
Diff

From c8d0d07432bd3cac0f5574165d132ec92754bb54 Mon Sep 17 00:00:00 2001
From: Maximilian Weigand <mweigand@mweigand.net>
Date: Mon, 20 Jun 2022 13:19:31 +0200
Subject: [PATCH] [rockchip_ebc] * add a sysfs handler
(/sys/module/rockchip_ebc/parameters/limit_fb_blits) to limit the numbers of
framebuffer blits. The default value of -1 does not limit blits at all. Can
be used to investigate the buffer contents while debugging complex drawing
chains. * add an ioctl to retrieve the final, next, prev buffer
contents to user space.
---
drivers/gpu/drm/rockchip/rockchip_ebc.c | 120 +++++++++++++++---------
include/uapi/drm/rockchip_ebc_drm.h | 10 +-
2 files changed, 86 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_ebc.c b/drivers/gpu/drm/rockchip/rockchip_ebc.c
index 15b14acbfd2b..66cc052cddcb 100644
--- a/drivers/gpu/drm/rockchip/rockchip_ebc.c
+++ b/drivers/gpu/drm/rockchip/rockchip_ebc.c
@@ -197,6 +197,10 @@ static int split_area_limit = 12;
module_param(split_area_limit, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(split_area_limit, "how many areas to split in each scheduling call");
+static int limit_fb_blits = -1;
+module_param(limit_fb_blits, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(split_area_limit, "how many fb blits to allow. -1 does not limit");
+
DEFINE_DRM_GEM_FOPS(rockchip_ebc_fops);
static int ioctl_trigger_global_refresh(struct drm_device *dev, void *data,
@@ -228,11 +232,72 @@ static int ioctl_set_off_screen(struct drm_device *dev, void *data,
return 0;
}
+
+/**
+ * struct rockchip_ebc_ctx - context for performing display refreshes
+ *
+ * @kref: Reference count, maintained as part of the CRTC's atomic state
+ * @queue: Queue of damaged areas to be refreshed
+ * @queue_lock: Lock protecting access to @queue
+ * @prev: Display contents (Y4) before this refresh
+ * @next: Display contents (Y4) after this refresh
+ * @final: Display contents (Y4) after all pending refreshes
+ * @phase: Buffers for selecting a phase from the EBC's LUT, 1 byte/pixel
+ * @gray4_pitch: Horizontal line length of a Y4 pixel buffer in bytes
+ * @gray4_size: Size of a Y4 pixel buffer in bytes
+ * @phase_pitch: Horizontal line length of a phase buffer in bytes
+ * @phase_size: Size of a phase buffer in bytes
+ */
+struct rockchip_ebc_ctx {
+ struct kref kref;
+ struct list_head queue;
+ spinlock_t queue_lock;
+ u8 *prev;
+ u8 *next;
+ u8 *final;
+ u8 *phase[2];
+ u32 gray4_pitch;
+ u32 gray4_size;
+ u32 phase_pitch;
+ u32 phase_size;
+ u64 area_count;
+};
+
+struct ebc_crtc_state {
+ struct drm_crtc_state base;
+ struct rockchip_ebc_ctx *ctx;
+};
+
+static inline struct ebc_crtc_state *
+to_ebc_crtc_state(struct drm_crtc_state *crtc_state)
+{
+ return container_of(crtc_state, struct ebc_crtc_state, base);
+}
+static int ioctl_extract_fbs(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+{
+ struct drm_rockchip_ebc_extract_fbs *args = data;
+ struct rockchip_ebc *ebc = dev_get_drvdata(dev->dev);
+ int copy_result = 0;
+ struct rockchip_ebc_ctx * ctx;
+
+ // todo: use access_ok here
+ access_ok(args->ptr_next, 1313144);
+ ctx = to_ebc_crtc_state(READ_ONCE(ebc->crtc.state))->ctx;
+ copy_result |= copy_to_user(args->ptr_prev, ctx->prev ,1313144);
+ copy_result |= copy_to_user(args->ptr_next, ctx->next ,1313144);
+ copy_result |= copy_to_user(args->ptr_final, ctx->final ,1313144);
+
+ return copy_result;
+}
+
static const struct drm_ioctl_desc ioctls[DRM_COMMAND_END - DRM_COMMAND_BASE] = {
DRM_IOCTL_DEF_DRV(ROCKCHIP_EBC_GLOBAL_REFRESH, ioctl_trigger_global_refresh,
DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(ROCKCHIP_EBC_OFF_SCREEN, ioctl_set_off_screen,
DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(ROCKCHIP_EBC_EXTRACT_FBS, ioctl_extract_fbs,
+ DRM_RENDER_ALLOW),
};
static const struct drm_driver rockchip_ebc_drm_driver = {
@@ -268,36 +333,6 @@ struct rockchip_ebc_area {
u32 frame_begin;
};
-/**
- * struct rockchip_ebc_ctx - context for performing display refreshes
- *
- * @kref: Reference count, maintained as part of the CRTC's atomic state
- * @queue: Queue of damaged areas to be refreshed
- * @queue_lock: Lock protecting access to @queue
- * @prev: Display contents (Y4) before this refresh
- * @next: Display contents (Y4) after this refresh
- * @final: Display contents (Y4) after all pending refreshes
- * @phase: Buffers for selecting a phase from the EBC's LUT, 1 byte/pixel
- * @gray4_pitch: Horizontal line length of a Y4 pixel buffer in bytes
- * @gray4_size: Size of a Y4 pixel buffer in bytes
- * @phase_pitch: Horizontal line length of a phase buffer in bytes
- * @phase_size: Size of a phase buffer in bytes
- */
-struct rockchip_ebc_ctx {
- struct kref kref;
- struct list_head queue;
- spinlock_t queue_lock;
- u8 *prev;
- u8 *next;
- u8 *final;
- u8 *phase[2];
- u32 gray4_pitch;
- u32 gray4_size;
- u32 phase_pitch;
- u32 phase_size;
- u64 area_count;
-};
-
static void rockchip_ebc_ctx_free(struct rockchip_ebc_ctx *ctx)
{
struct rockchip_ebc_area *area;
@@ -360,17 +395,6 @@ static void rockchip_ebc_ctx_release(struct kref *kref)
* CRTC
*/
-struct ebc_crtc_state {
- struct drm_crtc_state base;
- struct rockchip_ebc_ctx *ctx;
-};
-
-static inline struct ebc_crtc_state *
-to_ebc_crtc_state(struct drm_crtc_state *crtc_state)
-{
- return container_of(crtc_state, struct ebc_crtc_state, base);
-}
-
static void rockchip_ebc_global_refresh(struct rockchip_ebc *ebc,
struct rockchip_ebc_ctx *ctx,
dma_addr_t next_handle,
@@ -1551,8 +1575,18 @@ static void rockchip_ebc_plane_atomic_update(struct drm_plane *plane,
dst_clip->x2 = plane_state->dst.x2 - x1;
}
- clip_changed_fb = rockchip_ebc_blit_fb(ctx, dst_clip, vaddr,
- plane_state->fb, &src_clip, adjust_x1, adjust_x2);
+ if (limit_fb_blits != 0){
+ printk(KERN_INFO "atomic update: blitting: %i\n", limit_fb_blits);
+ clip_changed_fb = rockchip_ebc_blit_fb(ctx, dst_clip, vaddr,
+ plane_state->fb, &src_clip, adjust_x1, adjust_x2);
+ // the counter should only reach 0 here, -1 can only be externally set
+ limit_fb_blits -= (limit_fb_blits > 0) ? 1 : 0;
+ } else {
+ // we do not want to blit anything
+ printk(KERN_INFO "atomic update: not blitting: %i\n", limit_fb_blits);
+ clip_changed_fb = false;
+ }
+
// reverse coordinates
dst_clip->x1 += adjust_x1;
diff --git a/include/uapi/drm/rockchip_ebc_drm.h b/include/uapi/drm/rockchip_ebc_drm.h
index befa62a68be0..93289acf6d87 100644
--- a/include/uapi/drm/rockchip_ebc_drm.h
+++ b/include/uapi/drm/rockchip_ebc_drm.h
@@ -17,9 +17,17 @@ struct drm_rockchip_ebc_off_screen {
char * ptr_screen_content;
};
-#define DRM_ROCKCHIP_EBC_NUM_IOCTLS 0x02
+struct drm_rockchip_ebc_extract_fbs {
+ char * ptr_prev;
+ char * ptr_next;
+ char * ptr_final;
+};
+
+
+#define DRM_ROCKCHIP_EBC_NUM_IOCTLS 0x03
#define DRM_IOCTL_ROCKCHIP_EBC_GLOBAL_REFRESH DRM_IOWR(DRM_COMMAND_BASE + 0x00, struct drm_rockchip_ebc_trigger_global_refresh)
#define DRM_IOCTL_ROCKCHIP_EBC_OFF_SCREEN DRM_IOWR(DRM_COMMAND_BASE + 0x01, struct drm_rockchip_ebc_off_screen)
+#define DRM_IOCTL_ROCKCHIP_EBC_EXTRACT_FBS DRM_IOWR(DRM_COMMAND_BASE + 0x02, struct drm_rockchip_ebc_extract_fbs)
#endif /* __ROCKCHIP_EBC_DRM_H__*/
--
2.30.2