Module Name:    src
Committed By:   jmcneill
Date:           Wed Jul  8 01:23:28 UTC 2015

Modified Files:
        src/sys/arch/arm/nvidia: tegra_dc.c tegra_hdmi.c tegra_var.h

Log Message:
expose EDID to userland


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/nvidia/tegra_dc.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/nvidia/tegra_hdmi.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/arm/nvidia/tegra_var.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/nvidia/tegra_dc.c
diff -u src/sys/arch/arm/nvidia/tegra_dc.c:1.1 src/sys/arch/arm/nvidia/tegra_dc.c:1.2
--- src/sys/arch/arm/nvidia/tegra_dc.c:1.1	Mon May 18 19:32:48 2015
+++ src/sys/arch/arm/nvidia/tegra_dc.c	Wed Jul  8 01:23:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_dc.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */
+/* $NetBSD: tegra_dc.c,v 1.2 2015/07/08 01:23:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "locators.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_dc.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_dc.c,v 1.2 2015/07/08 01:23:28 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -296,7 +296,7 @@ tegra_dc_port(device_t dev)
 
 int
 tegra_dc_enable(device_t dev, device_t outputdev,
-    const struct videomode *mode)
+    const struct videomode *mode, const uint8_t *edid)
 {
 	struct tegra_dc_softc * const sc = device_private(dev);
 	prop_dictionary_t prop = device_properties(dev);
@@ -339,6 +339,13 @@ tegra_dc_enable(device_t dev, device_t o
 
 	sc->sc_fbdev = config_found(sc->sc_dev, &tfb, tegra_dc_print);
 
+	if (sc->sc_fbdev != NULL && edid != NULL) {
+		prop_data_t data = prop_data_create_data(edid, 128);
+		prop_dictionary_set(device_properties(sc->sc_fbdev),
+		    "EDID", data);
+		prop_object_release(data);
+	}
+
 	return 0;
 }
 

Index: src/sys/arch/arm/nvidia/tegra_hdmi.c
diff -u src/sys/arch/arm/nvidia/tegra_hdmi.c:1.2 src/sys/arch/arm/nvidia/tegra_hdmi.c:1.3
--- src/sys/arch/arm/nvidia/tegra_hdmi.c:1.2	Mon May 18 21:03:36 2015
+++ src/sys/arch/arm/nvidia/tegra_hdmi.c	Wed Jul  8 01:23:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_hdmi.c,v 1.2 2015/05/18 21:03:36 jmcneill Exp $ */
+/* $NetBSD: tegra_hdmi.c,v 1.3 2015/07/08 01:23:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "locators.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_hdmi.c,v 1.2 2015/05/18 21:03:36 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_hdmi.c,v 1.3 2015/07/08 01:23:28 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -92,7 +92,7 @@ struct tegra_hdmi_softc {
 static void	tegra_hdmi_hpd(struct tegra_hdmi_softc *);
 static void	tegra_hdmi_connect(struct tegra_hdmi_softc *);
 static void	tegra_hdmi_disconnect(struct tegra_hdmi_softc *);
-static void	tegra_hdmi_enable(struct tegra_hdmi_softc *);
+static void	tegra_hdmi_enable(struct tegra_hdmi_softc *, const uint8_t *);
 static int	tegra_hdmi_sor_start(struct tegra_hdmi_softc *);
 
 CFATTACH_DECL_NEW(tegra_hdmi, sizeof(struct tegra_hdmi_softc),
@@ -190,13 +190,14 @@ static void
 tegra_hdmi_connect(struct tegra_hdmi_softc *sc)
 {
 	const struct videomode *mode;
-	char edid[128];
+	char edid[128], *pedid = NULL;
 	struct edid_info ei;
 	int retry = 4, error;
 
+	memset(&ei, 0, sizeof(ei));
+
 	if (sc->sc_ddcdev) {
 		memset(edid, 0, sizeof(edid));
-		memset(&ei, 0, sizeof(ei));
 
 		while (--retry > 0) {
 			error = ddc_dev_read_edid(sc->sc_ddcdev, edid,
@@ -212,10 +213,11 @@ tegra_hdmi_connect(struct tegra_hdmi_sof
 			if (edid_parse(edid, &ei) != 0) {
 				device_printf(sc->sc_dev,
 				    "failed to parse EDID\n");
-#ifdef TEGRA_HDMI_DEBUG
 			} else {
+#ifdef TEGRA_HDMI_DEBUG
 				edid_print(&ei);
 #endif
+				pedid = edid;
 			}
 		}
 	}
@@ -226,7 +228,7 @@ tegra_hdmi_connect(struct tegra_hdmi_sof
 	}
 
 	sc->sc_curmode = mode;
-	tegra_hdmi_enable(sc);
+	tegra_hdmi_enable(sc, pedid);
 }
 
 static void
@@ -235,7 +237,7 @@ tegra_hdmi_disconnect(struct tegra_hdmi_
 }
 
 static void
-tegra_hdmi_enable(struct tegra_hdmi_softc *sc)
+tegra_hdmi_enable(struct tegra_hdmi_softc *sc, const uint8_t *edid)
 {
 	const struct tegra_hdmi_tmds_config *tmds = NULL;
 	const struct videomode *mode = sc->sc_curmode;
@@ -266,7 +268,7 @@ tegra_hdmi_enable(struct tegra_hdmi_soft
 		    tmds->sor_pad_ctls0);
 	}
 
-	tegra_dc_enable(sc->sc_displaydev, sc->sc_dev, mode);
+	tegra_dc_enable(sc->sc_displaydev, sc->sc_dev, mode, edid);
 
 	const u_int div = (mode->dot_clock / 1000) * 4;
 	HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_REFCLK_REG,

Index: src/sys/arch/arm/nvidia/tegra_var.h
diff -u src/sys/arch/arm/nvidia/tegra_var.h:1.21 src/sys/arch/arm/nvidia/tegra_var.h:1.22
--- src/sys/arch/arm/nvidia/tegra_var.h:1.21	Sun May 31 14:41:59 2015
+++ src/sys/arch/arm/nvidia/tegra_var.h	Wed Jul  8 01:23:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_var.h,v 1.21 2015/05/31 14:41:59 jmcneill Exp $ */
+/* $NetBSD: tegra_var.h,v 1.22 2015/07/08 01:23:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -148,7 +148,8 @@ void	tegra_xusbpad_sata_enable(void);
 
 struct videomode;
 int	tegra_dc_port(device_t);
-int	tegra_dc_enable(device_t, device_t, const struct videomode *);
+int	tegra_dc_enable(device_t, device_t, const struct videomode *,
+			const uint8_t *);
 void	tegra_dc_hdmi_start(device_t);
 
 #define TEGRA_CPUFREQ_MAX	16

Reply via email to