Module Name: src
Committed By: mlelstv
Date: Sun Oct 20 13:49:41 UTC 2024
Modified Files:
src/sbin/wsconsctl: display.c
Log Message:
Handle EDID data larger than 256 bytes.
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sbin/wsconsctl/display.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/wsconsctl/display.c
diff -u src/sbin/wsconsctl/display.c:1.18 src/sbin/wsconsctl/display.c:1.19
--- src/sbin/wsconsctl/display.c:1.18 Sun Oct 20 13:44:37 2024
+++ src/sbin/wsconsctl/display.c Sun Oct 20 13:49:41 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: display.c,v 1.18 2024/10/20 13:44:37 mlelstv Exp $ */
+/* $NetBSD: display.c,v 1.19 2024/10/20 13:49:41 mlelstv Exp $ */
/*-
* Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
@@ -52,7 +52,6 @@ static struct wsdisplay_param brightness
static struct wsdisplay_param contrast;
static struct wsdisplay_scroll_data scroll_l;
static struct wsdisplayio_edid_info edid_info;
-static uint8_t edid_buf[256];
static int msg_default_attrs, msg_default_bg, msg_default_fg;
static int msg_kernel_attrs, msg_kernel_bg, msg_kernel_fg;
static int splash_enable, splash_progress;
@@ -80,6 +79,32 @@ struct field display_field_tab[] = {
int display_field_tab_len = sizeof(display_field_tab) /
sizeof(display_field_tab[0]);
+static int
+display_get_edid(int fd, struct wsdisplayio_edid_info *ei)
+{
+ size_t sz = 256;
+ int res;
+
+ while (sz <= 65536) {
+ ei->buffer_size = sz;
+ ei->edid_data = malloc(sz);
+ if (ei->edid_data == NULL) {
+ res = -1;
+ break;
+ }
+
+ res = ioctl(fd, WSDISPLAYIO_GET_EDID, ei);
+ if (res == 0 || errno != EAGAIN)
+ break;
+
+ free(ei->edid_data);
+ ei->edid_data = NULL;
+ sz *= 2;
+ }
+
+ return res;
+}
+
void
display_get_values(int fd)
{
@@ -158,11 +183,8 @@ display_get_values(int fd)
}
if (field_by_value(&edid_info)->flags & FLG_GET) {
- edid_info.edid_data = edid_buf;
- edid_info.buffer_size = sizeof(edid_buf);
- if (ioctl(fd, WSDISPLAYIO_GET_EDID, &edid_info) < 0) {
+ if (display_get_edid(fd, &edid_info) < 0)
field_disable_by_value(&edid_info);
- }
}
}