summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorjdolecek <jdolecek@NetBSD.org>2020-05-30 14:15:43 +0000
committerjdolecek <jdolecek@NetBSD.org>2020-05-30 14:15:43 +0000
commitd55d7363d157579703f596ebb980cb1529c19609 (patch)
tree11fce37717d89fc87e38c3c7585c24315aa2ac66 /sys/dev
parentdcb15819e35e48009ca0cf1ab6c9e97121a6d9c3 (diff)
reduce stack usage in genfb_calc_hsize()
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/wsfb/genfb.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/dev/wsfb/genfb.c b/sys/dev/wsfb/genfb.c
index 3f03706f075..58187eaaab6 100644
--- a/sys/dev/wsfb/genfb.c
+++ b/sys/dev/wsfb/genfb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: genfb.c,v 1.72 2020/04/13 15:26:57 msaitoh Exp $ */
+/* $NetBSD: genfb.c,v 1.73 2020/05/30 14:15:43 jdolecek Exp $ */
/*-
* Copyright (c) 2007 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.72 2020/04/13 15:26:57 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.73 2020/05/30 14:15:43 jdolecek Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -632,18 +632,25 @@ genfb_calc_hsize(struct genfb_softc *sc)
device_t dev = sc->sc_dev;
prop_dictionary_t dict = device_properties(dev);
prop_data_t edid_data;
- struct edid_info edid;
+ struct edid_info *edid;
const char *edid_ptr;
+ int hsize;
edid_data = prop_dictionary_get(dict, "EDID");
if (edid_data == NULL || prop_data_size(edid_data) < 128)
return 0;
+ edid = kmem_alloc(sizeof(*edid), KM_SLEEP);
+
edid_ptr = prop_data_data_nocopy(edid_data);
- if (edid_parse(__UNCONST(edid_ptr), &edid) != 0)
- return 0;
+ if (edid_parse(__UNCONST(edid_ptr), edid) == 0)
+ hsize = (int)edid->edid_max_hsize * 10;
+ else
+ hsize = 0;
+
+ kmem_free(edid, sizeof(*edid));
- return (int)edid.edid_max_hsize * 10;
+ return hsize;
}
/* Return the minimum number of character columns based on DPI */