Patchwork [v4,1/2] ti-gfx: add new package

login
register
mail settings
Submitter Spenser Gilliland
Date July 10, 2013, 6:09 p.m.
Message ID <1373479755-8086-1-git-send-email-spenser@gillilanding.com>
Download mbox | patch
Permalink /patch/258186/
State Superseded
Headers show

Comments

Spenser Gilliland - July 10, 2013, 6:09 p.m.
adds accelerated GPU support for the OMAP35xx, AM35xx, AM37xx, DM37xx,
AM387x, C6A814x, AM389x, C6A816x, and AM335x platforms.

Signed-off-by: Spenser Gilliland <spenser@gillilanding.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Sundareson, Prabindh <prabu@ti.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
---
v4:
 - Fix header issue with qt.
 - Add eglimage version installation.
v3:
 - integrate reviews from thomas.
 - Add qt patch
v2:
 - Take into account reviews.
 - Simplfy init script.
 - Fix header installation.
v1:
 - Added .pc files
 - all review issues addressed
RFC v3:
 - all reviews addressed
 - added demos
 - added hard float (not runtime tested)
 - added init script
 - added SGX detection script (untested)
 - tested on beaglexm using demos
RFC v2:
 - basic working with minor issues during tests
RFC v1:
 - inital revision
---
 package/Config.in                              |   1 +
 package/opengl/libegl/libegl.mk                |   4 +
 package/opengl/libgles/libgles.mk              |   4 +
 package/ti-gfx/Config.in                       |  68 +++++++++
 package/ti-gfx/S80ti-gfx                       |  54 +++++++
 package/ti-gfx/egl.pc                          |  10 ++
 package/ti-gfx/esrev.sh                        |  59 ++++++++
 package/ti-gfx/glesv2.pc                       |  10 ++
 package/ti-gfx/powervr.ini                     |   2 +
 package/ti-gfx/ti-gfx-km_install_modules.patch |  19 +++
 package/ti-gfx/ti-gfx-newclkapi.patch          | 143 ++++++++++++++++++
 package/ti-gfx/ti-gfx.mk                       | 192 +++++++++++++++++++++++++
 12 files changed, 566 insertions(+)
 create mode 100644 package/ti-gfx/Config.in
 create mode 100644 package/ti-gfx/S80ti-gfx
 create mode 100644 package/ti-gfx/egl.pc
 create mode 100644 package/ti-gfx/esrev.sh
 create mode 100644 package/ti-gfx/glesv2.pc
 create mode 100644 package/ti-gfx/powervr.ini
 create mode 100644 package/ti-gfx/ti-gfx-km_install_modules.patch
 create mode 100644 package/ti-gfx/ti-gfx-newclkapi.patch
 create mode 100644 package/ti-gfx/ti-gfx.mk
Thomas Petazzoni - July 11, 2013, 9:41 a.m.
Dear Spenser Gilliland,

On Wed, 10 Jul 2013 13:09:12 -0500, Spenser Gilliland wrote:

> +comment "requires an eglibc/glibc based toolchain and the linux kernel"
> +	depends on !(BR2_LINUX_KERNEL && BR2_TOOLCHAIN_USES_GLIBC && BR2_arm)

When a comment like this a shown, the package option is not visible, so
you must mention the package name in the comment, otherwise it's
impossible for the user to understand what the comment is about. So it
should be:

comment "ti-gfx requires ..."

> +define TI_GFX_CONFIGURE_CMDS
> +	$(if $(BR2_PACKAGE_TI_GFX_EGLIMAGE),
> +		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libEGL_eglimage.so \
> +			$(@D)/$(TI_GFX_BIN_PATH)/libEGL.so; \
> +		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libGLES_CM_eglimage.so \
> +			$(@D)/$(TI_GFX_BIN_PATH)/libGLES_CM.so; \
> +		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libGLESv2_eglimage.so \
> +		   $(@D)/$(TI_GFX_BIN_PATH)/libGLESv2.so; \
> +		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libglslcompiler_eglimage.so \
> +			$(@D)/$(TI_GFX_BIN_PATH)/libglslcompiler.so; \
> +		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libIMGegl_eglimage.so \
> +			$(@D)/$(TI_GFX_BIN_PATH)/libIMGegl.so;
> +	)

This seems not really nice to do, it should be handled at install time.

> +endef
> +
> +define TI_GFX_BUILD_KM_CMDS
> +	$(MAKE) $(TI_GFX_KM_MAKE_OPTS) -C $(@D)/GFX_Linux_KM all
> +endef
> +
> +define TI_GFX_BUILD_DEMO_CMDS
> +	$(foreach demo, $(TI_GFX_DEMOS), \
> +		cd $(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_MAKE_LOC); \
> +		$(TARGET_MAKE_ENV) $(MAKE1) $(TI_GFX_DEMO_MAKE_OPTS) all

	$(MAKE1) -C $(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_MAKE_LOC)

will avoid the need for the cd.

> +	)
> +endef
> +
> +define TI_GFX_BUILD_CMDS
> +	$(TI_GFX_BUILD_KM_CMDS)
> +	$(if $(BR2_PACKAGE_TI_GFX_DEMOS),
> +		$(TI_GFX_BUILD_DEMO_CMDS)
> +	)
> +endef

I think I've said it before, but we generally do:

ifeq ($(BR2_PACKAGE_TI_GFX_DEMOS),y)
define TI_GFX_BUILD_DEMO_CMDS
	...
endef
endif

define TI_GFX_BUILD_CMDS
	...
	$(TI_GFX_BUILD_DEMO_CMDS)
endef

