Module Name: src Committed By: jmcneill Date: Thu Jul 23 14:31:05 UTC 2015
Modified Files: src/sys/arch/arm/nvidia: tegra_dc.c tegra_dcreg.h tegra_genfb.c tegra_hdmi.c tegra_hdmireg.h Log Message: add Tegra124 HDMI support To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/nvidia/tegra_dc.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/nvidia/tegra_dcreg.h \ src/sys/arch/arm/nvidia/tegra_genfb.c \ src/sys/arch/arm/nvidia/tegra_hdmireg.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_hdmi.c 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.2 src/sys/arch/arm/nvidia/tegra_dc.c:1.3 --- src/sys/arch/arm/nvidia/tegra_dc.c:1.2 Wed Jul 8 01:23:28 2015 +++ src/sys/arch/arm/nvidia/tegra_dc.c Thu Jul 23 14:31:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_dc.c,v 1.2 2015/07/08 01:23:28 jmcneill Exp $ */ +/* $NetBSD: tegra_dc.c,v 1.3 2015/07/23 14:31:05 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.2 2015/07/08 01:23:28 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_dc.c,v 1.3 2015/07/23 14:31:05 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -46,7 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_dc.c,v #define TEGRA_DC_NPORTS 2 #define TEGRA_DC_DEPTH 32 -#define TEGRA_DC_FBALIGN 16 +#define TEGRA_DC_FBALIGN PAGE_SIZE static int tegra_dc_match(device_t, cfdata_t, void *); static void tegra_dc_attach(device_t, device_t, void *); @@ -145,6 +145,8 @@ tegra_dc_allocmem(struct tegra_dc_softc sc->sc_dmasize = size; + memset(sc->sc_dmap, 0, size); + return 0; destroy: @@ -185,6 +187,10 @@ tegra_dc_init(struct tegra_dc_softc *sc, static void tegra_dc_init_win(struct tegra_dc_softc *sc, const struct videomode *mode) { + /* Write access control */ + DC_WRITE(sc, DC_CMD_STATE_ACCESS_REG, + DC_CMD_STATE_ACCESS_WRITE_MUX | DC_CMD_STATE_ACCESS_READ_MUX); + /* Enable window A programming */ DC_WRITE(sc, DC_CMD_DISPLAY_WINDOW_HEADER_REG, DC_CMD_DISPLAY_WINDOW_HEADER_WINDOW_A_SELECT); @@ -199,6 +205,11 @@ tegra_dc_init_win(struct tegra_dc_softc __SHIFTIN(DC_WINC_A_BYTE_SWAP_SWAP_NOSWAP, DC_WINC_A_BYTE_SWAP_SWAP)); + /* Initial DDA */ + DC_WRITE(sc, DC_WINC_A_H_INITIAL_DDA_REG, 0); + DC_WRITE(sc, DC_WINC_A_V_INITIAL_DDA_REG, 0); + DC_WRITE(sc, DC_WINC_A_DDA_INCREMENT_REG, 0x10001000); + /* Window position, size, stride */ DC_WRITE(sc, DC_WINC_A_POSITION_REG, __SHIFTIN(0, DC_WINC_A_POSITION_V) | @@ -218,6 +229,10 @@ tegra_dc_init_win(struct tegra_dc_softc DC_WRITE(sc, DC_WINBUF_A_START_ADDR_REG, (uint32_t)sc->sc_dmamap->dm_segs[0].ds_addr); + /* Offsets */ + DC_WRITE(sc, DC_WINBUF_A_ADDR_H_OFFSET_REG, 0); + DC_WRITE(sc, DC_WINBUF_A_ADDR_V_OFFSET_REG, 0); + /* Surface kind */ DC_WRITE(sc, DC_WINBUF_A_SURFACE_KIND_REG, __SHIFTIN(DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND_PITCH, @@ -232,14 +247,35 @@ static void tegra_dc_init_disp(struct tegra_dc_softc *sc, const struct videomode *mode) { const u_int hspw = mode->hsync_end - mode->hsync_start; - const u_int hbp = mode->htotal - mode->hsync_start; + const u_int hbp = mode->htotal - mode->hsync_end; const u_int hfp = mode->hsync_start - mode->hdisplay; const u_int vspw = mode->vsync_end - mode->vsync_start; - const u_int vbp = mode->vtotal - mode->vsync_start; + const u_int vbp = mode->vtotal - mode->vsync_end; const u_int vfp = mode->vsync_start - mode->vdisplay; + DC_WRITE(sc, DC_DISP_DISP_TIMING_OPTIONS_REG, + __SHIFTIN(1, DC_DISP_DISP_TIMING_OPTIONS_VSYNC_POS)); + DC_WRITE(sc, DC_DISP_DISP_COLOR_CONTROL_REG, + __SHIFTIN(DC_DISP_DISP_COLOR_CONTROL_BASE_COLOR_SIZE_888, + DC_DISP_DISP_COLOR_CONTROL_BASE_COLOR_SIZE)); + DC_WRITE(sc, DC_DISP_DISP_SIGNAL_OPTIONS0_REG, + DC_DISP_DISP_SIGNAL_OPTIONS0_H_PULSE2_ENABLE); + DC_WRITE(sc, DC_DISP_H_PULSE2_CONTROL_REG, + __SHIFTIN(DC_DISP_H_PULSE2_CONTROL_V_QUAL_VACTIVE, + DC_DISP_H_PULSE2_CONTROL_V_QUAL) | + __SHIFTIN(DC_DISP_H_PULSE2_CONTROL_LAST_END_A, + DC_DISP_H_PULSE2_CONTROL_LAST)); + + u_int pulse_start = 1 + hspw + hbp - 10; + DC_WRITE(sc, DC_DISP_H_PULSE2_POSITION_A_REG, + __SHIFTIN(pulse_start, DC_DISP_H_PULSE2_POSITION_A_START) | + __SHIFTIN(pulse_start + 8, DC_DISP_H_PULSE2_POSITION_A_END)); + /* Pixel clock */ - DC_WRITE(sc, DC_DISP_DISP_CLOCK_CONTROL_REG, 0); + const u_int div = (tegra_car_plld2_rate() * 2) / (mode->dot_clock * 1000) - 2; + DC_WRITE(sc, DC_DISP_DISP_CLOCK_CONTROL_REG, + __SHIFTIN(0, DC_DISP_DISP_CLOCK_CONTROL_PIXEL_CLK_DIVIDER) | + __SHIFTIN(div, DC_DISP_DISP_CLOCK_CONTROL_SHIFT_CLK_DIVIDER)); /* Mode timings */ DC_WRITE(sc, DC_DISP_REF_TO_SYNC_REG, @@ -259,10 +295,9 @@ tegra_dc_init_disp(struct tegra_dc_softc __SHIFTIN(mode->hdisplay, DC_DISP_DISP_ACTIVE_H)); /* Enable continus display mode */ - DC_SET_CLEAR(sc, DC_CMD_DISPLAY_COMMAND_REG, + DC_WRITE(sc, DC_CMD_DISPLAY_COMMAND_REG, __SHIFTIN(DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE_C_DISPLAY, - DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE), - DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE); + DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE)); /* Enable power */ DC_SET_CLEAR(sc, DC_CMD_DISPLAY_POWER_CONTROL_REG, @@ -281,9 +316,9 @@ tegra_dc_update(struct tegra_dc_softc *s { /* Commit settings */ DC_WRITE(sc, DC_CMD_STATE_CONTROL_REG, - DC_CMD_STATE_CONTROL_GENERAL_UPDATE); + DC_CMD_STATE_CONTROL_GENERAL_UPDATE | DC_CMD_STATE_CONTROL_WIN_A_UPDATE); DC_WRITE(sc, DC_CMD_STATE_CONTROL_REG, - DC_CMD_STATE_CONTROL_GENERAL_ACT_REQ); + DC_CMD_STATE_CONTROL_GENERAL_ACT_REQ | DC_CMD_STATE_CONTROL_WIN_A_ACT_REQ); } int @@ -309,7 +344,7 @@ tegra_dc_enable(device_t dev, device_t o const uint32_t depth = TEGRA_DC_DEPTH; const uint32_t fbsize = mode->vdisplay * mode->hdisplay * (depth / 8); - const bus_size_t dmasize = (fbsize + 3) & ~3; + const bus_size_t dmasize = (fbsize + PAGE_MASK) & ~PAGE_MASK; error = tegra_dc_allocmem(sc, dmasize); if (error) { aprint_error_dev(dev, Index: src/sys/arch/arm/nvidia/tegra_dcreg.h diff -u src/sys/arch/arm/nvidia/tegra_dcreg.h:1.1 src/sys/arch/arm/nvidia/tegra_dcreg.h:1.2 --- src/sys/arch/arm/nvidia/tegra_dcreg.h:1.1 Mon May 18 19:32:48 2015 +++ src/sys/arch/arm/nvidia/tegra_dcreg.h Thu Jul 23 14:31:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_dcreg.h,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */ +/* $NetBSD: tegra_dcreg.h,v 1.2 2015/07/23 14:31:05 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -78,7 +78,10 @@ #define DC_CMD_SIGNAL_RAISE1_REG 0x0f0 #define DC_CMD_SIGNAL_RAISE2_REG 0x0f4 #define DC_CMD_SIGNAL_RAISE3_REG 0x0f8 + #define DC_CMD_STATE_ACCESS_REG 0x100 +#define DC_CMD_STATE_ACCESS_WRITE_MUX __BIT(2) +#define DC_CMD_STATE_ACCESS_READ_MUX __BIT(0) #define DC_CMD_STATE_CONTROL_REG 0x104 #define DC_CMD_STATE_CONTROL_NC_HOST_TRIG_ENABLE __BIT(24) @@ -136,6 +139,7 @@ * Display DISP registers */ #define DC_DISP_DISP_SIGNAL_OPTIONS0_REG 0x1000 +#define DC_DISP_DISP_SIGNAL_OPTIONS0_H_PULSE2_ENABLE __BIT(12) #define DC_DISP_DISP_WIN_OPTIONS_REG 0x1008 #define DC_DISP_DISP_WIN_OPTIONS_HDMI_ENABLE __BIT(30) @@ -144,6 +148,7 @@ #define DC_DISP_DISP_WIN_OPTIONS_CURSOR_ENABLE __BIT(16) #define DC_DISP_DISP_TIMING_OPTIONS_REG 0x1014 +#define DC_DISP_DISP_TIMING_OPTIONS_VSYNC_POS __BITS(11,0) #define DC_DISP_REF_TO_SYNC_REG 0x1018 #define DC_DISP_REF_TO_SYNC_V __BITS(28,16) @@ -175,8 +180,19 @@ #define DC_DISP_H_PULSE1_POSITION_B_REG 0x1048 #define DC_DISP_H_PULSE1_POSITION_C_REG 0x104c #define DC_DISP_H_PULSE1_POSITION_D_REG 0x1050 + #define DC_DISP_H_PULSE2_CONTROL_REG 0x1054 +#define DC_DISP_H_PULSE2_CONTROL_LAST __BITS(11,8) +#define DC_DISP_H_PULSE2_CONTROL_LAST_END_A 1 +#define DC_DISP_H_PULSE2_CONTROL_V_QUAL __BITS(7,6) +#define DC_DISP_H_PULSE2_CONTROL_V_QUAL_VACTIVE 2 +#define DC_DISP_H_PULSE2_CONTROL_POLARITY __BIT(4) +#define DC_DISP_H_PULSE2_CONTROL_MODE __BIT(3) + #define DC_DISP_H_PULSE2_POSITION_A_REG 0x1058 +#define DC_DISP_H_PULSE2_POSITION_A_END __BITS(28,16) +#define DC_DISP_H_PULSE2_POSITION_A_START __BITS(12,0) + #define DC_DISP_H_PULSE2_POSITION_B_REG 0x105c #define DC_DISP_H_PULSE2_POSITION_C_REG 0x1060 #define DC_DISP_H_PULSE2_POSITION_D_REG 0x1064 @@ -192,9 +208,17 @@ #define DC_DISP_V_PULSE2_POSITION_A_REG 0x108c #define DC_DISP_V_PULSE3_CONTROL_REG 0x1090 #define DC_DISP_V_PULSE3_POSITION_A_REG 0x1094 + #define DC_DISP_DISP_CLOCK_CONTROL_REG 0x10b8 +#define DC_DISP_DISP_CLOCK_CONTROL_PIXEL_CLK_DIVIDER __BITS(11,8) +#define DC_DISP_DISP_CLOCK_CONTROL_SHIFT_CLK_DIVIDER __BITS(7,0) + #define DC_DISP_DISP_INTERFACE_CONTROL_REG 0x10bc + #define DC_DISP_DISP_COLOR_CONTROL_REG 0x10c0 +#define DC_DISP_DISP_COLOR_CONTROL_BASE_COLOR_SIZE __BITS(3,0) +#define DC_DISP_DISP_COLOR_CONTROL_BASE_COLOR_SIZE_888 8 + #define DC_DISP_COLOR_KEY0_LOWER_REG 0x10d8 #define DC_DISP_COLOR_KEY0_UPPER_REG 0x10dc #define DC_DISP_COLOR_KEY1_LOWER_REG 0x10e0 @@ -333,6 +357,7 @@ #define DC_WINC_A_COLOR_DEPTH_REG 0x1c0c #define DC_WINC_A_COLOR_DEPTH_DEPTH __BITS(6,0) #define DC_WINC_A_COLOR_DEPTH_DEPTH_T_A8R8G8B8 12 +#define DC_WINC_A_COLOR_DEPTH_DEPTH_T_X8R8G8B8 37 #define DC_WINC_A_POSITION_REG 0x1c10 #define DC_WINC_A_POSITION_V __BITS(28,16) Index: src/sys/arch/arm/nvidia/tegra_genfb.c diff -u src/sys/arch/arm/nvidia/tegra_genfb.c:1.1 src/sys/arch/arm/nvidia/tegra_genfb.c:1.2 --- src/sys/arch/arm/nvidia/tegra_genfb.c:1.1 Mon May 18 19:32:48 2015 +++ src/sys/arch/arm/nvidia/tegra_genfb.c Thu Jul 23 14:31:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_genfb.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */ +/* $NetBSD: tegra_genfb.c,v 1.2 2015/07/23 14:31:05 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_genfb.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_genfb.c,v 1.2 2015/07/23 14:31:05 jmcneill Exp $"); #include "opt_ddb.h" @@ -95,8 +95,7 @@ tegra_genfb_attach(device_t parent, devi prop_dictionary_set_uint32(prop, "height", tfb->tfb_height); prop_dictionary_set_uint8(prop, "depth", tfb->tfb_depth); prop_dictionary_set_uint32(prop, "linebytes", tfb->tfb_stride); - prop_dictionary_set_uint64(prop, "address", - tfb->tfb_dmamap->dm_segs[0].ds_addr); + prop_dictionary_set_uint64(prop, "address", 0); prop_dictionary_set_uint64(prop, "virtual_address", (uintptr_t)tfb->tfb_dmap); Index: src/sys/arch/arm/nvidia/tegra_hdmireg.h diff -u src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.1 src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.2 --- src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.1 Mon May 18 19:32:48 2015 +++ src/sys/arch/arm/nvidia/tegra_hdmireg.h Thu Jul 23 14:31:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_hdmireg.h,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */ +/* $NetBSD: tegra_hdmireg.h,v 1.2 2015/07/23 14:31:05 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -217,6 +217,7 @@ #define HDMI_NV_PDISP_SOR_CRCB_REG 0x174 #define HDMI_NV_PDISP_SOR_BLANK_REG 0x178 #define HDMI_NV_PDISP_SOR_SEQ_CTL_REG 0x17c + #define HDMI_NV_PDISP_SOR_SEQ_INST0_REG 0x180 #define HDMI_NV_PDISP_SOR_SEQ_INST1_REG 0x184 #define HDMI_NV_PDISP_SOR_SEQ_INST2_REG 0x188 @@ -233,6 +234,21 @@ #define HDMI_NV_PDISP_SOR_SEQ_INSTD_REG 0x1b4 #define HDMI_NV_PDISP_SOR_SEQ_INSTE_REG 0x1b8 #define HDMI_NV_PDISP_SOR_SEQ_INSTF_REG 0x1bc +#define HDMI_NV_PDISP_SOR_SEQ_INST_PLL_PULLDOWN __BIT(31) +#define HDMI_NV_PDISP_SOR_SEQ_INST_POWERDOWN_MACRO __BIT(30) +#define HDMI_NV_PDISP_SOR_SEQ_INST_ASSERT_PLL_RESETV __BIT(29) +#define HDMI_NV_PDISP_SOR_SEQ_INST_BLANK_V __BIT(28) +#define HDMI_NV_PDISP_SOR_SEQ_INST_BLANK_H __BIT(27) +#define HDMI_NV_PDISP_SOR_SEQ_INST_BLANK_DE __BIT(26) +#define HDMI_NV_PDISP_SOR_SEQ_INST_BLACK_DATA __BIT(25) +#define HDMI_NV_PDISP_SOR_SEQ_INST_TRISTATE_IOS __BIT(24) +#define HDMI_NV_PDISP_SOR_SEQ_INST_DRIVE_PWM_OUT_LO __BIT(23) +#define HDMI_NV_PDISP_SOR_SEQ_INST_PIN_B __BIT(22) +#define HDMI_NV_PDISP_SOR_SEQ_INST_PIN_A __BIT(21) +#define HDMI_NV_PDISP_SOR_SEQ_INST_HALT __BIT(15) +#define HDMI_NV_PDISP_SOR_SEQ_INST_WAIT_UNITS __BITS(13,12) +#define HDMI_NV_PDISP_SOR_SEQ_INST_WAIT_TIME __BITS(9,0) + #define HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT_REG 0x1f8 #define HDMI_NV_PDISP_SOR_REFCLK_REG 0x254 Index: src/sys/arch/arm/nvidia/tegra_hdmi.c diff -u src/sys/arch/arm/nvidia/tegra_hdmi.c:1.3 src/sys/arch/arm/nvidia/tegra_hdmi.c:1.4 --- src/sys/arch/arm/nvidia/tegra_hdmi.c:1.3 Wed Jul 8 01:23:28 2015 +++ src/sys/arch/arm/nvidia/tegra_hdmi.c Thu Jul 23 14:31:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_hdmi.c,v 1.3 2015/07/08 01:23:28 jmcneill Exp $ */ +/* $NetBSD: tegra_hdmi.c,v 1.4 2015/07/23 14:31:05 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.3 2015/07/08 01:23:28 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_hdmi.c,v 1.4 2015/07/23 14:31:05 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -67,8 +67,8 @@ static const struct tegra_hdmi_tmds_conf { 74250, 0x01003110, 0x00301500, 0x2c2c2c2c, 0x00000000, 0x07070707, 0x800034bb, 0x40400820 }, /* 1080p */ - { 148500, 0x01003310, 0300301500, 0x33333333, - 0x00000000, 0x0c0c0c0c, 0x800034bb, 0x40400820 }, + { 148500, 0x01003310, 0x00301500, 0x2d2d2d2d, + 0x00000000, 0x05050505, 0x800034bb, 0x40400820 }, /* 2160p */ { 297000, 0x01003f10, 0x00300f00, 0x37373737, 0x00000000, 0x17171717, 0x800036bb, 0x40400f20 }, @@ -135,6 +135,8 @@ tegra_hdmi_attach(device_t parent, devic sc->sc_pin_pll = tegra_gpio_acquire(pin, GPIO_PIN_OUTPUT); if (sc->sc_pin_pll) { tegra_gpio_write(sc->sc_pin_pll, 0); + } else { + panic("couldn't get pll-gpio pin"); } } if (prop_dictionary_get_cstring_nocopy(prop, "power-gpio", &pin)) { @@ -245,7 +247,6 @@ tegra_hdmi_enable(struct tegra_hdmi_soft u_int n; KASSERT(sc->sc_curmode != NULL); - tegra_pmc_hdmi_enable(); tegra_car_hdmi_enable(mode->dot_clock * 1000); @@ -278,8 +279,19 @@ tegra_hdmi_enable(struct tegra_hdmi_soft HDMI_SET_CLEAR(sc, HDMI_NV_PDISP_SOR_CSTM_REG, __SHIFTIN(HDMI_NV_PDISP_SOR_CSTM_MODE_TMDS, HDMI_NV_PDISP_SOR_CSTM_MODE) | + __SHIFTIN(2, HDMI_NV_PDISP_SOR_CSTM_ROTCLK) | HDMI_NV_PDISP_SOR_CSTM_PLLDIV, - HDMI_NV_PDISP_SOR_CSTM_MODE); + HDMI_NV_PDISP_SOR_CSTM_MODE | + HDMI_NV_PDISP_SOR_CSTM_ROTCLK | + HDMI_NV_PDISP_SOR_CSTM_LVDS_EN); + + const uint32_t inst = + HDMI_NV_PDISP_SOR_SEQ_INST_DRIVE_PWM_OUT_LO | + HDMI_NV_PDISP_SOR_SEQ_INST_HALT | + __SHIFTIN(2, HDMI_NV_PDISP_SOR_SEQ_INST_WAIT_UNITS) | + __SHIFTIN(1, HDMI_NV_PDISP_SOR_SEQ_INST_WAIT_TIME); + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_SEQ_INST0_REG, inst); + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_SEQ_INST8_REG, inst); input_ctrl = __SHIFTIN(tegra_dc_port(sc->sc_displaydev), HDMI_NV_PDISP_INPUT_CONTROL_HDMI_SRC_SELECT); @@ -290,6 +302,26 @@ tegra_hdmi_enable(struct tegra_hdmi_soft if (tegra_hdmi_sor_start(sc) != 0) return; + const u_int rekey = 56; + const u_int hspw = mode->hsync_end - mode->hsync_start; + const u_int hbp = mode->htotal - mode->hsync_end; + const u_int hfp = mode->hsync_start - mode->hdisplay; + const u_int max_ac_packet = (hspw + hbp + hfp - rekey - 18) / 32; + uint32_t ctrl = + __SHIFTIN(rekey, HDMI_NV_PDISP_HDMI_CTRL_REKEY) | + __SHIFTIN(max_ac_packet, HDMI_NV_PDISP_HDMI_CTRL_MAX_AC_PACKET); +#if notyet + if (HDMI mode) { + ctrl |= HDMI_NV_PDISP_HDMI_CTRL_ENABLE; /* HDMI ENABLE */ + } +#endif + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_CTRL_REG, ctrl); + + /* XXX DVI */ + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_GENERIC_CTRL_REG, 0); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_REG, 0); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_REG, 0); + /* Start HDMI output */ tegra_dc_hdmi_start(sc->sc_displaydev); } @@ -330,6 +362,7 @@ tegra_hdmi_sor_start(struct tegra_hdmi_s uint32_t state2 = __SHIFTIN(1, HDMI_NV_PDISP_SOR_STATE2_ASY_OWNER) | __SHIFTIN(3, HDMI_NV_PDISP_SOR_STATE2_ASY_SUBOWNER) | + __SHIFTIN(1, HDMI_NV_PDISP_SOR_STATE2_ASY_CRCMODE) | __SHIFTIN(1, HDMI_NV_PDISP_SOR_STATE2_ASY_PROTOCOL); if (sc->sc_curmode->flags & VID_NHSYNC) state2 |= HDMI_NV_PDISP_SOR_STATE2_ASY_HSYNCPOL;