[PATCH] char/agp: remove agp_bridge_data::type

2024-02-13 Thread Jiri Slaby (SUSE)
agp_bridge_data::type is unused (and I cannot find when was used last).

Therefore, remove it.

Found by https://github.com/jirislaby/clang-struct.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: David Airlie 
Cc: dri-devel@lists.freedesktop.org
---
 drivers/char/agp/agp.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h
index 5c36ab85f80b..67d7be800a7c 100644
--- a/drivers/char/agp/agp.h
+++ b/drivers/char/agp/agp.h
@@ -138,7 +138,6 @@ struct agp_bridge_data {
unsigned long gart_bus_addr;
unsigned long gatt_bus_addr;
u32 mode;
-   enum chipset_type type;
unsigned long *key_list;
atomic_t current_memory_agp;
atomic_t agp_in_use;
-- 
2.43.1



[PATCH] fbcon: always restore the old font data in fbcon_do_set_font()

2024-02-08 Thread Jiri Slaby (SUSE)
Commit a5a923038d70 (fbdev: fbcon: Properly revert changes when
vc_resize() failed) started restoring old font data upon failure (of
vc_resize()). But it performs so only for user fonts. It means that the
"system"/internal fonts are not restored at all. So in result, the very
first call to fbcon_do_set_font() performs no restore at all upon
failing vc_resize().

This can be reproduced by Syzkaller to crash the system on the next
invocation of font_get(). It's rather hard to hit the allocation failure
in vc_resize() on the first font_set(), but not impossible. Esp. if
fault injection is used to aid the execution/failure. It was
demonstrated by Sirius:
  BUG: unable to handle page fault for address: fff8
  #PF: supervisor read access in kernel mode
  #PF: error_code(0x) - not-present page
  PGD cb7b067 P4D cb7b067 PUD cb7d067 PMD 0
  Oops:  [#1] PREEMPT SMP KASAN
  CPU: 1 PID: 8007 Comm: poc Not tainted 6.7.0-g9d1694dc91ce #20
  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 
04/01/2014
  RIP: 0010:fbcon_get_font+0x229/0x800 drivers/video/fbdev/core/fbcon.c:2286
  Call Trace:
   
   con_font_get drivers/tty/vt/vt.c:4558 [inline]
   con_font_op+0x1fc/0xf20 drivers/tty/vt/vt.c:4673
   vt_k_ioctl drivers/tty/vt/vt_ioctl.c:474 [inline]
   vt_ioctl+0x632/0x2ec0 drivers/tty/vt/vt_ioctl.c:752
   tty_ioctl+0x6f8/0x1570 drivers/tty/tty_io.c:2803
   vfs_ioctl fs/ioctl.c:51 [inline]
  ...

So restore the font data in any case, not only for user fonts. Note the
later 'if' is now protected by 'old_userfont' and not 'old_data' as the
latter is always set now. (And it is supposed to be non-NULL. Otherwise
we would see the bug above again.)

Signed-off-by: Jiri Slaby (SUSE) 
Fixes: a5a923038d70 ("fbdev: fbcon: Properly revert changes when vc_resize() 
failed")
Cc: Ubisectech Sirius 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 8 +++-
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 17a9fc80b4e4..98d0e2dbcd2f 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2395,11 +2395,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, 
int h, int charcount,
struct fbcon_ops *ops = info->fbcon_par;
struct fbcon_display *p = _display[vc->vc_num];
int resize, ret, old_userfont, old_width, old_height, old_charcount;
-   char *old_data = NULL;
+   u8 *old_data = vc->vc_font.data;
 
resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
-   if (p->userfont)
-   old_data = vc->vc_font.data;
vc->vc_font.data = (void *)(p->fontdata = data);
old_userfont = p->userfont;
if ((p->userfont = userfont))
@@ -2433,13 +2431,13 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, 
int h, int charcount,
update_screen(vc);
}
 
-   if (old_data && (--REFCOUNT(old_data) == 0))
+   if (old_userfont && (--REFCOUNT(old_data) == 0))
kfree(old_data - FONT_EXTRA_WORDS * sizeof(int));
return 0;
 
 err_out:
p->fontdata = old_data;
-   vc->vc_font.data = (void *)old_data;
+   vc->vc_font.data = old_data;
 
if (userfont) {
p->userfont = old_userfont;
-- 
2.43.0



[PATCH v2 42/47] fbcon: remove fbcon_getxy()

2024-01-22 Thread Jiri Slaby (SUSE)
Again, fbcon_getxy() is the same as the default implementation since the
softscroll removal in commit 50145474f6ef (fbcon: remove soft scrollback
code). Drop that.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 25 -
 1 file changed, 25 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 2166ea1a5430..9c2962900d13 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2593,30 +2593,6 @@ static void fbcon_set_palette(struct vc_data *vc, const 
unsigned char *table)
fb_set_cmap(_cmap, info);
 }
 
-static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
-int *px, int *py)
-{
-   unsigned long ret;
-   int x, y;
-
-   if (pos >= vc->vc_origin && pos < vc->vc_scr_end) {
-   unsigned long offset = (pos - vc->vc_origin) / 2;
-
-   x = offset % vc->vc_cols;
-   y = offset / vc->vc_cols;
-   ret = pos + (vc->vc_cols - x) * 2;
-   } else {
-   /* Should not happen */
-   x = y = 0;
-   ret = vc->vc_origin;
-   }
-   if (px)
-   *px = x;
-   if (py)
-   *py = y;
-   return ret;
-}
-
 /* As we might be inside of softback, we may work with non-contiguous buffer,
that's why we have to use a separate routine. */
 static void fbcon_invert_region(struct vc_data *vc, u16 * p, int cnt)
@@ -3157,7 +3133,6 @@ static const struct consw fb_con = {
.con_font_default   = fbcon_set_def_font,
.con_set_palette= fbcon_set_palette,
.con_invert_region  = fbcon_invert_region,
-   .con_getxy  = fbcon_getxy,
.con_resize = fbcon_resize,
.con_debug_enter= fbcon_debug_enter,
.con_debug_leave= fbcon_debug_leave,
-- 
2.43.0



[PATCH v2 39/47] fbcon: remove consw::con_screen_pos()

2024-01-22 Thread Jiri Slaby (SUSE)
fbcon_screen_pos() performs the same as the default implementation. The
only difference in the default implementation is that is considers both
vc->vc_origin and vc->vc_visible_origin. But given fbcon's softscroll
code was already removed in commit 50145474f6ef (fbcon: remove soft
scrollback code), both are always the same.

So remove fbcon_screen_pos() too.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 657160eec0a5..2166ea1a5430 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2593,11 +2593,6 @@ static void fbcon_set_palette(struct vc_data *vc, const 
unsigned char *table)
fb_set_cmap(_cmap, info);
 }
 
-static u16 *fbcon_screen_pos(const struct vc_data *vc, int offset)
-{
-   return (u16 *) (vc->vc_origin + offset);
-}
-
 static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
 int *px, int *py)
 {
@@ -3162,7 +3157,6 @@ static const struct consw fb_con = {
.con_font_default   = fbcon_set_def_font,
.con_set_palette= fbcon_set_palette,
.con_invert_region  = fbcon_invert_region,
-   .con_screen_pos = fbcon_screen_pos,
.con_getxy  = fbcon_getxy,
.con_resize = fbcon_resize,
.con_debug_enter= fbcon_debug_enter,
-- 
2.43.0



[PATCH v2 36/47] tty: vt: make font of consw::con_font_set() const

2024-01-22 Thread Jiri Slaby (SUSE)
Provided the font parameter of consw::con_font_set() is not supposed to
be changed, make it const.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c | 2 +-
 drivers/video/console/newport_con.c | 5 +++--
 drivers/video/console/sticon.c  | 4 ++--
 drivers/video/console/vgacon.c  | 2 +-
 drivers/video/fbdev/core/fbcon.c| 2 +-
 include/linux/console.h | 5 +++--
 6 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index de9148094c2d..0ac537f82f7a 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4625,7 +4625,7 @@ static int con_font_get(struct vc_data *vc, struct 
console_font_op *op)
return rc;
 }
 
-static int con_font_set(struct vc_data *vc, struct console_font_op *op)
+static int con_font_set(struct vc_data *vc, const struct console_font_op *op)
 {
struct console_font font;
int rc = -EINVAL;
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index dbb31bf87bf1..4203bd5fd0a1 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -496,7 +496,8 @@ static bool newport_blank(struct vc_data *c, enum 
vesa_blank_mode blank,
return true;
 }
 
-static int newport_set_font(int unit, struct console_font *op, unsigned int 
vpitch)
+static int newport_set_font(int unit, const struct console_font *op,
+   unsigned int vpitch)
 {
int w = op->width;
int h = op->height;
@@ -568,7 +569,7 @@ static int newport_font_default(struct vc_data *vc, struct 
console_font *op, cha
return newport_set_def_font(vc->vc_num, op);
 }
 
-static int newport_font_set(struct vc_data *vc, struct console_font *font,
+static int newport_font_set(struct vc_data *vc, const struct console_font 
*font,
unsigned int vpitch, unsigned int flags)
 {
return newport_set_font(vc->vc_num, font, vpitch);
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index cbb9ef438214..710201fb8ce4 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -153,7 +153,7 @@ static void sticon_set_def_font(int unit)
}
 }
 
-static int sticon_set_font(struct vc_data *vc, struct console_font *op,
+static int sticon_set_font(struct vc_data *vc, const struct console_font *op,
   unsigned int vpitch)
 {
struct sti_struct *sti = sticon_sti;
@@ -253,7 +253,7 @@ static int sticon_font_default(struct vc_data *vc, struct 
console_font *op, char
return 0;
 }
 
-static int sticon_font_set(struct vc_data *vc, struct console_font *font,
+static int sticon_font_set(struct vc_data *vc, const struct console_font *font,
   unsigned int vpitch, unsigned int flags)
 {
return sticon_set_font(vc, font, vpitch);
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index c9a22118102f..4d1c8f5863af 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -1039,7 +1039,7 @@ static int vgacon_adjust_height(struct vc_data *vc, 
unsigned fontheight)
return 0;
 }
 
-static int vgacon_font_set(struct vc_data *c, struct console_font *font,
+static int vgacon_font_set(struct vc_data *c, const struct console_font *font,
   unsigned int vpitch, unsigned int flags)
 {
unsigned charcount = font->charcount;
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index eee2adf5c682..62474630c4d4 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2460,7 +2460,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, 
int h, int charcount,
  *  but lets not assume that, since charcount of 512 is small for unicode 
support.
  */
 
-static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
+static int fbcon_set_font(struct vc_data *vc, const struct console_font *font,
  unsigned int vpitch, unsigned int flags)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
diff --git a/include/linux/console.h b/include/linux/console.h
index 6392bcd2fe7c..0a9f4cbdde83 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -75,8 +75,9 @@ struct consw {
bool(*con_switch)(struct vc_data *vc);
bool(*con_blank)(struct vc_data *vc, enum vesa_blank_mode blank,
 bool mode_switch);
-   int (*con_font_set)(struct vc_data *vc, struct console_font *font,
-   unsigned int vpitch, unsigned int flags);
+   int (*con_font_set)(struct vc_data *vc,
+   con

[PATCH v2 35/47] tty: vt: make types around consw::con_blank() bool

2024-01-22 Thread Jiri Slaby (SUSE)
Both the mode_switch parameter and the return value (a redraw needed)
are true/false. So switch them to bool, so that users won't return
-Eerrors or anything else.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/dummycon.c| 12 ++--
 drivers/video/console/mdacon.c  |  8 
 drivers/video/console/newport_con.c |  7 ---
 drivers/video/console/sticon.c  |  9 +
 drivers/video/console/vgacon.c  |  4 ++--
 drivers/video/fbdev/core/fbcon.c|  6 +++---
 include/linux/console.h |  7 +--
 7 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index d86c1d798690..139049368fdc 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -79,21 +79,21 @@ static void dummycon_putcs(struct vc_data *vc, const u16 
*s, unsigned int count,
raw_notifier_call_chain(_output_nh, 0, NULL);
 }
 
-static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
- int mode_switch)
+static bool dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+  bool mode_switch)
 {
/* Redraw, so that we get putc(s) for output done while blanked */
-   return 1;
+   return true;
 }
 #else
 static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y,
  unsigned int x) { }
 static void dummycon_putcs(struct vc_data *vc, const u16 *s, unsigned int 
count,
   unsigned int ypos, unsigned int xpos) { }
-static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
- int mode_switch)
+static bool dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+  bool mode_switch)
 {
-   return 0;
+   return false;
 }
 #endif
 
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 63e3ce678aab..c0e1f4554a44 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -451,8 +451,8 @@ static bool mdacon_switch(struct vc_data *c)
return true;/* redrawing needed */
 }
 
-static int mdacon_blank(struct vc_data *c, enum vesa_blank_mode blank,
-   int mode_switch)
+static bool mdacon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+bool mode_switch)
 {
if (mda_type == TYPE_MDA) {
if (blank) 
@@ -460,14 +460,14 @@ static int mdacon_blank(struct vc_data *c, enum 
vesa_blank_mode blank,
mda_convert_attr(c->vc_video_erase_char),
c->vc_screenbuf_size);
/* Tell console.c that it has to restore the screen itself */
-   return 1;
+   return true;
} else {
if (blank)
outb_p(0x00, mda_mode_port);/* disable video */
else
outb_p(MDA_MODE_VIDEO_EN | MDA_MODE_BLINK_EN, 
mda_mode_port);
-   return 0;
+   return false;
}
 }
 
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 38437a53b7f1..dbb31bf87bf1 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -476,8 +476,8 @@ static bool newport_switch(struct vc_data *vc)
return true;
 }
 
-static int newport_blank(struct vc_data *c, enum vesa_blank_mode blank,
-int mode_switch)
+static bool newport_blank(struct vc_data *c, enum vesa_blank_mode blank,
+ bool mode_switch)
 {
unsigned short treg;
 
@@ -492,7 +492,8 @@ static int newport_blank(struct vc_data *c, enum 
vesa_blank_mode blank,
newport_vc2_set(npregs, VC2_IREG_CONTROL,
(treg & ~(VC2_CTRL_EDISP)));
}
-   return 1;
+
+   return true;
 }
 
 static int newport_set_font(int unit, struct console_font *op, unsigned int 
vpitch)
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index e9d5d1f92883..cbb9ef438214 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -298,19 +298,20 @@ static bool sticon_switch(struct vc_data *conp)
 return true;   /* needs refreshing */
 }
 
-static int sticon_blank(struct vc_data *c, enum vesa_blank_mode blank,
-   int mode_switch)
+static bool sticon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+bool mode_switch)
 {
 if (blank == VESA_NO_BLANKING) {
if (mode_switch)
vga_is_gfx = 0;
-   return 1;

[PATCH v2 34/47] tty: vt: use enum constants for VESA blanking modes

2024-01-22 Thread Jiri Slaby (SUSE)
Use the new enum for VESA constants. This improves type checking in
consw::con_blank().

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---

Notes:
[v2] the enum is added earlier, so reword and rebase

 drivers/tty/vt/vt.c | 4 ++--
 drivers/video/console/dummycon.c| 6 --
 drivers/video/console/mdacon.c  | 3 ++-
 drivers/video/console/newport_con.c | 3 ++-
 drivers/video/console/sticon.c  | 3 ++-
 drivers/video/console/vgacon.c  | 7 ---
 drivers/video/fbdev/core/fbcon.c| 3 ++-
 include/linux/console.h | 3 ++-
 8 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 0d5d7b5074a4..de9148094c2d 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -175,7 +175,7 @@ int do_poke_blanked_console;
 int console_blanked;
 EXPORT_SYMBOL(console_blanked);
 
-static int vesa_blank_mode; /* 0:none 1:suspendV 2:suspendH 3:powerdown */
+static enum vesa_blank_mode vesa_blank_mode;
 static int vesa_off_interval;
 static int blankinterval;
 core_param(consoleblank, blankinterval, int, 0444);
@@ -4320,7 +4320,7 @@ static int set_vesa_blanking(u8 __user *mode_user)
return -EFAULT;
 
console_lock();
-   vesa_blank_mode = (mode < 4) ? mode : VESA_NO_BLANKING;
+   vesa_blank_mode = (mode <= VESA_BLANK_MAX) ? mode : VESA_NO_BLANKING;
console_unlock();
 
return 0;
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index c8d5aa0e3ed0..d86c1d798690 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -79,7 +79,8 @@ static void dummycon_putcs(struct vc_data *vc, const u16 *s, 
unsigned int count,
raw_notifier_call_chain(_output_nh, 0, NULL);
 }
 
-static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
+static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+ int mode_switch)
 {
/* Redraw, so that we get putc(s) for output done while blanked */
return 1;
@@ -89,7 +90,8 @@ static void dummycon_putc(struct vc_data *vc, u16 c, unsigned 
int y,
  unsigned int x) { }
 static void dummycon_putcs(struct vc_data *vc, const u16 *s, unsigned int 
count,
   unsigned int ypos, unsigned int xpos) { }
-static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
+static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+ int mode_switch)
 {
return 0;
 }
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 4485ef923bb3..63e3ce678aab 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -451,7 +451,8 @@ static bool mdacon_switch(struct vc_data *c)
return true;/* redrawing needed */
 }
 
-static int mdacon_blank(struct vc_data *c, int blank, int mode_switch)
+static int mdacon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+   int mode_switch)
 {
if (mda_type == TYPE_MDA) {
if (blank) 
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index ad3a09142770..38437a53b7f1 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -476,7 +476,8 @@ static bool newport_switch(struct vc_data *vc)
return true;
 }
 
-static int newport_blank(struct vc_data *c, int blank, int mode_switch)
+static int newport_blank(struct vc_data *c, enum vesa_blank_mode blank,
+int mode_switch)
 {
unsigned short treg;
 
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 817b89c45e81..e9d5d1f92883 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -298,7 +298,8 @@ static bool sticon_switch(struct vc_data *conp)
 return true;   /* needs refreshing */
 }
 
-static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
+static int sticon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+   int mode_switch)
 {
 if (blank == VESA_NO_BLANKING) {
if (mode_switch)
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 02eccd9b3542..84f3682704c7 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -81,7 +81,7 @@ static unsigned int   vga_video_num_lines;
/* Number of text lines */
 static boolvga_can_do_color;   /* Do we 
support colors? */
 static unsigned intvga_default_font_height __read_mostly;  /* Height of 
default screen font */
 static unsigned char   vga_video_type  __read_mostly;  /* Card type */
-static int 

[PATCH v2 25/47] tty: vt: sanitize consw::con_putc() parameters

2024-01-22 Thread Jiri Slaby (SUSE)
Make parameters of consw::con_putc() saner:
* x and y are unsigned now, as they cannot be negative, and
* ca is made u16, as it is composed of two 8bit values (character and
  attribute). See the con_putcs() hook, u16/ushort is worked on there.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/dummycon.c| 6 --
 drivers/video/console/newport_con.c | 4 ++--
 include/linux/console.h | 5 -
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 0a69d5c216ee..1874beed0325 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -50,7 +50,8 @@ void dummycon_unregister_output_notifier(struct 
notifier_block *nb)
raw_notifier_chain_unregister(_output_nh, nb);
 }
 
-static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos)
+static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y,
+  unsigned int x)
 {
WARN_CONSOLE_UNLOCKED();
 
@@ -84,7 +85,8 @@ static int dummycon_blank(struct vc_data *vc, int blank, int 
mode_switch)
return 1;
 }
 #else
-static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
+static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y,
+ unsigned int x) { }
 static void dummycon_putcs(struct vc_data *vc, const unsigned short *s,
   int count, int ypos, int xpos) { }
 static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 55c6106b3507..9b5c0118873e 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -367,8 +367,8 @@ static void newport_clear(struct vc_data *vc, unsigned int 
sy, unsigned int sx,
}
 }
 
-static void newport_putc(struct vc_data *vc, int charattr, int ypos,
-int xpos)
+static void newport_putc(struct vc_data *vc, u16 charattr, unsigned int ypos,
+unsigned int xpos)
 {
unsigned char *p;
 
diff --git a/include/linux/console.h b/include/linux/console.h
index 8fd96a5fca5f..92d57e5b3009 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -39,6 +39,8 @@ enum vc_intensity;
  * @con_init:   initialize the console on @vc. @init is true for the very first
  * call on this @vc.
  * @con_clear:  erase @count characters at [@x, @y] on @vc. @count >= 1.
+ * @con_putc:   emit one character with attributes @ca to [@x, @y] on @vc.
+ * (optional -- @con_putcs would be called instead)
  * @con_scroll: move lines from @top to @bottom in direction @dir by @lines.
  * Return true if no generic handling should be done.
  * Invoked by csi_M and printing to the console.
@@ -53,7 +55,8 @@ struct consw {
void(*con_deinit)(struct vc_data *vc);
void(*con_clear)(struct vc_data *vc, unsigned int y,
 unsigned int x, unsigned int count);
-   void(*con_putc)(struct vc_data *vc, int c, int ypos, int xpos);
+   void(*con_putc)(struct vc_data *vc, u16 ca, unsigned int y,
+   unsigned int x);
void(*con_putcs)(struct vc_data *vc, const unsigned short *s,
int count, int ypos, int xpos);
void(*con_cursor)(struct vc_data *vc, int mode);
-- 
2.43.0



[PATCH v2 30/47] tty: vt: make consw::con_switch() return a bool

2024-01-22 Thread Jiri Slaby (SUSE)
The non-zero (true) return value from consw::con_switch() means a redraw
is needed. So make this return type a bool explicitly instead of int.
The latter might imply that -Eerrors are expected. They are not.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c | 2 +-
 drivers/video/console/dummycon.c| 4 ++--
 drivers/video/console/mdacon.c  | 4 ++--
 drivers/video/console/newport_con.c | 4 ++--
 drivers/video/console/sticon.c  | 4 ++--
 drivers/video/console/vgacon.c  | 4 ++--
 drivers/video/fbdev/core/fbcon.c| 6 +++---
 include/linux/console.h | 4 +++-
 8 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index e4edcaf9d0a3..fd868046f586 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -970,7 +970,7 @@ void redraw_screen(struct vc_data *vc, int is_switch)
}
 
if (redraw) {
-   int update;
+   bool update;
int old_was_color = vc->vc_can_do_color;
 
set_origin(vc);
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 1171e27edef7..c8d5aa0e3ed0 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -122,9 +122,9 @@ static bool dummycon_scroll(struct vc_data *vc, unsigned 
int top,
return false;
 }
 
-static int dummycon_switch(struct vc_data *vc)
+static bool dummycon_switch(struct vc_data *vc)
 {
-   return 0;
+   return false;
 }
 
 /*
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index bc851a1d9f4d..4485ef923bb3 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -446,9 +446,9 @@ static void mdacon_clear(struct vc_data *c, unsigned int y, 
unsigned int x,
scr_memsetw(dest, eattr, width * 2);
 }
 
-static int mdacon_switch(struct vc_data *c)
+static bool mdacon_switch(struct vc_data *c)
 {
-   return 1;   /* redrawing needed */
+   return true;/* redrawing needed */
 }
 
 static int mdacon_blank(struct vc_data *c, int blank, int mode_switch)
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index e35406dea7c7..039d1c9937d2 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -459,7 +459,7 @@ static void newport_cursor(struct vc_data *vc, bool enable)
newport_vc2_set(npregs, VC2_IREG_CURSY, ycurs);
 }
 
-static int newport_switch(struct vc_data *vc)
+static bool newport_switch(struct vc_data *vc)
 {
static int logo_drawn = 0;
 
@@ -473,7 +473,7 @@ static int newport_switch(struct vc_data *vc)
}
}
 
-   return 1;
+   return true;
 }
 
 static int newport_blank(struct vc_data *c, int blank, int mode_switch)
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 786e1b3a98ea..f3bb48a0e980 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -293,9 +293,9 @@ static void sticon_clear(struct vc_data *conp, unsigned int 
sy, unsigned int sx,
  conp->vc_video_erase_char, font_data[conp->vc_num]);
 }
 
-static int sticon_switch(struct vc_data *conp)
+static bool sticon_switch(struct vc_data *conp)
 {
-return 1;  /* needs refreshing */
+return true;   /* needs refreshing */
 }
 
 static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index d93eb15da435..f89eb53c0b79 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -614,7 +614,7 @@ static void vgacon_doresize(struct vc_data *c,
raw_spin_unlock_irqrestore(_lock, flags);
 }
 
-static int vgacon_switch(struct vc_data *c)
+static bool vgacon_switch(struct vc_data *c)
 {
int x = c->vc_cols * VGA_FONTWIDTH;
int y = c->vc_rows * c->vc_cell_height;
@@ -643,7 +643,7 @@ static int vgacon_switch(struct vc_data *c)
vgacon_doresize(c, c->vc_cols, c->vc_rows);
}
 
-   return 0;   /* Redrawing not needed */
+   return false;   /* Redrawing not needed */
 }
 
 static void vga_set_palette(struct vc_data *vc, const unsigned char *table)
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index c1765a6ef490..d5d924225209 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2056,7 +2056,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int 
width,
return 0;
 }
 
-static int fbcon_switch(struct vc_data *vc)
+static bool fbcon_switch(struct vc_data *vc)
 {
struct fb_info *info, *old_info = NULL;
struct 

[PATCH v2 37/47] tty: vt: make consw::con_font_default()'s name const

2024-01-22 Thread Jiri Slaby (SUSE)
It's a name after all and that is not supposed to be changed. So make it
const to make this obvious.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/newport_con.c | 3 ++-
 drivers/video/console/sticon.c  | 3 ++-
 drivers/video/fbdev/core/fbcon.c| 3 ++-
 include/linux/console.h | 2 +-
 4 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 4203bd5fd0a1..a51cfc1d560e 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -564,7 +564,8 @@ static int newport_set_def_font(int unit, struct 
console_font *op)
return 0;
 }
 
-static int newport_font_default(struct vc_data *vc, struct console_font *op, 
char *name)
+static int newport_font_default(struct vc_data *vc, struct console_font *op,
+   const char *name)
 {
return newport_set_def_font(vc->vc_num, op);
 }
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 710201fb8ce4..4c7b4959a1aa 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -246,7 +246,8 @@ static int sticon_set_font(struct vc_data *vc, const struct 
console_font *op,
return 0;
 }
 
-static int sticon_font_default(struct vc_data *vc, struct console_font *op, 
char *name)
+static int sticon_font_default(struct vc_data *vc, struct console_font *op,
+  const char *name)
 {
sticon_set_def_font(vc->vc_num);
 
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 62474630c4d4..657160eec0a5 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2533,7 +2533,8 @@ static int fbcon_set_font(struct vc_data *vc, const 
struct console_font *font,
return fbcon_do_set_font(vc, font->width, font->height, charcount, 
new_data, 1);
 }
 
-static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, 
char *name)
+static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font,
+ const char *name)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
const struct font_desc *f;
diff --git a/include/linux/console.h b/include/linux/console.h
index 0a9f4cbdde83..6bb7e5e37ae4 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -81,7 +81,7 @@ struct consw {
int (*con_font_get)(struct vc_data *vc, struct console_font *font,
unsigned int vpitch);
int (*con_font_default)(struct vc_data *vc,
-   struct console_font *font, char *name);
+   struct console_font *font, const char *name);
int (*con_resize)(struct vc_data *vc, unsigned int width,
  unsigned int height, bool from_user);
void(*con_set_palette)(struct vc_data *vc,
-- 
2.43.0



[PATCH v2 27/47] consoles: use if instead of switch-case in consw::con_cursor()

2024-01-22 Thread Jiri Slaby (SUSE)
This is only a preparation for the following cleanup patch to make it
easier. Provided CM_ERASE is the only different, use 'if' instead of
'switch+case' in all those.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/newport_con.c | 26 +---
 drivers/video/console/sticon.c  | 27 ++--
 drivers/video/console/vgacon.c  | 66 +
 3 files changed, 53 insertions(+), 66 deletions(-)

diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 5e65ee0b7c07..f852717b88f0 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -443,24 +443,20 @@ static void newport_cursor(struct vc_data *vc, int mode)
unsigned short treg;
int xcurs, ycurs;
 
-   switch (mode) {
-   case CM_ERASE:
-   treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
-   newport_vc2_set(npregs, VC2_IREG_CONTROL,
-   (treg & ~(VC2_CTRL_ECDISP)));
-   break;
+   treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
 
-   case CM_MOVE:
-   case CM_DRAW:
-   treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
+   if (mode == CM_ERASE) {
newport_vc2_set(npregs, VC2_IREG_CONTROL,
-   (treg | VC2_CTRL_ECDISP));
-   xcurs = (vc->vc_pos - vc->vc_visible_origin) / 2;
-   ycurs = ((xcurs / vc->vc_cols) << 4) + 31;
-   xcurs = ((xcurs % vc->vc_cols) << 3) + xcurs_correction;
-   newport_vc2_set(npregs, VC2_IREG_CURSX, xcurs);
-   newport_vc2_set(npregs, VC2_IREG_CURSY, ycurs);
+   (treg & ~(VC2_CTRL_ECDISP)));
+   return;
}
+
+   newport_vc2_set(npregs, VC2_IREG_CONTROL, (treg | VC2_CTRL_ECDISP));
+   xcurs = (vc->vc_pos - vc->vc_visible_origin) / 2;
+   ycurs = ((xcurs / vc->vc_cols) << 4) + 31;
+   xcurs = ((xcurs % vc->vc_cols) << 3) + xcurs_correction;
+   newport_vc2_set(npregs, VC2_IREG_CURSX, xcurs);
+   newport_vc2_set(npregs, VC2_IREG_CURSY, ycurs);
 }
 
 static int newport_switch(struct vc_data *vc)
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 906da1fde7c8..42480874db00 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -95,23 +95,20 @@ static void sticon_cursor(struct vc_data *conp, int mode)
return;
 
 car1 = conp->vc_screenbuf[conp->state.x + conp->state.y * conp->vc_cols];
-switch (mode) {
-case CM_ERASE:
+if (mode == CM_ERASE) {
sti_putc(sticon_sti, car1, conp->state.y, conp->state.x,
 font_data[conp->vc_num]);
-   break;
-case CM_MOVE:
-case CM_DRAW:
-   switch (CUR_SIZE(conp->vc_cursor_type)) {
-   case CUR_UNDERLINE:
-   case CUR_LOWER_THIRD:
-   case CUR_LOWER_HALF:
-   case CUR_TWO_THIRDS:
-   case CUR_BLOCK:
-   sti_putc(sticon_sti, (car1 & 255) + (0 << 8) + (7 << 11),
-conp->state.y, conp->state.x, font_data[conp->vc_num]);
-   break;
-   }
+   return;
+}
+
+switch (CUR_SIZE(conp->vc_cursor_type)) {
+case CUR_UNDERLINE:
+case CUR_LOWER_THIRD:
+case CUR_LOWER_HALF:
+case CUR_TWO_THIRDS:
+case CUR_BLOCK:
+   sti_putc(sticon_sti, (car1 & 255) + (0 << 8) + (7 << 11),
+conp->state.y, conp->state.x, font_data[conp->vc_num]);
break;
 }
 }
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index aa0589085847..82d01a9ccd6d 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -514,47 +514,41 @@ static void vgacon_cursor(struct vc_data *c, int mode)
 
c_height = c->vc_cell_height;
 
