From: Simon Glass <simon.glass@canonical.com> Move the x_charsize and y_charsize fields from vidconsole_priv into vidconsole_ctx. This continues the refactoring to support multiple clients with their own context. Use a local ctx pointer (or vc_ctx where ctx is already used for the driver's context) in each function that accesses these fields. Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: Simon Glass <simon.glass@canonical.com> --- board/atmel/common/video_display.c | 3 +- boot/expo_test.c | 10 +++---- drivers/video/console_core.c | 3 +- drivers/video/console_normal.c | 6 ++-- drivers/video/console_rotate.c | 9 ++++-- drivers/video/console_truetype.c | 29 ++++++++++--------- drivers/video/vidconsole-uclass.c | 45 ++++++++++++++++-------------- drivers/video/video-uclass.c | 4 +-- include/video_console.h | 16 +++++------ 9 files changed, 68 insertions(+), 57 deletions(-) diff --git a/board/atmel/common/video_display.c b/board/atmel/common/video_display.c index 77188820581..4d6ac3a740e 100644 --- a/board/atmel/common/video_display.c +++ b/board/atmel/common/video_display.c @@ -68,7 +68,8 @@ int at91_video_show_board_info(void) priv = dev_get_uclass_priv(con); vidconsole_position_cursor(con, 0, (logo_info.logo_height + - priv->y_charsize - 1) / priv->y_charsize); + priv->ctx.y_charsize - 1) / + priv->ctx.y_charsize); for (s = buf, i = 0; i < len; s++, i++) vidconsole_put_char(con, *s); diff --git a/boot/expo_test.c b/boot/expo_test.c index 3ddeb86fb2c..a905b144745 100644 --- a/boot/expo_test.c +++ b/boot/expo_test.c @@ -176,7 +176,7 @@ int expo_test_render(struct expo *exp) /* Display frame count */ snprintf(buf, sizeof(buf), "frame %6d", test->render_count); - x = vid_priv->xsize - 18 * cons_priv->x_charsize; + x = vid_priv->xsize - 18 * cons_priv->ctx.x_charsize; y = 10; vidconsole_set_cursor_pos(exp->cons, x, y); vidconsole_put_string(exp->cons, buf); @@ -184,7 +184,7 @@ int expo_test_render(struct expo *exp) /* Display FPS on next line (only if non-zero) */ if (test->fps_last > 0) { snprintf(buf, sizeof(buf), "fps %6d", test->fps_last); - y += cons_priv->y_charsize; + y += cons_priv->ctx.y_charsize; vidconsole_set_cursor_pos(exp->cons, x, y); vidconsole_put_string(exp->cons, buf); } @@ -193,7 +193,7 @@ int expo_test_render(struct expo *exp) snprintf(buf, sizeof(buf), "render %6lu.%01lums", test->render_avg_us / 1000, (test->render_avg_us % 1000) / 100); - y += cons_priv->y_charsize; + y += cons_priv->ctx.y_charsize; vidconsole_set_cursor_pos(exp->cons, x, y); vidconsole_put_string(exp->cons, buf); @@ -201,7 +201,7 @@ int expo_test_render(struct expo *exp) snprintf(buf, sizeof(buf), "sync %6lu.%01lums", test->sync_avg_us / 1000, (test->sync_avg_us % 1000) / 100); - y += cons_priv->y_charsize; + y += cons_priv->ctx.y_charsize; vidconsole_set_cursor_pos(exp->cons, x, y); vidconsole_put_string(exp->cons, buf); @@ -209,7 +209,7 @@ int expo_test_render(struct expo *exp) snprintf(buf, sizeof(buf), "poll %6lu.%01lums", test->poll_avg_us / 1000, (test->poll_avg_us % 1000) / 100); - y += cons_priv->y_charsize; + y += cons_priv->ctx.y_charsize; vidconsole_set_cursor_pos(exp->cons, x, y); vidconsole_put_string(exp->cons, buf); diff --git a/drivers/video/console_core.c b/drivers/video/console_core.c index 3f3efb94ab1..9cf5831b562 100644 --- a/drivers/video/console_core.c +++ b/drivers/video/console_core.c @@ -340,6 +340,7 @@ int console_fixed_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp, struct video_fontdata *fontdata) { struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv); struct udevice *vid = dev->parent; struct video_priv *vid_priv = dev_get_uclass_priv(vid); int pbytes = VNBYTES(vid_priv->bpix); @@ -349,7 +350,7 @@ int console_fixed_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp, uchar *pfont = fontdata->video_fontdata + ch * fontdata->char_pixel_bytes; - if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) + if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac) return -EAGAIN; linenum = y; x = VID_TO_PIXEL(x_frac); diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c index 5417612f9de..cc0ac79a924 100644 --- a/drivers/video/console_normal.c +++ b/drivers/video/console_normal.c @@ -110,14 +110,14 @@ static __maybe_unused int console_get_cursor_info(struct udevice *dev) index = vc_priv->cli_index; /* rounded up character position in this line */ - xpos = (x + vc_priv->x_charsize - 1) / vc_priv->x_charsize; + xpos = (x + ctx->x_charsize - 1) / ctx->x_charsize; /* number of characters which can fit on this (first) line */ xspace = ctx->cols - xpos; if (!curs->indent && index > xspace) { /* move to the next line */ - y += vc_priv->y_charsize; + y += ctx->y_charsize; index -= xspace; /* figure out the available space in subsequent lines */ @@ -140,7 +140,7 @@ static __maybe_unused int console_get_cursor_info(struct udevice *dev) /* Store line pointer and height in cursor struct */ curs->x = x; curs->y = y; - curs->height = vc_priv->y_charsize; + curs->height = ctx->y_charsize; curs->index = vc_priv->cli_index; return 0; diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c index 886b25dcfaf..85c571accd4 100644 --- a/drivers/video/console_rotate.c +++ b/drivers/video/console_rotate.c @@ -75,6 +75,7 @@ static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc, static int console_putc_xy_1(struct udevice *dev, 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 udevice *vid = dev->parent; struct video_priv *vid_priv = dev_get_uclass_priv(vid); struct console_simple_priv *priv = dev_get_priv(dev); @@ -86,7 +87,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, int cp) uchar *pfont = fontdata->video_fontdata + ch * fontdata->char_pixel_bytes; - if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) + if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac) return -EAGAIN; linenum = VID_TO_PIXEL(x_frac) + 1; x = y + 1; @@ -163,6 +164,7 @@ static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc, static int console_putc_xy_2(struct udevice *dev, 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 udevice *vid = dev->parent; struct video_priv *vid_priv = dev_get_uclass_priv(vid); struct console_simple_priv *priv = dev_get_priv(dev); @@ -174,7 +176,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, int cp) uchar *pfont = fontdata->video_fontdata + ch * fontdata->char_pixel_bytes; - if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) + if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac) return -EAGAIN; linenum = vid_priv->ysize - y - 1; x = vid_priv->xsize - VID_TO_PIXEL(x_frac) - 1; @@ -253,6 +255,7 @@ static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc, static int console_putc_xy_3(struct udevice *dev, 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 udevice *vid = dev->parent; struct video_priv *vid_priv = dev_get_uclass_priv(vid); struct console_simple_priv *priv = dev_get_priv(dev); @@ -264,7 +267,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, int cp) uchar *pfont = fontdata->video_fontdata + ch * fontdata->char_pixel_bytes; - if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) + if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac) return -EAGAIN; x = y; linenum = vid_priv->ysize - VID_TO_PIXEL(x_frac) - 1; diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c index f241761bbbc..62a3f501958 100644 --- a/drivers/video/console_truetype.c +++ b/drivers/video/console_truetype.c @@ -266,7 +266,7 @@ struct console_tt_store { static int console_truetype_set_row(struct udevice *dev, uint row, int clr) { struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); - struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *vc_ctx = vidconsole_ctx(dev); struct console_tt_priv *priv = dev_get_priv(dev); void *end, *line; int font_height; @@ -314,9 +314,9 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr) video_damage(dev->parent, 0, - vc_priv->y_charsize * row, + vc_ctx->y_charsize * row, vid_priv->xsize, - vc_priv->y_charsize); + vc_ctx->y_charsize); return 0; } @@ -325,7 +325,7 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst, uint rowsrc, uint count) { struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); - struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *vc_ctx = vidconsole_ctx(dev); struct console_tt_priv *priv = dev_get_priv(dev); struct console_tt_ctx *ctx = &priv->ctx; void *dst; @@ -349,9 +349,9 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst, video_damage(dev->parent, 0, - vc_priv->y_charsize * rowdst, + vc_ctx->y_charsize * rowdst, vid_priv->xsize, - vc_priv->y_charsize * count); + vc_ctx->y_charsize * count); return 0; } @@ -369,6 +369,7 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst, static void clear_from(struct udevice *dev, int index) { struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *vc_ctx = vidconsole_ctx_from_priv(vc_priv); struct console_tt_priv *priv = dev_get_priv(dev); struct console_tt_ctx *ctx = &priv->ctx; struct udevice *vid_dev = dev->parent; @@ -390,21 +391,23 @@ static void clear_from(struct udevice *dev, int index) /* If on the same line, just erase from start to end position */ if (ystart == yend) { - video_fill_part(vid_dev, xstart, ystart, xend, ystart + vc_priv->y_charsize, + video_fill_part(vid_dev, xstart, ystart, xend, + ystart + vc_ctx->y_charsize, vid_priv->colour_bg); } else { /* Different lines - erase to end of first line */ video_fill_part(vid_dev, xstart, ystart, vid_priv->xsize, - ystart + vc_priv->y_charsize, vid_priv->colour_bg); + ystart + vc_ctx->y_charsize, vid_priv->colour_bg); /* Erase any complete lines in between */ - if (yend > ystart + vc_priv->y_charsize) { - video_fill_part(vid_dev, 0, ystart + vc_priv->y_charsize, + if (yend > ystart + vc_ctx->y_charsize) { + video_fill_part(vid_dev, 0, ystart + vc_ctx->y_charsize, vid_priv->xsize, yend, vid_priv->colour_bg); } /* Erase from start of final line to end of last character */ - video_fill_part(vid_dev, 0, yend, xend, yend + vc_priv->y_charsize, + video_fill_part(vid_dev, 0, yend, xend, + yend + vc_ctx->y_charsize, vid_priv->colour_bg); } } @@ -938,8 +941,8 @@ static void select_metrics(struct udevice *dev, struct console_tt_metrics *met) struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev); priv->cur_met = met; - vc_priv->x_charsize = met->font_size; - vc_priv->y_charsize = met->font_size; + ctx->x_charsize = met->font_size; + ctx->y_charsize = met->font_size; vc_priv->xstart_frac = VID_TO_POS(2); ctx->cols = vid_priv->xsize / met->font_size; ctx->rows = vid_priv->ysize / met->font_size; diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c index 28c9e88cbb6..71bcac4288e 100644 --- a/drivers/video/vidconsole-uclass.c +++ b/drivers/video/vidconsole-uclass.c @@ -76,11 +76,11 @@ static int vidconsole_back(struct udevice *dev) /* Hide cursor at old position if it's visible */ vidconsole_hide_cursor(dev); - priv->xcur_frac -= VID_TO_POS(priv->x_charsize); + priv->xcur_frac -= VID_TO_POS(ctx->x_charsize); if (priv->xcur_frac < priv->xstart_frac) { priv->xcur_frac = (ctx->cols - 1) * - VID_TO_POS(priv->x_charsize); - priv->ycur -= priv->y_charsize; + VID_TO_POS(ctx->x_charsize); + priv->ycur -= ctx->y_charsize; if (priv->ycur < 0) priv->ycur = 0; } @@ -101,17 +101,17 @@ static void vidconsole_newline(struct udevice *dev) int i, ret; priv->xcur_frac = priv->xstart_frac; - priv->ycur += priv->y_charsize; + priv->ycur += ctx->y_charsize; /* Check if we need to scroll the terminal */ if (vid_priv->rot % 2 ? - priv->ycur + priv->x_charsize > vid_priv->xsize : - priv->ycur + priv->y_charsize > vid_priv->ysize) { + priv->ycur + ctx->x_charsize > vid_priv->xsize : + priv->ycur + ctx->y_charsize > vid_priv->ysize) { vidconsole_move_rows(dev, 0, rows, ctx->rows - rows); for (i = 0; i < rows; i++) vidconsole_set_row(dev, ctx->rows - i - 1, vid_priv->colour_bg); - priv->ycur -= rows * priv->y_charsize; + priv->ycur -= rows * ctx->y_charsize; } priv->last_ch = 0; @@ -178,9 +178,11 @@ static void set_cursor_position(struct udevice *dev, int row, int col) static void get_cursor_position(struct vidconsole_priv *priv, int *row, int *col) { - *row = priv->ycur / priv->y_charsize; + struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(priv); + + *row = priv->ycur / ctx->y_charsize; *col = VID_TO_PIXEL(priv->xcur_frac - priv->xstart_frac) / - priv->x_charsize; + ctx->x_charsize; } /* @@ -649,7 +651,7 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size, const char *text, int limit, struct vidconsole_bbox *bbox, struct alist *lines) { - struct vidconsole_priv *priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *ctx = vidconsole_ctx(dev); struct vidconsole_ops *ops = vidconsole_get_ops(dev); int ret; @@ -664,8 +666,8 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size, bbox->valid = true; bbox->x0 = 0; bbox->y0 = 0; - bbox->x1 = priv->x_charsize * strlen(text); - bbox->y1 = priv->y_charsize; + bbox->x1 = ctx->x_charsize * strlen(text); + bbox->y1 = ctx->y_charsize; return 0; } @@ -673,7 +675,7 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size, int vidconsole_nominal(struct udevice *dev, const char *name, uint size, uint num_chars, struct vidconsole_bbox *bbox) { - struct vidconsole_priv *priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *ctx = vidconsole_ctx(dev); struct vidconsole_ops *ops = vidconsole_get_ops(dev); int ret; @@ -686,8 +688,8 @@ int vidconsole_nominal(struct udevice *dev, const char *name, uint size, bbox->valid = true; bbox->x0 = 0; bbox->y0 = 0; - bbox->x1 = priv->x_charsize * num_chars; - bbox->y1 = priv->y_charsize; + bbox->x1 = ctx->x_charsize * num_chars; + bbox->y1 = ctx->y_charsize; return 0; } @@ -880,10 +882,11 @@ static int vidconsole_pre_probe(struct udevice *dev) static int vidconsole_post_probe(struct udevice *dev) { struct vidconsole_priv *priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(priv); struct stdio_dev *sdev = &priv->sdev; if (!priv->tab_width_frac) - priv->tab_width_frac = VID_TO_POS(priv->x_charsize) * 8; + priv->tab_width_frac = VID_TO_POS(ctx->x_charsize) * 8; if (dev_seq(dev)) { snprintf(sdev->name, sizeof(sdev->name), "vidconsole%d", @@ -932,13 +935,13 @@ int vidconsole_clear_and_reset(struct udevice *dev) void vidconsole_position_cursor(struct udevice *dev, unsigned col, unsigned row) { - struct vidconsole_priv *priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *ctx = vidconsole_ctx(dev); struct udevice *vid_dev = dev->parent; struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev); short x, y; - x = min_t(short, col * priv->x_charsize, vid_priv->xsize - 1); - y = min_t(short, row * priv->y_charsize, vid_priv->ysize - 1); + x = min_t(short, col * ctx->x_charsize, vid_priv->xsize - 1); + y = min_t(short, row * ctx->y_charsize, vid_priv->ysize - 1); vidconsole_set_cursor_pos(dev, x, y); } @@ -961,8 +964,8 @@ void vidconsole_set_bitmap_font(struct udevice *dev, log_debug("byte width: %d\n", fontdata->byte_width); log_debug("height: %d\n", fontdata->height); - vc_priv->x_charsize = fontdata->width; - vc_priv->y_charsize = fontdata->height; + ctx->x_charsize = fontdata->width; + ctx->y_charsize = fontdata->height; if (vid_priv->rot % 2) { ctx->cols = vid_priv->ysize / fontdata->width; ctx->rows = vid_priv->xsize / fontdata->height; diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c index 75b13481380..5dd6df8468e 100644 --- a/drivers/video/video-uclass.c +++ b/drivers/video/video-uclass.c @@ -665,13 +665,13 @@ static int show_splash(struct udevice *dev) int video_default_font_height(struct udevice *dev) { - struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); + struct vidconsole_ctx *ctx = vidconsole_ctx(dev); if (IS_ENABLED(CONFIG_CONSOLE_TRUETYPE)) return IF_ENABLED_INT(CONFIG_CONSOLE_TRUETYPE, CONFIG_CONSOLE_TRUETYPE_SIZE); - return vc_priv->y_charsize; + return ctx->y_charsize; } static void video_idle(struct cyclic_info *cyc) diff --git a/include/video_console.h b/include/video_console.h index ec07c4e2286..0d0e6edbfb7 100644 --- a/include/video_console.h +++ b/include/video_console.h @@ -79,19 +79,23 @@ struct vidconsole_cursor { * This holds per-client state for video consoles. It can be used by clients * to maintain separate contexts for different text-entry operations. * - * @rows: Number of text rows - * @cols: Number of text columns + * @rows: Number of text rows + * @cols: Number of text columns + * @x_charsize: Character width in pixels + * @y_charsize: Character height in pixels */ struct vidconsole_ctx { int rows; int cols; + int x_charsize; + int y_charsize; }; /** * struct vidconsole_priv - uclass-private data about a console device * - * Drivers must set up @ctx.rows, @ctx.cols, @x_charsize, @y_charsize in their - * probe() method. Drivers may set up @xstart_frac if desired. + * Drivers must set up @ctx.rows, @ctx.cols, @ctx.x_charsize, @ctx.y_charsize + * in their probe() method. Drivers may set up @xstart_frac if desired. * * Note that these values relate to the rotated console, so that an 80x25 * console which is rotated 90 degrees will have rows=80 and cols=25 @@ -105,8 +109,6 @@ struct vidconsole_ctx { * @xcur_frac: Current X position, in fractional units (VID_TO_POS(x)) * @ycur: Current Y position in pixels (0=top) * @ctx: Per-client context - * @x_charsize: Character width in pixels - * @y_charsize: Character height in pixels * @tab_width_frac: Tab width in fractional units * @xsize_frac: Width of the display in fractional units * @xstart_frac: Left margin for the text console in fractional units @@ -128,8 +130,6 @@ struct vidconsole_priv { struct vidconsole_ctx ctx; int xcur_frac; int ycur; - int x_charsize; - int y_charsize; int tab_width_frac; int xsize_frac; int xstart_frac; -- 2.43.0