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