Module Name: src Committed By: jmcneill Date: Sat Jul 25 15:50:42 UTC 2015
Modified Files: src/sys/arch/arm/nvidia: tegra_car.c tegra_carreg.h tegra_hdmi.c tegra_hdmireg.h Log Message: Add HDMI audio support To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/nvidia/tegra_car.c cvs rdiff -u -r1.19 -r1.20 src/sys/arch/arm/nvidia/tegra_carreg.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/nvidia/tegra_hdmi.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_hdmireg.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_car.c diff -u src/sys/arch/arm/nvidia/tegra_car.c:1.23 src/sys/arch/arm/nvidia/tegra_car.c:1.24 --- src/sys/arch/arm/nvidia/tegra_car.c:1.23 Thu Jul 23 18:22:05 2015 +++ src/sys/arch/arm/nvidia/tegra_car.c Sat Jul 25 15:50:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_car.c,v 1.23 2015/07/23 18:22:05 jmcneill Exp $ */ +/* $NetBSD: tegra_car.c,v 1.24 2015/07/25 15:50:42 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_car.c,v 1.23 2015/07/23 18:22:05 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.24 2015/07/25 15:50:42 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -535,24 +535,27 @@ tegra_car_periph_hda_enable(void) tegra_car_get_bs(&bst, &bsh); - /* HDA */ bus_space_write_4(bst, bsh, CAR_RST_DEV_V_SET_REG, CAR_DEV_V_HDA); bus_space_write_4(bst, bsh, CAR_CLK_ENB_V_SET_REG, CAR_DEV_V_HDA); - bus_space_write_4(bst, bsh, CAR_RST_DEV_V_CLR_REG, CAR_DEV_V_HDA); - - /* HDA2CODEC_2X */ bus_space_write_4(bst, bsh, CAR_RST_DEV_V_SET_REG, CAR_DEV_V_HDA2CODEC_2X); bus_space_write_4(bst, bsh, CAR_CLK_ENB_V_SET_REG, CAR_DEV_V_HDA2CODEC_2X); - bus_space_write_4(bst, bsh, CAR_RST_DEV_V_CLR_REG, - CAR_DEV_V_HDA2CODEC_2X); - - /* HDA2HDMICODEC */ bus_space_write_4(bst, bsh, CAR_RST_DEV_W_SET_REG, CAR_DEV_W_HDA2HDMICODEC); bus_space_write_4(bst, bsh, CAR_CLK_ENB_W_SET_REG, CAR_DEV_W_HDA2HDMICODEC); + + /* configure HDA2CODEC_2X for 48 MHz */ + const u_int div = howmany(tegra_car_pllp0_rate() * 2, 48000000) - 2; + bus_space_write_4(bst, bsh, CAR_CLKSRC_HDA2CODEC_2X_REG, + __SHIFTIN(CAR_CLKSRC_HDA2CODEC_2X_SRC_PLLP_OUT0, + CAR_CLKSRC_HDA2CODEC_2X_SRC) | + __SHIFTIN(div, CAR_CLKSRC_HDA2CODEC_2X_DIV)); + + bus_space_write_4(bst, bsh, CAR_RST_DEV_V_CLR_REG, CAR_DEV_V_HDA); + bus_space_write_4(bst, bsh, CAR_RST_DEV_V_CLR_REG, + CAR_DEV_V_HDA2CODEC_2X); bus_space_write_4(bst, bsh, CAR_RST_DEV_W_CLR_REG, CAR_DEV_W_HDA2HDMICODEC); } Index: src/sys/arch/arm/nvidia/tegra_carreg.h diff -u src/sys/arch/arm/nvidia/tegra_carreg.h:1.19 src/sys/arch/arm/nvidia/tegra_carreg.h:1.20 --- src/sys/arch/arm/nvidia/tegra_carreg.h:1.19 Thu Jul 23 15:07:31 2015 +++ src/sys/arch/arm/nvidia/tegra_carreg.h Sat Jul 25 15:50:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_carreg.h,v 1.19 2015/07/23 15:07:31 skrll Exp $ */ +/* $NetBSD: tegra_carreg.h,v 1.20 2015/07/25 15:50:42 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -390,6 +390,16 @@ #define CAR_CCLKG_BURST_POLICY_CWAKEUP_SOURCE_CLKM 0 #define CAR_CCLKG_BURST_POLICY_CWAKEUP_SOURCE_PLLX_OUT0_LJ 8 +#define CAR_CLKSRC_HDA2CODEC_2X_REG 0x3e4 +#define CAR_CLKSRC_HDA2CODEC_2X_SRC __BITS(31,29) +#define CAR_CLKSRC_HDA2CODEC_2X_SRC_PLLP_OUT0 0 +#define CAR_CLKSRC_HDA2CODEC_2X_SRC_PLLC2_OUT0 1 +#define CAR_CLKSRC_HDA2CODEC_2X_SRC_PLLC_OUT0 2 +#define CAR_CLKSRC_HDA2CODEC_2X_SRC_PLLC3_OUT0 3 +#define CAR_CLKSRC_HDA2CODEC_2X_SRC_PLLM_OUT0 4 +#define CAR_CLKSRC_HDA2CODEC_2X_SRC_CLKM 6 +#define CAR_CLKSRC_HDA2CODEC_2X_DIV __BITS(7,0) + #define CAR_CLKSRC_SATA_OOB_REG 0x420 #define CAR_CLKSRC_SATA_OOB_SRC __BITS(31,29) #define CAR_CLKSRC_SATA_OOB_SRC_PLLP_OUT0 0 @@ -462,4 +472,12 @@ #define CAR_SATA_PLL_CFG1_PADPLL_PU_POST_DLY __BITS(15,8) #define CAR_SATA_PLL_CFG1_LANE_IDDQ2_PADPLL_IDDQ_DLY __BITS(7,0) +#define CAR_CLKSRC_HDMI_AUDIO_REG 0x668 +#define CAR_CLKSRC_HDMI_AUDIO_SRC __BITS(31,29) +#define CAR_CLKSRC_HDMI_AUDIO_SRC_PLLP_OUT0 0 +#define CAR_CLKSRC_HDMI_AUDIO_SRC_PLLC_OUT0 1 +#define CAR_CLKSRC_HDMI_AUDIO_SRC_PLLC2_OUT0 2 +#define CAR_CLKSRC_HDMI_AUDIO_SRC_CLKM 3 +#define CAR_CLKSRC_HDMI_AUDIO_DIV __BITS(7,0) + #endif /* _ARM_TEGRA_CARREG_H */ Index: src/sys/arch/arm/nvidia/tegra_hdmi.c diff -u src/sys/arch/arm/nvidia/tegra_hdmi.c:1.5 src/sys/arch/arm/nvidia/tegra_hdmi.c:1.6 --- src/sys/arch/arm/nvidia/tegra_hdmi.c:1.5 Thu Jul 23 15:43:06 2015 +++ src/sys/arch/arm/nvidia/tegra_hdmi.c Sat Jul 25 15:50:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_hdmi.c,v 1.5 2015/07/23 15:43:06 jmcneill Exp $ */ +/* $NetBSD: tegra_hdmi.c,v 1.6 2015/07/25 15:50:42 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.5 2015/07/23 15:43:06 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_hdmi.c,v 1.6 2015/07/25 15:50:42 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -87,6 +87,7 @@ struct tegra_hdmi_softc { bool sc_connected; const struct videomode *sc_curmode; + bool sc_hdmimode; }; static void tegra_hdmi_hpd(struct tegra_hdmi_softc *); @@ -94,6 +95,10 @@ static void tegra_hdmi_connect(struct te static void tegra_hdmi_disconnect(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 *); +static bool tegra_hdmi_is_hdmi(struct tegra_hdmi_softc *, + const struct edid_info *); +static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi_softc *); +static uint8_t tegra_hdmi_infoframe_csum(const uint8_t *, size_t); CFATTACH_DECL_NEW(tegra_hdmi, sizeof(struct tegra_hdmi_softc), tegra_hdmi_match, tegra_hdmi_attach, NULL, NULL); @@ -230,6 +235,13 @@ tegra_hdmi_connect(struct tegra_hdmi_sof } sc->sc_curmode = mode; + sc->sc_hdmimode = tegra_hdmi_is_hdmi(sc, &ei); +device_printf(sc->sc_dev, "connected to %s display\n", sc->sc_hdmimode ? "HDMI" : "DVI"); + if (sc->sc_hdmimode == false) { + device_printf(sc->sc_dev, "forcing HDMI mode\n"); + sc->sc_hdmimode = true; + } + tegra_hdmi_enable(sc, pedid); } @@ -244,34 +256,33 @@ tegra_hdmi_enable(struct tegra_hdmi_soft const struct tegra_hdmi_tmds_config *tmds = NULL; const struct videomode *mode = sc->sc_curmode; uint32_t input_ctrl; - u_int n; + u_int i; KASSERT(sc->sc_curmode != NULL); tegra_pmc_hdmi_enable(); tegra_car_hdmi_enable(mode->dot_clock * 1000); - for (n = 0; n < __arraycount(tegra_hdmi_tmds_config); n++) { - if (tegra_hdmi_tmds_config[n].dot_clock >= mode->dot_clock) { + for (i = 0; i < __arraycount(tegra_hdmi_tmds_config); i++) { + if (tegra_hdmi_tmds_config[i].dot_clock >= mode->dot_clock) { break; } } - if (n < __arraycount(tegra_hdmi_tmds_config)) { - tmds = &tegra_hdmi_tmds_config[n]; + if (i < __arraycount(tegra_hdmi_tmds_config)) { + tmds = &tegra_hdmi_tmds_config[i]; } else { tmds = &tegra_hdmi_tmds_config[__arraycount(tegra_hdmi_tmds_config) - 1]; } - if (tmds != NULL) { - HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PLL0_REG, tmds->sor_pll0); - HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PLL1_REG, tmds->sor_pll1); - HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT_REG, - tmds->sor_lane_drive_current); - HDMI_WRITE(sc, HDMI_NV_PDISP_PE_CURRENT_REG, tmds->pe_current); - HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT_REG, - tmds->sor_io_peak_current); - HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PAD_CTLS0_REG, - tmds->sor_pad_ctls0); - } + + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PLL0_REG, tmds->sor_pll0); + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PLL1_REG, tmds->sor_pll1); + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT_REG, + tmds->sor_lane_drive_current); + HDMI_WRITE(sc, HDMI_NV_PDISP_PE_CURRENT_REG, tmds->pe_current); + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT_REG, + tmds->sor_io_peak_current); + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PAD_CTLS0_REG, + tmds->sor_pad_ctls0); tegra_dc_enable(sc->sc_displaydev, sc->sc_dev, mode, edid); @@ -314,17 +325,57 @@ tegra_hdmi_enable(struct tegra_hdmi_soft 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) { + if (sc->sc_hdmimode) { 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); + if (sc->sc_hdmimode) { + const u_int n = 6144; /* 48 kHz */ + const u_int cts = ((mode->dot_clock * 10) * (n / 128)) / 480; + + HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_REG, + __SHIFTIN(HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SOURCE_SELECT_AUTO, + HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SOURCE_SELECT) | + HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_INJECT_NULLSMPL); + HDMI_WRITE(sc, HDMI_NV_PDISP_AUDIO_N_REG, + HDMI_NV_PDISP_AUDIO_N_RESETF | + HDMI_NV_PDISP_AUDIO_N_GENERATE | + __SHIFTIN(n - 1, HDMI_NV_PDISP_AUDIO_N_VALUE)); + + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_SPARE_REG, + HDMI_NV_PDISP_HDMI_SPARE_HW_CTS | + HDMI_NV_PDISP_HDMI_SPARE_FORCE_SW_CTS | + __SHIFTIN(1, HDMI_NV_PDISP_HDMI_SPARE_CTS_RESET_VAL)); + + /* + * When HW_CTS=1 and FORCE_SW_CTS=1, the CTS is programmed by + * software in the 44.1 kHz register regardless of chosen rate. + */ + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW_REG, + cts << 8); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH_REG, + 0x80000000 | n); + + HDMI_SET_CLEAR(sc, HDMI_NV_PDISP_AUDIO_N_REG, 0, + HDMI_NV_PDISP_AUDIO_N_RESETF); + + HDMI_WRITE(sc, 24000, HDMI_NV_PDISP_SOR_AUDIO_AVAL_0480_REG); + + tegra_hdmi_setup_audio_infoframe(sc); + + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_GENERIC_CTRL_REG, + HDMI_NV_PDISP_HDMI_GENERIC_CTRL_AUDIO); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_REG, 0); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_REG, + HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_ENABLE); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_ACR_CTRL_REG, 0); + } else { + 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); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_ACR_CTRL_REG, 0); + } /* Start HDMI output */ tegra_dc_hdmi_start(sc->sc_displaydev); @@ -391,3 +442,99 @@ tegra_hdmi_sor_start(struct tegra_hdmi_s return 0; } + +static bool +tegra_hdmi_is_hdmi(struct tegra_hdmi_softc *sc, const struct edid_info *ei) +{ + char edid[128]; + bool found_hdmi = false; + unsigned int n, p; + + /* + * Scan through extension blocks, looking for a CEA-861-D v3 + * block. If an HDMI Vendor-Specific Data Block (HDMI VSDB) is + * found in that, assume HDMI mode. + */ + for (n = 1; n <= MIN(ei->edid_ext_block_count, 4); n++) { + if (ddc_dev_read_edid_block(sc->sc_ddcdev, edid, + sizeof(edid), n)) { + break; + } + + const uint8_t tag = edid[0]; + const uint8_t rev = edid[1]; + const uint8_t off = edid[2]; + + /* We are looking for a CEA-861-D tag (02h) with revision 3 */ + if (tag != 0x02 || rev != 3) + continue; + /* + * CEA data block collection starts at byte 4, so the + * DTD blocks must start after it. + */ + if (off <= 4) + continue; + + /* Parse the CEA data blocks */ + for (p = 4; p < off;) { + const uint8_t btag = (edid[p] >> 5) & 0x7; + const uint8_t blen = edid[p] & 0x1f; + + /* Make sure the length is sane */ + if (p + blen + 1 > off) + break; + /* Looking for a VSDB tag */ + if (btag != 3) + goto next_block; + /* HDMI VSDB is at least 5 bytes long */ + if (blen < 5) + goto next_block; + + /* HDMI 24-bit IEEE registration ID is 0x000C03 */ + if (memcmp(&edid[p + 1], "\x03\x0c\x00", 3) == 0) + found_hdmi = true; + +next_block: + p += (1 + blen); + } + } + + return found_hdmi; +} + +static void +tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi_softc *sc) +{ + uint8_t data[10] = { + 0x84, 0x01, 0x10, + 0x00, /* PB0 (checksum) */ + 0x01, /* CT=0, CC=2ch */ + 0xc0, /* SS=0, SF=48kHz */ + 0x00, /* CA=FR/FL */ + 0x00, /* LSV=0dB, DM_INH=permitted */ + 0x00, 0x00 + }; + + data[3] = tegra_hdmi_infoframe_csum(data, sizeof(data)); + + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER_REG, + data[0] | (data[1] << 8) | (data[2] << 16)); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_LOW_REG, + data[3] | (data[4] << 8) | (data[5] << 16) | (data[6] << 24)); + HDMI_WRITE(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_HIGH_REG, + data[7] | (data[8] << 8) | (data[9] << 16)); +} + +static uint8_t +tegra_hdmi_infoframe_csum(const uint8_t *data, size_t len) +{ + uint8_t csum = 0; + u_int n; + + for (n = 0; n < len; n++) + csum += data[n]; + if (csum) + csum = 0x100 - csum; + + return csum; +} Index: src/sys/arch/arm/nvidia/tegra_hdmireg.h diff -u src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.3 src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.4 --- src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.3 Thu Jul 23 15:08:19 2015 +++ src/sys/arch/arm/nvidia/tegra_hdmireg.h Sat Jul 25 15:50:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_hdmireg.h,v 1.3 2015/07/23 15:08:19 skrll Exp $ */ +/* $NetBSD: tegra_hdmireg.h,v 1.4 2015/07/25 15:50:42 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -59,19 +59,38 @@ #define HDMI_NV_PDISP_HDMI_AUDIO_EMU_RDATA0_REG 0x06c #define HDMI_NV_PDISP_HDMI_AUDIO_EMU1_REG 0x070 #define HDMI_NV_PDISP_HDMI_AUDIO_EMU2_REG 0x074 + #define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_REG 0x078 +#define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_CHKSUM_HW __BIT(9) +#define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_SINGLE __BIT(8) +#define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_OTHER __BIT(4) +#define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL_ENABLE __BIT(0) + #define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_STATUS_REG 0x07c #define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER_REG 0x080 #define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_LOW_REG 0x084 #define HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_HIGH_REG 0x088 + #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_REG 0x08c +#define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_CHKSUM_HW __BIT(9) +#define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_SINGLE __BIT(8) +#define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_OTHER __BIT(4) +#define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL_ENABLE __BIT(0) + #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_STATUS_REG 0x090 #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER_REG 0x094 #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_LOW_REG 0x098 #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_HIGH_REG 0x09c #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_LOW_REG 0x0a0 #define HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_HIGH_REG 0x0a4 + #define HDMI_NV_PDISP_HDMI_GENERIC_CTRL_REG 0x0a8 +#define HDMI_NV_PDISP_HDMI_GENERIC_CTRL_AUDIO __BIT(16) +#define HDMI_NV_PDISP_HDMI_GENERIC_CTRL_HBLANK __BIT(12) +#define HDMI_NV_PDISP_HDMI_GENERIC_CTRL_SINGLE __BIT(8) +#define HDMI_NV_PDISP_HDMI_GENERIC_CTRL_OTHER __BIT(4) +#define HDMI_NV_PDISP_HDMI_GENERIC_CTRL_ENABLE __BIT(0) + #define HDMI_NV_PDISP_HDMI_GENERIC_STATUS_REG 0x0ac #define HDMI_NV_PDISP_HDMI_GENERIC_HEADER_REG 0x0b0 #define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK0_LOW_REG 0x0b4 @@ -121,7 +140,12 @@ #define HDMI_NV_PDISP_HDMI_EMU0_REG 0x130 #define HDMI_NV_PDISP_HDMI_EMU1_REG 0x134 #define HDMI_NV_PDISP_HDMI_EMU1_RDATA_REG 0x138 + #define HDMI_NV_PDISP_HDMI_SPARE_REG 0x13c +#define HDMI_NV_PDISP_HDMI_SPARE_HW_CTS __BIT(0) +#define HDMI_NV_PDISP_HDMI_SPARE_FORCE_SW_CTS __BIT(1) +#define HDMI_NV_PDISP_HDMI_SPARE_CTS_RESET_VAL __BITS(18,16) + #define HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS1_REG 0x140 #define HDMI_NV_PDISP_HDMI_SPDIF_CHN_STAUTS2_REG 0x144 #define HDMI_NV_PDISP_CRC_CONTROL_REG 0x258 @@ -271,7 +295,30 @@ * Audio Registers */ #define HDMI_NV_PDISP_AUDIO_N_REG 0x230 +#define HDMI_NV_PDISP_AUDIO_N_LOOKUP __BIT(28) +#define HDMI_NV_PDISP_AUDIO_N_GENERATE __BIT(24) +#define HDMI_NV_PDISP_AUDIO_N_RESETF __BIT(20) +#define HDMI_NV_PDISP_AUDIO_N_VALUE __BITS(19,0) + #define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_REG 0x2b0 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_INPUT_MODE __BIT(31) +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_INJECT_NULLSMPL __BIT(29) +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SOURCE_SELECT __BITS(21,20) +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SOURCE_SELECT_AUTO 0 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SOURCE_SELECT_SPDIF 1 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SOURCE_SELECT_HDAL 2 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ __BITS(19,16) +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_32_0KHZ 3 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_44_1KHZ 0 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_88_2KHZ 8 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_176_4KHZ 12 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_48_0KHZ 2 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_96_0KHZ 10 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_192_0KHZ 14 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_SAMPLING_FREQ_UNKNOWN 1 +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_AFIFO_FLUSH __BIT(12) +#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_PORT_CONNECTIVITY __BIT(0) + #define HDMI_NV_PDISP_SOR_AUDIO_DEBUG_REG 0x2b4 #define HDMI_NV_PDISP_SOR_AUDIO_SPARE0_REG 0x2b8 #define HDMI_NV_PDISP_SOR_AUDIO_NVAL_0320_REG 0x2bc