From: Sebastian Ramacher <sramacher@debian.org>
Date: Thu, 16 Mar 2017 20:53:09 +0100
Subject: Add missing files from upstream

Closes: #598976
---
 gfxdrivers/davinci/davinci_c64x.h      | 935 +++++++++++++++++++++++++++++++++
 gfxdrivers/davinci/davinci_gfxdriver.h | 169 ++++++
 gfxdrivers/davinci/davincifb.h         | 581 ++++++++++++++++++++
 3 files changed, 1685 insertions(+)
 create mode 100644 gfxdrivers/davinci/davinci_c64x.h
 create mode 100644 gfxdrivers/davinci/davinci_gfxdriver.h
 create mode 100644 gfxdrivers/davinci/davincifb.h

diff --git a/gfxdrivers/davinci/davinci_c64x.h b/gfxdrivers/davinci/davinci_c64x.h
new file mode 100644
index 0000000..682da22
--- /dev/null
+++ b/gfxdrivers/davinci/davinci_c64x.h
@@ -0,0 +1,935 @@
+/*
+   TI Davinci driver - C64X+ DSP Library
+
+   (c) Copyright 2008  directfb.org
+   (c) Copyright 2007  Telio AG
+
+   Written by Denis Oliver Kropp <dok@directfb.org> and
+              Olaf Dreesen <olaf@directfb.org>.
+
+   All rights reserved.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License
+   version 2 as published by the Free Software Foundation.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public
+   License along with this library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+*/
+
+#ifndef __DAVINCI_C64X_H__
+#define __DAVINCI_C64X_H__
+
+#include <unistd.h>
+
+#include <directfb.h>
+
+#include <direct/messages.h>
+#include <direct/trace.h>
+
+#include <linux/c64x.h>
+
+#define mb() __asm__ __volatile__ ("" : : : "memory")
+
+/**********************************************************************************************************************/
+
+typedef struct {
+     int                 magic;
+
+     int                 fd;
+     c64xTaskControl    *ctl;
+     void               *mem;
+
+     c64xTask           *QueueL;
+} DavinciC64x;
+
+typedef struct {
+     int                 magic;
+     unsigned int        max_tasks;
+     unsigned int        num_tasks;
+     c64xTask           *tasks;
+} DavinciC64xTasks;
+
+typedef enum {
+     C64X_TEF_NONE       = 0x0000,
+     C64X_TEF_RESET      = 0x0001
+} DavinciC64xEmitFlags;
+
+/**********************************************************************************************************************/
+
+DFBResult davinci_c64x_open    ( DavinciC64x *c64x );
+
+DFBResult davinci_c64x_close   ( DavinciC64x *c64x );
+
+DFBResult davinci_c64x_wait_low( DavinciC64x *c64x );
+
+/**********************************************************************************************************************/
+
+DFBResult davinci_c64x_tasks_init   ( DavinciC64xTasks *tasks,
+                                      unsigned int      size );
+
+DFBResult davinci_c64x_tasks_destroy( DavinciC64xTasks *tasks );
+
+/**********************************************************************************************************************/
+
+DFBResult davinci_c64x_emit_tasks( DavinciC64x          *c64x,
+                                   DavinciC64xTasks     *tasks,
+                                   DavinciC64xEmitFlags  flags );
+
+/**********************************************************************************************************************/
+
+static const char *state_names[] = { "DONE", "ERROR", "TODO", "RUNNING" };
+
+static inline c64xTask *
+c64x_get_task( DavinciC64x *c64x )
+{
+     c64xTaskControl *ctl   = c64x->ctl;
+     uint32_t         idx   = ctl->QL_arm;
+     uint32_t         next  = (idx + 1) & C64X_QUEUE_MASK;
+     c64xTask        *task  = &c64x->QueueL[idx];
+     int              loops = 0;
+     uint32_t         idle  = 0;
+
+     /* Wait for the entry (and next) to be processed by the DSP (rare case). */
+     while (task->c64x_flags & C64X_FLAG_TODO || ctl->QL_dsp == next) {
+          if (loops > 666 || (idle && ctl->idlecounter - idle > 666)) {
+               c64xTask *dsp_task = &c64x->QueueL[ctl->QL_dsp];
+
+               D_PERROR( "Davinci/C64X+: Blocked! [DSP %d / %d (%s), ARM %d / %d (%s)]\n",
+                         ctl->QL_dsp,
+                         (dsp_task->c64x_function >> 2) & 0x3fff,
+                         state_names[dsp_task->c64x_function & 3],
+                         ctl->QL_arm,
+                         (task->c64x_function >> 2) & 0x3fff,
+                         state_names[task->c64x_function & 3] );
+
+               break;
+          }
+
+          idle = ctl->idlecounter;
+
+          /* Queue is full, waiting 10-20ms should not be too bad. */
+          if (loops++ > 10)
+               usleep( 5000 );
+     }
+
+     return task;
+}
+
+static inline void
+c64x_submit_task( DavinciC64x *c64x, c64xTask *task )
+{
+     c64xTaskControl *ctl  = c64x->ctl;
+     uint32_t         idx  = ctl->QL_arm;
+     uint32_t         next = (idx + 1) & C64X_QUEUE_MASK;
+
+     mb();
+
+     ctl->QL_arm = next;
+
+     mb();
+}
+
+/**********************************************************************************************************************/
+
+static inline void
+davinci_c64x_wb_inv_range( DavinciC64x   *c64x,
+                           unsigned long  start,
+                           u32            length,
+                           u32            func )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = start;
+     task->c64x_arg[1] = length;
+     task->c64x_arg[2] = func;
+
+     task->c64x_function = C64X_WB_INV_RANGE | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_write_back_all( DavinciC64x *c64x )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_function = C64X_WRITE_BACK_ALL | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+/**********************************************************************************************************************/
+
+static inline void
+davinci_c64x_load_block__L( DavinciC64xTasks *tasks,
+                            unsigned long     words,
+                            u32               num,
+                            u32               flags )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = words;
+     task->c64x_arg[1] = num;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_LOAD_BLOCK | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_load_block( DavinciC64x   *c64x,
+                         unsigned long  words,
+                         u32            num,
+                         u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = words;
+     task->c64x_arg[1] = num;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_LOAD_BLOCK | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_fetch_uyvy( DavinciC64x   *c64x,
+                         unsigned long  dest,
+                         unsigned long  source,
+                         u32            pitch,
+                         u32            height,
+                         u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = source;
+     task->c64x_arg[2] = pitch;
+     task->c64x_arg[3] = height;
+     task->c64x_arg[4] = flags;
+
+     task->c64x_function = C64X_FETCH_UYVY | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_mc( DavinciC64x   *c64x,
+                 unsigned long  dest,
+                 u32            dpitch,
+                 unsigned long  source0,
+                 unsigned long  source1,
+                 u32            spitch,
+                 u32            height,
+                 int            func )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = source0;
+     task->c64x_arg[3] = source1;
+     task->c64x_arg[4] = spitch;
+     task->c64x_arg[5] = height;
+
+     task->c64x_function = func | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_put_idct_uyvy_16x16__L( DavinciC64xTasks *tasks,
+                                     unsigned long     dest,
+                                     u32               pitch,
+                                     u32               flags )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_PUT_IDCT_UYVY_16x16 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_put_idct_uyvy_16x16( DavinciC64x   *c64x,
+                                  unsigned long  dest,
+                                  u32            pitch,
+                                  u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_PUT_IDCT_UYVY_16x16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_put_mc_uyvy_16x16__L( DavinciC64xTasks *tasks,
+                                   unsigned long     dest,
+                                   u32               pitch,
+                                   u32               flags )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_PUT_MC_UYVY_16x16 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_put_mc_uyvy_16x16( DavinciC64x   *c64x,
+                                unsigned long  dest,
+                                u32            pitch,
+                                u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_PUT_MC_UYVY_16x16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_put_sum_uyvy_16x16__L( DavinciC64xTasks *tasks,
+                                    unsigned long     dest,
+                                    u32               pitch,
+                                    u32               flags )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_PUT_SUM_UYVY_16x16 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_put_sum_uyvy_16x16( DavinciC64x   *c64x,
+                                 unsigned long  dest,
+                                 u32            pitch,
+                                 u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = flags;
+
+     task->c64x_function = C64X_PUT_SUM_UYVY_16x16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_dva_begin_frame__L( DavinciC64xTasks *tasks,
+                                 u32               pitch,
+                                 unsigned long     current,
+                                 unsigned long     past,
+                                 unsigned long     future,
+                                 u32               flags )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = pitch;
+     task->c64x_arg[1] = current;
+     task->c64x_arg[2] = past;
+     task->c64x_arg[3] = future;
+     task->c64x_arg[4] = flags;
+
+     task->c64x_function = C64X_DVA_BEGIN_FRAME | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_dva_begin_frame( DavinciC64x   *c64x,
+                              u32            pitch,
+                              unsigned long  current,
+                              unsigned long  past,
+                              unsigned long  future,
+                              u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = pitch;
+     task->c64x_arg[1] = current;
+     task->c64x_arg[2] = past;
+     task->c64x_arg[3] = future;
+     task->c64x_arg[4] = flags;
+
+     task->c64x_function = C64X_DVA_BEGIN_FRAME | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_dva_motion_block__L( DavinciC64xTasks *tasks,
+                                  unsigned long     macroblock )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = macroblock;
+
+     task->c64x_function = C64X_DVA_MOTION_BLOCK | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_dva_motion_block( DavinciC64x   *c64x,
+                               unsigned long  macroblock )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = macroblock;
+
+     task->c64x_function = C64X_DVA_MOTION_BLOCK | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+/**********************************************************************************************************************/
+
+static inline void
+davinci_c64x_dva_idct( DavinciC64x   *c64x,
+				   unsigned long  dest,
+				   u32            pitch,
+				   unsigned long  source )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = source;
+
+     task->c64x_function = C64X_DVA_IDCT | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+/**********************************************************************************************************************/
+
+static inline void
+davinci_c64x_put_uyvy_16x16( DavinciC64x   *c64x,
+                             unsigned long  dest,
+                             u32            pitch,
+                             unsigned long  source,
+                             u32            flags )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = source;
+     task->c64x_arg[3] = flags;
+
+     task->c64x_function = C64X_PUT_UYVY_16x16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_dither_argb__L( DavinciC64xTasks *tasks,
+                             unsigned long     dst_rgb,
+                             unsigned long     dst_alpha,
+                             u32               dst_pitch,
+                             unsigned long     source,
+                             u32               src_pitch,
+                             u32               width,
+                             u32               height )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dst_rgb;
+     task->c64x_arg[1] = dst_alpha;
+     task->c64x_arg[2] = dst_pitch;
+     task->c64x_arg[3] = source;
+     task->c64x_arg[4] = src_pitch;
+     task->c64x_arg[5] = width;
+     task->c64x_arg[6] = height;
+
+     task->c64x_function = C64X_DITHER_ARGB | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_dither_argb( DavinciC64x   *c64x,
+                          unsigned long  dst_rgb,
+                          unsigned long  dst_alpha,
+                          u32            dst_pitch,
+                          unsigned long  source,
+                          u32            src_pitch,
+                          u32            width,
+                          u32            height )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dst_rgb;
+     task->c64x_arg[1] = dst_alpha;
+     task->c64x_arg[2] = dst_pitch;
+     task->c64x_arg[3] = source;
+     task->c64x_arg[4] = src_pitch;
+     task->c64x_arg[5] = width;
+     task->c64x_arg[6] = height;
+
+     task->c64x_function = C64X_DITHER_ARGB | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_fill_16__L( DavinciC64xTasks *tasks,
+                         unsigned long     dest,
+                         u32               pitch,
+                         u32               width,
+                         u32               height,
+                         u32               value )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = width;
+     task->c64x_arg[3] = height;
+     task->c64x_arg[4] = value;
+
+     task->c64x_function = C64X_FILL_16 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_fill_16( DavinciC64x   *c64x,
+                      unsigned long  dest,
+                      u32            pitch,
+                      u32            width,
+                      u32            height,
+                      u32            value )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = width;
+     task->c64x_arg[3] = height;
+     task->c64x_arg[4] = value;
+
+     task->c64x_function = C64X_FILL_16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_fill_32__L( DavinciC64xTasks *tasks,
+                         unsigned long     dest,
+                         u32               pitch,
+                         u32               width,
+                         u32               height,
+                         u32               value )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = width;
+     task->c64x_arg[3] = height;
+     task->c64x_arg[4] = value;
+
+     task->c64x_function = C64X_FILL_32 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_fill_32( DavinciC64x   *c64x,
+                      unsigned long  dest,
+                      u32            pitch,
+                      u32            width,
+                      u32            height,
+                      u32            value )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = pitch;
+     task->c64x_arg[2] = width;
+     task->c64x_arg[3] = height;
+     task->c64x_arg[4] = value;
+
+     task->c64x_function = C64X_FILL_32 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_blit_16__L( DavinciC64xTasks *tasks,
+                         unsigned long     dest,
+                         u32               dpitch,
+                         unsigned long     src,
+                         u32               spitch,
+                         u32               width,
+                         u32               height )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = spitch;
+     task->c64x_arg[4] = width;
+     task->c64x_arg[5] = height;
+
+     task->c64x_function = C64X_COPY_16 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_blit_16( DavinciC64x   *c64x,
+                      unsigned long  dest,
+                      u32            dpitch,
+                      unsigned long  src,
+                      u32            spitch,
+                      u32            width,
+                      u32            height )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = spitch;
+     task->c64x_arg[4] = width;
+     task->c64x_arg[5] = height;
+
+     task->c64x_function = C64X_COPY_16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_blit_32__L( DavinciC64xTasks *tasks,
+                         unsigned long     dest,
+                         u32               dpitch,
+                         unsigned long     src,
+                         u32               spitch,
+                         u32               width,
+                         u32               height )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = spitch;
+     task->c64x_arg[4] = width;
+     task->c64x_arg[5] = height;
+
+     task->c64x_function = C64X_COPY_32 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_blit_32( DavinciC64x   *c64x,
+                      unsigned long  dest,
+                      u32            dpitch,
+                      unsigned long  src,
+                      u32            spitch,
+                      u32            width,
+                      u32            height )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = spitch;
+     task->c64x_arg[4] = width;
+     task->c64x_arg[5] = height;
+
+     task->c64x_function = C64X_COPY_32 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_stretch_32__L( DavinciC64xTasks *tasks,
+                            unsigned long     dest,
+                            u32               dpitch,
+                            unsigned long     src,
+                            u32               spitch,
+                            u32               dw,
+                            u32               dh,
+                            u32               sw,
+                            u32               sh,
+                            const DFBRegion  *clip )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = src;
+     task->c64x_arg[2] = dpitch   | (spitch   << 16);
+     task->c64x_arg[3] = dh       | (dw       << 16);
+     task->c64x_arg[4] = sh       | (sw       << 16);
+     task->c64x_arg[5] = clip->x2 | (clip->y2 << 16);
+     task->c64x_arg[6] = clip->x1 | (clip->y1 << 16);
+
+     if (sw > dw && sh > dh)
+          task->c64x_function = C64X_STRETCH_32_down | C64X_FLAG_TODO;
+     else
+          task->c64x_function = C64X_STRETCH_32_up | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_stretch_32( DavinciC64x     *c64x,
+                         unsigned long    dest,
+                         u32              dpitch,
+                         unsigned long    src,
+                         u32              spitch,
+                         u32              dw,
+                         u32              dh,
+                         u32              sw,
+                         u32              sh,
+                         const DFBRegion *clip )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = src;
+     task->c64x_arg[2] = dpitch   | (spitch   << 16);
+     task->c64x_arg[3] = dh       | (dw       << 16);
+     task->c64x_arg[4] = sh       | (sw       << 16);
+     task->c64x_arg[5] = clip->x2 | (clip->y2 << 16);
+     task->c64x_arg[6] = clip->x1 | (clip->y1 << 16);
+
+     if (sw > dw && sh > dh)
+          task->c64x_function = C64X_STRETCH_32_down | C64X_FLAG_TODO;
+     else
+          task->c64x_function = C64X_STRETCH_32_up | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_blit_blend_32__L( DavinciC64xTasks *tasks,
+                               u32               sub_func,
+                               unsigned long     dest,
+                               u32               dpitch,
+                               unsigned long     src,
+                               u32               spitch,
+                               u32               width,
+                               u32               height,
+                               u32               argb,
+                               u8                alpha )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = spitch;
+     task->c64x_arg[4] = width | (height << 16);
+     task->c64x_arg[5] = argb;
+     task->c64x_arg[6] = alpha;
+
+     task->c64x_function = (sub_func << 16) | C64X_BLEND_32 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_blit_blend_32( DavinciC64x   *c64x,
+                            u32            sub_func,
+                            unsigned long  dest,
+                            u32            dpitch,
+                            unsigned long  src,
+                            u32            spitch,
+                            u32            width,
+                            u32            height,
+                            u32            argb,
+                            u8             alpha )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = dpitch;
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = spitch;
+     task->c64x_arg[4] = width | (height << 16);
+     task->c64x_arg[5] = argb;
+     task->c64x_arg[6] = alpha;
+
+     task->c64x_function = (sub_func << 16) | C64X_BLEND_32 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_blit_keyed_16__L( DavinciC64xTasks *tasks,
+                               unsigned long     dest,
+                               u32               dpitch,
+                               unsigned long     src,
+                               u32               spitch,
+                               u32               width,
+                               u32               height,
+                               u32               key,
+                               u32               mask )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = (dpitch << 16) | (spitch & 0xffff);
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = width;
+     task->c64x_arg[4] = height;
+     task->c64x_arg[5] = key;
+     task->c64x_arg[6] = mask;
+
+     task->c64x_function = C64X_COPY_KEYED_16 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_blit_keyed_16( DavinciC64x   *c64x,
+                            unsigned long  dest,
+                            u32            dpitch,
+                            unsigned long  src,
+                            u32            spitch,
+                            u32            width,
+                            u32            height,
+                            u32            key,
+                            u32            mask )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = (dpitch << 16) | (spitch & 0xffff);
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = width;
+     task->c64x_arg[4] = height;
+     task->c64x_arg[5] = key;
+     task->c64x_arg[6] = mask;
+
+     task->c64x_function = C64X_COPY_KEYED_16 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+static inline void
+davinci_c64x_blit_keyed_32__L( DavinciC64xTasks *tasks,
+                               unsigned long     dest,
+                               u32               dpitch,
+                               unsigned long     src,
+                               u32               spitch,
+                               u32               width,
+                               u32               height,
+                               u32               key,
+                               u32               mask )
+{
+     c64xTask *task = &tasks->tasks[tasks->num_tasks];
+
+     D_ASSERT( tasks->num_tasks < tasks->max_tasks );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = (dpitch << 16) | (spitch & 0xffff);
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = width;
+     task->c64x_arg[4] = height;
+     task->c64x_arg[5] = key;
+     task->c64x_arg[6] = mask;
+
+     task->c64x_function = C64X_COPY_KEYED_32 | C64X_FLAG_TODO;
+
+     tasks->num_tasks++;
+}
+
+static inline void
+davinci_c64x_blit_keyed_32( DavinciC64x   *c64x,
+                            unsigned long  dest,
+                            u32            dpitch,
+                            unsigned long  src,
+                            u32            spitch,
+                            u32            width,
+                            u32            height,
+                            u32            key,
+                            u32            mask )
+{
+     c64xTask *task = c64x_get_task( c64x );
+
+     task->c64x_arg[0] = dest;
+     task->c64x_arg[1] = (dpitch << 16) | (spitch & 0xffff);
+     task->c64x_arg[2] = src;
+     task->c64x_arg[3] = width;
+     task->c64x_arg[4] = height;
+     task->c64x_arg[5] = key;
+     task->c64x_arg[6] = mask;
+
+     task->c64x_function = C64X_COPY_KEYED_32 | C64X_FLAG_TODO;
+
+     c64x_submit_task( c64x, task );
+}
+
+#endif
+
diff --git a/gfxdrivers/davinci/davinci_gfxdriver.h b/gfxdrivers/davinci/davinci_gfxdriver.h
new file mode 100644
index 0000000..4ca79b3
--- /dev/null
+++ b/gfxdrivers/davinci/davinci_gfxdriver.h
@@ -0,0 +1,169 @@
+/*
+   TI Davinci driver - Graphics Driver
+
+   (c) Copyright 2007  Telio AG
+
+   Written by Denis Oliver Kropp <dok@directfb.org>
+
+   Code is derived from VMWare driver.
+
+   (c) Copyright 2001-2009  The world wide DirectFB Open Source Community (directfb.org)
+   (c) Copyright 2000-2004  Convergence (integrated media) GmbH
+
+   All rights reserved.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+*/
+
+#ifndef __DAVINCI_GFXDRIVER_H__
+#define __DAVINCI_GFXDRIVER_H__
+
+#include <sys/ioctl.h>
+#include <davincifb.h>
+
+#include <core/surface_buffer.h>
+
+#include "davincifb.h"
+
+#include "davinci_c64x.h"
+
+
+typedef struct {
+     /* validation flags */
+     int                       v_flags;
+
+     /* cached/computed values */
+     void                     *dst_addr;
+     unsigned long             dst_phys;
+     unsigned int              dst_size;
+     unsigned long             dst_pitch;
+     DFBSurfacePixelFormat     dst_format;
+     unsigned long             dst_bpp;
+
+     void                     *src_addr;
+     unsigned long             src_phys;
+     unsigned long             src_pitch;
+     DFBSurfacePixelFormat     src_format;
+     unsigned long             src_bpp;
+
+     unsigned long             source_mult;
+
+     unsigned long             fillcolor;
+
+     int                       blit_blend_sub_function;
+     int                       draw_blend_sub_function;
+
+     DFBColor                  color;
+     unsigned long             color_argb;
+     unsigned long             colorkey;
+
+     DFBSurfaceBlittingFlags   blitting_flags;
+
+     DFBRegion                 clip;
+
+     /** Add shared data here... **/
+     struct fb_fix_screeninfo  fix[4];
+
+     CoreSurfacePool          *osd_pool;
+     CoreSurfacePool          *video_pool;
+
+     bool                      synced;
+} DavinciDeviceData;
+
+
+typedef struct {
+     int                       num;
+     int                       fd;
+     void                     *mem;
+     int                       size;
+} DavinciFB;
+
+typedef struct {
+     DavinciDeviceData        *ddev;
+
+     CoreDFB                  *core;
+
+     CoreScreen               *screen;
+     CoreLayer                *osd;
+     CoreLayer                *video;
+
+     DavinciFB                 fb[4];
+
+     DavinciC64x               c64x;
+     bool                      c64x_present;
+
+     DavinciC64xTasks          tasks;
+} DavinciDriverData;
+
+
+static inline DFBResult
+davincifb_pan_display( const DavinciFB             *fb,
+                       struct fb_var_screeninfo    *var,
+                       const CoreSurfaceBufferLock *lock,
+                       DFBSurfaceFlipFlags          flags,
+                       int                          x,
+                       int                          y )
+{
+     int ret;
+
+     if (lock) {
+#ifdef FBIO_SET_START
+          CoreSurfaceBuffer   *buffer = lock->buffer;
+          struct fb_set_start  set_start;
+
+          /* physical mode */
+          set_start.offset   = -1;
+          set_start.sync     = (flags & DSFLIP_ONSYNC) ? 1 : 0;
+
+          /* life's so easy */
+          set_start.physical = lock->phys + DFB_BYTES_PER_LINE( buffer->format, x ) + y * lock->pitch;
+
+          ret = ioctl( fb->fd, FBIO_SET_START, &set_start );
+          if (ret < 0)
+               D_DEBUG( "FBIO_SET_START (0x%08lx, sync %llu) failed!\n",
+                         set_start.physical, set_start.sync );
+
+          if (ret == 0) {
+               if (flags & DSFLIP_WAIT)
+                    ioctl( fb->fd, FBIO_WAITFORVSYNC );
+
+               return DFB_OK;
+          }
+
+          /* fallback */
+#endif
+          var->xoffset = x;                  /* poor version */
+          var->yoffset = y + lock->offset / lock->pitch;
+     }
+     else {
+          var->xoffset = x;
+          var->yoffset = y;
+     }
+
+     var->activate = /*(flags & DSFLIP_ONSYNC) ? FB_ACTIVATE_VBL :*/ FB_ACTIVATE_NOW;
+
+     ret = ioctl( fb->fd, FBIOPAN_DISPLAY, var );
+     if (ret)
+          D_PERROR( "Davinci/FB: FBIOPAN_DISPLAY (fb%d - %d,%d) failed!\n",
+                    fb->num, var->xoffset, var->yoffset );
+
+     if (flags & DSFLIP_WAIT)
+          ioctl( fb->fd, FBIO_WAITFORVSYNC );
+
+     return DFB_OK;
+}
+
+#endif
diff --git a/gfxdrivers/davinci/davincifb.h b/gfxdrivers/davinci/davincifb.h
new file mode 100644
index 0000000..35eb169
--- /dev/null
+++ b/gfxdrivers/davinci/davincifb.h
@@ -0,0 +1,581 @@
+/* 
+ * Copyright (C) 2006 Texas Instruments Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option)any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * File: davincifb.h	
+ */
+
+#ifndef DAVINVI_VPBE_H
+#define DAVINVI_VPBE_H
+
+/* include Linux files */
+#include <linux/fb.h>
+
+/* define the custom FBIO_WAITFORVSYNC ioctl */
+#define FBIO_WAITFORVSYNC	_IOW('F', 0x20, u_int32_t)
+#define FBIO_SETATTRIBUTE       _IOW('F', 0x21, struct fb_fillrect)
+
+/* Backported IOCTLS. */
+#define FBIO_SETPOSX                            _IOW('F', 0x22, u_int32_t)
+#define FBIO_SETPOSY                            _IOW('F', 0x23, u_int32_t)
+#define FBIO_SETZOOM            		_IOW('F', 0x24, struct zoom_params)
+#define FBIO_GETSTD                             _IOR('F', 0x25, u_int32_t)
+#define FBIO_RESIZER		                _IOW('F', 0x26, struct vpfe_resizer_params)
+#define FBIO_SYNC		                _IOW('F', 0x27, u_int32_t)
+
+typedef struct zoom_params {
+	u_int32_t window_id;
+	u_int32_t zoom_h;
+	u_int32_t zoom_v;
+} zoom_params_t;
+
+typedef struct vpfe_resizer_params
+{
+	u_int32_t rsz_cnt;	//busy-lock
+	u_int32_t out_size;	//busy-lock
+	u_int32_t in_start;	//busy-lock
+	u_int32_t in_size;	//busy-lock
+	u_int32_t sdr_inadd;	//shadowed
+	u_int32_t sdr_inoff;	//shadowed
+	u_int32_t sdr_outadd;	//shadowed
+	u_int32_t sdr_outoff;	//shadowed
+	u_int32_t hfilt[16];	//busy-lock
+	u_int32_t vfilt[16];	//busy-lock
+	u_int32_t yenh;		//busy-lock
+} vpfe_resizer_params_t;
+
+typedef struct fb_set_start {
+	int		offset;		/* offset from smem_start */
+	unsigned long	physical;	/* absolute physical address when offset < 0 */
+
+	u_int64_t	sync;		/* input:  target sync counter for change or 0 for no sync at all,
+					   output: sync counter of actual change or 0 if still pending */
+} fb_set_start_t;
+
+
+#ifdef _IOC_TYPECHECK
+#undef _IOC_TYPECHECK
+#define _IOC_TYPECHECK(x)     (sizeof(x))
+#endif
+
+#define	RAM_CLUT_SIZE	256*3
+#define FBIO_ENABLE_DISABLE_WIN		\
+	_IOW('F', 0x30, unsigned char)
+#define FBIO_SET_BITMAP_BLEND_FACTOR	\
+	_IOW('F', 0x31, vpbe_bitmap_blend_params_t)
+#define FBIO_SET_BITMAP_WIN_RAM_CLUT    \
+	_IOW('F', 0x32, unsigned char)*RAM_CLUT_SIZE)
+#define FBIO_ENABLE_DISABLE_ATTRIBUTE_WIN \
+	_IOW('F', 0x33, unsigned int)
+#define FBIO_GET_BLINK_INTERVAL		\
+	_IOR('F', 0x34, vpbe_blink_option_t)
+#define FBIO_SET_BLINK_INTERVAL         \
+	_IOW('F', 0x35, vpbe_blink_option_t)
+#define FBIO_GET_VIDEO_CONFIG_PARAMS    \
+	_IOR('F', 0x36, vpbe_video_config_params_t)
+#define FBIO_SET_VIDEO_CONFIG_PARAMS    \
+	_IOW('F', 0x37, vpbe_video_config_params_t)
+#define FBIO_GET_BITMAP_CONFIG_PARAMS   \
+	_IOR('F', 0x38, vpbe_bitmap_config_params_t)
+#define FBIO_SET_BITMAP_CONFIG_PARAMS   \
+	_IOW('F', 0x39, vpbe_bitmap_config_params_t)
+#define FBIO_SET_DCLK                   \
+	_IOW('F', 0x40, vpbe_dclk_t)
+#define FBIO_SET_INTERFACE		\
+	_IOW('F', 0x41, unsigned char)
+#define FBIO_GET_INTERFACE		\
+	_IOR('F', 0x42, unsigned char)
+#define FBIO_QUERY_TIMING		\
+	_IOWR('F', 0x43, struct vpbe_mode_info)
+#define FBIO_SET_TIMING			\
+	_IOW('F', 0x44, struct vpbe_fb_videomode)
+#define FBIO_GET_TIMING                 \
+	_IOR('F', 0x45, struct vpbe_fb_videomode)
+#define FBIO_SET_VENC_CLK_SOURCE	\
+	_IOW('F', 0x46, unsigned char)
+#define FBIO_SET_BACKG_COLOR            \
+	_IOW('F', 0x47, vpbe_backg_color_t)
+#define FBIO_ENABLE_DISPLAY		\
+	_IOW('F', 0x48, unsigned char)
+#define FBIO_SETPOS            		\
+	_IOW('F', 0x49, u_int32_t)
+#define FBIO_SET_CURSOR         	\
+	_IOW('F', 0x50, struct fb_cursor)
+#define FBIO_SET_START     		\
+	_IOW('F', 0x66, struct fb_set_start)
+
+/* 
+ * Defines and Constants
+ */
+#ifdef __KERNEL__
+#define DAVINCIFB_DEVICE "davincifb"
+#define DAVINCIFB_DRIVER "davincifb"
+
+#define MULTIPLE_BUFFERING      1
+
+#ifdef MULTIPLE_BUFFERING
+#define DOUBLE_BUF      2
+#define TRIPLE_BUF      3
+#else
+#define DOUBLE_BUF      1
+#define TRIPLE_BUF      1
+#endif
+
+/* usage:	if (is_win(info->fix.id, OSD0)) ... */
+#define is_win(name, x) ((strcmp(name, x ## _FBNAME) == 0) ? 1 : 0)
+
+/*
+ * display controller register I/O routines
+ */
+u32 dispc_reg_in(u32 offset);
+u32 dispc_reg_out(u32 offset, u32 val);
+u32 dispc_reg_merge(u32 offset, u32 val, u32 mask);
+
+#endif				/*__KERNEL__*/
+
+/*  Error return codes  */
+#define VPBE_INVALID_PARA_VALUE         700
+#define VPBE_WRONG_WINDOW_ID            701
+#define VPBE_CURRENTLY_IN_REQUIRED_MODE 702
+#define VPBE_INSUFFICIENT_CLUT_VALUES   703
+#define VPBE_CLUT_WRITE_TIMEOUT         704
+#define VPBE_VID0_BUF_ADR_NULL          705
+#define VPBE_WINDOW_NOT_DISABLED        706
+#define VPBE_WINDOW_NOT_ENABLED         707
+
+#ifndef __KERNEL__
+/*  Window ID definations */
+#define OSD0      0
+#define VID0      1
+#define OSD1      2
+#define VID1      3
+#endif
+
+/* There are 4 framebuffers, each represented by an fb_info and
+ * a dm_win_info structure */
+#define OSD0_FBNAME "dm_osd0_fb"
+#define OSD1_FBNAME "dm_osd1_fb"
+#define VID0_FBNAME "dm_vid0_fb"
+#define VID1_FBNAME "dm_vid1_fb"
+
+/*  FIXME: Digital LCD RGB matrix coefficients */
+#define DLCD_DGY_VAL    0
+#define DLCD_DRV_VAL    0
+#define DLCD_DGU_VAL    0
+#define DLCD_DBU_VAL		0
+
+/* Defines for bitmap format */
+#define VPBE_BITMAP_BIT_1	1
+#define VPBE_BITMAP_BIT_2	2
+#define VPBE_BITMAP_BIT_4	4
+#define VPBE_BITMAP_BIT_8	8
+#define VPBE_BITMAP_RGB565	16
+#define VPBE_VIDEO_YUV422 	16
+#define VPBE_VIDEO_RGB888 	24
+
+/* Defines foe cursor parameter validation*/
+#define MAX_CURSOR_WIDTH	0x3FF
+#define MAX_CURSOR_HEIGHT	0x1FF
+#define MAX_CURSOR_LINEWIDTH    7
+
+#define BASEX		0x80
+#define BASEY		0x12
+#define BASEX_DLCD		0x59
+#define BASEY_DLCD		0x22
+
+/*
+ * Enumerations 
+ */
+/*  Enum for blending factor  */
+typedef enum vpbe_blend_factor {
+	OSD_CONTRIBUTION_ZERO = 0,
+	OSD_CONTRIBUTION_1_BY_8 = 1,
+	OSD_CONTRIBUTION_2_BY_8 = 2,
+	OSD_CONTRIBUTION_3_BY_8 = 3,
+	OSD_CONTRIBUTION_4_BY_8 = 4,
+	OSD_CONTRIBUTION_5_BY_8 = 5,
+	OSD_CONTRIBUTION_6_BY_8 = 6,
+	OSD_CONTRIBUTION_ONE = 7
+} vpbe_blend_factor_t;
+
+/*  Enum for Boolean variables  */
+typedef enum {
+	SET_0 = 0,
+	SET_1 = 1
+} CB_CR_ORDER, ATTRIBUTE, ROM_RAM_CLUT;
+
+/*  Defines for Display Interface */
+#define  PRGB		0
+#define  COMPOSITE      1
+#define  SVIDEO    	2
+#define  COMPONENT 	3
+#define  RGB       	4
+#define  YCC16     	5
+#define  YCC8      	6
+#define  SRGB      	7
+#define  EPSON     	8
+#define  CASIO1G   	9
+#define  UDISP     	10
+#define  STN       	11
+#define VPBE_MAX_INTERFACES	12
+
+/*  Defines for Display Mode */
+#define  LCD    0
+#define  NTSC	1
+#define  PAL    2
+#define  P525   3
+#define  P625   4
+
+#define DEFAULT_MODE 0
+#define  P480   0
+#define  P400   1
+#define  P350   2
+#define NON_EXISTING_MODE 255
+/*  Enable/Disable enum */
+typedef enum {
+	VPBE_DISABLE = 0,
+	VPBE_ENABLE = 1
+} ATTENUATION, TRANSPARENCY, EXPANSION, BLINKING;
+
+typedef enum clk_source {
+	CLK_SOURCE_CLK27 = 0,
+	CLK_SOURCE_CLK54 = 1,
+	CLK_SOURCE_VPBECLK = 2
+} CLK_SOURCE;
+
+/*
+ * Structures and Union Definitions
+ */
+
+/*  Structure for transparency and the blending factor for the bitmap window  */
+typedef struct vpbe_bitmap_blend_params {
+	unsigned int colorkey;	/* color key to be blend */
+	unsigned int enable_colorkeying;	/* enable color keying */
+	unsigned int bf;	/* valid range from 0 to 7 only. */
+} vpbe_bitmap_blend_params_t;
+
+/*  Structure for window expansion  */
+typedef struct vpbe_win_expansion {
+	EXPANSION horizontal;
+	EXPANSION vertical;	/* 1: Enable 0:disable */
+} vpbe_win_expansion_t;
+
+/*  Structure for OSD window blinking options */
+typedef struct vpbe_blink_option {
+	BLINKING blinking;	/* 1: Enable blinking 0: Disable */
+	unsigned int interval;	/* Valid only if blinking is 1 */
+} vpbe_blink_option_t;
+
+/*  Structure for DCLK parameters */
+typedef struct vpbe_dclk {
+	unsigned char dclk_pattern_width;
+	unsigned int dclk_pattern0;
+	unsigned int dclk_pattern1;
+	unsigned int dclk_pattern2;
+	unsigned int dclk_pattern3;
+} vpbe_dclk_t;
+
+/*  Structure for display format  */
+typedef struct vpbe_display_format {
+	unsigned char interface;	/* Output interface type */
+	unsigned char mode;	/* output mode */
+} vpbe_display_format_t;
+
+/*  Structure for background color  */
+typedef struct vpbe_backg_color {
+	unsigned char clut_select;	/* 2: RAM CLUT 1:ROM1 CLUT 0:ROM0 CLUT */
+	unsigned char color_offset;	/* index of color */
+} vpbe_backg_color_t;
+
+/*  Structure for Video window configurable parameters  */
+typedef struct vpbe_video_config_params {
+	CB_CR_ORDER cb_cr_order;	/*Cb/Cr order in input data for a pixel. */
+	/*    0: cb cr  1:  cr cb */
+	vpbe_win_expansion_t exp_info;	/* HZ/VT Expansion enable disable */
+} vpbe_video_config_params_t;
+
+/*Union of structures giving the CLUT index for the 1, 2, 4 bit bitmap values.*/
+typedef union vpbe_clut_idx {
+	struct _for_4bit_bimap {
+		unsigned char bitmap_val_0;
+		unsigned char bitmap_val_1;
+		unsigned char bitmap_val_2;
+		unsigned char bitmap_val_3;
+		unsigned char bitmap_val_4;
+		unsigned char bitmap_val_5;
+		unsigned char bitmap_val_6;
+		unsigned char bitmap_val_7;
+		unsigned char bitmap_val_8;
+		unsigned char bitmap_val_9;
+		unsigned char bitmap_val_10;
+		unsigned char bitmap_val_11;
+		unsigned char bitmap_val_12;
+		unsigned char bitmap_val_13;
+		unsigned char bitmap_val_14;
+		unsigned char bitmap_val_15;
+	} for_4bit_bimap;
+	struct _for_2bit_bimap {
+		unsigned char bitmap_val_0;
+		unsigned char dummy0[4];
+		unsigned char bitmap_val_1;
+		unsigned char dummy1[4];
+		unsigned char bitmap_val_2;
+		unsigned char dummy2[4];
+		unsigned char bitmap_val_3;
+	} for_2bit_bimap;
+	struct _for_1bit_bimap {
+		unsigned char bitmap_val_0;
+		unsigned char dummy0[14];
+		unsigned char bitmap_val_1;
+	} for_1bit_bimap;
+} vpbe_clut_idx_t;
+
+/*  Structure for bitmap window configurable parameters */
+typedef struct vpbe_bitmap_config_params {
+	/* Only for bitmap width = 1,2,4 bits */
+	vpbe_clut_idx_t clut_idx;
+	/* Attenuation value for YUV o/p for bitmap window */
+	unsigned char attenuation_enable;
+	/* 0: ROM DM270, 1:ROM DM320, 2:RAM CLUT */
+	unsigned char clut_select;
+} vpbe_bitmap_config_params_t;
+
+/*  Unioun for video/OSD configuration parameters  */
+typedef union vpbe_conf_params {
+
+	struct vpbe_video_params {
+		CB_CR_ORDER cb_cr_order;
+		/* HZ/VT Expansion enable disable */
+		vpbe_win_expansion_t exp_info;
+	} video_params;
+
+	struct vpbe_bitmap_params {
+		/* Attenuation value for YUV o/p */
+		ATTENUATION attenuation_enable;
+		/* 0: ROM DM270, 1: ROM DM320, 2:RAM CLUT */
+		unsigned char clut_select;
+		/* Only for bitmap width = 1,2,4 bits */
+		vpbe_clut_idx_t clut_idx;
+		/* 0: OSD window is bitmap window */
+		/* 1: OSD window is attribute window */
+		ATTRIBUTE enable_attribute;
+		/* To hold bps value. 
+		   Used to switch back from attribute to bitmap. */
+		unsigned int stored_bits_per_pixel;
+		/* Blending information */
+		vpbe_bitmap_blend_params_t blend_info;
+		/* OSD Blinking information */
+		vpbe_blink_option_t blink_info;
+	} bitmap_params;
+
+} vpbe_conf_params_t;
+
+typedef struct vpbe_video_params vpbe_video_params_t;
+typedef struct vpbe_bitmap_params vpbe_bitmap_params_t;
+
+/* Structure to hold window position */
+typedef struct vpbe_window_position {
+	unsigned int xpos;	/* X position of the window */
+	unsigned int ypos;	/* Y position of the window */
+} vpbe_window_position_t;
+
+#ifdef __KERNEL__
+/*  Structure for each window */
+typedef struct vpbe_dm_win_info {
+	struct fb_info info;
+	vpbe_window_position_t win_pos;	/* X,Y position of window */
+	/* Size of window is already there in var_info structure. */
+
+	dma_addr_t fb_base_phys;	/*framebuffer area */
+	unsigned int fb_base;	/*window memory pointer */
+	unsigned int fb_size;	/*memory size */
+	unsigned int pseudo_palette[17];
+	int alloc_fb_mem;
+	/*flag to identify if framebuffer area is fixed or not */
+	unsigned long sdram_address;
+	struct vpbe_dm_info *dm;
+	unsigned char window_enable;	/*Additions for all windows */
+	zoom_params_t zoom;	/*Zooming parameters */
+	unsigned char field_frame_select;	/*To select Field or frame */
+	unsigned char numbufs;	/*Number of buffers valid 2 or 3 */
+	vpbe_conf_params_t conf_params;
+	/*window configuration parameter union pointer */
+} vpbe_dm_win_info_t;
+#endif				/*__KERNEL__*/
+
+/*
+ *  Videmode structure for display interface and mode settings
+ */
+typedef struct vpbe_fb_videomode {
+	unsigned char name[10];	/* Mode name ( NTSC , PAL) */
+	unsigned int vmode;	/* FB_MODE_INTERLACED or FB_MODE_NON_INTERLACED */
+	unsigned int xres;	/* X Resolution of the display */
+	unsigned int yres;	/* Y Resolution of the display */
+	unsigned int fps;	/* frames per second */
+	/* Timing Parameters applicable for std = 0 only */
+	unsigned int left_margin;
+	unsigned int right_margin;
+	unsigned int upper_margin;
+	unsigned int lower_margin;
+	unsigned int hsync_len;
+	unsigned int vsync_len;
+	unsigned int sync;	/* 0: hsync -ve/vsync -ve */
+	/*1: hsync -ve/vsync +ve */
+	/*2: hsync +ve/vsync -ve */
+	/*3: hsync +ve/vsync +ve */
+	unsigned int basepx;	/* Display x,y start position */
+	unsigned int basepy;
+/*  1= Mode s available in modelist 0=Mode is not available in modelist */
+	unsigned int std;
+} vpbe_fb_videomode_t;
+
+/* Structure to interface videomode to application*/
+typedef struct vpbe_mode_info {
+	vpbe_fb_videomode_t vid_mode;
+	unsigned char interface;
+	unsigned char mode_idx;
+} vpbe_mode_info_t;
+
+#ifdef __KERNEL__
+/* 
+ * Structure for the driver holding information of windows, 
+ *  memory base addresses etc.
+ */
+typedef struct vpbe_dm_info {
+	vpbe_dm_win_info_t *osd0;
+	vpbe_dm_win_info_t *osd1;
+	vpbe_dm_win_info_t *vid0;
+	vpbe_dm_win_info_t *vid1;
+
+/* to map the registers */
+	dma_addr_t mmio_base_phys;
+	unsigned int mmio_base;
+	unsigned int mmio_size;
+
+	wait_queue_head_t vsync_wait;
+	unsigned int vsync_cnt;
+	int timeout;
+
+	/* this is the function that configures the output device (NTSC/PAL/LCD)
+	 * for the required output format (composite/s-video/component/rgb)
+	 */
+	void (*output_device_config) (void);
+
+	struct device *dev;
+
+	vpbe_backg_color_t backg;	/* background color */
+	vpbe_dclk_t dclk;	/*DCLK parameters */
+	vpbe_display_format_t display;	/*Display interface and mode */
+	vpbe_fb_videomode_t videomode;	/*Cuurent videomode */
+	char ram_clut[256][3];	/*RAM CLUT array */
+	struct fb_cursor cursor;	/* cursor config params from fb.h */
+/*Flag that indicates whether any of the display is enabled or not*/
+	int display_enable;
+} vpbe_dm_info_t;
+
+/*
+ * Functions Definitions for 'davincifb' module
+ */
+int vpbe_mem_alloc_window_buf(vpbe_dm_win_info_t *);
+int vpbe_mem_release_window_buf(vpbe_dm_win_info_t *);
+void init_display_function(vpbe_display_format_t *);
+int vpbe_mem_alloc_struct(vpbe_dm_win_info_t **);
+void set_vid0_default_conf(void);
+void set_vid1_default_conf(void);
+void set_osd0_default_conf(void);
+void set_osd1_default_conf(void);
+void set_cursor_default_conf(void);
+void set_dm_default_conf(void);
+void set_win_enable(char *, unsigned int);
+int within_vid0_limits(u32, u32, u32, u32);
+void vpbe_set_display_default(void);
+#ifdef __KERNEL__
+void set_win_position(char *, u32, u32, u32, u32);
+void change_win_param(int);
+void set_interlaced(char *, unsigned int);
+#endif /* __KERNEL__ */
+
+/*
+ *	Function definations for 'osd' module
+ */
+
+int vpbe_enable_window(vpbe_dm_win_info_t *);
+int vpbe_disable_window(vpbe_dm_win_info_t *);
+int vpbe_vid_osd_select_field_frame(u8 *, u8);
+int vpbe_bitmap_set_blend_factor(u8 *, vpbe_bitmap_blend_params_t *);
+int vpbe_bitmap_set_ram_clut(void);
+int vpbe_enable_disable_attribute_window(u32);
+int vpbe_get_blinking(u8 *, vpbe_blink_option_t *);
+int vpbe_set_blinking(u8 *, vpbe_blink_option_t *);
+int vpbe_set_vid_params(u8 *, vpbe_video_config_params_t *);
+int vpbe_get_vid_params(u8 *, vpbe_video_config_params_t *);
+int vpbe_bitmap_get_params(u8 *, vpbe_bitmap_config_params_t *);
+int vpbe_bitmap_set_params(u8 *, vpbe_bitmap_config_params_t *);
+int vpbe_set_cursor_params(struct fb_cursor *);
+int vpbe_set_vid_expansion(vpbe_win_expansion_t *);
+int vpbe_set_dclk(vpbe_dclk_t *);
+int vpbe_set_display_format(vpbe_display_format_t *);
+int vpbe_set_backg_color(vpbe_backg_color_t *);
+int vpbe_set_interface(u8);
+int vpbe_query_mode(vpbe_mode_info_t *);
+int vpbe_set_mode(struct vpbe_fb_videomode *);
+int vpbe_set_venc_clk_source(u8);
+void set_vid0_default_conf(void);
+void set_osd0_default_conf(void);
+void set_vid1_default_conf(void);
+void set_osd1_default_conf(void);
+void set_cursor_default_conf(void);
+void set_dm_default_conf(void);
+/*
+ * Function definations for 'venc' module
+ */
+
+void davincifb_ntsc_composite_config(void);
+void davincifb_ntsc_svideo_config(void);
+void davincifb_ntsc_component_config(void);
+void davincifb_pal_composite_config(void);
+void davincifb_pal_svideo_config(void);
+void davincifb_pal_component_config(void);
+
+void vpbe_davincifb_ntsc_rgb_config(void);
+void vpbe_davincifb_pal_rgb_config(void);
+void vpbe_davincifb_525p_component_config(void);
+void vpbe_davincifb_625p_component_config(void);
+
+void vpbe_enable_venc(int);
+void vpbe_enable_dacs(int);
+/*
+ * Function definations for 'dlcd' module
+ */
+void vpbe_davincifb_480p_prgb_config(void);
+void vpbe_davincifb_400p_prgb_config(void);
+void vpbe_davincifb_350p_prgb_config(void);
+void vpbe_set_display_timing(struct vpbe_fb_videomode *);
+
+void vpbe_enable_lcd(int);
+/*
+ * Following functions are not implemented
+ */
+void vpbe_davincifb_default_ycc16_config(void);
+void vpbe_davincifb_default_ycc8_config(void);
+void vpbe_davincifb_default_srgb_config(void);
+void vpbe_davincifb_default_epson_config(void);
+void vpbe_davincifb_default_casio_config(void);
+void vpbe_davincifb_default_UDISP_config(void);
+void vpbe_davincifb_default_STN_config(void);
+#endif				/*__KERNEL__*/
+
+#endif				/* End of #ifndef DAVINCI_VPBE_H */
