video: tegra: dc: add support to window d & h.
Kevin Huang [Sat, 22 Dec 2012 00:19:20 +0000 (16:19 -0800)]
Add support to window d & h in dc ext interface.

Bug 962353

Change-Id: I4ae4ce7ee4720f1986266825832a4226f667b0a4
Signed-off-by: Kevin Huang <kevinh@nvidia.com>
Reviewed-on: http://git-master/r/188463
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/mach-tegra/include/mach/dc.h
drivers/video/tegra/dc/bandwidth.c
drivers/video/tegra/dc/dc.c
drivers/video/tegra/dc/dc_reg.h
drivers/video/tegra/dc/ext/dev.c

index 6c4076e..eb9c3ad 100644 (file)
 #include <drm/drm_fixed.h>
 
 #define TEGRA_MAX_DC           2
+
+#if defined(CONFIG_ARCH_TEGRA_14x_SOC)
+#define DC_N_WINDOWS           5
+#else
 #define DC_N_WINDOWS           3
+#endif
+
 #define DEFAULT_FPGA_FREQ_KHZ  160000
 
 
index 5a510d5..6022889 100644 (file)
@@ -55,6 +55,12 @@ static void tegra_dc_set_latency_allowance(struct tegra_dc *dc,
 #endif
        unsigned long bw;
 
+/* TODO: add support to latency allownce for t14x */
+#if defined(CONFIG_ARCH_TEGRA_14x_SOC)
+       if (w->idx >= ARRAY_SIZE(*la_id_tab))
+               return;
+#endif
+
        BUG_ON(dc->ndev->id >= ARRAY_SIZE(la_id_tab));
 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
        BUG_ON(dc->ndev->id >= ARRAY_SIZE(vfilter_tab));
index a6973f0..e8103e5 100644 (file)
@@ -1790,6 +1790,11 @@ static int tegra_dc_init(struct tegra_dc *dc)
                tegra_dc_set_scaling_filter(dc);
        }
 