> +
> +define TI_GFX_INSTALL_STAGING_CMDS
> +	$(foreach incdir,$(TI_GFX_HDR_DIRS),
> +		$(INSTALL) -d $(STAGING_DIR)/usr/include/$(notdir $(incdir)); \
> +		$(INSTALL) -D -m 0644 $(@D)/include/$(incdir)/*.h \
> +			$(STAGING_DIR)/usr/include/$(notdir $(incdir))/
> +	)
> +	$(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/*.so $(STAGING_DIR)/usr/lib/
> +	$(INSTALL) -D -m 0644 package/ti-gfx/egl.pc $(STAGING_DIR)/usr/lib/pkgconfig/
> +	$(INSTALL) -D -m 0644 package/ti-gfx/glesv2.pc $(STAGING_DIR)/usr/lib/pkgconfig/
> +endef
> +
> +define TI_GFX_INSTALL_KM_CMDS
> +	$(MAKE) $(TI_GFX_KM_MAKE_OPTS) -C $(@D)/GFX_Linux_KM install
> +endef
> +
> +define TI_GFX_INSTALL_BINS_CMDS
> +	$(foreach bin,$(TI_GFX_BIN),
> +		$(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/$(bin) \
> +			$(TARGET_DIR)/usr/bin/$(bin)
> +	)
> +	$(if $(BR2_PACKAGE_TI_GFX_DEBUG),
> +		$(INSTALL) -D -m 0755 package/ti-gfx/esrev.sh \
> +			$(TARGET_DIR)/usr/bin/esrev)
> +endef
> +
> +define TI_GFX_INSTALL_LIBS_CMDS
> +	# create symlinks and install libraries.  these libraries do not have a 
> +	# SONAME defined; therefore, they will not be automatically renamed and 
> +	# must be renamed manually.

I still don't understand this "automatically renamed" comment here.

> +	$(foreach lib,$(TI_GFX_LIBS),
> +		$(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/$(lib).so \
> +			$(TARGET_DIR)/usr/lib/$(lib).so.$(TI_GFX_SO_VERSION); \
> +		ln -sf $(lib).so.$(TI_GFX_SO_VERSION) \
> +			$(TARGET_DIR)/usr/lib/$(lib).so
> +	)
> +	# libs use the following file for configuration.
> +	$(INSTALL) -D -m 0644 package/ti-gfx/powervr.ini \
> +		$(TARGET_DIR)/etc/powervr.ini
> +endef
> +
> +ifeq ($(BR2_PACKAGE_TI_GFX_DEMOS),y)
> +define TI_GFX_INSTALL_DEMOS_CMDS
> +	$(foreach demo,$(TI_GFX_DEMOS),
> +		$(INSTALL) -D -m 0755 \
> +		$(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_BIN_LOC)/OGLES2$(demo) \
> +		$(TARGET_DIR)/usr/bin/OGLES2$(demo)
> +	)
> +endef
> +endif
> +
> +define TI_GFX_INSTALL_INIT_SYSV
> +	$(INSTALL) -D -m 0755 package/ti-gfx/S80ti-gfx \
> +		$(TARGET_DIR)/etc/init.d/S80ti-gfx
> +endef
> +
> +define TI_GFX_INSTALL_TARGET_CMDS
> +	$(TI_GFX_INSTALL_KM_CMDS)
> +	$(TI_GFX_INSTALL_BINS_CMDS)
> +	$(TI_GFX_INSTALL_LIBS_CMDS)
> +	$(if $(BR2_PACKAGE_TI_GFX_DEMOS),
> +		$(TI_GFX_INSTALL_DEMOS_CMDS)
> +	)

Same comment as above for demo build, especially since
TI_GFX_INSTALL_DEMOS_CMDS is not defined when BR2_PACKAGE_TI_GFX_DEMOS
is not enabled.

> +endef
> +
> +$(eval $(generic-package))

Thanks!

Thomas
Spenser Gilliland - July 11, 2013, 4:07 p.m.
Thomas,

> When a comment like this a shown, the package option is not visible, so
> you must mention the package name in the comment, otherwise it's
> impossible for the user to understand what the comment is about. So it
> should be:
>
> comment "ti-gfx requires ..."

Will fix.

>> +define TI_GFX_CONFIGURE_CMDS
>> +     $(if $(BR2_PACKAGE_TI_GFX_EGLIMAGE),
>> +             mv -f $(@D)/$(TI_GFX_BIN_PATH)/libEGL_eglimage.so \
>> +                     $(@D)/$(TI_GFX_BIN_PATH)/libEGL.so; \
>> +             mv -f $(@D)/$(TI_GFX_BIN_PATH)/libGLES_CM_eglimage.so \
>> +                     $(@D)/$(TI_GFX_BIN_PATH)/libGLES_CM.so; \
>> +             mv -f $(@D)/$(TI_GFX_BIN_PATH)/libGLESv2_eglimage.so \
>> +                $(@D)/$(TI_GFX_BIN_PATH)/libGLESv2.so; \
>> +             mv -f $(@D)/$(TI_GFX_BIN_PATH)/libglslcompiler_eglimage.so \
>> +                     $(@D)/$(TI_GFX_BIN_PATH)/libglslcompiler.so; \
>> +             mv -f $(@D)/$(TI_GFX_BIN_PATH)/libIMGegl_eglimage.so \
>> +                     $(@D)/$(TI_GFX_BIN_PATH)/libIMGegl.so;
>> +     )
>
> This seems not really nice to do, it should be handled at install time.

Will fix.

>> +endef
>> +
>> +define TI_GFX_BUILD_KM_CMDS
>> +     $(MAKE) $(TI_GFX_KM_MAKE_OPTS) -C $(@D)/GFX_Linux_KM all
>> +endef
>> +
>> +define TI_GFX_BUILD_DEMO_CMDS
>> +     $(foreach demo, $(TI_GFX_DEMOS), \
>> +             cd $(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_MAKE_LOC); \
>> +             $(TARGET_MAKE_ENV) $(MAKE1) $(TI_GFX_DEMO_MAKE_OPTS) all
>
>         $(MAKE1) -C $(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_MAKE_LOC)
>
> will avoid the need for the cd.

Will fix.

>> +     )
>> +endef
>> +
>> +define TI_GFX_BUILD_CMDS
>> +     $(TI_GFX_BUILD_KM_CMDS)
>> +     $(if $(BR2_PACKAGE_TI_GFX_DEMOS),
>> +             $(TI_GFX_BUILD_DEMO_CMDS)
>> +     )
>> +endef
>
> I think I've said it before, but we generally do:
>
> ifeq ($(BR2_PACKAGE_TI_GFX_DEMOS),y)
> define TI_GFX_BUILD_DEMO_CMDS
>         ...
> endef
> endif
>
> define TI_GFX_BUILD_CMDS
>         ...
>         $(TI_GFX_BUILD_DEMO_CMDS)
> endef

Ok I think I understand this better now.  Will fix.

>> +
>> +define TI_GFX_INSTALL_STAGING_CMDS
>> +     $(foreach incdir,$(TI_GFX_HDR_DIRS),
>> +             $(INSTALL) -d $(STAGING_DIR)/usr/include/$(notdir $(incdir)); \
>> +             $(INSTALL) -D -m 0644 $(@D)/include/$(incdir)/*.h \
>> +                     $(STAGING_DIR)/usr/include/$(notdir $(incdir))/
>> +     )
>> +     $(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/*.so $(STAGING_DIR)/usr/lib/
>> +     $(INSTALL) -D -m 0644 package/ti-gfx/egl.pc $(STAGING_DIR)/usr/lib/pkgconfig/
>> +     $(INSTALL) -D -m 0644 package/ti-gfx/glesv2.pc $(STAGING_DIR)/usr/lib/pkgconfig/
>> +endef
>> +
>> +define TI_GFX_INSTALL_KM_CMDS
>> +     $(MAKE) $(TI_GFX_KM_MAKE_OPTS) -C $(@D)/GFX_Linux_KM install
>> +endef
>> +
>> +define TI_GFX_INSTALL_BINS_CMDS
>> +     $(foreach bin,$(TI_GFX_BIN),
>> +             $(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/$(bin) \
>> +                     $(TARGET_DIR)/usr/bin/$(bin)
>> +     )
>> +     $(if $(BR2_PACKAGE_TI_GFX_DEBUG),
>> +             $(INSTALL) -D -m 0755 package/ti-gfx/esrev.sh \
>> +                     $(TARGET_DIR)/usr/bin/esrev)
>> +endef
>> +
>> +define TI_GFX_INSTALL_LIBS_CMDS
>> +     # create symlinks and install libraries.  these libraries do not have a
>> +     # SONAME defined; therefore, they will not be automatically renamed and
>> +     # must be renamed manually.
>
> I still don't understand this "automatically renamed" comment here.

i remember hearing that in some rootfs fixup, the libraries are
renamed with symlinks according to the SONAME.  However, I can't find
it in the code so maybe this was just bad information.  I'll remove
the comment.

>> +     $(foreach lib,$(TI_GFX_LIBS),
>> +             $(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/$(lib).so \
>> +                     $(TARGET_DIR)/usr/lib/$(lib).so.$(TI_GFX_SO_VERSION); \
>> +             ln -sf $(lib).so.$(TI_GFX_SO_VERSION) \
>> +                     $(TARGET_DIR)/usr/lib/$(lib).so
>> +     )
>> +     # libs use the following file for configuration.
>> +     $(INSTALL) -D -m 0644 package/ti-gfx/powervr.ini \
>> +             $(TARGET_DIR)/etc/powervr.ini
>> +endef
>> +
>> +ifeq ($(BR2_PACKAGE_TI_GFX_DEMOS),y)
>> +define TI_GFX_INSTALL_DEMOS_CMDS
>> +     $(foreach demo,$(TI_GFX_DEMOS),
>> +             $(INSTALL) -D -m 0755 \
>> +             $(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_BIN_LOC)/OGLES2$(demo) \
>> +             $(TARGET_DIR)/usr/bin/OGLES2$(demo)
>> +     )
>> +endef
>> +endif
>> +
>> +define TI_GFX_INSTALL_INIT_SYSV
>> +     $(INSTALL) -D -m 0755 package/ti-gfx/S80ti-gfx \
>> +             $(TARGET_DIR)/etc/init.d/S80ti-gfx
>> +endef
>> +
>> +define TI_GFX_INSTALL_TARGET_CMDS
>> +     $(TI_GFX_INSTALL_KM_CMDS)
>> +     $(TI_GFX_INSTALL_BINS_CMDS)
>> +     $(TI_GFX_INSTALL_LIBS_CMDS)
>> +     $(if $(BR2_PACKAGE_TI_GFX_DEMOS),
>> +             $(TI_GFX_INSTALL_DEMOS_CMDS)
>> +     )
>
> Same comment as above for demo build, especially since
> TI_GFX_INSTALL_DEMOS_CMDS is not defined when BR2_PACKAGE_TI_GFX_DEMOS
> is not enabled.

Wil fix.

>> +endef
>> +
>> +$(eval $(generic-package))
>
> Thanks!
>
> Thomas
> --
> Thomas Petazzoni, Free Electrons
> Kernel, drivers, real-time and embedded Linux
> development, consulting, training and support.
> http://free-electrons.com



--
Spenser Gilliland
Computer Engineer
Doctoral Candidate
Yann E. MORIN - July 12, 2013, 4:23 p.m.
Spenser, All,

On 2013-07-11 11:07 -0500, Spenser Gilliland spake thusly:
[--SNIP--]
> >> +define TI_GFX_INSTALL_LIBS_CMDS
> >> +     # create symlinks and install libraries.  these libraries do not have a
> >> +     # SONAME defined; therefore, they will not be automatically renamed and
> >> +     # must be renamed manually.
> >
> > I still don't understand this "automatically renamed" comment here.
> 
> i remember hearing that in some rootfs fixup, the libraries are
> renamed with symlinks according to the SONAME.  However, I can't find
> it in the code so maybe this was just bad information.

No, that's not done.

I suggested the idea that, by renaming the libraries to their SONAME, we
could get rid of the symlinks (since we do not need them at runtime), and
thus reduce the number of inodes needed (since symlinks take one inode
each), and thus reduce the filesystem size.

But the gain would be small, and almost un-noticeable on large
filesystem with biggish libs (Qt, Xorg...), so doing it in Buildroot has
been deemed too complex given the small size it would gain.

If anyone wants to do it, it would be fit for a post-build script.

Regards,
Yann E. MORIN.

Patch

diff --git a/package/Config.in b/package/Config.in
index 7c24dab..c8b90a8 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -292,6 +292,7 @@  source "package/snowball-hdmiservice/Config.in"
 source "package/sredird/Config.in"
 source "package/statserial/Config.in"
 source "package/sysstat/Config.in"
+source "package/ti-gfx/Config.in"
 source "package/ti-utils/Config.in"
 source "package/uboot-tools/Config.in"
 source "package/udev/Config.in"
diff --git a/package/opengl/libegl/libegl.mk b/package/opengl/libegl/libegl.mk
index bd8040d..00e1f19 100644
--- a/package/opengl/libegl/libegl.mk
+++ b/package/opengl/libegl/libegl.mk
@@ -10,6 +10,10 @@  ifeq ($(BR2_PACKAGE_RPI_USERLAND),y)
 LIBEGL_DEPENDENCIES += rpi-userland
 endif
 
+ifeq ($(BR2_PACKAGE_TI_GFX),y)
+LIBEGL_DEPENDENCIES += ti-gfx
+endif
+
 ifeq ($(LIBEGL_DEPENDENCIES),)
 define LIBEGL_CONFIGURE_CMDS
 	echo "No libEGL implementation selected. Configuration error."
diff --git a/package/opengl/libgles/libgles.mk b/package/opengl/libgles/libgles.mk
index a0048a7..d2fe11b 100644
--- a/package/opengl/libgles/libgles.mk
+++ b/package/opengl/libgles/libgles.mk
@@ -10,6 +10,10 @@  ifeq ($(BR2_PACKAGE_RPI_USERLAND),y)
 LIBGLES_DEPENDENCIES += rpi-userland
 endif
 
+ifeq ($(BR2_PACKAGE_TI_GFX),y)
+LIBGLES_DEPENDENCIES += ti-gfx
+endif
+
 ifeq ($(LIBGLES_DEPENDENCIES),)
 define LIBGLES_CONFIGURE_CMDS
 	echo "No libGLES implementation selected. Configuration error."
diff --git a/package/ti-gfx/Config.in b/package/ti-gfx/Config.in
new file mode 100644
index 0000000..4d67371
--- /dev/null
+++ b/package/ti-gfx/Config.in
@@ -0,0 +1,68 @@ 
+config BR2_PACKAGE_TI_GFX
+	bool "ti-gfx"
+	select BR2_PACKAGE_HAS_OPENGL_EGL
+	select BR2_PACKAGE_HAS_OPENGL_ES
+	depends on BR2_LINUX_KERNEL && BR2_TOOLCHAIN_USES_GLIBC && BR2_arm
+	help
+	  Graphics libraries for TI boards.
+
+	  http://downloads.ti.com/dsps/dsps_public_sw/gfxsdk/
+
+if BR2_PACKAGE_TI_GFX
+
+config BR2_PACKAGE_TI_GFX_DEBUG
+	bool "enable debug support"
+	help
+	  Turns on debugging in the kernel module, install libraries built with
+	  debugging enabled, installs various tests and installs esrev script.
+
+config BR2_PACKAGE_TI_GFX_DEMOS
+	bool "install demos"
+	default y
+	help
+	  Install the OGLES2ChameleonMan and OGLES2MagicLantern demos
+
+config BR2_PACKAGE_TI_GFX_EGLIMAGE
+	bool "install eglimage version of libraries"
+	help
+	  Installs OpenGL libaries which support the eglimage api.
+
+config BR2_PACKAGE_TI_GFX_HARD_FLOAT
+	bool "use hard float binaries"
+	help
+	  Install hard float binaries (required if using a hard float toolchain)
+
+choice
+	prompt "Target"
+	default BR2_PACKAGE_TI_GFX_ES3
+	help
+	  Select the SOC for which you would like to install drivers. Please 
+	  use the chart at
+	  http://processors.wiki.ti.com/index.php/OMAP35x_Graphics_SDK_Getting_Started_Guide
+
+config BR2_PACKAGE_TI_GFX_ES3
+	bool "es3.x (OMAP35xx, AM35xx Rev 3.1+)"
+	help
+	 OMAP35xx, AM35xx Rev 3.1+ 
+
+config BR2_PACKAGE_TI_GFX_ES5
+	bool "es5.x (AM37xx, DM37xx)"
+	help
+	  AM37xx, DM37xx
+
+config BR2_PACKAGE_TI_GFX_ES6
+	bool "es6.x (AM387x, C6A814x, AM389x, C6A816x)"
+	help
+	  AM387x, C6A814x, AM389x, C6A816x
+
+config BR2_PACKAGE_TI_GFX_ES8
+	bool "es8.x (AM335x)"
+	help
+	  AM335x
+
+endchoice
+
+endif
+
+comment "requires an eglibc/glibc based toolchain and the linux kernel"
+	depends on !(BR2_LINUX_KERNEL && BR2_TOOLCHAIN_USES_GLIBC && BR2_arm)
diff --git a/package/ti-gfx/S80ti-gfx b/package/ti-gfx/S80ti-gfx
new file mode 100644
index 0000000..ee2250e
--- /dev/null
+++ b/package/ti-gfx/S80ti-gfx
@@ -0,0 +1,54 @@ 
+#!/bin/sh
+
+start() {
+	echo "ti-gfx: starting pvr driver"
+
+	BITSPERPIXEL="$(fbset | awk '/geom/ {print $6}')"
+	YRES="$(fbset | awk '/geom/ {print $3}')"
+	# Set RGBA ordering to something the drivers like
+	if [ "$BITSPERPIXEL" = "32" ] ; then
+		fbset -rgba 8/16,8/8,8/0,8/24
+	fi
+	# Try to enable triple buffering when there's enough VRAM
+	fbset -vyres $(( YRES*3 ))
+
+	modprobe omaplfb
+	modprobe bufferclass_ti
+
+	pvr_maj=$(awk '$2=="pvrsrvkm" { print $1; }' /proc/devices)
+	if [ -e /dev/pvrsrvkm ] ; then
+		rm -f /dev/pvrsrvkm
+	fi
+
+	mknod /dev/pvrsrvkm c $pvr_maj 0
+	chmod 666 /dev/pvrsrvkm
+
+	if ! /usr/bin/pvrsrvctl --start --no-module; then
+		echo "ti-gfx: unable to start server"
+	fi
+}	
+
+stop() {
+	echo "ti-gfx: stopping pvr driver"
+
+	rmmod bufferclass_ti
+	rmmod omaplfb
+	rmmod pvrsrvkm
+}
+
+case "$1" in 
+start)
+	start
+;;
+stop)
+	stop
+;;
+restart)
+	stop
+	start
+;;
+*)
+	echo "ti-gfx: Please use start, stop, or restart."
+	exit 1
+;;
+esac
diff --git a/package/ti-gfx/egl.pc b/package/ti-gfx/egl.pc
new file mode 100644
index 0000000..9f6ed51
--- /dev/null
+++ b/package/ti-gfx/egl.pc
@@ -0,0 +1,10 @@ 
+prefix=/usr/
+exec_prefix=/usr/
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: egl
+Description: TI Graphics SDK implementation of EGL
+Version: 1.9.2188537
+Libs: -L${libdir} -lEGL -lIMGegl
+Cflags: -I{includedir}/EGL/
diff --git a/package/ti-gfx/esrev.sh b/package/ti-gfx/esrev.sh
new file mode 100644
index 0000000..bd8b64e
--- /dev/null
+++ b/package/ti-gfx/esrev.sh
@@ -0,0 +1,59 @@ 
+#!/bin/sh
+
+# Debug script to determine proper ES revision for the current board. The 
+# pvrsrvkm module must be insmoded before attempting to get the es rev.
+
+machine_id() { # return the machine ID
+	awk 'BEGIN { FS=": " } /Hardware/ \
+		{ gsub(" ", "_", $2); print tolower($2) } ' </proc/cpuinfo
+}
+
+if [ "$(machine_id)" = "ti8168evm" ] ; then
+	CPUTYPE=TI816x
+elif [ "$(machine_id)" = "am335xevm" ] ; then
+	CPUTYPE=TI33XX
+else
+	CPUTYPE=$(devmem 0x4800244c | sed -e 's/0x00005C00/OMAP3503/' \
+	                                  -e 's/0x00001C00/OMAP3515/' \
+	                                  -e 's/0x00004C00/OMAP3525/' \
+	                                  -e 's/0x00000C00/OMAP3530/' \
+	                                  -e 's/0x00005E00/OMAP3503/' \
+	                                  -e 's/0x00001E00/OMAP3515/' \
+	                                  -e 's/0x00004E00/OMAP3525/' \
+	                                  -e 's/0x00000E00/OMAP3530/' \
+	                                  -e 's/0x00000CC0/OMAP3530/' )
+	if [[ "$(echo $CPUTYPE | grep OMAP)" == "" ]]; then
+		echo "Unable to determine CPU type"
+		exit 1
+	fi
+fi
+
+case $CPUTYPE in
+"OMAP3530")
+	devmem 0x48004B48 w 0x2
+	devmem 0x48004B10 w 0x1
+	devmem 0x48004B00 w 0x2
+
+	ES_REVISION="$(devmem 0x50000014 | sed -e s:0x00010205:5: \
+		-e s:0x00010201:3: -e s:0x00010003:2:)"
+	;;
+"TI33XX")
+	devmem 0x44e01104 w 0x0
+	devmem 0x44e00904 w 0x2
+
+	ES_REVISION="$(devmem 0x56000014 | sed -e s:0x00010205:8:)"
+	;;
+"TI816x")
+	devmem 0x48180F04 w 0x0
+	devmem 0x48180900 w 0x2
+	devmem 0x48180920 w 0x2
+
+	ES_REVISION="$(devmem2 0x56000014 | sed -e s:0x00010205:6: -e s:0x00010201:3: -e s:0x00010003:2: | tail -n1 | awk -F': ' '{print $2}')"
+	;;
+*)
+	echo Unable to determine SGX hardware
+	exit 2
+	;;
+esac
+
+echo $ES_REVISION
diff --git a/package/ti-gfx/glesv2.pc b/package/ti-gfx/glesv2.pc
new file mode 100644
index 0000000..e646e2e
--- /dev/null
+++ b/package/ti-gfx/glesv2.pc
@@ -0,0 +1,10 @@ 
+prefix=/usr
+exec_prefix=/usr
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: glesv2
+Description: TI Graphics SDK implementation of OpenGL ESv2
+Version: 1.9.2188537
+Libs: -L${libdir} -lGLESv2 -lGLES_CM -lsrv_um -lusc -lEGL -lIMGegl
+Cflags: -I${includedir}/
diff --git a/package/ti-gfx/powervr.ini b/package/ti-gfx/powervr.ini
new file mode 100644
index 0000000..8d2d853
--- /dev/null
+++ b/package/ti-gfx/powervr.ini
@@ -0,0 +1,2 @@ 
+[default]
+WindowSystem=libpvrPVR2D_FRONTWSEGL.so
diff --git a/package/ti-gfx/ti-gfx-km_install_modules.patch b/package/ti-gfx/ti-gfx-km_install_modules.patch
new file mode 100644
index 0000000..2cf6e81
--- /dev/null
+++ b/package/ti-gfx/ti-gfx-km_install_modules.patch
@@ -0,0 +1,19 @@ 
+Patch to add modules_install target to the modules makefile.  This makes
+installation a little easier.
+
+Signed-off-by: Spenser Gilliland <spenser@gillilanding.com>
+----
+Index: ti-gfx-4_09_00_01/GFX_Linux_KM/Makefile
+===================================================================
+--- ti-gfx-4_09_00_01.orig/GFX_Linux_KM/Makefile	2013-03-07 11:00:11.000000000 -0600
++++ ti-gfx-4_09_00_01/GFX_Linux_KM/Makefile	2013-05-23 01:36:29.356676281 -0500
+@@ -479,6 +479,9 @@
+ all:
+ 	$(MAKE) -C $(KERNELDIR) M=`pwd` $*
+ 
++install:
++	$(MAKE) -C $(KERNELDIR) M=`pwd` modules_install
++
+ clean:
+ 	@find . -name "*.o" -exec rm -r {} \;
+ 	@find . -name "*.ko" -exec rm -r {} \;
diff --git a/package/ti-gfx/ti-gfx-newclkapi.patch b/package/ti-gfx/ti-gfx-newclkapi.patch
new file mode 100644
index 0000000..8f50c7e
--- /dev/null
+++ b/package/ti-gfx/ti-gfx-newclkapi.patch
@@ -0,0 +1,143 @@ 
+This patch adjusts the omap3630 portion of the powervr driver to use the new
+clk kernel api.
+
+Signed-off-by: Spenser Gilliland <spenser@gillilanding.com>
+----
+Index: ti-gfx-4_09_00_01/GFX_Linux_KM/services4/system/omap3630/sysutils_linux.c
+===================================================================
+--- ti-gfx-4_09_00_01.orig/GFX_Linux_KM/services4/system/omap3630/sysutils_linux.c	2013-06-28 13:44:06.352701522 -0500
++++ ti-gfx-4_09_00_01/GFX_Linux_KM/services4/system/omap3630/sysutils_linux.c	2013-06-28 13:45:12.364702727 -0500
+@@ -153,6 +153,49 @@
+ 	psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS;
+ }
+ 
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)
++int clk_disable_unprepare(struct clk *clk)
++{
++	return clk_disable(clk);
++}
++#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
++int clk_disable_unprepare(struct clk *clk)
++{
++	res = clk_disable(clk);
++	if (res < 0)
++		return res;
++
++	res = clk_unprepare(clk);
++	if (ret < 0)
++		return res;
++
++	return 0;
++}
++#endif
++
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)
++int clk_prepare_enable(struct clk *clk)
++{
++	return clk_enable(clk);
++}
++#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
++int clk_prepare_enable(struct clk *clk)
++{
++	res = clk_prepare(clk);
++	if (ret < 0)
++		return res;
++
++	res = clk_enable(clk);
++	if (res < 0) {
++		clk_unprepare(clk);
++		return res;
++	}
++
++	return 0;
++}
++#endif
++
+ PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData)
+ {
+ #if !defined(NO_HARDWARE)
+@@ -167,19 +210,19 @@
+ 
+ 	PVR_DPF((PVR_DBG_MESSAGE, "EnableSGXClocks: Enabling SGX Clocks"));
+ 	
+-	res=clk_enable(psSysSpecData->psSGX_FCK);
++	res=clk_prepare_enable(psSysSpecData->psSGX_FCK);
+ 	if (res < 0)
+         {
+                 PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: Couldn't enable SGX functional clock (%d)", res));
+                 return PVRSRV_ERROR_UNABLE_TO_ENABLE_CLOCK;
+         }
+ 
+-	res=clk_enable(psSysSpecData->psSGX_ICK);
++	res=clk_prepare_enable(psSysSpecData->psSGX_ICK);
+         if (res < 0)
+         {
+                 PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: Couldn't enable SGX interface clock (%d)", res));
+ 
+-                clk_disable(psSysSpecData->psSGX_FCK);
++                clk_disable_unprepare(psSysSpecData->psSGX_FCK);
+                 return PVRSRV_ERROR_UNABLE_TO_ENABLE_CLOCK;
+         }
+ 
+@@ -233,7 +276,6 @@
+ 	return PVRSRV_OK;
+ }
+ 
+-
+ IMG_VOID DisableSGXClocks(SYS_DATA *psSysData)
+ {
+ #if !defined(NO_HARDWARE)
+@@ -246,9 +288,9 @@
+ 	
+ 	PVR_DPF((PVR_DBG_MESSAGE, "DisableSGXClocks: Disabling SGX Clocks"));
+ 	
+-	clk_disable(psSysSpecData->psSGX_FCK);
++	clk_disable_unprepare(psSysSpecData->psSGX_FCK);
+ 
+-	clk_disable(psSysSpecData->psSGX_ICK);
++	clk_disable_unprepare(psSysSpecData->psSGX_ICK);
+ 
+ //	SysDisableSGXInterrupts(psSysData);
+ 
+@@ -374,14 +416,14 @@
+ 	rate = clk_get_rate(psSysSpecData->psGPT11_FCK);
+ 	PVR_TRACE(("GPTIMER11 clock is %dMHz", HZ_TO_MHZ(rate)));
+ 
+-	res = clk_enable(psSysSpecData->psGPT11_FCK);
++	res = clk_prepare_enable(psSysSpecData->psGPT11_FCK);
+ 	if (res < 0)
+ 	{
+ 		PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't enable GPTIMER11 functional clock (%d)", res));
+ 		goto ExitError;
+ 	}
+ 
+-	res = clk_enable(psSysSpecData->psGPT11_ICK);
++	res = clk_prepare_enable(psSysSpecData->psGPT11_ICK);
+ 	if (res < 0)
+ 	{
+ 		PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't enable GPTIMER11 interface clock (%d)", res));
+@@ -444,9 +486,9 @@
+ 
+ ExitDisableGPT11ICK:
+ #if defined(PVR_OMAP3_TIMING_PRCM)
+-	clk_disable(psSysSpecData->psGPT11_ICK);
++	clk_disable_unprepare(psSysSpecData->psGPT11_ICK);
+ ExitDisableGPT11FCK:
+-	clk_disable(psSysSpecData->psGPT11_FCK);
++	clk_disable_unprepare(psSysSpecData->psGPT11_FCK);
+ ExitError:
+ #endif	
+ 	eError = PVRSRV_ERROR_CLOCK_REQUEST_FAILED;
+@@ -490,9 +532,9 @@
+ #endif
+ 
+ #if defined(PVR_OMAP3_TIMING_PRCM)
+-	clk_disable(psSysSpecData->psGPT11_ICK);
++	clk_disable_unprepare(psSysSpecData->psGPT11_ICK);
+ 
+-	clk_disable(psSysSpecData->psGPT11_FCK);
++	clk_disable_unprepare(psSysSpecData->psGPT11_FCK);
+ #endif	
+ }
+ #endif	
diff --git a/package/ti-gfx/ti-gfx.mk b/package/ti-gfx/ti-gfx.mk
new file mode 100644
index 0000000..2848b8c
--- /dev/null
+++ b/package/ti-gfx/ti-gfx.mk
@@ -0,0 +1,192 @@ 
+###############################################################################
+#
+# ti-gfx 
+#
+###############################################################################
+
+TI_GFX_VERSION = 4_09_00_01
+TI_GFX_SO_VERSION = 1.9.2188537
+
+ifeq ($(BR2_PACKAGE_TI_GFX_HARD_FLOAT),y)
+TI_GFX_SOURCE = Graphics_SDK_setuplinux_$(TI_GFX_VERSION)_hardfp_minimal_demos.bin
+else
+TI_GFX_SOURCE = Graphics_SDK_setuplinux_$(TI_GFX_VERSION)_minimal_demos.bin
+endif
+
+TI_GFX_SITE = http://downloads.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/gfxsdk/$(TI_GFX_VERSION)/exports/
+TI_GFX_LICENSE = Technology / Software Publicly Available
+TI_GFX_LICENSE_FILES = TSPA.txt
+TI_GFX_INSTALL_STAGING = YES
+
+TI_GFX_DEPENDENCIES = linux
+
+ifeq ($(BR2_PACKAGE_TI_GFX_ES3),y)
+TI_GFX_OMAPES = 3.x
+TI_GFX_PLATFORM = omap3
+endif
+ifeq ($(BR2_PACKAGE_TI_GFX_ES5),y)
+TI_GFX_OMAPES = 5.x
+TI_GFX_PLATFORM = omap3630 
+endif
+ifeq ($(BR2_PACKAGE_TI_GFX_ES6),y)
+TI_GFX_OMPAES = 6.x
+TI_GFX_PLATFORM = ti81xx 
+endif
+ifeq ($(BR2_PACKAGE_TI_GFX_ES8),y)
+TI_GFX_OMAPES = 8.x
+TI_GFX_PLATFORM = ti335x
+endif
+
+ifeq ($(BR2_PACKAGE_TI_GFX_DEBUG),y)
+TI_GFX_DEBUG_LIB = dbg
+TI_GFX_DEBUG_KM = debug
+else
+TI_GFX_DEBUG_LIB = rel
+TI_GFX_DEBUG_KM = release
+endif
+
+TI_GFX_BIN_PATH = gfx_$(TI_GFX_DEBUG_LIB)_es$(TI_GFX_OMAPES)
+
+TI_GFX_KM_MAKE_OPTS = \
+	$(LINUX_MAKE_FLAGS) \
+	BUILD=$(TI_GFX_DEBUG_KM) \
+	TI_PLATFORM=$(TI_GFX_PLATFORM) \
+	OMAPES=$(TI_GFX_OMAPES) \
+	SUPPORT_XORG=0 \
+	KERNELDIR=$(LINUX_DIR)
+
+TI_GFX_DEMO_MAKE_OPTS = \
+	PLATFORM=LinuxARMV7 \
+	X11BUILD=0
+
+# The only required binary is pvrsrvctl all others are optional
+TI_GFX_BIN = pvrsrvctl
+
+ifeq ($(BR2_PACKAGE_TI_GFX_DEBUG),y)
+TI_GFX_BIN += \
+	eglinfo ews_server ews_server_es2 ews_test_gles1 ews_test_gles2 \
+	ews_test_swrender gles1test1 gles2test1 pvr2d_test services_test \
+	sgx_blit_test sgx_clipblit_test sgx_flip_test sgx_init_test \
+	sgx_render_flip_test xeglinfo xgles1test1 xgles2test1 xmultiegltest
+endif
+
+TI_GFX_LIBS = \
+	libEGL libews libGLES_CM libGLESv2 libglslcompiler libIMGegl libpvr2d \
+	libpvrEWS_WSEGL libpvrPVR2D_BLITWSEGL libpvrPVR2D_DRIWSEGL \
+	libpvrPVR2D_FLIPWSEGL libpvrPVR2D_FRONTWSEGL libpvrPVR2D_LINUXFBWSEGL \
+	libpvrPVRScopeServices libsrv_init libsrv_um libsrv_um_dri libusc pvr_drv
+
+TI_GFX_DEMOS = ChameleonMan MagicLantern
+TI_GFX_DEMOS_LOC = GFX_Linux_SDK/OGLES2/SDKPackage/Demos
+TI_GFX_DEMOS_MAKE_LOC = OGLES2/Build/LinuxGeneric
+TI_GFX_DEMOS_BIN_LOC = OGLES2/Build/LinuxARMV7/ReleaseRaw/
+
+TI_GFX_HDR_DIRS = OGLES2/EGL OGLES2/EWS OGLES2/GLES2 OGLES2/KHR \
+	OGLES/GLES bufferclass_ti/ pvr2d/ wsegl/
+
+define TI_GFX_EXTRACT_CMDS 
+	$(RM) -rf $(TI_GFX_DIR)
+	chmod +x $(DL_DIR)/$(TI_GFX_SOURCE)
+	printf "Y\nY\n qY\n\n" | $(DL_DIR)/$(TI_GFX_SOURCE) \
+		--prefix $(@D) \
+		--mode console
+endef
+
+define TI_GFX_CONFIGURE_CMDS
+	$(if $(BR2_PACKAGE_TI_GFX_EGLIMAGE),
+		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libEGL_eglimage.so \
+			$(@D)/$(TI_GFX_BIN_PATH)/libEGL.so; \
+		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libGLES_CM_eglimage.so \
+			$(@D)/$(TI_GFX_BIN_PATH)/libGLES_CM.so; \
+		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libGLESv2_eglimage.so \
+		   $(@D)/$(TI_GFX_BIN_PATH)/libGLESv2.so; \
+		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libglslcompiler_eglimage.so \
+			$(@D)/$(TI_GFX_BIN_PATH)/libglslcompiler.so; \
+		mv -f $(@D)/$(TI_GFX_BIN_PATH)/libIMGegl_eglimage.so \
+			$(@D)/$(TI_GFX_BIN_PATH)/libIMGegl.so;
+	)
+endef
+
+define TI_GFX_BUILD_KM_CMDS
+	$(MAKE) $(TI_GFX_KM_MAKE_OPTS) -C $(@D)/GFX_Linux_KM all
+endef
+
+define TI_GFX_BUILD_DEMO_CMDS
+	$(foreach demo, $(TI_GFX_DEMOS), \
+		cd $(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_MAKE_LOC); \
+		$(TARGET_MAKE_ENV) $(MAKE1) $(TI_GFX_DEMO_MAKE_OPTS) all
+	)
+endef
+
+define TI_GFX_BUILD_CMDS
+	$(TI_GFX_BUILD_KM_CMDS)
+	$(if $(BR2_PACKAGE_TI_GFX_DEMOS),
+		$(TI_GFX_BUILD_DEMO_CMDS)
+	)
+endef
+
+define TI_GFX_INSTALL_STAGING_CMDS
+	$(foreach incdir,$(TI_GFX_HDR_DIRS),
+		$(INSTALL) -d $(STAGING_DIR)/usr/include/$(notdir $(incdir)); \
+		$(INSTALL) -D -m 0644 $(@D)/include/$(incdir)/*.h \
+			$(STAGING_DIR)/usr/include/$(notdir $(incdir))/
+	)
+	$(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/*.so $(STAGING_DIR)/usr/lib/
+	$(INSTALL) -D -m 0644 package/ti-gfx/egl.pc $(STAGING_DIR)/usr/lib/pkgconfig/
+	$(INSTALL) -D -m 0644 package/ti-gfx/glesv2.pc $(STAGING_DIR)/usr/lib/pkgconfig/
+endef
+
+define TI_GFX_INSTALL_KM_CMDS
+	$(MAKE) $(TI_GFX_KM_MAKE_OPTS) -C $(@D)/GFX_Linux_KM install
+endef
+
+define TI_GFX_INSTALL_BINS_CMDS
+	$(foreach bin,$(TI_GFX_BIN),
+		$(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/$(bin) \
+			$(TARGET_DIR)/usr/bin/$(bin)
+	)
+	$(if $(BR2_PACKAGE_TI_GFX_DEBUG),
+		$(INSTALL) -D -m 0755 package/ti-gfx/esrev.sh \
+			$(TARGET_DIR)/usr/bin/esrev)
+endef
+
+define TI_GFX_INSTALL_LIBS_CMDS
+	# create symlinks and install libraries.  these libraries do not have a 
+	# SONAME defined; therefore, they will not be automatically renamed and 
+	# must be renamed manually.
+	$(foreach lib,$(TI_GFX_LIBS),
+		$(INSTALL) -D -m 0755 $(@D)/$(TI_GFX_BIN_PATH)/$(lib).so \
+			$(TARGET_DIR)/usr/lib/$(lib).so.$(TI_GFX_SO_VERSION); \
+		ln -sf $(lib).so.$(TI_GFX_SO_VERSION) \
+			$(TARGET_DIR)/usr/lib/$(lib).so
+	)
+	# libs use the following file for configuration.
+	$(INSTALL) -D -m 0644 package/ti-gfx/powervr.ini \
+		$(TARGET_DIR)/etc/powervr.ini
+endef
+
+ifeq ($(BR2_PACKAGE_TI_GFX_DEMOS),y)
+define TI_GFX_INSTALL_DEMOS_CMDS
+	$(foreach demo,$(TI_GFX_DEMOS),
+		$(INSTALL) -D -m 0755 \
+		$(@D)/$(TI_GFX_DEMOS_LOC)/$(demo)/$(TI_GFX_DEMOS_BIN_LOC)/OGLES2$(demo) \
+		$(TARGET_DIR)/usr/bin/OGLES2$(demo)
+	)
+endef
+endif
+
+define TI_GFX_INSTALL_INIT_SYSV
+	$(INSTALL) -D -m 0755 package/ti-gfx/S80ti-gfx \
+		$(TARGET_DIR)/etc/init.d/S80ti-gfx
+endef
+
+define TI_GFX_INSTALL_TARGET_CMDS
+	$(TI_GFX_INSTALL_KM_CMDS)
+	$(TI_GFX_INSTALL_BINS_CMDS)
+	$(TI_GFX_INSTALL_LIBS_CMDS)
+	$(if $(BR2_PACKAGE_TI_GFX_DEMOS),
+		$(TI_GFX_INSTALL_DEMOS_CMDS)
+	)
+endef
+
+$(eval $(generic-package))