Module Name: src
Committed By: jmcneill
Date: Mon May 18 19:32:48 UTC 2015
Modified Files:
src/sys/arch/arm/nvidia: files.tegra tegra_car.c tegra_carreg.h
tegra_io.c tegra_var.h
src/sys/arch/evbarm/conf: JETSONTK1
src/sys/arch/evbarm/tegra: tegra_machdep.c
Added Files:
src/sys/arch/arm/nvidia: tegra_dc.c tegra_dcreg.h tegra_genfb.c
tegra_hdmi.c tegra_hdmireg.h
Log Message:
Work in progress HDMI / framebuffer support for Tegra K1.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/nvidia/files.tegra
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/nvidia/tegra_car.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/arm/nvidia/tegra_carreg.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/nvidia/tegra_dc.c \
src/sys/arch/arm/nvidia/tegra_dcreg.h \
src/sys/arch/arm/nvidia/tegra_genfb.c \
src/sys/arch/arm/nvidia/tegra_hdmi.c \
src/sys/arch/arm/nvidia/tegra_hdmireg.h
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/nvidia/tegra_io.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/nvidia/tegra_var.h
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/evbarm/conf/JETSONTK1
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/evbarm/tegra/tegra_machdep.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/files.tegra
diff -u src/sys/arch/arm/nvidia/files.tegra:1.11 src/sys/arch/arm/nvidia/files.tegra:1.12
--- src/sys/arch/arm/nvidia/files.tegra:1.11 Fri May 15 11:49:10 2015
+++ src/sys/arch/arm/nvidia/files.tegra Mon May 18 19:32:48 2015
@@ -1,4 +1,4 @@
-# $NetBSD: files.tegra,v 1.11 2015/05/15 11:49:10 jmcneill Exp $
+# $NetBSD: files.tegra,v 1.12 2015/05/18 19:32:48 jmcneill Exp $
#
# Configuration info for NVIDIA Tegra ARM Peripherals
#
@@ -87,6 +87,20 @@ file arch/arm/nvidia/tegra_ahcisata.c te
attach hdaudio at tegraio with tegra_hdaudio
file arch/arm/nvidia/tegra_hdaudio.c tegra_hdaudio
+# Display controller
+device tegradc { }
+attach tegradc at tegraio with tegra_dc
+file arch/arm/nvidia/tegra_dc.c tegra_dc
+
+# Framebuffer console
+attach genfb at tegradc with tegra_genfb
+file arch/arm/nvidia/tegra_genfb.c tegra_genfb
+
+# HDMI
+device tegrahdmi: edid, ddc_read_edid, videomode
+attach tegrahdmi at tegraio with tegra_hdmi
+file arch/arm/nvidia/tegra_hdmi.c tegra_hdmi
+
# Console parameters
defparam opt_tegra.h CONADDR
defparam opt_tegra.h CONSPEED
Index: src/sys/arch/arm/nvidia/tegra_car.c
diff -u src/sys/arch/arm/nvidia/tegra_car.c:1.15 src/sys/arch/arm/nvidia/tegra_car.c:1.16
--- src/sys/arch/arm/nvidia/tegra_car.c:1.15 Sat May 16 23:07:51 2015
+++ src/sys/arch/arm/nvidia/tegra_car.c Mon May 18 19:32:48 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_car.c,v 1.15 2015/05/16 23:07:51 jmcneill Exp $ */
+/* $NetBSD: tegra_car.c,v 1.16 2015/05/18 19:32:48 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
#include "locators.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.15 2015/05/16 23:07:51 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.16 2015/05/18 19:32:48 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -52,6 +52,8 @@ struct tegra_car_softc {
bus_space_handle_t sc_bsh;
};
+static void tegra_car_init(struct tegra_car_softc *);
+
static struct tegra_car_softc *pmc_softc = NULL;
CFATTACH_DECL_NEW(tegra_car, sizeof(struct tegra_car_softc),
@@ -81,11 +83,28 @@ tegra_car_attach(device_t parent, device
aprint_naive("\n");
aprint_normal(": CAR\n");
+ tegra_car_init(sc);
+
aprint_verbose_dev(self, "PLLX = %u Hz\n", tegra_car_pllx_rate());
aprint_verbose_dev(self, "PLLC = %u Hz\n", tegra_car_pllc_rate());
aprint_verbose_dev(self, "PLLE = %u Hz\n", tegra_car_plle_rate());
aprint_verbose_dev(self, "PLLU = %u Hz\n", tegra_car_pllu_rate());
aprint_verbose_dev(self, "PLLP0 = %u Hz\n", tegra_car_pllp0_rate());
+ aprint_verbose_dev(self, "PLLD2 = %u Hz\n", tegra_car_plld2_rate());
+}
+
+static void
+tegra_car_init(struct tegra_car_softc *sc)
+{
+ bus_space_tag_t bst = sc->sc_bst;
+ bus_space_handle_t bsh = sc->sc_bsh;
+
+ tegra_reg_set_clear(bst, bsh, CAR_PLLD2_BASE_REG,
+ __SHIFTIN(1, CAR_PLLD2_BASE_MDIV) |
+ __SHIFTIN(99, CAR_PLLD2_BASE_NDIV) |
+ __SHIFTIN(2, CAR_PLLD2_BASE_PLDIV),
+ CAR_PLLD2_BASE_REF_SRC_SEL |
+ CAR_PLLD2_BASE_PLDIV | CAR_PLLD2_BASE_NDIV | CAR_PLLD2_BASE_MDIV);
}
static void
@@ -220,6 +239,13 @@ tegra_car_pllp0_rate(void)
}
u_int
+tegra_car_plld2_rate(void)
+{
+ return tegra_car_pll_rate(CAR_PLLD2_BASE_REG, CAR_PLLD2_BASE_MDIV,
+ CAR_PLLD2_BASE_NDIV, CAR_PLLD2_BASE_PLDIV);
+}
+
+u_int
tegra_car_uart_rate(u_int port)
{
bus_space_tag_t bst;
@@ -577,3 +603,71 @@ tegra_car_periph_i2c_enable(u_int port,
return 0;
}
+
+void
+tegra_car_hdmi_enable(u_int rate)
+{
+ bus_space_tag_t bst;
+ bus_space_handle_t bsh;
+
+ tegra_car_get_bs(&bst, &bsh);
+
+ /* Enter reset, enable clock */
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_H_SET_REG, CAR_DEV_H_HDMI);
+ bus_space_write_4(bst, bsh, CAR_CLK_ENB_H_SET_REG, CAR_DEV_H_HDMI);
+
+ /* Change IDDQ from 1 to 0 */
+ tegra_reg_set_clear(bst, bsh, CAR_PLLD2_BASE_REG,
+ 0, CAR_PLLD2_BASE_IDDQ);
+ delay(2);
+ /* Enable PLLD2 */
+ tegra_reg_set_clear(bst, bsh, CAR_PLLD2_BASE_REG,
+ CAR_PLLD2_BASE_ENABLE, 0);
+
+ /* Set clock source to PLLD2 */
+ const u_int div = howmany(tegra_car_plld2_rate(), rate);;
+ bus_space_write_4(bst, bsh, CAR_CLKSRC_HDMI_REG,
+ __SHIFTIN(CAR_CLKSRC_HDMI_SRC_PLLD2_OUT0, CAR_CLKSRC_HDMI_SRC) |
+ __SHIFTIN(div - 1, CAR_CLKSRC_HDMI_DIV));
+
+ /* Leave reset */
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_H_CLR_REG, CAR_DEV_H_HDMI);
+}
+
+int
+tegra_car_dc_enable(u_int port)
+{
+ bus_space_tag_t bst;
+ bus_space_handle_t bsh;
+ bus_size_t src_reg;
+ uint32_t dev_bit;
+
+ tegra_car_get_bs(&bst, &bsh);
+
+ switch (port) {
+ case 0:
+ dev_bit = CAR_DEV_L_DISP1;
+ src_reg = CAR_CLKSRC_DISP1_REG;
+ break;
+ case 1:
+ dev_bit = CAR_DEV_L_DISP2;
+ src_reg = CAR_CLKSRC_DISP2_REG;
+ break;
+ default:
+ return EINVAL;
+ }
+
+ /* Enter reset, enable clock */
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_L_SET_REG, dev_bit);
+ bus_space_write_4(bst, bsh, CAR_CLK_ENB_L_SET_REG, dev_bit);
+
+ /* Select PLLP for clock source */
+ bus_space_write_4(bst, bsh, src_reg,
+ __SHIFTIN(CAR_CLKSRC_DISP_SRC_PLLP_OUT0,
+ CAR_CLKSRC_DISP_SRC));
+
+ /* Leave reset */
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_L_CLR_REG, dev_bit);
+
+ return 0;
+}
Index: src/sys/arch/arm/nvidia/tegra_carreg.h
diff -u src/sys/arch/arm/nvidia/tegra_carreg.h:1.14 src/sys/arch/arm/nvidia/tegra_carreg.h:1.15
--- src/sys/arch/arm/nvidia/tegra_carreg.h:1.14 Thu May 14 10:23:03 2015
+++ src/sys/arch/arm/nvidia/tegra_carreg.h Mon May 18 19:32:48 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_carreg.h,v 1.14 2015/05/14 10:23:03 jmcneill Exp $ */
+/* $NetBSD: tegra_carreg.h,v 1.15 2015/05/18 19:32:48 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -104,6 +104,30 @@
#define CAR_PLLE_MISC_REG 0xec
+#define CAR_PLLD2_BASE_REG 0x4b8
+#define CAR_PLLD2_BASE_BYPASS __BIT(31)
+#define CAR_PLLD2_BASE_ENABLE __BIT(30)
+#define CAR_PLLD2_BASE_REF_DIS __BIT(29)
+#define CAR_PLLD2_BASE_FREQLOCK __BIT(28)
+#define CAR_PLLD2_BASE_LOCK __BIT(27)
+#define CAR_PLLD2_BASE_REF_SRC_SEL __BITS(26,25)
+#define CAR_PLLD2_BASE_REF_SRC_SEL_PLL_D 0
+#define CAR_PLLD2_BASE_REF_SRC_SEL_PLL_D2 1
+#define CAR_PLLD2_BASE_LOCK_OVERRIDE __BIT(24)
+#define CAR_PLLD2_BASE_PLDIV __BITS(23,20)
+#define CAR_PLLD2_BASE_IDDQ __BIT(19)
+#define CAR_PLLD2_BASE_PTS __BIT(16)
+#define CAR_PLLD2_BASE_NDIV __BITS(15,8)
+#define CAR_PLLD2_BASE_MDIV __BITS(7,0)
+
+#define CAR_PLLD2_MISC_REG 0x4bc
+#define CAR_PLLD2_MISC_EN_FSTLCK __BIT(31)
+#define CAR_PLLD2_MISC_LOCK_ENABLE __BIT(30)
+#define CAR_PLLD2_MISC_MON_TEST_OUT __BITS(29,27)
+#define CAR_PLLD2_MISC_KCP __BITS(26,25)
+#define CAR_PLLD2_MISC_KVCO __BIT(24)
+#define CAR_PLLD2_MISC_SETUP __BITS(23,0)
+
#define CAR_CLKSRC_I2C1_REG 0x124
#define CAR_CLKSRC_I2C2_REG 0x198
#define CAR_CLKSRC_I2C3_REG 0x1b8
@@ -150,6 +174,28 @@
#define CAR_CLKSRC_SDMMC_SRC_CLK_M 6
#define CAR_CLKSRC_SDMMC_DIV __BITS(7,0)
+#define CAR_CLKSRC_HDMI_REG 0x18c
+#define CAR_CLKSRC_HDMI_SRC __BITS(31,29)
+#define CAR_CLKSRC_HDMI_SRC_PLLP_OUT0 0
+#define CAR_CLKSRC_HDMI_SRC_PLLM_OUT0 1
+#define CAR_CLKSRC_HDMI_SRC_PLLD_OUT0 2
+#define CAR_CLKSRC_HDMI_SRC_PLLA_OUT0 3
+#define CAR_CLKSRC_HDMI_SRC_PLLC_OUT0 4
+#define CAR_CLKSRC_HDMI_SRC_PLLD2_OUT0 5
+#define CAR_CLKSRC_HDMI_SRC_CLK_M 6
+#define CAR_CLKSRC_HDMI_DIV __BITS(7,0)
+
+#define CAR_CLKSRC_DISP1_REG 0x138
+#define CAR_CLKSRC_DISP2_REG 0x13c
+#define CAR_CLKSRC_DISP_SRC __BITS(31,29)
+#define CAR_CLKSRC_DISP_SRC_PLLP_OUT0 0
+#define CAR_CLKSRC_DISP_SRC_PLLM_OUT0 1
+#define CAR_CLKSRC_DISP_SRC_PLLD_OUT0 2
+#define CAR_CLKSRC_DISP_SRC_PLLA_OUT0 3
+#define CAR_CLKSRC_DISP_SRC_PLLC_OUT0 4
+#define CAR_CLKSRC_DISP_SRC_PLLD2_OUT0 5
+#define CAR_CLKSRC_DISP_SRC_CLK_M 6
+
#define CAR_RST_DEV_L_SET_REG 0x300
#define CAR_RST_DEV_L_CLR_REG 0x304
#define CAR_RST_DEV_H_SET_REG 0x308
Index: src/sys/arch/arm/nvidia/tegra_io.c
diff -u src/sys/arch/arm/nvidia/tegra_io.c:1.9 src/sys/arch/arm/nvidia/tegra_io.c:1.10
--- src/sys/arch/arm/nvidia/tegra_io.c:1.9 Fri May 15 11:49:10 2015
+++ src/sys/arch/arm/nvidia/tegra_io.c Mon May 18 19:32:48 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_io.c,v 1.9 2015/05/15 11:49:10 jmcneill Exp $ */
+/* $NetBSD: tegra_io.c,v 1.10 2015/05/18 19:32:48 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
#include "opt_tegra.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_io.c,v 1.9 2015/05/15 11:49:10 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_io.c,v 1.10 2015/05/18 19:32:48 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -127,6 +127,15 @@ static const struct tegra_locators tegra
TEGRA_PCIE_OFFSET, TEGRA_PCIE_SIZE, NOPORT, TEGRA_INTR_PCIE_INT },
};
+static const struct tegra_locators tegra_ghost_locators[] = {
+ { "tegradc",
+ TEGRA_DISPLAYA_OFFSET, TEGRA_DISPLAYA_SIZE, 0, TEGRA_INTR_DISPLAYA },
+ { "tegradc",
+ TEGRA_DISPLAYB_OFFSET, TEGRA_DISPLAYB_SIZE, 1, TEGRA_INTR_DISPLAYB },
+ { "tegrahdmi",
+ TEGRA_HDMI_OFFSET, TEGRA_HDMI_SIZE, NOPORT, TEGRA_INTR_HDMI },
+};
+
int
tegraio_match(device_t parent, cfdata_t cf, void *aux)
{
@@ -150,6 +159,8 @@ tegraio_attach(device_t parent, device_t
tegraio_scan(self, tegra_ahb_a2_bsh,
tegra_ahb_a2_locators, __arraycount(tegra_ahb_a2_locators));
tegraio_scan(self, (bus_space_handle_t)NULL,
+ tegra_ghost_locators, __arraycount(tegra_ghost_locators));
+ tegraio_scan(self, (bus_space_handle_t)NULL,
tegra_pcie_locators, __arraycount(tegra_pcie_locators));
}
Index: src/sys/arch/arm/nvidia/tegra_var.h
diff -u src/sys/arch/arm/nvidia/tegra_var.h:1.16 src/sys/arch/arm/nvidia/tegra_var.h:1.17
--- src/sys/arch/arm/nvidia/tegra_var.h:1.16 Fri May 15 11:50:30 2015
+++ src/sys/arch/arm/nvidia/tegra_var.h Mon May 18 19:32:48 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_var.h,v 1.16 2015/05/15 11:50:30 jmcneill Exp $ */
+/* $NetBSD: tegra_var.h,v 1.17 2015/05/18 19:32:48 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -53,6 +53,18 @@ struct tegraio_attach_args {
bus_dma_tag_t tio_coherent_dmat;
};
+struct tegrafb_attach_args {
+ bool tfb_console;
+ bus_dma_tag_t tfb_dmat;
+ bus_dmamap_t tfb_dmamap;
+ void *tfb_dmap;
+ u_int tfb_width;
+ u_int tfb_height;
+ u_int tfb_depth;
+ u_int tfb_stride;
+ device_t tfb_outputdev;
+};
+
extern struct bus_space armv7_generic_bs_tag;
extern struct bus_space armv7_generic_a4x_bs_tag;
extern bus_space_handle_t tegra_host1x_bsh;
@@ -81,6 +93,7 @@ u_int tegra_car_pllx_rate(void);
void tegra_car_pllx_set_rate(u_int, u_int, u_int);
u_int tegra_car_pllu_rate(void);
u_int tegra_car_pllp0_rate(void);
+u_int tegra_car_plld2_rate(void);
u_int tegra_car_uart_rate(u_int);
u_int tegra_car_periph_sdmmc_rate(u_int);
int tegra_car_periph_sdmmc_set_div(u_int, u_int);
@@ -90,6 +103,8 @@ void tegra_car_periph_sata_enable(void);
int tegra_car_periph_i2c_enable(u_int, u_int);
void tegra_car_utmip_init(void);
void tegra_car_utmip_enable(u_int);
+void tegra_car_hdmi_enable(u_int);
+int tegra_car_dc_enable(u_int);
struct tegra_gpio_pin;
struct tegra_gpio_pin *tegra_gpio_acquire(const char *, u_int);
@@ -126,6 +141,11 @@ psize_t tegra_mc_memsize(void);
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 *);
+void tegra_dc_hdmi_start(device_t);
+
#define TEGRA_CPUFREQ_MAX 16
struct tegra_cpufreq_func {
u_int (*set_rate)(u_int);
Index: src/sys/arch/evbarm/conf/JETSONTK1
diff -u src/sys/arch/evbarm/conf/JETSONTK1:1.20 src/sys/arch/evbarm/conf/JETSONTK1:1.21
--- src/sys/arch/evbarm/conf/JETSONTK1:1.20 Sat May 16 11:49:01 2015
+++ src/sys/arch/evbarm/conf/JETSONTK1 Mon May 18 19:32:48 2015
@@ -1,5 +1,5 @@
#
-# $NetBSD: JETSONTK1,v 1.20 2015/05/16 11:49:01 jmcneill Exp $
+# $NetBSD: JETSONTK1,v 1.21 2015/05/18 19:32:48 jmcneill Exp $
#
# NVIDIA Jetson TK1 - Tegra K1 development kit
# https://developer.nvidia.com/jetson-tk1
@@ -116,6 +116,28 @@ wd* at atabus? drive ?
#options HDAUDIO_ENABLE_HDMI
#options HDAUDIO_ENABLE_DISPLAYPORT
+# Display controller
+tegradc0 at tegraio? port 0 # DISPLAYA
+tegradc1 at tegraio? port 1 # DISPLAYB
+genfb* at tegradc?
+wsdisplay* at genfb?
+options VCONS_DRAW_INTR
+options WSEMUL_VT100
+options WS_DEFAULT_FG=WSCOL_WHITE
+options WS_DEFAULT_BG=WSCOL_BLACK
+options WS_KERNEL_FG=WSCOL_GREEN
+options WS_KERNEL_BG=WSCOL_BLACK
+options WSDISPLAY_COMPAT_PCVT
+options WSDISPLAY_COMPAT_SYSCONS
+options WSDISPLAY_COMPAT_USL
+options WSDISPLAY_COMPAT_RAWKBD
+options WSDISPLAY_DEFAULTSCREENS=4
+pseudo-device wsmux
+pseudo-device wsfont
+
+# HDMI
+tegrahdmi0 at tegraio? # HDMI
+
# USB 2.0
ehci0 at tegraio? port 0 # USB1
ehci1 at tegraio? port 1 # USB2
Index: src/sys/arch/evbarm/tegra/tegra_machdep.c
diff -u src/sys/arch/evbarm/tegra/tegra_machdep.c:1.15 src/sys/arch/evbarm/tegra/tegra_machdep.c:1.16
--- src/sys/arch/evbarm/tegra/tegra_machdep.c:1.15 Thu May 14 00:02:00 2015
+++ src/sys/arch/evbarm/tegra/tegra_machdep.c Mon May 18 19:32:48 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_machdep.c,v 1.15 2015/05/14 00:02:00 jmcneill Exp $ */
+/* $NetBSD: tegra_machdep.c,v 1.16 2015/05/18 19:32:48 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_machdep.c,v 1.15 2015/05/14 00:02:00 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_machdep.c,v 1.16 2015/05/18 19:32:48 jmcneill Exp $");
#include "opt_tegra.h"
#include "opt_machdep.h"
@@ -356,6 +356,17 @@ consinit(void)
#endif
}
+static bool
+tegra_bootconf_match(const char *key, const char *val)
+{
+ char *s;
+
+ if (!get_bootconf_option(boot_args, key, BOOTOPT_TYPE_STRING, &s))
+ return false;
+
+ return strncmp(s, val, strlen(val)) == 0;
+}
+
void
tegra_device_register(device_t self, void *aux)
{
@@ -377,6 +388,14 @@ tegra_device_register(device_t self, voi
tegra_cpuinit();
}
+ if (device_is_a(self, "tegradc")
+ && tegra_bootconf_match("console", "fb")) {
+ prop_dictionary_set_bool(dict, "is_console", true);
+#if NUKBD > 0
+ ukbd_cnattach();
+#endif
+ }
+
#ifdef BOARD_JETSONTK1
if (device_is_a(self, "sdhc")
&& device_is_a(device_parent(self), "tegraio")) {
@@ -406,5 +425,13 @@ tegra_device_register(device_t self, voi
prop_dictionary_set_cstring(dict, "vbus-gpio", "N5");
}
}
+
+ if (device_is_a(self, "tegrahdmi")) {
+ prop_dictionary_set_cstring(dict, "hpd-gpio", "N7");
+ prop_dictionary_set_cstring(dict, "pll-gpio", "H7");
+ prop_dictionary_set_cstring(dict, "power-gpio", "K6");
+ prop_dictionary_set_cstring(dict, "ddc-device", "ddc0");
+ prop_dictionary_set_cstring(dict, "display-device", "tegradc1");
+ }
#endif
}
Added files:
Index: src/sys/arch/arm/nvidia/tegra_dc.c
diff -u /dev/null src/sys/arch/arm/nvidia/tegra_dc.c:1.1
--- /dev/null Mon May 18 19:32:48 2015
+++ src/sys/arch/arm/nvidia/tegra_dc.c Mon May 18 19:32:48 2015
@@ -0,0 +1,354 @@
+/* $NetBSD: tegra_dc.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2015 Jared D. McNeill <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#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 $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+
+#include <dev/videomode/videomode.h>
+
+#include <arm/nvidia/tegra_reg.h>
+#include <arm/nvidia/tegra_dcreg.h>
+#include <arm/nvidia/tegra_var.h>
+
+#define TEGRA_DC_NPORTS 2
+#define TEGRA_DC_DEPTH 32
+#define TEGRA_DC_FBALIGN 16
+
+static int tegra_dc_match(device_t, cfdata_t, void *);
+static void tegra_dc_attach(device_t, device_t, void *);
+
+struct tegra_dc_softc {
+ device_t sc_dev;
+ bus_space_tag_t sc_bst;
+ bus_space_handle_t sc_bsh;
+ bus_dma_tag_t sc_dmat;
+ int sc_port;
+
+ bus_dma_segment_t sc_dmasegs[1];
+ bus_size_t sc_dmasize;
+ bus_dmamap_t sc_dmamap;
+ void *sc_dmap;
+
+ device_t sc_fbdev;
+};
+
+static int tegra_dc_print(void *, const char *);
+static int tegra_dc_allocmem(struct tegra_dc_softc *, bus_size_t);
+static int tegra_dc_init(struct tegra_dc_softc *,
+ const struct videomode *);
+static void tegra_dc_init_win(struct tegra_dc_softc *,
+ const struct videomode *);
+static void tegra_dc_init_disp(struct tegra_dc_softc *,
+ const struct videomode *);
+static void tegra_dc_update(struct tegra_dc_softc *);
+
+CFATTACH_DECL_NEW(tegra_dc, sizeof(struct tegra_dc_softc),
+ tegra_dc_match, tegra_dc_attach, NULL, NULL);
+
+#define DC_READ(sc, reg) \
+ bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
+#define DC_WRITE(sc, reg, val) \
+ bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
+#define DC_SET_CLEAR(sc, reg, set, clr) \
+ tegra_reg_set_clear((sc)->sc_bst, (sc)->sc_bsh, (reg), (set), (clr))
+
+static int
+tegra_dc_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct tegraio_attach_args * const tio = aux;
+ const struct tegra_locators * const loc = &tio->tio_loc;
+
+ if (loc->loc_port == TEGRAIOCF_PORT_DEFAULT ||
+ loc->loc_port >= TEGRA_DC_NPORTS)
+ return 0;
+
+ return 1;
+}
+
+static void
+tegra_dc_attach(device_t parent, device_t self, void *aux)
+{
+ struct tegra_dc_softc * const sc = device_private(self);
+ struct tegraio_attach_args * const tio = aux;
+ const struct tegra_locators * const loc = &tio->tio_loc;
+
+ sc->sc_dev = self;
+ sc->sc_port = loc->loc_port;
+ sc->sc_bst = tio->tio_bst;
+ sc->sc_dmat = tio->tio_dmat;
+ if (bus_space_map(sc->sc_bst, TEGRA_GHOST_BASE + loc->loc_offset,
+ loc->loc_size, 0, &sc->sc_bsh) != 0) {
+ aprint_error(": couldn't map DC\n");
+ return;
+ }
+
+ aprint_naive("\n");
+ aprint_normal(": DISPLAY%c\n", loc->loc_port + 'A');
+}
+
+
+static int
+tegra_dc_allocmem(struct tegra_dc_softc *sc, bus_size_t size)
+{
+ int error, nsegs;
+
+ error = bus_dmamem_alloc(sc->sc_dmat, size, TEGRA_DC_FBALIGN, 0,
+ sc->sc_dmasegs, 1, &nsegs, BUS_DMA_WAITOK);
+ if (error)
+ return error;
+ error = bus_dmamem_map(sc->sc_dmat, sc->sc_dmasegs, nsegs, size,
+ &sc->sc_dmap, BUS_DMA_WAITOK | BUS_DMA_COHERENT);
+ if (error)
+ goto free;
+ error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
+ BUS_DMA_WAITOK, &sc->sc_dmamap);
+ if (error)
+ goto unmap;
+ error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap, sc->sc_dmap,
+ size, NULL, BUS_DMA_WAITOK);
+ if (error)
+ goto destroy;
+
+ sc->sc_dmasize = size;
+
+ return 0;
+
+destroy:
+ bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmamap);
+unmap:
+ bus_dmamem_unmap(sc->sc_dmat, sc->sc_dmap, size);
+free:
+ bus_dmamem_free(sc->sc_dmat, sc->sc_dmasegs, nsegs);
+
+ sc->sc_dmasize = 0;
+ sc->sc_dmap = NULL;
+
+ return error;
+}
+
+static int
+tegra_dc_print(void *aux, const char *pnp)
+{
+ const struct tegrafb_attach_args * const tfb = aux;
+
+ aprint_normal(" output %s", device_xname(tfb->tfb_outputdev));
+
+ return UNCONF;
+}
+
+static int
+tegra_dc_init(struct tegra_dc_softc *sc, const struct videomode *mode)
+{
+ tegra_car_dc_enable(sc->sc_port);
+
+ tegra_dc_init_win(sc, mode);
+ tegra_dc_init_disp(sc, mode);
+ tegra_dc_update(sc);
+ return 0;
+}
+
+
+static void
+tegra_dc_init_win(struct tegra_dc_softc *sc, const struct videomode *mode)
+{
+ /* Enable window A programming */
+ DC_WRITE(sc, DC_CMD_DISPLAY_WINDOW_HEADER_REG,
+ DC_CMD_DISPLAY_WINDOW_HEADER_WINDOW_A_SELECT);
+
+ /* Set colour depth to ARGB8888 */
+ DC_WRITE(sc, DC_WINC_A_COLOR_DEPTH_REG,
+ __SHIFTIN(DC_WINC_A_COLOR_DEPTH_DEPTH_T_A8R8G8B8,
+ DC_WINC_A_COLOR_DEPTH_DEPTH));
+
+ /* Disable byte swapping */
+ DC_WRITE(sc, DC_WINC_A_BYTE_SWAP_REG,
+ __SHIFTIN(DC_WINC_A_BYTE_SWAP_SWAP_NOSWAP,
+ DC_WINC_A_BYTE_SWAP_SWAP));
+
+ /* Window position, size, stride */
+ DC_WRITE(sc, DC_WINC_A_POSITION_REG,
+ __SHIFTIN(0, DC_WINC_A_POSITION_V) |
+ __SHIFTIN(0, DC_WINC_A_POSITION_H));
+ DC_WRITE(sc, DC_WINC_A_SIZE_REG,
+ __SHIFTIN(mode->vdisplay, DC_WINC_A_SIZE_V) |
+ __SHIFTIN(mode->hdisplay, DC_WINC_A_SIZE_H));
+ DC_WRITE(sc, DC_WINC_A_PRESCALED_SIZE_REG,
+ __SHIFTIN(mode->vdisplay, DC_WINC_A_PRESCALED_SIZE_V) |
+ __SHIFTIN(mode->hdisplay * (TEGRA_DC_DEPTH / 8),
+ DC_WINC_A_PRESCALED_SIZE_H));
+ DC_WRITE(sc, DC_WINC_A_LINE_STRIDE_REG,
+ __SHIFTIN(mode->hdisplay * (TEGRA_DC_DEPTH / 8),
+ DC_WINC_A_LINE_STRIDE_LINE_STRIDE));
+
+ /* Framebuffer start address */
+ DC_WRITE(sc, DC_WINBUF_A_START_ADDR_REG,
+ (uint32_t)sc->sc_dmamap->dm_segs[0].ds_addr);
+
+ /* Surface kind */
+ DC_WRITE(sc, DC_WINBUF_A_SURFACE_KIND_REG,
+ __SHIFTIN(DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND_PITCH,
+ DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND));
+
+ /* Enable window A */
+ DC_WRITE(sc, DC_WINC_A_WIN_OPTIONS_REG,
+ DC_WINC_A_WIN_OPTIONS_WIN_ENABLE);
+}
+
+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 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 vfp = mode->vsync_start - mode->vdisplay;
+
+ /* Pixel clock */
+ DC_WRITE(sc, DC_DISP_DISP_CLOCK_CONTROL_REG, 0);
+
+ /* Mode timings */
+ DC_WRITE(sc, DC_DISP_REF_TO_SYNC_REG,
+ __SHIFTIN(1, DC_DISP_REF_TO_SYNC_V) |
+ __SHIFTIN(1, DC_DISP_REF_TO_SYNC_H));
+ DC_WRITE(sc, DC_DISP_SYNC_WIDTH_REG,
+ __SHIFTIN(vspw, DC_DISP_SYNC_WIDTH_V) |
+ __SHIFTIN(hspw, DC_DISP_SYNC_WIDTH_H));
+ DC_WRITE(sc, DC_DISP_BACK_PORCH_REG,
+ __SHIFTIN(vbp, DC_DISP_BACK_PORCH_V) |
+ __SHIFTIN(hbp, DC_DISP_BACK_PORCH_H));
+ DC_WRITE(sc, DC_DISP_FRONT_PORCH_REG,
+ __SHIFTIN(vfp, DC_DISP_FRONT_PORCH_V) |
+ __SHIFTIN(hfp, DC_DISP_FRONT_PORCH_H));
+ DC_WRITE(sc, DC_DISP_DISP_ACTIVE_REG,
+ __SHIFTIN(mode->vdisplay, DC_DISP_DISP_ACTIVE_V) |
+ __SHIFTIN(mode->hdisplay, DC_DISP_DISP_ACTIVE_H));
+
+ /* Enable continus display mode */
+ DC_SET_CLEAR(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);
+
+ /* Enable power */
+ DC_SET_CLEAR(sc, DC_CMD_DISPLAY_POWER_CONTROL_REG,
+ DC_CMD_DISPLAY_POWER_CONTROL_PM1_ENABLE |
+ DC_CMD_DISPLAY_POWER_CONTROL_PM0_ENABLE |
+ DC_CMD_DISPLAY_POWER_CONTROL_PW4_ENABLE |
+ DC_CMD_DISPLAY_POWER_CONTROL_PW3_ENABLE |
+ DC_CMD_DISPLAY_POWER_CONTROL_PW2_ENABLE |
+ DC_CMD_DISPLAY_POWER_CONTROL_PW1_ENABLE |
+ DC_CMD_DISPLAY_POWER_CONTROL_PW0_ENABLE,
+ 0);
+}
+
+static void
+tegra_dc_update(struct tegra_dc_softc *sc)
+{
+ /* Commit settings */
+ DC_WRITE(sc, DC_CMD_STATE_CONTROL_REG,
+ DC_CMD_STATE_CONTROL_GENERAL_UPDATE);
+ DC_WRITE(sc, DC_CMD_STATE_CONTROL_REG,
+ DC_CMD_STATE_CONTROL_GENERAL_ACT_REQ);
+}
+
+int
+tegra_dc_port(device_t dev)
+{
+ struct tegra_dc_softc * const sc = device_private(dev);
+
+ return sc->sc_port;
+}
+
+int
+tegra_dc_enable(device_t dev, device_t outputdev,
+ const struct videomode *mode)
+{
+ struct tegra_dc_softc * const sc = device_private(dev);
+ prop_dictionary_t prop = device_properties(dev);
+ bool is_console = false;
+ int error;
+
+ KASSERT(sc->sc_fbdev == NULL);
+
+ prop_dictionary_get_bool(prop, "is_console", &is_console);
+
+ 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;
+ error = tegra_dc_allocmem(sc, dmasize);
+ if (error) {
+ aprint_error_dev(dev,
+ "failed to allocate %u bytes of video memory: %d\n",
+ (u_int)dmasize, error);
+ return error;
+ }
+
+ error = tegra_dc_init(sc, mode);
+ if (error) {
+ aprint_error_dev(dev,
+ "failed to initialize display controller: %d\n", error);
+ return error;
+ }
+
+ struct tegrafb_attach_args tfb = {
+ .tfb_console = is_console,
+ .tfb_dmat = sc->sc_dmat,
+ .tfb_dmamap = sc->sc_dmamap,
+ .tfb_dmap = sc->sc_dmap,
+ .tfb_width = mode->hdisplay,
+ .tfb_height = mode->vdisplay,
+ .tfb_depth = depth,
+ .tfb_stride = mode->hdisplay * (depth / 8),
+ .tfb_outputdev = outputdev,
+ };
+
+ sc->sc_fbdev = config_found(sc->sc_dev, &tfb, tegra_dc_print);
+
+ return 0;
+}
+
+void
+tegra_dc_hdmi_start(device_t dev)
+{
+ struct tegra_dc_softc * const sc = device_private(dev);
+
+ DC_SET_CLEAR(sc, DC_DISP_DISP_WIN_OPTIONS_REG,
+ DC_DISP_DISP_WIN_OPTIONS_HDMI_ENABLE, 0);
+
+ tegra_dc_update(sc);
+}
Index: src/sys/arch/arm/nvidia/tegra_dcreg.h
diff -u /dev/null src/sys/arch/arm/nvidia/tegra_dcreg.h:1.1
--- /dev/null Mon May 18 19:32:48 2015
+++ src/sys/arch/arm/nvidia/tegra_dcreg.h Mon May 18 19:32:48 2015
@@ -0,0 +1,421 @@
+/* $NetBSD: tegra_dcreg.h,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2015 Jared D. McNeill <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARM_TEGRA_DCREG_H
+#define _ARM_TEGRA_DCREG_H
+
+/*
+ * Display CMD registers
+ */
+#define DC_CMD_GENERAL_INCR_SYNCPT_REG 0x000
+#define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL_REG 0x004
+#define DC_CMD_GENERAL_INCR_SYNCPT_ERROR_REG 0x008
+#define DC_CMD_WIN_A_INCR_SYNCPT_REG 0x020
+#define DC_CMD_WIN_A_INCR_SYNCPT_CNTRL_REG 0x024
+#define DC_CMD_WIN_A_INCR_SYNCPT_ERROR_REG 0x028
+#define DC_CMD_WIN_B_INCR_SYNCPT_REG 0x040
+#define DC_CMD_WIN_B_INCR_SYNCPT_CNTRL_REG 0x044
+#define DC_CMD_WIN_B_INCR_SYNCPT_ERROR_REG 0x048
+#define DC_CMD_WIN_C_INCR_SYNCPT_REG 0x060
+#define DC_CMD_WIN_C_INCR_SYNCPT_CNTRL_REG 0x064
+#define DC_CMD_WIN_C_INCR_SYNCPT_ERROR_REG 0x068
+#define DC_CMD_CONT_SYNCPT_VSYNC_REG 0x0a0
+#define DC_CMD_CTXSW_REG 0x0c0
+#define DC_CMD_DISPLAY_COMMAND_OPTION0_REG 0x0c4
+
+#define DC_CMD_DISPLAY_COMMAND_REG 0x0c8
+#define DC_CMD_DISPLAY_COMMAND_RAISE_CHANNEL_ID __BITS(30,27)
+#define DC_CMD_DISPLAY_COMMAND_RAISE_VECTOR __BITS(26,22)
+#define DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE __BITS(6,5)
+#define DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE_STOP 0
+#define DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE_C_DISPLAY 1
+#define DC_CMD_DISPLAY_COMMAND_DISPLAY_CTRL_MODE_NC_DISPLAY 2
+#define DC_CMD_DISPLAY_COMMAND_RAISE __BIT(0)
+
+#define DC_CMD_SIGNAL_RAISE_REG 0x0cc
+
+#define DC_CMD_DISPLAY_POWER_CONTROL_REG 0x0d8
+#define DC_CMD_DISPLAY_POWER_CONTROL_HSPI_ENABLE __BIT(25)
+#define DC_CMD_DISPLAY_POWER_CONTROL_SPI_ENABLE __BIT(24)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PM1_ENABLE __BIT(18)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PM0_ENABLE __BIT(16)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PW4_ENABLE __BIT(8)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PW3_ENABLE __BIT(6)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PW2_ENABLE __BIT(4)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PW1_ENABLE __BIT(2)
+#define DC_CMD_DISPLAY_POWER_CONTROL_PW0_ENABLE __BIT(0)
+
+#define DC_CMD_INT_STATUS_REG 0x0dc
+#define DC_CMD_INT_MASK_REG 0x0e0
+#define DC_CMD_INT_ENABLE_REG 0x0e4
+#define DC_CMD_INT_TYPE_REG 0x0e8
+#define DC_CMD_INT_POLARITY_REG 0x0ec
+#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_CONTROL_REG 0x104
+#define DC_CMD_STATE_CONTROL_NC_HOST_TRIG_ENABLE __BIT(24)
+#define DC_CMD_STATE_CONTROL_CURSOR_UPDATE __BIT(15)
+#define DC_CMD_STATE_CONTROL_WIN_D_UPDATE __BIT(12)
+#define DC_CMD_STATE_CONTROL_WIN_C_UPDATE __BIT(11)
+#define DC_CMD_STATE_CONTROL_WIN_B_UPDATE __BIT(10)
+#define DC_CMD_STATE_CONTROL_WIN_A_UPDATE __BIT(9)
+#define DC_CMD_STATE_CONTROL_GENERAL_UPDATE __BIT(8)
+#define DC_CMD_STATE_CONTROL_CURSOR_ACT_REQ __BIT(7)
+#define DC_CMD_STATE_CONTROL_WIN_D_ACT_REQ __BIT(4)
+#define DC_CMD_STATE_CONTROL_WIN_C_ACT_REQ __BIT(3)
+#define DC_CMD_STATE_CONTROL_WIN_B_ACT_REQ __BIT(2)
+#define DC_CMD_STATE_CONTROL_WIN_A_ACT_REQ __BIT(1)
+#define DC_CMD_STATE_CONTROL_GENERAL_ACT_REQ __BIT(0)
+
+#define DC_CMD_DISPLAY_WINDOW_HEADER_REG 0x108
+#define DC_CMD_DISPLAY_WINDOW_HEADER_WINDOW_D_SELECT __BIT(7)
+#define DC_CMD_DISPLAY_WINDOW_HEADER_WINDOW_C_SELECT __BIT(6)
+#define DC_CMD_DISPLAY_WINDOW_HEADER_WINDOW_B_SELECT __BIT(5)
+#define DC_CMD_DISPLAY_WINDOW_HEADER_WINDOW_A_SELECT __BIT(4)
+
+#define DC_CMD_REG_ACT_CONTROL_REG 0x10c
+#define DC_CMD_WIN_T_STATE_CONTROL_REG 0x110
+#define DC_CMD_SECURE_CONTROL_REG 0x114
+#define DC_CMD_WIN_D_INCR_SYNCPT_REG 0x130
+#define DC_CMD_WIN_D_INCR_SYNCPT_CNTRL_REG 0x134
+#define DC_CMD_WIN_D_INCR_SYNCPT_ERROR_REG 0x138
+
+/*
+ * Display COM registers
+ */
+#define DC_COM_CRC_CONTROL_REG 0xc00
+#define DC_COM_CRC_CHECKSUM_REG 0xc04
+#define DC_COM_PIN_MISC_CONTROL_REG 0xc6c
+#define DC_COM_PM0_CONTROL_REG 0xc70
+#define DC_COM_PM0_DUTY_CYCLE_REG 0xc74
+#define DC_COM_SCRATCH_REGISTER_A_REG 0xc94
+#define DC_COM_SCRATCH_REGISTER_B_REG 0xc98
+#define DC_COM_CRC_CHECKSUM_LATCHED_REG 0xca4
+#define DC_COM_CMU_CSC_KRR_REG 0xca8
+#define DC_COM_CMU_CSC_KGR_REG 0xcac
+#define DC_COM_CMU_CSC_KBR_REG 0xcb0
+#define DC_COM_CMU_CSC_KRG_REG 0xcb4
+#define DC_COM_CMU_CSC_KGG_REG 0xcb8
+#define DC_COM_CMU_CSC_KBG_REG 0xcbc
+#define DC_COM_CMU_CSC_KRB_REG 0xcc0
+#define DC_COM_CMU_CSC_KGB_REG 0xcc4
+#define DC_COM_CMU_CSC_KBB_REG 0xcc8
+#define DC_COM_CMU_LUT_MASK_REG 0xccc
+#define DC_COM_CMU_LUT1_REG 0xcd8
+#define DC_COM_CMU_LUT2_REG 0xcdc
+
+/*
+ * Display DISP registers
+ */
+#define DC_DISP_DISP_SIGNAL_OPTIONS0_REG 0x1000
+
+#define DC_DISP_DISP_WIN_OPTIONS_REG 0x1008
+#define DC_DISP_DISP_WIN_OPTIONS_HDMI_ENABLE __BIT(30)
+#define DC_DISP_DISP_WIN_OPTIONS_DSI_ENABLE __BIT(29)
+#define DC_DISP_DISP_WIN_OPTIONS_SOR_ENABLE __BIT(28)
+#define DC_DISP_DISP_WIN_OPTIONS_CURSOR_ENABLE __BIT(16)
+
+#define DC_DISP_DISP_TIMING_OPTIONS_REG 0x1014
+
+#define DC_DISP_REF_TO_SYNC_REG 0x1018
+#define DC_DISP_REF_TO_SYNC_V __BITS(28,16)
+#define DC_DISP_REF_TO_SYNC_H __BITS(12,0)
+
+#define DC_DISP_SYNC_WIDTH_REG 0x101c
+#define DC_DISP_SYNC_WIDTH_V __BITS(28,16)
+#define DC_DISP_SYNC_WIDTH_H __BITS(12,0)
+
+#define DC_DISP_BACK_PORCH_REG 0x1020
+#define DC_DISP_BACK_PORCH_V __BITS(28,16)
+#define DC_DISP_BACK_PORCH_H __BITS(12,0)
+
+#define DC_DISP_DISP_ACTIVE_REG 0x1024
+#define DC_DISP_DISP_ACTIVE_V __BITS(28,16)
+#define DC_DISP_DISP_ACTIVE_H __BITS(12,0)
+
+#define DC_DISP_FRONT_PORCH_REG 0x1028
+#define DC_DISP_FRONT_PORCH_V __BITS(28,16)
+#define DC_DISP_FRONT_PORCH_H __BITS(12,0)
+
+#define DC_DISP_H_PULSE0_CONTROL_REG 0x102c
+#define DC_DISP_H_PULSE0_POSITION_A_REG 0x1030
+#define DC_DISP_H_PULSE0_POSITION_B_REG 0x1034
+#define DC_DISP_H_PULSE0_POSITION_C_REG 0x1038
+#define DC_DISP_H_PULSE0_POSITION_D_REG 0x103c
+#define DC_DISP_H_PULSE1_CONTROL_REG 0x1040
+#define DC_DISP_H_PULSE1_POSITION_A_REG 0x1044
+#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_POSITION_A_REG 0x1058
+#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
+#define DC_DISP_V_PULSE0_CONTROL_REG 0x1068
+#define DC_DISP_V_PULSE0_POSITION_A_REG 0x106c
+#define DC_DISP_V_PULSE0_POSITION_B_REG 0x1070
+#define DC_DISP_V_PULSE0_POSITION_C_REG 0x1074
+#define DC_DISP_V_PULSE1_CONTROL_REG 0x1078
+#define DC_DISP_V_PULSE1_POSITION_A_REG 0x107c
+#define DC_DISP_V_PULSE1_POSITION_B_REG 0x1080
+#define DC_DISP_V_PULSE1_POSITION_C_REG 0x1084
+#define DC_DISP_V_PULSE2_CONTROL_REG 0x1088
+#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_INTERFACE_CONTROL_REG 0x10bc
+#define DC_DISP_DISP_COLOR_CONTROL_REG 0x10c0
+#define DC_DISP_COLOR_KEY0_LOWER_REG 0x10d8
+#define DC_DISP_COLOR_KEY0_UPPER_REG 0x10dc
+#define DC_DISP_COLOR_KEY1_LOWER_REG 0x10e0
+#define DC_DISP_COLOR_KEY1_UPPER_REG 0x10e4
+#define DC_DISP_CURSOR_FOREGROUND_REG 0x10f0
+#define DC_DISP_CURSOR_BACKGROUND_REG 0x10f4
+#define DC_DISP_CURSOR_START_ADDR_REG 0x10f8
+#define DC_DISP_CURSOR_START_ADDR_NS_REG 0x10fc
+#define DC_DISP_CURSOR_POSITION_REG 0x1100
+#define DC_DISP_CURSOR_POSITION_NS_REG 0x1104
+#define DC_DISP_DC_MCCIF_FIFOCTRL_REG 0x1200
+#define DC_DISP_MCCIF_DISPLAY0A_HYST_REG 0x1204
+#define DC_DISP_MCCIF_DISPLAY0B_HYST_REG 0x1208
+#define DC_DISP_MCCIF_DISPLAY0C_HYST_REG 0x120c
+#define DC_DISP_DISP_MISC_CONTROL_REG 0x1304
+#define DC_DISP_SD_CONTROL_REG 0x1308
+#define DC_DISP_SD_CSC_COEFF_REG 0x130c
+#define DC_DISP_SD_LUT_REG 0x1310
+#define DC_DISP_SD_FLICKER_CONTROL_REG 0x1334
+#define DC_DISP_SD_PIXEL_COUNT_REG 0x1338
+#define DC_DISP_SD_HISTOGRAM_REG 0x133c
+#define DC_DISP_SD_BL_PARAMETERS_REG 0x135c
+#define DC_DISP_SD_BL_TF_REG 0x1360
+#define DC_DISP_SD_BL_CONTROL_REG 0x1370
+#define DC_DISP_SD_HW_K_VALUES_REG 0x1374
+#define DC_DISP_SD_MAN_K_VALUES_REG 0x1378
+#define DC_DISP_SD_K_LIMIT_REG 0x137c
+#define DC_DISP_SD_WINDOW_POSITION_REG 0x1380
+#define DC_DISP_SD_WINDOW_SIZE_REG 0x1384
+#define DC_DISP_SD_SOFT_CLIPPING_REG 0x1388
+#define DC_DISP_SD_SMOOTH_K_REG 0x138c
+#define DC_DISP_BLEND_BACKGROUND_COLOR_REG 0x1390
+#define DC_DISP_INTERLACE_CONTROL_REG 0x1394
+#define DC_DISP_INTERLACE_FIELD2_REF_TO_SYNC_REG 0x1398
+#define DC_DISP_INTERLACE_FIELD2_SYNC_WIDTH_REG 0x139c
+#define DC_DISP_INTERLACE_FIELD2_BACK_PORCH_REG 0x13a0
+#define DC_DISP_INTERLACE_FIELD2_FRONT_PORCH_REG 0x13a4
+#define DC_DISP_INTERLACE_FIELD2_DISP_ACTIVE_REG 0x13a8
+#define DC_DISP_CURSOR_UNDERFLOW_CTRL_REG 0x13ac
+#define DC_DISP_CURSOR_START_ADDR_HI_REG 0x13b0
+#define DC_DISP_CURSOR_START_ADDR_HI_NS_REG 0x13b4
+#define DC_DISP_CURSOR_INTERLACE_CONTROL_REG 0x13b8
+#define DC_DISP_CSC2_CONTROL_REG 0x13bc
+#define DC_DISP_BLEND_CURSOR_CONTROL_REG 0x13c4
+#define DC_DISP_DVFS_CURSOR_CONTROL_REG 0x13c8
+#define DC_DISP_CURSOR_UFLOW_DBG_PIXEL_REG 0x13cc
+#define DC_DISP_CURSOR_SPOOLUP_CONTROL_REG 0x13d0
+#define DC_DISP_DISPLAY_CLK_GATE_OVERRIDE_REG 0x13d4
+#define DC_DISP_DISPLAY_DBG_TIMING_REG 0x13d8
+#define DC_DISP_DISPLAY_SPARE0_REG 0x13dc
+#define DC_DISP_DISPLAY_SPARE1_REG 0x13e0
+
+/*
+ * Window A registers
+ */
+#define DC_WINC_A_COLOR_PALETTE_REG 0x1400
+#define DC_WINC_A_PALETTE_COLOR_EXT_REG 0x1800
+#define DC_WINC_A_H_FILTER_P00_REG 0x1804
+#define DC_WINC_A_H_FILTER_P01_REG 0x1808
+#define DC_WINC_A_H_FILTER_P02_REG 0x180c
+#define DC_WINC_A_H_FILTER_P03_REG 0x1810
+#define DC_WINC_A_H_FILTER_P04_REG 0x1814
+#define DC_WINC_A_H_FILTER_P05_REG 0x1818
+#define DC_WINC_A_H_FILTER_P06_REG 0x181c
+#define DC_WINC_A_H_FILTER_P07_REG 0x1820
+#define DC_WINC_A_H_FILTER_P08_REG 0x1824
+#define DC_WINC_A_H_FILTER_P09_REG 0x1828
+#define DC_WINC_A_H_FILTER_P0A_REG 0x182c
+#define DC_WINC_A_H_FILTER_P0B_REG 0x1830
+#define DC_WINC_A_H_FILTER_P0C_REG 0x1834
+#define DC_WINC_A_H_FILTER_P0D_REG 0x1838
+#define DC_WINC_A_H_FILTER_P0E_REG 0x183c
+#define DC_WINC_A_H_FILTER_P0F_REG 0x1840
+#define DC_WINC_A_CSC_YOF_REG 0x1844
+#define DC_WINC_A_CSC_KYRGB_REG 0x1848
+#define DC_WINC_A_CSC_KUR_REG 0x184c
+#define DC_WINC_A_CSC_KVR_REG 0x1850
+#define DC_WINC_A_CSC_KUG_REG 0x1854
+#define DC_WINC_A_CSC_KVG_REG 0x1858
+#define DC_WINC_A_CSC_KUB_REG 0x185c
+#define DC_WINC_A_CSC_KVB_REG 0x1860
+#define DC_WINC_A_V_FILTER_P00_REG 0x1864
+#define DC_WINC_A_V_FILTER_P01_REG 0x1868
+#define DC_WINC_A_V_FILTER_P02_REG 0x186c
+#define DC_WINC_A_V_FILTER_P03_REG 0x1870
+#define DC_WINC_A_V_FILTER_P04_REG 0x1874
+#define DC_WINC_A_V_FILTER_P05_REG 0x1878
+#define DC_WINC_A_V_FILTER_P06_REG 0x187c
+#define DC_WINC_A_V_FILTER_P07_REG 0x1880
+#define DC_WINC_A_V_FILTER_P08_REG 0x1884
+#define DC_WINC_A_V_FILTER_P09_REG 0x1888
+#define DC_WINC_A_V_FILTER_P0A_REG 0x188c
+#define DC_WINC_A_V_FILTER_P0B_REG 0x1890
+#define DC_WINC_A_V_FILTER_P0C_REG 0x1894
+#define DC_WINC_A_V_FILTER_P0D_REG 0x1898
+#define DC_WINC_A_V_FILTER_P0E_REG 0x189c
+#define DC_WINC_A_V_FILTER_P0F_REG 0x18a0
+#define DC_WINC_A_H_FILTER_HI_P00_REG 0x18a4
+#define DC_WINC_A_H_FILTER_HI_P01_REG 0x18a8
+#define DC_WINC_A_H_FILTER_HI_P02_REG 0x18ac
+#define DC_WINC_A_H_FILTER_HI_P03_REG 0x18b0
+#define DC_WINC_A_H_FILTER_HI_P04_REG 0x18b4
+#define DC_WINC_A_H_FILTER_HI_P05_REG 0x18b8
+#define DC_WINC_A_H_FILTER_HI_P06_REG 0x18bc
+#define DC_WINC_A_H_FILTER_HI_P07_REG 0x18c0
+#define DC_WINC_A_H_FILTER_HI_P08_REG 0x18c4
+#define DC_WINC_A_H_FILTER_HI_P09_REG 0x18c8
+#define DC_WINC_A_H_FILTER_HI_P0A_REG 0x18cc
+#define DC_WINC_A_H_FILTER_HI_P0B_REG 0x18d0
+#define DC_WINC_A_H_FILTER_HI_P0C_REG 0x18d4
+#define DC_WINC_A_H_FILTER_HI_P0D_REG 0x18d8
+#define DC_WINC_A_H_FILTER_HI_P0E_REG 0x18dc
+#define DC_WINC_A_H_FILTER_HI_P0F_REG 0x18e0
+
+#define DC_WINC_A_WIN_OPTIONS_REG 0x1c00
+#define DC_WINC_A_WIN_OPTIONS_H_FILTER_MODE __BIT(31)
+#define DC_WINC_A_WIN_OPTIONS_WIN_ENABLE __BIT(30)
+#define DC_WINC_A_WIN_OPTIONS_INTERLACE_ENABLE __BIT(23)
+#define DC_WINC_A_WIN_OPTIONS_YUV_RANGE_EXPAND __BIT(22)
+#define DC_WINC_A_WIN_OPTIONS_DV_ENABLE __BIT(20)
+#define DC_WINC_A_WIN_OPTIONS_CSC_ENABLE __BIT(18)
+#define DC_WINC_A_WIN_OPTIONS_CP_ENABLE __BIT(16)
+#define DC_WINC_A_WIN_OPTIONS_V_FILTER_UV_ALIGN __BIT(14)
+#define DC_WINC_A_WIN_OPTIONS_V_FILTER_OPTIMIZE __BIT(12)
+#define DC_WINC_A_WIN_OPTIONS_V_FILTER_ENABLE __BIT(10)
+#define DC_WINC_A_WIN_OPTIONS_H_FILTER_ENABLE __BIT(8)
+#define DC_WINC_A_WIN_OPTIONS_COLOR_EXPAND __BIT(6)
+#define DC_WINC_A_WIN_OPTIONS_SCAN_COLUMN __BIT(4)
+#define DC_WINC_A_WIN_OPTIONS_V_DIRECTION __BIT(2)
+#define DC_WINC_A_WIN_OPTIONS_H_DIRECTION __BIT(0)
+
+#define DC_WINC_A_BYTE_SWAP_REG 0x1c04
+#define DC_WINC_A_BYTE_SWAP_SWAP __BITS(2,0)
+#define DC_WINC_A_BYTE_SWAP_SWAP_NOSWAP 0
+
+#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_POSITION_REG 0x1c10
+#define DC_WINC_A_POSITION_V __BITS(28,16)
+#define DC_WINC_A_POSITION_H __BITS(12,0)
+
+#define DC_WINC_A_SIZE_REG 0x1c14
+#define DC_WINC_A_SIZE_V __BITS(28,16)
+#define DC_WINC_A_SIZE_H __BITS(12,0)
+
+#define DC_WINC_A_PRESCALED_SIZE_REG 0x1c18
+#define DC_WINC_A_PRESCALED_SIZE_V __BITS(28,16)
+#define DC_WINC_A_PRESCALED_SIZE_H __BITS(14,0)
+
+#define DC_WINC_A_H_INITIAL_DDA_REG 0x1c1c
+#define DC_WINC_A_V_INITIAL_DDA_REG 0x1c20
+#define DC_WINC_A_DDA_INCREMENT_REG 0x1c24
+
+#define DC_WINC_A_LINE_STRIDE_REG 0x1c28
+#define DC_WINC_A_LINE_STRIDE_UV_LINE_STRIDE __BITS(31,16)
+#define DC_WINC_A_LINE_STRIDE_LINE_STRIDE __BITS(15,0)
+
+#define DC_WINC_A_DV_CONTROL_REG 0x1c38
+#define DC_WINC_A_BLEND_LAYER_CONTROL_REG 0x1c58
+#define DC_WINC_A_BLEND_MATCH_SELECT_REG 0x1c5c
+#define DC_WINC_A_BLEND_NOMATCH_SELECT_REG 0x1c60
+#define DC_WINC_A_BLEND_ALPHA_1BIT_REG 0x1c64
+
+/*
+ * WINBUF_A registers
+ */
+#define DC_WINBUF_A_START_ADDR_REG 0x2000
+#define DC_WINBUF_A_START_ADDR_NS_REG 0x2004
+#define DC_WINBUF_A_START_ADDR_U_REG 0x2008
+#define DC_WINBUF_A_START_ADDR_U_NS_REG 0x200c
+#define DC_WINBUF_A_START_ADDR_V_REG 0x2010
+#define DC_WINBUF_A_START_ADDR_V_NS_REG 0x2014
+#define DC_WINBUF_A_ADDR_H_OFFSET_REG 0x2018
+#define DC_WINBUF_A_ADDR_H_OFFSET_NS_REG 0x201c
+#define DC_WINBUF_A_ADDR_V_OFFSET_REG 0x2020
+#define DC_WINBUF_A_ADDR_V_OFFSET_NS_REG 0x2024
+#define DC_WINBUF_A_UFLOW_STATUS_REG 0x2028
+
+#define DC_WINBUF_A_SURFACE_KIND_REG 0x202c
+#define DC_WINBUF_A_SURFACE_KIND_BLOCK_HEIGHT __BITS(6,4)
+#define DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND __BITS(1,0)
+#define DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND_PITCH 0
+#define DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND_TILED 1
+#define DC_WINBUF_A_SURFACE_KIND_SURFACE_KIND_BL_16B2 2
+
+#define DC_WINBUF_A_SURFACE_WEIGHT_REG 0x2030
+#define DC_WINBUF_A_START_ADDR_HI_REG 0x2034
+#define DC_WINBUF_A_START_ADDR_HI_NS_REG 0x2038
+#define DC_WINBUF_A_START_ADDR_HI_U_REG 0x203c
+#define DC_WINBUF_A_START_ADDR_HI_U_NS_REG 0x2040
+#define DC_WINBUF_A_START_ADDR_HI_V_REG 0x2044
+#define DC_WINBUF_A_START_ADDR_HI_V_NS_REG 0x2048
+#define DC_WINBUF_A_START_ADDR_FIELD2_REG 0x204c
+#define DC_WINBUF_A_START_ADDR_FIELD2_NS_REG 0x2050
+#define DC_WINBUF_A_START_ADDR_FIELD2_U_REG 0x2054
+#define DC_WINBUF_A_START_ADDR_FIELD2_U_NS_REG 0x2058
+#define DC_WINBUF_A_START_ADDR_FIELD2_V_REG 0x205c
+#define DC_WINBUF_A_START_ADDR_FIELD2_V_NS_REG 0x2060
+#define DC_WINBUF_A_START_ADDR_FIELD2_HI_REG 0x2064
+#define DC_WINBUF_A_START_ADDR_FIELD2_HI_NS_REG 0x2068
+#define DC_WINBUF_A_START_ADDR_FIELD2_HI_U_REG 0x206c
+#define DC_WINBUF_A_START_ADDR_FIELD2_HI_U_NS_REG 0x2070
+#define DC_WINBUF_A_START_ADDR_FIELD2_HI_V_REG 0x2074
+#define DC_WINBUF_A_START_ADDR_FIELD2_HI_V_NS_REG 0x2078
+#define DC_WINBUF_A_ADDR_H_OFFSET_FIELD2_REG 0x207c
+#define DC_WINBUF_A_ADDR_H_OFFSET_FIELD2_NS_REG 0x2080
+#define DC_WINBUF_A_ADDR_V_OFFSET_FIELD2_REG 0x2084
+#define DC_WINBUF_A_ADDR_V_OFFSET_FIELD2_NS_REG 0x2088
+#define DC_WINBUF_A_UFLOW_CTRL_REG 0x2090
+#define DC_WINBUF_A_UFLOW_DBG_PIXEL_REG 0x2094
+#define DC_WINBUF_A_UFLOW_THRESHOLD_REG 0x2098
+#define DC_WINBUF_A_SPOOL_UP_REG 0x209c
+#define DC_WINBUF_A_SCALEFACTOR_THRESHOLD_REG 0x20a0
+#define DC_WINBUF_A_LATENCY_THRESHOLD_REG 0x20a4
+#define DC_WINBUF_A_MEMFETCH_DEBUG_STATUS_REG 0x20a8
+#define DC_WINBUF_A_MEMFETCH_CONTROL_REG 0x20ac
+#define DC_WINBUF_A_OCCUPANCY_THROTTLE_REG 0x20b0
+#define DC_WINBUF_A_SCRATCH_REGISTER_0_REG 0x20b4
+#define DC_WINBUF_A_SCRATCH_REGISTER_1_REG 0x20b8
+
+
+#endif /* _ARM_TEGRA_DCREG_H */
Index: src/sys/arch/arm/nvidia/tegra_genfb.c
diff -u /dev/null src/sys/arch/arm/nvidia/tegra_genfb.c:1.1
--- /dev/null Mon May 18 19:32:48 2015
+++ src/sys/arch/arm/nvidia/tegra_genfb.c Mon May 18 19:32:48 2015
@@ -0,0 +1,191 @@
+/* $NetBSD: tegra_genfb.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2015 Jared D. McNeill <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#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 $");
+
+#include "opt_ddb.h"
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+
+#if defined(DDB)
+#include <machine/db_machdep.h>
+#include <ddb/db_extern.h>
+#endif
+
+#include <dev/wsfb/genfbvar.h>
+
+#include <arm/nvidia/tegra_reg.h>
+#include <arm/nvidia/tegra_var.h>
+
+static int tegra_genfb_match(device_t, cfdata_t, void *);
+static void tegra_genfb_attach(device_t, device_t, void *);
+
+struct tegra_genfb_softc {
+ struct genfb_softc sc_gen;
+ bus_dma_tag_t sc_dmat;
+ bus_dmamap_t sc_dmamap;
+};
+
+static int tegra_genfb_ioctl(void *, void *, u_long, void *, int, lwp_t *);
+static paddr_t tegra_genfb_mmap(void *, void *, off_t, int);
+static bool tegra_genfb_shutdown(device_t, int);
+
+#if defined(DDB)
+static void tegra_genfb_ddb_trap_callback(int);
+static device_t tegra_genfb_consoledev = NULL;
+#endif
+
+CFATTACH_DECL_NEW(tegra_genfb, sizeof(struct tegra_genfb_softc),
+ tegra_genfb_match, tegra_genfb_attach, NULL, NULL);
+
+static int
+tegra_genfb_match(device_t parent, cfdata_t cf, void *aux)
+{
+ return 1;
+}
+
+static void
+tegra_genfb_attach(device_t parent, device_t self, void *aux)
+{
+ struct tegra_genfb_softc * const sc = device_private(self);
+ struct tegrafb_attach_args * const tfb = aux;
+ prop_dictionary_t prop = device_properties(self);
+ const bool is_console = tfb->tfb_console;
+ struct genfb_ops ops;
+
+ sc->sc_gen.sc_dev = self;
+ sc->sc_dmat = tfb->tfb_dmat;
+ sc->sc_dmamap = tfb->tfb_dmamap;
+
+ prop_dictionary_set_bool(prop, "is_console", is_console);
+ prop_dictionary_set_uint32(prop, "width", tfb->tfb_width);
+ 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, "virtual_address",
+ (uintptr_t)tfb->tfb_dmap);
+
+ genfb_init(&sc->sc_gen);
+ if (sc->sc_gen.sc_width == 0 || sc->sc_gen.sc_fbsize == 0) {
+ aprint_error(": disabled\n");
+ return;
+ }
+
+ pmf_device_register1(self, NULL, NULL, tegra_genfb_shutdown);
+
+ aprint_naive("\n");
+ if (is_console) {
+ aprint_normal(": switching to framebuffer console\n");
+ } else {
+ aprint_normal("\n");
+ }
+
+ memset(&ops, 0, sizeof(ops));
+ ops.genfb_ioctl = tegra_genfb_ioctl;
+ ops.genfb_mmap = tegra_genfb_mmap;
+ genfb_attach(&sc->sc_gen, &ops);
+
+#if defined(DDB)
+ if (is_console) {
+ tegra_genfb_consoledev = self;
+ db_trap_callback = tegra_genfb_ddb_trap_callback;
+ }
+#endif
+
+}
+
+static int
+tegra_genfb_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, lwp_t *l)
+{
+ struct tegra_genfb_softc * const sc = v;
+ struct wsdisplayio_bus_id *busid;
+ struct wsdisplayio_fbinfo *fbi;
+ struct rasops_info *ri = &sc->sc_gen.vd.active->scr_ri;
+ int error;
+
+ switch (cmd) {
+ case WSDISPLAYIO_GTYPE:
+ *(u_int *)data = WSDISPLAY_TYPE_TEGRA;
+ return 0;
+ case WSDISPLAYIO_GET_BUSID:
+ busid = data;
+ busid->bus_type = WSDISPLAYIO_BUS_SOC;
+ return 0;
+ case WSDISPLAYIO_GET_FBINFO:
+ fbi = data;
+ error = wsdisplayio_get_fbinfo(ri, fbi);
+ fbi->fbi_flags |= WSFB_VRAM_IS_RAM;
+ return error;
+ default:
+ return EPASSTHROUGH;
+ }
+}
+
+static paddr_t
+tegra_genfb_mmap(void *v, void *vs, off_t off, int prot)
+{
+ struct tegra_genfb_softc * const sc = v;
+
+ if (off < 0 || off >= sc->sc_dmamap->dm_segs[0].ds_len)
+ return -1;
+
+ return bus_dmamem_mmap(sc->sc_dmat, sc->sc_dmamap->dm_segs, 1,
+ off, prot, BUS_DMA_PREFETCHABLE);
+}
+
+static bool
+tegra_genfb_shutdown(device_t self, int flags)
+{
+ genfb_enable_polling(self);
+ return true;
+}
+
+#if defined(DDB)
+static void
+tegra_genfb_ddb_trap_callback(int where)
+{
+ if (tegra_genfb_consoledev == NULL)
+ return;
+
+ if (where) {
+ genfb_enable_polling(tegra_genfb_consoledev);
+ } else {
+ genfb_disable_polling(tegra_genfb_consoledev);
+ }
+}
+#endif
Index: src/sys/arch/arm/nvidia/tegra_hdmi.c
diff -u /dev/null src/sys/arch/arm/nvidia/tegra_hdmi.c:1.1
--- /dev/null Mon May 18 19:32:48 2015
+++ src/sys/arch/arm/nvidia/tegra_hdmi.c Mon May 18 19:32:48 2015
@@ -0,0 +1,352 @@
+/* $NetBSD: tegra_hdmi.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2015 Jared D. McNeill <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "locators.h"
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: tegra_hdmi.c,v 1.1 2015/05/18 19:32:48 jmcneill Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+
+#include <dev/i2c/i2cvar.h>
+#include <dev/i2c/ddcvar.h>
+#include <dev/videomode/videomode.h>
+#include <dev/videomode/edidvar.h>
+
+#include <arm/nvidia/tegra_reg.h>
+#include <arm/nvidia/tegra_hdmireg.h>
+#include <arm/nvidia/tegra_var.h>
+
+static int tegra_hdmi_match(device_t, cfdata_t, void *);
+static void tegra_hdmi_attach(device_t, device_t, void *);
+
+static const struct tegra_hdmi_tmds_config {
+ u_int dot_clock;
+ uint32_t sor_pll0;
+ uint32_t sor_pll1;
+ uint32_t sor_lane_drive_current;
+ uint32_t pe_current;
+ uint32_t sor_io_peak_current;
+ uint32_t sor_pad_ctls0;
+ uint32_t car_plld_misc; /* XXX unused? */
+} tegra_hdmi_tmds_config[] = {
+ /* 480p */
+ { 27000, 0x01003010, 0x00301b00, 0x1f1f1f1f,
+ 0x00000000, 0x03030303, 0x800034bb, 0x40400820 },
+ /* 720p / 1080i */
+ { 74250, 0x01003110, 0x00301500, 0x2c2c2c2c,
+ 0x00000000, 0x07070707, 0x800034bb, 0x40400820 },
+ /* 1080p */
+ { 148500, 0x01003310, 0300301500, 0x33333333,
+ 0x00000000, 0x0c0c0c0c, 0x800034bb, 0x40400820 },
+ /* 2160p */
+ { 297000, 0x01003f10, 0x00300f00, 0x37373737,
+ 0x00000000, 0x17171717, 0x800036bb, 0x40400f20 },
+};
+
+struct tegra_hdmi_softc {
+ device_t sc_dev;
+ bus_space_tag_t sc_bst;
+ bus_space_handle_t sc_bsh;
+
+ device_t sc_displaydev;
+ device_t sc_ddcdev;
+ struct tegra_gpio_pin *sc_pin_hpd;
+ struct tegra_gpio_pin *sc_pin_pll;
+ struct tegra_gpio_pin *sc_pin_power;
+
+ bool sc_connected;
+ const struct videomode *sc_curmode;
+};
+
+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 int tegra_hdmi_sor_start(struct tegra_hdmi_softc *);
+
+CFATTACH_DECL_NEW(tegra_hdmi, sizeof(struct tegra_hdmi_softc),
+ tegra_hdmi_match, tegra_hdmi_attach, NULL, NULL);
+
+#define HDMI_READ(sc, reg) \
+ bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
+#define HDMI_WRITE(sc, reg, val) \
+ bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
+#define HDMI_SET_CLEAR(sc, reg, set, clr) \
+ tegra_reg_set_clear((sc)->sc_bst, (sc)->sc_bsh, (reg), (set), (clr))
+
+static int
+tegra_hdmi_match(device_t parent, cfdata_t cf, void *aux)
+{
+ return 1;
+}
+
+static void
+tegra_hdmi_attach(device_t parent, device_t self, void *aux)
+{
+ struct tegra_hdmi_softc * const sc = device_private(self);
+ struct tegraio_attach_args * const tio = aux;
+ const struct tegra_locators * const loc = &tio->tio_loc;
+ prop_dictionary_t prop = device_properties(self);
+ const char *pin, *dev;
+
+ sc->sc_dev = self;
+ sc->sc_bst = tio->tio_bst;
+ if (bus_space_map(sc->sc_bst, TEGRA_GHOST_BASE + loc->loc_offset,
+ loc->loc_size, 0, &sc->sc_bsh) != 0) {
+ aprint_error(": couldn't map HDMI\n");
+ return;
+ }
+
+ if (prop_dictionary_get_cstring_nocopy(prop, "hpd-gpio", &pin)) {
+ sc->sc_pin_hpd = tegra_gpio_acquire(pin, GPIO_PIN_INPUT);
+ }
+ if (prop_dictionary_get_cstring_nocopy(prop, "pll-gpio", &pin)) {
+ sc->sc_pin_pll = tegra_gpio_acquire(pin, GPIO_PIN_OUTPUT);
+ if (sc->sc_pin_pll) {
+ tegra_gpio_write(sc->sc_pin_pll, 0);
+ }
+ }
+ if (prop_dictionary_get_cstring_nocopy(prop, "power-gpio", &pin)) {
+ sc->sc_pin_power = tegra_gpio_acquire(pin, GPIO_PIN_OUTPUT);
+ if (sc->sc_pin_power) {
+ tegra_gpio_write(sc->sc_pin_power, 1);
+ }
+ }
+ if (prop_dictionary_get_cstring_nocopy(prop, "ddc-device", &dev)) {
+ sc->sc_ddcdev = device_find_by_xname(dev);
+ }
+ if (prop_dictionary_get_cstring_nocopy(prop, "display-device", &dev)) {
+ sc->sc_displaydev = device_find_by_xname(dev);
+ }
+
+ if (sc->sc_displaydev == NULL) {
+ aprint_error(": no display-device property\n");
+ return;
+ }
+
+ aprint_naive("\n");
+ aprint_normal(": HDMI\n");
+
+ tegra_hdmi_hpd(sc);
+}
+
+static void
+tegra_hdmi_hpd(struct tegra_hdmi_softc *sc)
+{
+ bool con;
+
+ if (sc->sc_pin_hpd) {
+ con = tegra_gpio_read(sc->sc_pin_hpd);
+ } else {
+ con = true;
+ }
+
+ if (sc->sc_connected == con)
+ return;
+
+ if (con) {
+ device_printf(sc->sc_dev, "display connected\n");
+ tegra_hdmi_connect(sc);
+ } else {
+ device_printf(sc->sc_dev, "display disconnected\n");
+ tegra_hdmi_disconnect(sc);
+ }
+
+ sc->sc_connected = con;
+}
+
+static void
+tegra_hdmi_connect(struct tegra_hdmi_softc *sc)
+{
+ const struct videomode *mode;
+ char edid[128];
+ struct edid_info ei;
+ int retry = 4, error;
+
+ 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,
+ sizeof(edid));
+ if (error == 0) {
+ break;
+ }
+ }
+ if (retry == 0) {
+ device_printf(sc->sc_dev, "failed to read EDID (%d)\n",
+ error);
+ } else {
+ if (edid_parse(edid, &ei) != 0) {
+ device_printf(sc->sc_dev,
+ "failed to parse EDID\n");
+#ifdef TEGRA_HDMI_DEBUG
+ } else {
+ edid_print(&ei);
+#endif
+ }
+ }
+ }
+
+ mode = ei.edid_preferred_mode;
+ if (mode == NULL) {
+ mode = pick_mode_by_ref(640, 480, 60);
+ }
+
+ sc->sc_curmode = mode;
+ tegra_hdmi_enable(sc);
+}
+
+static void
+tegra_hdmi_disconnect(struct tegra_hdmi_softc *sc)
+{
+}
+
+static void
+tegra_hdmi_enable(struct tegra_hdmi_softc *sc)
+{
+ const struct tegra_hdmi_tmds_config *tmds = NULL;
+ const struct videomode *mode = sc->sc_curmode;
+ uint32_t input_ctrl;
+ u_int n;
+
+ KASSERT(sc->sc_curmode != NULL);
+
+ 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) {
+ tmds = &tegra_hdmi_tmds_config[n];
+ break;
+ }
+ }
+ 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);
+ }
+
+ tegra_dc_enable(sc->sc_displaydev, sc->sc_dev, mode);
+
+ const u_int div = (mode->dot_clock / 1000) * 4;
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_REFCLK_REG,
+ __SHIFTIN(div >> 2, HDMI_NV_PDISP_SOR_REFCLK_DIV_INT) |
+ __SHIFTIN(div & 3, HDMI_NV_PDISP_SOR_REFCLK_DIV_FRAC));
+
+ HDMI_SET_CLEAR(sc, HDMI_NV_PDISP_SOR_CSTM_REG,
+ __SHIFTIN(HDMI_NV_PDISP_SOR_CSTM_MODE_TMDS,
+ HDMI_NV_PDISP_SOR_CSTM_MODE) |
+ HDMI_NV_PDISP_SOR_CSTM_PLLDIV,
+ HDMI_NV_PDISP_SOR_CSTM_MODE);
+
+ input_ctrl = __SHIFTIN(tegra_dc_port(sc->sc_displaydev),
+ HDMI_NV_PDISP_INPUT_CONTROL_HDMI_SRC_SELECT);
+ if (mode->hdisplay != 640 || mode->vdisplay != 480)
+ input_ctrl |= HDMI_NV_PDISP_INPUT_CONTROL_ARM_VIDEO_RANGE;
+ HDMI_WRITE(sc, HDMI_NV_PDISP_INPUT_CONTROL_REG, input_ctrl);
+
+ if (tegra_hdmi_sor_start(sc) != 0)
+ return;
+
+ /* Start HDMI output */
+ tegra_dc_hdmi_start(sc->sc_displaydev);
+}
+
+static int
+tegra_hdmi_sor_start(struct tegra_hdmi_softc *sc)
+{
+ int retry;
+
+ HDMI_SET_CLEAR(sc, HDMI_NV_PDISP_SOR_PLL0_REG,
+ 0,
+ HDMI_NV_PDISP_SOR_PLL0_PWR |
+ HDMI_NV_PDISP_SOR_PLL0_VCOPD |
+ HDMI_NV_PDISP_SOR_PLL0_PULLDOWN);
+ delay(10);
+ HDMI_SET_CLEAR(sc, HDMI_NV_PDISP_SOR_PLL0_REG,
+ 0,
+ HDMI_NV_PDISP_SOR_PLL0_PDBG);
+
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PWR_REG,
+ HDMI_NV_PDISP_SOR_PWR_NORMAL_STATE |
+ HDMI_NV_PDISP_SOR_PWR_SETTING_NEW);
+
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_PWR_REG,
+ HDMI_NV_PDISP_SOR_PWR_NORMAL_STATE);
+
+ for (retry = 10000; retry > 0; retry--) {
+ const uint32_t pwr = HDMI_READ(sc, HDMI_NV_PDISP_SOR_PWR_REG);
+ if ((pwr & HDMI_NV_PDISP_SOR_PWR_SETTING_NEW) == 0)
+ break;
+ delay(10);
+ }
+ if (retry == 0) {
+ device_printf(sc->sc_dev, "timeout enabling SOR power\n");
+ return ETIMEDOUT;
+ }
+
+ 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_PROTOCOL);
+ if (sc->sc_curmode->flags & VID_NHSYNC)
+ state2 |= HDMI_NV_PDISP_SOR_STATE2_ASY_HSYNCPOL;
+ if (sc->sc_curmode->flags & VID_NVSYNC)
+ state2 |= HDMI_NV_PDISP_SOR_STATE2_ASY_VSYNCPOL;
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_STATE2_REG, state2);
+
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_STATE1_REG,
+ __SHIFTIN(HDMI_NV_PDISP_SOR_STATE1_ASY_HEAD_OPMODE_AWAKE,
+ HDMI_NV_PDISP_SOR_STATE1_ASY_HEAD_OPMODE) |
+ HDMI_NV_PDISP_SOR_STATE1_ASY_ORMODE);
+
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_STATE0_REG, 0);
+
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_STATE0_REG,
+ HDMI_NV_PDISP_SOR_STATE0_UPDATE);
+
+ HDMI_SET_CLEAR(sc, HDMI_NV_PDISP_SOR_STATE1_REG,
+ HDMI_NV_PDISP_SOR_STATE1_ATTACHED, 0);
+
+ HDMI_WRITE(sc, HDMI_NV_PDISP_SOR_STATE0_REG, 0);
+
+ return 0;
+}
Index: src/sys/arch/arm/nvidia/tegra_hdmireg.h
diff -u /dev/null src/sys/arch/arm/nvidia/tegra_hdmireg.h:1.1
--- /dev/null Mon May 18 19:32:48 2015
+++ src/sys/arch/arm/nvidia/tegra_hdmireg.h Mon May 18 19:32:48 2015
@@ -0,0 +1,280 @@
+/* $NetBSD: tegra_hdmireg.h,v 1.1 2015/05/18 19:32:48 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2015 Jared D. McNeill <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARM_TEGRA_HDMIREG_H
+#define _ARM_TEGRA_HDMIREG_H
+
+/*
+ * HDMI Registers
+ */
+#define HDMI_CTXSW_REG 0x000
+
+#define HDMI_NV_PDISP_SOR_STATE0_REG 0x004
+#define HDMI_NV_PDISP_SOR_STATE0_UPDATE __BIT(0)
+
+#define HDMI_NV_PDISP_SOR_STATE1_REG 0x008
+#define HDMI_NV_PDISP_SOR_STATE1_ARM_SHOW_VGA __BIT(4)
+#define HDMI_NV_PDISP_SOR_STATE1_ATTACHED __BIT(3)
+#define HDMI_NV_PDISP_SOR_STATE1_ASY_ORMODE __BIT(2)
+#define HDMI_NV_PDISP_SOR_STATE1_ASY_HEAD_OPMODE __BITS(1,0)
+#define HDMI_NV_PDISP_SOR_STATE1_ASY_HEAD_OPMODE_SLEEP 0
+#define HDMI_NV_PDISP_SOR_STATE1_ASY_HEAD_OPMODE_SNOOZE 1
+#define HDMI_NV_PDISP_SOR_STATE1_ASY_HEAD_OPMODE_AWAKE 2
+
+#define HDMI_NV_PDISP_SOR_STATE2_REG 0x00c
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_DEPOL __BIT(14)
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_VSYNCPOL __BIT(13)
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_HSYNCPOL __BIT(12)
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_PROTOCOL __BITS(11,8)
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_CRCMODE __BITS(7,6)
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_SUBOWNER __BITS(5,4)
+#define HDMI_NV_PDISP_SOR_STATE2_ASY_OWNER __BITS(3,0)
+
+#define HDMI_NV_PDISP_HDMI_AUDIO_EMU0_REG 0x068
+#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_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_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_STATUS_REG 0x0ac
+#define HDMI_NV_PDISP_HDMI_GENERIC_HEADER_REG 0x0b0
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK0_LOW_REG 0x0b4
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK0_HIGH_REG 0x0b8
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK1_LOW_REG 0x0bc
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK1_HIGH_REG 0x0c0
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK2_LOW_REG 0x0c4
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK2_HIGH_REG 0x0c8
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK3_LOW_REG 0x0cc
+#define HDMI_NV_PDISP_HDMI_GENERIC_INFOFRAME_SUBPACK3_HIGH_REG 0x0d0
+#define HDMI_NV_PDISP_HDMI_ACR_CTRL_REG 0x0d4
+#define HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_LOW_REG 0x0d8
+#define HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_HIGH_REG 0x0dc
+#define HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW_REG 0x0e0
+#define HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH_REG 0x0e4
+#define HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_LOW_REG 0x0e8
+#define HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_HIGH_REG 0x0ec
+#define HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_LOW_REG 0x0f0
+#define HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_HIGH_REG 0x0f4
+#define HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_LOW_REG 0x0f8
+#define HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_HIGH_REG 0x0fc
+#define HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_LOW_REG 0x100
+#define HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_HIGH_REG 0x104
+#define HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_LOW_REG 0x108
+#define HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_HIGH_REG 0x10c
+
+#define HDMI_NV_PDISP_HDMI_CTRL_REG 0x110
+#define HDMI_NV_PDISP_HDMI_CTRL_ENABLE __BIT(30)
+#define HDMI_NV_PDISP_HDMI_CTRL_CA_SELECT __BIT(28)
+#define HDMI_NV_PDISP_HDMI_CTRL_SS_SELECT __BIT(27)
+#define HDMI_NV_PDISP_HDMI_CTRL_SF_SELECT __BIT(26)
+#define HDMI_NV_PDISP_HDMI_CTRL_CC_SELECT __BIT(25)
+#define HDMI_NV_PDISP_HDMI_CTRL_CT_SELECT __BIT(24)
+#define HDMI_NV_PDISP_HDMI_CTRL_MAX_AC_PACKET __BITS(20,16)
+#define HDMI_NV_PDISP_HDMI_CTRL_SAMPLE_FLAT __BIT(12)
+#define HDMI_NV_PDISP_HDMI_CTRL_AUDIO_LAYOUT_SELECT __BIT(10)
+#define HDMI_NV_PDISP_HDMI_CTRL_AUDIO_LAYOUT __BIT(8)
+#define HDMI_NV_PDISP_HDMI_CTRL_REKEY __BITS(6,0)
+
+#define HDMI_NV_PDISP_HDMI_VSYNC_KEEPOUT_REG 0x114
+#define HDMI_NV_PDISP_HDMI_VSYNC_WINDOW_REG 0x118
+#define HDMI_NV_PDISP_HDMI_GCP_CTRL_REG 0x11c
+#define HDMI_NV_PDISP_HDMI_GCP_STATUS_REG 0x120
+#define HDMI_NV_PDISP_HDMI_GCP_SUBPACK_REG 0x124
+#define HDMI_NV_PDISP_HDMI_CHANNEL_STATUS1_REG 0x128
+#define HDMI_NV_PDISP_HDMI_CHANNEL_STATUS2_REG 0x12c
+#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_SPDIF_CHN_STATUS1_REG 0x140
+#define HDMI_NV_PDISP_HDMI_SPDIF_CHN_STAUTS2_REG 0x144
+#define HDMI_NV_PDISP_CRC_CONTROL_REG 0x258
+
+#define HDMI_NV_PDISP_INPUT_CONTROL_REG 0x25c
+#define HDMI_NV_PDISP_INPUT_CONTROL_ARM_VIDEO_RANGE __BIT(1)
+#define HDMI_NV_PDISP_INPUT_CONTROL_HDMI_SRC_SELECT __BIT(0)
+
+#define HDMI_NV_PDISP_SCRATCH_REG 0x260
+#define HDMI_NV_PDISP_PE_CURRENT_REG 0x264
+#define HDMI_NV_PDISP_KEY_CTRL_REG 0x268
+#define HDMI_NV_PDISP_KEY_DEBUG0_REG 0x26c
+#define HDMI_NV_PDISP_KEY_DEBUG1_REG 0x270
+#define HDMI_NV_PDISP_KEY_DEBUG2_REG 0x274
+#define HDMI_NV_PDISP_KEY_HDCP_KEY_0_REG 0x278
+#define HDMI_NV_PDISP_KEY_HDCP_KEY_1_REG 0x27c
+#define HDMI_NV_PDISP_KEY_HDCP_KEY_2_REG 0x280
+#define HDMI_NV_PDISP_KEY_HDCP_KEY_3_REG 0x284
+#define HDMI_NV_PDISP_KEY_HDCP_KEY_TRIG_REG 0x288
+#define HDMI_NV_PDISP_KEY_SKEY_INDEX_REG 0x28c
+#define HDMI_NV_PDISP_INT_STATUS_REG 0x330
+#define HDMI_NV_PDISP_INT_MASK_REG 0x334
+#define HDMI_NV_PDISP_INT_ENABLE_REG 0x338
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_CTRL_REG 0x358
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_STATUS_REG 0x35c
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_HEADER_REG 0x360
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK0_LOW_REG 0x364
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK0_HIGH_REG 0x368
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK1_LOW_REG 0x36c
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK1_HIGH_REG 0x370
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK2_LOW_REG 0x374
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK2_HIGH_REG 0x378
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK3_LOW_REG 0x37c
+#define HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK3_HIGH_REG 0x380
+
+/*
+ * Serial Output Resource Registers
+ */
+#define HDMI_NV_PDISP_SOR_PWR_REG 0x154
+#define HDMI_NV_PDISP_SOR_PWR_SETTING_NEW __BIT(31)
+#define HDMI_NV_PDISP_SOR_PWR_MODE __BIT(28)
+#define HDMI_NV_PDISP_SOR_PWR_HALT_DELAY __BIT(24)
+#define HDMI_NV_PDISP_SOR_PWR_SAFE_START __BIT(17)
+#define HDMI_NV_PDISP_SOR_PWR_SAFE_STATE __BIT(16)
+#define HDMI_NV_PDISP_SOR_PWR_NORMAL_START __BIT(1)
+#define HDMI_NV_PDISP_SOR_PWR_NORMAL_STATE __BIT(0)
+
+#define HDMI_NV_PDISP_SOR_TEST_REG 0x158
+
+#define HDMI_NV_PDISP_SOR_PLL0_REG 0x15c
+#define HDMI_NV_PDISP_SOR_PLL0_TX_REG_LOAD __BITS(29,28)
+#define HDMI_NV_PDISP_SOR_PLL0_ICHPMP __BITS(27,24)
+#define HDMI_NV_PDISP_SOR_PLL0_FILTER __BITS(19,16)
+#define HDMI_NV_PDISP_SOR_PLL0_BG_V17_S __BITS(15,12)
+#define HDMI_NV_PDISP_SOR_PLL0_VCOCAP __BITS(11,8)
+#define HDMI_NV_PDISP_SOR_PLL0_PULLDOWN __BIT(5)
+#define HDMI_NV_PDISP_SOR_PLL0_RESISTORSEL __BIT(4)
+#define HDMI_NV_PDISP_SOR_PLL0_PDPORT __BIT(3)
+#define HDMI_NV_PDISP_SOR_PLL0_VCOPD __BIT(2)
+#define HDMI_NV_PDISP_SOR_PLL0_PDBG __BIT(1)
+#define HDMI_NV_PDISP_SOR_PLL0_PWR __BIT(0)
+
+#define HDMI_NV_PDISP_SOR_PLL1_REG 0x160
+#define HDMI_NV_PDISP_SOR_PLL2_REG 0x164
+
+#define HDMI_NV_PDISP_SOR_CSTM_REG 0x168
+#define HDMI_NV_PDISP_SOR_CSTM_ROTDAT __BITS(30,28)
+#define HDMI_NV_PDISP_SOR_CSTM_ROTCLK __BITS(27,24)
+#define HDMI_NV_PDISP_SOR_CSTM_PLLDIV __BIT(21)
+#define HDMI_NV_PDISP_SOR_CSTM_BALANCED __BIT(19)
+#define HDMI_NV_PDISP_SOR_CSTM_NEW_MODE __BIT(18)
+#define HDMI_NV_PDISP_SOR_CSTM_DUP_SYNC __BIT(17)
+#define HDMI_NV_PDISP_SOR_CSTM_LVDS_EN __BIT(16)
+#define HDMI_NV_PDISP_SOR_CSTM_LINKACTB __BIT(15)
+#define HDMI_NV_PDISP_SOR_CSTM_LINKACTA __BIT(14)
+#define HDMI_NV_PDISP_SOR_CSTM_MODE __BITS(13,12)
+#define HDMI_NV_PDISP_SOR_CSTM_MODE_LVDS 0
+#define HDMI_NV_PDISP_SOR_CSTM_MODE_TMDS 1
+#define HDMI_NV_PDISP_SOR_CSTM_UPPER __BIT(11)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXCB __BIT(9)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXCA __BIT(8)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDB_3 __BIT(7)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDB_2 __BIT(6)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDB_1 __BIT(5)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDB_0 __BIT(4)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDA_3 __BIT(3)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDA_2 __BIT(2)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDA_1 __BIT(1)
+#define HDMI_NV_PDISP_SOR_CSTM_PD_TXDA_0 __BIT(0)
+
+#define HDMI_NV_PDISP_SOR_LVDS_REG 0x16c
+#define HDMI_NV_PDISP_SOR_CRCA_REG 0x170
+#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
+#define HDMI_NV_PDISP_SOR_SEQ_INST3_REG 0x18c
+#define HDMI_NV_PDISP_SOR_SEQ_INST4_REG 0x190
+#define HDMI_NV_PDISP_SOR_SEQ_INST5_REG 0x194
+#define HDMI_NV_PDISP_SOR_SEQ_INST6_REG 0x198
+#define HDMI_NV_PDISP_SOR_SEQ_INST7_REG 0x19c
+#define HDMI_NV_PDISP_SOR_SEQ_INST8_REG 0x1a0
+#define HDMI_NV_PDISP_SOR_SEQ_INST9_REG 0x1a4
+#define HDMI_NV_PDISP_SOR_SEQ_INSTA_REG 0x1a8
+#define HDMI_NV_PDISP_SOR_SEQ_INSTB_REG 0x1ac
+#define HDMI_NV_PDISP_SOR_SEQ_INSTC_REG 0x1b0
+#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_LANE_DRIVE_CURRENT_REG 0x1f8
+
+#define HDMI_NV_PDISP_SOR_REFCLK_REG 0x254
+#define HDMI_NV_PDISP_SOR_REFCLK_DIV_INT __BITS(15,8)
+#define HDMI_NV_PDISP_SOR_REFCLK_DIV_FRAC __BITS(7,6)
+
+#define HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT_REG 0x344
+#define HDMI_NV_PDISP_SOR_PAD_CTLS0_REG 0x348
+#define HDMI_NV_PDISP_SOR_PAD_CTLS1_REG 0x34c
+
+/*
+ * Audio Registers
+ */
+#define HDMI_NV_PDISP_AUDIO_N_REG 0x230
+#define HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_REG 0x2b0
+#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
+#define HDMI_NV_PDISP_SOR_AUDIO_NVAL_0441_REG 0x2c0
+#define HDMI_NV_PDISP_SOR_AUDIO_NVAL_0882_REG 0x2c4
+#define HDMI_NV_PDISP_SOR_AUDIO_NVAL_1764_REG 0x2c8
+#define HDMI_NV_PDISP_SOR_AUDIO_NVAL_0480_REG 0x2cc
+#define HDMI_NV_PDISP_SOR_AUDIO_NVAL_0960_REG 0x2d0
+#define HDMI_NV_PDISP_SOR_AUDIO_NVAL_1920_REG 0x2d4
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_SCRATCH0_REG 0x2d8
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_SCRATCH1_REG 0x2dc
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_SCRATCH2_REG 0x2e0
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_SCRATCH3_REG 0x2e4
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH0_REG 0x2e8
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH1_REG 0x2ec
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_ELF_BUFWR_REG 0x2f0
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_REG 0x2f4
+#define HDMI_NV_PDISP_SOR_AUDIO_HDA_CP_REG 0x2f8
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_0320_REG 0x2fc
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_0441_REG 0x300
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_0882_REG 0x304
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_1764_REG 0x308
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_0480_REG 0x30c
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_0960_REG 0x310
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_1920_REG 0x314
+#define HDMI_NV_PDISP_SOR_AUDIO_AVAL_DEFAULT_REG 0x318
+#define HDMI_NV_PDISP_SOR_AUDIO_GEN_CTRL_REG 0x31c
+#define HDMI_NV_HDACODEC_AUDIO_GEN_CTL_REG 0x354
+
+#endif /* _ARM_TEGRA_HDMIREG_H */