+       /* Set window H to window mode by default for t14x. */
+#ifdef CONFIG_ARCH_TEGRA_14x_SOC
+       tegra_dc_writel(dc, WINH_CURS_SELECT(1),
+                       DC_DISP_BLEND_CURSOR_CONTROL);
+#endif
        for (i = 0; i < dc->n_windows; i++) {
                u32 syncpt = get_syncpt(dc, i);
 
@@ -2346,12 +2351,19 @@ static int tegra_dc_probe(struct platform_device *ndev)
                dc->win_syncpt[0] = NVSYNCPT_DISP0_A;
                dc->win_syncpt[1] = NVSYNCPT_DISP0_B;
                dc->win_syncpt[2] = NVSYNCPT_DISP0_C;
+#ifdef CONFIG_ARCH_TEGRA_14x_SOC
+               dc->win_syncpt[3] = NVSYNCPT_DISP0_D;
+               dc->win_syncpt[4] = NVSYNCPT_DISP0_H;
+#endif
                dc->powergate_id = TEGRA_POWERGATE_DISA;
        } else if (TEGRA_DISPLAY2_BASE == res->start) {
                dc->vblank_syncpt = NVSYNCPT_VBLANK1;
                dc->win_syncpt[0] = NVSYNCPT_DISP1_A;
                dc->win_syncpt[1] = NVSYNCPT_DISP1_B;
                dc->win_syncpt[2] = NVSYNCPT_DISP1_C;
+#ifdef CONFIG_ARCH_TEGRA_14x_SOC
+               dc->win_syncpt[4] = NVSYNCPT_DISP1_H;
+#endif
                dc->powergate_id = TEGRA_POWERGATE_DISB;
        } else {
                dev_err(&ndev->dev,
index 1fdf7e0..39fbfbc 100644 (file)
 #define  NUM_AGG_PRI_LVLS              4
 #define  SD_AGG_PRI_LVL(x)             ((x) >> 3)
 #define  SD_GET_AGG(x)                 ((x) & 0x7)
+
+#define DC_DISP_BLEND_CURSOR_CONTROL           0x4f1
+#define  WINH_CURS_SELECT(x)           (((x) & 0x1) << 28)
+#define  CURSOR_MODE_SELECT(x)         (((x) & 0x1) << 24)
+
 #endif
index f7cc899..afa64f1 100644 (file)
@@ -56,7 +56,7 @@ struct tegra_dc_ext_flip_win {
 struct tegra_dc_ext_flip_data {
        struct tegra_dc_ext             *ext;
        struct work_struct              work;
-       struct tegra_dc_ext_flip_win    win[DC_N_WINDOWS];
+       struct tegra_dc_ext_flip_win    win[TEGRA_DC_EXT_FLIP_N_WINDOWS];
        struct list_head                timestamp_node;
 };
 
@@ -334,14 +334,14 @@ static void tegra_dc_ext_flip_worker(struct work_struct *work)
        struct tegra_dc_ext_flip_data *data =
                container_of(work, struct tegra_dc_ext_flip_data, work);
        struct tegra_dc_ext *ext = data->ext;
-       struct tegra_dc_win *wins[DC_N_WINDOWS];
-       struct nvmap_handle_ref *unpin_handles[DC_N_WINDOWS *
+       struct tegra_dc_win *wins[TEGRA_DC_EXT_FLIP_N_WINDOWS];
+       struct nvmap_handle_ref *unpin_handles[TEGRA_DC_EXT_FLIP_N_WINDOWS *
                                               TEGRA_DC_NUM_PLANES];
        struct nvmap_handle_ref *old_handle;
        int i, nr_unpin = 0, nr_win = 0;
        bool skip_flip = false;
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                struct tegra_dc_ext_flip_win *flip_win = &data->win[i];
                int index = flip_win->attr.index;
                struct tegra_dc_win *win;
@@ -428,7 +428,7 @@ static void tegra_dc_ext_flip_worker(struct work_struct *work)
                        spin_unlock(&flip_callback_lock);
                }
 
-               for (i = 0; i < DC_N_WINDOWS; i++) {
+               for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                        struct tegra_dc_ext_flip_win *flip_win = &data->win[i];
                        int index = flip_win->attr.index;
 
@@ -456,7 +456,7 @@ static int lock_windows_for_flip(struct tegra_dc_ext_user *user,
        u8 idx_mask = 0;
        int i;
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                int index = args->win[i].index;
 
                if (index < 0)
@@ -465,7 +465,7 @@ static int lock_windows_for_flip(struct tegra_dc_ext_user *user,
                idx_mask |= BIT(index);
        }
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                struct tegra_dc_ext_win *win;
 
                if (!(idx_mask & BIT(i)))
@@ -499,7 +499,7 @@ static void unlock_windows_for_flip(struct tegra_dc_ext_user *user,
        u8 idx_mask = 0;
        int i;
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                int index = args->win[i].index;
 
                if (index < 0)
@@ -508,7 +508,7 @@ static void unlock_windows_for_flip(struct tegra_dc_ext_user *user,
                idx_mask |= BIT(index);
        }
 
-       for (i = DC_N_WINDOWS - 1; i >= 0; i--) {
+       for (i = TEGRA_DC_EXT_FLIP_N_WINDOWS - 1; i >= 0; i--) {
                if (!(idx_mask & BIT(i)))
                        continue;
 
@@ -521,7 +521,7 @@ static int sanitize_flip_args(struct tegra_dc_ext_user *user,
 {
        int i, used_windows = 0;
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                int index = args->win[i].index;
 
                if (index < 0)
@@ -552,7 +552,7 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
        bool has_timestamp = false;
 
 #ifdef CONFIG_ANDROID
-       int index_check[DC_N_WINDOWS] = {0, };
+       int index_check[TEGRA_DC_EXT_FLIP_N_WINDOWS] = {0, };
        int zero_index_id = 0;
 #endif
 
@@ -571,21 +571,22 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
        data->ext = ext;
 
 #ifdef CONFIG_ANDROID
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                index_check[i] = args->win[i].index;
                if (index_check[i] == 0)
                        zero_index_id = i;
        }
 
-       if (index_check[DC_N_WINDOWS - 1] != 0) {
+       if (index_check[TEGRA_DC_EXT_FLIP_N_WINDOWS - 1] != 0) {
                struct tegra_dc_ext_flip_windowattr win_temp;
-               win_temp = args->win[DC_N_WINDOWS - 1];
-               args->win[DC_N_WINDOWS - 1] = args->win[zero_index_id];
+               win_temp = args->win[TEGRA_DC_EXT_FLIP_N_WINDOWS - 1];
+               args->win[TEGRA_DC_EXT_FLIP_N_WINDOWS - 1] =
+                                               args->win[zero_index_id];
                args->win[zero_index_id] = win_temp;
        }
 #endif
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                struct tegra_dc_ext_flip_win *flip_win = &data->win[i];
                int index = args->win[i].index;
 
@@ -636,7 +637,7 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
                goto unlock;
        }
 
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                u32 syncpt_max;
                int index = args->win[i].index;
                struct tegra_dc_ext_win *ext_win;
@@ -679,7 +680,7 @@ unlock:
        unlock_windows_for_flip(user, args);
 
 fail_pin:
-       for (i = 0; i < DC_N_WINDOWS; i++) {
+       for (i = 0; i < TEGRA_DC_EXT_FLIP_N_WINDOWS; i++) {
                int j;
                for (j = 0; j < TEGRA_DC_NUM_PLANES; j++) {
                        if (!data->win[i].handle[j])