-   switch (mode) {
-   case CM_ERASE:
-   write_vga(14, (c->vc_pos - vga_vram_base) / 2);
+   write_vga(14, (c->vc_pos - vga_vram_base) / 2);
+
+   if (mode == CM_ERASE) {
if (vga_video_type >= VIDEO_TYPE_VGAC)
vgacon_set_cursor_size(31, 30);
else
vgacon_set_cursor_size(31, 31);
-   break;
+   return;
+   }
 
-   case CM_MOVE:
-   case CM_DRAW:
-   write_vga(14, (c->vc_pos - vga_vram_base) / 2);
-   switch (CUR_SIZE(c->vc_cursor_type)) {
-   case CUR_UNDERLINE:
-   vgacon_set_cursor_size(c_height -
-  (c_height < 10 ? 2 : 3),
-  c_height -
-  (c_height

[PATCH v2 38/47] tty: vt: change consw::con_set_origin() return type

2024-01-22 Thread Jiri Slaby (SUSE)
The return value of consw::con_set_origin() is only true/false, meaining
if vc->vc_origin is set to vc->vc_screenbuf or not.

So switch the type and returned values accordingly.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 8 
 include/linux/console.h| 5 -
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 4d1c8f5863af..7597f04b0dc7 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -65,7 +65,7 @@ static struct vgastate vgastate;
  *  Interface used by the world
  */
 
-static int vgacon_set_origin(struct vc_data *c);
+static bool vgacon_set_origin(struct vc_data *c);
 
 static struct uni_pagedict *vgacon_uni_pagedir;
 static int vgacon_refcount;
@@ -1100,15 +1100,15 @@ static int vgacon_resize(struct vc_data *c, unsigned 
int width,
return 0;
 }
 
-static int vgacon_set_origin(struct vc_data *c)
+static bool vgacon_set_origin(struct vc_data *c)
 {
if (vga_is_gfx ||   /* We don't play origin tricks in graphic modes 
*/
(console_blanked && !vga_palette_blanked))  /* Nor we write to 
blanked screens */
-   return 0;
+   return false;
c->vc_origin = c->vc_visible_origin = vga_vram_base;
vga_set_mem_top(c);
vga_rolled_over = 0;
-   return 1;
+   return true;
 }
 
 static void vgacon_save_screen(struct vc_data *c)
diff --git a/include/linux/console.h b/include/linux/console.h
index 6bb7e5e37ae4..82e4b554a801 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -55,6 +55,9 @@ enum vc_intensity;
  * @con_set_palette: sets the palette of the console to @table (optional)
  * @con_scrolldelta: the contents of the console should be scrolled by @lines.
  *  Invoked by user. (optional)
+ * @con_set_origin: set origin (see _data::vc_origin) of the @vc. If not
+ * provided or returns false, the origin is set to
+ * @vc->vc_screenbuf. (optional)
  */
 struct consw {
struct module *owner;
@@ -87,7 +90,7 @@ struct consw {
void(*con_set_palette)(struct vc_data *vc,
const unsigned char *table);
void(*con_scrolldelta)(struct vc_data *vc, int lines);
-   int (*con_set_origin)(struct vc_data *vc);
+   bool(*con_set_origin)(struct vc_data *vc);
void(*con_save_screen)(struct vc_data *vc);
u8  (*con_build_attr)(struct vc_data *vc, u8 color,
enum vc_intensity intensity,
-- 
2.43.0



[PATCH v2 24/47] tty: vt: eliminate unneeded consw::con_putc() implementations

2024-01-22 Thread Jiri Slaby (SUSE)
All these consw::con_putc() implementations do the same as
consw::con_putcs() (only for one charattr) or even call
consw::con_putcs() on their own.

Drop them, as thanks to the new con_putc() helper in the previous patch,
the console code performs this already -- exactly if consw::con_putc()
is missing (NULL).

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/mdacon.c   |  6 --
 drivers/video/console/sticon.c   | 12 
 drivers/video/console/vgacon.c   |  2 --
 drivers/video/fbdev/core/fbcon.c |  9 -
 4 files changed, 29 deletions(-)

diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 2ff2c9394d40..01e779943c00 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -427,11 +427,6 @@ static inline u16 *mda_addr(unsigned int x, unsigned int y)
return mda_vram_base + y * mda_num_columns + x;
 }
 
-static void mdacon_putc(struct vc_data *c, int ch, int y, int x)
-{
-   scr_writew(mda_convert_attr(ch), mda_addr(x, y));
-}
-
 static void mdacon_putcs(struct vc_data *c, const unsigned short *s,
 int count, int y, int x)
 {
@@ -536,7 +531,6 @@ static const struct consw mda_con = {
.con_init = mdacon_init,
.con_deinit =   mdacon_deinit,
.con_clear =mdacon_clear,
-   .con_putc = mdacon_putc,
.con_putcs =mdacon_putcs,
.con_cursor =   mdacon_cursor,
.con_scroll =   mdacon_scroll,
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index b1d972d9a31c..2f87b5909d0d 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -71,17 +71,6 @@ static const char *sticon_startup(void)
 return "STI console";
 }
 
-static void sticon_putc(struct vc_data *conp, int c, int ypos, int xpos)
-{
-if (vga_is_gfx || console_blanked)
-   return;
-
-if (conp->vc_mode != KD_TEXT)
-   return;
-
-sti_putc(sticon_sti, c, ypos, xpos, font_data[conp->vc_num]);
-}
-
 static void sticon_putcs(struct vc_data *conp, const unsigned short *s,
 int count, int ypos, int xpos)
 {
@@ -362,7 +351,6 @@ static const struct consw sti_con = {
.con_init   = sticon_init,
.con_deinit = sticon_deinit,
.con_clear  = sticon_clear,
-   .con_putc   = sticon_putc,
.con_putcs  = sticon_putcs,
.con_cursor = sticon_cursor,
.con_scroll = sticon_scroll,
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 85f29dec2c3d..4beab11f87eb 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -1193,7 +1193,6 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int 
t, unsigned int b,
 
 static void vgacon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx,
 unsigned int width) { }
-static void vgacon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
 static void vgacon_putcs(struct vc_data *vc, const unsigned short *s,
 int count, int ypos, int xpos) { }
 
@@ -1203,7 +1202,6 @@ const struct consw vga_con = {
.con_init = vgacon_init,
.con_deinit = vgacon_deinit,
.con_clear = vgacon_clear,
-   .con_putc = vgacon_putc,
.con_putcs = vgacon_putcs,
.con_cursor = vgacon_cursor,
.con_scroll = vgacon_scroll,
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 8a31a36483ea..38de0f8723aa 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -1292,14 +1292,6 @@ static void fbcon_putcs(struct vc_data *vc, const 
unsigned short *s,
   get_color(vc, info, scr_readw(s), 0));
 }
 
-static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
-{
-   unsigned short chr;
-
-   scr_writew(c, );
-   fbcon_putcs(vc, , 1, ypos, xpos);
-}
-
 static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
@@ -3159,7 +3151,6 @@ static const struct consw fb_con = {
.con_init   = fbcon_init,
.con_deinit = fbcon_deinit,
.con_clear  = fbcon_clear,
-   .con_putc   = fbcon_putc,
.con_putcs  = fbcon_putcs,
.con_cursor = fbcon_cursor,
.con_scroll = fbcon_scroll,
-- 
2.43.0



[PATCH v2 32/47] tty: vt: define a common enum for VESA blanking constants

2024-01-22 Thread Jiri Slaby (SUSE)
There are currently two places with VESA blanking constants definitions:
fb.h and console.h. Extract/unify the two to a separate header (vesa.h).

Given the fb's is in an uapi header, create the common header in uapi
too.

Note that instead of macros, an enum (vesa_blank_mode) is created. But
the macros are kept too (they now expand to the enum constants), just in
case someone in userspace performs some #ifdeffery.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-ker...@vger.kernel.org
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: Thomas Zimmermann 
---

Notes:
[v2] new in v2

 include/linux/console.h   |  7 +--
 include/uapi/linux/fb.h   |  8 +---
 include/uapi/linux/vesa.h | 18 ++
 3 files changed, 20 insertions(+), 13 deletions(-)
 create mode 100644 include/uapi/linux/vesa.h

diff --git a/include/linux/console.h b/include/linux/console.h
index f7c6b5fc3a36..860f82756c9c 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct vc_data;
 struct console_font_op;
@@ -520,12 +521,6 @@ void vcs_remove_sysfs(int index);
  */
 extern atomic_t ignore_console_lock_warning;
 
-/* VESA Blanking Levels */
-#define VESA_NO_BLANKING0
-#define VESA_VSYNC_SUSPEND  1
-#define VESA_HSYNC_SUSPEND  2
-#define VESA_POWERDOWN  3
-
 extern void console_init(void);
 
 /* For deferred console takeover */
diff --git a/include/uapi/linux/fb.h b/include/uapi/linux/fb.h
index 3a49913d006c..cde8f173f566 100644
--- a/include/uapi/linux/fb.h
+++ b/include/uapi/linux/fb.h
@@ -4,6 +4,7 @@
 
 #include 
 #include 
+#include 
 
 /* Definitions of frame buffers
*/
 
@@ -293,13 +294,6 @@ struct fb_con2fbmap {
__u32 framebuffer;
 };
 
-/* VESA Blanking Levels */
-#define VESA_NO_BLANKING0
-#define VESA_VSYNC_SUSPEND  1
-#define VESA_HSYNC_SUSPEND  2
-#define VESA_POWERDOWN  3
-
-
 enum {
/* screen: unblanked, hsync: on,  vsync: on */
FB_BLANK_UNBLANK   = VESA_NO_BLANKING,
diff --git a/include/uapi/linux/vesa.h b/include/uapi/linux/vesa.h
new file mode 100644
index ..81947f5088cd
--- /dev/null
+++ b/include/uapi/linux/vesa.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef _UAPI_LINUX_VESA_H
+#define _UAPI_LINUX_VESA_H
+
+/* VESA Blanking Levels */
+enum vesa_blank_mode {
+   VESA_NO_BLANKING= 0,
+#define VESA_NO_BLANKING   VESA_NO_BLANKING
+   VESA_VSYNC_SUSPEND  = 1,
+#define VESA_VSYNC_SUSPEND VESA_VSYNC_SUSPEND
+   VESA_HSYNC_SUSPEND  = 2,
+#define VESA_HSYNC_SUSPEND VESA_HSYNC_SUSPEND
+   VESA_POWERDOWN  = VESA_VSYNC_SUSPEND | VESA_HSYNC_SUSPEND,
+#define VESA_POWERDOWN VESA_POWERDOWN
+   VESA_BLANK_MAX  = VESA_POWERDOWN,
+};
+
+#endif
-- 
2.43.0



[PATCH v2 33/47] tty: vt: use VESA blanking constants

2024-01-22 Thread Jiri Slaby (SUSE)
There are VESA blanking constants defined in vesa.h. So use them in the
console code instead of constant values.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---

Notes:
[v2] reword the commit log after vesa.h introduction

 drivers/tty/vt/vt.c | 9 +
 drivers/video/console/newport_con.c | 2 +-
 drivers/video/console/sticon.c  | 2 +-
 drivers/video/console/vgacon.c  | 6 +++---
 4 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 13be125a06aa..0d5d7b5074a4 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4320,7 +4320,7 @@ static int set_vesa_blanking(u8 __user *mode_user)
return -EFAULT;
 
console_lock();
-   vesa_blank_mode = (mode < 4) ? mode : 0;
+   vesa_blank_mode = (mode < 4) ? mode : VESA_NO_BLANKING;
console_unlock();
 
return 0;
@@ -4347,7 +4347,7 @@ void do_blank_screen(int entering_gfx)
if (entering_gfx) {
hide_cursor(vc);
save_screen(vc);
-   vc->vc_sw->con_blank(vc, 1, 1);
+   vc->vc_sw->con_blank(vc, VESA_VSYNC_SUSPEND, 1);
console_blanked = fg_console + 1;
blank_state = blank_off;
set_origin(vc);
@@ -4368,7 +4368,8 @@ void do_blank_screen(int entering_gfx)
 
save_screen(vc);
/* In case we need to reset origin, blanking hook returns 1 */
-   i = vc->vc_sw->con_blank(vc, vesa_off_interval ? 1 : (vesa_blank_mode + 
1), 0);
+   i = vc->vc_sw->con_blank(vc, vesa_off_interval ? VESA_VSYNC_SUSPEND :
+(vesa_blank_mode + 1), 0);
console_blanked = fg_console + 1;
if (i)
set_origin(vc);
@@ -4419,7 +4420,7 @@ void do_unblank_screen(int leaving_gfx)
}
 
console_blanked = 0;
-   if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
+   if (vc->vc_sw->con_blank(vc, VESA_NO_BLANKING, leaving_gfx))
/* Low-level driver cannot restore -> do it ourselves */
update_screen(vc);
if (console_blank_hook)
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 039d1c9937d2..ad3a09142770 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -480,7 +480,7 @@ static int newport_blank(struct vc_data *c, int blank, int 
mode_switch)
 {
unsigned short treg;
 
-   if (blank == 0) {
+   if (blank == VESA_NO_BLANKING) {
/* unblank console */
treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
newport_vc2_set(npregs, VC2_IREG_CONTROL,
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index f3bb48a0e980..817b89c45e81 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -300,7 +300,7 @@ static bool sticon_switch(struct vc_data *conp)
 
 static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
 {
-if (blank == 0) {
+if (blank == VESA_NO_BLANKING) {
if (mode_switch)
vga_is_gfx = 0;
return 1;
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 804b6a180b60..02eccd9b3542 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -800,10 +800,10 @@ static void vga_pal_blank(struct vgastate *state)
 static int vgacon_blank(struct vc_data *c, int blank, int mode_switch)
 {
switch (blank) {
-   case 0: /* Unblank */
+   case VESA_NO_BLANKING:  /* Unblank */
if (vga_vesa_blanked) {
vga_vesa_unblank();
-   vga_vesa_blanked = 0;
+   vga_vesa_blanked = VESA_NO_BLANKING;
}
if (vga_palette_blanked) {
vga_set_palette(c, color_table);
@@ -813,7 +813,7 @@ static int vgacon_blank(struct vc_data *c, int blank, int 
mode_switch)
vga_is_gfx = false;
/* Tell console.c that it has to restore the screen itself */
return 1;
-   case 1: /* Normal blanking */
+   case VESA_VSYNC_SUSPEND:/* Normal blanking */
if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) {
vga_pal_blank();
vga_palette_blanked = true;
-- 
2.43.0



[PATCH v2 21/47] tty: vt: sanitize arguments of consw::con_clear()

2024-01-22 Thread Jiri Slaby (SUSE)
In consw::con_clear():
* Height is always 1, so drop it.
* Offsets and width are always unsigned values, so re-type them as such.

This needs a new __fbcon_clear() in the fbcon code to still handle
height which might not be 1 when called internally.

Note that tests for negative count/width are left in place -- they are
taken care of in the next patches.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c |  2 +-
 drivers/video/console/dummycon.c|  4 ++--
 drivers/video/console/mdacon.c  | 15 +-
 drivers/video/console/newport_con.c |  6 +++---
 drivers/video/console/sticon.c  |  8 
 drivers/video/console/vgacon.c  |  4 ++--
 drivers/video/fbdev/core/fbcon.c| 32 +
 include/linux/console.h |  5 +++--
 8 files changed, 39 insertions(+), 37 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index fcb41c8724f3..b6f1449421bc 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1585,7 +1585,7 @@ static void csi_X(struct vc_data *vc)
vc_uniscr_clear_line(vc, vc->state.x, count);
scr_memsetw((unsigned short *)vc->vc_pos, vc->vc_video_erase_char, 2 * 
count);
if (con_should_update(vc))
-   vc->vc_sw->con_clear(vc, vc->state.y, vc->state.x, 1, count);
+   vc->vc_sw->con_clear(vc, vc->state.y, vc->state.x, count);
vc->vc_need_wrap = 0;
 }
 
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index f2cef9d9a4b5..0a69d5c216ee 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -109,8 +109,8 @@ static void dummycon_init(struct vc_data *vc, bool init)
 }
 
 static void dummycon_deinit(struct vc_data *vc) { }
-static void dummycon_clear(struct vc_data *vc, int sy, int sx, int height,
-  int width) { }
+static void dummycon_clear(struct vc_data *vc, unsigned int sy, unsigned int 
sx,
+  unsigned int width) { }
 static void dummycon_cursor(struct vc_data *vc, int mode) { }
 
 static bool dummycon_scroll(struct vc_data *vc, unsigned int top,
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index c5b255c96879..1ddbb6cd5b0c 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -442,23 +442,18 @@ static void mdacon_putcs(struct vc_data *c, const 
unsigned short *s,
}
 }
 
-static void mdacon_clear(struct vc_data *c, int y, int x, 
- int height, int width)
+static void mdacon_clear(struct vc_data *c, unsigned int y, unsigned int x,
+unsigned int width)
 {
u16 *dest = mda_addr(x, y);
u16 eattr = mda_convert_attr(c->vc_video_erase_char);
 
-   if (width <= 0 || height <= 0)
+   if (width <= 0)
return;
 
-   if (x==0 && width==mda_num_columns) {
-   scr_memsetw(dest, eattr, height*width*2);
-   } else {
-   for (; height > 0; height--, dest+=mda_num_columns)
-   scr_memsetw(dest, eattr, width*2);
-   }
+   scr_memsetw(dest, eattr, width * 2);
 }
-
+
 static int mdacon_switch(struct vc_data *c)
 {
return 1;   /* redrawing needed */
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 12c64ef47087..55c6106b3507 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -346,12 +346,12 @@ static void newport_deinit(struct vc_data *c)
}
 }
 
-static void newport_clear(struct vc_data *vc, int sy, int sx, int height,
- int width)
+static void newport_clear(struct vc_data *vc, unsigned int sy, unsigned int sx,
+ unsigned int width)
 {
int xend = ((sx + width) << 3) - 1;
int ystart = ((sy << 4) + topscan) & 0x3ff;
-   int yend = (((sy + height) << 4) + topscan - 1) & 0x3ff;
+   int yend = (((sy + 1) << 4) + topscan - 1) & 0x3ff;
 
if (logo_active)
return;
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 0bfeabc3f7c7..d99c2a659bfd 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -300,13 +300,13 @@ static void sticon_deinit(struct vc_data *c)
sticon_set_def_font(i);
 }
 
-static void sticon_clear(struct vc_data *conp, int sy, int sx, int height,
-int width)
+static void sticon_clear(struct vc_data *conp, unsigned int sy, unsigned int 
sx,
+unsigned int width)
 {
-if (!height || !width)
+if (!width)
  

[PATCH v2 31/47] tty: vt: stop using -1 for blank mode in consw::con_blank()

2024-01-22 Thread Jiri Slaby (SUSE)
-1 is the same as VESA_VSYNC_SUSPEND in all con_blank() implementations.
So we can remove this special case from vgacon now too.

Despite con_blank() of fbcon looks complicated, the "if
(!fbcon_is_inactive(vc, info))" branch is not taken as we set
"ops->graphics = 1;" few lines above. So what matters there (as in all
other blank implementations except vgacon) is if 'blank' is zero or not.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c| 2 +-
 drivers/video/console/vgacon.c | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index fd868046f586..13be125a06aa 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4347,7 +4347,7 @@ void do_blank_screen(int entering_gfx)
if (entering_gfx) {
hide_cursor(vc);
save_screen(vc);
-   vc->vc_sw->con_blank(vc, -1, 1);
+   vc->vc_sw->con_blank(vc, 1, 1);
console_blanked = fg_console + 1;
blank_state = blank_off;
set_origin(vc);
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index f89eb53c0b79..804b6a180b60 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -814,7 +814,6 @@ static int vgacon_blank(struct vc_data *c, int blank, int 
mode_switch)
/* Tell console.c that it has to restore the screen itself */
return 1;
case 1: /* Normal blanking */
-   case -1:/* Obsolete */
if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) {
vga_pal_blank();
vga_palette_blanked = true;
-- 
2.43.0



[PATCH v2 19/47] tty: vt: make consw::con_debug_*() return void

2024-01-22 Thread Jiri Slaby (SUSE)
The return value of con_debug_enter() and con_debug_leave() is ignored
on many fronts. So just don't propagate errors (the current
implementations return 0 anyway) and make the return type a void.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c  | 21 -
 drivers/video/fbdev/core/fbcon.c |  6 ++
 include/linux/console.h  | 18 ++
 3 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 51a2787415db..bbfda0d33ca1 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4012,15 +4012,9 @@ EXPORT_SYMBOL(con_is_visible);
  * Called when the console is taken over by the kernel debugger, this
  * function needs to save the current console state, then put the console
  * into a state suitable for the kernel debugger.
- *
- * RETURNS:
- * Zero on success, nonzero if a failure occurred when trying to prepare
- * the console for the debugger.
  */
-int con_debug_enter(struct vc_data *vc)
+void con_debug_enter(struct vc_data *vc)
 {
-   int ret = 0;
-
saved_fg_console = fg_console;
saved_last_console = last_console;
saved_want_console = want_console;
@@ -4029,7 +4023,7 @@ int con_debug_enter(struct vc_data *vc)
vc->vc_mode = KD_TEXT;
console_blanked = 0;
if (vc->vc_sw->con_debug_enter)
-   ret = vc->vc_sw->con_debug_enter(vc);
+   vc->vc_sw->con_debug_enter(vc);
 #ifdef CONFIG_KGDB_KDB
/* Set the initial LINES variable if it is not already set */
if (vc->vc_rows < 999) {
@@ -4059,7 +4053,6 @@ int con_debug_enter(struct vc_data *vc)
}
}
 #endif /* CONFIG_KGDB_KDB */
-   return ret;
 }
 EXPORT_SYMBOL_GPL(con_debug_enter);
 
@@ -4068,15 +4061,10 @@ EXPORT_SYMBOL_GPL(con_debug_enter);
  *
  * Restore the console state to what it was before the kernel debugger
  * was invoked.
- *
- * RETURNS:
- * Zero on success, nonzero if a failure occurred when trying to restore
- * the console.
  */
-int con_debug_leave(void)
+void con_debug_leave(void)
 {
struct vc_data *vc;
-   int ret = 0;
 
fg_console = saved_fg_console;
last_console = saved_last_console;
@@ -4086,8 +4074,7 @@ int con_debug_leave(void)
 
vc = vc_cons[fg_console].d;
if (vc->vc_sw->con_debug_leave)
-   ret = vc->vc_sw->con_debug_leave(vc);
-   return ret;
+   vc->vc_sw->con_debug_leave(vc);
 }
 EXPORT_SYMBOL_GPL(con_debug_leave);
 
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index dd2f4617485c..d3fb98084eda 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2243,7 +2243,7 @@ static int fbcon_blank(struct vc_data *vc, int blank, int 
mode_switch)
return 0;
 }
 
-static int fbcon_debug_enter(struct vc_data *vc)
+static void fbcon_debug_enter(struct vc_data *vc)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
struct fbcon_ops *ops = info->fbcon_par;
@@ -2253,10 +2253,9 @@ static int fbcon_debug_enter(struct vc_data *vc)
if (info->fbops->fb_debug_enter)
info->fbops->fb_debug_enter(info);
fbcon_set_palette(vc, color_table);
-   return 0;
 }
 
-static int fbcon_debug_leave(struct vc_data *vc)
+static void fbcon_debug_leave(struct vc_data *vc)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
struct fbcon_ops *ops = info->fbcon_par;
@@ -2264,7 +2263,6 @@ static int fbcon_debug_leave(struct vc_data *vc)
ops->graphics = ops->save_graphics;
if (info->fbops->fb_debug_leave)
info->fbops->fb_debug_leave(info);
-   return 0;
 }
 
 static int fbcon_get_font(struct vc_data *vc, struct console_font *font, 
unsigned int vpitch)
diff --git a/include/linux/console.h b/include/linux/console.h
index 38b379d6c624..93a1db5bf3b5 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -88,11 +88,11 @@ struct consw {
 * limited to, unblanking the console, loading an appropriate
 * palette, and allowing debugger generated output.
 */
-   int (*con_debug_enter)(struct vc_data *vc);
+   void(*con_debug_enter)(struct vc_data *vc);
/*
 * Restore the console to its pre-debug state as closely as possible.
 */
-   int (*con_debug_leave)(struct vc_data *vc);
+   void(*con_debug_leave)(struct vc_data *vc);
 };
 
 extern const struct consw *conswitchp;
@@ -113,17 +113,11 @@ int do_unregister_con_driver(const struct consw *csw);
 int do_take_over_console(const struct consw *sw, int first, int last, int 
deflt);
 void give_up_console(const struct consw *sw);
 #ifdef CONFIG_HW_CONSOLE
-int

[PATCH v2 29/47] tty: vt: remove CM_* constants

2024-01-22 Thread Jiri Slaby (SUSE)
There is no difference between CM_MOVE and CM_DRAW. Either of them
enables the cursor. CM_ERASE then disables cursor.

So get rid of all of them and use simple "bool enable".

Note that this propagates down to the fbcon code.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c  |  4 ++--
 drivers/video/console/dummycon.c |  2 +-
 drivers/video/console/mdacon.c   |  4 ++--
 drivers/video/console/newport_con.c  |  4 ++--
 drivers/video/console/sticon.c   |  6 +++---
 drivers/video/console/vgacon.c   |  6 +++---
 drivers/video/fbdev/core/bitblit.c   |  4 ++--
 drivers/video/fbdev/core/fbcon.c | 19 +--
 drivers/video/fbdev/core/fbcon.h |  4 ++--
 drivers/video/fbdev/core/fbcon_ccw.c |  4 ++--
 drivers/video/fbdev/core/fbcon_cw.c  |  4 ++--
 drivers/video/fbdev/core/fbcon_ud.c  |  4 ++--
 drivers/video/fbdev/core/tileblit.c  |  4 ++--
 include/linux/console.h  |  8 ++--
 14 files changed, 36 insertions(+), 41 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 6091ffcf93d8..e4edcaf9d0a3 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -860,7 +860,7 @@ static void hide_cursor(struct vc_data *vc)
if (vc_is_sel(vc))
clear_selection();
 
-   vc->vc_sw->con_cursor(vc, CM_ERASE);
+   vc->vc_sw->con_cursor(vc, false);
hide_softcursor(vc);
 }
 
@@ -873,7 +873,7 @@ static void set_cursor(struct vc_data *vc)
clear_selection();
add_softcursor(vc);
if (CUR_SIZE(vc->vc_cursor_type) != CUR_NONE)
-   vc->vc_sw->con_cursor(vc, CM_DRAW);
+   vc->vc_sw->con_cursor(vc, true);
} else
hide_cursor(vc);
 }
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 188d9f3e201c..1171e27edef7 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -113,7 +113,7 @@ static void dummycon_init(struct vc_data *vc, bool init)
 static void dummycon_deinit(struct vc_data *vc) { }
 static void dummycon_clear(struct vc_data *vc, unsigned int sy, unsigned int 
sx,
   unsigned int width) { }
-static void dummycon_cursor(struct vc_data *vc, int mode) { }
+static void dummycon_cursor(struct vc_data *vc, bool enable) { }
 
 static bool dummycon_scroll(struct vc_data *vc, unsigned int top,
unsigned int bottom, enum con_scroll dir,
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index b8822b615b2f..bc851a1d9f4d 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -470,9 +470,9 @@ static int mdacon_blank(struct vc_data *c, int blank, int 
mode_switch)
}
 }
 
-static void mdacon_cursor(struct vc_data *c, int mode)
+static void mdacon_cursor(struct vc_data *c, bool enable)
 {
-   if (mode == CM_ERASE) {
+   if (!enable) {
mda_set_cursor(mda_vram_len - 1);
return;
}
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index f852717b88f0..e35406dea7c7 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -438,14 +438,14 @@ static void newport_putcs(struct vc_data *vc, const u16 
*s,
}
 }
 
-static void newport_cursor(struct vc_data *vc, int mode)
+static void newport_cursor(struct vc_data *vc, bool enable)
 {
unsigned short treg;
int xcurs, ycurs;
 
treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
 
-   if (mode == CM_ERASE) {
+   if (!enable) {
newport_vc2_set(npregs, VC2_IREG_CONTROL,
(treg & ~(VC2_CTRL_ECDISP)));
return;
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 42480874db00..786e1b3a98ea 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -86,7 +86,7 @@ static void sticon_putcs(struct vc_data *conp, const u16 *s, 
unsigned int count,
 }
 }
 
-static void sticon_cursor(struct vc_data *conp, int mode)
+static void sticon_cursor(struct vc_data *conp, bool enable)
 {
 unsigned short car1;
 
@@ -95,7 +95,7 @@ static void sticon_cursor(struct vc_data *conp, int mode)
return;
 
 car1 = conp->vc_screenbuf[conp->state.x + conp->state.y * conp->vc_cols];
-if (mode == CM_ERASE) {
+if (!enable) {
sti_putc(sticon_sti, car1, conp->state.y, conp->state.x,
 font_data[conp->vc_num]);
return;
@@ -121,7 +121,7 @@ static bool sticon_scroll(struct vc_data *conp, unsigned 
int t,
 if (vga_is_gfx)
 ret

[PATCH v2 28/47] fbdev/core: simplify cursor_state setting in fbcon_ops::cursor()

2024-01-22 Thread Jiri Slaby (SUSE)
There is a switch decicing if cursor should be drawn or not. The whole
switch can be simplified to one line. Do this cleanup as a preparatory
work for the next patch. There, all the CM_* constants are removed.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/bitblit.c   | 11 +--
 drivers/video/fbdev/core/fbcon_ccw.c | 11 +--
 drivers/video/fbdev/core/fbcon_cw.c  | 11 +--
 drivers/video/fbdev/core/fbcon_ud.c  | 11 +--
 4 files changed, 4 insertions(+), 40 deletions(-)

diff --git a/drivers/video/fbdev/core/bitblit.c 
b/drivers/video/fbdev/core/bitblit.c
index 8587c9da0670..daff152f4c22 100644
--- a/drivers/video/fbdev/core/bitblit.c
+++ b/drivers/video/fbdev/core/bitblit.c
@@ -348,16 +348,7 @@ static void bit_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
mask[i++] = msk;
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
diff --git a/drivers/video/fbdev/core/fbcon_ccw.c 
b/drivers/video/fbdev/core/fbcon_ccw.c
index 2789ace79634..889423d580bc 100644
--- a/drivers/video/fbdev/core/fbcon_ccw.c
+++ b/drivers/video/fbdev/core/fbcon_ccw.c
@@ -349,16 +349,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
kfree(tmp);
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
diff --git a/drivers/video/fbdev/core/fbcon_cw.c 
b/drivers/video/fbdev/core/fbcon_cw.c
index 86a254c1b2b7..a306ca5802e8 100644
--- a/drivers/video/fbdev/core/fbcon_cw.c
+++ b/drivers/video/fbdev/core/fbcon_cw.c
@@ -332,16 +332,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
kfree(tmp);
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
diff --git a/drivers/video/fbdev/core/fbcon_ud.c 
b/drivers/video/fbdev/core/fbcon_ud.c
index 23bc045769d0..f6fc458b46c7 100644
--- a/drivers/video/fbdev/core/fbcon_ud.c
+++ b/drivers/video/fbdev/core/fbcon_ud.c
@@ -372,16 +372,7 @@ static void ud_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
mask[i++] = ~msk;
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
-- 
2.43.0



[PATCH v2 22/47] tty: vt: remove checks for count in consw::con_clear() implementations

2024-01-22 Thread Jiri Slaby (SUSE)
'count' in consw::con_clear() is guaranteed to be positive. csi_X() (the
only caller) takes the minimum of the vc parameter (which is at least 1)
and count of characters till the end of the line. The latter is computed
as a subtraction of vc->vc_cols (count) and vc->state.x (offset). So for
the worst case, full line, it is 1.

Therefore, there is no point in checking zero or negative values (width
is now unsigned anyway).

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/mdacon.c | 3 ---
 drivers/video/console/sticon.c | 3 ---
 2 files changed, 6 deletions(-)

diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 1ddbb6cd5b0c..2ff2c9394d40 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -448,9 +448,6 @@ static void mdacon_clear(struct vc_data *c, unsigned int y, 
unsigned int x,
u16 *dest = mda_addr(x, y);
u16 eattr = mda_convert_attr(c->vc_video_erase_char);
 
-   if (width <= 0)
-   return;
-
scr_memsetw(dest, eattr, width * 2);
 }
 
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index d99c2a659bfd..b1d972d9a31c 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -303,9 +303,6 @@ static void sticon_deinit(struct vc_data *c)
 static void sticon_clear(struct vc_data *conp, unsigned int sy, unsigned int 
sx,
 unsigned int width)
 {
-if (!width)
-   return;
-
 sti_clear(sticon_sti, sy, sx, 1, width,
  conp->vc_video_erase_char, font_data[conp->vc_num]);
 }
-- 
2.43.0



[PATCH v2 20/47] tty: vt: make init parameter of consw::con_init() a bool

2024-01-22 Thread Jiri Slaby (SUSE)
The 'init' parameter of consw::con_init() is true for the first call of
the hook on a particular console. So make the parameter a bool.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Reviewed-by: Geert Uytterhoeven 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---

Notes:
[v2] fix up the comment (Geert)

 drivers/tty/vt/vt.c | 8 
 drivers/video/console/dummycon.c| 2 +-
 drivers/video/console/mdacon.c  | 2 +-
 drivers/video/console/newport_con.c | 2 +-
 drivers/video/console/sticon.c  | 2 +-
 drivers/video/console/vgacon.c  | 4 ++--
 drivers/video/fbdev/core/fbcon.c| 2 +-
 include/linux/console.h | 4 +++-
 8 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index bbfda0d33ca1..fcb41c8724f3 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -999,7 +999,7 @@ int vc_cons_allocated(unsigned int i)
return (i < MAX_NR_CONSOLES && vc_cons[i].d);
 }
 
-static void visual_init(struct vc_data *vc, int num, int init)
+static void visual_init(struct vc_data *vc, int num, bool init)
 {
/* ++Geert: vc->vc_sw->con_init determines console size */
if (vc->vc_sw)
@@ -1083,7 +1083,7 @@ int vc_allocate(unsigned int currcons)/* return 0 on 
success */
vc->port.ops = _port_ops;
INIT_WORK(_cons[currcons].SAK_work, vc_SAK);
 
-   visual_init(vc, currcons, 1);
+   visual_init(vc, currcons, true);
 
if (!*vc->uni_pagedict_loc)
con_set_default_unimap(vc);
@@ -3513,7 +3513,7 @@ static int __init con_init(void)
vc_cons[currcons].d = vc = kzalloc(sizeof(struct vc_data), 
GFP_NOWAIT);
INIT_WORK(_cons[currcons].SAK_work, vc_SAK);
tty_port_init(>port);
-   visual_init(vc, currcons, 1);
+   visual_init(vc, currcons, true);
/* Assuming vc->vc_{cols,rows,screenbuf_size} are sane here. */
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT);
vc_init(vc, currcons || !vc->vc_sw->con_save_screen);
@@ -3682,7 +3682,7 @@ static int do_bind_con_driver(const struct consw *csw, 
int first, int last,
old_was_color = vc->vc_can_do_color;
vc->vc_sw->con_deinit(vc);
vc->vc_origin = (unsigned long)vc->vc_screenbuf;
-   visual_init(vc, i, 0);
+   visual_init(vc, i, false);
set_origin(vc);
update_attr(vc);
 
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 14af5d9e13b0..f2cef9d9a4b5 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -98,7 +98,7 @@ static const char *dummycon_startup(void)
 return "dummy device";
 }
 
-static void dummycon_init(struct vc_data *vc, int init)
+static void dummycon_init(struct vc_data *vc, bool init)
 {
 vc->vc_can_do_color = 1;
 if (init) {
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index ef29b321967f..c5b255c96879 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -352,7 +352,7 @@ static const char *mdacon_startup(void)
return "MDA-2";
 }
 
-static void mdacon_init(struct vc_data *c, int init)
+static void mdacon_init(struct vc_data *c, bool init)
 {
c->vc_complement_mask = 0x0800;  /* reverse video */
c->vc_display_fg = _display_fg;
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index e8e4f82cd4a1..12c64ef47087 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -324,7 +324,7 @@ static const char *newport_startup(void)
return NULL;
 }
 
-static void newport_init(struct vc_data *vc, int init)
+static void newport_init(struct vc_data *vc, bool init)
 {
int cols, rows;
 
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 992a4fa431aa..0bfeabc3f7c7 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -273,7 +273,7 @@ static int sticon_font_set(struct vc_data *vc, struct 
console_font *font,
return sticon_set_font(vc, font, vpitch);
 }
 
-static void sticon_init(struct vc_data *c, int init)
+static void sticon_init(struct vc_data *c, bool init)
 {
 struct sti_struct *sti = sticon_sti;
 int vc_cols, vc_rows;
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 0c76e2817b49..5d523753def8 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -367,7 +367,7 @@ static const char *vgacon_startup(void)
return display_desc;
 }
 
-static void vgacon_init(struct vc_data *

[PATCH v2 02/47] fbcon: make display_desc a static array in fbcon_startup()

2024-01-22 Thread Jiri Slaby (SUSE)
display_desc is a pointer to a RO string. Instead, switch display_desc
to a static array as we are used to. It BTW saves unnecessary 8B on the
stack.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 63af6ab034b5..a8c32cb4c878 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -921,7 +921,7 @@ static void display_to_var(struct fb_var_screeninfo *var,
 
 static const char *fbcon_startup(void)
 {
-   const char *display_desc = "frame buffer device";
+   static const char display_desc[] = "frame buffer device";
struct fbcon_display *p = _display[fg_console];
struct vc_data *vc = vc_cons[fg_console].d;
const struct font_desc *font = NULL;
-- 
2.43.0



[PATCH v2 00/47] tty: vt: cleanup and documentation

2024-01-22 Thread Jiri Slaby (SUSE)
Push the console code (vt.c, vt.h, console.h, ...) into a bit more
maintainable state. Especially all around consw structure and document
it.

CSI parser is also a bit cleaned up. More to follow some time in the
next round.

[v2] See respective patches for changes. The major changes:
 * vesa.h introduced
 * parameters of csi*() simplified

Cc: Daniel Vetter 
Cc: dri-devel@lists.freedesktop.org
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Jonathan Corbet 
Cc: linux-...@vger.kernel.org
Cc: linux-fb...@vger.kernel.org
Cc: linux-par...@vger.kernel.org
Cc: Martin Hostettler 
Cc: Thomas Zimmermann 

Jiri Slaby (SUSE) (47):

  vgacon: inline vc_scrolldelta_helper() into vgacon_scrolldelta()
  fbcon: make display_desc a static array in fbcon_startup()
  tty: vt: fix 20 vs 0x20 typo in EScsiignore
  tty: vt: expect valid vc when in tty ops
  tty: vt: pass proper pointers from tioclinux()
  tty: vt: push console lock from tioclinux() down to 2 functions
  tty: vt: pass vc_resize_user as a parameter
  tty: vt: make vc_is_sel()'s vc const
  tty: vt: define an enum for CSI+m codes
  tty: vt: use case ranges for CSI+m fg/bg colors
  tty: vt: define an enum for CSI+J codes
  tty: vt: reflow csi_J()
  use clamp() for counts in csi_?() handlers
  don't pass vc->vc_par[0] to csi_?() handlers
  tty: vt: define an enum for CSI+K codes
  tty: vt: reflow csi_K()
  tty: vt: define an enum for ascii characters
  tty: vt: remove extern from functions in selection.h
  tty: vt: make consw::con_debug_*() return void
  tty: vt: make init parameter of consw::con_init() a bool
  tty: vt: sanitize arguments of consw::con_clear()
  tty: vt: remove checks for count in consw::con_clear() implementations
  tty: vt: add con_putc() helper
  tty: vt: eliminate unneeded consw::con_putc() implementations
  tty: vt: sanitize consw::con_putc() parameters
  tty: vt: sanitize consw::con_putcs() parameters
  consoles: use if instead of switch-case in consw::con_cursor()
  fbdev/core: simplify cursor_state setting in fbcon_ops::cursor()
  tty: vt: remove CM_* constants
  tty: vt: make consw::con_switch() return a bool
  tty: vt: stop using -1 for blank mode in consw::con_blank()
  tty: vt: define a common enum for VESA blanking constants
  tty: vt: use VESA blanking constants
  tty: vt: use enum constants for VESA blanking modes
  tty: vt: make types around consw::con_blank() bool
  tty: vt: make font of consw::con_font_set() const
  tty: vt: make consw::con_font_default()'s name const
  tty: vt: change consw::con_set_origin() return type
  fbcon: remove consw::con_screen_pos()
  tty: vt: remove consw::con_screen_pos()
  tty: vt: make types of screenpos() more consistent
  fbcon: remove fbcon_getxy()
  tty: vt: remove consw::con_getxy()
  tty: vt: remove unused consw::con_flush_scrollback()
  tty: vt: document the rest of struct consw
  tty: vt: fix up kernel-doc
  Documentation: add console.rst

 Documentation/driver-api/tty/console.rst |  45 ++
 Documentation/driver-api/tty/index.rst   |   1 +
 drivers/tty/vt/selection.c   |  43 +-
 drivers/tty/vt/vt.c  | 645 +++
 drivers/tty/vt/vt_ioctl.c|   6 +-
 drivers/video/console/dummycon.c |  38 +-
 drivers/video/console/mdacon.c   |  43 +-
 drivers/video/console/newport_con.c  |  69 +--
 drivers/video/console/sticon.c   |  79 ++-
 drivers/video/console/vgacon.c   | 152 +++---
 drivers/video/fbdev/core/bitblit.c   |  13 +-
 drivers/video/fbdev/core/fbcon.c | 123 ++---
 drivers/video/fbdev/core/fbcon.h |   4 +-
 drivers/video/fbdev/core/fbcon_ccw.c |  13 +-
 drivers/video/fbdev/core/fbcon_cw.c  |  13 +-
 drivers/video/fbdev/core/fbcon_ud.c  |  13 +-
 drivers/video/fbdev/core/tileblit.c  |   4 +-
 include/linux/console.h  | 124 +++--
 include/linux/console_struct.h   |   1 -
 include/linux/selection.h|  56 +-
 include/linux/vt_kern.h  |  12 +-
 include/uapi/linux/fb.h  |   8 +-
 include/uapi/linux/vesa.h|  18 +
 23 files changed, 755 insertions(+), 768 deletions(-)
 create mode 100644 Documentation/driver-api/tty/console.rst
 create mode 100644 include/uapi/linux/vesa.h

-- 
2.43.0



[PATCH v2 07/47] tty: vt: pass vc_resize_user as a parameter

2024-01-22 Thread Jiri Slaby (SUSE)
It is pretty unfortunate to set vc_data::vc_resize_user in two callers
of vc_do_resize(). vc_resize_user is immediately reset there (while
remembering it). So instead of this back and forth, pass 'from_user' as
a parameter.

Notes on 'int user':
* The name changes from 'user' to 'from_user' on some places to be
  consistent.
* The type is bool now as 'int user' might evoke user's uid or whatever.

Provided vc_resize() is called on many places and they need not to care
about this parameter, its prototype is kept unchanged. Instead, it is
now an inline calling a new __vc_resize() which implements the above.

This patch makes the situation much more obvious.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c  | 28 +---
 drivers/tty/vt/vt_ioctl.c|  6 ++
 drivers/video/console/vgacon.c   |  4 ++--
 drivers/video/fbdev/core/fbcon.c |  2 +-
 include/linux/console.h  |  2 +-
 include/linux/console_struct.h   |  1 -
 include/linux/vt_kern.h  |  9 -
 7 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 3a6f60ad2224..c87837306074 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1115,13 +1115,13 @@ int vc_allocate(unsigned int currcons)  /* return 0 on 
success */
 }
 
 static inline int resize_screen(struct vc_data *vc, int width, int height,
-   int user)
+   bool from_user)
 {
/* Resizes the resolution of the display adapater */
int err = 0;
 
if (vc->vc_sw->con_resize)
-   err = vc->vc_sw->con_resize(vc, width, height, user);
+   err = vc->vc_sw->con_resize(vc, width, height, from_user);
 
return err;
 }
@@ -1132,6 +1132,7 @@ static inline int resize_screen(struct vc_data *vc, int 
width, int height,
  * @vc: virtual console private data
  * @cols: columns
  * @lines: lines
+ * @from_user: invoked by a user?
  *
  * Resize a virtual console, clipping according to the actual constraints.
  * If the caller passes a tty structure then update the termios winsize
@@ -1142,21 +1143,17 @@ static inline int resize_screen(struct vc_data *vc, int 
width, int height,
  */
 
 static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
-   unsigned int cols, unsigned int lines)
+   unsigned int cols, unsigned int lines, bool from_user)
 {
unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0;
unsigned long end;
unsigned int old_rows, old_row_size, first_copied_row;
unsigned int new_cols, new_rows, new_row_size, new_screen_size;
-   unsigned int user;
unsigned short *oldscreen, *newscreen;
u32 **new_uniscr = NULL;
 
WARN_CONSOLE_UNLOCKED();
 
-   user = vc->vc_resize_user;
-   vc->vc_resize_user = 0;
-
if (cols > VC_MAXCOL || lines > VC_MAXROW)
return -EINVAL;
 
@@ -1182,7 +1179,7 @@ static int vc_do_resize(struct tty_struct *tty, struct 
vc_data *vc,
 * to deal with possible errors from the code below, we call
 * the resize_screen here as well.
 */
-   return resize_screen(vc, new_cols, new_rows, user);
+   return resize_screen(vc, new_cols, new_rows, from_user);
}
 
if (new_screen_size > KMALLOC_MAX_SIZE || !new_screen_size)
@@ -1205,7 +1202,7 @@ static int vc_do_resize(struct tty_struct *tty, struct 
vc_data *vc,
old_rows = vc->vc_rows;
old_row_size = vc->vc_size_row;
 
-   err = resize_screen(vc, new_cols, new_rows, user);
+   err = resize_screen(vc, new_cols, new_rows, from_user);
if (err) {
kfree(newscreen);
vc_uniscr_free(new_uniscr);
@@ -1292,22 +1289,23 @@ static int vc_do_resize(struct tty_struct *tty, struct 
vc_data *vc,
 }
 
 /**
- * vc_resize   -   resize a VT
+ * __vc_resize -   resize a VT
  * @vc: virtual console
  * @cols: columns
  * @rows: rows
+ * @from_user: invoked by a user?
  *
  * Resize a virtual console as seen from the console end of things. We
  * use the common vc_do_resize methods to update the structures. The
  * caller must hold the console sem to protect console internals and
  * vc->port.tty
  */
-
-int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows)
+int __vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows,
+   bool from_user)
 {
-   return vc_do_resize(vc->port.tty, vc, cols, rows);
+   return vc_do_resize(vc->port.tty, vc, cols, rows, from_user);
 }
-EXPORT_SYMBOL(vc_resize);
+EXPORT_SYMBOL(__vc_resize);
 
 /**
  *

[PATCH v2 01/47] vgacon: inline vc_scrolldelta_helper() into vgacon_scrolldelta()

2024-01-22 Thread Jiri Slaby (SUSE)
Since commit 74d58cd48a8f ("USB: sisusbvga: remove console support"),
vgacon_scrolldelta() is the only user of vc_scrolldelta_helper().

Inline the helper into vgacon_scrolldelta() and drop it.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c| 40 --
 drivers/video/console/vgacon.c | 36 --
 include/linux/vt_kern.h|  3 ---
 3 files changed, 34 insertions(+), 45 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 156efda7c80d..3f3f7c216819 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4748,43 +4748,3 @@ void vcs_scr_updated(struct vc_data *vc)
 {
notify_update(vc);
 }
-
-void vc_scrolldelta_helper(struct vc_data *c, int lines,
-   unsigned int rolled_over, void *base, unsigned int size)
-{
-   unsigned long ubase = (unsigned long)base;
-   ptrdiff_t scr_end = (void *)c->vc_scr_end - base;
-   ptrdiff_t vorigin = (void *)c->vc_visible_origin - base;
-   ptrdiff_t origin = (void *)c->vc_origin - base;
-   int margin = c->vc_size_row * 4;
-   int from, wrap, from_off, avail;
-
-   /* Turn scrollback off */
-   if (!lines) {
-   c->vc_visible_origin = c->vc_origin;
-   return;
-   }
-
-   /* Do we have already enough to allow jumping from 0 to the end? */
-   if (rolled_over > scr_end + margin) {
-   from = scr_end;
-   wrap = rolled_over + c->vc_size_row;
-   } else {
-   from = 0;
-   wrap = size;
-   }
-
-   from_off = (vorigin - from + wrap) % wrap + lines * c->vc_size_row;
-   avail = (origin - from + wrap) % wrap;
-
-   /* Only a little piece would be left? Show all incl. the piece! */
-   if (avail < 2 * margin)
-   margin = 0;
-   if (from_off < margin)
-   from_off = 0;
-   if (from_off > avail - margin)
-   from_off = avail;
-
-   c->vc_visible_origin = ubase + (from + from_off) % wrap;
-}
-EXPORT_SYMBOL_GPL(vc_scrolldelta_helper);
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 8ef1579fa57f..9176fff9ce6e 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -138,8 +138,40 @@ static inline void vga_set_mem_top(struct vc_data *c)
 
 static void vgacon_scrolldelta(struct vc_data *c, int lines)
 {
-   vc_scrolldelta_helper(c, lines, vga_rolled_over, (void *)vga_vram_base,
-   vga_vram_size);
+   unsigned long scr_end = c->vc_scr_end - vga_vram_base;
+   unsigned long vorigin = c->vc_visible_origin - vga_vram_base;
+   unsigned long origin = c->vc_origin - vga_vram_base;
+   int margin = c->vc_size_row * 4;
+   int from, wrap, from_off, avail;
+
+   /* Turn scrollback off */
+   if (!lines) {
+   c->vc_visible_origin = c->vc_origin;
+   return;
+   }
+
+   /* Do we have already enough to allow jumping from 0 to the end? */
+   if (vga_rolled_over > scr_end + margin) {
+   from = scr_end;
+   wrap = vga_rolled_over + c->vc_size_row;
+   } else {
+   from = 0;
+   wrap = vga_vram_size;
+   }
+
+   from_off = (vorigin - from + wrap) % wrap + lines * c->vc_size_row;
+   avail = (origin - from + wrap) % wrap;
+
+   /* Only a little piece would be left? Show all incl. the piece! */
+   if (avail < 2 * margin)
+   margin = 0;
+   if (from_off < margin)
+   from_off = 0;
+   if (from_off > avail - margin)
+   from_off = avail;
+
+   c->vc_visible_origin = vga_vram_base + (from + from_off) % wrap;
+
vga_set_mem_top(c);
 }
 
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h
index c1f5aebef170..a789ea3ed2a0 100644
--- a/include/linux/vt_kern.h
+++ b/include/linux/vt_kern.h
@@ -168,7 +168,4 @@ void vt_set_led_state(unsigned int console, int leds);
 void vt_kbd_con_start(unsigned int console);
 void vt_kbd_con_stop(unsigned int console);
 
-void vc_scrolldelta_helper(struct vc_data *c, int lines,
-   unsigned int rolled_over, void *_base, unsigned int size);
-
 #endif /* _VT_KERN_H */
-- 
2.43.0



Re: [PATCH 31/45] tty: vt: use VESA blanking constants

2024-01-18 Thread Jiri Slaby

On 18. 01. 24, 9:41, Thomas Zimmermann wrote:

Is it hard to get a new UAPI header accepted (honest question)?


Not at all, IMO. The header just needs to be correct™ as it would be set 
in stone once released.


thanks,
--
js
suse labs



Re: [PATCH 31/45] tty: vt: use VESA blanking constants

2024-01-18 Thread Jiri Slaby

On 18. 01. 24, 9:30, Thomas Zimmermann wrote:

Am 18.01.24 um 08:57 schrieb Jiri Slaby (SUSE):

There are VESA blanking constants defined in console.h already. So use
them in the console code instead of constant values.


These constants also exist in include/uapi/linux/fb.h. It would be nice 
to find a common header where they can be shared.


Hi,

see 32/45.

I actually don't know how to fix that nicely while keeping uapi happy.

--
js
suse labs



[PATCH 34/45] tty: vt: make font of consw::con_font_set() const

2024-01-18 Thread Jiri Slaby (SUSE)
Provided the font parameter of consw::con_font_set() is not supposed to
be changed, make it const.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c | 2 +-
 drivers/video/console/newport_con.c | 5 +++--
 drivers/video/console/sticon.c  | 4 ++--
 drivers/video/console/vgacon.c  | 2 +-
 drivers/video/fbdev/core/fbcon.c| 2 +-
 include/linux/console.h | 5 +++--
 6 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 756291f37d47..196c849ca492 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4639,7 +4639,7 @@ static int con_font_get(struct vc_data *vc, struct 
console_font_op *op)
return rc;
 }
 
-static int con_font_set(struct vc_data *vc, struct console_font_op *op)
+static int con_font_set(struct vc_data *vc, const struct console_font_op *op)
 {
struct console_font font;
int rc = -EINVAL;
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index dbb31bf87bf1..4203bd5fd0a1 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -496,7 +496,8 @@ static bool newport_blank(struct vc_data *c, enum 
vesa_blank_mode blank,
return true;
 }
 
-static int newport_set_font(int unit, struct console_font *op, unsigned int 
vpitch)
+static int newport_set_font(int unit, const struct console_font *op,
+   unsigned int vpitch)
 {
int w = op->width;
int h = op->height;
@@ -568,7 +569,7 @@ static int newport_font_default(struct vc_data *vc, struct 
console_font *op, cha
return newport_set_def_font(vc->vc_num, op);
 }
 
-static int newport_font_set(struct vc_data *vc, struct console_font *font,
+static int newport_font_set(struct vc_data *vc, const struct console_font 
*font,
unsigned int vpitch, unsigned int flags)
 {
return newport_set_font(vc->vc_num, font, vpitch);
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index cbb9ef438214..710201fb8ce4 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -153,7 +153,7 @@ static void sticon_set_def_font(int unit)
}
 }
 
-static int sticon_set_font(struct vc_data *vc, struct console_font *op,
+static int sticon_set_font(struct vc_data *vc, const struct console_font *op,
   unsigned int vpitch)
 {
struct sti_struct *sti = sticon_sti;
@@ -253,7 +253,7 @@ static int sticon_font_default(struct vc_data *vc, struct 
console_font *op, char
return 0;
 }
 
-static int sticon_font_set(struct vc_data *vc, struct console_font *font,
+static int sticon_font_set(struct vc_data *vc, const struct console_font *font,
   unsigned int vpitch, unsigned int flags)
 {
return sticon_set_font(vc, font, vpitch);
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 1ef318bac703..ea086b39c6f5 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -1039,7 +1039,7 @@ static int vgacon_adjust_height(struct vc_data *vc, 
unsigned fontheight)
return 0;
 }
 
-static int vgacon_font_set(struct vc_data *c, struct console_font *font,
+static int vgacon_font_set(struct vc_data *c, const struct console_font *font,
   unsigned int vpitch, unsigned int flags)
 {
unsigned charcount = font->charcount;
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index eee2adf5c682..62474630c4d4 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2460,7 +2460,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, 
int h, int charcount,
  *  but lets not assume that, since charcount of 512 is small for unicode 
support.
  */
 
-static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
+static int fbcon_set_font(struct vc_data *vc, const struct console_font *font,
  unsigned int vpitch, unsigned int flags)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
diff --git a/include/linux/console.h b/include/linux/console.h
index fbb32e702472..a500caadbad0 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -83,8 +83,9 @@ struct consw {
bool(*con_switch)(struct vc_data *vc);
bool(*con_blank)(struct vc_data *vc, enum vesa_blank_mode blank,
 bool mode_switch);
-   int (*con_font_set)(struct vc_data *vc, struct console_font *font,
-   unsigned int vpitch, unsigned int flags);
+   int (*con_font_set)(struct vc_data *vc,
+   con

[PATCH 33/45] tty: vt: make types around consw::con_blank() bool

2024-01-17 Thread Jiri Slaby (SUSE)
Both the mode_switch parameter and the return value (a redraw needed)
are true/false. So switch them to bool, so that users won't return
-Eerrors or anything else.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/dummycon.c| 12 ++--
 drivers/video/console/mdacon.c  |  8 
 drivers/video/console/newport_con.c |  7 ---
 drivers/video/console/sticon.c  |  9 +
 drivers/video/console/vgacon.c  |  4 ++--
 drivers/video/fbdev/core/fbcon.c|  6 +++---
 include/linux/console.h |  7 +--
 7 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index d86c1d798690..139049368fdc 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -79,21 +79,21 @@ static void dummycon_putcs(struct vc_data *vc, const u16 
*s, unsigned int count,
raw_notifier_call_chain(_output_nh, 0, NULL);
 }
 
-static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
- int mode_switch)
+static bool dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+  bool mode_switch)
 {
/* Redraw, so that we get putc(s) for output done while blanked */
-   return 1;
+   return true;
 }
 #else
 static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y,
  unsigned int x) { }
 static void dummycon_putcs(struct vc_data *vc, const u16 *s, unsigned int 
count,
   unsigned int ypos, unsigned int xpos) { }
-static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
- int mode_switch)
+static bool dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+  bool mode_switch)
 {
-   return 0;
+   return false;
 }
 #endif
 
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 63e3ce678aab..c0e1f4554a44 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -451,8 +451,8 @@ static bool mdacon_switch(struct vc_data *c)
return true;/* redrawing needed */
 }
 
-static int mdacon_blank(struct vc_data *c, enum vesa_blank_mode blank,
-   int mode_switch)
+static bool mdacon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+bool mode_switch)
 {
if (mda_type == TYPE_MDA) {
if (blank) 
@@ -460,14 +460,14 @@ static int mdacon_blank(struct vc_data *c, enum 
vesa_blank_mode blank,
mda_convert_attr(c->vc_video_erase_char),
c->vc_screenbuf_size);
/* Tell console.c that it has to restore the screen itself */
-   return 1;
+   return true;
} else {
if (blank)
outb_p(0x00, mda_mode_port);/* disable video */
else
outb_p(MDA_MODE_VIDEO_EN | MDA_MODE_BLINK_EN, 
mda_mode_port);
-   return 0;
+   return false;
}
 }
 
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 38437a53b7f1..dbb31bf87bf1 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -476,8 +476,8 @@ static bool newport_switch(struct vc_data *vc)
return true;
 }
 
-static int newport_blank(struct vc_data *c, enum vesa_blank_mode blank,
-int mode_switch)
+static bool newport_blank(struct vc_data *c, enum vesa_blank_mode blank,
+ bool mode_switch)
 {
unsigned short treg;
 
@@ -492,7 +492,8 @@ static int newport_blank(struct vc_data *c, enum 
vesa_blank_mode blank,
newport_vc2_set(npregs, VC2_IREG_CONTROL,
(treg & ~(VC2_CTRL_EDISP)));
}
-   return 1;
+
+   return true;
 }
 
 static int newport_set_font(int unit, struct console_font *op, unsigned int 
vpitch)
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index e9d5d1f92883..cbb9ef438214 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -298,19 +298,20 @@ static bool sticon_switch(struct vc_data *conp)
 return true;   /* needs refreshing */
 }
 
-static int sticon_blank(struct vc_data *c, enum vesa_blank_mode blank,
-   int mode_switch)
+static bool sticon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+bool mode_switch)
 {
 if (blank == VESA_NO_BLANKING) {
if (mode_switch)
vga_is_gfx = 0;
-   return 1;

[PATCH 32/45] tty: vt: use enum for VESA blanking modes

2024-01-17 Thread Jiri Slaby (SUSE)
Switch VESA macros to an enum and add and use VESA_BLANK_MAX. This
improves type checking in consw::con_blank().

There is a downside of this. The macros were defined twice: in
linux/console.h and uapi/linux/fb.h. We cannot remove the latter (uapi
header), but nor we want to expand them in the kernel too. So protect
them using __KERNEL__. In the kernel case, include linux/console.h
instead. This header dependency is preexisting.

Alternatively, we could create a vesa.h header with that sole enum and
include it. If it turns out linux/console.h is too much for fb.h.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c |  4 ++--
 drivers/video/console/dummycon.c|  6 --
 drivers/video/console/mdacon.c  |  3 ++-
 drivers/video/console/newport_con.c |  3 ++-
 drivers/video/console/sticon.c  |  3 ++-
 drivers/video/console/vgacon.c  |  7 ---
 drivers/video/fbdev/core/fbcon.c|  3 ++-
 include/linux/console.h | 18 +++---
 include/uapi/linux/fb.h |  5 -
 9 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 6f46fefedcfb..756291f37d47 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -175,7 +175,7 @@ int do_poke_blanked_console;
 int console_blanked;
 EXPORT_SYMBOL(console_blanked);
 
-static int vesa_blank_mode; /* 0:none 1:suspendV 2:suspendH 3:powerdown */
+static enum vesa_blank_mode vesa_blank_mode;
 static int vesa_off_interval;
 static int blankinterval;
 core_param(consoleblank, blankinterval, int, 0444);
@@ -4334,7 +4334,7 @@ static int set_vesa_blanking(u8 __user *mode_user)
return -EFAULT;
 
console_lock();
-   vesa_blank_mode = (mode < 4) ? mode : VESA_NO_BLANKING;
+   vesa_blank_mode = (mode <= VESA_BLANK_MAX) ? mode : VESA_NO_BLANKING;
console_unlock();
 
return 0;
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index c8d5aa0e3ed0..d86c1d798690 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -79,7 +79,8 @@ static void dummycon_putcs(struct vc_data *vc, const u16 *s, 
unsigned int count,
raw_notifier_call_chain(_output_nh, 0, NULL);
 }
 
-static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
+static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+ int mode_switch)
 {
/* Redraw, so that we get putc(s) for output done while blanked */
return 1;
@@ -89,7 +90,8 @@ static void dummycon_putc(struct vc_data *vc, u16 c, unsigned 
int y,
  unsigned int x) { }
 static void dummycon_putcs(struct vc_data *vc, const u16 *s, unsigned int 
count,
   unsigned int ypos, unsigned int xpos) { }
-static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
+static int dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+ int mode_switch)
 {
return 0;
 }
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 4485ef923bb3..63e3ce678aab 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -451,7 +451,8 @@ static bool mdacon_switch(struct vc_data *c)
return true;/* redrawing needed */
 }
 
-static int mdacon_blank(struct vc_data *c, int blank, int mode_switch)
+static int mdacon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+   int mode_switch)
 {
if (mda_type == TYPE_MDA) {
if (blank) 
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index ad3a09142770..38437a53b7f1 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -476,7 +476,8 @@ static bool newport_switch(struct vc_data *vc)
return true;
 }
 
-static int newport_blank(struct vc_data *c, int blank, int mode_switch)
+static int newport_blank(struct vc_data *c, enum vesa_blank_mode blank,
+int mode_switch)
 {
unsigned short treg;
 
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 817b89c45e81..e9d5d1f92883 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -298,7 +298,8 @@ static bool sticon_switch(struct vc_data *conp)
 return true;   /* needs refreshing */
 }
 
-static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
+static int sticon_blank(struct vc_data *c, enum vesa_blank_mode blank,
+   int mode_switch)
 {
 if (blank == VESA_NO_BLANKING) {
if (mode_switch)
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 910dc73874b7..a4b

[PATCH 31/45] tty: vt: use VESA blanking constants

2024-01-17 Thread Jiri Slaby (SUSE)
There are VESA blanking constants defined in console.h already. So use
them in the console code instead of constant values.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c | 9 +
 drivers/video/console/newport_con.c | 2 +-
 drivers/video/console/sticon.c  | 2 +-
 drivers/video/console/vgacon.c  | 6 +++---
 4 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 279f802aa222..6f46fefedcfb 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4334,7 +4334,7 @@ static int set_vesa_blanking(u8 __user *mode_user)
return -EFAULT;
 
console_lock();
-   vesa_blank_mode = (mode < 4) ? mode : 0;
+   vesa_blank_mode = (mode < 4) ? mode : VESA_NO_BLANKING;
console_unlock();
 
return 0;
@@ -4361,7 +4361,7 @@ void do_blank_screen(int entering_gfx)
if (entering_gfx) {
hide_cursor(vc);
save_screen(vc);
-   vc->vc_sw->con_blank(vc, 1, 1);
+   vc->vc_sw->con_blank(vc, VESA_VSYNC_SUSPEND, 1);
console_blanked = fg_console + 1;
blank_state = blank_off;
set_origin(vc);
@@ -4382,7 +4382,8 @@ void do_blank_screen(int entering_gfx)
 
save_screen(vc);
/* In case we need to reset origin, blanking hook returns 1 */
-   i = vc->vc_sw->con_blank(vc, vesa_off_interval ? 1 : (vesa_blank_mode + 
1), 0);
+   i = vc->vc_sw->con_blank(vc, vesa_off_interval ? VESA_VSYNC_SUSPEND :
+(vesa_blank_mode + 1), 0);
console_blanked = fg_console + 1;
if (i)
set_origin(vc);
@@ -4433,7 +4434,7 @@ void do_unblank_screen(int leaving_gfx)
}
 
console_blanked = 0;
-   if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
+   if (vc->vc_sw->con_blank(vc, VESA_NO_BLANKING, leaving_gfx))
/* Low-level driver cannot restore -> do it ourselves */
update_screen(vc);
if (console_blank_hook)
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 039d1c9937d2..ad3a09142770 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -480,7 +480,7 @@ static int newport_blank(struct vc_data *c, int blank, int 
mode_switch)
 {
unsigned short treg;
 
-   if (blank == 0) {
+   if (blank == VESA_NO_BLANKING) {
/* unblank console */
treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
newport_vc2_set(npregs, VC2_IREG_CONTROL,
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index f3bb48a0e980..817b89c45e81 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -300,7 +300,7 @@ static bool sticon_switch(struct vc_data *conp)
 
 static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
 {
-if (blank == 0) {
+if (blank == VESA_NO_BLANKING) {
if (mode_switch)
vga_is_gfx = 0;
return 1;
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 5025ab501f02..910dc73874b7 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -800,10 +800,10 @@ static void vga_pal_blank(struct vgastate *state)
 static int vgacon_blank(struct vc_data *c, int blank, int mode_switch)
 {
switch (blank) {
-   case 0: /* Unblank */
+   case VESA_NO_BLANKING:  /* Unblank */
if (vga_vesa_blanked) {
vga_vesa_unblank();
-   vga_vesa_blanked = 0;
+   vga_vesa_blanked = VESA_NO_BLANKING;
}
if (vga_palette_blanked) {
vga_set_palette(c, color_table);
@@ -813,7 +813,7 @@ static int vgacon_blank(struct vc_data *c, int blank, int 
mode_switch)
vga_is_gfx = false;
/* Tell console.c that it has to restore the screen itself */
return 1;
-   case 1: /* Normal blanking */
+   case VESA_VSYNC_SUSPEND:/* Normal blanking */
if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) {
vga_pal_blank();
vga_palette_blanked = true;
-- 
2.43.0



[PATCH 30/45] tty: vt: stop using -1 for blank mode in consw::con_blank()

2024-01-17 Thread Jiri Slaby (SUSE)
-1 is the same as VESA_VSYNC_SUSPEND in all con_blank() implementations.
So we can remove this special case from vgacon now too.

Despite con_blank() of fbcon looks complicated, the "if
(!fbcon_is_inactive(vc, info))" branch is not taken as we set
"ops->graphics = 1;" few lines above. So what matters there (as in all
other blank implementations except vgacon) is if 'blank' is zero or not.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c| 2 +-
 drivers/video/console/vgacon.c | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 88d7b48871fb..279f802aa222 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4361,7 +4361,7 @@ void do_blank_screen(int entering_gfx)
if (entering_gfx) {
hide_cursor(vc);
save_screen(vc);
-   vc->vc_sw->con_blank(vc, -1, 1);
+   vc->vc_sw->con_blank(vc, 1, 1);
console_blanked = fg_console + 1;
blank_state = blank_off;
set_origin(vc);
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index e303098aabab..5025ab501f02 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -814,7 +814,6 @@ static int vgacon_blank(struct vc_data *c, int blank, int 
mode_switch)
/* Tell console.c that it has to restore the screen itself */
return 1;
case 1: /* Normal blanking */
-   case -1:/* Obsolete */
if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) {
vga_pal_blank();
vga_palette_blanked = true;
-- 
2.43.0



[PATCH 40/45] fbcon: remove fbcon_getxy()

2024-01-17 Thread Jiri Slaby (SUSE)
Again, fbcon_getxy() is the same as the default implementation since the
softscroll removal in commit 50145474f6ef (fbcon: remove soft scrollback
code). Drop that.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 25 -
 1 file changed, 25 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 2166ea1a5430..9c2962900d13 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2593,30 +2593,6 @@ static void fbcon_set_palette(struct vc_data *vc, const 
unsigned char *table)
fb_set_cmap(_cmap, info);
 }
 
-static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
-int *px, int *py)
-{
-   unsigned long ret;
-   int x, y;
-
-   if (pos >= vc->vc_origin && pos < vc->vc_scr_end) {
-   unsigned long offset = (pos - vc->vc_origin) / 2;
-
-   x = offset % vc->vc_cols;
-   y = offset / vc->vc_cols;
-   ret = pos + (vc->vc_cols - x) * 2;
-   } else {
-   /* Should not happen */
-   x = y = 0;
-   ret = vc->vc_origin;
-   }
-   if (px)
-   *px = x;
-   if (py)
-   *py = y;
-   return ret;
-}
-
 /* As we might be inside of softback, we may work with non-contiguous buffer,
that's why we have to use a separate routine. */
 static void fbcon_invert_region(struct vc_data *vc, u16 * p, int cnt)
@@ -3157,7 +3133,6 @@ static const struct consw fb_con = {
.con_font_default   = fbcon_set_def_font,
.con_set_palette= fbcon_set_palette,
.con_invert_region  = fbcon_invert_region,
-   .con_getxy  = fbcon_getxy,
.con_resize = fbcon_resize,
.con_debug_enter= fbcon_debug_enter,
.con_debug_leave= fbcon_debug_leave,
-- 
2.43.0



[PATCH 27/45] fbdev/core: simplify cursor_state setting in fbcon_ops::cursor()

2024-01-17 Thread Jiri Slaby (SUSE)
There is a switch decicing if cursor should be drawn or not. The whole
switch can be simplified to one line. Do this cleanup as a preparatory
work for the next patch. There, all the CM_* constants are removed.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/bitblit.c   | 11 +--
 drivers/video/fbdev/core/fbcon_ccw.c | 11 +--
 drivers/video/fbdev/core/fbcon_cw.c  | 11 +--
 drivers/video/fbdev/core/fbcon_ud.c  | 11 +--
 4 files changed, 4 insertions(+), 40 deletions(-)

diff --git a/drivers/video/fbdev/core/bitblit.c 
b/drivers/video/fbdev/core/bitblit.c
index 8587c9da0670..daff152f4c22 100644
--- a/drivers/video/fbdev/core/bitblit.c
+++ b/drivers/video/fbdev/core/bitblit.c
@@ -348,16 +348,7 @@ static void bit_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
mask[i++] = msk;
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
diff --git a/drivers/video/fbdev/core/fbcon_ccw.c 
b/drivers/video/fbdev/core/fbcon_ccw.c
index 2789ace79634..889423d580bc 100644
--- a/drivers/video/fbdev/core/fbcon_ccw.c
+++ b/drivers/video/fbdev/core/fbcon_ccw.c
@@ -349,16 +349,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
kfree(tmp);
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
diff --git a/drivers/video/fbdev/core/fbcon_cw.c 
b/drivers/video/fbdev/core/fbcon_cw.c
index 86a254c1b2b7..a306ca5802e8 100644
--- a/drivers/video/fbdev/core/fbcon_cw.c
+++ b/drivers/video/fbdev/core/fbcon_cw.c
@@ -332,16 +332,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
kfree(tmp);
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
diff --git a/drivers/video/fbdev/core/fbcon_ud.c 
b/drivers/video/fbdev/core/fbcon_ud.c
index 23bc045769d0..f6fc458b46c7 100644
--- a/drivers/video/fbdev/core/fbcon_ud.c
+++ b/drivers/video/fbdev/core/fbcon_ud.c
@@ -372,16 +372,7 @@ static void ud_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
mask[i++] = ~msk;
}
 
-   switch (mode) {
-   case CM_ERASE:
-   ops->cursor_state.enable = 0;
-   break;
-   case CM_DRAW:
-   case CM_MOVE:
-   default:
-   ops->cursor_state.enable = (use_sw) ? 0 : 1;
-   break;
-   }
+   ops->cursor_state.enable = (mode != CM_ERASE) && !use_sw;
 
cursor.image.data = src;
cursor.image.fg_color = ops->cursor_state.image.fg_color;
-- 
2.43.0



[PATCH 37/45] fbcon: remove consw::con_screen_pos()

2024-01-17 Thread Jiri Slaby (SUSE)
fbcon_screen_pos() performs the same as the default implementation. The
only difference in the default implementation is that is considers both
vc->vc_origin and vc->vc_visible_origin. But given fbcon's softscroll
code was already removed in commit 50145474f6ef (fbcon: remove soft
scrollback code), both are always the same.

So remove fbcon_screen_pos() too.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 657160eec0a5..2166ea1a5430 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2593,11 +2593,6 @@ static void fbcon_set_palette(struct vc_data *vc, const 
unsigned char *table)
fb_set_cmap(_cmap, info);
 }
 
-static u16 *fbcon_screen_pos(const struct vc_data *vc, int offset)
-{
-   return (u16 *) (vc->vc_origin + offset);
-}
-
 static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
 int *px, int *py)
 {
@@ -3162,7 +3157,6 @@ static const struct consw fb_con = {
.con_font_default   = fbcon_set_def_font,
.con_set_palette= fbcon_set_palette,
.con_invert_region  = fbcon_invert_region,
-   .con_screen_pos = fbcon_screen_pos,
.con_getxy  = fbcon_getxy,
.con_resize = fbcon_resize,
.con_debug_enter= fbcon_debug_enter,
-- 
2.43.0



[PATCH 36/45] tty: vt: change consw::con_set_origin() return type

2024-01-17 Thread Jiri Slaby (SUSE)
The return value of consw::con_set_origin() is only true/false, meaining
if vc->vc_origin is set to vc->vc_screenbuf or not.

So switch the type and returned values accordingly.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 8 
 include/linux/console.h| 5 -
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index ea086b39c6f5..4a40da81990d 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -65,7 +65,7 @@ static struct vgastate vgastate;
  *  Interface used by the world
  */
 
-static int vgacon_set_origin(struct vc_data *c);
+static bool vgacon_set_origin(struct vc_data *c);
 
 static struct uni_pagedict *vgacon_uni_pagedir;
 static int vgacon_refcount;
@@ -1100,15 +1100,15 @@ static int vgacon_resize(struct vc_data *c, unsigned 
int width,
return 0;
 }
 
-static int vgacon_set_origin(struct vc_data *c)
+static bool vgacon_set_origin(struct vc_data *c)
 {
if (vga_is_gfx ||   /* We don't play origin tricks in graphic modes 
*/
(console_blanked && !vga_palette_blanked))  /* Nor we write to 
blanked screens */
-   return 0;
+   return false;
c->vc_origin = c->vc_visible_origin = vga_vram_base;
vga_set_mem_top(c);
vga_rolled_over = 0;
-   return 1;
+   return true;
 }
 
 static void vgacon_save_screen(struct vc_data *c)
diff --git a/include/linux/console.h b/include/linux/console.h
index 543de22a3f23..c07e1ce6bd14 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -63,6 +63,9 @@ enum vc_intensity;
  * @con_set_palette: sets the palette of the console to @table (optional)
  * @con_scrolldelta: the contents of the console should be scrolled by @lines.
  *  Invoked by user. (optional)
+ * @con_set_origin: set origin (see _data::vc_origin) of the @vc. If not
+ * provided or returns false, the origin is set to
+ * @vc->vc_screenbuf. (optional)
  */
 struct consw {
struct module *owner;
@@ -95,7 +98,7 @@ struct consw {
void(*con_set_palette)(struct vc_data *vc,
const unsigned char *table);
void(*con_scrolldelta)(struct vc_data *vc, int lines);
-   int (*con_set_origin)(struct vc_data *vc);
+   bool(*con_set_origin)(struct vc_data *vc);
void(*con_save_screen)(struct vc_data *vc);
u8  (*con_build_attr)(struct vc_data *vc, u8 color,
enum vc_intensity intensity,
-- 
2.43.0



[PATCH 24/45] tty: vt: sanitize consw::con_putc() parameters

2024-01-17 Thread Jiri Slaby (SUSE)
Make parameters of consw::con_putc() saner:
* x and y are unsigned now, as they cannot be negative, and
* ca is made u16, as it is composed of two 8bit values (character and
  attribute). See the con_putcs() hook, u16/ushort is worked on there.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/dummycon.c| 6 --
 drivers/video/console/newport_con.c | 4 ++--
 include/linux/console.h | 5 -
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 0a69d5c216ee..1874beed0325 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -50,7 +50,8 @@ void dummycon_unregister_output_notifier(struct 
notifier_block *nb)
raw_notifier_chain_unregister(_output_nh, nb);
 }
 
-static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos)
+static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y,
+  unsigned int x)
 {
WARN_CONSOLE_UNLOCKED();
 
@@ -84,7 +85,8 @@ static int dummycon_blank(struct vc_data *vc, int blank, int 
mode_switch)
return 1;
 }
 #else
-static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
+static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y,
+ unsigned int x) { }
 static void dummycon_putcs(struct vc_data *vc, const unsigned short *s,
   int count, int ypos, int xpos) { }
 static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 55c6106b3507..9b5c0118873e 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -367,8 +367,8 @@ static void newport_clear(struct vc_data *vc, unsigned int 
sy, unsigned int sx,
}
 }
 
-static void newport_putc(struct vc_data *vc, int charattr, int ypos,
-int xpos)
+static void newport_putc(struct vc_data *vc, u16 charattr, unsigned int ypos,
+unsigned int xpos)
 {
unsigned char *p;
 
diff --git a/include/linux/console.h b/include/linux/console.h
index 8fd96a5fca5f..92d57e5b3009 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -39,6 +39,8 @@ enum vc_intensity;
  * @con_init:   initialize the console on @vc. @init is true for the very first
  * call on this @vc.
  * @con_clear:  erase @count characters at [@x, @y] on @vc. @count >= 1.
+ * @con_putc:   emit one character with attributes @ca to [@x, @y] on @vc.
+ * (optional -- @con_putcs would be called instead)
  * @con_scroll: move lines from @top to @bottom in direction @dir by @lines.
  * Return true if no generic handling should be done.
  * Invoked by csi_M and printing to the console.
@@ -53,7 +55,8 @@ struct consw {
void(*con_deinit)(struct vc_data *vc);
void(*con_clear)(struct vc_data *vc, unsigned int y,
 unsigned int x, unsigned int count);
-   void(*con_putc)(struct vc_data *vc, int c, int ypos, int xpos);
+   void(*con_putc)(struct vc_data *vc, u16 ca, unsigned int y,
+   unsigned int x);
void(*con_putcs)(struct vc_data *vc, const unsigned short *s,
int count, int ypos, int xpos);
void(*con_cursor)(struct vc_data *vc, int mode);
-- 
2.43.0



[PATCH 35/45] tty: vt: make consw::con_font_default()'s name const

2024-01-17 Thread Jiri Slaby (SUSE)
It's a name after all and that is not supposed to be changed. So make it
const to make this obvious.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/newport_con.c | 3 ++-
 drivers/video/console/sticon.c  | 3 ++-
 drivers/video/fbdev/core/fbcon.c| 3 ++-
 include/linux/console.h | 2 +-
 4 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 4203bd5fd0a1..a51cfc1d560e 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -564,7 +564,8 @@ static int newport_set_def_font(int unit, struct 
console_font *op)
return 0;
 }
 
-static int newport_font_default(struct vc_data *vc, struct console_font *op, 
char *name)
+static int newport_font_default(struct vc_data *vc, struct console_font *op,
+   const char *name)
 {
return newport_set_def_font(vc->vc_num, op);
 }
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 710201fb8ce4..4c7b4959a1aa 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -246,7 +246,8 @@ static int sticon_set_font(struct vc_data *vc, const struct 
console_font *op,
return 0;
 }
 
-static int sticon_font_default(struct vc_data *vc, struct console_font *op, 
char *name)
+static int sticon_font_default(struct vc_data *vc, struct console_font *op,
+  const char *name)
 {
sticon_set_def_font(vc->vc_num);
 
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 62474630c4d4..657160eec0a5 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2533,7 +2533,8 @@ static int fbcon_set_font(struct vc_data *vc, const 
struct console_font *font,
return fbcon_do_set_font(vc, font->width, font->height, charcount, 
new_data, 1);
 }
 
-static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, 
char *name)
+static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font,
+ const char *name)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
const struct font_desc *f;
diff --git a/include/linux/console.h b/include/linux/console.h
index a500caadbad0..543de22a3f23 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -89,7 +89,7 @@ struct consw {
int (*con_font_get)(struct vc_data *vc, struct console_font *font,
unsigned int vpitch);
int (*con_font_default)(struct vc_data *vc,
-   struct console_font *font, char *name);
+   struct console_font *font, const char *name);
int (*con_resize)(struct vc_data *vc, unsigned int width,
  unsigned int height, bool from_user);
void(*con_set_palette)(struct vc_data *vc,
-- 
2.43.0



[PATCH 18/45] tty: vt: make consw::con_debug_*() return void

2024-01-17 Thread Jiri Slaby (SUSE)
The return value of con_debug_enter() and con_debug_leave() is ignored
on many fronts. So just don't propagate errors (the current
implementations return 0 anyway) and make the return type a void.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c  | 21 -
 drivers/video/fbdev/core/fbcon.c |  6 ++
 include/linux/console.h  | 18 ++
 3 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 7006889c920d..a953c3f262a5 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4026,15 +4026,9 @@ EXPORT_SYMBOL(con_is_visible);
  * Called when the console is taken over by the kernel debugger, this
  * function needs to save the current console state, then put the console
  * into a state suitable for the kernel debugger.
- *
- * RETURNS:
- * Zero on success, nonzero if a failure occurred when trying to prepare
- * the console for the debugger.
  */
-int con_debug_enter(struct vc_data *vc)
+void con_debug_enter(struct vc_data *vc)
 {
-   int ret = 0;
-
saved_fg_console = fg_console;
saved_last_console = last_console;
saved_want_console = want_console;
@@ -4043,7 +4037,7 @@ int con_debug_enter(struct vc_data *vc)
vc->vc_mode = KD_TEXT;
console_blanked = 0;
if (vc->vc_sw->con_debug_enter)
-   ret = vc->vc_sw->con_debug_enter(vc);
+   vc->vc_sw->con_debug_enter(vc);
 #ifdef CONFIG_KGDB_KDB
/* Set the initial LINES variable if it is not already set */
if (vc->vc_rows < 999) {
@@ -4073,7 +4067,6 @@ int con_debug_enter(struct vc_data *vc)
}
}
 #endif /* CONFIG_KGDB_KDB */
-   return ret;
 }
 EXPORT_SYMBOL_GPL(con_debug_enter);
 
@@ -4082,15 +4075,10 @@ EXPORT_SYMBOL_GPL(con_debug_enter);
  *
  * Restore the console state to what it was before the kernel debugger
  * was invoked.
- *
- * RETURNS:
- * Zero on success, nonzero if a failure occurred when trying to restore
- * the console.
  */
-int con_debug_leave(void)
+void con_debug_leave(void)
 {
struct vc_data *vc;
-   int ret = 0;
 
fg_console = saved_fg_console;
last_console = saved_last_console;
@@ -4100,8 +4088,7 @@ int con_debug_leave(void)
 
vc = vc_cons[fg_console].d;
if (vc->vc_sw->con_debug_leave)
-   ret = vc->vc_sw->con_debug_leave(vc);
-   return ret;
+   vc->vc_sw->con_debug_leave(vc);
 }
 EXPORT_SYMBOL_GPL(con_debug_leave);
 
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index dd2f4617485c..d3fb98084eda 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2243,7 +2243,7 @@ static int fbcon_blank(struct vc_data *vc, int blank, int 
mode_switch)
return 0;
 }
 
-static int fbcon_debug_enter(struct vc_data *vc)
+static void fbcon_debug_enter(struct vc_data *vc)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
struct fbcon_ops *ops = info->fbcon_par;
@@ -2253,10 +2253,9 @@ static int fbcon_debug_enter(struct vc_data *vc)
if (info->fbops->fb_debug_enter)
info->fbops->fb_debug_enter(info);
fbcon_set_palette(vc, color_table);
-   return 0;
 }
 
-static int fbcon_debug_leave(struct vc_data *vc)
+static void fbcon_debug_leave(struct vc_data *vc)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
struct fbcon_ops *ops = info->fbcon_par;
@@ -2264,7 +2263,6 @@ static int fbcon_debug_leave(struct vc_data *vc)
ops->graphics = ops->save_graphics;
if (info->fbops->fb_debug_leave)
info->fbops->fb_debug_leave(info);
-   return 0;
 }
 
 static int fbcon_get_font(struct vc_data *vc, struct console_font *font, 
unsigned int vpitch)
diff --git a/include/linux/console.h b/include/linux/console.h
index 38b379d6c624..93a1db5bf3b5 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -88,11 +88,11 @@ struct consw {
 * limited to, unblanking the console, loading an appropriate
 * palette, and allowing debugger generated output.
 */
-   int (*con_debug_enter)(struct vc_data *vc);
+   void(*con_debug_enter)(struct vc_data *vc);
/*
 * Restore the console to its pre-debug state as closely as possible.
 */
-   int (*con_debug_leave)(struct vc_data *vc);
+   void(*con_debug_leave)(struct vc_data *vc);
 };
 
 extern const struct consw *conswitchp;
@@ -113,17 +113,11 @@ int do_unregister_con_driver(const struct consw *csw);
 int do_take_over_console(const struct consw *sw, int first, int last, int 
deflt);
 void give_up_console(const struct consw *sw);
 #ifdef CONFIG_HW_CONSOLE
-int

[PATCH 29/45] tty: vt: make consw::con_switch() return a bool

2024-01-17 Thread Jiri Slaby (SUSE)
The non-zero (true) return value from consw::con_switch() means a redraw
is needed. So make this return type a bool explicitly instead of int.
The latter might imply that -Eerrors are expected. They are not.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c | 2 +-
 drivers/video/console/dummycon.c| 4 ++--
 drivers/video/console/mdacon.c  | 4 ++--
 drivers/video/console/newport_con.c | 4 ++--
 drivers/video/console/sticon.c  | 4 ++--
 drivers/video/console/vgacon.c  | 4 ++--
 drivers/video/fbdev/core/fbcon.c| 6 +++---
 include/linux/console.h | 4 +++-
 8 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 2df306922b4e..88d7b48871fb 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -970,7 +970,7 @@ void redraw_screen(struct vc_data *vc, int is_switch)
}
 
if (redraw) {
-   int update;
+   bool update;
int old_was_color = vc->vc_can_do_color;
 
set_origin(vc);
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 1171e27edef7..c8d5aa0e3ed0 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -122,9 +122,9 @@ static bool dummycon_scroll(struct vc_data *vc, unsigned 
int top,
return false;
 }
 
-static int dummycon_switch(struct vc_data *vc)
+static bool dummycon_switch(struct vc_data *vc)
 {
-   return 0;
+   return false;
 }
 
 /*
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index bc851a1d9f4d..4485ef923bb3 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -446,9 +446,9 @@ static void mdacon_clear(struct vc_data *c, unsigned int y, 
unsigned int x,
scr_memsetw(dest, eattr, width * 2);
 }
 
-static int mdacon_switch(struct vc_data *c)
+static bool mdacon_switch(struct vc_data *c)
 {
-   return 1;   /* redrawing needed */
+   return true;/* redrawing needed */
 }
 
 static int mdacon_blank(struct vc_data *c, int blank, int mode_switch)
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index e35406dea7c7..039d1c9937d2 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -459,7 +459,7 @@ static void newport_cursor(struct vc_data *vc, bool enable)
newport_vc2_set(npregs, VC2_IREG_CURSY, ycurs);
 }
 
-static int newport_switch(struct vc_data *vc)
+static bool newport_switch(struct vc_data *vc)
 {
static int logo_drawn = 0;
 
@@ -473,7 +473,7 @@ static int newport_switch(struct vc_data *vc)
}
}
 
-   return 1;
+   return true;
 }
 
 static int newport_blank(struct vc_data *c, int blank, int mode_switch)
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 786e1b3a98ea..f3bb48a0e980 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -293,9 +293,9 @@ static void sticon_clear(struct vc_data *conp, unsigned int 
sy, unsigned int sx,
  conp->vc_video_erase_char, font_data[conp->vc_num]);
 }
 
-static int sticon_switch(struct vc_data *conp)
+static bool sticon_switch(struct vc_data *conp)
 {
-return 1;  /* needs refreshing */
+return true;   /* needs refreshing */
 }
 
 static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index c81723ad4dc1..e303098aabab 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -614,7 +614,7 @@ static void vgacon_doresize(struct vc_data *c,
raw_spin_unlock_irqrestore(_lock, flags);
 }
 
-static int vgacon_switch(struct vc_data *c)
+static bool vgacon_switch(struct vc_data *c)
 {
int x = c->vc_cols * VGA_FONTWIDTH;
int y = c->vc_rows * c->vc_cell_height;
@@ -643,7 +643,7 @@ static int vgacon_switch(struct vc_data *c)
vgacon_doresize(c, c->vc_cols, c->vc_rows);
}
 
-   return 0;   /* Redrawing not needed */
+   return false;   /* Redrawing not needed */
 }
 
 static void vga_set_palette(struct vc_data *vc, const unsigned char *table)
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index c1765a6ef490..d5d924225209 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2056,7 +2056,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int 
width,
return 0;
 }
 
-static int fbcon_switch(struct vc_data *vc)
+static bool fbcon_switch(struct vc_data *vc)
 {
struct fb_info *info, *old_info = NULL;
struct 

[PATCH 28/45] tty: vt: remove CM_* constants

2024-01-17 Thread Jiri Slaby (SUSE)
There is no difference between CM_MOVE and CM_DRAW. Either of them
enables the cursor. CM_ERASE then disables cursor.

So get rid of all of them and use simple "bool enable".

Note that this propagates down to the fbcon code.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c  |  4 ++--
 drivers/video/console/dummycon.c |  2 +-
 drivers/video/console/mdacon.c   |  4 ++--
 drivers/video/console/newport_con.c  |  4 ++--
 drivers/video/console/sticon.c   |  6 +++---
 drivers/video/console/vgacon.c   |  6 +++---
 drivers/video/fbdev/core/bitblit.c   |  4 ++--
 drivers/video/fbdev/core/fbcon.c | 19 +--
 drivers/video/fbdev/core/fbcon.h |  4 ++--
 drivers/video/fbdev/core/fbcon_ccw.c |  4 ++--
 drivers/video/fbdev/core/fbcon_cw.c  |  4 ++--
 drivers/video/fbdev/core/fbcon_ud.c  |  4 ++--
 drivers/video/fbdev/core/tileblit.c  |  4 ++--
 include/linux/console.h  |  8 ++--
 14 files changed, 36 insertions(+), 41 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 73e48a53dc31..2df306922b4e 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -860,7 +860,7 @@ static void hide_cursor(struct vc_data *vc)
if (vc_is_sel(vc))
clear_selection();
 
-   vc->vc_sw->con_cursor(vc, CM_ERASE);
+   vc->vc_sw->con_cursor(vc, false);
hide_softcursor(vc);
 }
 
@@ -873,7 +873,7 @@ static void set_cursor(struct vc_data *vc)
clear_selection();
add_softcursor(vc);
if (CUR_SIZE(vc->vc_cursor_type) != CUR_NONE)
-   vc->vc_sw->con_cursor(vc, CM_DRAW);
+   vc->vc_sw->con_cursor(vc, true);
} else
hide_cursor(vc);
 }
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 188d9f3e201c..1171e27edef7 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -113,7 +113,7 @@ static void dummycon_init(struct vc_data *vc, bool init)
 static void dummycon_deinit(struct vc_data *vc) { }
 static void dummycon_clear(struct vc_data *vc, unsigned int sy, unsigned int 
sx,
   unsigned int width) { }
-static void dummycon_cursor(struct vc_data *vc, int mode) { }
+static void dummycon_cursor(struct vc_data *vc, bool enable) { }
 
 static bool dummycon_scroll(struct vc_data *vc, unsigned int top,
unsigned int bottom, enum con_scroll dir,
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index b8822b615b2f..bc851a1d9f4d 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -470,9 +470,9 @@ static int mdacon_blank(struct vc_data *c, int blank, int 
mode_switch)
}
 }
 
-static void mdacon_cursor(struct vc_data *c, int mode)
+static void mdacon_cursor(struct vc_data *c, bool enable)
 {
-   if (mode == CM_ERASE) {
+   if (!enable) {
mda_set_cursor(mda_vram_len - 1);
return;
}
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index f852717b88f0..e35406dea7c7 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -438,14 +438,14 @@ static void newport_putcs(struct vc_data *vc, const u16 
*s,
}
 }
 
-static void newport_cursor(struct vc_data *vc, int mode)
+static void newport_cursor(struct vc_data *vc, bool enable)
 {
unsigned short treg;
int xcurs, ycurs;
 
treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
 
-   if (mode == CM_ERASE) {
+   if (!enable) {
newport_vc2_set(npregs, VC2_IREG_CONTROL,
(treg & ~(VC2_CTRL_ECDISP)));
return;
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 42480874db00..786e1b3a98ea 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -86,7 +86,7 @@ static void sticon_putcs(struct vc_data *conp, const u16 *s, 
unsigned int count,
 }
 }
 
-static void sticon_cursor(struct vc_data *conp, int mode)
+static void sticon_cursor(struct vc_data *conp, bool enable)
 {
 unsigned short car1;
 
@@ -95,7 +95,7 @@ static void sticon_cursor(struct vc_data *conp, int mode)
return;
 
 car1 = conp->vc_screenbuf[conp->state.x + conp->state.y * conp->vc_cols];
-if (mode == CM_ERASE) {
+if (!enable) {
sti_putc(sticon_sti, car1, conp->state.y, conp->state.x,
 font_data[conp->vc_num]);
return;
@@ -121,7 +121,7 @@ static bool sticon_scroll(struct vc_data *conp, unsigned 
int t,
 if (vga_is_gfx)
 ret

[PATCH 26/45] consoles: use if instead of switch-case in consw::con_cursor()

2024-01-17 Thread Jiri Slaby (SUSE)
This is only a preparation for the following cleanup patch to make it
easier. Provided CM_ERASE is the only different, use 'if' instead of
'switch+case' in all those.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/newport_con.c | 26 +---
 drivers/video/console/sticon.c  | 27 ++--
 drivers/video/console/vgacon.c  | 66 +
 3 files changed, 53 insertions(+), 66 deletions(-)

diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 5e65ee0b7c07..f852717b88f0 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -443,24 +443,20 @@ static void newport_cursor(struct vc_data *vc, int mode)
unsigned short treg;
int xcurs, ycurs;
 
-   switch (mode) {
-   case CM_ERASE:
-   treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
-   newport_vc2_set(npregs, VC2_IREG_CONTROL,
-   (treg & ~(VC2_CTRL_ECDISP)));
-   break;
+   treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
 
-   case CM_MOVE:
-   case CM_DRAW:
-   treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
+   if (mode == CM_ERASE) {
newport_vc2_set(npregs, VC2_IREG_CONTROL,
-   (treg | VC2_CTRL_ECDISP));
-   xcurs = (vc->vc_pos - vc->vc_visible_origin) / 2;
-   ycurs = ((xcurs / vc->vc_cols) << 4) + 31;
-   xcurs = ((xcurs % vc->vc_cols) << 3) + xcurs_correction;
-   newport_vc2_set(npregs, VC2_IREG_CURSX, xcurs);
-   newport_vc2_set(npregs, VC2_IREG_CURSY, ycurs);
+   (treg & ~(VC2_CTRL_ECDISP)));
+   return;
}
+
+   newport_vc2_set(npregs, VC2_IREG_CONTROL, (treg | VC2_CTRL_ECDISP));
+   xcurs = (vc->vc_pos - vc->vc_visible_origin) / 2;
+   ycurs = ((xcurs / vc->vc_cols) << 4) + 31;
+   xcurs = ((xcurs % vc->vc_cols) << 3) + xcurs_correction;
+   newport_vc2_set(npregs, VC2_IREG_CURSX, xcurs);
+   newport_vc2_set(npregs, VC2_IREG_CURSY, ycurs);
 }
 
 static int newport_switch(struct vc_data *vc)
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 906da1fde7c8..42480874db00 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -95,23 +95,20 @@ static void sticon_cursor(struct vc_data *conp, int mode)
return;
 
 car1 = conp->vc_screenbuf[conp->state.x + conp->state.y * conp->vc_cols];
-switch (mode) {
-case CM_ERASE:
+if (mode == CM_ERASE) {
sti_putc(sticon_sti, car1, conp->state.y, conp->state.x,
 font_data[conp->vc_num]);
-   break;
-case CM_MOVE:
-case CM_DRAW:
-   switch (CUR_SIZE(conp->vc_cursor_type)) {
-   case CUR_UNDERLINE:
-   case CUR_LOWER_THIRD:
-   case CUR_LOWER_HALF:
-   case CUR_TWO_THIRDS:
-   case CUR_BLOCK:
-   sti_putc(sticon_sti, (car1 & 255) + (0 << 8) + (7 << 11),
-conp->state.y, conp->state.x, font_data[conp->vc_num]);
-   break;
-   }
+   return;
+}
+
+switch (CUR_SIZE(conp->vc_cursor_type)) {
+case CUR_UNDERLINE:
+case CUR_LOWER_THIRD:
+case CUR_LOWER_HALF:
+case CUR_TWO_THIRDS:
+case CUR_BLOCK:
+   sti_putc(sticon_sti, (car1 & 255) + (0 << 8) + (7 << 11),
+conp->state.y, conp->state.x, font_data[conp->vc_num]);
break;
 }
 }
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 558076462b0d..3bf7f46a8998 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -514,47 +514,41 @@ static void vgacon_cursor(struct vc_data *c, int mode)
 
c_height = c->vc_cell_height;
 
-   switch (mode) {
-   case CM_ERASE:
-   write_vga(14, (c->vc_pos - vga_vram_base) / 2);
+   write_vga(14, (c->vc_pos - vga_vram_base) / 2);
+
+   if (mode == CM_ERASE) {
if (vga_video_type >= VIDEO_TYPE_VGAC)
vgacon_set_cursor_size(31, 30);
else
vgacon_set_cursor_size(31, 31);
-   break;
+   return;
+   }
 
-   case CM_MOVE:
-   case CM_DRAW:
-   write_vga(14, (c->vc_pos - vga_vram_base) / 2);
-   switch (CUR_SIZE(c->vc_cursor_type)) {
-   case CUR_UNDERLINE:
-   vgacon_set_cursor_size(c_height -
-  (c_height < 10 ? 2 : 3),
-  c_height -
-  (c_height

[PATCH 23/45] tty: vt: eliminate unneeded consw::con_putc() implementations

2024-01-17 Thread Jiri Slaby (SUSE)
All these consw::con_putc() implementations do the same as
consw::con_putcs() (only for one charattr) or even call
consw::con_putcs() on their own.

Drop them, as thanks to the new con_putc() helper in the previous patch,
the console code performs this already -- exactly if consw::con_putc()
is missing (NULL).

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/mdacon.c   |  6 --
 drivers/video/console/sticon.c   | 12 
 drivers/video/console/vgacon.c   |  2 --
 drivers/video/fbdev/core/fbcon.c |  9 -
 4 files changed, 29 deletions(-)

diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 2ff2c9394d40..01e779943c00 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -427,11 +427,6 @@ static inline u16 *mda_addr(unsigned int x, unsigned int y)
return mda_vram_base + y * mda_num_columns + x;
 }
 
-static void mdacon_putc(struct vc_data *c, int ch, int y, int x)
-{
-   scr_writew(mda_convert_attr(ch), mda_addr(x, y));
-}
-
 static void mdacon_putcs(struct vc_data *c, const unsigned short *s,
 int count, int y, int x)
 {
@@ -536,7 +531,6 @@ static const struct consw mda_con = {
.con_init = mdacon_init,
.con_deinit =   mdacon_deinit,
.con_clear =mdacon_clear,
-   .con_putc = mdacon_putc,
.con_putcs =mdacon_putcs,
.con_cursor =   mdacon_cursor,
.con_scroll =   mdacon_scroll,
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index b1d972d9a31c..2f87b5909d0d 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -71,17 +71,6 @@ static const char *sticon_startup(void)
 return "STI console";
 }
 
-static void sticon_putc(struct vc_data *conp, int c, int ypos, int xpos)
-{
-if (vga_is_gfx || console_blanked)
-   return;
-
-if (conp->vc_mode != KD_TEXT)
-   return;
-
-sti_putc(sticon_sti, c, ypos, xpos, font_data[conp->vc_num]);
-}
-
 static void sticon_putcs(struct vc_data *conp, const unsigned short *s,
 int count, int ypos, int xpos)
 {
@@ -362,7 +351,6 @@ static const struct consw sti_con = {
.con_init   = sticon_init,
.con_deinit = sticon_deinit,
.con_clear  = sticon_clear,
-   .con_putc   = sticon_putc,
.con_putcs  = sticon_putcs,
.con_cursor = sticon_cursor,
.con_scroll = sticon_scroll,
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index c6bd4acbe1d2..2cb75be74c38 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -1193,7 +1193,6 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int 
t, unsigned int b,
 
 static void vgacon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx,
 unsigned int width) { }
-static void vgacon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
 static void vgacon_putcs(struct vc_data *vc, const unsigned short *s,
 int count, int ypos, int xpos) { }
 
@@ -1203,7 +1202,6 @@ const struct consw vga_con = {
.con_init = vgacon_init,
.con_deinit = vgacon_deinit,
.con_clear = vgacon_clear,
-   .con_putc = vgacon_putc,
.con_putcs = vgacon_putcs,
.con_cursor = vgacon_cursor,
.con_scroll = vgacon_scroll,
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 8a31a36483ea..38de0f8723aa 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -1292,14 +1292,6 @@ static void fbcon_putcs(struct vc_data *vc, const 
unsigned short *s,
   get_color(vc, info, scr_readw(s), 0));
 }
 
-static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
-{
-   unsigned short chr;
-
-   scr_writew(c, );
-   fbcon_putcs(vc, , 1, ypos, xpos);
-}
-
 static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
 {
struct fb_info *info = fbcon_info_from_console(vc->vc_num);
@@ -3159,7 +3151,6 @@ static const struct consw fb_con = {
.con_init   = fbcon_init,
.con_deinit = fbcon_deinit,
.con_clear  = fbcon_clear,
-   .con_putc   = fbcon_putc,
.con_putcs  = fbcon_putcs,
.con_cursor = fbcon_cursor,
.con_scroll = fbcon_scroll,
-- 
2.43.0



[PATCH 21/45] tty: vt: remove checks for count in consw::con_clear() implementations

2024-01-17 Thread Jiri Slaby (SUSE)
'count' in consw::con_clear() is guaranteed to be positive. csi_X() (the
only caller) takes the minimum of the vc parameter (which is at least 1)
and count of characters till the end of the line. The latter is computed
as a subtraction of vc->vc_cols (count) and vc->state.x (offset). So for
the worst case, full line, it is 1.

Therefore, there is no point in checking zero or negative values (width
is now unsigned anyway).

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/video/console/mdacon.c | 3 ---
 drivers/video/console/sticon.c | 3 ---
 2 files changed, 6 deletions(-)

diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 1ddbb6cd5b0c..2ff2c9394d40 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -448,9 +448,6 @@ static void mdacon_clear(struct vc_data *c, unsigned int y, 
unsigned int x,
u16 *dest = mda_addr(x, y);
u16 eattr = mda_convert_attr(c->vc_video_erase_char);
 
-   if (width <= 0)
-   return;
-
scr_memsetw(dest, eattr, width * 2);
 }
 
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index d99c2a659bfd..b1d972d9a31c 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -303,9 +303,6 @@ static void sticon_deinit(struct vc_data *c)
 static void sticon_clear(struct vc_data *conp, unsigned int sy, unsigned int 
sx,
 unsigned int width)
 {
-if (!width)
-   return;
-
 sti_clear(sticon_sti, sy, sx, 1, width,
  conp->vc_video_erase_char, font_data[conp->vc_num]);
 }
-- 
2.43.0



[PATCH 20/45] tty: vt: sanitize arguments of consw::con_clear()

2024-01-17 Thread Jiri Slaby (SUSE)
In consw::con_clear():
* Height is always 1, so drop it.
* Offsets and width are always unsigned values, so re-type them as such.

This needs a new __fbcon_clear() in the fbcon code to still handle
height which might not be 1 when called internally.

Note that tests for negative count/width are left in place -- they are
taken care of in the next patches.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c |  2 +-
 drivers/video/console/dummycon.c|  4 ++--
 drivers/video/console/mdacon.c  | 15 +-
 drivers/video/console/newport_con.c |  6 +++---
 drivers/video/console/sticon.c  |  8 
 drivers/video/console/vgacon.c  |  4 ++--
 drivers/video/fbdev/core/fbcon.c| 32 +
 include/linux/console.h |  5 +++--
 8 files changed, 39 insertions(+), 37 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index eada45683594..a4ee983824d5 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1590,7 +1590,7 @@ static void csi_X(struct vc_data *vc, unsigned int vpar)
vc_uniscr_clear_line(vc, vc->state.x, count);
scr_memsetw((unsigned short *)vc->vc_pos, vc->vc_video_erase_char, 2 * 
count);
if (con_should_update(vc))
-   vc->vc_sw->con_clear(vc, vc->state.y, vc->state.x, 1, count);
+   vc->vc_sw->con_clear(vc, vc->state.y, vc->state.x, count);
vc->vc_need_wrap = 0;
 }
 
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index f2cef9d9a4b5..0a69d5c216ee 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -109,8 +109,8 @@ static void dummycon_init(struct vc_data *vc, bool init)
 }
 
 static void dummycon_deinit(struct vc_data *vc) { }
-static void dummycon_clear(struct vc_data *vc, int sy, int sx, int height,
-  int width) { }
+static void dummycon_clear(struct vc_data *vc, unsigned int sy, unsigned int 
sx,
+  unsigned int width) { }
 static void dummycon_cursor(struct vc_data *vc, int mode) { }
 
 static bool dummycon_scroll(struct vc_data *vc, unsigned int top,
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index c5b255c96879..1ddbb6cd5b0c 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -442,23 +442,18 @@ static void mdacon_putcs(struct vc_data *c, const 
unsigned short *s,
}
 }
 
-static void mdacon_clear(struct vc_data *c, int y, int x, 
- int height, int width)
+static void mdacon_clear(struct vc_data *c, unsigned int y, unsigned int x,
+unsigned int width)
 {
u16 *dest = mda_addr(x, y);
u16 eattr = mda_convert_attr(c->vc_video_erase_char);
 
-   if (width <= 0 || height <= 0)
+   if (width <= 0)
return;
 
-   if (x==0 && width==mda_num_columns) {
-   scr_memsetw(dest, eattr, height*width*2);
-   } else {
-   for (; height > 0; height--, dest+=mda_num_columns)
-   scr_memsetw(dest, eattr, width*2);
-   }
+   scr_memsetw(dest, eattr, width * 2);
 }
-
+
 static int mdacon_switch(struct vc_data *c)
 {
return 1;   /* redrawing needed */
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 12c64ef47087..55c6106b3507 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -346,12 +346,12 @@ static void newport_deinit(struct vc_data *c)
}
 }
 
-static void newport_clear(struct vc_data *vc, int sy, int sx, int height,
- int width)
+static void newport_clear(struct vc_data *vc, unsigned int sy, unsigned int sx,
+ unsigned int width)
 {
int xend = ((sx + width) << 3) - 1;
int ystart = ((sy << 4) + topscan) & 0x3ff;
-   int yend = (((sy + height) << 4) + topscan - 1) & 0x3ff;
+   int yend = (((sy + 1) << 4) + topscan - 1) & 0x3ff;
 
if (logo_active)
return;
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 0bfeabc3f7c7..d99c2a659bfd 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -300,13 +300,13 @@ static void sticon_deinit(struct vc_data *c)
sticon_set_def_font(i);
 }
 
-static void sticon_clear(struct vc_data *conp, int sy, int sx, int height,
-int width)
+static void sticon_clear(struct vc_data *conp, unsigned int sy, unsigned int 
sx,
+unsigned int width)
 {
-if (!height || !w

[PATCH 19/45] tty: vt: make init parameter of consw::con_init() a bool

2024-01-17 Thread Jiri Slaby (SUSE)
The 'init' parameter of consw::con_init() is true for the first call of
the hook on a particular console. So make the parameter a bool.

And document the hook.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-par...@vger.kernel.org
---
 drivers/tty/vt/vt.c | 8 
 drivers/video/console/dummycon.c| 2 +-
 drivers/video/console/mdacon.c  | 2 +-
 drivers/video/console/newport_con.c | 2 +-
 drivers/video/console/sticon.c  | 2 +-
 drivers/video/console/vgacon.c  | 2 +-
 drivers/video/fbdev/core/fbcon.c| 2 +-
 include/linux/console.h | 4 +++-
 8 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index a953c3f262a5..eada45683594 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -999,7 +999,7 @@ int vc_cons_allocated(unsigned int i)
return (i < MAX_NR_CONSOLES && vc_cons[i].d);
 }
 
-static void visual_init(struct vc_data *vc, int num, int init)
+static void visual_init(struct vc_data *vc, int num, bool init)
 {
/* ++Geert: vc->vc_sw->con_init determines console size */
if (vc->vc_sw)
@@ -1083,7 +1083,7 @@ int vc_allocate(unsigned int currcons)/* return 0 on 
success */
vc->port.ops = _port_ops;
INIT_WORK(_cons[currcons].SAK_work, vc_SAK);
 
-   visual_init(vc, currcons, 1);
+   visual_init(vc, currcons, true);
 
if (!*vc->uni_pagedict_loc)
con_set_default_unimap(vc);
@@ -3527,7 +3527,7 @@ static int __init con_init(void)
vc_cons[currcons].d = vc = kzalloc(sizeof(struct vc_data), 
GFP_NOWAIT);
INIT_WORK(_cons[currcons].SAK_work, vc_SAK);
tty_port_init(>port);
-   visual_init(vc, currcons, 1);
+   visual_init(vc, currcons, true);
/* Assuming vc->vc_{cols,rows,screenbuf_size} are sane here. */
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT);
vc_init(vc, currcons || !vc->vc_sw->con_save_screen);
@@ -3696,7 +3696,7 @@ static int do_bind_con_driver(const struct consw *csw, 
int first, int last,
old_was_color = vc->vc_can_do_color;
vc->vc_sw->con_deinit(vc);
vc->vc_origin = (unsigned long)vc->vc_screenbuf;
-   visual_init(vc, i, 0);
+   visual_init(vc, i, false);
set_origin(vc);
update_attr(vc);
 
diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 14af5d9e13b0..f2cef9d9a4b5 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -98,7 +98,7 @@ static const char *dummycon_startup(void)
 return "dummy device";
 }
 
-static void dummycon_init(struct vc_data *vc, int init)
+static void dummycon_init(struct vc_data *vc, bool init)
 {
 vc->vc_can_do_color = 1;
 if (init) {
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index ef29b321967f..c5b255c96879 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -352,7 +352,7 @@ static const char *mdacon_startup(void)
return "MDA-2";
 }
 
-static void mdacon_init(struct vc_data *c, int init)
+static void mdacon_init(struct vc_data *c, bool init)
 {
c->vc_complement_mask = 0x0800;  /* reverse video */
c->vc_display_fg = _display_fg;
diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index e8e4f82cd4a1..12c64ef47087 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -324,7 +324,7 @@ static const char *newport_startup(void)
return NULL;
 }
 
-static void newport_init(struct vc_data *vc, int init)
+static void newport_init(struct vc_data *vc, bool init)
 {
int cols, rows;
 
diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 992a4fa431aa..0bfeabc3f7c7 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -273,7 +273,7 @@ static int sticon_font_set(struct vc_data *vc, struct 
console_font *font,
return sticon_set_font(vc, font, vpitch);
 }
 
-static void sticon_init(struct vc_data *c, int init)
+static void sticon_init(struct vc_data *c, bool init)
 {
 struct sti_struct *sti = sticon_sti;
 int vc_cols, vc_rows;
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 0c76e2817b49..2c0a952ee51a 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -367,7 +367,7 @@ static const char *vgacon_startup(void)
return display_desc;
 }
 
-static void vgacon_init(struct vc_data *c, int init)
+static void vgacon_init(struct vc_data *c, bool init)
 {

[PATCH 00/45] tty: vt: cleanup and documentation

2024-01-17 Thread Jiri Slaby (SUSE)
Push the console code (vt.c, vt.h, console.h, ...) into a bit more
maintainable state. Especially all around consw structure and document
it.

CSI parser is also a bit cleaned up. More to follow some time in the
next round.

Cc: Daniel Vetter 
Cc: dri-devel@lists.freedesktop.org
Cc: Helge Deller 
Cc: "James E.J. Bottomley" 
Cc: Jonathan Corbet 
Cc: linux-...@vger.kernel.org
Cc: linux-fb...@vger.kernel.org
Cc: linux-par...@vger.kernel.org
Cc: Martin Hostettler 

Jiri Slaby (SUSE) (45):
  vgacon: inline vc_scrolldelta_helper() into vgacon_scrolldelta()
  fbcon: make display_desc a static array in fbcon_startup()
  tty: vt: fix 20 vs 0x20 typo in EScsiignore
  tty: vt: expect valid vc when in tty ops
  tty: vt: pass proper pointers from tioclinux()
  tty: vt: push console lock from tioclinux() down to 2 functions
  tty: vt: pass vc_resize_user as a parameter
  tty: vt: make vc_is_sel()'s vc const
  tty: vt: define an enum for CSI+m codes
  tty: vt: use case ranges for CSI+m fg/bg colors
  tty: vt: define an enum for CSI+J codes
  tty: vt: reflow csi_J()
  tty: vt: define an enum for CSI+K codes
  tty: vt: reflow csi_K()
  tty: vt: pass vpar as unsigned to csi_J() and csi_K()
  tty: vt: define an enum for ascii characters
  tty: vt: remove extern from functions in selection.h
  tty: vt: make consw::con_debug_*() return void
  tty: vt: make init parameter of consw::con_init() a bool
  tty: vt: sanitize arguments of consw::con_clear()
  tty: vt: remove checks for count in consw::con_clear() implementations
  tty: vt: add con_putc() helper
  tty: vt: eliminate unneeded consw::con_putc() implementations
  tty: vt: sanitize consw::con_putc() parameters
  tty: vt: sanitize consw::con_putcs() parameters
  consoles: use if instead of switch-case in consw::con_cursor()
  fbdev/core: simplify cursor_state setting in fbcon_ops::cursor()
  tty: vt: remove CM_* constants
  tty: vt: make consw::con_switch() return a bool
  tty: vt: stop using -1 for blank mode in consw::con_blank()
  tty: vt: use VESA blanking constants
  tty: vt: use enum for VESA blanking modes
  tty: vt: make types around consw::con_blank() bool
  tty: vt: make font of consw::con_font_set() const
  tty: vt: make consw::con_font_default()'s name const
  tty: vt: change consw::con_set_origin() return type
  fbcon: remove consw::con_screen_pos()
  tty: vt: remove consw::con_screen_pos()
  tty: vt: make types of screenpos() more consistent
  fbcon: remove fbcon_getxy()
  tty: vt: remove consw::con_getxy()
  tty: vt: remove unused consw::con_flush_scrollback()
  tty: vt: document the rest of struct consw
  tty: vt: fix up kernel-doc
  Documentation: add console.rst

 Documentation/driver-api/tty/console.rst |  45 ++
 Documentation/driver-api/tty/index.rst   |   1 +
 drivers/tty/vt/selection.c   |  43 +-
 drivers/tty/vt/vt.c  | 587 +++
 drivers/tty/vt/vt_ioctl.c|   6 +-
 drivers/video/console/dummycon.c |  38 +-
 drivers/video/console/mdacon.c   |  43 +-
 drivers/video/console/newport_con.c  |  69 +--
 drivers/video/console/sticon.c   |  79 ++-
 drivers/video/console/vgacon.c   | 150 +++---
 drivers/video/fbdev/core/bitblit.c   |  13 +-
 drivers/video/fbdev/core/fbcon.c | 123 ++---
 drivers/video/fbdev/core/fbcon.h |   4 +-
 drivers/video/fbdev/core/fbcon_ccw.c |  13 +-
 drivers/video/fbdev/core/fbcon_cw.c  |  13 +-
 drivers/video/fbdev/core/fbcon_ud.c  |  13 +-
 drivers/video/fbdev/core/tileblit.c  |   4 +-
 include/linux/console.h  | 132 ++---
 include/linux/console_struct.h   |   1 -
 include/linux/selection.h|  56 +--
 include/linux/vt_kern.h  |  12 +-
 include/uapi/linux/fb.h  |   5 +-
 22 files changed, 725 insertions(+), 725 deletions(-)
 create mode 100644 Documentation/driver-api/tty/console.rst

-- 
2.43.0



[PATCH 01/45] vgacon: inline vc_scrolldelta_helper() into vgacon_scrolldelta()

2024-01-17 Thread Jiri Slaby (SUSE)
Since commit 74d58cd48a8f ("USB: sisusbvga: remove console support"),
vgacon_scrolldelta() is the only user of vc_scrolldelta_helper().

Inline the helper into vgacon_scrolldelta() and drop it.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c| 40 --
 drivers/video/console/vgacon.c | 36 --
 include/linux/vt_kern.h|  3 ---
 3 files changed, 34 insertions(+), 45 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 156efda7c80d..3f3f7c216819 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -4748,43 +4748,3 @@ void vcs_scr_updated(struct vc_data *vc)
 {
notify_update(vc);
 }
-
-void vc_scrolldelta_helper(struct vc_data *c, int lines,
-   unsigned int rolled_over, void *base, unsigned int size)
-{
-   unsigned long ubase = (unsigned long)base;
-   ptrdiff_t scr_end = (void *)c->vc_scr_end - base;
-   ptrdiff_t vorigin = (void *)c->vc_visible_origin - base;
-   ptrdiff_t origin = (void *)c->vc_origin - base;
-   int margin = c->vc_size_row * 4;
-   int from, wrap, from_off, avail;
-
-   /* Turn scrollback off */
-   if (!lines) {
-   c->vc_visible_origin = c->vc_origin;
-   return;
-   }
-
-   /* Do we have already enough to allow jumping from 0 to the end? */
-   if (rolled_over > scr_end + margin) {
-   from = scr_end;
-   wrap = rolled_over + c->vc_size_row;
-   } else {
-   from = 0;
-   wrap = size;
-   }
-
-   from_off = (vorigin - from + wrap) % wrap + lines * c->vc_size_row;
-   avail = (origin - from + wrap) % wrap;
-
-   /* Only a little piece would be left? Show all incl. the piece! */
-   if (avail < 2 * margin)
-   margin = 0;
-   if (from_off < margin)
-   from_off = 0;
-   if (from_off > avail - margin)
-   from_off = avail;
-
-   c->vc_visible_origin = ubase + (from + from_off) % wrap;
-}
-EXPORT_SYMBOL_GPL(vc_scrolldelta_helper);
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 8ef1579fa57f..9176fff9ce6e 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -138,8 +138,40 @@ static inline void vga_set_mem_top(struct vc_data *c)
 
 static void vgacon_scrolldelta(struct vc_data *c, int lines)
 {
-   vc_scrolldelta_helper(c, lines, vga_rolled_over, (void *)vga_vram_base,
-   vga_vram_size);
+   unsigned long scr_end = c->vc_scr_end - vga_vram_base;
+   unsigned long vorigin = c->vc_visible_origin - vga_vram_base;
+   unsigned long origin = c->vc_origin - vga_vram_base;
+   int margin = c->vc_size_row * 4;
+   int from, wrap, from_off, avail;
+
+   /* Turn scrollback off */
+   if (!lines) {
+   c->vc_visible_origin = c->vc_origin;
+   return;
+   }
+
+   /* Do we have already enough to allow jumping from 0 to the end? */
+   if (vga_rolled_over > scr_end + margin) {
+   from = scr_end;
+   wrap = vga_rolled_over + c->vc_size_row;
+   } else {
+   from = 0;
+   wrap = vga_vram_size;
+   }
+
+   from_off = (vorigin - from + wrap) % wrap + lines * c->vc_size_row;
+   avail = (origin - from + wrap) % wrap;
+
+   /* Only a little piece would be left? Show all incl. the piece! */
+   if (avail < 2 * margin)
+   margin = 0;
+   if (from_off < margin)
+   from_off = 0;
+   if (from_off > avail - margin)
+   from_off = avail;
+
+   c->vc_visible_origin = vga_vram_base + (from + from_off) % wrap;
+
vga_set_mem_top(c);
 }
 
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h
index c1f5aebef170..a789ea3ed2a0 100644
--- a/include/linux/vt_kern.h
+++ b/include/linux/vt_kern.h
@@ -168,7 +168,4 @@ void vt_set_led_state(unsigned int console, int leds);
 void vt_kbd_con_start(unsigned int console);
 void vt_kbd_con_stop(unsigned int console);
 
-void vc_scrolldelta_helper(struct vc_data *c, int lines,
-   unsigned int rolled_over, void *_base, unsigned int size);
-
 #endif /* _VT_KERN_H */
-- 
2.43.0



[PATCH 07/45] tty: vt: pass vc_resize_user as a parameter

2024-01-17 Thread Jiri Slaby (SUSE)
It is pretty unfortunate to set vc_data::vc_resize_user in two callers
of vc_do_resize(). vc_resize_user is immediately reset there (while
remembering it). So instead of this back and forth, pass 'from_user' as
a parameter.

Notes on 'int user':
* The name changes from 'user' to 'from_user' on some places to be
  consistent.
* The type is bool now as 'int user' might evoke user's uid or whatever.

Provided vc_resize() is called on many places and they need not to care
about this parameter, its prototype is kept unchanged. Instead, it is
now an inline calling a new __vc_resize() which implements the above.

This patch makes the situation much more obvious.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: Daniel Vetter 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/tty/vt/vt.c  | 28 +---
 drivers/tty/vt/vt_ioctl.c|  6 ++
 drivers/video/console/vgacon.c   |  4 ++--
 drivers/video/fbdev/core/fbcon.c |  2 +-
 include/linux/console.h  |  2 +-
 include/linux/console_struct.h   |  1 -
 include/linux/vt_kern.h  |  9 -
 7 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 3a6f60ad2224..c87837306074 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1115,13 +1115,13 @@ int vc_allocate(unsigned int currcons)  /* return 0 on 
success */
 }
 
 static inline int resize_screen(struct vc_data *vc, int width, int height,
-   int user)
+   bool from_user)
 {
/* Resizes the resolution of the display adapater */
int err = 0;
 
if (vc->vc_sw->con_resize)
-   err = vc->vc_sw->con_resize(vc, width, height, user);
+   err = vc->vc_sw->con_resize(vc, width, height, from_user);
 
return err;
 }
@@ -1132,6 +1132,7 @@ static inline int resize_screen(struct vc_data *vc, int 
width, int height,
  * @vc: virtual console private data
  * @cols: columns
  * @lines: lines
+ * @from_user: invoked by a user?
  *
  * Resize a virtual console, clipping according to the actual constraints.
  * If the caller passes a tty structure then update the termios winsize
@@ -1142,21 +1143,17 @@ static inline int resize_screen(struct vc_data *vc, int 
width, int height,
  */
 
 static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
-   unsigned int cols, unsigned int lines)
+   unsigned int cols, unsigned int lines, bool from_user)
 {
unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0;
unsigned long end;
unsigned int old_rows, old_row_size, first_copied_row;
unsigned int new_cols, new_rows, new_row_size, new_screen_size;
-   unsigned int user;
unsigned short *oldscreen, *newscreen;
u32 **new_uniscr = NULL;
 
WARN_CONSOLE_UNLOCKED();
 
-   user = vc->vc_resize_user;
-   vc->vc_resize_user = 0;
-
if (cols > VC_MAXCOL || lines > VC_MAXROW)
return -EINVAL;
 
@@ -1182,7 +1179,7 @@ static int vc_do_resize(struct tty_struct *tty, struct 
vc_data *vc,
 * to deal with possible errors from the code below, we call
 * the resize_screen here as well.
 */
-   return resize_screen(vc, new_cols, new_rows, user);
+   return resize_screen(vc, new_cols, new_rows, from_user);
}
 
if (new_screen_size > KMALLOC_MAX_SIZE || !new_screen_size)
@@ -1205,7 +1202,7 @@ static int vc_do_resize(struct tty_struct *tty, struct 
vc_data *vc,
old_rows = vc->vc_rows;
old_row_size = vc->vc_size_row;
 
-   err = resize_screen(vc, new_cols, new_rows, user);
+   err = resize_screen(vc, new_cols, new_rows, from_user);
if (err) {
kfree(newscreen);
vc_uniscr_free(new_uniscr);
@@ -1292,22 +1289,23 @@ static int vc_do_resize(struct tty_struct *tty, struct 
vc_data *vc,
 }
 
 /**
- * vc_resize   -   resize a VT
+ * __vc_resize -   resize a VT
  * @vc: virtual console
  * @cols: columns
  * @rows: rows
+ * @from_user: invoked by a user?
  *
  * Resize a virtual console as seen from the console end of things. We
  * use the common vc_do_resize methods to update the structures. The
  * caller must hold the console sem to protect console internals and
  * vc->port.tty
  */
-
-int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows)
+int __vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows,
+   bool from_user)
 {
-   return vc_do_resize(vc->port.tty, vc, cols, rows);
+   return vc_do_resize(vc->port.tty, vc, cols, rows, from_user);
 }
-EXPORT_SYMBOL(vc_resize);
+EXPORT_SYMBOL(__vc_resize);
 
 /**
  *

[PATCH 02/45] fbcon: make display_desc a static array in fbcon_startup()

2024-01-17 Thread Jiri Slaby (SUSE)
display_desc is a pointer to a RO string. Instead, switch display_desc
to a static array as we are used to. It BTW saves unnecessary 8B on the
stack.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 63af6ab034b5..a8c32cb4c878 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -921,7 +921,7 @@ static void display_to_var(struct fb_var_screeninfo *var,
 
 static const char *fbcon_startup(void)
 {
-   const char *display_desc = "frame buffer device";
+   static const char display_desc[] = "frame buffer device";
struct fbcon_display *p = _display[fg_console];
struct vc_data *vc = vc_cons[fg_console].d;
const struct font_desc *font = NULL;
-- 
2.43.0



Re: [PATCH v2 04/15] tty: Remove now superfluous sentinel element from ctl_table array

2023-10-02 Thread Jiri Slaby

On 02. 10. 23, 10:55, Joel Granados via B4 Relay wrote:

From: Joel Granados 

This commit comes at the tail end of a greater effort to remove the
empty elements at the end of the ctl_table arrays (sentinels) which
will reduce the overall build time size of the kernel and run time
memory bloat by ~64 bytes per sentinel (further information Link :
https://lore.kernel.org/all/zo5yx5jfoggi%2f...@bombadil.infradead.org/)

Remove sentinel from tty_table

Signed-off-by: Joel Granados 


Reviewed-by: Jiri Slaby 

thanks,
--
js
suse labs




Re: [PATCH 04/15] tty: Remove now superfluous sentinel element from ctl_table array

2023-10-02 Thread Jiri Slaby

On 28. 09. 23, 15:21, Joel Granados via B4 Relay wrote:

From: Joel Granados 

This commit comes at the tail end of a greater effort to remove the
empty elements at the end of the ctl_table arrays (sentinels) which
will reduce the overall build time size of the kernel and run time
memory bloat by ~64 bytes per sentinel (further information Link :
https://lore.kernel.org/all/zo5yx5jfoggi%2f...@bombadil.infradead.org/)

Remove sentinel from tty_table

Signed-off-by: Joel Granados 
---
  drivers/tty/tty_io.c | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index 8a94e5a43c6d..2f925dc54a20 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -3607,8 +3607,7 @@ static struct ctl_table tty_table[] = {
.proc_handler   = proc_dointvec,
.extra1 = SYSCTL_ZERO,
.extra2 = SYSCTL_ONE,
-   },
-   { }
+   }


Why to remove the comma? One would need to add one when adding a new entry?

thanks,
--
js
suse labs



Re: [PATCH v2 1/1] drm/i915: Move abs_diff() to math.h

2023-07-24 Thread Jiri Slaby

On 21. 07. 23, 15:53, Andy Shevchenko wrote:

abs_diff() belongs to math.h. Move it there.
This will allow others to use it.

Signed-off-by: Andy Shevchenko 


Reviewed-by: Jiri Slaby  # tty/serial

--
--
js
suse labs



[PATCH 7/7] fbcon: remove unused display (p) from fbcon_redraw()

2023-07-12 Thread Jiri Slaby (SUSE)
The parameter is unused.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Daniel Vetter 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/fbdev/core/fbcon.c | 7 +++
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index c6c9d040bdec..887fad44e7ec 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -1612,8 +1612,7 @@ static void fbcon_redraw_blit(struct vc_data *vc, struct 
fb_info *info,
}
 }
 
-static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
-int line, int count, int offset)
+static void fbcon_redraw(struct vc_data *vc, int line, int count, int offset)
 {
unsigned short *d = (unsigned short *)
(vc->vc_origin + vc->vc_size_row * line);
@@ -1827,7 +1826,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int 
t, unsigned int b,
 
case SCROLL_REDRAW:
  redraw_up:
-   fbcon_redraw(vc, p, t, b - t - count,
+   fbcon_redraw(vc, t, b - t - count,
 count * vc->vc_cols);
fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
scr_memsetw((unsigned short *) (vc->vc_origin +
@@ -1913,7 +1912,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int 
t, unsigned int b,
 
case SCROLL_REDRAW:
  redraw_down:
-   fbcon_redraw(vc, p, b - 1, b - t - count,
+   fbcon_redraw(vc, b - 1, b - t - count,
 -count * vc->vc_cols);
fbcon_clear(vc, t, 0, count, vc->vc_cols);
scr_memsetw((unsigned short *) (vc->vc_origin +
-- 
2.41.0



[PATCH 5/7] vgacon: cache vc_cell_height in vgacon_cursor()

2023-07-12 Thread Jiri Slaby (SUSE)
There are many places c->vc_cell_height is used in the code of
vgacon_cursor(). Caching the value to a local variable makes the code
much easier to follow.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 34 +++---
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 07f6b97d9b81..7ad047bcae17 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -470,11 +470,15 @@ static void vgacon_set_cursor_size(int from, int to)
 
 static void vgacon_cursor(struct vc_data *c, int mode)
 {
+   unsigned int c_height;
+
if (c->vc_mode != KD_TEXT)
return;
 
vgacon_restore_screen(c);
 
+   c_height = c->vc_cell_height;
+
switch (mode) {
case CM_ERASE:
write_vga(14, (c->vc_pos - vga_vram_base) / 2);
@@ -489,30 +493,22 @@ static void vgacon_cursor(struct vc_data *c, int mode)
write_vga(14, (c->vc_pos - vga_vram_base) / 2);
switch (CUR_SIZE(c->vc_cursor_type)) {
case CUR_UNDERLINE:
-   vgacon_set_cursor_size(c->vc_cell_height -
-  (c->vc_cell_height <
-   10 ? 2 : 3),
-  c->vc_cell_height -
-  (c->vc_cell_height <
-   10 ? 1 : 2));
+   vgacon_set_cursor_size(c_height -
+  (c_height < 10 ? 2 : 3),
+  c_height -
+  (c_height < 10 ? 1 : 2));
break;
case CUR_TWO_THIRDS:
-   vgacon_set_cursor_size(c->vc_cell_height / 3,
-  c->vc_cell_height -
-  (c->vc_cell_height <
-   10 ? 1 : 2));
+   vgacon_set_cursor_size(c_height / 3, c_height -
+  (c_height < 10 ? 1 : 2));
break;
case CUR_LOWER_THIRD:
-   vgacon_set_cursor_size((c->vc_cell_height * 2) / 3,
-  c->vc_cell_height -
-  (c->vc_cell_height <
-   10 ? 1 : 2));
+   vgacon_set_cursor_size(c_height * 2 / 3, c_height -
+  (c_height < 10 ? 1 : 2));
break;
case CUR_LOWER_HALF:
-   vgacon_set_cursor_size(c->vc_cell_height / 2,
-  c->vc_cell_height -
-  (c->vc_cell_height <
-   10 ? 1 : 2));
+   vgacon_set_cursor_size(c_height / 2, c_height -
+  (c_height < 10 ? 1 : 2));
break;
case CUR_NONE:
if (vga_video_type >= VIDEO_TYPE_VGAC)
@@ -521,7 +517,7 @@ static void vgacon_cursor(struct vc_data *c, int mode)
vgacon_set_cursor_size(31, 31);
break;
default:
-   vgacon_set_cursor_size(1, c->vc_cell_height);
+   vgacon_set_cursor_size(1, c_height);
break;
}
break;
-- 
2.41.0



[PATCH 6/7] sticon: make sticon_set_def_font() void and remove op parameter

2023-07-12 Thread Jiri Slaby (SUSE)
sticon_set_def_font() always returns 0, so make it void. And remove an
unused 'op' parameter.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: "James E.J. Bottomley" 
Cc: Helge Deller 
Cc: linux-par...@vger.kernel.org
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/sticon.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index d11cfd2d68b5..992a4fa431aa 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -156,7 +156,7 @@ static bool sticon_scroll(struct vc_data *conp, unsigned 
int t,
 return false;
 }
 
-static int sticon_set_def_font(int unit, struct console_font *op)
+static void sticon_set_def_font(int unit)
 {
if (font_data[unit] != STI_DEF_FONT) {
if (--FNTREFCOUNT(font_data[unit]) == 0) {
@@ -165,8 +165,6 @@ static int sticon_set_def_font(int unit, struct 
console_font *op)
}
font_data[unit] = STI_DEF_FONT;
}
-
-   return 0;
 }
 
 static int sticon_set_font(struct vc_data *vc, struct console_font *op,
@@ -246,7 +244,7 @@ static int sticon_set_font(struct vc_data *vc, struct 
console_font *op,
  vc->vc_video_erase_char, font_data[vc->vc_num]);
 
/* delete old font in case it is a user font */
-   sticon_set_def_font(unit, NULL);
+   sticon_set_def_font(unit);
 
FNTREFCOUNT(cooked_font)++;
font_data[unit] = cooked_font;
@@ -264,7 +262,9 @@ static int sticon_set_font(struct vc_data *vc, struct 
console_font *op,
 
 static int sticon_font_default(struct vc_data *vc, struct console_font *op, 
char *name)
 {
-   return sticon_set_def_font(vc->vc_num, op);
+   sticon_set_def_font(vc->vc_num);
+
+   return 0;
 }
 
 static int sticon_font_set(struct vc_data *vc, struct console_font *font,
@@ -297,7 +297,7 @@ static void sticon_deinit(struct vc_data *c)
 
 /* free memory used by user font */
 for (i = 0; i < MAX_NR_CONSOLES; i++)
-   sticon_set_def_font(i, NULL);
+   sticon_set_def_font(i);
 }
 
 static void sticon_clear(struct vc_data *conp, int sy, int sx, int height,
-- 
2.41.0



[PATCH 3/7] vgacon: remove unused xpos from vgacon_set_cursor_size()

2023-07-12 Thread Jiri Slaby (SUSE)
xpos is unused, remove it.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 25 ++---
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index a34cdfcc10c2..7cb15851ea56 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -437,7 +437,7 @@ static void vgacon_invert_region(struct vc_data *c, u16 * 
p, int count)
}
 }
 
-static void vgacon_set_cursor_size(int xpos, int from, int to)
+static void vgacon_set_cursor_size(int from, int to)
 {
unsigned long flags;
int curs, cure;
@@ -479,9 +479,9 @@ static void vgacon_cursor(struct vc_data *c, int mode)
case CM_ERASE:
write_vga(14, (c->vc_pos - vga_vram_base) / 2);
if (vga_video_type >= VIDEO_TYPE_VGAC)
-   vgacon_set_cursor_size(c->state.x, 31, 30);
+   vgacon_set_cursor_size(31, 30);
else
-   vgacon_set_cursor_size(c->state.x, 31, 31);
+   vgacon_set_cursor_size(31, 31);
break;
 
case CM_MOVE:
@@ -489,8 +489,7 @@ static void vgacon_cursor(struct vc_data *c, int mode)
write_vga(14, (c->vc_pos - vga_vram_base) / 2);
switch (CUR_SIZE(c->vc_cursor_type)) {
case CUR_UNDERLINE:
-   vgacon_set_cursor_size(c->state.x,
-  c->vc_cell_height -
+   vgacon_set_cursor_size(c->vc_cell_height -
   (c->vc_cell_height <
10 ? 2 : 3),
   c->vc_cell_height -
@@ -498,35 +497,31 @@ static void vgacon_cursor(struct vc_data *c, int mode)
10 ? 1 : 2));
break;
case CUR_TWO_THIRDS:
-   vgacon_set_cursor_size(c->state.x,
-  c->vc_cell_height / 3,
+   vgacon_set_cursor_size(c->vc_cell_height / 3,
   c->vc_cell_height -
   (c->vc_cell_height <
10 ? 1 : 2));
break;
case CUR_LOWER_THIRD:
-   vgacon_set_cursor_size(c->state.x,
-  (c->vc_cell_height * 2) / 3,
+   vgacon_set_cursor_size((c->vc_cell_height * 2) / 3,
   c->vc_cell_height -
   (c->vc_cell_height <
10 ? 1 : 2));
break;
case CUR_LOWER_HALF:
-   vgacon_set_cursor_size(c->state.x,
-  c->vc_cell_height / 2,
+   vgacon_set_cursor_size(c->vc_cell_height / 2,
   c->vc_cell_height -
   (c->vc_cell_height <
10 ? 1 : 2));
break;
case CUR_NONE:
if (vga_video_type >= VIDEO_TYPE_VGAC)
-   vgacon_set_cursor_size(c->state.x, 31, 30);
+   vgacon_set_cursor_size(31, 30);
else
-   vgacon_set_cursor_size(c->state.x, 31, 31);
+   vgacon_set_cursor_size(31, 31);
break;
default:
-   vgacon_set_cursor_size(c->state.x, 1,
-  c->vc_cell_height);
+   vgacon_set_cursor_size(1, c->vc_cell_height);
break;
}
break;
-- 
2.41.0



[PATCH 4/7] vgacon: let vgacon_doresize() return void

2023-07-12 Thread Jiri Slaby (SUSE)
The return value is neither used, nor vgacon_doresize() returns an
error. So change the reurn type to void.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 7cb15851ea56..07f6b97d9b81 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -528,7 +528,7 @@ static void vgacon_cursor(struct vc_data *c, int mode)
}
 }
 
-static int vgacon_doresize(struct vc_data *c,
+static void vgacon_doresize(struct vc_data *c,
unsigned int width, unsigned int height)
 {
unsigned long flags;
@@ -587,7 +587,6 @@ static int vgacon_doresize(struct vc_data *c,
}
 
raw_spin_unlock_irqrestore(_lock, flags);
-   return 0;
 }
 
 static int vgacon_switch(struct vc_data *c)
-- 
2.41.0



[PATCH 2/7] vgacon: remove unneeded forward declarations

2023-07-12 Thread Jiri Slaby (SUSE)
Most of the forward declarations in vgacon are not needed. Drop them.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 10 +-
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index fbed2862c317..a34cdfcc10c2 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -65,16 +65,8 @@ static struct vgastate vgastate;
  *  Interface used by the world
  */
 
-static const char *vgacon_startup(void);
-static void vgacon_init(struct vc_data *c, int init);
-static void vgacon_deinit(struct vc_data *c);
-static void vgacon_cursor(struct vc_data *c, int mode);
-static int vgacon_switch(struct vc_data *c);
-static int vgacon_blank(struct vc_data *c, int blank, int mode_switch);
-static void vgacon_scrolldelta(struct vc_data *c, int lines);
 static int vgacon_set_origin(struct vc_data *c);
-static void vgacon_save_screen(struct vc_data *c);
-static void vgacon_invert_region(struct vc_data *c, u16 * p, int count);
+
 static struct uni_pagedict *vgacon_uni_pagedir;
 static int vgacon_refcount;
 
-- 
2.41.0



[PATCH 1/7] vgacon: switch vgacon_scrolldelta() and vgacon_restore_screen()

2023-07-12 Thread Jiri Slaby (SUSE)
Switch vgacon_scrolldelta() and vgacon_restore_screen() positions, so
that the former is not needed to be forward-declared.

Signed-off-by: Jiri Slaby (SUSE) 
Cc: Helge Deller 
Cc: linux-fb...@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/video/console/vgacon.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index e25ba523892e..fbed2862c317 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -142,12 +142,6 @@ static inline void vga_set_mem_top(struct vc_data *c)
write_vga(12, (c->vc_visible_origin - vga_vram_base) / 2);
 }
 
-static void vgacon_restore_screen(struct vc_data *c)
-{
-   if (c->vc_origin != c->vc_visible_origin)
-   vgacon_scrolldelta(c, 0);
-}
-
 static void vgacon_scrolldelta(struct vc_data *c, int lines)
 {
vc_scrolldelta_helper(c, lines, vga_rolled_over, (void *)vga_vram_base,
@@ -155,6 +149,12 @@ static void vgacon_scrolldelta(struct vc_data *c, int 
lines)
vga_set_mem_top(c);
 }
 
+static void vgacon_restore_screen(struct vc_data *c)
+{
+   if (c->vc_origin != c->vc_visible_origin)
+   vgacon_scrolldelta(c, 0);
+}
+
 static const char *vgacon_startup(void)
 {
const char *display_desc = NULL;
-- 
2.41.0



Re: [PATCH] fbcon: Check font dimension limits

2023-01-26 Thread Jiri Slaby

On 26. 01. 23, 8:43, Greg KH wrote:

--- linux-6.0.orig/drivers/video/fbdev/core/fbcon.c
+++ linux-6.0/drivers/video/fbdev/core/fbcon.c
@@ -2489,9 +2489,12 @@ static int fbcon_set_font(struct vc_data
h > FBCON_SWAP(info->var.rotate, info->var.yres, info->var.xres))
return -EINVAL;
  
+	if (font->width > 32 || font->height > 32)

+   return -EINVAL;
+
/* Make sure drawing engine can handle the font */
-   if (!(info->pixmap.blit_x & (1 << (font->width - 1))) ||
-   !(info->pixmap.blit_y & (1 << (font->height - 1
+   if (!(info->pixmap.blit_x & (1U << (font->width - 1))) ||
+   !(info->pixmap.blit_y & (1U << (font->height - 1


Are you sure this is still needed with the above check added?  If so,
why?  What is the difference in the compiled code?


For font->{width,height} == 32, definitely. IMO, 1 << 31 is undefined as 
1 << 31 cannot be represented by an (signed) int.


--
js
suse labs



Re: [PATCH] fbcon: Check font dimension limits

2023-01-26 Thread Jiri Slaby

On 26. 01. 23, 1:49, Samuel Thibault wrote:

blit_x and blit_y are uint32_t, so fbcon currently cannot support fonts
larger than 32x32.

The 32x32 case also needs shifting an unsigned int, to properly set bit
31, otherwise we get "UBSAN: shift-out-of-bounds in fbcon_set_font",
as reported on

http://lore.kernel.org/all/ia1pr07mb98308653e259a6f2ce94a4afab...@ia1pr07mb9830.namprd07.prod.outlook.com
Kernel Branch: 6.2.0-rc5-next-20230124
Kernel config: 
https://drive.google.com/file/d/1F-LszDAizEEH0ZX0HcSR06v5q8FPl2Uv/view?usp=sharing
Reproducer: 
https://drive.google.com/file/d/1mP1jcLBY7vWCNM60OMf-ogw-urQRjNrm/view?usp=sharing

Reported-by: Sanan Hasanov 
Signed-off-by: Samuel Thibault 

Index: linux-6.0/drivers/video/fbdev/core/fbcon.c
===
--- linux-6.0.orig/drivers/video/fbdev/core/fbcon.c
+++ linux-6.0/drivers/video/fbdev/core/fbcon.c
@@ -2489,9 +2489,12 @@ static int fbcon_set_font(struct vc_data
h > FBCON_SWAP(info->var.rotate, info->var.yres, info->var.xres))
return -EINVAL;
  
+	if (font->width > 32 || font->height > 32)

+   return -EINVAL;
+
/* Make sure drawing engine can handle the font */
-   if (!(info->pixmap.blit_x & (1 << (font->width - 1))) ||
-   !(info->pixmap.blit_y & (1 << (font->height - 1
+   if (!(info->pixmap.blit_x & (1U << (font->width - 1))) ||
+   !(info->pixmap.blit_y & (1U << (font->height - 1


So use BIT() properly then? That should be used in all these shifts 
anyway. Exactly to avoid UB.


thanks,
--
js
suse labs



[PATCH -resend] drm/nouveau/kms/nv50- (gcc13): fix nv50_wndw_new_ prototype

2023-01-16 Thread Jiri Slaby (SUSE)
gcc-13 warns about mismatching types for enums. That revealed switched
arguments of nv50_wndw_new_():
  drivers/gpu/drm/nouveau/dispnv50/wndw.c:696:1: error: conflicting types for 
'nv50_wndw_new_' due to enum/integer mismatch; have 'int(const struct 
nv50_wndw_func *, struct drm_device *, enum drm_plane_type,  const char *, int, 
 const u32 *, u32,  enum nv50_disp_interlock_type,  u32,  struct nv50_wndw **)'
  drivers/gpu/drm/nouveau/dispnv50/wndw.h:36:5: note: previous declaration of 
'nv50_wndw_new_' with type 'int(const struct nv50_wndw_func *, struct 
drm_device *, enum drm_plane_type,  const char *, int,  const u32 *, enum 
nv50_disp_interlock_type,  u32,  u32,  struct nv50_wndw **)'

It can be barely visible, but the declaration says about the parameters
in the middle:
  enum nv50_disp_interlock_type,
  u32 interlock_data,
  u32 heads,

While the definition states differently:
  u32 heads,
  enum nv50_disp_interlock_type interlock_type,
  u32 interlock_data,

Unify/fix the declaration to match the definition.

Cc: Martin Liska 
Cc: Ben Skeggs 
Cc: Karol Herbst 
Cc: Lyude Paul 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: dri-devel@lists.freedesktop.org
Cc: nouv...@lists.freedesktop.org
Cc: linux-ker...@vger.kernel.org
Signed-off-by: Jiri Slaby (SUSE) 
---

Notes:
[v2] switch to uint instead of to enum

 drivers/gpu/drm/nouveau/dispnv50/wndw.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.h 
b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
index 591c852f326b..76a6ae5d5652 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.h
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
@@ -35,8 +35,9 @@ struct nv50_wndw {
 
 int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
   enum drm_plane_type, const char *name, int index,
-  const u32 *format, enum nv50_disp_interlock_type,
-  u32 interlock_data, u32 heads, struct nv50_wndw **);
+  const u32 *format, u32 heads,
+  enum nv50_disp_interlock_type, u32 interlock_data,
+  struct nv50_wndw **);
 void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
 struct nv50_wndw_atom *);
 void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,
-- 
2.39.0



[PATCH -resend] drm/nouveau/kms/nv50- (gcc13): fix nv50_wndw_new_ prototype

2023-01-16 Thread Jiri Slaby (SUSE)
gcc-13 warns about mismatching types for enums. That revealed switched
arguments of nv50_wndw_new_():
  drivers/gpu/drm/nouveau/dispnv50/wndw.c:696:1: error: conflicting types for 
'nv50_wndw_new_' due to enum/integer mismatch; have 'int(const struct 
nv50_wndw_func *, struct drm_device *, enum drm_plane_type,  const char *, int, 
 const u32 *, u32,  enum nv50_disp_interlock_type,  u32,  struct nv50_wndw **)'
  drivers/gpu/drm/nouveau/dispnv50/wndw.h:36:5: note: previous declaration of 
'nv50_wndw_new_' with type 'int(const struct nv50_wndw_func *, struct 
drm_device *, enum drm_plane_type,  const char *, int,  const u32 *, enum 
nv50_disp_interlock_type,  u32,  u32,  struct nv50_wndw **)'

It can be barely visible, but the declaration says about the parameters
in the middle:
  enum nv50_disp_interlock_type,
  u32 interlock_data,
  u32 heads,

While the definition states differently:
  u32 heads,
  enum nv50_disp_interlock_type interlock_type,
  u32 interlock_data,

Unify/fix the declaration to match the definition.

Cc: Martin Liska 
Cc: Ben Skeggs 
Cc: Karol Herbst 
Cc: Lyude Paul 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: dri-devel@lists.freedesktop.org
Cc: nouv...@lists.freedesktop.org
Cc: linux-ker...@vger.kernel.org
Signed-off-by: Jiri Slaby (SUSE) 
---

Notes:
[v2] switch to uint instead of to enum

 drivers/gpu/drm/nouveau/dispnv50/wndw.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.h 
b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
index 591c852f326b..76a6ae5d5652 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.h
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
@@ -35,8 +35,9 @@ struct nv50_wndw {
 
 int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
   enum drm_plane_type, const char *name, int index,
-  const u32 *format, enum nv50_disp_interlock_type,
-  u32 interlock_data, u32 heads, struct nv50_wndw **);
+  const u32 *format, u32 heads,
+  enum nv50_disp_interlock_type, u32 interlock_data,
+  struct nv50_wndw **);
 void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
 struct nv50_wndw_atom *);
 void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,
-- 
2.39.0



[PATCH] drm/nouveau/kms/nv50- (gcc13): fix nv50_wndw_new_ prototype

2022-12-12 Thread Jiri Slaby (SUSE)
gcc-13 warns about mismatching types for enums. That revealed switched
arguments of nv50_wndw_new_():
  drivers/gpu/drm/nouveau/dispnv50/wndw.c:696:1: error: conflicting types for 
'nv50_wndw_new_' due to enum/integer mismatch; have 'int(const struct 
nv50_wndw_func *, struct drm_device *, enum drm_plane_type,  const char *, int, 
 const u32 *, u32,  enum nv50_disp_interlock_type,  u32,  struct nv50_wndw **)'
  drivers/gpu/drm/nouveau/dispnv50/wndw.h:36:5: note: previous declaration of 
'nv50_wndw_new_' with type 'int(const struct nv50_wndw_func *, struct 
drm_device *, enum drm_plane_type,  const char *, int,  const u32 *, enum 
nv50_disp_interlock_type,  u32,  u32,  struct nv50_wndw **)'

It can be barely visible, but the declaration says about the parameters
in the middle:
  enum nv50_disp_interlock_type,
  u32 interlock_data,
  u32 heads,

While the definition states differently:
  u32 heads,
  enum nv50_disp_interlock_type interlock_type,
  u32 interlock_data,

Unify/fix the declaration to match the definition.

Cc: Martin Liska 
Cc: Ben Skeggs 
Cc: Karol Herbst 
Cc: Lyude Paul 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: dri-devel@lists.freedesktop.org
Cc: nouv...@lists.freedesktop.org
Cc: linux-ker...@vger.kernel.org
Signed-off-by: Jiri Slaby (SUSE) 
---
 drivers/gpu/drm/nouveau/dispnv50/wndw.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.h 
b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
index 591c852f326b..76a6ae5d5652 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.h
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
@@ -35,8 +35,9 @@ struct nv50_wndw {
 
 int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
   enum drm_plane_type, const char *name, int index,
-  const u32 *format, enum nv50_disp_interlock_type,
-  u32 interlock_data, u32 heads, struct nv50_wndw **);
+  const u32 *format, u32 heads,
+  enum nv50_disp_interlock_type, u32 interlock_data,
+  struct nv50_wndw **);
 void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
 struct nv50_wndw_atom *);
 void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,
-- 
2.38.1



[PATCH v2] drm/i915: remove circ_buf.h includes

2022-11-14 Thread Jiri Slaby (SUSE)
The last user of macros from that include was removed in 2018 by the
commit below.

Fixes: 6cc42152b02b ("drm/i915: Remove support for legacy debugfs crc 
interface")
Cc: Jani Nikula 
Cc: Joonas Lahtinen 
Cc: Rodrigo Vivi 
Cc: Tvrtko Ursulin 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: intel-...@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Jiri Slaby (SUSE) 
---

Notes:
[v2] fixed e-mail setup

 drivers/gpu/drm/i915/display/intel_pipe_crc.c | 1 -
 drivers/gpu/drm/i915/i915_irq.c   | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_pipe_crc.c 
b/drivers/gpu/drm/i915/display/intel_pipe_crc.c
index 673454fbf784..e9774670e3f6 100644
--- a/drivers/gpu/drm/i915/display/intel_pipe_crc.c
+++ b/drivers/gpu/drm/i915/display/intel_pipe_crc.c
@@ -24,7 +24,6 @@
  *
  */
 
-#include 
 #include 
 #include 
 #include 
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index b0180ea38de0..a815a45a6e6b 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -28,7 +28,6 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
-#include 
 #include 
 #include 
 
-- 
2.38.1



[PATCH] drm/amd/display (gcc13): fix enum mismatch

2022-10-31 Thread Jiri Slaby (SUSE)
rn_vbios_smu_set_dcn_low_power_state() produces a valid warning with
gcc-13:
  drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c:237:6: 
error: conflicting types for 'rn_vbios_smu_set_dcn_low_power_state' due to 
enum/integer mismatch; have 'void(struct clk_mgr_internal *, enum 
dcn_pwr_state)'
  drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h:36:6: 
note: previous declaration of 'rn_vbios_smu_set_dcn_low_power_state' with type 
'void(struct clk_mgr_internal *, int)'

I.e. the type of the 2nd parameter of
rn_vbios_smu_set_dcn_low_power_state() in the declaration is int, while
the definition spells enum dcn_pwr_state. Synchronize them to the
latter (and add a forward enum declaration).

Cc: Martin Liska 
Cc: Harry Wentland 
Cc: Leo Li 
Cc: Rodrigo Siqueira 
Cc: Alex Deucher 
Cc: "Christian König" 
Cc: "Pan, Xinhui" 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: amd-...@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Jiri Slaby (SUSE) 
---
 .../drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git 
a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h
index 3e5df27aa96f..1ce19d875358 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h
@@ -26,6 +26,8 @@
 #ifndef DAL_DC_RN_CLK_MGR_VBIOS_SMU_H_
 #define DAL_DC_RN_CLK_MGR_VBIOS_SMU_H_
 
+enum dcn_pwr_state;
+
 int rn_vbios_smu_get_smu_version(struct clk_mgr_internal *clk_mgr);
 int rn_vbios_smu_set_dispclk(struct clk_mgr_internal *clk_mgr, int 
requested_dispclk_khz);
 int rn_vbios_smu_set_dprefclk(struct clk_mgr_internal *clk_mgr);
@@ -33,7 +35,7 @@ int rn_vbios_smu_set_hard_min_dcfclk(struct clk_mgr_internal 
*clk_mgr, int reque
 int rn_vbios_smu_set_min_deep_sleep_dcfclk(struct clk_mgr_internal *clk_mgr, 
int requested_min_ds_dcfclk_khz);
 void rn_vbios_smu_set_phyclk(struct clk_mgr_internal *clk_mgr, int 
requested_phyclk_khz);
 int rn_vbios_smu_set_dppclk(struct clk_mgr_internal *clk_mgr, int 
requested_dpp_khz);
-void rn_vbios_smu_set_dcn_low_power_state(struct clk_mgr_internal *clk_mgr, 
int display_count);
+void rn_vbios_smu_set_dcn_low_power_state(struct clk_mgr_internal *clk_mgr, 
enum dcn_pwr_state);
 void rn_vbios_smu_enable_48mhz_tmdp_refclk_pwrdwn(struct clk_mgr_internal 
*clk_mgr, bool enable);
 void rn_vbios_smu_enable_pme_wa(struct clk_mgr_internal *clk_mgr);
 int rn_vbios_smu_is_periodic_retraining_disabled(struct clk_mgr_internal 
*clk_mgr);
-- 
2.38.1



[PATCH] drm/nouveau/kms/nv50- (gcc13): fix nv50_wndw_new_ prototype

2022-10-31 Thread Jiri Slaby (SUSE)
gcc-13 warns about mismatching types for enums. That revealed switched
arguments of nv50_wndw_new_():
  drivers/gpu/drm/nouveau/dispnv50/wndw.c:696:1: error: conflicting types for 
'nv50_wndw_new_' due to enum/integer mismatch; have 'int(const struct 
nv50_wndw_func *, struct drm_device *, enum drm_plane_type,  const char *, int, 
 const u32 *, u32,  enum nv50_disp_interlock_type,  u32,  struct nv50_wndw **)'
  drivers/gpu/drm/nouveau/dispnv50/wndw.h:36:5: note: previous declaration of 
'nv50_wndw_new_' with type 'int(const struct nv50_wndw_func *, struct 
drm_device *, enum drm_plane_type,  const char *, int,  const u32 *, enum 
nv50_disp_interlock_type,  u32,  u32,  struct nv50_wndw **)'

It can be barely visible, but the declaration says about the parameters
in the middle:
  enum nv50_disp_interlock_type,
  u32 interlock_data,
  u32 heads,

While the definition states differently:
  u32 heads,
  enum nv50_disp_interlock_type interlock_type,
  u32 interlock_data,

Unify/fix the declaration to match the definition.

Cc: Martin Liska 
Cc: Ben Skeggs 
Cc: Karol Herbst 
Cc: Lyude Paul 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: dri-devel@lists.freedesktop.org
Cc: nouv...@lists.freedesktop.org
Cc: linux-ker...@vger.kernel.org
Signed-off-by: Jiri Slaby (SUSE) 
---
 drivers/gpu/drm/nouveau/dispnv50/wndw.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.h 
b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
index 591c852f326b..76a6ae5d5652 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.h
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.h
@@ -35,8 +35,9 @@ struct nv50_wndw {
 
 int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
   enum drm_plane_type, const char *name, int index,
-  const u32 *format, enum nv50_disp_interlock_type,
-  u32 interlock_data, u32 heads, struct nv50_wndw **);
+  const u32 *format, u32 heads,
+  enum nv50_disp_interlock_type, u32 interlock_data,
+  struct nv50_wndw **);
 void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
 struct nv50_wndw_atom *);
 void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,
-- 
2.38.1



Re: [PATCH 1/2] drm/i915/display: fix randconfig build

2022-10-05 Thread Jiri Slaby

On 04. 10. 22, 12:52, Jani Nikula wrote:

On Tue, 04 Oct 2022, "Jiri Slaby (SUSE)"  wrote:

When DRM_I915=y and BACKLIGHT_CLASS_DEVICE=m, the build fails:
ld: drivers/gpu/drm/i915/display/intel_backlight.o: in function 
`intel_backlight_device_register':
intel_backlight.c:(.text+0x5587): undefined reference to 
`backlight_device_get_by_name'

ld: drivers/gpu/drm/i915/display/intel_backlight.o: in function 
`intel_backlight_device_unregister':
intel_backlight.c:(.text+0x576e): undefined reference to 
`backlight_device_unregister'

To fix this, use IS_REACHABLE(), not IS_ENABLED() in backlight. That is,
with the above config, backlight support is disabled.


So I don't want this. I'll take a patch that fixes the dependencies to
block DRM_I915=y and BACKLIGHT_CLASS_DEVICE=m. Nobody wants that combo,
and IMO using IS_REACHABLE() is a workaround to hide a broken config
under the carpet.

The right thing to do is

config DRM_I915
depends on BACKLIGHT_CLASS_DEVICE || BACKLIGHT_CLASS_DEVICE=n.

We're selecting BACKLIGHT_CLASS_DEVICE because almost everyone else is
too, and a combo of selecting and depending leads to circular
dependencies. But depending is the right fix.


I'm not sure what should I do now. If I do:
--- a/drivers/gpu/drm/i915/Kconfig
+++ b/drivers/gpu/drm/i915/Kconfig
@@ -4,6 +4,7 @@ config DRM_I915
depends on DRM
depends on X86 && PCI
depends on !PREEMPT_RT
+   depends on (BACKLIGHT_CLASS_DEVICE && ACPI) || 
(BACKLIGHT_CLASS_DEVICE=n && ACPI=n)

select INTEL_GTT if X86
select INTERVAL_TREE
# we need shmfs for the swappable backing store, and in particular
@@ -21,7 +22,6 @@ config DRM_I915
select IRQ_WORK
# i915 depends on ACPI_VIDEO when ACPI is enabled
# but for select to work, need to select ACPI_VIDEO's 
dependencies, ick

-   select BACKLIGHT_CLASS_DEVICE if ACPI
select INPUT if ACPI
select X86_PLATFORM_DEVICES if ACPI
select ACPI_WMI if ACPI

I get:
drivers/gpu/drm/i915/Kconfig:2:error: recursive dependency detected!
drivers/gpu/drm/i915/Kconfig:2: symbol DRM_I915 depends on 
BACKLIGHT_CLASS_DEVICE
drivers/video/backlight/Kconfig:143:symbol BACKLIGHT_CLASS_DEVICE is 
selected by DRM_FSL_DCU
drivers/gpu/drm/fsl-dcu/Kconfig:2:  symbol DRM_FSL_DCU depends on 
COMMON_CLK

drivers/clk/Kconfig:21: symbol COMMON_CLK is selected by X86_INTEL_QUARK
arch/x86/Kconfig:633:   symbol X86_INTEL_QUARK depends on 
X86_PLATFORM_DEVICES
drivers/platform/x86/Kconfig:6: symbol X86_PLATFORM_DEVICES is selected 
by DRM_I915



Those dependencies are really cumbersome :/.


Documentation/kbuild/kconfig-language.rst:

   Note:
select should be used with care. select will force
a symbol to a value without visiting the dependencies.
By abusing select you are able to select a symbol FOO even
if FOO depends on BAR that is not set.
In general use select only for non-visible symbols
(no prompts anywhere) and for symbols with no dependencies.
That will limit the usefulness but on the other hand avoid
the illegal configurations all over.


BR,
Jani.



Cc: Jani Nikula 
Cc: Joonas Lahtinen 
Cc: Rodrigo Vivi 
Cc: Tvrtko Ursulin 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: intel-...@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org
Reported-by: Martin Liška 
Signed-off-by: Jiri Slaby (SUSE) 
---
  drivers/gpu/drm/i915/display/intel_backlight.c | 2 +-
  drivers/gpu/drm/i915/display/intel_backlight.h | 2 +-
  2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c 
b/drivers/gpu/drm/i915/display/intel_backlight.c
index beba39a38c87..c1ba68796b6d 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_backlight.c
@@ -825,7 +825,7 @@ void intel_backlight_enable(const struct intel_crtc_state 
*crtc_state,
mutex_unlock(_priv->display.backlight.lock);
  }
  
-#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)

+#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
  static u32 intel_panel_get_backlight(struct intel_connector *connector)
  {
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
diff --git a/drivers/gpu/drm/i915/display/intel_backlight.h 
b/drivers/gpu/drm/i915/display/intel_backlight.h
index 339643f63897..207fe1c613d8 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.h
+++ b/drivers/gpu/drm/i915/display/intel_backlight.h
@@ -36,7 +36,7 @@ u32 intel_backlight_invert_pwm_level(struct intel_connector 
*connector, u32 leve
  u32 intel_backlight_level_to_pwm(struct intel_connector *connector, u32 
level);
  u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 
val);
  
-#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)

+#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
  int intel_backlight_device_register(struct intel_connector *connector);
  void 

[PATCH 2/2] drm/i915: remove circ_buf.h includes

2022-10-04 Thread Jiri Slaby (SUSE)
The last user of macros from that include was removed in 2018 by the
commit below.

Fixes: 6cc42152b02b ("drm/i915: Remove support for legacy debugfs crc 
interface")
Cc: Jani Nikula 
Cc: Joonas Lahtinen 
Cc: Rodrigo Vivi 
Cc: Tvrtko Ursulin 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: intel-...@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Jiri Slaby (SUSE) 
---
 drivers/gpu/drm/i915/display/intel_pipe_crc.c | 1 -
 drivers/gpu/drm/i915/i915_irq.c   | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_pipe_crc.c 
b/drivers/gpu/drm/i915/display/intel_pipe_crc.c
index 8ac263f471be..9070935b0443 100644
--- a/drivers/gpu/drm/i915/display/intel_pipe_crc.c
+++ b/drivers/gpu/drm/i915/display/intel_pipe_crc.c
@@ -24,7 +24,6 @@
  *
  */
 
-#include 
 #include 
 #include 
 #include 
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 86a42d9e8041..09d728b34a47 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -28,7 +28,6 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
-#include 
 #include 
 #include 
 
-- 
2.37.3



[PATCH 1/2] drm/i915/display: fix randconfig build

2022-10-04 Thread Jiri Slaby (SUSE)
When DRM_I915=y and BACKLIGHT_CLASS_DEVICE=m, the build fails:
ld: drivers/gpu/drm/i915/display/intel_backlight.o: in function 
`intel_backlight_device_register':
intel_backlight.c:(.text+0x5587): undefined reference to 
`backlight_device_get_by_name'

ld: drivers/gpu/drm/i915/display/intel_backlight.o: in function 
`intel_backlight_device_unregister':
intel_backlight.c:(.text+0x576e): undefined reference to 
`backlight_device_unregister'

To fix this, use IS_REACHABLE(), not IS_ENABLED() in backlight. That is,
with the above config, backlight support is disabled.

Cc: Jani Nikula 
Cc: Joonas Lahtinen 
Cc: Rodrigo Vivi 
Cc: Tvrtko Ursulin 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: intel-...@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org
Reported-by: Martin Liška 
Signed-off-by: Jiri Slaby (SUSE) 
---
 drivers/gpu/drm/i915/display/intel_backlight.c | 2 +-
 drivers/gpu/drm/i915/display/intel_backlight.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c 
b/drivers/gpu/drm/i915/display/intel_backlight.c
index beba39a38c87..c1ba68796b6d 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_backlight.c
@@ -825,7 +825,7 @@ void intel_backlight_enable(const struct intel_crtc_state 
*crtc_state,
mutex_unlock(_priv->display.backlight.lock);
 }
 
-#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
+#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
 static u32 intel_panel_get_backlight(struct intel_connector *connector)
 {
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
diff --git a/drivers/gpu/drm/i915/display/intel_backlight.h 
b/drivers/gpu/drm/i915/display/intel_backlight.h
index 339643f63897..207fe1c613d8 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.h
+++ b/drivers/gpu/drm/i915/display/intel_backlight.h
@@ -36,7 +36,7 @@ u32 intel_backlight_invert_pwm_level(struct intel_connector 
*connector, u32 leve
 u32 intel_backlight_level_to_pwm(struct intel_connector *connector, u32 level);
 u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val);
 
-#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
+#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
 int intel_backlight_device_register(struct intel_connector *connector);
 void intel_backlight_device_unregister(struct intel_connector *connector);
 #else /* CONFIG_BACKLIGHT_CLASS_DEVICE */
-- 
2.37.3



Re: [PATCH] tty/vt: Remove printable variable

2022-08-29 Thread Jiri Slaby

On 26. 08. 22, 22:24, Daniel Vetter wrote:

Every since the 0.99.7A release when console_register() was introduced
it's become impossible to call vt_console_print (called
console_print() back then still) directly. Which means the
initialization issue this variable protected against is no more.

Give it a send off with style and let it rest in peace.


FWIW:
Reviewed-by: Jiri Slaby 

In hopes, nothing breaks.


Signed-off-by: Daniel Vetter 
Cc: Greg Kroah-Hartman 
Cc: Jiri Slaby 
Cc: "Ilpo Järvinen" 
Cc: nick black 
Cc: Daniel Vetter 
Cc: Tetsuo Handa 
Cc: Yangxi Xiang 
Cc: Xuezhi Zhang 
---
  drivers/tty/vt/vt.c | 4 
  1 file changed, 4 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index ae9c926acd6f..4d29e4a17db7 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -157,7 +157,6 @@ static void set_palette(struct vc_data *vc);
  
  #define vt_get_kmsg_redirect() vt_kmsg_redirect(-1)
  
-static int printable;		/* Is console ready for printing? */

  int default_utf8 = true;
  module_param(default_utf8, int, S_IRUGO | S_IWUSR);
  int global_cursor_default = -1;
@@ -3085,8 +3084,6 @@ static void vt_console_print(struct console *co, const 
char *b, unsigned count)
int kmsg_console;
  
  	/* console busy or not yet initialized */

-   if (!printable)
-   return;
if (!spin_trylock(_lock))
return;
  
@@ -3537,7 +3534,6 @@ static int __init con_init(void)

pr_info("Console: %s %s %dx%d\n",
vc->vc_can_do_color ? "colour" : "mono",
display_desc, vc->vc_cols, vc->vc_rows);
-   printable = 1;
  
  	console_unlock();
  


thanks,
--
js
suse labs



Re: [PATCH] tty: vt: selection: Add check for valid tiocl_selection values

2022-08-04 Thread Jiri Slaby

On 04. 08. 22, 10:44, Helge Deller wrote:

On 8/4/22 09:15, Helge Deller wrote:

Hello Jiri,

Thanks for looking into this patch!

On 8/4/22 07:47, Jiri Slaby wrote:

On 30. 07. 22, 20:49, Helge Deller wrote:

The line and column numbers for the selection need to start at 1.
Add the checks to prevent invalid input.

Signed-off-by: Helge Deller 
Reported-by: syzbot+14b0e8f3fd1612e35...@syzkaller.appspotmail.com

diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c
index f7755e73696e..58692a9b4097 100644
--- a/drivers/tty/vt/selection.c
+++ b/drivers/tty/vt/selection.c
@@ -326,6 +326,9 @@ static int vc_selection(struct vc_data *vc, struct 
tiocl_selection *v,
   return 0;
   }

+    if (!v->xs || !v->ys || !v->xe || !v->ye)
+    return -EINVAL;


Hmm, I'm not sure about this. It potentially breaks userspace (by
returning EINVAL now).


Right.
According to the code below, my interpretation is that all xs/ys/xe/ye values
should be > 0. But of course I might be wrong on this, as I didn't find any
documentation for TIOCL_SETSEL.

And if userspace tries to set an invalid selection (e.g. by selecting row 0),
my patch now returns -EINVAL, while it returned success before.


And the code below should handle this just fine, right:

   v->xs = min_t(u16, v->xs - 1, vc->vc_cols - 1);
   v->ys = min_t(u16, v->ys - 1, vc->vc_rows - 1);
   v->xe = min_t(u16, v->xe - 1, vc->vc_cols - 1);


It "handles it fine" in the sense that it can cope with the
input and will not crash.
But it returns (maybe?) unexpected results...


After some more thinking maybe you are right.
In case a user provided invalid values in the past, simply an unexpected
selection was set, but nothing broke.
Since the patch doesn't fix any critical issue, we could just drop this patch
and leave it as is.


We can still do a trial and revert it if something breaks... It's just 
that _noone_ knows with all this undocumented stuff ;).


But in fact, 0 currently means full row/column. Isn't it on purpose?

Today, we are out of luck, codesearch.debian.net gives no clue about users:
https://codesearch.debian.net/search?q=%5CbTIOCL_SETSEL%5Cb=0

thanks,
--
js
suse labs


Re: [PATCH] tty: vt: selection: Add check for valid tiocl_selection values

2022-08-03 Thread Jiri Slaby

On 30. 07. 22, 20:49, Helge Deller wrote:

The line and column numbers for the selection need to start at 1.
Add the checks to prevent invalid input.

Signed-off-by: Helge Deller 
Reported-by: syzbot+14b0e8f3fd1612e35...@syzkaller.appspotmail.com

diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c
index f7755e73696e..58692a9b4097 100644
--- a/drivers/tty/vt/selection.c
+++ b/drivers/tty/vt/selection.c
@@ -326,6 +326,9 @@ static int vc_selection(struct vc_data *vc, struct 
tiocl_selection *v,
return 0;
}

+   if (!v->xs || !v->ys || !v->xe || !v->ye)
+   return -EINVAL;


Hmm, I'm not sure about this. It potentially breaks userspace (by 
returning EINVAL now). And the code below should handle this just fine, 
right:



+
v->xs = min_t(u16, v->xs - 1, vc->vc_cols - 1);
v->ys = min_t(u16, v->ys - 1, vc->vc_rows - 1);
v->xe = min_t(u16, v->xe - 1, vc->vc_cols - 1);


?

thanks,
--
js
suse labs


[PATCH] drm/i915: remove circ_buf.h includes

2021-12-16 Thread Jiri Slaby
The last user of macros from that include was removed in 2018 by the
commit below.

Fixes: 6cc42152b02b ("drm/i915: Remove support for legacy debugfs crc 
interface")
Signed-off-by: Jiri Slaby 
Cc: Jani Nikula 
Cc: Joonas Lahtinen 
Cc: Rodrigo Vivi 
Cc: Tvrtko Ursulin 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: intel-...@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org
---
 drivers/gpu/drm/i915/display/intel_pipe_crc.c | 1 -
 drivers/gpu/drm/i915/i915_irq.c   | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_pipe_crc.c 
b/drivers/gpu/drm/i915/display/intel_pipe_crc.c
index 8ac263f471be..9070935b0443 100644
--- a/drivers/gpu/drm/i915/display/intel_pipe_crc.c
+++ b/drivers/gpu/drm/i915/display/intel_pipe_crc.c
@@ -24,7 +24,6 @@
  *
  */
 
-#include 
 #include 
 #include 
 #include 
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 5b98fb0532b5..e77f644d41e8 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -28,7 +28,6 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
-#include 
 #include 
 #include 
 
-- 
2.34.1



[PATCH 04/44] vgacon: comment on vga_rolled_over

2021-03-01 Thread Jiri Slaby
Long time ago, I figured out what this number is good for and documented
that locally. But never submitted, so do it now.

Signed-off-by: Jiri Slaby 
Cc: dri-devel@lists.freedesktop.org
Cc: linux-fb...@vger.kernel.org
---
 drivers/video/console/vgacon.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 962c12be9774..0d26e821e73b 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -96,7 +96,7 @@ static bool   vga_is_gfx;
 static boolvga_512_chars;
 static int vga_video_font_height;
 static int vga_scan_lines  __read_mostly;
-static unsigned intvga_rolled_over;
+static unsigned intvga_rolled_over; /* last vc_origin offset before wrap */
 
 static bool vgacon_text_mode_force;
 static bool vga_hardscroll_enabled;
-- 
2.30.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 09/12] vgacon: drop BROKEN_GRAPHICS_PROGRAMS

2021-01-05 Thread Jiri Slaby
BROKEN_GRAPHICS_PROGRAMS is defined when CONFIG_VGA_CONSOLE=y. And
vgacon.c is built exclusively in that case too. So the check for
BROKEN_GRAPHICS_PROGRAMS is pointless in vgacon.c as it is always true.
So remove the test and BROKEN_GRAPHICS_PROGRAMS completely.

This also eliminates the need for vga_font_is_default global as it is
only set and never read.

Signed-off-by: Jiri Slaby 
Cc: dri-devel@lists.freedesktop.org
Cc: linux-fb...@vger.kernel.org
---
 drivers/video/console/vgacon.c | 19 ---
 include/linux/vt_kern.h| 12 
 2 files changed, 31 deletions(-)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 17876f0179b5..962c12be9774 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -90,7 +90,6 @@ static unsigned int   vga_video_num_lines;
/* Number of text lines */
 static boolvga_can_do_color;   /* Do we 
support colors? */
 static unsigned intvga_default_font_height __read_mostly;  /* Height of 
default screen font */
 static unsigned char   vga_video_type  __read_mostly;  /* Card type */
-static boolvga_font_is_default = true;
 static int vga_vesa_blanked;
 static boolvga_palette_blanked;
 static boolvga_is_gfx;
@@ -878,7 +877,6 @@ static int vgacon_do_font_op(struct vgastate *state, char 
*arg, int set,
beg = 0x0a;
}
 
-#ifdef BROKEN_GRAPHICS_PROGRAMS
/*
 * All fonts are loaded in slot 0 (0:1 for 512 ch)
 */
@@ -886,24 +884,7 @@ static int vgacon_do_font_op(struct vgastate *state, char 
*arg, int set,
if (!arg)
return -EINVAL; /* Return to default font not supported */
 
-   vga_font_is_default = false;
font_select = ch512 ? 0x04 : 0x00;
-#else
-   /*
-* The default font is kept in slot 0 and is never touched.
-* A custom font is loaded in slot 2 (256 ch) or 2:3 (512 ch)
-*/
-
-   if (set) {
-   vga_font_is_default = !arg;
-   if (!arg)
-   ch512 = false;  /* Default font is always 256 */
-   font_select = arg ? (ch512 ? 0x0e : 0x0a) : 0x00;
-   }
-
-   if (!vga_font_is_default)
-   charmap += 4 * cmapsz;
-#endif
 
raw_spin_lock_irq(_lock);
/* First, the Sequencer */
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h
index 349e39c3ab60..94e7a315479c 100644
--- a/include/linux/vt_kern.h
+++ b/include/linux/vt_kern.h
@@ -16,18 +16,6 @@
 #include 
 #include 
 
-/*
- * Presently, a lot of graphics programs do not restore the contents of
- * the higher font pages.  Defining this flag will avoid use of them, but
- * will lose support for PIO_FONTRESET.  Note that many font operations are
- * not likely to work with these programs anyway; they need to be
- * fixed.  The linux/Documentation directory includes a code snippet
- * to save and restore the text font.
- */
-#ifdef CONFIG_VGA_CONSOLE
-#define BROKEN_GRAPHICS_PROGRAMS 1
-#endif
-
 void kd_mksound(unsigned int hz, unsigned int ticks);
 int kbd_rate(struct kbd_repeat *rep);
 
-- 
2.30.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 1/2] console: Remove dummy con_font_op() callback implementations

2020-11-02 Thread Jiri Slaby

On 02. 11. 20, 10:36, Peilin Ye wrote:

`struct console_font` is a UAPI structure, thus ideally should not be
used for kernel internal abstraction. Remove some dummy .con_font_set,
.con_font_default and .con_font_copy `struct consw` callback
implementations, to make it cleaner.


ESEMANTIC_ERROR.

1) What do you refer to with the last "it"?

2) What's the purpose of mentioning struct console_font at all?

3) Could you clarify whether you checked it is safe to remove the hooks?

4) All the hooks now return ENOSYS for both consoles (and not 0). Is 
this intentional?


I know answers to the first 3 questions, but you need to elaborate a bit 
in the commit log to connect those sentences. Esp. for people not 
dealing with the code on a daily basis. Ad 4) I am not sure.



Suggested-by: Daniel Vetter 
Signed-off-by: Peilin Ye 
---
Change in v2:
   - [v2 2/2] no longer Cc: stable, so do not Cc: stable

Context: 
https://lore.kernel.org/lkml/CAKMK7uFY2zv0adjKJ_ORVFT7Zzwn075MaU0rEU7_FuqENLR=u...@mail.gmail.com/

  drivers/usb/misc/sisusbvga/sisusb_con.c | 21 -
  drivers/video/console/dummycon.c| 20 
  2 files changed, 41 deletions(-)

diff --git a/drivers/usb/misc/sisusbvga/sisusb_con.c 
b/drivers/usb/misc/sisusbvga/sisusb_con.c
index c63e545fb105..dfa0d5ce6012 100644
--- a/drivers/usb/misc/sisusbvga/sisusb_con.c
+++ b/drivers/usb/misc/sisusbvga/sisusb_con.c
@@ -1345,24 +1345,6 @@ static int sisusbdummycon_blank(struct vc_data *vc, int 
blank, int mode_switch)
return 0;
  }
  
-static int sisusbdummycon_font_set(struct vc_data *vc,

-  struct console_font *font,
-  unsigned int flags)
-{
-   return 0;
-}
-
-static int sisusbdummycon_font_default(struct vc_data *vc,
-  struct console_font *font, char *name)
-{
-   return 0;
-}
-
-static int sisusbdummycon_font_copy(struct vc_data *vc, int con)
-{
-   return 0;
-}
-
  static const struct consw sisusb_dummy_con = {
.owner =THIS_MODULE,
.con_startup =  sisusbdummycon_startup,
@@ -1375,9 +1357,6 @@ static const struct consw sisusb_dummy_con = {
.con_scroll =   sisusbdummycon_scroll,
.con_switch =   sisusbdummycon_switch,
.con_blank =sisusbdummycon_blank,
-   .con_font_set = sisusbdummycon_font_set,
-   .con_font_default = sisusbdummycon_font_default,
-   .con_font_copy =sisusbdummycon_font_copy,
  };
  
  int

diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
index 2a0d0bda7faa..f1711b2f9ff0 100644
--- a/drivers/video/console/dummycon.c
+++ b/drivers/video/console/dummycon.c
@@ -124,23 +124,6 @@ static int dummycon_switch(struct vc_data *vc)
return 0;
  }
  
-static int dummycon_font_set(struct vc_data *vc, struct console_font *font,

-unsigned int flags)
-{
-   return 0;
-}
-
-static int dummycon_font_default(struct vc_data *vc,
-struct console_font *font, char *name)
-{
-   return 0;
-}
-
-static int dummycon_font_copy(struct vc_data *vc, int con)
-{
-   return 0;
-}
-
  /*
   *  The console `switch' structure for the dummy console
   *
@@ -159,8 +142,5 @@ const struct consw dummy_con = {
.con_scroll =   dummycon_scroll,
.con_switch =   dummycon_switch,
.con_blank =dummycon_blank,
-   .con_font_set = dummycon_font_set,
-   .con_font_default = dummycon_font_default,
-   .con_font_copy =dummycon_font_copy,
  };
  EXPORT_SYMBOL_GPL(dummy_con);




--
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] fbcon: Disable accelerated scrolling

2020-10-28 Thread Jiri Slaby

On 28. 10. 20, 17:06, Daniel Vetter wrote:

So ever since syzbot discovered fbcon, we have solid proof that it's
full of bugs. And often the solution is to just delete code and remove
features, e.g.  50145474f6ef ("fbcon: remove soft scrollback code").

...

--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -1147,11 +1147,13 @@ static void fbcon_init(struct vc_data *vc, int init)
  
  	ops->graphics = 0;
  
-	if ((cap & FBINFO_HWACCEL_COPYAREA) &&

-   !(cap & FBINFO_HWACCEL_DISABLED))
-   p->scrollmode = SCROLL_MOVE;
-   else /* default to something safe */
-   p->scrollmode = SCROLL_REDRAW;
+   /*
+* No more hw acceleration for fbcon.
+*
+* FIXME: Garabge collect all the now dead code after sufficient time


If you go this non-invasive path, then only a nit here: "Garbage"

thanks,
--
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 0/3] Prevent out-of-bounds access for built-in font data buffers

2020-09-29 Thread Jiri Slaby
On 29. 09. 20, 14:34, Peilin Ye wrote:
> the work in general? I couldn't think of how do we clean up subsystems
> one by one, while keeping a `console_font` in `struct vc_data`.

Hi,

feel free to change struct vc_data's content as you need, of course.
Only the UAPI _definitions_ have to be preserved (like struct console_font).

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 0/3] Prevent out-of-bounds access for built-in font data buffers

2020-09-25 Thread Jiri Slaby
On 24. 09. 20, 15:38, Peilin Ye wrote:
> Hi all,
> 
> syzbot has reported [1] a global out-of-bounds read issue in
> fbcon_get_font(). A malicious user may resize `vc_font.height` to a large
> value in vt_ioctl(), causing fbcon_get_font() to overflow our built-in
> font data buffers, declared in lib/fonts/font_*.c:
> 
> (e.g. lib/fonts/font_8x8.c)
> #define FONTDATAMAX 2048
> 
> static const unsigned char fontdata_8x8[FONTDATAMAX] = {
> 
> /* 0 0x00 '^@' */
> 0x00, /*  */
> 0x00, /*  */
> 0x00, /*  */
> 0x00, /*  */
> 0x00, /*  */
> 0x00, /*  */
> 0x00, /*  */
> 0x00, /*  */
> [...]
> 
> In order to perform a reliable range check, fbcon_get_font() needs to know
> `FONTDATAMAX` for each built-in font under lib/fonts/. Unfortunately, we
> do not keep that information in our font descriptor,
> `struct console_font`:
> 
> (include/uapi/linux/kd.h)
> struct console_font {
>   unsigned int width, height; /* font size */
>   unsigned int charcount;
>   unsigned char *data;/* font data with height fixed to 32 */
> };
> 
> To make things worse, `struct console_font` is part of the UAPI, so we
> cannot add a new field to keep track of `FONTDATAMAX`.

Hi,

but you still can define struct kernel_console_font containing struct
console_font and the 4 more members you need in the kernel. See below.

> Fortunately, the framebuffer layer itself gives us a hint of how to
> resolve this issue without changing UAPI. When allocating a buffer for a
> user-provided font, fbcon_set_font() reserves four "extra words" at the
> beginning of the buffer:
> 
> (drivers/video/fbdev/core/fbcon.c)
>   new_data = kmalloc(FONT_EXTRA_WORDS * sizeof(int) + size, GFP_USER);

I might be missing something (like coffee in the morning), but why don't
you just:
1) declare struct font_data as
{
  unsigned sum, char_count, size, refcnt;
  const unsigned char data[];
}

Or maybe "struct console_font font" instead of "const unsigned char
data[]", if need be.

2) allocate by:
  kmalloc(struct_size(struct font_data, data, size));

3) use container_of wherever needed

That is you name the data on negative indexes using struct as you
already have to define one.

Then you don't need the ugly macros with negative indexes. And you can
pass this structure down e.g. to fbcon_do_set_font, avoiding potential
mistakes in accessing data[-1] and similar.

thanks,
-- 
js
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 1/2] drm/virtio: fix unblank

2020-08-24 Thread Jiri Slaby
On 18. 08. 20, 9:25, Gerd Hoffmann wrote:
> When going through a disable/enable cycle without changing the
> framebuffer the optimization added by commit 3954ff10e06e ("drm/virtio:
> skip set_scanout if framebuffer didn't change") causes the screen stay
> blank.  Add a bool to force an update to fix that.
> 
> v2: use drm_atomic_crtc_needs_modeset() (Daniel).
> 
> Cc: 1882...@bugs.launchpad.net
> Fixes: 3954ff10e06e ("drm/virtio: skip set_scanout if framebuffer didn't 
> change")
> Signed-off-by: Gerd Hoffmann 

Tested-by: Jiri Slaby 

> ---
>  drivers/gpu/drm/virtio/virtgpu_drv.h |  1 +
>  drivers/gpu/drm/virtio/virtgpu_display.c | 11 +++
>  drivers/gpu/drm/virtio/virtgpu_plane.c   |  4 +++-
>  3 files changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h 
> b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index 9ff9f4ac0522..4ab1b0ba2925 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -138,6 +138,7 @@ struct virtio_gpu_output {
>   int cur_x;
>   int cur_y;
>   bool enabled;
> + bool needs_modeset;
>  };
>  #define drm_crtc_to_virtio_gpu_output(x) \
>   container_of(x, struct virtio_gpu_output, crtc)
> diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c 
> b/drivers/gpu/drm/virtio/virtgpu_display.c
> index 2c2742b8d657..6c26b41f4e0d 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_display.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_display.c
> @@ -123,6 +123,17 @@ static int virtio_gpu_crtc_atomic_check(struct drm_crtc 
> *crtc,
>  static void virtio_gpu_crtc_atomic_flush(struct drm_crtc *crtc,
>struct drm_crtc_state *old_state)
>  {
> + struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
> +
> + /*
> +  * virtio-gpu can't do modeset and plane update operations
> +  * independant from each other.  So the actual modeset happens
> +  * in the plane update callback, and here we just check
> +  * whenever we must force the modeset.
> +  */
> + if (drm_atomic_crtc_needs_modeset(crtc->state)) {
> + output->needs_modeset = true;
> + }
>  }
>  
>  static const struct drm_crtc_helper_funcs virtio_gpu_crtc_helper_funcs = {
> diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c 
> b/drivers/gpu/drm/virtio/virtgpu_plane.c
> index 52d24179bcec..65757409d9ed 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_plane.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
> @@ -163,7 +163,9 @@ static void virtio_gpu_primary_plane_update(struct 
> drm_plane *plane,
>   plane->state->src_w != old_state->src_w ||
>   plane->state->src_h != old_state->src_h ||
>   plane->state->src_x != old_state->src_x ||
> - plane->state->src_y != old_state->src_y) {
> + plane->state->src_y != old_state->src_y ||
> + output->needs_modeset) {
> + output->needs_modeset = false;
>   DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d, src %dx%d+%d+%d\n",
> bo->hw_res_handle,
> plane->state->crtc_w, plane->state->crtc_h,
> 


-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 2/2] drm/virtio: Remove open-coded commit-tail function

2020-08-20 Thread Jiri Slaby
On 19. 08. 20, 15:24, Gerd Hoffmann wrote:
> On Wed, Aug 19, 2020 at 02:43:28PM +0200, Jiri Slaby wrote:
>> On 09. 07. 20, 14:33, Daniel Vetter wrote:
>>> Exactly matches the one in the helpers.
>>
>> It's not that exact. The order of modeset_enables and planes is
>> different. And this causes a regression -- no fb in qemu.
> 
> Does https://patchwork.freedesktop.org/patch/385980/ help?

Yes, it does.

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 2/2] drm/virtio: Remove open-coded commit-tail function

2020-08-19 Thread Jiri Slaby
On 19. 08. 20, 14:43, Jiri Slaby wrote:
> On 09. 07. 20, 14:33, Daniel Vetter wrote:
>> Exactly matches the one in the helpers.
> 
> It's not that exact. The order of modeset_enables and planes is
> different. And this causes a regression -- no fb in qemu.
> 
> So if I run drm-tip, no fb.
> If I revert 73f15a9, it works.
> If I then switch the two calls in vgdev_atomic_commit_tail, it doesn't
> work again.
> 
> So the order apparently matters.

And it was the intention, it seems:

commit e7cf0963f816fa44190caaf51aeffaa614c340c6
Author: Gerd Hoffmann 
Date:   Tue May 31 08:50:47 2016 +0200

virtio-gpu: add atomic_commit function

Do modesets first, then call drm_atomic_helper_commit_planes with
active_only = true.  That way the outputs doesn't get disabled
temporarly on atomic commits.


thanks,
-- 
js
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 2/2] drm/virtio: Remove open-coded commit-tail function

2020-08-19 Thread Jiri Slaby
On 09. 07. 20, 14:33, Daniel Vetter wrote:
> Exactly matches the one in the helpers.

It's not that exact. The order of modeset_enables and planes is
different. And this causes a regression -- no fb in qemu.

So if I run drm-tip, no fb.
If I revert 73f15a9, it works.
If I then switch the two calls in vgdev_atomic_commit_tail, it doesn't
work again.

So the order apparently matters.

> This avoids me having to roll out dma-fence critical section
> annotations to this copy.
> 
> Signed-off-by: Daniel Vetter 
> Cc: David Airlie 
> Cc: Gerd Hoffmann 
> Cc: virtualizat...@lists.linux-foundation.org
> ---
>  drivers/gpu/drm/virtio/virtgpu_display.c | 20 
>  1 file changed, 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c 
> b/drivers/gpu/drm/virtio/virtgpu_display.c
> index f3ce49c5a34c..af55b334be2f 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_display.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_display.c
> @@ -314,25 +314,6 @@ virtio_gpu_user_framebuffer_create(struct drm_device 
> *dev,
>   return _gpu_fb->base;
>  }
>  
> -static void vgdev_atomic_commit_tail(struct drm_atomic_state *state)
> -{
> - struct drm_device *dev = state->dev;
> -
> - drm_atomic_helper_commit_modeset_disables(dev, state);
> - drm_atomic_helper_commit_modeset_enables(dev, state);
> - drm_atomic_helper_commit_planes(dev, state, 0);
> -
> - drm_atomic_helper_fake_vblank(state);
> - drm_atomic_helper_commit_hw_done(state);
> -
> - drm_atomic_helper_wait_for_vblanks(dev, state);
> - drm_atomic_helper_cleanup_planes(dev, state);
> -}
> -
> -static const struct drm_mode_config_helper_funcs virtio_mode_config_helpers 
> = {
> - .atomic_commit_tail = vgdev_atomic_commit_tail,
> -};
> -
>  static const struct drm_mode_config_funcs virtio_gpu_mode_funcs = {
>   .fb_create = virtio_gpu_user_framebuffer_create,
>   .atomic_check = drm_atomic_helper_check,
> @@ -346,7 +327,6 @@ void virtio_gpu_modeset_init(struct virtio_gpu_device 
> *vgdev)
>   drm_mode_config_init(vgdev->ddev);
>   vgdev->ddev->mode_config.quirk_addfb_prefer_host_byte_order = true;
>   vgdev->ddev->mode_config.funcs = _gpu_mode_funcs;
> - vgdev->ddev->mode_config.helper_private = _mode_config_helpers;
>  
>   /* modes will be validated against the framebuffer size */
>   vgdev->ddev->mode_config.min_width = XRES_MIN;
> 

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 3/8] newport_con: make module's init & exit static using module_driver

2020-08-18 Thread Jiri Slaby
The compiler complains that newport_console_init and
newport_console_exit are not declared:
   drivers/video/console/newport_con.c:745:12: warning: no previous prototype 
for 'newport_console_init'
   drivers/video/console/newport_con.c:750:13: warning: no previous prototype 
for 'newport_console_exit'

Here, it translates into: they should be marked static. Do so by
converting the simple un/registration to module_driver().

Signed-off-by: Jiri Slaby 
Cc: Bartlomiej Zolnierkiewicz 
Cc: dri-devel@lists.freedesktop.org
Cc: linux-fb...@vger.kernel.org
Cc: linux-m...@vger.kernel.org
---
 drivers/video/console/newport_con.c | 14 +-
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 4d9110393479..0d0989040c58 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -751,18 +751,6 @@ static struct gio_driver newport_driver = {
.probe = newport_probe,
.remove = newport_remove,
 };
-
-int __init newport_console_init(void)
-{
-   return gio_register_driver(_driver);
-}
-
-void __exit newport_console_exit(void)
-{
-   gio_unregister_driver(_driver);
-}
-
-module_init(newport_console_init);
-module_exit(newport_console_exit);
+module_driver(newport_driver, gio_register_driver, gio_unregister_driver);
 
 MODULE_LICENSE("GPL");
-- 
2.28.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/8] newport_con: fix no return statement in newport_show_logo

2020-08-18 Thread Jiri Slaby
When CONFIG_LOGO_SGI_CLUT224 is unset, newport_show_logo contains no
return, despite it should return a pointer. Add one returning NULL to
fix a compiler warning:
   drivers/video/console/newport_con.c: In function 'newport_show_logo':
   drivers/video/console/newport_con.c:132:1: warning: no return statement in 
function returning non-void

Note that the caller expects NULL from the function already.

Signed-off-by: Jiri Slaby 
Cc: Bartlomiej Zolnierkiewicz 
Cc: dri-devel@lists.freedesktop.org
Cc: linux-fb...@vger.kernel.org
Cc: linux-m...@vger.kernel.org
---
 drivers/video/console/newport_con.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/console/newport_con.c 
b/drivers/video/console/newport_con.c
index 72f146d047d9..4d9110393479 100644
--- a/drivers/video/console/newport_con.c
+++ b/drivers/video/console/newport_con.c
@@ -131,6 +131,8 @@ static const struct linux_logo *newport_show_logo(void)
npregs->go.hostrw0 = *data++ << 24;
 
return logo;
+#else
+   return NULL;
 #endif /* CONFIG_LOGO_SGI_CLUT224 */
 }
 
-- 
2.28.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: fix out of bounds write to the scrollback buffer

2020-08-03 Thread Jiri Slaby
Hi,

On 31. 07. 20, 7:22, 张云海 wrote:
> Remove whitespace at EOL

I am fine with the patch. However it should be sent properly (inline
mail, having a PATCH subject etc. -- see
Documentation/process/submitting-patches.rst). git send-email after git
format-patch handles most of it.

There is also question who is willing to take it?

Bart? Greg? Should we route it via akpm, or will you Linus directly? (I
can sign off and resend the patch which was attached to the mail I am
replying to too, if need be.)

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: Fix an out-of-bounds in vgacon_scrollback_update()

2020-07-30 Thread Jiri Slaby
Hi,

On 31. 07. 20, 5:23, Yang Yingliang wrote:
> void execute_one(void)
> {
>   intptr_t res = 0;
>   res = syz_open_dev(0xc, 4, 1);

open(/dev/tty1)

>   if (res != -1)
>   r[0] = res;
> *(uint16_t*)0x2000 = 0xc;
> *(uint16_t*)0x2002 = 0x373;
> *(uint16_t*)0x2004 = 0x1442;
>   syscall(__NR_ioctl, r[0], 0x5609ul, 0x2000ul);

VT_RESIZE(12, 883)

> memcpy((void*)0x20003500, "\x7f\x45\x4c\x46\x00\x00\x00...
>   syscall(__NR_write, r[0], 0x20003500ul, 0x381ul);

Write 381 bytes of some ELF to the tty.

OK, that's it. Thanks.

-- 
js
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: Fix an out-of-bounds in vgacon_scrollback_update()

2020-07-30 Thread Jiri Slaby
On 30. 07. 20, 15:24, Yang Yingliang wrote:
> 
> On 2020/7/30 19:04, Jiri Slaby wrote:
>> On 13. 07. 20, 12:57, Yang Yingliang wrote:
>>> I got a slab-out-of-bounds report when I doing fuzz test.
>>>
>>> [  334.989515]
>>> ==
>>> [  334.989577] BUG: KASAN: slab-out-of-bounds in
>>> vgacon_scroll+0x57a/0x8ed
>>> [  334.989588] Write of size 1766 at addr 8883de69ff3e by task
>>> test/2658
>>> [  334.989593]
>>> [  334.989608] CPU: 3 PID: 2658 Comm: test Not tainted
>>> 5.7.0-rc5-5-g152036d1379f #789
>>> [  334.989617] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
>>> BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
>>> [  334.989624] Call Trace:
>>> [  334.989646]  dump_stack+0xe4/0x14e
>>> [  334.989676]  print_address_description.constprop.5+0x3f/0x60
>>> [  334.989699]  ? vgacon_scroll+0x57a/0x8ed
>>> [  334.989710]  __kasan_report.cold.8+0x92/0xaf
>>> [  334.989735]  ? vgacon_scroll+0x57a/0x8ed
>>> [  334.989761]  kasan_report+0x37/0x50
>>> [  334.989789]  check_memory_region+0x1c1/0x1e0
>>> [  334.989806]  memcpy+0x38/0x60
>>> [  334.989824]  vgacon_scroll+0x57a/0x8ed
>>> [  334.989876]  con_scroll+0x4ef/0x5e0
>> ...
>>> Because vgacon_scrollback_cur->tail plus memcpy size is greater than
>>> vgacon_scrollback_cur->size. Fix this by checking the memcpy size.
>>>
>>> Reported-by: Hulk Robot 
>>> Signed-off-by: Yang Yingliang 
>>> ---
>>>   drivers/video/console/vgacon.c | 11 ---
>>>   1 file changed, 8 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/video/console/vgacon.c
>>> b/drivers/video/console/vgacon.c
>>> index 998b0de1812f..b51ffb9a208d 100644
>>> --- a/drivers/video/console/vgacon.c
>>> +++ b/drivers/video/console/vgacon.c
>>> @@ -243,6 +243,7 @@ static void vgacon_scrollback_startup(void)
>>>   static void vgacon_scrollback_update(struct vc_data *c, int t, int
>>> count)
>>>   {
>>>   void *p;
>>> +    int size;
>>>     if (!vgacon_scrollback_cur->data ||
>>> !vgacon_scrollback_cur->size ||
>>>   c->vc_num != fg_console)
>>> @@ -251,13 +252,17 @@ static void vgacon_scrollback_update(struct
>>> vc_data *c, int t, int count)
>>>   p = (void *) (c->vc_origin + t * c->vc_size_row);
>>>     while (count--) {
>>> +    size = vgacon_scrollback_cur->size -
>>> vgacon_scrollback_cur->tail;
>>> +    if (size > c->vc_size_row)
>>> +    size = c->vc_size_row;
>>> +
>>>   scr_memcpyw(vgacon_scrollback_cur->data +
>>>   vgacon_scrollback_cur->tail,
>>> -    p, c->vc_size_row);
>>> +    p, size);
>> Are you sure the consumer can handle split lines? As vgacon_scrolldelta
>> (soff in particular) looks to me like it doesn't.
>>
>> Have you tested you patch? I mean with soft scrollback on the vga
>> console?
> 
> I only test the patch with the reproduce program.

Out of curiosity, what is it doing? Resize and then scroll by \n (line
feed)? Can you share it?

thanks,
-- 
js
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: Fix an out-of-bounds in vgacon_scrollback_update()

2020-07-30 Thread Jiri Slaby
On 13. 07. 20, 12:57, Yang Yingliang wrote:
> I got a slab-out-of-bounds report when I doing fuzz test.
> 
> [  334.989515] 
> ==
> [  334.989577] BUG: KASAN: slab-out-of-bounds in vgacon_scroll+0x57a/0x8ed
> [  334.989588] Write of size 1766 at addr 8883de69ff3e by task test/2658
> [  334.989593]
> [  334.989608] CPU: 3 PID: 2658 Comm: test Not tainted 
> 5.7.0-rc5-5-g152036d1379f #789
> [  334.989617] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
> rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
> [  334.989624] Call Trace:
> [  334.989646]  dump_stack+0xe4/0x14e
> [  334.989676]  print_address_description.constprop.5+0x3f/0x60
> [  334.989699]  ? vgacon_scroll+0x57a/0x8ed
> [  334.989710]  __kasan_report.cold.8+0x92/0xaf
> [  334.989735]  ? vgacon_scroll+0x57a/0x8ed
> [  334.989761]  kasan_report+0x37/0x50
> [  334.989789]  check_memory_region+0x1c1/0x1e0
> [  334.989806]  memcpy+0x38/0x60
> [  334.989824]  vgacon_scroll+0x57a/0x8ed
> [  334.989876]  con_scroll+0x4ef/0x5e0
...
> Because vgacon_scrollback_cur->tail plus memcpy size is greater than
> vgacon_scrollback_cur->size. Fix this by checking the memcpy size.
> 
> Reported-by: Hulk Robot 
> Signed-off-by: Yang Yingliang 
> ---
>  drivers/video/console/vgacon.c | 11 ---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
> index 998b0de1812f..b51ffb9a208d 100644
> --- a/drivers/video/console/vgacon.c
> +++ b/drivers/video/console/vgacon.c
> @@ -243,6 +243,7 @@ static void vgacon_scrollback_startup(void)
>  static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
>  {
>   void *p;
> + int size;
>  
>   if (!vgacon_scrollback_cur->data || !vgacon_scrollback_cur->size ||
>   c->vc_num != fg_console)
> @@ -251,13 +252,17 @@ static void vgacon_scrollback_update(struct vc_data *c, 
> int t, int count)
>   p = (void *) (c->vc_origin + t * c->vc_size_row);
>  
>   while (count--) {
> + size = vgacon_scrollback_cur->size - 
> vgacon_scrollback_cur->tail;
> + if (size > c->vc_size_row)
> + size = c->vc_size_row;
> +
>   scr_memcpyw(vgacon_scrollback_cur->data +
>   vgacon_scrollback_cur->tail,
> - p, c->vc_size_row);
> + p, size);

Are you sure the consumer can handle split lines? As vgacon_scrolldelta
(soff in particular) looks to me like it doesn't.

Have you tested you patch? I mean with soft scrollback on the vga console?

>   vgacon_scrollback_cur->cnt++;
> - p += c->vc_size_row;
> - vgacon_scrollback_cur->tail += c->vc_size_row;
> + p += size;
> + vgacon_scrollback_cur->tail += size;
>  
>   if (vgacon_scrollback_cur->tail >= vgacon_scrollback_cur->size)
>   vgacon_scrollback_cur->tail = 0;
> 

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: fix out of bounds write to the scrollback buffer

2020-07-30 Thread Jiri Slaby
On 30. 07. 20, 8:46, Jiri Slaby wrote:
> Hi, OTOH, you should have CCed all the (public) lists.
> 
> On 30. 07. 20, 4:50, 张云海 wrote:
>> Zhang Xiao points out that the check should use > instead of >=,
>> otherwise the last line will be skip.
>> I agree with that, so I modify the patch.
>> Could you please verify that it is still correct and sufficient?
> 
> IMO, yes, correct -- I was thinking about this yesterday too. Just an
> example: hypothetically, if we had:
> size_row = 1
> tail = 29
> size = 30
> 
> data[29] would be the last accessible member. Writing to data + tail (as
> "29 + 1 > 30" doesn't hold, so the modified check would pass), i.e.
> data[29] is still OK. So yes, > is OK, >= would waste space and would be
> actually incorrect.
> 
>> BTW, Zhang Xiao also points out that the check after the memcpy can be
>> remove.
>> I also think that was right, but vgacon_scrollback_cur->tail may keep
>> the value vgacon_scrollback_cur->size in some case. That is not a
>> problem in vgacon_scrollback_update because of the check before the
>> memcpy. However, that may break some other code which assumes that
>> vgacon_scrollback_cur->tail won't be vgacon_scrollback_cur->size. I do
>> not know if there are such code, and if it is the code actually  should
>> check it too. But I still not remove the check in the patch to make sure
>> it won't breaks other code.
> 
> As I wrote about this yesterday:
> ===
> I am also not sure the test I was pointing out on the top of this
> message would be of any use after the change. But maybe leave the code
> rest in peace.
> ===
> 
> I would let it as is in this particular code. Especially because
> vgacon_scrolldelta takes ->tail into consideration and I was too lazy to
> study the code there. But if you are willing to study the code there and
> confirm the check is superfluous, feel free to remove it. Perhaps in a
> separate patch. I was actually testing with the check removed and didn't
> hit any issue (which means, in fact, exactly nothing).
> 
>> From ad143ede24ff4e61292cc9c96000100aacd97259 Mon Sep 17 00:00:00 2001
>> From: Yunhai Zhang 
>> Date: Tue, 28 Jul 2020 09:58:03 +0800
>> Subject: [PATCH] Fix for missing check in vgacon scrollback handling
>>
>> vgacon_scrollback_update() always left enbough room in the scrollback
> 
> "leaves enough"
> 
>> buffer for the next call, but if the console size changed that room
>> might not actually be enough, and so we need to re-check.
> 
> Also, could you add reasoning why you are adding the check to the loop
> and not outside (for instance, use your reasoning with numbers or CSI M
> as an example).
> 
> Could you add a sample output here, something like I had:
> ===
> This leads to random crashes or KASAN reports like:
> BUG: KASAN: slab-out-of-bounds in vgacon_scroll+0x57a/0x8ed
> ===
> 
> It's then easier to google for when this happens to someone who runs
> non-patched kernels.
> 
>> This fixes CVE-2020-14331.
>>
>> Reported-and-debugged-by: 张云海 
>> Reported-and-debugged-by: Yang Yingliang 
>> Reported-by: Kyungtae Kim 
>> Fixes: 15bdab959c9b ([PATCH] vgacon: Add support for soft scrollback)
>> Cc: Linus Torvalds 
>> Cc: Greg KH 
>> Cc: Solar Designer 
>> Cc: "Srivatsa S. Bhat" 
>> Cc: Anthony Liguori 
>> Cc: Yang Yingliang 
>> Cc: Bartlomiej Zolnierkiewicz 
> 
> Oh, and we should:
> Cc: sta...@vger.kernel.org
> 
>> Signed-off-by: Yunhai Zhang 
>> ---
>>  drivers/video/console/vgacon.c | 4 
>>  1 file changed, 4 insertions(+)
>>
>> diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
>> index 998b0de1812f..37b5711cd958 100644
>> --- a/drivers/video/console/vgacon.c
>> +++ b/drivers/video/console/vgacon.c
>> @@ -251,6 +251,10 @@ static void vgacon_scrollback_update(struct vc_data *c, 
>> int t, int count)
>>  p = (void *) (c->vc_origin + t * c->vc_size_row);
>>  
>>  while (count--) {
>> +if ((vgacon_scrollback_cur->tail + c->vc_size_row) > 

And git complains here:
.git/rebase-apply/patch:13: trailing whitespace.
if ((vgacon_scrollback_cur->tail + c->vc_size_row) >
warning: 1 line adds whitespace errors.

There is a space at the EOL.

>> +vgacon_scrollback_cur->size)
>> +vgacon_scrollback_cur->tail = 0;
>> +
>>  scr_memcpyw(vgacon_scrollback_cur->data +
>>  vgacon_scrollback_cur->tail,
>>  p, c->vc_size_row);
> 
> thanks,
> 


-- 
js
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: fix out of bounds write to the scrollback buffer

2020-07-30 Thread Jiri Slaby
Hi, OTOH, you should have CCed all the (public) lists.

On 30. 07. 20, 4:50, 张云海 wrote:
> Zhang Xiao points out that the check should use > instead of >=,
> otherwise the last line will be skip.
> I agree with that, so I modify the patch.
> Could you please verify that it is still correct and sufficient?

IMO, yes, correct -- I was thinking about this yesterday too. Just an
example: hypothetically, if we had:
size_row = 1
tail = 29
size = 30

data[29] would be the last accessible member. Writing to data + tail (as
"29 + 1 > 30" doesn't hold, so the modified check would pass), i.e.
data[29] is still OK. So yes, > is OK, >= would waste space and would be
actually incorrect.

> BTW, Zhang Xiao also points out that the check after the memcpy can be
> remove.
> I also think that was right, but vgacon_scrollback_cur->tail may keep
> the value vgacon_scrollback_cur->size in some case. That is not a
> problem in vgacon_scrollback_update because of the check before the
> memcpy. However, that may break some other code which assumes that
> vgacon_scrollback_cur->tail won't be vgacon_scrollback_cur->size. I do
> not know if there are such code, and if it is the code actually  should
> check it too. But I still not remove the check in the patch to make sure
> it won't breaks other code.

As I wrote about this yesterday:
===
I am also not sure the test I was pointing out on the top of this
message would be of any use after the change. But maybe leave the code
rest in peace.
===

I would let it as is in this particular code. Especially because
vgacon_scrolldelta takes ->tail into consideration and I was too lazy to
study the code there. But if you are willing to study the code there and
confirm the check is superfluous, feel free to remove it. Perhaps in a
separate patch. I was actually testing with the check removed and didn't
hit any issue (which means, in fact, exactly nothing).

> From ad143ede24ff4e61292cc9c96000100aacd97259 Mon Sep 17 00:00:00 2001
> From: Yunhai Zhang 
> Date: Tue, 28 Jul 2020 09:58:03 +0800
> Subject: [PATCH] Fix for missing check in vgacon scrollback handling
> 
> vgacon_scrollback_update() always left enbough room in the scrollback

"leaves enough"

> buffer for the next call, but if the console size changed that room
> might not actually be enough, and so we need to re-check.

Also, could you add reasoning why you are adding the check to the loop
and not outside (for instance, use your reasoning with numbers or CSI M
as an example).

Could you add a sample output here, something like I had:
===
This leads to random crashes or KASAN reports like:
BUG: KASAN: slab-out-of-bounds in vgacon_scroll+0x57a/0x8ed
===

It's then easier to google for when this happens to someone who runs
non-patched kernels.

> This fixes CVE-2020-14331.
> 
> Reported-and-debugged-by: 张云海 
> Reported-and-debugged-by: Yang Yingliang 
> Reported-by: Kyungtae Kim 
> Fixes: 15bdab959c9b ([PATCH] vgacon: Add support for soft scrollback)
> Cc: Linus Torvalds 
> Cc: Greg KH 
> Cc: Solar Designer 
> Cc: "Srivatsa S. Bhat" 
> Cc: Anthony Liguori 
> Cc: Yang Yingliang 
> Cc: Bartlomiej Zolnierkiewicz 

Oh, and we should:
Cc: sta...@vger.kernel.org

> Signed-off-by: Yunhai Zhang 
> ---
>  drivers/video/console/vgacon.c | 4 
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
> index 998b0de1812f..37b5711cd958 100644
> --- a/drivers/video/console/vgacon.c
> +++ b/drivers/video/console/vgacon.c
> @@ -251,6 +251,10 @@ static void vgacon_scrollback_update(struct vc_data *c, 
> int t, int count)
>   p = (void *) (c->vc_origin + t * c->vc_size_row);
>  
>   while (count--) {
> + if ((vgacon_scrollback_cur->tail + c->vc_size_row) > 
> + vgacon_scrollback_cur->size)
> + vgacon_scrollback_cur->tail = 0;
> +
>   scr_memcpyw(vgacon_scrollback_cur->data +
>   vgacon_scrollback_cur->tail,
>   p, c->vc_size_row);

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: fix out of bounds write to the scrollback buffer

2020-07-29 Thread Jiri Slaby
On 29. 07. 20, 10:19, 张云海 wrote:
> On 2020/7/29 16:11, Jiri Slaby wrote:
>> But the loop checks for the overflow:
>>   if (vgacon_scrollback_cur->tail >= vgacon_scrollback_cur->size)
>> vgacon_scrollback_cur->tail = 0;
>>
>> So the first 2 iterations would write to the end of the buffer and this
>> 3rd one should have zeroed ->tail.
> 
> In the 2nd  iteration before the check:
> vgacon_scrollback_cur->tail is 65360 which is still less then
> vgacon_scrollback_cur->size(65440), so the ->tail won't be zeroed.
> 
> Then it gose to the 3rd  iteration, overflow occurs.

Ahh, I see now! So it must be triggered by CSI M instead. It allows for
more than 1 in count. So this is PoC for this case:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char** argv)
{
int fd = open("/dev/tty1", O_RDWR);
unsigned short size[3] = {25, 200, 0};
ioctl(fd, 0x5609, size); // VT_RESIZE

write(fd, "\e[1;1H", 6);
for (int i = 0; i < 30; i++)
write(fd, "\e[10M", 5);
}

It corrupts memory, so it crashes the kernel randomly. Even with my
before-loop patch.

So now: could you resend your patch with improved commit message, add
all those Ccs etc.? You can copy most of the Ccs from my patch verbatim.

I am also not sure the test I was pointing out on the top of this
message would be of any use after the change. But maybe leave the code
rest in peace.

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] vgacon: fix out of bounds write to the scrollback buffer

2020-07-29 Thread Jiri Slaby
Hi,

On 29. 07. 20, 9:53, 张云海 wrote:
> This patch dosen't fix the issue, the check should be in the loop.
> 
> The change of the VT sze is before vgacon_scrollback_update, not in the
> meantime.
> 
> Let's consider the following situation:
>   suppose:
>   vgacon_scrollback_cur->size is 65440
>   vgacon_scrollback_cur->tail is 64960
>   c->vc_size_row is 160
>   count is 5
>   
>   Reset c->vc_size_row to 200 by VT_RESIZE, then call
> vgacon_scrollback_update.
>   
>   This will pass the check, since (vgacon_scrollback_cur->tail +
> c->vc_size_row)
>   is 65160 which is less then vgacon_scrollback_cur->size(65440).
> 
>   However, in the 3rd iteration of the loop, vgacon_scrollback_cur->tail
> is update
>   to 65360, the memcpy will overflow.

But the loop checks for the overflow:
  if (vgacon_scrollback_cur->tail >= vgacon_scrollback_cur->size)
vgacon_scrollback_cur->tail = 0;

So the first 2 iterations would write to the end of the buffer and this
3rd one should have zeroed ->tail.

thanks,
-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] vgacon: fix out of bounds write to the scrollback buffer

2020-07-29 Thread Jiri Slaby
The current vgacon's scroll up implementation uses a circural buffer
in vgacon_scrollback_cur. It always advances tail to prepare it for the
next write and caps it to zero if the next ->vc_size_row bytes won't fit.

But when we change the VT size (e.g. by VT_RESIZE) in the meantime, the new
line might not fit to the end of the scrollback buffer in the next
attempt to scroll. This leads to various crashes as
vgacon_scrollback_update writes out of the buffer:
 BUG: unable to handle page fault for address: c91752a0
 #PF: supervisor write access in kernel mode
 #PF: error_code(0x0002) - not-present page
 RIP: 0010:mutex_unlock+0x13/0x30
...
 Call Trace:
  n_tty_write+0x1a0/0x4d0
  tty_write+0x1a0/0x2e0

Or to KASAN reports:
BUG: KASAN: slab-out-of-bounds in vgacon_scroll+0x57a/0x8ed

So check whether the line fits in the buffer and wrap if needed. Do it
before the loop as console_sem is held and ->vc_size_row cannot change
during the execution of vgacon_scrollback_cur. If it does change, we
need to ensure it does not change elsewhere, not here.

Also, we do not split the write of a line into chunks as that would
break the consumers of the buffer. They expect ->cnt, ->tail and ->size
to be in harmony and advanced by ->vc_size_row.

I found few reports of this in the past, some with patches included,
some even 2 years old:
https://lore.kernel.org/lkml/CAEAjamsJnG-=TSOwgRbbb3B9Z-PA63oWmNPoKYWQ=Z=+x49...@mail.gmail.com/
https://lore.kernel.org/lkml/1589336932-35508-1-git-send-email-yangyingli...@huawei.com/

This fixes CVE-2020-14331.

Big thanks to guys mentioned in the Reported-and-debugged-by lines below
who actually found the root cause.

Signed-off-by: Jiri Slaby 
Reported-and-debugged-by: 张云海 
Reported-and-debugged-by: Yang Yingliang 
Reported-by: Kyungtae Kim 
Fixes: 15bdab959c9b ([PATCH] vgacon: Add support for soft scrollback)
Cc: Linus Torvalds 
Cc: Greg KH 
Cc: Solar Designer 
Cc: "Srivatsa S. Bhat" 
Cc: Anthony Liguori 
Cc: Security Officers 
Cc: linux-dist...@vs.openwall.org
Cc: Yang Yingliang 
Cc: Bartlomiej Zolnierkiewicz 
Cc: dri-devel@lists.freedesktop.org
Cc: linux-fb...@vger.kernel.org
---
 drivers/video/console/vgacon.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index f0f3d573f848..13194bb246f8 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -250,6 +250,11 @@ static void vgacon_scrollback_update(struct vc_data *c, 
int t, int count)
 
p = (void *) (c->vc_origin + t * c->vc_size_row);
 
+   /* vc_size_row might have changed by VT_RESIZE in the meantime */
+   if ((vgacon_scrollback_cur->tail + c->vc_size_row) >=
+   vgacon_scrollback_cur->size)
+   vgacon_scrollback_cur->tail = 0;
+
while (count--) {
scr_memcpyw(vgacon_scrollback_cur->data +
vgacon_scrollback_cur->tail,
-- 
2.28.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH -next] vc: Fix build errors

2020-07-25 Thread Jiri Slaby
On 25. 07. 20, 9:47, Ming Li wrote:
> Build errors are seen on MIPS platforms because of
> vc state separation and the following build erros
> were reported.

Thanks, but already fixed:
https://lore.kernel.org/dri-devel/20200724062735.18229-1-jsl...@suse.cz/

-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] newport_con: vc_color is now in state

2020-07-24 Thread Jiri Slaby
On 24. 07. 20, 11:30, Sergei Shtylyov wrote:
> On 24.07.2020 9:27, Jiri Slaby wrote:
> 
>> Since commit 28bc24fc46f9 (vc: separate state), vc->vc_color is known as
> 
>    Cgit says "Bad object id: 28bc24fc46f9" (in Linus' repo).

That's because it's not in Linus' repo yet.

-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] newport_con: vc_color is now in state

2020-07-24 Thread Jiri Slaby
On 24. 07. 20, 9:58, Greg KH wrote:
> On Fri, Jul 24, 2020 at 08:27:35AM +0200, Jiri Slaby wrote:
>> Since commit 28bc24fc46f9 (vc: separate state), vc->vc_color is known as
>> vc->state.color. Somehow both me and 0-day bot missed this driver during
>> the conversion.
>>
>> So fix the driver now.
>>
>> Signed-off-by: Jiri Slaby 
>> Cc: Bartlomiej Zolnierkiewicz 
>> Cc: dri-devel@lists.freedesktop.org
>> Cc: linux-fb...@vger.kernel.org
>> Cc: linux-m...@vger.kernel.org
>> ---
>>  drivers/video/console/newport_con.c | 10 +-
>>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> You forgot the "Reported-by:" line :(

Ah, I didn't know/notice. Will do next time. Thanks.


-- 
js
suse labs
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


  1   2   3   >