[Concept,13/36] video: Pass context to vidconsole_putc_xy()

Message ID 20260120231814.2033069-14-sjg@u-boot.org
State New
Headers
Series video: Add multiple-context support to vidconsole (part F) |

Commit Message

Simon Glass Jan. 20, 2026, 11:17 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Add a vctx parameter to vidconsole_putc_xy() and its driver method to
allow passing in a specific vidconsole context. If NULL, the default
context from priv is used.

Update all driver implementations and callers accordingly.

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 drivers/video/console_normal.c      | 12 ++++++------
 drivers/video/console_rotate.c      | 18 +++++++++---------
 drivers/video/console_truetype.c    |  6 +++---
 drivers/video/vidconsole-uclass.c   | 10 ++++++----
 drivers/video/vidconsole_internal.h |  4 +++-
 include/video_console.h             |  7 +++++--
 test/dm/video.c                     | 18 +++++++++---------
 7 files changed, 41 insertions(+), 34 deletions(-)
  

Patch

diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
index 5b6f0f0ce86..5f84896699d 100644
--- a/drivers/video/console_normal.c
+++ b/drivers/video/console_normal.c
@@ -79,13 +79,12 @@  static int console_move_rows(struct udevice *dev, uint rowdst,
 	return 0;
 }
 
-int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp)
+int console_normal_putc_xy(struct udevice *dev, void *vctx, uint x_frac,
+			   uint y, int cp)
 {
-	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
 	struct console_simple_priv *priv = dev_get_priv(dev);
 
-	return console_fixed_putc_xy(dev, vidconsole_ctx_from_priv(vc_priv),
-				     x_frac, y, cp, priv->fontdata);
+	return console_fixed_putc_xy(dev, vctx, x_frac, y, cp, priv->fontdata);
 }
 
 static __maybe_unused int console_get_cursor_info(struct udevice *dev)
@@ -172,9 +171,10 @@  static __maybe_unused int normal_entry_restore(struct udevice *dev,
 	return 0;
 }
 
-static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp)
+static int console_putc_xy(struct udevice *dev, void *vctx, uint x_frac,
+			   uint y, int cp)
 {
-	return console_normal_putc_xy(dev, x_frac, y, cp);
+	return console_normal_putc_xy(dev, vctx, x_frac, y, cp);
 }
 
 static int console_simple_ctx_new(struct udevice *dev, void **ctxp)
diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
index 378c7ec6fc7..42c9de888d8 100644
--- a/drivers/video/console_rotate.c
+++ b/drivers/video/console_rotate.c
@@ -72,10 +72,10 @@  static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc,
 	return 0;
 }
 
-static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, int cp)
+static int console_putc_xy_1(struct udevice *dev, void *vctx, uint x_frac,
+			     uint y, int cp)
 {
-	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
-	struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
+	struct vidconsole_ctx *ctx = vctx;
 	struct udevice *vid = dev->parent;
 	struct video_priv *vid_priv = dev_get_uclass_priv(vid);
 	struct console_simple_priv *priv = dev_get_priv(dev);
@@ -161,10 +161,10 @@  static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc,
 	return 0;
 }
 
-static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, int cp)
+static int console_putc_xy_2(struct udevice *dev, void *vctx, uint x_frac,
+			     uint y, int cp)
 {
-	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
-	struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
+	struct vidconsole_ctx *ctx = vctx;
 	struct udevice *vid = dev->parent;
 	struct video_priv *vid_priv = dev_get_uclass_priv(vid);
 	struct console_simple_priv *priv = dev_get_priv(dev);
@@ -252,10 +252,10 @@  static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc,
 	return 0;
 }
 
-static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, int cp)
+static int console_putc_xy_3(struct udevice *dev, void *vctx, uint x_frac,
+			     uint y, int cp)
 {
-	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
-	struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
+	struct vidconsole_ctx *ctx = vctx;
 	struct udevice *vid = dev->parent;
 	struct video_priv *vid_priv = dev_get_uclass_priv(vid);
 	struct console_simple_priv *priv = dev_get_priv(dev);
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index b4b491039ae..a72e2342010 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -395,11 +395,11 @@  static void clear_from(struct udevice *dev, int index)
 	}
 }
 
-static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
-				    int cp)
+static int console_truetype_putc_xy(struct udevice *dev, void *vctx, uint x,
+				    uint y, int cp)
 {
 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
-	struct console_tt_ctx *ctx = vidconsole_ctx(dev);
+	struct console_tt_ctx *ctx = vctx;
 	struct vidconsole_ctx *com = &ctx->com;
 	struct console_tt_priv *priv = dev_get_priv(dev);
 	struct console_tt_metrics *met = ctx->cur_met;
diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index 29a1accb64c..ec78068f734 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -22,13 +22,15 @@ 
 #include <video_font.h>		/* Bitmap font for code page 437 */
 #include <linux/ctype.h>
 
-int vidconsole_putc_xy(struct udevice *dev, uint x, uint y, int ch)
+int vidconsole_putc_xy(struct udevice *dev, void *vctx, uint x, uint y, int ch)
 {
+	struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
 	struct vidconsole_ops *ops = vidconsole_get_ops(dev);
 
 	if (!ops->putc_xy)
 		return -ENOSYS;
-	return ops->putc_xy(dev, x, y, ch);
+	return ops->putc_xy(dev, vctx ?: vidconsole_ctx_from_priv(priv), x, y,
+			    ch);
 }
 
 int vidconsole_move_rows(struct udevice *dev, uint rowdst, uint rowsrc,
@@ -468,10 +470,10 @@  static int vidconsole_output_glyph(struct udevice *dev, int ch)
 	 * colour depth. Check this and return an error to help with
 	 * diagnosis.
 	 */
-	ret = vidconsole_putc_xy(dev, ctx->xcur_frac, ctx->ycur, ch);
+	ret = vidconsole_putc_xy(dev, ctx, ctx->xcur_frac, ctx->ycur, ch);
 	if (ret == -EAGAIN) {
 		vidconsole_newline(dev, ctx);
-		ret = vidconsole_putc_xy(dev, ctx->xcur_frac, ctx->ycur, ch);
+		ret = vidconsole_putc_xy(dev, ctx, ctx->xcur_frac, ctx->ycur, ch);
 	}
 	if (ret < 0)
 		return ret;
diff --git a/drivers/video/vidconsole_internal.h b/drivers/video/vidconsole_internal.h
index ef864a7c858..8b598b26b13 100644
--- a/drivers/video/vidconsole_internal.h
+++ b/drivers/video/vidconsole_internal.h
@@ -187,12 +187,14 @@  int console_simple_select_font(struct udevice *dev, const char *name, uint size)
  * Normal console putc_xy function that can be called by other console drivers
  *
  * @param dev		console device
+ * @param ctx		vidconsole context to use, or NULL for default
  * @param x_frac	fractional X position
  * @param y		Y position in pixels
  * @param cp		Unicode code point
  * @returns width in fractional pixels, or -ve on error
  */
-int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp);
+int console_normal_putc_xy(struct udevice *dev, void *ctx, uint x_frac,
+			   uint y, int cp);
 
 /**
  * Fixed font putc_xy function that can be called with explicit font data
diff --git a/include/video_console.h b/include/video_console.h
index 3390d4fe1a7..9627d645189 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -240,6 +240,7 @@  struct vidconsole_ops {
 	 * putc_xy() - write a single character to a position
 	 *
 	 * @dev:	Device to write to
+	 * @ctx:	Vidconsole context to use (cannot be NULL)
 	 * @x_frac:	Fractional pixel X position (0=left-most pixel) which
 	 *		is the X position multipled by VID_FRAC_DIV.
 	 * @y:		Pixel Y position (0=top-most pixel)
@@ -248,7 +249,8 @@  struct vidconsole_ops {
 	 * if all is OK, -EAGAIN if we ran out of space on this line, other -ve
 	 * on error
 	 */
-	int (*putc_xy)(struct udevice *dev, uint x_frac, uint y, int cp);
+	int (*putc_xy)(struct udevice *dev, void *ctx, uint x_frac, uint y,
+		       int cp);
 
 	/**
 	 * move_rows() - Move text rows from one place to another
@@ -687,6 +689,7 @@  void vidconsole_pop_colour(struct udevice *dev, struct vidconsole_colour *old);
  * vidconsole_putc_xy() - write a single character to a position
  *
  * @dev:	Device to write to
+ * @ctx:	Vidconsole context to use, or NULL to use default
  * @x_frac:	Fractional pixel X position (0=left-most pixel) which
  *		is the X position multipled by VID_FRAC_DIV.
  * @y:		Pixel Y position (0=top-most pixel)
@@ -695,7 +698,7 @@  void vidconsole_pop_colour(struct udevice *dev, struct vidconsole_colour *old);
  * if all is OK, -EAGAIN if we ran out of space on this line, other -ve
  * on error
  */
-int vidconsole_putc_xy(struct udevice *dev, uint x, uint y, int cp);
+int vidconsole_putc_xy(struct udevice *dev, void *ctx, uint x, uint y, int cp);
 
 /**
  * vidconsole_move_rows() - Move text rows from one place to another
diff --git a/test/dm/video.c b/test/dm/video.c
index 97778a70559..e4599be30a8 100644
--- a/test/dm/video.c
+++ b/test/dm/video.c
@@ -264,16 +264,16 @@  static int dm_test_video_text(struct unit_test_state *uts)
 	ut_assertok(video_check_copy_fb(uts, dev));
 
 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
-	vidconsole_putc_xy(con, 0, 0, 'a');
+	vidconsole_putc_xy(con, NULL, 0, 0, 'a');
 	ut_asserteq(79, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
-	vidconsole_putc_xy(con, 0, 0, ' ');
+	vidconsole_putc_xy(con, NULL, 0, 0, ' ');
 	ut_asserteq(46, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
 	for (i = 0; i < 20; i++)
-		vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
+		vidconsole_putc_xy(con, NULL, VID_TO_POS(i * 8), 0, ' ' + i);
 	ut_asserteq(273, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
@@ -282,7 +282,7 @@  static int dm_test_video_text(struct unit_test_state *uts)
 	ut_assertok(video_check_copy_fb(uts, dev));
 
 	for (i = 0; i < 20; i++)
-		vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
+		vidconsole_putc_xy(con, NULL, VID_TO_POS(i * 8), 0, ' ' + i);
 	ut_asserteq(273, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
@@ -306,16 +306,16 @@  static int dm_test_video_text_12x22(struct unit_test_state *uts)
 	ut_assertok(video_check_copy_fb(uts, dev));
 
 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
-	vidconsole_putc_xy(con, 0, 0, 'a');
+	vidconsole_putc_xy(con, NULL, 0, 0, 'a');
 	ut_asserteq(89, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
-	vidconsole_putc_xy(con, 0, 0, ' ');
+	vidconsole_putc_xy(con, NULL, 0, 0, ' ');
 	ut_asserteq(46, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
 	for (i = 0; i < 20; i++)
-		vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
+		vidconsole_putc_xy(con, NULL, VID_TO_POS(i * 8), 0, ' ' + i);
 	ut_asserteq(363, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
@@ -324,7 +324,7 @@  static int dm_test_video_text_12x22(struct unit_test_state *uts)
 	ut_assertok(video_check_copy_fb(uts, dev));
 
 	for (i = 0; i < 20; i++)
-		vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
+		vidconsole_putc_xy(con, NULL, VID_TO_POS(i * 8), 0, ' ' + i);
 	ut_asserteq(363, video_compress_fb(uts, dev, false));
 	ut_assertok(video_check_copy_fb(uts, dev));
 
@@ -1442,7 +1442,7 @@  static int dm_test_video_sync_damage(struct unit_test_state *uts)
 	ut_assert(!vid_bbox_valid(&priv->damage));
 
 	/* Write a small piece of text at a specific position */
-	vidconsole_putc_xy(con, VID_TO_POS(400), 67, 'T');
+	vidconsole_putc_xy(con, NULL, VID_TO_POS(400), 67, 'T');
 
 	/* Check priv->damage before sync - should have text damage */
 	ut_assert(vid_bbox_valid(&priv->damage));