summaryrefslogtreecommitdiffstats
path: root/meta-moblin
diff options
context:
space:
mode:
authorRichard Purdie <richard@ted.(none)>2009-02-27 14:45:56 +0000
committerRichard Purdie <richard@ted.(none)>2009-02-27 14:45:56 +0000
commit49ca46f588425c88e37a85df00b1fd4591a01ab6 (patch)
treefa6e32df459c5a556da9f810f2cbf2dfa46919a2 /meta-moblin
parent09bf864d4fd148c29ece54df018255acaa8037bc (diff)
parent00dccf496e975e814d44ded7f43d29e7ea1b6126 (diff)
downloadpoky-49ca46f588425c88e37a85df00b1fd4591a01ab6.tar.gz
Merge ssh://gitserver@git.pokylinux.org/poky
Diffstat (limited to 'meta-moblin')
-rw-r--r--meta-moblin/conf/distro/include/moblin-fixed-revisions.inc9
-rw-r--r--meta-moblin/packages/bickley/bickley_git.bb10
-rw-r--r--meta-moblin/packages/json-glib/json-glib_0.6.2.bb7
-rw-r--r--meta-moblin/packages/json-glib/json-glib_git.bb14
-rw-r--r--meta-moblin/packages/libccss/libccss_git.bb14
-rw-r--r--meta-moblin/packages/librest/librest_git.bb14
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.27/psb-driver.patch1149
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0001-fastboot-retry-mounting-the-root-fs-if-we-can-t-fin.patch61
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0002-fastboot-remove-wait-for-all-devices-before-mounti.patch38
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0003-fastboot-remove-duplicate-unpack_to_rootfs.patch161
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0004-superreadahead-patch.patch66
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0005-fastboot-async-enable-default.patch12
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0006-Revert-drm-i915-GEM-on-PAE-has-problems-disable.patch55
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0007-acer-error-msg.patch17
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-menlow3137
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-netbook2403
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch1627
-rw-r--r--meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch21564
-rw-r--r--meta-moblin/packages/linux/linux-moblin_2.6.27.bb2
-rw-r--r--meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb24
-rw-r--r--meta-moblin/packages/moblin-menus/moblin-menus/configurefix.patch13
-rw-r--r--meta-moblin/packages/moblin-menus/moblin-menus_git.bb11
-rw-r--r--meta-moblin/packages/mojito/mojito_git.bb26
-rw-r--r--meta-moblin/packages/twitter-glib/twitter-glib_git.bb14
24 files changed, 29676 insertions, 772 deletions
diff --git a/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc b/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc
index b76f897a0b..2a93680409 100644
--- a/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc
+++ b/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc
@@ -7,5 +7,10 @@ PREFERRED_VERSION_hal ?= "0.5.11"
7PREFERRED_VERSION_hal-info ?= "20080508" 7PREFERRED_VERSION_hal-info ?= "20080508"
8 8
9SRCREV_pn-xf86-video-psb ?= "b6b3bba06fe5a3fe0b1bd6e31a7369dd83812bab" 9SRCREV_pn-xf86-video-psb ?= "b6b3bba06fe5a3fe0b1bd6e31a7369dd83812bab"
10SRCREV_pn-libdrm-psb = "aa96c0bbbba11d5bab28bb421a67c2264fad953a" 10SRCREV_pn-twitter-glib ?= "23f06104141d27f77019b58d71503873c38a7341"
11SRCREV_pn-linux-mid ?= "cb29ee2997ba598028e1ad4bbdd073deac2d057d" 11SRCREV_pn-json-glib ?= "1d92c73bc05423872581d513f355783d4864edd5"
12SRCREV_pn-libccss ?= "89f6586a1d96602fd2377627111a77ef80fa01fa"
13SRCREV_pn-librest ?= "631b8a075cf938d1aece6bd6f8379e00596c3dc2"
14SRCREV_pn-mojito ?= "4c2b1dcc0d915b2871c17c3f388a86d4ca69b2cb"
15SRCREV_pn-moblin-menus ?= "fc2d5686e7e9c0e7ebb6c54f1020680f191c8863"
16SRCREV_pn-bickley ?= "d14d1de62a8f9bac829af8ecd84d4426a4fe5a0d" \ No newline at end of file
diff --git a/meta-moblin/packages/bickley/bickley_git.bb b/meta-moblin/packages/bickley/bickley_git.bb
new file mode 100644
index 0000000000..c52487dbfa
--- /dev/null
+++ b/meta-moblin/packages/bickley/bickley_git.bb
@@ -0,0 +1,10 @@
1
2SRC_URI = "git://git.moblin.org/${PN}.git;protocol=git"
3PV = "0.0+git${SRCREV}"
4PR = "r1"
5
6DEPENDS = "redland gtk+ dbus-glib clutter-gst-0.8 libexif taglib gupnp gupnp-av"
7
8S = "${WORKDIR}/git"
9
10inherit autotools_stage
diff --git a/meta-moblin/packages/json-glib/json-glib_0.6.2.bb b/meta-moblin/packages/json-glib/json-glib_0.6.2.bb
new file mode 100644
index 0000000000..822ddad7e5
--- /dev/null
+++ b/meta-moblin/packages/json-glib/json-glib_0.6.2.bb
@@ -0,0 +1,7 @@
1
2SRC_URI = "http://folks.o-hand.com/~ebassi/sources/json-glib-0.6.2.tar.gz"
3PR = "r0"
4
5DEPENDS = "glib-2.0"
6
7inherit autotools_stage
diff --git a/meta-moblin/packages/json-glib/json-glib_git.bb b/meta-moblin/packages/json-glib/json-glib_git.bb
new file mode 100644
index 0000000000..fc84accaa1
--- /dev/null
+++ b/meta-moblin/packages/json-glib/json-glib_git.bb
@@ -0,0 +1,14 @@
1HOMEPAGE = "http://live.gnome.org/JsonGlib"
2SRC_URI = "git://github.com/ebassi/${PN}.git;protocol=git"
3PV = "0.6.2+${SRCREV}"
4PR = "r0"
5
6S = "${WORKDIR}/git"
7
8DEPENDS = "glib-2.0"
9
10inherit autotools_stage
11
12do_configure_prepend () {
13 touch ${S}/gtk-doc.make
14} \ No newline at end of file
diff --git a/meta-moblin/packages/libccss/libccss_git.bb b/meta-moblin/packages/libccss/libccss_git.bb
new file mode 100644
index 0000000000..d67fdc0ec6
--- /dev/null
+++ b/meta-moblin/packages/libccss/libccss_git.bb
@@ -0,0 +1,14 @@
1SRC_URI = "git://git.moblin.org/libccss.git;protocol=git;branch=branch-for-nbtk"
2PV = "0.0+git${SRCREV}"
3PR = "r0"
4
5DEPENDS = "glib-2.0 cairo librsvg libsoup-2.4"
6
7S = "${WORKDIR}/git"
8
9inherit autotools_stage
10
11do_configure_prepend () {
12 echo "EXTRA_DIST=" > ${S}/gtk-doc.make
13 echo "CLEANFILES=" >> ${S}/gtk-doc.make
14}
diff --git a/meta-moblin/packages/librest/librest_git.bb b/meta-moblin/packages/librest/librest_git.bb
new file mode 100644
index 0000000000..ec2d676fd5
--- /dev/null
+++ b/meta-moblin/packages/librest/librest_git.bb
@@ -0,0 +1,14 @@
1
2SRC_URI = "git://git.moblin.org/${PN}.git;protocol=git"
3PV = "0.0+git${SRCREV}"
4PR = "r0"
5
6DEPENDS = "libsoup-2.4"
7
8S = "${WORKDIR}/git"
9
10inherit autotools_stage
11
12do_configure_prepend () {
13 echo "EXTRA_DIST=" > ${S}/gtk-doc.make
14}
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.27/psb-driver.patch b/meta-moblin/packages/linux/linux-moblin-2.6.27/psb-driver.patch
index adc33b492a..1ef6e378fe 100644
--- a/meta-moblin/packages/linux/linux-moblin-2.6.27/psb-driver.patch
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.27/psb-driver.patch
@@ -1,7 +1,7 @@
1Index: linux-2.6.27/include/drm/drm.h 1Index: linux-2.6.27/include/drm/drm.h
2=================================================================== 2===================================================================
3--- linux-2.6.27.orig/include/drm/drm.h 2009-01-14 11:54:35.000000000 +0000 3--- linux-2.6.27.orig/include/drm/drm.h 2009-02-05 13:29:29.000000000 +0000
4+++ linux-2.6.27/include/drm/drm.h 2009-01-14 11:58:01.000000000 +0000 4+++ linux-2.6.27/include/drm/drm.h 2009-02-05 13:29:33.000000000 +0000
5@@ -173,6 +173,7 @@ 5@@ -173,6 +173,7 @@
6 _DRM_AGP = 3, /**< AGP/GART */ 6 _DRM_AGP = 3, /**< AGP/GART */
7 _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ 7 _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
@@ -380,7 +380,7 @@ Index: linux-2.6.27/include/drm/drm.h
380+ uint32_t value; 380+ uint32_t value;
381+ unsigned char name[DRM_PROP_NAME_LEN]; 381+ unsigned char name[DRM_PROP_NAME_LEN];
382+}; 382+};
383+ 383+
384+struct drm_mode_get_property { 384+struct drm_mode_get_property {
385+ 385+
386+ unsigned int prop_id; 386+ unsigned int prop_id;
@@ -473,8 +473,8 @@ Index: linux-2.6.27/include/drm/drm.h
473 #endif 473 #endif
474Index: linux-2.6.27/include/drm/drmP.h 474Index: linux-2.6.27/include/drm/drmP.h
475=================================================================== 475===================================================================
476--- linux-2.6.27.orig/include/drm/drmP.h 2009-01-14 11:54:35.000000000 +0000 476--- linux-2.6.27.orig/include/drm/drmP.h 2009-02-05 13:29:30.000000000 +0000
477+++ linux-2.6.27/include/drm/drmP.h 2009-01-14 11:58:31.000000000 +0000 477+++ linux-2.6.27/include/drm/drmP.h 2009-02-05 13:29:33.000000000 +0000
478@@ -57,6 +57,7 @@ 478@@ -57,6 +57,7 @@
479 #include <linux/dma-mapping.h> 479 #include <linux/dma-mapping.h>
480 #include <linux/mm.h> 480 #include <linux/mm.h>
@@ -738,8 +738,8 @@ Index: linux-2.6.27/include/drm/drmP.h
738 extern long drm_compat_ioctl(struct file *filp, 738 extern long drm_compat_ioctl(struct file *filp,
739Index: linux-2.6.27/include/drm/drm_pciids.h 739Index: linux-2.6.27/include/drm/drm_pciids.h
740=================================================================== 740===================================================================
741--- linux-2.6.27.orig/include/drm/drm_pciids.h 2009-01-14 11:54:35.000000000 +0000 741--- linux-2.6.27.orig/include/drm/drm_pciids.h 2008-10-09 23:13:53.000000000 +0100
742+++ linux-2.6.27/include/drm/drm_pciids.h 2009-01-14 11:58:01.000000000 +0000 742+++ linux-2.6.27/include/drm/drm_pciids.h 2009-02-05 13:29:33.000000000 +0000
743@@ -413,3 +413,9 @@ 743@@ -413,3 +413,9 @@
744 {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ 744 {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
745 {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ 745 {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
@@ -752,8 +752,8 @@ Index: linux-2.6.27/include/drm/drm_pciids.h
752+ 752+
753Index: linux-2.6.27/drivers/gpu/drm/Makefile 753Index: linux-2.6.27/drivers/gpu/drm/Makefile
754=================================================================== 754===================================================================
755--- linux-2.6.27.orig/drivers/gpu/drm/Makefile 2009-01-14 11:54:35.000000000 +0000 755--- linux-2.6.27.orig/drivers/gpu/drm/Makefile 2009-02-05 13:29:29.000000000 +0000
756+++ linux-2.6.27/drivers/gpu/drm/Makefile 2009-01-14 12:11:06.000000000 +0000 756+++ linux-2.6.27/drivers/gpu/drm/Makefile 2009-02-05 13:29:33.000000000 +0000
757@@ -9,11 +9,14 @@ 757@@ -9,11 +9,14 @@
758 drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \ 758 drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
759 drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \ 759 drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
@@ -777,8 +777,8 @@ Index: linux-2.6.27/drivers/gpu/drm/Makefile
777- 777-
778Index: linux-2.6.27/drivers/gpu/drm/drm_agpsupport.c 778Index: linux-2.6.27/drivers/gpu/drm/drm_agpsupport.c
779=================================================================== 779===================================================================
780--- linux-2.6.27.orig/drivers/gpu/drm/drm_agpsupport.c 2009-01-14 11:54:35.000000000 +0000 780--- linux-2.6.27.orig/drivers/gpu/drm/drm_agpsupport.c 2009-02-05 13:29:29.000000000 +0000
781+++ linux-2.6.27/drivers/gpu/drm/drm_agpsupport.c 2009-01-14 11:58:01.000000000 +0000 781+++ linux-2.6.27/drivers/gpu/drm/drm_agpsupport.c 2009-02-05 13:29:33.000000000 +0000
782@@ -453,47 +453,158 @@ 782@@ -453,47 +453,158 @@
783 return agp_unbind_memory(handle); 783 return agp_unbind_memory(handle);
784 } 784 }
@@ -970,7 +970,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_agpsupport.c
970Index: linux-2.6.27/drivers/gpu/drm/drm_bo.c 970Index: linux-2.6.27/drivers/gpu/drm/drm_bo.c
971=================================================================== 971===================================================================
972--- /dev/null 1970-01-01 00:00:00.000000000 +0000 972--- /dev/null 1970-01-01 00:00:00.000000000 +0000
973+++ linux-2.6.27/drivers/gpu/drm/drm_bo.c 2009-01-14 11:58:01.000000000 +0000 973+++ linux-2.6.27/drivers/gpu/drm/drm_bo.c 2009-02-05 13:29:33.000000000 +0000
974@@ -0,0 +1,2660 @@ 974@@ -0,0 +1,2660 @@
975+/************************************************************************** 975+/**************************************************************************
976+ * 976+ *
@@ -1183,15 +1183,15 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_bo.c
1183+ struct drm_bo_mem_reg *old_mem = &bo->mem; 1183+ struct drm_bo_mem_reg *old_mem = &bo->mem;
1184+ uint64_t save_flags = old_mem->flags; 1184+ uint64_t save_flags = old_mem->flags;
1185+ uint64_t save_mask = old_mem->mask; 1185+ uint64_t save_mask = old_mem->mask;
1186+ 1186+
1187+ *old_mem = *mem; 1187+ *old_mem = *mem;
1188+ mem->mm_node = NULL; 1188+ mem->mm_node = NULL;
1189+ old_mem->mask = save_mask; 1189+ old_mem->mask = save_mask;
1190+ DRM_FLAG_MASKED(save_flags, mem->flags, 1190+ DRM_FLAG_MASKED(save_flags, mem->flags,
1191+ DRM_BO_MASK_MEMTYPE); 1191+ DRM_BO_MASK_MEMTYPE);
1192+ goto moved; 1192+ goto moved;
1193+ } 1193+ }
1194+ 1194+
1195+ } 1195+ }
1196+ 1196+
1197+ if (!(old_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && 1197+ if (!(old_man->flags & _DRM_FLAG_MEMTYPE_FIXED) &&
@@ -1939,13 +1939,13 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_bo.c
1939+ DRM_ERROR("DRM_BO_FLAG_NO_EVICT is only available to priviliged processes.\n"); 1939+ DRM_ERROR("DRM_BO_FLAG_NO_EVICT is only available to priviliged processes.\n");
1940+ return -EPERM; 1940+ return -EPERM;
1941+ } 1941+ }
1942+ 1942+
1943+ if (likely(used_mask & DRM_BO_MASK_MEM) && 1943+ if (likely(used_mask & DRM_BO_MASK_MEM) &&
1944+ (bo->mem.flags & DRM_BO_FLAG_NO_EVICT) && 1944+ (bo->mem.flags & DRM_BO_FLAG_NO_EVICT) &&
1945+ !DRM_SUSER(DRM_CURPROC)) { 1945+ !DRM_SUSER(DRM_CURPROC)) {
1946+ if (likely(bo->mem.flags & new_flags & used_mask & 1946+ if (likely(bo->mem.flags & new_flags & used_mask &
1947+ DRM_BO_MASK_MEM)) 1947+ DRM_BO_MASK_MEM))
1948+ new_flags = (new_flags & ~DRM_BO_MASK_MEM) | 1948+ new_flags = (new_flags & ~DRM_BO_MASK_MEM) |
1949+ (bo->mem.flags & DRM_BO_MASK_MEM); 1949+ (bo->mem.flags & DRM_BO_MASK_MEM);
1950+ else { 1950+ else {
1951+ DRM_ERROR("Incompatible memory type specification " 1951+ DRM_ERROR("Incompatible memory type specification "
@@ -3635,7 +3635,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_bo.c
3635Index: linux-2.6.27/drivers/gpu/drm/drm_bo_lock.c 3635Index: linux-2.6.27/drivers/gpu/drm/drm_bo_lock.c
3636=================================================================== 3636===================================================================
3637--- /dev/null 1970-01-01 00:00:00.000000000 +0000 3637--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3638+++ linux-2.6.27/drivers/gpu/drm/drm_bo_lock.c 2009-01-14 11:58:01.000000000 +0000 3638+++ linux-2.6.27/drivers/gpu/drm/drm_bo_lock.c 2009-02-05 13:29:33.000000000 +0000
3639@@ -0,0 +1,175 @@ 3639@@ -0,0 +1,175 @@
3640+/************************************************************************** 3640+/**************************************************************************
3641+ * 3641+ *
@@ -3815,7 +3815,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_bo_lock.c
3815Index: linux-2.6.27/drivers/gpu/drm/drm_bo_move.c 3815Index: linux-2.6.27/drivers/gpu/drm/drm_bo_move.c
3816=================================================================== 3816===================================================================
3817--- /dev/null 1970-01-01 00:00:00.000000000 +0000 3817--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3818+++ linux-2.6.27/drivers/gpu/drm/drm_bo_move.c 2009-01-14 11:58:01.000000000 +0000 3818+++ linux-2.6.27/drivers/gpu/drm/drm_bo_move.c 2009-02-05 13:29:33.000000000 +0000
3819@@ -0,0 +1,597 @@ 3819@@ -0,0 +1,597 @@
3820+/************************************************************************** 3820+/**************************************************************************
3821+ * 3821+ *
@@ -4416,8 +4416,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_bo_move.c
4416+EXPORT_SYMBOL(drm_bo_kunmap); 4416+EXPORT_SYMBOL(drm_bo_kunmap);
4417Index: linux-2.6.27/drivers/gpu/drm/drm_bufs.c 4417Index: linux-2.6.27/drivers/gpu/drm/drm_bufs.c
4418=================================================================== 4418===================================================================
4419--- linux-2.6.27.orig/drivers/gpu/drm/drm_bufs.c 2009-01-14 11:54:35.000000000 +0000 4419--- linux-2.6.27.orig/drivers/gpu/drm/drm_bufs.c 2008-10-09 23:13:53.000000000 +0100
4420+++ linux-2.6.27/drivers/gpu/drm/drm_bufs.c 2009-01-14 11:58:01.000000000 +0000 4420+++ linux-2.6.27/drivers/gpu/drm/drm_bufs.c 2009-02-05 13:29:33.000000000 +0000
4421@@ -409,6 +409,7 @@ 4421@@ -409,6 +409,7 @@
4422 break; 4422 break;
4423 case _DRM_SHM: 4423 case _DRM_SHM:
@@ -4438,7 +4438,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_bufs.c
4438Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c 4438Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4439=================================================================== 4439===================================================================
4440--- /dev/null 1970-01-01 00:00:00.000000000 +0000 4440--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4441+++ linux-2.6.27/drivers/gpu/drm/drm_crtc.c 2009-01-14 11:58:01.000000000 +0000 4441+++ linux-2.6.27/drivers/gpu/drm/drm_crtc.c 2009-02-05 13:29:33.000000000 +0000
4442@@ -0,0 +1,2170 @@ 4442@@ -0,0 +1,2170 @@
4443+/* 4443+/*
4444+ * Copyright (c) 2006-2007 Intel Corporation 4444+ * Copyright (c) 2006-2007 Intel Corporation
@@ -4502,7 +4502,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4502+ 4502+
4503+ ret = idr_get_new_above(&dev->mode_config.crtc_idr, ptr, 1, &new_id); 4503+ ret = idr_get_new_above(&dev->mode_config.crtc_idr, ptr, 1, &new_id);
4504+ if (ret == -EAGAIN) 4504+ if (ret == -EAGAIN)
4505+ goto again; 4505+ goto again;
4506+ 4506+
4507+ return new_id; 4507+ return new_id;
4508+} 4508+}
@@ -4573,7 +4573,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4573+ fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL); 4573+ fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
4574+ if (!fb) 4574+ if (!fb)
4575+ return NULL; 4575+ return NULL;
4576+ 4576+
4577+ fb->id = drm_idr_get(dev, fb); 4577+ fb->id = drm_idr_get(dev, fb);
4578+ fb->dev = dev; 4578+ fb->dev = dev;
4579+ dev->mode_config.num_fb++; 4579+ dev->mode_config.num_fb++;
@@ -4727,7 +4727,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4727+ struct drm_output *output; 4727+ struct drm_output *output;
4728+ struct drm_display_mode *mode, *t; 4728+ struct drm_display_mode *mode, *t;
4729+ int ret; 4729+ int ret;
4730+ //if (maxX == 0 || maxY == 0) 4730+ //if (maxX == 0 || maxY == 0)
4731+ // TODO 4731+ // TODO
4732+ 4732+
4733+ list_for_each_entry(output, &dev->mode_config.output_list, head) { 4733+ list_for_each_entry(output, &dev->mode_config.output_list, head) {
@@ -4735,7 +4735,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4735+ /* set all modes to the unverified state */ 4735+ /* set all modes to the unverified state */
4736+ list_for_each_entry_safe(mode, t, &output->modes, head) 4736+ list_for_each_entry_safe(mode, t, &output->modes, head)
4737+ mode->status = MODE_UNVERIFIED; 4737+ mode->status = MODE_UNVERIFIED;
4738+ 4738+
4739+ output->status = (*output->funcs->detect)(output); 4739+ output->status = (*output->funcs->detect)(output);
4740+ 4740+
4741+ if (output->status == output_status_disconnected) { 4741+ if (output->status == output_status_disconnected) {
@@ -4757,7 +4757,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4757+ if (mode->status == MODE_OK) 4757+ if (mode->status == MODE_OK)
4758+ mode->status = (*output->funcs->mode_valid)(output,mode); 4758+ mode->status = (*output->funcs->mode_valid)(output,mode);
4759+ } 4759+ }
4760+ 4760+
4761+ 4761+
4762+ drm_mode_prune_invalid(dev, &output->modes, 1); 4762+ drm_mode_prune_invalid(dev, &output->modes, 1);
4763+ 4763+
@@ -4832,7 +4832,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4832+ saved_mode = crtc->mode; 4832+ saved_mode = crtc->mode;
4833+ saved_x = crtc->x; 4833+ saved_x = crtc->x;
4834+ saved_y = crtc->y; 4834+ saved_y = crtc->y;
4835+ 4835+
4836+ /* Update crtc values up front so the driver can rely on them for mode 4836+ /* Update crtc values up front so the driver can rely on them for mode
4837+ * setting. 4837+ * setting.
4838+ */ 4838+ */
@@ -4841,21 +4841,21 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4841+ crtc->y = y; 4841+ crtc->y = y;
4842+ 4842+
4843+ /* XXX short-circuit changes to base location only */ 4843+ /* XXX short-circuit changes to base location only */
4844+ 4844+
4845+ /* Pass our mode to the outputs and the CRTC to give them a chance to 4845+ /* Pass our mode to the outputs and the CRTC to give them a chance to
4846+ * adjust it according to limitations or output properties, and also 4846+ * adjust it according to limitations or output properties, and also
4847+ * a chance to reject the mode entirely. 4847+ * a chance to reject the mode entirely.
4848+ */ 4848+ */
4849+ list_for_each_entry(output, &dev->mode_config.output_list, head) { 4849+ list_for_each_entry(output, &dev->mode_config.output_list, head) {
4850+ 4850+
4851+ if (output->crtc != crtc) 4851+ if (output->crtc != crtc)
4852+ continue; 4852+ continue;
4853+ 4853+
4854+ if (!output->funcs->mode_fixup(output, mode, adjusted_mode)) { 4854+ if (!output->funcs->mode_fixup(output, mode, adjusted_mode)) {
4855+ goto done; 4855+ goto done;
4856+ } 4856+ }
4857+ } 4857+ }
4858+ 4858+
4859+ if (!crtc->funcs->mode_fixup(crtc, mode, adjusted_mode)) { 4859+ if (!crtc->funcs->mode_fixup(crtc, mode, adjusted_mode)) {
4860+ goto done; 4860+ goto done;
4861+ } 4861+ }
@@ -4865,13 +4865,13 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4865+ 4865+
4866+ if (output->crtc != crtc) 4866+ if (output->crtc != crtc)
4867+ continue; 4867+ continue;
4868+ 4868+
4869+ /* Disable the output as the first thing we do. */ 4869+ /* Disable the output as the first thing we do. */
4870+ output->funcs->prepare(output); 4870+ output->funcs->prepare(output);
4871+ } 4871+ }
4872+ 4872+
4873+ crtc->funcs->prepare(crtc); 4873+ crtc->funcs->prepare(crtc);
4874+ 4874+
4875+ /* Set up the DPLL and any output state that needs to adjust or depend 4875+ /* Set up the DPLL and any output state that needs to adjust or depend
4876+ * on the DPLL. 4876+ * on the DPLL.
4877+ */ 4877+ */
@@ -4881,12 +4881,12 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4881+ 4881+
4882+ if (output->crtc != crtc) 4882+ if (output->crtc != crtc)
4883+ continue; 4883+ continue;
4884+ 4884+
4885+ DRM_INFO("%s: set mode %s %x\n", output->name, mode->name, mode->mode_id); 4885+ DRM_INFO("%s: set mode %s %x\n", output->name, mode->name, mode->mode_id);
4886+ 4886+
4887+ output->funcs->mode_set(output, mode, adjusted_mode); 4887+ output->funcs->mode_set(output, mode, adjusted_mode);
4888+ } 4888+ }
4889+ 4889+
4890+ /* Now, enable the clocks, plane, pipe, and outputs that we set up. */ 4890+ /* Now, enable the clocks, plane, pipe, and outputs that we set up. */
4891+ crtc->funcs->commit(crtc); 4891+ crtc->funcs->commit(crtc);
4892+ 4892+
@@ -4894,7 +4894,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4894+ 4894+
4895+ if (output->crtc != crtc) 4895+ if (output->crtc != crtc)
4896+ continue; 4896+ continue;
4897+ 4897+
4898+ output->funcs->commit(output); 4898+ output->funcs->commit(output);
4899+ 4899+
4900+#if 0 // TODO def RANDR_12_INTERFACE 4900+#if 0 // TODO def RANDR_12_INTERFACE
@@ -4902,7 +4902,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4902+ RRPostPendingProperties (output->randr_output); 4902+ RRPostPendingProperties (output->randr_output);
4903+#endif 4903+#endif
4904+ } 4904+ }
4905+ 4905+
4906+ /* XXX free adjustedmode */ 4906+ /* XXX free adjustedmode */
4907+ drm_mode_destroy(dev, adjusted_mode); 4907+ drm_mode_destroy(dev, adjusted_mode);
4908+ ret = 1; 4908+ ret = 1;
@@ -4916,10 +4916,10 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4916+ crtc->y = saved_y; 4916+ crtc->y = saved_y;
4917+ crtc->mode = saved_mode; 4917+ crtc->mode = saved_mode;
4918+ } 4918+ }
4919+ 4919+
4920+ if (didLock) 4920+ if (didLock)
4921+ crtc->funcs->unlock (crtc); 4921+ crtc->funcs->unlock (crtc);
4922+ 4922+
4923+ return ret; 4923+ return ret;
4924+} 4924+}
4925+EXPORT_SYMBOL(drm_crtc_set_mode); 4925+EXPORT_SYMBOL(drm_crtc_set_mode);
@@ -4958,7 +4958,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4958+ * 4958+ *
4959+ * LOCKING: 4959+ * LOCKING:
4960+ * Caller must hold mode config lock. 4960+ * Caller must hold mode config lock.
4961+ * 4961+ *
4962+ * Add @mode to @output's mode list for later use. 4962+ * Add @mode to @output's mode list for later use.
4963+ */ 4963+ */
4964+void drm_mode_probed_add(struct drm_output *output, 4964+void drm_mode_probed_add(struct drm_output *output,
@@ -4975,7 +4975,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
4975+ * 4975+ *
4976+ * LOCKING: 4976+ * LOCKING:
4977+ * Caller must hold mode config lock. 4977+ * Caller must hold mode config lock.
4978+ * 4978+ *
4979+ * Remove @mode from @output's mode list, then free it. 4979+ * Remove @mode from @output's mode list, then free it.
4980+ */ 4980+ */
4981+void drm_mode_remove(struct drm_output *output, struct drm_display_mode *mode) 4981+void drm_mode_remove(struct drm_output *output, struct drm_display_mode *mode)
@@ -5009,7 +5009,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5009+ output = kzalloc(sizeof(struct drm_output), GFP_KERNEL); 5009+ output = kzalloc(sizeof(struct drm_output), GFP_KERNEL);
5010+ if (!output) 5010+ if (!output)
5011+ return NULL; 5011+ return NULL;
5012+ 5012+
5013+ output->dev = dev; 5013+ output->dev = dev;
5014+ output->funcs = funcs; 5014+ output->funcs = funcs;
5015+ output->id = drm_idr_get(dev, output); 5015+ output->id = drm_idr_get(dev, output);
@@ -5197,7 +5197,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5197+ ret = -EINVAL; 5197+ ret = -EINVAL;
5198+ goto out_err; 5198+ goto out_err;
5199+ } 5199+ }
5200+ 5200+
5201+ *bo = drm_user_object_entry(uo, struct drm_buffer_object, base); 5201+ *bo = drm_user_object_entry(uo, struct drm_buffer_object, base);
5202+ ret = 0; 5202+ ret = 0;
5203+out_err: 5203+out_err:
@@ -5228,7 +5228,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5228+ 5228+
5229+ list_for_each_entry(output, &dev->mode_config.output_list, head) { 5229+ list_for_each_entry(output, &dev->mode_config.output_list, head) {
5230+ output->crtc = NULL; 5230+ output->crtc = NULL;
5231+ 5231+
5232+ /* Don't hook up outputs that are disconnected ?? 5232+ /* Don't hook up outputs that are disconnected ??
5233+ * 5233+ *
5234+ * This is debateable. Do we want fixed /dev/fbX or 5234+ * This is debateable. Do we want fixed /dev/fbX or
@@ -5280,7 +5280,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5280+ c++; 5280+ c++;
5281+ if ((output->possible_crtcs & (1 << c)) == 0) 5281+ if ((output->possible_crtcs & (1 << c)) == 0)
5282+ continue; 5282+ continue;
5283+ 5283+
5284+ list_for_each_entry(output_equal, &dev->mode_config.output_list, head) { 5284+ list_for_each_entry(output_equal, &dev->mode_config.output_list, head) {
5285+ if (output->id == output_equal->id) 5285+ if (output->id == output_equal->id)
5286+ continue; 5286+ continue;
@@ -5368,7 +5368,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5368+ dev->driver->fb_probe(dev, crtc); 5368+ dev->driver->fb_probe(dev, crtc);
5369+ } 5369+ }
5370+ 5370+
5371+ /* This is a little screwy, as we've already walked the outputs 5371+ /* This is a little screwy, as we've already walked the outputs
5372+ * above, but it's a little bit of magic too. There's the potential 5372+ * above, but it's a little bit of magic too. There's the potential
5373+ * for things not to get setup above if an existing device gets 5373+ * for things not to get setup above if an existing device gets
5374+ * re-assigned thus confusing the hardware. By walking the outputs 5374+ * re-assigned thus confusing the hardware. By walking the outputs
@@ -5583,7 +5583,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5583+ strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); 5583+ strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN);
5584+ out->name[DRM_DISPLAY_MODE_LEN-1] = 0; 5584+ out->name[DRM_DISPLAY_MODE_LEN-1] = 0;
5585+} 5585+}
5586+ 5586+
5587+/** 5587+/**
5588+ * drm_mode_getresources - get graphics configuration 5588+ * drm_mode_getresources - get graphics configuration
5589+ * @inode: inode from the ioctl 5589+ * @inode: inode from the ioctl
@@ -5687,7 +5687,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5687+ } 5687+ }
5688+ } 5688+ }
5689+ card_res->count_outputs = output_count; 5689+ card_res->count_outputs = output_count;
5690+ 5690+
5691+ /* Modes */ 5691+ /* Modes */
5692+ if (card_res->count_modes >= mode_count) { 5692+ if (card_res->count_modes >= mode_count) {
5693+ copied = 0; 5693+ copied = 0;
@@ -5715,7 +5715,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5715+ DRM_DEBUG("Counted %d %d %d\n", card_res->count_crtcs, 5715+ DRM_DEBUG("Counted %d %d %d\n", card_res->count_crtcs,
5716+ card_res->count_outputs, 5716+ card_res->count_outputs,
5717+ card_res->count_modes); 5717+ card_res->count_modes);
5718+ 5718+
5719+ mutex_unlock(&dev->mode_config.mutex); 5719+ mutex_unlock(&dev->mode_config.mutex);
5720+ return ret; 5720+ return ret;
5721+} 5721+}
@@ -5819,7 +5819,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5819+ 5819+
5820+ list_for_each_entry(mode, &output->modes, head) 5820+ list_for_each_entry(mode, &output->modes, head)
5821+ mode_count++; 5821+ mode_count++;
5822+ 5822+
5823+ for (i = 0; i < DRM_OUTPUT_MAX_UMODES; i++) 5823+ for (i = 0; i < DRM_OUTPUT_MAX_UMODES; i++)
5824+ if (output->user_mode_ids[i] != 0) 5824+ if (output->user_mode_ids[i] != 0)
5825+ mode_count++; 5825+ mode_count++;
@@ -5933,13 +5933,13 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5933+ mode = idr_find(&dev->mode_config.crtc_idr, crtc_req->mode); 5933+ mode = idr_find(&dev->mode_config.crtc_idr, crtc_req->mode);
5934+ if (!mode || (mode->mode_id != crtc_req->mode)) { 5934+ if (!mode || (mode->mode_id != crtc_req->mode)) {
5935+ struct drm_output *output; 5935+ struct drm_output *output;
5936+ 5936+
5937+ list_for_each_entry(output, 5937+ list_for_each_entry(output,
5938+ &dev->mode_config.output_list, 5938+ &dev->mode_config.output_list,
5939+ head) { 5939+ head) {
5940+ list_for_each_entry(mode, &output->modes, 5940+ list_for_each_entry(mode, &output->modes,
5941+ head) { 5941+ head) {
5942+ drm_mode_debug_printmodeline(dev, 5942+ drm_mode_debug_printmodeline(dev,
5943+ mode); 5943+ mode);
5944+ } 5944+ }
5945+ } 5945+ }
@@ -5988,7 +5988,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
5988+ output_set[i] = output; 5988+ output_set[i] = output;
5989+ } 5989+ }
5990+ } 5990+ }
5991+ 5991+
5992+ ret = drm_crtc_set_config(crtc, crtc_req, mode, output_set, fb); 5992+ ret = drm_crtc_set_config(crtc, crtc_req, mode, output_set, fb);
5993+ 5993+
5994+out: 5994+out:
@@ -6349,7 +6349,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6349+ struct drm_display_mode *mode; 6349+ struct drm_display_mode *mode;
6350+ int ret = -EINVAL; 6350+ int ret = -EINVAL;
6351+ 6351+
6352+ mutex_lock(&dev->mode_config.mutex); 6352+ mutex_lock(&dev->mode_config.mutex);
6353+ mode = idr_find(&dev->mode_config.crtc_idr, *id); 6353+ mode = idr_find(&dev->mode_config.crtc_idr, *id);
6354+ if (!mode || (*id != mode->mode_id)) { 6354+ if (!mode || (*id != mode->mode_id)) {
6355+ goto out; 6355+ goto out;
@@ -6448,7 +6448,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6448+ 6448+
6449+ 6449+
6450+ ret = drm_mode_detachmode(dev, output, mode); 6450+ ret = drm_mode_detachmode(dev, output, mode);
6451+out: 6451+out:
6452+ mutex_unlock(&dev->mode_config.mutex); 6452+ mutex_unlock(&dev->mode_config.mutex);
6453+ return ret; 6453+ return ret;
6454+} 6454+}
@@ -6461,7 +6461,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6461+ property = kzalloc(sizeof(struct drm_output), GFP_KERNEL); 6461+ property = kzalloc(sizeof(struct drm_output), GFP_KERNEL);
6462+ if (!property) 6462+ if (!property)
6463+ return NULL; 6463+ return NULL;
6464+ 6464+
6465+ property->values = kzalloc(sizeof(uint32_t)*num_values, GFP_KERNEL); 6465+ property->values = kzalloc(sizeof(uint32_t)*num_values, GFP_KERNEL);
6466+ if (!property->values) 6466+ if (!property->values)
6467+ goto fail; 6467+ goto fail;
@@ -6493,7 +6493,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6493+ if (!list_empty(&property->enum_list)) { 6493+ if (!list_empty(&property->enum_list)) {
6494+ list_for_each_entry(prop_enum, &property->enum_list, head) { 6494+ list_for_each_entry(prop_enum, &property->enum_list, head) {
6495+ if (prop_enum->value == value) { 6495+ if (prop_enum->value == value) {
6496+ strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN); 6496+ strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN);
6497+ prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0'; 6497+ prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0';
6498+ return 0; 6498+ return 0;
6499+ } 6499+ }
@@ -6504,7 +6504,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6504+ if (!prop_enum) 6504+ if (!prop_enum)
6505+ return -ENOMEM; 6505+ return -ENOMEM;
6506+ 6506+
6507+ strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN); 6507+ strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN);
6508+ prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0'; 6508+ prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0';
6509+ prop_enum->value = value; 6509+ prop_enum->value = value;
6510+ 6510+
@@ -6526,7 +6526,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6526+ kfree(property->values); 6526+ kfree(property->values);
6527+ drm_idr_put(dev, property->id); 6527+ drm_idr_put(dev, property->id);
6528+ list_del(&property->head); 6528+ list_del(&property->head);
6529+ kfree(property); 6529+ kfree(property);
6530+} 6530+}
6531+EXPORT_SYMBOL(drm_property_destroy); 6531+EXPORT_SYMBOL(drm_property_destroy);
6532+ 6532+
@@ -6612,8 +6612,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_crtc.c
6612+} 6612+}
6613Index: linux-2.6.27/drivers/gpu/drm/drm_drv.c 6613Index: linux-2.6.27/drivers/gpu/drm/drm_drv.c
6614=================================================================== 6614===================================================================
6615--- linux-2.6.27.orig/drivers/gpu/drm/drm_drv.c 2009-01-14 11:54:35.000000000 +0000 6615--- linux-2.6.27.orig/drivers/gpu/drm/drm_drv.c 2009-02-05 13:29:29.000000000 +0000
6616+++ linux-2.6.27/drivers/gpu/drm/drm_drv.c 2009-01-14 11:58:01.000000000 +0000 6616+++ linux-2.6.27/drivers/gpu/drm/drm_drv.c 2009-02-05 13:29:33.000000000 +0000
6617@@ -49,6 +49,9 @@ 6617@@ -49,6 +49,9 @@
6618 #include "drmP.h" 6618 #include "drmP.h"
6619 #include "drm_core.h" 6619 #include "drm_core.h"
@@ -6833,7 +6833,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_drv.c
6833Index: linux-2.6.27/drivers/gpu/drm/drm_edid.c 6833Index: linux-2.6.27/drivers/gpu/drm/drm_edid.c
6834=================================================================== 6834===================================================================
6835--- /dev/null 1970-01-01 00:00:00.000000000 +0000 6835--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6836+++ linux-2.6.27/drivers/gpu/drm/drm_edid.c 2009-01-14 11:58:01.000000000 +0000 6836+++ linux-2.6.27/drivers/gpu/drm/drm_edid.c 2009-02-05 13:29:33.000000000 +0000
6837@@ -0,0 +1,519 @@ 6837@@ -0,0 +1,519 @@
6838+/* 6838+/*
6839+ * Copyright (c) 2007 Intel Corporation 6839+ * Copyright (c) 2007 Intel Corporation
@@ -7157,7 +7157,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_edid.c
7157+ if (i == 0 && edid->preferred_timing) 7157+ if (i == 0 && edid->preferred_timing)
7158+ newmode->type |= DRM_MODE_TYPE_PREFERRED; 7158+ newmode->type |= DRM_MODE_TYPE_PREFERRED;
7159+ drm_mode_probed_add(output, newmode); 7159+ drm_mode_probed_add(output, newmode);
7160+ 7160+
7161+ modes++; 7161+ modes++;
7162+ continue; 7162+ continue;
7163+ } 7163+ }
@@ -7303,7 +7303,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_edid.c
7303+ * @adapter: i2c adapter to use for DDC 7303+ * @adapter: i2c adapter to use for DDC
7304+ * 7304+ *
7305+ * Poke the given output's i2c channel to grab EDID data if possible. 7305+ * Poke the given output's i2c channel to grab EDID data if possible.
7306+ * 7306+ *
7307+ * Return edid data or NULL if we couldn't find any. 7307+ * Return edid data or NULL if we couldn't find any.
7308+ */ 7308+ */
7309+struct edid *drm_get_edid(struct drm_output *output, 7309+struct edid *drm_get_edid(struct drm_output *output,
@@ -7357,7 +7357,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_edid.c
7357Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c 7357Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7358=================================================================== 7358===================================================================
7359--- /dev/null 1970-01-01 00:00:00.000000000 +0000 7359--- /dev/null 1970-01-01 00:00:00.000000000 +0000
7360+++ linux-2.6.27/drivers/gpu/drm/drm_fence.c 2009-01-14 11:58:01.000000000 +0000 7360+++ linux-2.6.27/drivers/gpu/drm/drm_fence.c 2009-02-05 13:29:33.000000000 +0000
7361@@ -0,0 +1,829 @@ 7361@@ -0,0 +1,829 @@
7362+/************************************************************************** 7362+/**************************************************************************
7363+ * 7363+ *
@@ -7398,7 +7398,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7398+ */ 7398+ */
7399+ 7399+
7400+int drm_fence_wait_polling(struct drm_fence_object *fence, int lazy, 7400+int drm_fence_wait_polling(struct drm_fence_object *fence, int lazy,
7401+ int interruptible, uint32_t mask, 7401+ int interruptible, uint32_t mask,
7402+ unsigned long end_jiffies) 7402+ unsigned long end_jiffies)
7403+{ 7403+{
7404+ struct drm_device *dev = fence->dev; 7404+ struct drm_device *dev = fence->dev;
@@ -7411,9 +7411,9 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7411+ add_wait_queue(&fc->fence_queue, &entry); 7411+ add_wait_queue(&fc->fence_queue, &entry);
7412+ 7412+
7413+ ret = 0; 7413+ ret = 0;
7414+ 7414+
7415+ for (;;) { 7415+ for (;;) {
7416+ __set_current_state((interruptible) ? 7416+ __set_current_state((interruptible) ?
7417+ TASK_INTERRUPTIBLE : 7417+ TASK_INTERRUPTIBLE :
7418+ TASK_UNINTERRUPTIBLE); 7418+ TASK_UNINTERRUPTIBLE);
7419+ if (drm_fence_object_signaled(fence, mask)) 7419+ if (drm_fence_object_signaled(fence, mask))
@@ -7427,10 +7427,10 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7427+ else if ((++count & 0x0F) == 0){ 7427+ else if ((++count & 0x0F) == 0){
7428+ __set_current_state(TASK_RUNNING); 7428+ __set_current_state(TASK_RUNNING);
7429+ schedule(); 7429+ schedule();
7430+ __set_current_state((interruptible) ? 7430+ __set_current_state((interruptible) ?
7431+ TASK_INTERRUPTIBLE : 7431+ TASK_INTERRUPTIBLE :
7432+ TASK_UNINTERRUPTIBLE); 7432+ TASK_UNINTERRUPTIBLE);
7433+ } 7433+ }
7434+ if (interruptible && signal_pending(current)) { 7434+ if (interruptible && signal_pending(current)) {
7435+ ret = -EAGAIN; 7435+ ret = -EAGAIN;
7436+ break; 7436+ break;
@@ -7527,12 +7527,12 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7527+ driver->sequence_mask; 7527+ driver->sequence_mask;
7528+ if (diff > driver->wrap_diff) 7528+ if (diff > driver->wrap_diff)
7529+ break; 7529+ break;
7530+ 7530+
7531+ fc->waiting_types |= fence->waiting_types & ~fence->signaled_types; 7531+ fc->waiting_types |= fence->waiting_types & ~fence->signaled_types;
7532+ } 7532+ }
7533+ } 7533+ }
7534+ 7534+
7535+ if (wake) 7535+ if (wake)
7536+ wake_up_all(&fc->fence_queue); 7536+ wake_up_all(&fc->fence_queue);
7537+} 7537+}
7538+EXPORT_SYMBOL(drm_fence_handler); 7538+EXPORT_SYMBOL(drm_fence_handler);
@@ -7621,7 +7621,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7621+ struct drm_device *dev = fence->dev; 7621+ struct drm_device *dev = fence->dev;
7622+ struct drm_fence_manager *fm = &dev->fm; 7622+ struct drm_fence_manager *fm = &dev->fm;
7623+ struct drm_fence_driver *driver = dev->driver->fence_driver; 7623+ struct drm_fence_driver *driver = dev->driver->fence_driver;
7624+ 7624+
7625+ mask &= fence->type; 7625+ mask &= fence->type;
7626+ read_lock_irqsave(&fm->lock, flags); 7626+ read_lock_irqsave(&fm->lock, flags);
7627+ signaled = (mask & fence->signaled_types) == mask; 7627+ signaled = (mask & fence->signaled_types) == mask;
@@ -7658,7 +7658,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7658+ write_lock_irqsave(&fm->lock, irq_flags); 7658+ write_lock_irqsave(&fm->lock, irq_flags);
7659+ fence->waiting_types |= type; 7659+ fence->waiting_types |= type;
7660+ fc->waiting_types |= fence->waiting_types; 7660+ fc->waiting_types |= fence->waiting_types;
7661+ diff = (fence->sequence - fc->highest_waiting_sequence) & 7661+ diff = (fence->sequence - fc->highest_waiting_sequence) &
7662+ driver->sequence_mask; 7662+ driver->sequence_mask;
7663+ 7663+
7664+ if (diff < driver->wrap_diff) 7664+ if (diff < driver->wrap_diff)
@@ -7670,7 +7670,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7670+ */ 7670+ */
7671+ 7671+
7672+ saved_pending_flush = fc->pending_flush; 7672+ saved_pending_flush = fc->pending_flush;
7673+ if (driver->needed_flush) 7673+ if (driver->needed_flush)
7674+ fc->pending_flush |= driver->needed_flush(fence); 7674+ fc->pending_flush |= driver->needed_flush(fence);
7675+ 7675+
7676+ if (driver->poll) 7676+ if (driver->poll)
@@ -7709,14 +7709,14 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7709+ diff = (sequence - fence->sequence) & driver->sequence_mask; 7709+ diff = (sequence - fence->sequence) & driver->sequence_mask;
7710+ if (diff <= driver->flush_diff) 7710+ if (diff <= driver->flush_diff)
7711+ break; 7711+ break;
7712+ 7712+
7713+ fence->waiting_types = fence->type; 7713+ fence->waiting_types = fence->type;
7714+ fc->waiting_types |= fence->type; 7714+ fc->waiting_types |= fence->type;
7715+ 7715+
7716+ if (driver->needed_flush) 7716+ if (driver->needed_flush)
7717+ fc->pending_flush |= driver->needed_flush(fence); 7717+ fc->pending_flush |= driver->needed_flush(fence);
7718+ } 7718+ }
7719+ 7719+
7720+ if (driver->poll) 7720+ if (driver->poll)
7721+ driver->poll(dev, fence_class, fc->waiting_types); 7721+ driver->poll(dev, fence_class, fc->waiting_types);
7722+ 7722+
@@ -7758,13 +7758,13 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
7758+ if (driver->has_irq(dev, fence->fence_class, mask)) { 7758+ if (driver->has_irq(dev, fence->fence_class, mask)) {
7759+ if (!ignore_signals) 7759+ if (!ignore_signals)
7760+ ret = wait_event_interruptible_timeout 7760+ ret = wait_event_interruptible_timeout
7761+ (fc->fence_queue, 7761+ (fc->fence_queue,
7762+ drm_fence_object_signaled(fence, mask), 7762+ drm_fence_object_signaled(fence, mask),
7763+ 3 * DRM_HZ); 7763+ 3 * DRM_HZ);
7764+ else 7764+ else
7765+ ret = wait_event_timeout 7765+ ret = wait_event_timeout
7766+ (fc->fence_queue, 7766+ (fc->fence_queue,
7767+ drm_fence_object_signaled(fence, mask), 7767+ drm_fence_object_signaled(fence, mask),
7768+ 3 * DRM_HZ); 7768+ 3 * DRM_HZ);
7769+ 7769+
7770+ if (unlikely(ret == -ERESTARTSYS)) 7770+ if (unlikely(ret == -ERESTARTSYS))
@@ -8190,8 +8190,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fence.c
8190+} 8190+}
8191Index: linux-2.6.27/drivers/gpu/drm/drm_fops.c 8191Index: linux-2.6.27/drivers/gpu/drm/drm_fops.c
8192=================================================================== 8192===================================================================
8193--- linux-2.6.27.orig/drivers/gpu/drm/drm_fops.c 2009-01-14 11:54:35.000000000 +0000 8193--- linux-2.6.27.orig/drivers/gpu/drm/drm_fops.c 2009-02-05 13:29:29.000000000 +0000
8194+++ linux-2.6.27/drivers/gpu/drm/drm_fops.c 2009-01-14 11:58:01.000000000 +0000 8194+++ linux-2.6.27/drivers/gpu/drm/drm_fops.c 2009-02-05 13:29:33.000000000 +0000
8195@@ -231,6 +231,7 @@ 8195@@ -231,6 +231,7 @@
8196 int minor_id = iminor(inode); 8196 int minor_id = iminor(inode);
8197 struct drm_file *priv; 8197 struct drm_file *priv;
@@ -8279,8 +8279,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_fops.c
8279 8279
8280Index: linux-2.6.27/drivers/gpu/drm/drm_hashtab.c 8280Index: linux-2.6.27/drivers/gpu/drm/drm_hashtab.c
8281=================================================================== 8281===================================================================
8282--- linux-2.6.27.orig/drivers/gpu/drm/drm_hashtab.c 2009-01-14 11:54:35.000000000 +0000 8282--- linux-2.6.27.orig/drivers/gpu/drm/drm_hashtab.c 2008-10-09 23:13:53.000000000 +0100
8283+++ linux-2.6.27/drivers/gpu/drm/drm_hashtab.c 2009-01-14 11:58:01.000000000 +0000 8283+++ linux-2.6.27/drivers/gpu/drm/drm_hashtab.c 2009-02-05 13:29:33.000000000 +0000
8284@@ -29,7 +29,7 @@ 8284@@ -29,7 +29,7 @@
8285 * Simple open hash tab implementation. 8285 * Simple open hash tab implementation.
8286 * 8286 *
@@ -8292,8 +8292,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_hashtab.c
8292 #include "drmP.h" 8292 #include "drmP.h"
8293Index: linux-2.6.27/drivers/gpu/drm/drm_irq.c 8293Index: linux-2.6.27/drivers/gpu/drm/drm_irq.c
8294=================================================================== 8294===================================================================
8295--- linux-2.6.27.orig/drivers/gpu/drm/drm_irq.c 2009-01-14 11:54:35.000000000 +0000 8295--- linux-2.6.27.orig/drivers/gpu/drm/drm_irq.c 2009-02-05 13:29:29.000000000 +0000
8296+++ linux-2.6.27/drivers/gpu/drm/drm_irq.c 2009-01-14 11:58:01.000000000 +0000 8296+++ linux-2.6.27/drivers/gpu/drm/drm_irq.c 2009-02-05 13:29:33.000000000 +0000
8297@@ -70,6 +70,7 @@ 8297@@ -70,6 +70,7 @@
8298 8298
8299 return 0; 8299 return 0;
@@ -8737,8 +8737,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_irq.c
8737 * Tasklet wrapper function. 8737 * Tasklet wrapper function.
8738Index: linux-2.6.27/drivers/gpu/drm/drm_mm.c 8738Index: linux-2.6.27/drivers/gpu/drm/drm_mm.c
8739=================================================================== 8739===================================================================
8740--- linux-2.6.27.orig/drivers/gpu/drm/drm_mm.c 2009-01-14 11:54:35.000000000 +0000 8740--- linux-2.6.27.orig/drivers/gpu/drm/drm_mm.c 2009-02-05 13:29:29.000000000 +0000
8741+++ linux-2.6.27/drivers/gpu/drm/drm_mm.c 2009-01-14 11:58:01.000000000 +0000 8741+++ linux-2.6.27/drivers/gpu/drm/drm_mm.c 2009-02-05 13:29:33.000000000 +0000
8742@@ -38,7 +38,7 @@ 8742@@ -38,7 +38,7 @@
8743 * Aligned allocations can also see improvement. 8743 * Aligned allocations can also see improvement.
8744 * 8744 *
@@ -8751,7 +8751,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_mm.c
8751Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c 8751Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
8752=================================================================== 8752===================================================================
8753--- /dev/null 1970-01-01 00:00:00.000000000 +0000 8753--- /dev/null 1970-01-01 00:00:00.000000000 +0000
8754+++ linux-2.6.27/drivers/gpu/drm/drm_modes.c 2009-01-14 11:58:01.000000000 +0000 8754+++ linux-2.6.27/drivers/gpu/drm/drm_modes.c 2009-02-05 13:29:33.000000000 +0000
8755@@ -0,0 +1,560 @@ 8755@@ -0,0 +1,560 @@
8756+/* 8756+/*
8757+ * Copyright © 1997-2003 by The XFree86 Project, Inc. 8757+ * Copyright © 1997-2003 by The XFree86 Project, Inc.
@@ -8927,7 +8927,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
8927+ return refresh; 8927+ return refresh;
8928+} 8928+}
8929+EXPORT_SYMBOL(drm_mode_vrefresh); 8929+EXPORT_SYMBOL(drm_mode_vrefresh);
8930+ 8930+
8931+/** 8931+/**
8932+ * drm_mode_set_crtcinfo - set CRTC modesetting parameters 8932+ * drm_mode_set_crtcinfo - set CRTC modesetting parameters
8933+ * @p: mode 8933+ * @p: mode
@@ -9045,7 +9045,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9045+ mode1->vscan == mode2->vscan && 9045+ mode1->vscan == mode2->vscan &&
9046+ mode1->flags == mode2->flags) 9046+ mode1->flags == mode2->flags)
9047+ return true; 9047+ return true;
9048+ 9048+
9049+ return false; 9049+ return false;
9050+} 9050+}
9051+EXPORT_SYMBOL(drm_mode_equal); 9051+EXPORT_SYMBOL(drm_mode_equal);
@@ -9074,7 +9074,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9074+ list_for_each_entry(mode, mode_list, head) { 9074+ list_for_each_entry(mode, mode_list, head) {
9075+ if (maxPitch > 0 && mode->hdisplay > maxPitch) 9075+ if (maxPitch > 0 && mode->hdisplay > maxPitch)
9076+ mode->status = MODE_BAD_WIDTH; 9076+ mode->status = MODE_BAD_WIDTH;
9077+ 9077+
9078+ if (maxX > 0 && mode->hdisplay > maxX) 9078+ if (maxX > 0 && mode->hdisplay > maxX)
9079+ mode->status = MODE_VIRTUAL_X; 9079+ mode->status = MODE_VIRTUAL_X;
9080+ 9080+
@@ -9189,7 +9189,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9189+{ 9189+{
9190+ struct list_head *p, *q, *e, *list, *tail, *oldhead; 9190+ struct list_head *p, *q, *e, *list, *tail, *oldhead;
9191+ int insize, nmerges, psize, qsize, i; 9191+ int insize, nmerges, psize, qsize, i;
9192+ 9192+
9193+ list = head->next; 9193+ list = head->next;
9194+ list_del(head); 9194+ list_del(head);
9195+ insize = 1; 9195+ insize = 1;
@@ -9197,7 +9197,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9197+ p = oldhead = list; 9197+ p = oldhead = list;
9198+ list = tail = NULL; 9198+ list = tail = NULL;
9199+ nmerges = 0; 9199+ nmerges = 0;
9200+ 9200+
9201+ while (p) { 9201+ while (p) {
9202+ nmerges++; 9202+ nmerges++;
9203+ q = p; 9203+ q = p;
@@ -9208,7 +9208,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9208+ if (!q) 9208+ if (!q)
9209+ break; 9209+ break;
9210+ } 9210+ }
9211+ 9211+
9212+ qsize = insize; 9212+ qsize = insize;
9213+ while (psize > 0 || (qsize > 0 && q)) { 9213+ while (psize > 0 || (qsize > 0 && q)) {
9214+ if (!psize) { 9214+ if (!psize) {
@@ -9245,16 +9245,16 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9245+ } 9245+ }
9246+ p = q; 9246+ p = q;
9247+ } 9247+ }
9248+ 9248+
9249+ tail->next = list; 9249+ tail->next = list;
9250+ list->prev = tail; 9250+ list->prev = tail;
9251+ 9251+
9252+ if (nmerges <= 1) 9252+ if (nmerges <= 1)
9253+ break; 9253+ break;
9254+ 9254+
9255+ insize *= 2; 9255+ insize *= 2;
9256+ } 9256+ }
9257+ 9257+
9258+ head->next = list; 9258+ head->next = list;
9259+ head->prev = list->prev; 9259+ head->prev = list->prev;
9260+ list->prev->next = head; 9260+ list->prev->next = head;
@@ -9316,7 +9316,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_modes.c
9316Index: linux-2.6.27/drivers/gpu/drm/drm_object.c 9316Index: linux-2.6.27/drivers/gpu/drm/drm_object.c
9317=================================================================== 9317===================================================================
9318--- /dev/null 1970-01-01 00:00:00.000000000 +0000 9318--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9319+++ linux-2.6.27/drivers/gpu/drm/drm_object.c 2009-01-14 11:58:01.000000000 +0000 9319+++ linux-2.6.27/drivers/gpu/drm/drm_object.c 2009-02-05 13:29:33.000000000 +0000
9320@@ -0,0 +1,294 @@ 9320@@ -0,0 +1,294 @@
9321+/************************************************************************** 9321+/**************************************************************************
9322+ * 9322+ *
@@ -9615,7 +9615,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_object.c
9615Index: linux-2.6.27/drivers/gpu/drm/drm_regman.c 9615Index: linux-2.6.27/drivers/gpu/drm/drm_regman.c
9616=================================================================== 9616===================================================================
9617--- /dev/null 1970-01-01 00:00:00.000000000 +0000 9617--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9618+++ linux-2.6.27/drivers/gpu/drm/drm_regman.c 2009-01-14 11:58:01.000000000 +0000 9618+++ linux-2.6.27/drivers/gpu/drm/drm_regman.c 2009-02-05 13:29:33.000000000 +0000
9619@@ -0,0 +1,200 @@ 9619@@ -0,0 +1,200 @@
9620+/************************************************************************** 9620+/**************************************************************************
9621+ * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA 9621+ * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
@@ -9819,8 +9819,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_regman.c
9819+EXPORT_SYMBOL(drm_regs_init); 9819+EXPORT_SYMBOL(drm_regs_init);
9820Index: linux-2.6.27/drivers/gpu/drm/drm_sman.c 9820Index: linux-2.6.27/drivers/gpu/drm/drm_sman.c
9821=================================================================== 9821===================================================================
9822--- linux-2.6.27.orig/drivers/gpu/drm/drm_sman.c 2009-01-14 11:54:35.000000000 +0000 9822--- linux-2.6.27.orig/drivers/gpu/drm/drm_sman.c 2008-10-09 23:13:53.000000000 +0100
9823+++ linux-2.6.27/drivers/gpu/drm/drm_sman.c 2009-01-14 11:58:01.000000000 +0000 9823+++ linux-2.6.27/drivers/gpu/drm/drm_sman.c 2009-02-05 13:29:33.000000000 +0000
9824@@ -33,7 +33,7 @@ 9824@@ -33,7 +33,7 @@
9825 * struct or a context identifier. 9825 * struct or a context identifier.
9826 * 9826 *
@@ -9832,8 +9832,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_sman.c
9832 #include "drm_sman.h" 9832 #include "drm_sman.h"
9833Index: linux-2.6.27/drivers/gpu/drm/drm_stub.c 9833Index: linux-2.6.27/drivers/gpu/drm/drm_stub.c
9834=================================================================== 9834===================================================================
9835--- linux-2.6.27.orig/drivers/gpu/drm/drm_stub.c 2009-01-14 11:54:35.000000000 +0000 9835--- linux-2.6.27.orig/drivers/gpu/drm/drm_stub.c 2009-02-05 13:29:29.000000000 +0000
9836+++ linux-2.6.27/drivers/gpu/drm/drm_stub.c 2009-01-14 11:58:01.000000000 +0000 9836+++ linux-2.6.27/drivers/gpu/drm/drm_stub.c 2009-02-05 13:29:33.000000000 +0000
9837@@ -97,6 +97,7 @@ 9837@@ -97,6 +97,7 @@
9838 init_timer(&dev->timer); 9838 init_timer(&dev->timer);
9839 mutex_init(&dev->struct_mutex); 9839 mutex_init(&dev->struct_mutex);
@@ -9890,7 +9890,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_stub.c
9890Index: linux-2.6.27/drivers/gpu/drm/drm_ttm.c 9890Index: linux-2.6.27/drivers/gpu/drm/drm_ttm.c
9891=================================================================== 9891===================================================================
9892--- /dev/null 1970-01-01 00:00:00.000000000 +0000 9892--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9893+++ linux-2.6.27/drivers/gpu/drm/drm_ttm.c 2009-01-14 11:58:01.000000000 +0000 9893+++ linux-2.6.27/drivers/gpu/drm/drm_ttm.c 2009-02-05 13:29:33.000000000 +0000
9894@@ -0,0 +1,430 @@ 9894@@ -0,0 +1,430 @@
9895+/************************************************************************** 9895+/**************************************************************************
9896+ * 9896+ *
@@ -10324,8 +10324,8 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_ttm.c
10324+EXPORT_SYMBOL(drm_bind_ttm); 10324+EXPORT_SYMBOL(drm_bind_ttm);
10325Index: linux-2.6.27/drivers/gpu/drm/drm_vm.c 10325Index: linux-2.6.27/drivers/gpu/drm/drm_vm.c
10326=================================================================== 10326===================================================================
10327--- linux-2.6.27.orig/drivers/gpu/drm/drm_vm.c 2009-01-14 11:54:35.000000000 +0000 10327--- linux-2.6.27.orig/drivers/gpu/drm/drm_vm.c 2008-10-09 23:13:53.000000000 +0100
10328+++ linux-2.6.27/drivers/gpu/drm/drm_vm.c 2009-01-14 11:58:01.000000000 +0000 10328+++ linux-2.6.27/drivers/gpu/drm/drm_vm.c 2009-02-05 13:29:33.000000000 +0000
10329@@ -40,6 +40,10 @@ 10329@@ -40,6 +40,10 @@
10330 10330
10331 static void drm_vm_open(struct vm_area_struct *vma); 10331 static void drm_vm_open(struct vm_area_struct *vma);
@@ -10480,7 +10480,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_vm.c
10480+ if (address >= vma->vm_end) 10480+ if (address >= vma->vm_end)
10481+ break; 10481+ break;
10482+ if (bus_size) { 10482+ if (bus_size) {
10483+ pfn = ((bus_base + bus_offset) >> PAGE_SHIFT) 10483+ pfn = ((bus_base + bus_offset) >> PAGE_SHIFT)
10484+ + page_offset; 10484+ + page_offset;
10485+ } else { 10485+ } else {
10486+ page = drm_ttm_get_page(ttm, page_offset); 10486+ page = drm_ttm_get_page(ttm, page_offset);
@@ -10573,7 +10573,7 @@ Index: linux-2.6.27/drivers/gpu/drm/drm_vm.c
10573Index: linux-2.6.27/drivers/gpu/drm/psb/Makefile 10573Index: linux-2.6.27/drivers/gpu/drm/psb/Makefile
10574=================================================================== 10574===================================================================
10575--- /dev/null 1970-01-01 00:00:00.000000000 +0000 10575--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10576+++ linux-2.6.27/drivers/gpu/drm/psb/Makefile 2009-01-14 11:58:01.000000000 +0000 10576+++ linux-2.6.27/drivers/gpu/drm/psb/Makefile 2009-02-05 13:29:33.000000000 +0000
10577@@ -0,0 +1,13 @@ 10577@@ -0,0 +1,13 @@
10578+# 10578+#
10579+# Makefile for the drm device driver. This driver provides support for the 10579+# Makefile for the drm device driver. This driver provides support for the
@@ -10591,7 +10591,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/Makefile
10591Index: linux-2.6.27/drivers/gpu/drm/psb/i915_drv.h 10591Index: linux-2.6.27/drivers/gpu/drm/psb/i915_drv.h
10592=================================================================== 10592===================================================================
10593--- /dev/null 1970-01-01 00:00:00.000000000 +0000 10593--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10594+++ linux-2.6.27/drivers/gpu/drm/psb/i915_drv.h 2009-01-14 11:58:01.000000000 +0000 10594+++ linux-2.6.27/drivers/gpu/drm/psb/i915_drv.h 2009-02-05 13:29:33.000000000 +0000
10595@@ -0,0 +1,795 @@ 10595@@ -0,0 +1,795 @@
10596+/* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- 10596+/* i915_drv.h -- Private header for the I915 driver -*- linux-c -*-
10597+ */ 10597+ */
@@ -11391,28 +11391,33 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/i915_drv.h
11391Index: linux-2.6.27/drivers/gpu/drm/psb/i915_reg.h 11391Index: linux-2.6.27/drivers/gpu/drm/psb/i915_reg.h
11392=================================================================== 11392===================================================================
11393--- /dev/null 1970-01-01 00:00:00.000000000 +0000 11393--- /dev/null 1970-01-01 00:00:00.000000000 +0000
11394+++ linux-2.6.27/drivers/gpu/drm/psb/i915_reg.h 2009-01-14 11:58:01.000000000 +0000 11394+++ linux-2.6.27/drivers/gpu/drm/psb/i915_reg.h 2009-02-05 18:29:58.000000000 +0000
11395@@ -0,0 +1,487 @@ 11395@@ -0,0 +1,98 @@
11396+#define BLC_PWM_CTL 0x61254 11396+/* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
11397+#define BLC_PWM_CTL2 0x61250 11397+ * All Rights Reserved.
11398+#define BACKLIGHT_MODULATION_FREQ_SHIFT (17)
11399+/**
11400+ * This is the most significant 15 bits of the number of backlight cycles in a
11401+ * complete cycle of the modulated backlight control.
11402+ * 11398+ *
11403+ * The actual value is this field multiplied by two. 11399+ * Permission is hereby granted, free of charge, to any person obtaining a
11404+ */ 11400+ * copy of this software and associated documentation files (the
11405+#define BACKLIGHT_MODULATION_FREQ_MASK (0x7fff << 17) 11401+ * "Software"), to deal in the Software without restriction, including
11406+#define BLM_LEGACY_MODE (1 << 16) 11402+ * without limitation the rights to use, copy, modify, merge, publish,
11407+/** 11403+ * distribute, sub license, and/or sell copies of the Software, and to
11408+ * This is the number of cycles out of the backlight modulation cycle for which 11404+ * permit persons to whom the Software is furnished to do so, subject to
11409+ * the backlight is on. 11405+ * the following conditions:
11410+ * 11406+ *
11411+ * This field must be no greater than the number of cycles in the complete 11407+ * The above copyright notice and this permission notice (including the
11412+ * backlight modulation cycle. 11408+ * next paragraph) shall be included in all copies or substantial portions
11409+ * of the Software.
11410+ *
11411+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11412+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11413+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
11414+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
11415+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
11416+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
11417+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11413+ */ 11418+ */
11414+#define BACKLIGHT_DUTY_CYCLE_SHIFT (0) 11419+
11415+#define BACKLIGHT_DUTY_CYCLE_MASK (0xffff) 11420+#include "../i915/i915_reg.h"
11416+ 11421+
11417+#define I915_GCFGC 0xf0 11422+#define I915_GCFGC 0xf0
11418+#define I915_LOW_FREQUENCY_ENABLE (1 << 7) 11423+#define I915_LOW_FREQUENCY_ENABLE (1 << 7)
@@ -11427,426 +11432,11 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/i915_reg.h
11427+#define I855_CLOCK_100_133 (2 << 0) 11432+#define I855_CLOCK_100_133 (2 << 0)
11428+#define I855_CLOCK_166_250 (3 << 0) 11433+#define I855_CLOCK_166_250 (3 << 0)
11429+ 11434+
11430+/* I830 CRTC registers */
11431+#define HTOTAL_A 0x60000
11432+#define HBLANK_A 0x60004
11433+#define HSYNC_A 0x60008
11434+#define VTOTAL_A 0x6000c
11435+#define VBLANK_A 0x60010
11436+#define VSYNC_A 0x60014
11437+#define PIPEASRC 0x6001c
11438+#define BCLRPAT_A 0x60020
11439+#define VSYNCSHIFT_A 0x60028
11440+
11441+#define HTOTAL_B 0x61000
11442+#define HBLANK_B 0x61004
11443+#define HSYNC_B 0x61008
11444+#define VTOTAL_B 0x6100c
11445+#define VBLANK_B 0x61010
11446+#define VSYNC_B 0x61014
11447+#define PIPEBSRC 0x6101c
11448+#define BCLRPAT_B 0x61020
11449+#define VSYNCSHIFT_B 0x61028
11450+
11451+#define PP_STATUS 0x61200
11452+# define PP_ON (1 << 31)
11453+/**
11454+ * Indicates that all dependencies of the panel are on:
11455+ *
11456+ * - PLL enabled
11457+ * - pipe enabled
11458+ * - LVDS/DVOB/DVOC on
11459+ */
11460+# define PP_READY (1 << 30)
11461+# define PP_SEQUENCE_NONE (0 << 28)
11462+# define PP_SEQUENCE_ON (1 << 28)
11463+# define PP_SEQUENCE_OFF (2 << 28)
11464+# define PP_SEQUENCE_MASK 0x30000000
11465+#define PP_CONTROL 0x61204
11466+# define POWER_TARGET_ON (1 << 0)
11467+
11468+#define LVDSPP_ON 0x61208 11435+#define LVDSPP_ON 0x61208
11469+#define LVDSPP_OFF 0x6120c 11436+#define LVDSPP_OFF 0x6120c
11470+#define PP_CYCLE 0x61210 11437+#define PP_CYCLE 0x61210
11471+ 11438+
11472+#define PFIT_CONTROL 0x61230
11473+# define PFIT_ENABLE (1 << 31)
11474+# define PFIT_PIPE_MASK (3 << 29)
11475+# define PFIT_PIPE_SHIFT 29
11476+# define VERT_INTERP_DISABLE (0 << 10)
11477+# define VERT_INTERP_BILINEAR (1 << 10)
11478+# define VERT_INTERP_MASK (3 << 10)
11479+# define VERT_AUTO_SCALE (1 << 9)
11480+# define HORIZ_INTERP_DISABLE (0 << 6)
11481+# define HORIZ_INTERP_BILINEAR (1 << 6)
11482+# define HORIZ_INTERP_MASK (3 << 6)
11483+# define HORIZ_AUTO_SCALE (1 << 5)
11484+# define PANEL_8TO6_DITHER_ENABLE (1 << 3)
11485+
11486+#define PFIT_PGM_RATIOS 0x61234
11487+# define PFIT_VERT_SCALE_MASK 0xfff00000
11488+# define PFIT_HORIZ_SCALE_MASK 0x0000fff0
11489+
11490+#define PFIT_AUTO_RATIOS 0x61238
11491+
11492+
11493+#define DPLL_A 0x06014
11494+#define DPLL_B 0x06018
11495+# define DPLL_VCO_ENABLE (1 << 31)
11496+# define DPLL_DVO_HIGH_SPEED (1 << 30)
11497+# define DPLL_SYNCLOCK_ENABLE (1 << 29)
11498+# define DPLL_VGA_MODE_DIS (1 << 28)
11499+# define DPLLB_MODE_DAC_SERIAL (1 << 26) /* i915 */
11500+# define DPLLB_MODE_LVDS (2 << 26) /* i915 */
11501+# define DPLL_MODE_MASK (3 << 26)
11502+# define DPLL_DAC_SERIAL_P2_CLOCK_DIV_10 (0 << 24) /* i915 */
11503+# define DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 (1 << 24) /* i915 */
11504+# define DPLLB_LVDS_P2_CLOCK_DIV_14 (0 << 24) /* i915 */
11505+# define DPLLB_LVDS_P2_CLOCK_DIV_7 (1 << 24) /* i915 */
11506+# define DPLL_P2_CLOCK_DIV_MASK 0x03000000 /* i915 */
11507+# define DPLL_FPA01_P1_POST_DIV_MASK 0x00ff0000 /* i915 */
11508+/**
11509+ * The i830 generation, in DAC/serial mode, defines p1 as two plus this
11510+ * bitfield, or just 2 if PLL_P1_DIVIDE_BY_TWO is set.
11511+ */
11512+# define DPLL_FPA01_P1_POST_DIV_MASK_I830 0x001f0000
11513+/**
11514+ * The i830 generation, in LVDS mode, defines P1 as the bit number set within
11515+ * this field (only one bit may be set).
11516+ */
11517+# define DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS 0x003f0000
11518+# define DPLL_FPA01_P1_POST_DIV_SHIFT 16
11519+# define PLL_P2_DIVIDE_BY_4 (1 << 23) /* i830, required in DVO non-gang */
11520+# define PLL_P1_DIVIDE_BY_TWO (1 << 21) /* i830 */
11521+# define PLL_REF_INPUT_DREFCLK (0 << 13)
11522+# define PLL_REF_INPUT_TVCLKINA (1 << 13) /* i830 */
11523+# define PLL_REF_INPUT_TVCLKINBC (2 << 13) /* SDVO TVCLKIN */
11524+# define PLLB_REF_INPUT_SPREADSPECTRUMIN (3 << 13)
11525+# define PLL_REF_INPUT_MASK (3 << 13)
11526+# define PLL_LOAD_PULSE_PHASE_SHIFT 9
11527+/*
11528+ * Parallel to Serial Load Pulse phase selection.
11529+ * Selects the phase for the 10X DPLL clock for the PCIe
11530+ * digital display port. The range is 4 to 13; 10 or more
11531+ * is just a flip delay. The default is 6
11532+ */
11533+# define PLL_LOAD_PULSE_PHASE_MASK (0xf << PLL_LOAD_PULSE_PHASE_SHIFT)
11534+# define DISPLAY_RATE_SELECT_FPA1 (1 << 8)
11535+
11536+/**
11537+ * SDVO multiplier for 945G/GM. Not used on 965.
11538+ *
11539+ * \sa DPLL_MD_UDI_MULTIPLIER_MASK
11540+ */
11541+# define SDVO_MULTIPLIER_MASK 0x000000ff
11542+# define SDVO_MULTIPLIER_SHIFT_HIRES 4
11543+# define SDVO_MULTIPLIER_SHIFT_VGA 0
11544+
11545+/** @defgroup DPLL_MD
11546+ * @{
11547+ */
11548+/** Pipe A SDVO/UDI clock multiplier/divider register for G965. */
11549+#define DPLL_A_MD 0x0601c
11550+/** Pipe B SDVO/UDI clock multiplier/divider register for G965. */
11551+#define DPLL_B_MD 0x06020
11552+/**
11553+ * UDI pixel divider, controlling how many pixels are stuffed into a packet.
11554+ *
11555+ * Value is pixels minus 1. Must be set to 1 pixel for SDVO.
11556+ */
11557+# define DPLL_MD_UDI_DIVIDER_MASK 0x3f000000
11558+# define DPLL_MD_UDI_DIVIDER_SHIFT 24
11559+/** UDI pixel divider for VGA, same as DPLL_MD_UDI_DIVIDER_MASK. */
11560+# define DPLL_MD_VGA_UDI_DIVIDER_MASK 0x003f0000
11561+# define DPLL_MD_VGA_UDI_DIVIDER_SHIFT 16
11562+/**
11563+ * SDVO/UDI pixel multiplier.
11564+ *
11565+ * SDVO requires that the bus clock rate be between 1 and 2 Ghz, and the bus
11566+ * clock rate is 10 times the DPLL clock. At low resolution/refresh rate
11567+ * modes, the bus rate would be below the limits, so SDVO allows for stuffing
11568+ * dummy bytes in the datastream at an increased clock rate, with both sides of
11569+ * the link knowing how many bytes are fill.
11570+ *
11571+ * So, for a mode with a dotclock of 65Mhz, we would want to double the clock
11572+ * rate to 130Mhz to get a bus rate of 1.30Ghz. The DPLL clock rate would be
11573+ * set to 130Mhz, and the SDVO multiplier set to 2x in this register and
11574+ * through an SDVO command.
11575+ *
11576+ * This register field has values of multiplication factor minus 1, with
11577+ * a maximum multiplier of 5 for SDVO.
11578+ */
11579+# define DPLL_MD_UDI_MULTIPLIER_MASK 0x00003f00
11580+# define DPLL_MD_UDI_MULTIPLIER_SHIFT 8
11581+/** SDVO/UDI pixel multiplier for VGA, same as DPLL_MD_UDI_MULTIPLIER_MASK.
11582+ * This best be set to the default value (3) or the CRT won't work. No,
11583+ * I don't entirely understand what this does...
11584+ */
11585+# define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f
11586+# define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0
11587+/** @} */
11588+
11589+#define DPLL_TEST 0x606c
11590+# define DPLLB_TEST_SDVO_DIV_1 (0 << 22)
11591+# define DPLLB_TEST_SDVO_DIV_2 (1 << 22)
11592+# define DPLLB_TEST_SDVO_DIV_4 (2 << 22)
11593+# define DPLLB_TEST_SDVO_DIV_MASK (3 << 22)
11594+# define DPLLB_TEST_N_BYPASS (1 << 19)
11595+# define DPLLB_TEST_M_BYPASS (1 << 18)
11596+# define DPLLB_INPUT_BUFFER_ENABLE (1 << 16)
11597+# define DPLLA_TEST_N_BYPASS (1 << 3)
11598+# define DPLLA_TEST_M_BYPASS (1 << 2)
11599+# define DPLLA_INPUT_BUFFER_ENABLE (1 << 0)
11600+
11601+#define ADPA 0x61100
11602+#define ADPA_DAC_ENABLE (1<<31)
11603+#define ADPA_DAC_DISABLE 0
11604+#define ADPA_PIPE_SELECT_MASK (1<<30)
11605+#define ADPA_PIPE_A_SELECT 0
11606+#define ADPA_PIPE_B_SELECT (1<<30)
11607+#define ADPA_USE_VGA_HVPOLARITY (1<<15)
11608+#define ADPA_SETS_HVPOLARITY 0
11609+#define ADPA_VSYNC_CNTL_DISABLE (1<<11)
11610+#define ADPA_VSYNC_CNTL_ENABLE 0
11611+#define ADPA_HSYNC_CNTL_DISABLE (1<<10)
11612+#define ADPA_HSYNC_CNTL_ENABLE 0
11613+#define ADPA_VSYNC_ACTIVE_HIGH (1<<4)
11614+#define ADPA_VSYNC_ACTIVE_LOW 0
11615+#define ADPA_HSYNC_ACTIVE_HIGH (1<<3)
11616+#define ADPA_HSYNC_ACTIVE_LOW 0
11617+
11618+#define FPA0 0x06040
11619+#define FPA1 0x06044
11620+#define FPB0 0x06048
11621+#define FPB1 0x0604c
11622+# define FP_N_DIV_MASK 0x003f0000
11623+# define FP_N_DIV_SHIFT 16
11624+# define FP_M1_DIV_MASK 0x00003f00
11625+# define FP_M1_DIV_SHIFT 8
11626+# define FP_M2_DIV_MASK 0x0000003f
11627+# define FP_M2_DIV_SHIFT 0
11628+
11629+
11630+#define PORT_HOTPLUG_EN 0x61110
11631+# define SDVOB_HOTPLUG_INT_EN (1 << 26)
11632+# define SDVOC_HOTPLUG_INT_EN (1 << 25)
11633+# define TV_HOTPLUG_INT_EN (1 << 18)
11634+# define CRT_HOTPLUG_INT_EN (1 << 9)
11635+# define CRT_HOTPLUG_FORCE_DETECT (1 << 3)
11636+
11637+#define PORT_HOTPLUG_STAT 0x61114
11638+# define CRT_HOTPLUG_INT_STATUS (1 << 11)
11639+# define TV_HOTPLUG_INT_STATUS (1 << 10)
11640+# define CRT_HOTPLUG_MONITOR_MASK (3 << 8)
11641+# define CRT_HOTPLUG_MONITOR_COLOR (3 << 8)
11642+# define CRT_HOTPLUG_MONITOR_MONO (2 << 8)
11643+# define CRT_HOTPLUG_MONITOR_NONE (0 << 8)
11644+# define SDVOC_HOTPLUG_INT_STATUS (1 << 7)
11645+# define SDVOB_HOTPLUG_INT_STATUS (1 << 6)
11646+
11647+#define SDVOB 0x61140
11648+#define SDVOC 0x61160
11649+#define SDVO_ENABLE (1 << 31)
11650+#define SDVO_PIPE_B_SELECT (1 << 30)
11651+#define SDVO_STALL_SELECT (1 << 29)
11652+#define SDVO_INTERRUPT_ENABLE (1 << 26)
11653+/**
11654+ * 915G/GM SDVO pixel multiplier.
11655+ *
11656+ * Programmed value is multiplier - 1, up to 5x.
11657+ *
11658+ * \sa DPLL_MD_UDI_MULTIPLIER_MASK
11659+ */
11660+#define SDVO_PORT_MULTIPLY_MASK (7 << 23)
11661+#define SDVO_PORT_MULTIPLY_SHIFT 23
11662+#define SDVO_PHASE_SELECT_MASK (15 << 19)
11663+#define SDVO_PHASE_SELECT_DEFAULT (6 << 19)
11664+#define SDVO_CLOCK_OUTPUT_INVERT (1 << 18)
11665+#define SDVOC_GANG_MODE (1 << 16)
11666+#define SDVO_BORDER_ENABLE (1 << 7)
11667+#define SDVOB_PCIE_CONCURRENCY (1 << 3)
11668+#define SDVO_DETECTED (1 << 2)
11669+/* Bits to be preserved when writing */
11670+#define SDVOB_PRESERVE_MASK ((1 << 17) | (1 << 16) | (1 << 14))
11671+#define SDVOC_PRESERVE_MASK (1 << 17)
11672+
11673+/** @defgroup LVDS
11674+ * @{
11675+ */
11676+/**
11677+ * This register controls the LVDS output enable, pipe selection, and data
11678+ * format selection.
11679+ *
11680+ * All of the clock/data pairs are force powered down by power sequencing.
11681+ */
11682+#define LVDS 0x61180
11683+/**
11684+ * Enables the LVDS port. This bit must be set before DPLLs are enabled, as
11685+ * the DPLL semantics change when the LVDS is assigned to that pipe.
11686+ */
11687+# define LVDS_PORT_EN (1 << 31)
11688+/** Selects pipe B for LVDS data. Must be set on pre-965. */
11689+# define LVDS_PIPEB_SELECT (1 << 30)
11690+
11691+/**
11692+ * Enables the A0-A2 data pairs and CLKA, containing 18 bits of color data per
11693+ * pixel.
11694+ */
11695+# define LVDS_A0A2_CLKA_POWER_MASK (3 << 8)
11696+# define LVDS_A0A2_CLKA_POWER_DOWN (0 << 8)
11697+# define LVDS_A0A2_CLKA_POWER_UP (3 << 8)
11698+/**
11699+ * Controls the A3 data pair, which contains the additional LSBs for 24 bit
11700+ * mode. Only enabled if LVDS_A0A2_CLKA_POWER_UP also indicates it should be
11701+ * on.
11702+ */
11703+# define LVDS_A3_POWER_MASK (3 << 6)
11704+# define LVDS_A3_POWER_DOWN (0 << 6)
11705+# define LVDS_A3_POWER_UP (3 << 6)
11706+/**
11707+ * Controls the CLKB pair. This should only be set when LVDS_B0B3_POWER_UP
11708+ * is set.
11709+ */
11710+# define LVDS_CLKB_POWER_MASK (3 << 4)
11711+# define LVDS_CLKB_POWER_DOWN (0 << 4)
11712+# define LVDS_CLKB_POWER_UP (3 << 4)
11713+
11714+/**
11715+ * Controls the B0-B3 data pairs. This must be set to match the DPLL p2
11716+ * setting for whether we are in dual-channel mode. The B3 pair will
11717+ * additionally only be powered up when LVDS_A3_POWER_UP is set.
11718+ */
11719+# define LVDS_B0B3_POWER_MASK (3 << 2)
11720+# define LVDS_B0B3_POWER_DOWN (0 << 2)
11721+# define LVDS_B0B3_POWER_UP (3 << 2)
11722+
11723+#define PIPEACONF 0x70008
11724+#define PIPEACONF_ENABLE (1<<31)
11725+#define PIPEACONF_DISABLE 0
11726+#define PIPEACONF_DOUBLE_WIDE (1<<30)
11727+#define I965_PIPECONF_ACTIVE (1<<30)
11728+#define PIPEACONF_SINGLE_WIDE 0
11729+#define PIPEACONF_PIPE_UNLOCKED 0
11730+#define PIPEACONF_PIPE_LOCKED (1<<25)
11731+#define PIPEACONF_PALETTE 0
11732+#define PIPEACONF_GAMMA (1<<24)
11733+#define PIPECONF_FORCE_BORDER (1<<25)
11734+#define PIPECONF_PROGRESSIVE (0 << 21)
11735+#define PIPECONF_INTERLACE_W_FIELD_INDICATION (6 << 21)
11736+#define PIPECONF_INTERLACE_FIELD_0_ONLY (7 << 21)
11737+
11738+#define PIPEBCONF 0x71008
11739+#define PIPEBCONF_ENABLE (1<<31)
11740+#define PIPEBCONF_DISABLE 0
11741+#define PIPEBCONF_DOUBLE_WIDE (1<<30)
11742+#define PIPEBCONF_DISABLE 0
11743+#define PIPEBCONF_GAMMA (1<<24)
11744+#define PIPEBCONF_PALETTE 0
11745+
11746+#define PIPEBGCMAXRED 0x71010
11747+#define PIPEBGCMAXGREEN 0x71014
11748+#define PIPEBGCMAXBLUE 0x71018
11749+#define PIPEBSTAT 0x71024
11750+#define PIPEBFRAMEHIGH 0x71040
11751+#define PIPEBFRAMEPIXEL 0x71044
11752+
11753+#define DSPACNTR 0x70180
11754+#define DSPBCNTR 0x71180
11755+#define DISPLAY_PLANE_ENABLE (1<<31)
11756+#define DISPLAY_PLANE_DISABLE 0
11757+#define DISPPLANE_GAMMA_ENABLE (1<<30)
11758+#define DISPPLANE_GAMMA_DISABLE 0
11759+#define DISPPLANE_PIXFORMAT_MASK (0xf<<26)
11760+#define DISPPLANE_8BPP (0x2<<26)
11761+#define DISPPLANE_15_16BPP (0x4<<26)
11762+#define DISPPLANE_16BPP (0x5<<26)
11763+#define DISPPLANE_32BPP_NO_ALPHA (0x6<<26)
11764+#define DISPPLANE_32BPP (0x7<<26)
11765+#define DISPPLANE_STEREO_ENABLE (1<<25)
11766+#define DISPPLANE_STEREO_DISABLE 0
11767+#define DISPPLANE_SEL_PIPE_MASK (1<<24)
11768+#define DISPPLANE_SEL_PIPE_A 0
11769+#define DISPPLANE_SEL_PIPE_B (1<<24)
11770+#define DISPPLANE_SRC_KEY_ENABLE (1<<22)
11771+#define DISPPLANE_SRC_KEY_DISABLE 0
11772+#define DISPPLANE_LINE_DOUBLE (1<<20)
11773+#define DISPPLANE_NO_LINE_DOUBLE 0
11774+#define DISPPLANE_STEREO_POLARITY_FIRST 0
11775+#define DISPPLANE_STEREO_POLARITY_SECOND (1<<18)
11776+/* plane B only */
11777+#define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15)
11778+#define DISPPLANE_ALPHA_TRANS_DISABLE 0
11779+#define DISPPLANE_SPRITE_ABOVE_DISPLAYA 0
11780+#define DISPPLANE_SPRITE_ABOVE_OVERLAY (1)
11781+
11782+#define DSPABASE 0x70184
11783+#define DSPASTRIDE 0x70188
11784+
11785+#define DSPBBASE 0x71184
11786+#define DSPBADDR DSPBBASE
11787+#define DSPBSTRIDE 0x71188
11788+ 11439+
11789+#define DSPAKEYVAL 0x70194
11790+#define DSPAKEYMASK 0x70198
11791+
11792+#define DSPAPOS 0x7018C /* reserved */
11793+#define DSPASIZE 0x70190
11794+#define DSPBPOS 0x7118C
11795+#define DSPBSIZE 0x71190
11796+
11797+#define DSPASURF 0x7019C
11798+#define DSPATILEOFF 0x701A4
11799+
11800+#define DSPBSURF 0x7119C
11801+#define DSPBTILEOFF 0x711A4
11802+
11803+#define VGACNTRL 0x71400
11804+# define VGA_DISP_DISABLE (1 << 31)
11805+# define VGA_2X_MODE (1 << 30)
11806+# define VGA_PIPE_B_SELECT (1 << 29)
11807+
11808+/*
11809+ * Some BIOS scratch area registers. The 845 (and 830?) store the amount
11810+ * of video memory available to the BIOS in SWF1.
11811+ */
11812+
11813+#define SWF0 0x71410
11814+#define SWF1 0x71414
11815+#define SWF2 0x71418
11816+#define SWF3 0x7141c
11817+#define SWF4 0x71420
11818+#define SWF5 0x71424
11819+#define SWF6 0x71428
11820+
11821+/*
11822+ * 855 scratch registers.
11823+ */
11824+#define SWF00 0x70410
11825+#define SWF01 0x70414
11826+#define SWF02 0x70418
11827+#define SWF03 0x7041c
11828+#define SWF04 0x70420
11829+#define SWF05 0x70424
11830+#define SWF06 0x70428
11831+
11832+#define SWF10 SWF0
11833+#define SWF11 SWF1
11834+#define SWF12 SWF2
11835+#define SWF13 SWF3
11836+#define SWF14 SWF4
11837+#define SWF15 SWF5
11838+#define SWF16 SWF6
11839+
11840+#define SWF30 0x72414
11841+#define SWF31 0x72418
11842+#define SWF32 0x7241c
11843+
11844+
11845+/*
11846+ * Palette registers
11847+ */
11848+#define PALETTE_A 0x0a000
11849+#define PALETTE_B 0x0a800
11850+ 11440+
11851+#define IS_I830(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82830_CGC) 11441+#define IS_I830(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82830_CGC)
11852+#define IS_845G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82845G_IG) 11442+#define IS_845G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82845G_IG)
@@ -11880,10 +11470,31 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/i915_reg.h
11880+ 11470+
11881+#define IS_POULSBO(dev) (((dev)->pci_device == 0x8108) || \ 11471+#define IS_POULSBO(dev) (((dev)->pci_device == 0x8108) || \
11882+ ((dev)->pci_device == 0x8109)) 11472+ ((dev)->pci_device == 0x8109))
11473+
11474+#define FPA0 0x06040
11475+#define FPA1 0x06044
11476+#define FPB0 0x06048
11477+#define FPB1 0x0604c
11478+#define FP_N_DIV_MASK 0x003f0000
11479+#define FP_N_DIV_SHIFT 16
11480+#define FP_M1_DIV_MASK 0x00003f00
11481+#define FP_M1_DIV_SHIFT 8
11482+#define FP_M2_DIV_MASK 0x0000003f
11483+#define FP_M2_DIV_SHIFT 0
11484+
11485+#define DSPABASE 0x70184
11486+#define DSPBBASE 0x71184
11487+#define DSPAKEYVAL 0x70194
11488+#define DSPAKEYMASK 0x70198
11489+
11490+#define VSYNCSHIFT_A 0x60028
11491+#define VSYNCSHIFT_B 0x61028
11492+#define DPLL_B_MD 0x06020
11493+
11883Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c 11494Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
11884=================================================================== 11495===================================================================
11885--- /dev/null 1970-01-01 00:00:00.000000000 +0000 11496--- /dev/null 1970-01-01 00:00:00.000000000 +0000
11886+++ linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c 2009-01-14 11:58:01.000000000 +0000 11497+++ linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c 2009-02-05 13:29:33.000000000 +0000
11887@@ -0,0 +1,242 @@ 11498@@ -0,0 +1,242 @@
11888+/* 11499+/*
11889+ * Copyright © 2006-2007 Intel Corporation 11500+ * Copyright © 2006-2007 Intel Corporation
@@ -11918,11 +11529,11 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
11918+ struct drm_device *dev = output->dev; 11529+ struct drm_device *dev = output->dev;
11919+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; 11530+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private;
11920+ u32 temp; 11531+ u32 temp;
11921+ 11532+
11922+ temp = I915_READ(ADPA); 11533+ temp = I915_READ(ADPA);
11923+ temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE); 11534+ temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE);
11924+ temp &= ~ADPA_DAC_ENABLE; 11535+ temp &= ~ADPA_DAC_ENABLE;
11925+ 11536+
11926+ switch(mode) { 11537+ switch(mode) {
11927+ case DPMSModeOn: 11538+ case DPMSModeOn:
11928+ temp |= ADPA_DAC_ENABLE; 11539+ temp |= ADPA_DAC_ENABLE;
@@ -11937,13 +11548,13 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
11937+ temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE; 11548+ temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
11938+ break; 11549+ break;
11939+ } 11550+ }
11940+ 11551+
11941+ I915_WRITE(ADPA, temp); 11552+ I915_WRITE(ADPA, temp);
11942+} 11553+}
11943+ 11554+
11944+static void intel_crt_save(struct drm_output *output) 11555+static void intel_crt_save(struct drm_output *output)
11945+{ 11556+{
11946+ 11557+
11947+} 11558+}
11948+ 11559+
11949+static void intel_crt_restore(struct drm_output *output) 11560+static void intel_crt_restore(struct drm_output *output)
@@ -11981,7 +11592,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
11981+ int dpll_md_reg; 11592+ int dpll_md_reg;
11982+ u32 adpa, dpll_md; 11593+ u32 adpa, dpll_md;
11983+ 11594+
11984+ if (intel_crtc->pipe == 0) 11595+ if (intel_crtc->pipe == 0)
11985+ dpll_md_reg = DPLL_A_MD; 11596+ dpll_md_reg = DPLL_A_MD;
11986+ else 11597+ else
11987+ dpll_md_reg = DPLL_B_MD; 11598+ dpll_md_reg = DPLL_B_MD;
@@ -11995,18 +11606,18 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
11995+ I915_WRITE(dpll_md_reg, 11606+ I915_WRITE(dpll_md_reg,
11996+ dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK); 11607+ dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK);
11997+ } 11608+ }
11998+ 11609+
11999+ adpa = 0; 11610+ adpa = 0;
12000+ if (adjusted_mode->flags & V_PHSYNC) 11611+ if (adjusted_mode->flags & V_PHSYNC)
12001+ adpa |= ADPA_HSYNC_ACTIVE_HIGH; 11612+ adpa |= ADPA_HSYNC_ACTIVE_HIGH;
12002+ if (adjusted_mode->flags & V_PVSYNC) 11613+ if (adjusted_mode->flags & V_PVSYNC)
12003+ adpa |= ADPA_VSYNC_ACTIVE_HIGH; 11614+ adpa |= ADPA_VSYNC_ACTIVE_HIGH;
12004+ 11615+
12005+ if (intel_crtc->pipe == 0) 11616+ if (intel_crtc->pipe == 0)
12006+ adpa |= ADPA_PIPE_A_SELECT; 11617+ adpa |= ADPA_PIPE_A_SELECT;
12007+ else 11618+ else
12008+ adpa |= ADPA_PIPE_B_SELECT; 11619+ adpa |= ADPA_PIPE_B_SELECT;
12009+ 11620+
12010+ I915_WRITE(ADPA, adpa); 11621+ I915_WRITE(ADPA, adpa);
12011+} 11622+}
12012+ 11623+
@@ -12050,14 +11661,14 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
12050+ /* CRT should always be at 0, but check anyway */ 11661+ /* CRT should always be at 0, but check anyway */
12051+ if (intel_output->type != INTEL_OUTPUT_ANALOG) 11662+ if (intel_output->type != INTEL_OUTPUT_ANALOG)
12052+ return false; 11663+ return false;
12053+ 11664+
12054+ return intel_ddc_probe(output); 11665+ return intel_ddc_probe(output);
12055+} 11666+}
12056+ 11667+
12057+static enum drm_output_status intel_crt_detect(struct drm_output *output) 11668+static enum drm_output_status intel_crt_detect(struct drm_output *output)
12058+{ 11669+{
12059+ struct drm_device *dev = output->dev; 11670+ struct drm_device *dev = output->dev;
12060+ 11671+
12061+ if (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) { 11672+ if (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) {
12062+ if (intel_crt_detect_hotplug(output)) 11673+ if (intel_crt_detect_hotplug(output))
12063+ return output_status_connected; 11674+ return output_status_connected;
@@ -12130,7 +11741,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_crt.c
12130Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c 11741Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12131=================================================================== 11742===================================================================
12132--- /dev/null 1970-01-01 00:00:00.000000000 +0000 11743--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12133+++ linux-2.6.27/drivers/gpu/drm/psb/intel_display.c 2009-01-14 11:58:01.000000000 +0000 11744+++ linux-2.6.27/drivers/gpu/drm/psb/intel_display.c 2009-02-05 13:29:33.000000000 +0000
12134@@ -0,0 +1,1472 @@ 11745@@ -0,0 +1,1472 @@
12135+/* 11746+/*
12136+ * Copyright © 2006-2007 Intel Corporation 11747+ * Copyright © 2006-2007 Intel Corporation
@@ -12163,7 +11774,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12163+bool intel_pipe_has_type (struct drm_crtc *crtc, int type); 11774+bool intel_pipe_has_type (struct drm_crtc *crtc, int type);
12164+ 11775+
12165+typedef struct { 11776+typedef struct {
12166+ /* given values */ 11777+ /* given values */
12167+ int n; 11778+ int n;
12168+ int m1, m2; 11779+ int m1, m2;
12169+ int p1, p2; 11780+ int p1, p2;
@@ -12302,7 +11913,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12302+{ 11913+{
12303+ struct drm_device *dev = crtc->dev; 11914+ struct drm_device *dev = crtc->dev;
12304+ const intel_limit_t *limit; 11915+ const intel_limit_t *limit;
12305+ 11916+
12306+ if (IS_I9XX(dev)) { 11917+ if (IS_I9XX(dev)) {
12307+ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) 11918+ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
12308+ limit = &intel_limits[INTEL_LIMIT_I9XX_LVDS]; 11919+ limit = &intel_limits[INTEL_LIMIT_I9XX_LVDS];
@@ -12374,7 +11985,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12374+static bool intel_PLL_is_valid(struct drm_crtc *crtc, intel_clock_t *clock) 11985+static bool intel_PLL_is_valid(struct drm_crtc *crtc, intel_clock_t *clock)
12375+{ 11986+{
12376+ const intel_limit_t *limit = intel_limit (crtc); 11987+ const intel_limit_t *limit = intel_limit (crtc);
12377+ 11988+
12378+ if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1) 11989+ if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1)
12379+ INTELPllInvalid ("p1 out of range\n"); 11990+ INTELPllInvalid ("p1 out of range\n");
12380+ if (clock->p < limit->p.min || limit->p.max < clock->p) 11991+ if (clock->p < limit->p.min || limit->p.max < clock->p)
@@ -12396,7 +12007,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12396+ */ 12007+ */
12397+ if (clock->dot < limit->dot.min || limit->dot.max < clock->dot) 12008+ if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
12398+ INTELPllInvalid ("dot out of range\n"); 12009+ INTELPllInvalid ("dot out of range\n");
12399+ 12010+
12400+ return true; 12011+ return true;
12401+} 12012+}
12402+ 12013+
@@ -12433,9 +12044,9 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12433+ else 12044+ else
12434+ clock.p2 = limit->p2.p2_fast; 12045+ clock.p2 = limit->p2.p2_fast;
12435+ } 12046+ }
12436+ 12047+
12437+ memset (best_clock, 0, sizeof (*best_clock)); 12048+ memset (best_clock, 0, sizeof (*best_clock));
12438+ 12049+
12439+ for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max; clock.m1++) { 12050+ for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max; clock.m1++) {
12440+ for (clock.m2 = limit->m2.min; clock.m2 < clock.m1 && 12051+ for (clock.m2 = limit->m2.min; clock.m2 < clock.m1 &&
12441+ clock.m2 <= limit->m2.max; clock.m2++) { 12052+ clock.m2 <= limit->m2.max; clock.m2++) {
@@ -12444,12 +12055,12 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12444+ for (clock.p1 = limit->p1.min; 12055+ for (clock.p1 = limit->p1.min;
12445+ clock.p1 <= limit->p1.max; clock.p1++) { 12056+ clock.p1 <= limit->p1.max; clock.p1++) {
12446+ int this_err; 12057+ int this_err;
12447+ 12058+
12448+ intel_clock(dev, refclk, &clock); 12059+ intel_clock(dev, refclk, &clock);
12449+ 12060+
12450+ if (!intel_PLL_is_valid(crtc, &clock)) 12061+ if (!intel_PLL_is_valid(crtc, &clock))
12451+ continue; 12062+ continue;
12452+ 12063+
12453+ this_err = abs(clock.dot - target); 12064+ this_err = abs(clock.dot - target);
12454+ if (this_err < err) { 12065+ if (this_err < err) {
12455+ *best_clock = clock; 12066+ *best_clock = clock;
@@ -12515,11 +12126,11 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12515+ I915_WRITE(dspbase, Start + Offset); 12126+ I915_WRITE(dspbase, Start + Offset);
12516+ I915_READ(dspbase); 12127+ I915_READ(dspbase);
12517+ } 12128+ }
12518+
12519+ 12129+
12520+ if (!dev_priv->sarea_priv) 12130+
12131+ if (!dev_priv->sarea_priv)
12521+ return; 12132+ return;
12522+ 12133+
12523+ switch (pipe) { 12134+ switch (pipe) {
12524+ case 0: 12135+ case 0:
12525+ dev_priv->sarea_priv->planeA_x = x; 12136+ dev_priv->sarea_priv->planeA_x = x;
@@ -12577,7 +12188,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12577+ /* Wait for the clocks to stabilize. */ 12188+ /* Wait for the clocks to stabilize. */
12578+ udelay(150); 12189+ udelay(150);
12579+ } 12190+ }
12580+ 12191+
12581+ /* Enable the pipe */ 12192+ /* Enable the pipe */
12582+ temp = I915_READ(pipeconf_reg); 12193+ temp = I915_READ(pipeconf_reg);
12583+ if ((temp & PIPEACONF_ENABLE) == 0) 12194+ if ((temp & PIPEACONF_ENABLE) == 0)
@@ -12595,16 +12206,16 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12595+ /* Flush the plane changes */ 12206+ /* Flush the plane changes */
12596+ I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); 12207+ I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
12597+ } 12208+ }
12598+ 12209+
12599+ intel_crtc_load_lut(crtc); 12210+ intel_crtc_load_lut(crtc);
12600+ 12211+
12601+ /* Give the overlay scaler a chance to enable if it's on this pipe */ 12212+ /* Give the overlay scaler a chance to enable if it's on this pipe */
12602+ //intel_crtc_dpms_video(crtc, TRUE); TODO 12213+ //intel_crtc_dpms_video(crtc, TRUE); TODO
12603+ break; 12214+ break;
12604+ case DPMSModeOff: 12215+ case DPMSModeOff:
12605+ /* Give the overlay scaler a chance to disable if it's on this pipe */ 12216+ /* Give the overlay scaler a chance to disable if it's on this pipe */
12606+ //intel_crtc_dpms_video(crtc, FALSE); TODO 12217+ //intel_crtc_dpms_video(crtc, FALSE); TODO
12607+ 12218+
12608+ /* Disable display plane */ 12219+ /* Disable display plane */
12609+ temp = I915_READ(dspcntr_reg); 12220+ temp = I915_READ(dspcntr_reg);
12610+ if ((temp & DISPLAY_PLANE_ENABLE) != 0) { 12221+ if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
@@ -12613,39 +12224,39 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12613+ I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); 12224+ I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
12614+ I915_READ(dspbase_reg); 12225+ I915_READ(dspbase_reg);
12615+ } 12226+ }
12616+ 12227+
12617+ if (!IS_I9XX(dev)) { 12228+ if (!IS_I9XX(dev)) {
12618+ /* Wait for vblank for the disable to take effect */ 12229+ /* Wait for vblank for the disable to take effect */
12619+ intel_wait_for_vblank(dev); 12230+ intel_wait_for_vblank(dev);
12620+ } 12231+ }
12621+ 12232+
12622+ /* Next, disable display pipes */ 12233+ /* Next, disable display pipes */
12623+ temp = I915_READ(pipeconf_reg); 12234+ temp = I915_READ(pipeconf_reg);
12624+ if ((temp & PIPEACONF_ENABLE) != 0) { 12235+ if ((temp & PIPEACONF_ENABLE) != 0) {
12625+ I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE); 12236+ I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE);
12626+ I915_READ(pipeconf_reg); 12237+ I915_READ(pipeconf_reg);
12627+ } 12238+ }
12628+ 12239+
12629+ /* Wait for vblank for the disable to take effect. */ 12240+ /* Wait for vblank for the disable to take effect. */
12630+ intel_wait_for_vblank(dev); 12241+ intel_wait_for_vblank(dev);
12631+ 12242+
12632+ temp = I915_READ(dpll_reg); 12243+ temp = I915_READ(dpll_reg);
12633+ if ((temp & DPLL_VCO_ENABLE) != 0) { 12244+ if ((temp & DPLL_VCO_ENABLE) != 0) {
12634+ I915_WRITE(dpll_reg, temp & ~DPLL_VCO_ENABLE); 12245+ I915_WRITE(dpll_reg, temp & ~DPLL_VCO_ENABLE);
12635+ I915_READ(dpll_reg); 12246+ I915_READ(dpll_reg);
12636+ } 12247+ }
12637+ 12248+
12638+ /* Wait for the clocks to turn off. */ 12249+ /* Wait for the clocks to turn off. */
12639+ udelay(150); 12250+ udelay(150);
12640+ break; 12251+ break;
12641+ } 12252+ }
12642+ 12253+
12643+ 12254+
12644+ if (!dev_priv->sarea_priv) 12255+ if (!dev_priv->sarea_priv)
12645+ return; 12256+ return;
12646+ 12257+
12647+ enabled = crtc->enabled && mode != DPMSModeOff; 12258+ enabled = crtc->enabled && mode != DPMSModeOff;
12648+ 12259+
12649+ switch (pipe) { 12260+ switch (pipe) {
12650+ case 0: 12261+ case 0:
12651+ dev_priv->sarea_priv->planeA_w = enabled ? crtc->mode.hdisplay : 0; 12262+ dev_priv->sarea_priv->planeA_w = enabled ? crtc->mode.hdisplay : 0;
@@ -12727,7 +12338,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12727+ u16 gcfgc = 0; 12338+ u16 gcfgc = 0;
12728+ 12339+
12729+ pci_read_config_word(dev->pdev, I915_GCFGC, &gcfgc); 12340+ pci_read_config_word(dev->pdev, I915_GCFGC, &gcfgc);
12730+ 12341+
12731+ if (gcfgc & I915_LOW_FREQUENCY_ENABLE) 12342+ if (gcfgc & I915_LOW_FREQUENCY_ENABLE)
12732+ return 133000; 12343+ return 133000;
12733+ else { 12344+ else {
@@ -12745,7 +12356,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12745+#if 0 12356+#if 0
12746+ PCITAG bridge = pciTag(0, 0, 0); /* This is always the host bridge */ 12357+ PCITAG bridge = pciTag(0, 0, 0); /* This is always the host bridge */
12747+ u16 hpllcc = pciReadWord(bridge, I855_HPLLCC); 12358+ u16 hpllcc = pciReadWord(bridge, I855_HPLLCC);
12748+ 12359+
12749+#endif 12360+#endif
12750+ u16 hpllcc = 0; 12361+ u16 hpllcc = 0;
12751+ /* Assume that the hardware is in the high speed state. This 12362+ /* Assume that the hardware is in the high speed state. This
@@ -12762,7 +12373,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12762+ } 12373+ }
12763+ } else /* 852, 830 */ 12374+ } else /* 852, 830 */
12764+ return 133000; 12375+ return 133000;
12765+ 12376+
12766+ return 0; /* Silence gcc warning */ 12377+ return 0; /* Silence gcc warning */
12767+} 12378+}
12768+ 12379+
@@ -12775,21 +12386,21 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12775+{ 12386+{
12776+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; 12387+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private;
12777+ u32 pfit_control; 12388+ u32 pfit_control;
12778+ 12389+
12779+ /* i830 doesn't have a panel fitter */ 12390+ /* i830 doesn't have a panel fitter */
12780+ if (IS_I830(dev)) 12391+ if (IS_I830(dev))
12781+ return -1; 12392+ return -1;
12782+ 12393+
12783+ pfit_control = I915_READ(PFIT_CONTROL); 12394+ pfit_control = I915_READ(PFIT_CONTROL);
12784+ 12395+
12785+ /* See if the panel fitter is in use */ 12396+ /* See if the panel fitter is in use */
12786+ if ((pfit_control & PFIT_ENABLE) == 0) 12397+ if ((pfit_control & PFIT_ENABLE) == 0)
12787+ return -1; 12398+ return -1;
12788+ 12399+
12789+ /* 965 can place panel fitter on either pipe */ 12400+ /* 965 can place panel fitter on either pipe */
12790+ if (IS_I965G(dev)) 12401+ if (IS_I965G(dev))
12791+ return (pfit_control >> 29) & 0x3; 12402+ return (pfit_control >> 29) & 0x3;
12792+ 12403+
12793+ /* older chips can only use pipe 1 */ 12404+ /* older chips can only use pipe 1 */
12794+ return 1; 12405+ return 1;
12795+} 12406+}
@@ -12926,7 +12537,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12926+ I915_WRITE(VGACNTRL, vgacntrl_reg_value[pipe]); 12537+ I915_WRITE(VGACNTRL, vgacntrl_reg_value[pipe]);
12927+ intel_wait_for_vblank(dev); 12538+ intel_wait_for_vblank(dev);
12928+ I915_WRITE(PFIT_CONTROL, pfit_control_reg_value[pipe]); 12539+ I915_WRITE(PFIT_CONTROL, pfit_control_reg_value[pipe]);
12929+ 12540+
12930+ intel_crtc_commit(crtc); 12541+ intel_crtc_commit(crtc);
12931+ list_for_each_entry(output, &mode_config->output_list, head) { 12542+ list_for_each_entry(output, &mode_config->output_list, head) {
12932+ if (output->crtc != crtc) 12543+ if (output->crtc != crtc)
@@ -12990,7 +12601,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
12990+ break; 12601+ break;
12991+ } 12602+ }
12992+ } 12603+ }
12993+ 12604+
12994+ fp_reg_value[pipe] = I915_READ(fp_reg); 12605+ fp_reg_value[pipe] = I915_READ(fp_reg);
12995+ dpll_reg_value[pipe] = I915_READ(dpll_reg); 12606+ dpll_reg_value[pipe] = I915_READ(dpll_reg);
12996+ dpll_md_reg_value[pipe] = I915_READ(dpll_md_reg); 12607+ dpll_md_reg_value[pipe] = I915_READ(dpll_md_reg);
@@ -13075,7 +12686,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13075+ break; 12686+ break;
13076+ } 12687+ }
13077+ } 12688+ }
13078+ 12689+
13079+ if (IS_I9XX(dev)) { 12690+ if (IS_I9XX(dev)) {
13080+ refclk = 96000; 12691+ refclk = 96000;
13081+ } else { 12692+ } else {
@@ -13089,7 +12700,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13089+ } 12700+ }
13090+ 12701+
13091+ fp = clock.n << 16 | clock.m1 << 8 | clock.m2; 12702+ fp = clock.n << 16 | clock.m1 << 8 | clock.m2;
13092+ 12703+
13093+ dpll = DPLL_VGA_MODE_DIS; 12704+ dpll = DPLL_VGA_MODE_DIS;
13094+ if (IS_I9XX(dev)) { 12705+ if (IS_I9XX(dev)) {
13095+ if (is_lvds) { 12706+ if (is_lvds) {
@@ -13105,7 +12716,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13105+ dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; 12716+ dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES;
13106+ } 12717+ }
13107+ } 12718+ }
13108+ 12719+
13109+ /* compute bitmask from p1 value */ 12720+ /* compute bitmask from p1 value */
13110+ dpll |= (1 << (clock.p1 - 1)) << 16; 12721+ dpll |= (1 << (clock.p1 - 1)) << 16;
13111+ switch (clock.p2) { 12722+ switch (clock.p2) {
@@ -13136,7 +12747,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13136+ dpll |= PLL_P2_DIVIDE_BY_4; 12747+ dpll |= PLL_P2_DIVIDE_BY_4;
13137+ } 12748+ }
13138+ } 12749+ }
13139+ 12750+
13140+ if (is_tv) { 12751+ if (is_tv) {
13141+ /* XXX: just matching BIOS for now */ 12752+ /* XXX: just matching BIOS for now */
13142+/* dpll |= PLL_REF_INPUT_TVCLKINBC; */ 12753+/* dpll |= PLL_REF_INPUT_TVCLKINBC; */
@@ -13148,7 +12759,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13148+#endif 12759+#endif
13149+ else 12760+ else
13150+ dpll |= PLL_REF_INPUT_DREFCLK; 12761+ dpll |= PLL_REF_INPUT_DREFCLK;
13151+ 12762+
13152+ /* setup pipeconf */ 12763+ /* setup pipeconf */
13153+ pipeconf = I915_READ(pipeconf_reg); 12764+ pipeconf = I915_READ(pipeconf_reg);
13154+ 12765+
@@ -13172,13 +12783,13 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13172+ DRM_ERROR("Unknown color depth\n"); 12783+ DRM_ERROR("Unknown color depth\n");
13173+ return; 12784+ return;
13174+ } 12785+ }
13175+ 12786+
13176+ 12787+
13177+ if (pipe == 0) 12788+ if (pipe == 0)
13178+ dspcntr |= DISPPLANE_SEL_PIPE_A; 12789+ dspcntr |= DISPPLANE_SEL_PIPE_A;
13179+ else 12790+ else
13180+ dspcntr |= DISPPLANE_SEL_PIPE_B; 12791+ dspcntr |= DISPPLANE_SEL_PIPE_B;
13181+ 12792+
13182+ if (pipe == 0 && !IS_I965G(dev)) { 12793+ if (pipe == 0 && !IS_I965G(dev)) {
13183+ /* Enable pixel doubling when the dot clock is > 90% of the (display) 12794+ /* Enable pixel doubling when the dot clock is > 90% of the (display)
13184+ * core speed. 12795+ * core speed.
@@ -13196,7 +12807,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13196+ pipeconf |= PIPEACONF_ENABLE; 12807+ pipeconf |= PIPEACONF_ENABLE;
13197+ dpll |= DPLL_VCO_ENABLE; 12808+ dpll |= DPLL_VCO_ENABLE;
13198+ 12809+
13199+ 12810+
13200+ /* Disable the panel fitter if it was on our pipe */ 12811+ /* Disable the panel fitter if it was on our pipe */
13201+ if (intel_panel_fitter_pipe(dev) == pipe) 12812+ if (intel_panel_fitter_pipe(dev) == pipe)
13202+ I915_WRITE(PFIT_CONTROL, 0); 12813+ I915_WRITE(PFIT_CONTROL, 0);
@@ -13206,7 +12817,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13206+ 12817+
13207+ /*psbPrintPll("chosen", &clock);*/ 12818+ /*psbPrintPll("chosen", &clock);*/
13208+ DRM_DEBUG("clock regs: 0x%08x, 0x%08x,dspntr is 0x%8x, pipeconf is 0x%8x\n", (int)dpll, 12819+ DRM_DEBUG("clock regs: 0x%08x, 0x%08x,dspntr is 0x%8x, pipeconf is 0x%8x\n", (int)dpll,
13209+ (int)fp,(int)dspcntr,(int)pipeconf); 12820+ (int)fp,(int)dspcntr,(int)pipeconf);
13210+#if 0 12821+#if 0
13211+ if (!xf86ModesEqual(mode, adjusted_mode)) { 12822+ if (!xf86ModesEqual(mode, adjusted_mode)) {
13212+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, 12823+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -13222,14 +12833,14 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13222+ I915_READ(dpll_reg); 12833+ I915_READ(dpll_reg);
13223+ udelay(150); 12834+ udelay(150);
13224+ } 12835+ }
13225+ 12836+
13226+ /* The LVDS pin pair needs to be on before the DPLLs are enabled. 12837+ /* The LVDS pin pair needs to be on before the DPLLs are enabled.
13227+ * This is an exception to the general rule that mode_set doesn't turn 12838+ * This is an exception to the general rule that mode_set doesn't turn
13228+ * things on. 12839+ * things on.
13229+ */ 12840+ */
13230+ if (is_lvds) { 12841+ if (is_lvds) {
13231+ u32 lvds = I915_READ(LVDS); 12842+ u32 lvds = I915_READ(LVDS);
13232+ 12843+
13233+ lvds |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP | LVDS_PIPEB_SELECT; 12844+ lvds |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP | LVDS_PIPEB_SELECT;
13234+ /* Set the B0-B3 data pairs corresponding to whether we're going to 12845+ /* Set the B0-B3 data pairs corresponding to whether we're going to
13235+ * set the DPLLs for dual-channel mode or not. 12846+ * set the DPLLs for dual-channel mode or not.
@@ -13238,22 +12849,22 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13238+ lvds |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP; 12849+ lvds |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
13239+ else 12850+ else
13240+ lvds &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP); 12851+ lvds &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
13241+ 12852+
13242+ /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP) 12853+ /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
13243+ * appropriately here, but we need to look more thoroughly into how 12854+ * appropriately here, but we need to look more thoroughly into how
13244+ * panels behave in the two modes. 12855+ * panels behave in the two modes.
13245+ */ 12856+ */
13246+ 12857+
13247+ I915_WRITE(LVDS, lvds); 12858+ I915_WRITE(LVDS, lvds);
13248+ I915_READ(LVDS); 12859+ I915_READ(LVDS);
13249+ } 12860+ }
13250+ 12861+
13251+ I915_WRITE(fp_reg, fp); 12862+ I915_WRITE(fp_reg, fp);
13252+ I915_WRITE(dpll_reg, dpll); 12863+ I915_WRITE(dpll_reg, dpll);
13253+ I915_READ(dpll_reg); 12864+ I915_READ(dpll_reg);
13254+ /* Wait for the clocks to stabilize. */ 12865+ /* Wait for the clocks to stabilize. */
13255+ udelay(150); 12866+ udelay(150);
13256+ 12867+
13257+ if (IS_I965G(dev)) { 12868+ if (IS_I965G(dev)) {
13258+ int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; 12869+ int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
13259+ I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | 12870+ I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) |
@@ -13265,7 +12876,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13265+ I915_READ(dpll_reg); 12876+ I915_READ(dpll_reg);
13266+ /* Wait for the clocks to stabilize. */ 12877+ /* Wait for the clocks to stabilize. */
13267+ udelay(150); 12878+ udelay(150);
13268+ 12879+
13269+ I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | 12880+ I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) |
13270+ ((adjusted_mode->crtc_htotal - 1) << 16)); 12881+ ((adjusted_mode->crtc_htotal - 1) << 16));
13271+ I915_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) | 12882+ I915_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) |
@@ -13287,14 +12898,14 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13287+ I915_WRITE(pipesrc_reg, ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1)); 12898+ I915_WRITE(pipesrc_reg, ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
13288+ I915_WRITE(pipeconf_reg, pipeconf); 12899+ I915_WRITE(pipeconf_reg, pipeconf);
13289+ I915_READ(pipeconf_reg); 12900+ I915_READ(pipeconf_reg);
13290+ 12901+
13291+ intel_wait_for_vblank(dev); 12902+ intel_wait_for_vblank(dev);
13292+ 12903+
13293+ I915_WRITE(dspcntr_reg, dspcntr); 12904+ I915_WRITE(dspcntr_reg, dspcntr);
13294+ 12905+
13295+ /* Flush the plane changes */ 12906+ /* Flush the plane changes */
13296+ intel_pipe_set_base(crtc, x, y); 12907+ intel_pipe_set_base(crtc, x, y);
13297+ 12908+
13298+#if 0 12909+#if 0
13299+ intel_set_vblank(dev); 12910+ intel_set_vblank(dev);
13300+#endif 12911+#endif
@@ -13302,7 +12913,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13302+ /* Disable the VGA plane that we never use */ 12913+ /* Disable the VGA plane that we never use */
13303+ I915_WRITE(VGACNTRL, VGA_DISP_DISABLE); 12914+ I915_WRITE(VGACNTRL, VGA_DISP_DISABLE);
13304+ 12915+
13305+ intel_wait_for_vblank(dev); 12916+ intel_wait_for_vblank(dev);
13306+} 12917+}
13307+ 12918+
13308+/** Loads the palette/gamma unit for the CRTC with the prepared values */ 12919+/** Loads the palette/gamma unit for the CRTC with the prepared values */
@@ -13331,7 +12942,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13331+ u16 blue, int regno) 12942+ u16 blue, int regno)
13332+{ 12943+{
13333+ struct intel_crtc *intel_crtc = crtc->driver_private; 12944+ struct intel_crtc *intel_crtc = crtc->driver_private;
13334+ 12945+
13335+ intel_crtc->lut_r[regno] = red >> 8; 12946+ intel_crtc->lut_r[regno] = red >> 8;
13336+ intel_crtc->lut_g[regno] = green >> 8; 12947+ intel_crtc->lut_g[regno] = green >> 8;
13337+ intel_crtc->lut_b[regno] = blue >> 8; 12948+ intel_crtc->lut_b[regno] = blue >> 8;
@@ -13389,7 +13000,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13389+ /* XXX: might not be 66MHz */ 13000+ /* XXX: might not be 66MHz */
13390+ i8xx_clock(66000, &clock); 13001+ i8xx_clock(66000, &clock);
13391+ } else 13002+ } else
13392+ i8xx_clock(48000, &clock); 13003+ i8xx_clock(48000, &clock);
13393+ } else { 13004+ } else {
13394+ if (dpll & PLL_P1_DIVIDE_BY_TWO) 13005+ if (dpll & PLL_P1_DIVIDE_BY_TWO)
13395+ clock.p1 = 2; 13006+ clock.p1 = 2;
@@ -13532,7 +13143,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13532+ list_for_each_entry(output, &dev->mode_config.output_list, head) { 13143+ list_for_each_entry(output, &dev->mode_config.output_list, head) {
13533+ struct intel_output *intel_output = output->driver_private; 13144+ struct intel_output *intel_output = output->driver_private;
13534+ int crtc_mask = 0, clone_mask = 0; 13145+ int crtc_mask = 0, clone_mask = 0;
13535+ 13146+
13536+ /* valid crtcs */ 13147+ /* valid crtcs */
13537+ switch(intel_output->type) { 13148+ switch(intel_output->type) {
13538+ case INTEL_OUTPUT_DVO: 13149+ case INTEL_OUTPUT_DVO:
@@ -13607,7 +13218,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_display.c
13607Index: linux-2.6.27/drivers/gpu/drm/psb/intel_drv.h 13218Index: linux-2.6.27/drivers/gpu/drm/psb/intel_drv.h
13608=================================================================== 13219===================================================================
13609--- /dev/null 1970-01-01 00:00:00.000000000 +0000 13220--- /dev/null 1970-01-01 00:00:00.000000000 +0000
13610+++ linux-2.6.27/drivers/gpu/drm/psb/intel_drv.h 2009-01-14 11:58:01.000000000 +0000 13221+++ linux-2.6.27/drivers/gpu/drm/psb/intel_drv.h 2009-02-05 13:29:33.000000000 +0000
13611@@ -0,0 +1,91 @@ 13222@@ -0,0 +1,91 @@
13612+/* 13223+/*
13613+ * Copyright (c) 2006 Dave Airlie <airlied@linux.ie> 13224+ * Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
@@ -13634,7 +13245,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_drv.h
13634+#define INTEL_I2C_BUS_DVO 1 13245+#define INTEL_I2C_BUS_DVO 1
13635+#define INTEL_I2C_BUS_SDVO 2 13246+#define INTEL_I2C_BUS_SDVO 2
13636+ 13247+
13637+/* these are outputs from the chip - integrated only 13248+/* these are outputs from the chip - integrated only
13638+ external chips are via DVO or SDVO output */ 13249+ external chips are via DVO or SDVO output */
13639+#define INTEL_OUTPUT_UNUSED 0 13250+#define INTEL_OUTPUT_UNUSED 0
13640+#define INTEL_OUTPUT_ANALOG 1 13251+#define INTEL_OUTPUT_ANALOG 1
@@ -13703,7 +13314,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_drv.h
13703Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c 13314Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
13704=================================================================== 13315===================================================================
13705--- /dev/null 1970-01-01 00:00:00.000000000 +0000 13316--- /dev/null 1970-01-01 00:00:00.000000000 +0000
13706+++ linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c 2009-01-14 11:58:01.000000000 +0000 13317+++ linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c 2009-02-05 13:29:33.000000000 +0000
13707@@ -0,0 +1,913 @@ 13318@@ -0,0 +1,913 @@
13708+/* 13319+/*
13709+ * Copyright © 2006-2007 Intel Corporation 13320+ * Copyright © 2006-2007 Intel Corporation
@@ -13754,7 +13365,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
13754+uint8_t blc_brightnesscmd; 13365+uint8_t blc_brightnesscmd;
13755+int lvds_backlight; /* restore backlight to this value */ 13366+int lvds_backlight; /* restore backlight to this value */
13756+ 13367+
13757+struct intel_i2c_chan *lvds_i2c_bus; 13368+struct intel_i2c_chan *lvds_i2c_bus;
13758+u32 CoreClock; 13369+u32 CoreClock;
13759+u32 PWMControlRegFreq; 13370+u32 PWMControlRegFreq;
13760+ 13371+
@@ -13773,7 +13384,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
13773+{ 13384+{
13774+ u8 out_buf[2]; 13385+ u8 out_buf[2];
13775+ struct i2c_msg msgs[] = { 13386+ struct i2c_msg msgs[] = {
13776+ { 13387+ {
13777+ .addr = lvds_i2c_bus->slave_addr, 13388+ .addr = lvds_i2c_bus->slave_addr,
13778+ .flags = 0, 13389+ .flags = 0,
13779+ .len = 2, 13390+ .len = 2,
@@ -13799,7 +13410,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
13799+/** 13410+/**
13800+ * Calculate PWM control register value. 13411+ * Calculate PWM control register value.
13801+ */ 13412+ */
13802+static int 13413+static int
13803+LVDSCalculatePWMCtrlRegFreq(struct drm_device *dev) 13414+LVDSCalculatePWMCtrlRegFreq(struct drm_device *dev)
13804+{ 13415+{
13805+ unsigned long value = 0; 13416+ unsigned long value = 0;
@@ -13857,7 +13468,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
13857+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; 13468+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private;
13858+ //u32 blc_pwm_ctl; 13469+ //u32 blc_pwm_ctl;
13859+ 13470+
13860+ /* 13471+ /*
13861+ blc_pwm_ctl = I915_READ(BLC_PWM_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK; 13472+ blc_pwm_ctl = I915_READ(BLC_PWM_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
13862+ I915_WRITE(BLC_PWM_CTL, (blc_pwm_ctl | 13473+ I915_WRITE(BLC_PWM_CTL, (blc_pwm_ctl |
13863+ (level << BACKLIGHT_DUTY_CYCLE_SHIFT))); 13474+ (level << BACKLIGHT_DUTY_CYCLE_SHIFT)));
@@ -13906,7 +13517,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
13906+ return BRIGHTNESS_MAX_LEVEL; 13517+ return BRIGHTNESS_MAX_LEVEL;
13907+ /* 13518+ /*
13908+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; 13519+ DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private;
13909+ 13520+
13910+ return ((I915_READ(BLC_PWM_CTL) & BACKLIGHT_MODULATION_FREQ_MASK) >> 13521+ return ((I915_READ(BLC_PWM_CTL) & BACKLIGHT_MODULATION_FREQ_MASK) >>
13911+ BACKLIGHT_MODULATION_FREQ_SHIFT) * 2; 13522+ BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
13912+ */ 13523+ */
@@ -14201,7 +13812,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14201+static int update_bl_status(struct backlight_device *bd) 13812+static int update_bl_status(struct backlight_device *bd)
14202+{ 13813+{
14203+ int value = bd->props.brightness; 13814+ int value = bd->props.brightness;
14204+ 13815+
14205+ struct drm_device *dev = bl_get_data(bd); 13816+ struct drm_device *dev = bl_get_data(bd);
14206+ 13817+
14207+ lvds_backlight = value; 13818+ lvds_backlight = value;
@@ -14235,7 +13846,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14235+ 13846+
14236+ if (psbbl_device){ 13847+ if (psbbl_device){
14237+ backlight_device_unregister(psbbl_device); 13848+ backlight_device_unregister(psbbl_device);
14238+ } 13849+ }
14239+ if(dev_OpRegion != NULL) 13850+ if(dev_OpRegion != NULL)
14240+ iounmap(dev_OpRegion); 13851+ iounmap(dev_OpRegion);
14241+ intel_i2c_destroy(intel_output->ddc_bus); 13852+ intel_i2c_destroy(intel_output->ddc_bus);
@@ -14288,7 +13899,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14288+ (int)obj->integer.value); 13899+ (int)obj->integer.value);
14289+ 13900+
14290+ /* look for an LVDS type */ 13901+ /* look for an LVDS type */
14291+ if (obj->integer.value & 0x00000400) 13902+ if (obj->integer.value & 0x00000400)
14292+ found = 1; 13903+ found = 1;
14293+ } 13904+ }
14294+ } 13905+ }
@@ -14344,7 +13955,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14344+ blc_type = 0; 13955+ blc_type = 0;
14345+ blc_pol = 0; 13956+ blc_pol = 0;
14346+ 13957+
14347+ if (1) { //get the BLC init data from VBT 13958+ if (1) { //get the BLC init data from VBT
14348+ u32 OpRegion_Phys; 13959+ u32 OpRegion_Phys;
14349+ unsigned int OpRegion_Size = 0x100; 13960+ unsigned int OpRegion_Size = 0x100;
14350+ OpRegionPtr OpRegion; 13961+ OpRegionPtr OpRegion;
@@ -14371,7 +13982,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14371+ OpRegion_NewSize = OpRegion->size * 1024; 13982+ OpRegion_NewSize = OpRegion->size * 1024;
14372+ 13983+
14373+ dev_OpRegionSize = OpRegion_NewSize; 13984+ dev_OpRegionSize = OpRegion_NewSize;
14374+ 13985+
14375+ iounmap(dev_OpRegion); 13986+ iounmap(dev_OpRegion);
14376+ dev_OpRegion = ioremap(OpRegion_Phys, OpRegion_NewSize); 13987+ dev_OpRegion = ioremap(OpRegion_Phys, OpRegion_NewSize);
14377+ } else { 13988+ } else {
@@ -14383,13 +13994,13 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14383+ DRM_INFO("intel_lvds_init: OpRegion has the VBT address\n"); 13994+ DRM_INFO("intel_lvds_init: OpRegion has the VBT address\n");
14384+ vbt_buf = dev_OpRegion + OFFSET_OPREGION_VBT; 13995+ vbt_buf = dev_OpRegion + OFFSET_OPREGION_VBT;
14385+ vbt = (struct vbt_header *)(dev_OpRegion + OFFSET_OPREGION_VBT); 13996+ vbt = (struct vbt_header *)(dev_OpRegion + OFFSET_OPREGION_VBT);
14386+ } else { 13997+ } else {
14387+ DRM_INFO("intel_lvds_init: No OpRegion, use the bios at fixed address 0xc0000\n"); 13998+ DRM_INFO("intel_lvds_init: No OpRegion, use the bios at fixed address 0xc0000\n");
14388+ bios = phys_to_virt(0xC0000); 13999+ bios = phys_to_virt(0xC0000);
14389+ if(*((u16 *)bios) != 0xAA55){ 14000+ if(*((u16 *)bios) != 0xAA55){
14390+ bios = NULL; 14001+ bios = NULL;
14391+ DRM_ERROR("the bios is incorrect\n"); 14002+ DRM_ERROR("the bios is incorrect\n");
14392+ goto blc_out; 14003+ goto blc_out;
14393+ } 14004+ }
14394+ vbt_off = bios[0x1a] | (bios[0x1a + 1] << 8); 14005+ vbt_off = bios[0x1a] | (bios[0x1a + 1] << 8);
14395+ DRM_INFO("intel_lvds_init: the vbt off is %x\n", vbt_off); 14006+ DRM_INFO("intel_lvds_init: the vbt off is %x\n", vbt_off);
@@ -14458,7 +14069,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14458+ 14069+
14459+ if(1){ 14070+ if(1){
14460+ //get the Core Clock for calculating MAX PWM value 14071+ //get the Core Clock for calculating MAX PWM value
14461+ //check whether the MaxResEnableInt is 14072+ //check whether the MaxResEnableInt is
14462+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0); 14073+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);
14463+ u32 clock; 14074+ u32 clock;
14464+ u32 sku_value = 0; 14075+ u32 sku_value = 0;
@@ -14478,7 +14089,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14478+ pci_read_config_dword(pci_root, 0xD4, &clock); 14089+ pci_read_config_dword(pci_root, 0xD4, &clock);
14479+ CoreClock = CoreClocks[clock & 0x07]; 14090+ CoreClock = CoreClocks[clock & 0x07];
14480+ DRM_INFO("intel_lvds_init: the CoreClock is %d\n", CoreClock); 14091+ DRM_INFO("intel_lvds_init: the CoreClock is %d\n", CoreClock);
14481+ 14092+
14482+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE); 14093+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE);
14483+ pci_read_config_dword(pci_root, 0xD4, &sku_value); 14094+ pci_read_config_dword(pci_root, 0xD4, &sku_value);
14484+ sku_bMaxResEnableInt = (sku_value & PCI_PORT5_REG80_MAXRES_INT_EN)? true : false; 14095+ sku_bMaxResEnableInt = (sku_value & PCI_PORT5_REG80_MAXRES_INT_EN)? true : false;
@@ -14487,7 +14098,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14487+ } 14098+ }
14488+ } 14099+ }
14489+ 14100+
14490+ if ((blc_type == BLC_I2C_TYPE) || (blc_type == BLC_PWM_TYPE)){ 14101+ if ((blc_type == BLC_I2C_TYPE) || (blc_type == BLC_PWM_TYPE)){
14491+ /* add /sys/class/backlight interface as standard */ 14102+ /* add /sys/class/backlight interface as standard */
14492+ psbbl_device = backlight_device_register("psblvds", &dev->pdev->dev, dev, &psbbl_ops); 14103+ psbbl_device = backlight_device_register("psblvds", &dev->pdev->dev, dev, &psbbl_ops);
14493+ if (psbbl_device){ 14104+ if (psbbl_device){
@@ -14517,7 +14128,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14517+ 14128+
14518+ list_for_each_entry(scan, &output->probed_modes, head) { 14129+ list_for_each_entry(scan, &output->probed_modes, head) {
14519+ if (scan->type & DRM_MODE_TYPE_PREFERRED) { 14130+ if (scan->type & DRM_MODE_TYPE_PREFERRED) {
14520+ dev_priv->panel_fixed_mode = 14131+ dev_priv->panel_fixed_mode =
14521+ drm_mode_duplicate(dev, scan); 14132+ drm_mode_duplicate(dev, scan);
14522+ goto out; /* FIXME: check for quirks */ 14133+ goto out; /* FIXME: check for quirks */
14523+ } 14134+ }
@@ -14531,7 +14142,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14531+ lvds = I915_READ(LVDS); 14142+ lvds = I915_READ(LVDS);
14532+ pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0; 14143+ pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
14533+ crtc = intel_get_crtc_from_pipe(dev, pipe); 14144+ crtc = intel_get_crtc_from_pipe(dev, pipe);
14534+ 14145+
14535+ if (crtc && (lvds & LVDS_PORT_EN)) { 14146+ if (crtc && (lvds & LVDS_PORT_EN)) {
14536+ dev_priv->panel_fixed_mode = intel_crtc_mode_get(dev, crtc); 14147+ dev_priv->panel_fixed_mode = intel_crtc_mode_get(dev, crtc);
14537+ if (dev_priv->panel_fixed_mode) { 14148+ if (dev_priv->panel_fixed_mode) {
@@ -14621,7 +14232,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.c
14621Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h 14232Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h
14622=================================================================== 14233===================================================================
14623--- /dev/null 1970-01-01 00:00:00.000000000 +0000 14234--- /dev/null 1970-01-01 00:00:00.000000000 +0000
14624+++ linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h 2009-01-14 11:58:01.000000000 +0000 14235+++ linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h 2009-02-05 13:29:33.000000000 +0000
14625@@ -0,0 +1,174 @@ 14236@@ -0,0 +1,174 @@
14626+/* 14237+/*
14627+ * Copyright © 2006-2007 Intel Corporation 14238+ * Copyright © 2006-2007 Intel Corporation
@@ -14662,10 +14273,10 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h
14662+#define BLC_MAX_PWM_REG_FREQ 0xfffe 14273+#define BLC_MAX_PWM_REG_FREQ 0xfffe
14663+#define BLC_MIN_PWM_REG_FREQ 0x2 14274+#define BLC_MIN_PWM_REG_FREQ 0x2
14664+#define BLC_PWM_LEGACY_MODE_ENABLE 0x0001 14275+#define BLC_PWM_LEGACY_MODE_ENABLE 0x0001
14665+#define BLC_PWM_PRECISION_FACTOR 10//10000000 14276+#define BLC_PWM_PRECISION_FACTOR 10//10000000
14666+#define BLC_PWM_FREQ_CALC_CONSTANT 32 14277+#define BLC_PWM_FREQ_CALC_CONSTANT 32
14667+#define MHz 1000000 14278+#define MHz 1000000
14668+#define OFFSET_OPREGION_VBT 0x400 14279+#define OFFSET_OPREGION_VBT 0x400
14669+ 14280+
14670+typedef struct OpRegion_Header 14281+typedef struct OpRegion_Header
14671+{ 14282+{
@@ -14700,7 +14311,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h
14700+ u16 version; /**< decimal */ 14311+ u16 version; /**< decimal */
14701+ u16 header_size; /**< in bytes */ 14312+ u16 header_size; /**< in bytes */
14702+ u16 bdb_size; /**< in bytes */ 14313+ u16 bdb_size; /**< in bytes */
14703+} __attribute__ ((packed)); 14314+} __attribute__ ((packed));
14704+ 14315+
14705+#define LVDS_CAP_EDID (1 << 6) 14316+#define LVDS_CAP_EDID (1 << 6)
14706+#define LVDS_CAP_DITHER (1 << 5) 14317+#define LVDS_CAP_DITHER (1 << 5)
@@ -14800,7 +14411,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_lvds.h
14800Index: linux-2.6.27/drivers/gpu/drm/psb/intel_modes.c 14411Index: linux-2.6.27/drivers/gpu/drm/psb/intel_modes.c
14801=================================================================== 14412===================================================================
14802--- /dev/null 1970-01-01 00:00:00.000000000 +0000 14413--- /dev/null 1970-01-01 00:00:00.000000000 +0000
14803+++ linux-2.6.27/drivers/gpu/drm/psb/intel_modes.c 2009-01-14 11:58:01.000000000 +0000 14414+++ linux-2.6.27/drivers/gpu/drm/psb/intel_modes.c 2009-02-05 13:29:33.000000000 +0000
14804@@ -0,0 +1,60 @@ 14415@@ -0,0 +1,60 @@
14805+/* 14416+/*
14806+ * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 14417+ * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
@@ -14865,7 +14476,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_modes.c
14865Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c 14476Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
14866=================================================================== 14477===================================================================
14867--- /dev/null 1970-01-01 00:00:00.000000000 +0000 14478--- /dev/null 1970-01-01 00:00:00.000000000 +0000
14868+++ linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c 2009-01-14 11:58:01.000000000 +0000 14479+++ linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c 2009-02-05 13:29:33.000000000 +0000
14869@@ -0,0 +1,3973 @@ 14480@@ -0,0 +1,3973 @@
14870+/* 14481+/*
14871+ * Copyright © 2006-2007 Intel Corporation 14482+ * Copyright © 2006-2007 Intel Corporation
@@ -15026,7 +14637,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15026+ EXTVDATA OverScanY; /* Vertical Overscan : for TV onl */ 14637+ EXTVDATA OverScanY; /* Vertical Overscan : for TV onl */
15027+ EXTVDATA OverScanX; /* Horizontal Overscan : for TV onl */ 14638+ EXTVDATA OverScanX; /* Horizontal Overscan : for TV onl */
15028+ sdvo_display_params dispParams; 14639+ sdvo_display_params dispParams;
15029+ SDVO_ANCILLARY_INFO_T AncillaryInfo; 14640+ SDVO_ANCILLARY_INFO_T AncillaryInfo;
15030+}; 14641+};
15031+ 14642+
15032+/* Define TV mode type */ 14643+/* Define TV mode type */
@@ -15126,7 +14737,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15126+#define NUM_TV_MODES sizeof(tv_modes) / sizeof (tv_modes[0]) 14737+#define NUM_TV_MODES sizeof(tv_modes) / sizeof (tv_modes[0])
15127+ 14738+
15128+typedef struct { 14739+typedef struct {
15129+ /* given values */ 14740+ /* given values */
15130+ int n; 14741+ int n;
15131+ int m1, m2; 14742+ int m1, m2;
15132+ int p1, p2; 14743+ int p1, p2;
@@ -15180,12 +14791,12 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15180+ int ret; 14791+ int ret;
15181+ 14792+
15182+ struct i2c_msg msgs[] = { 14793+ struct i2c_msg msgs[] = {
15183+ { 14794+ {
15184+ .addr = sdvo_priv->i2c_bus->slave_addr, 14795+ .addr = sdvo_priv->i2c_bus->slave_addr,
15185+ .flags = 0, 14796+ .flags = 0,
15186+ .len = 1, 14797+ .len = 1,
15187+ .buf = out_buf, 14798+ .buf = out_buf,
15188+ }, 14799+ },
15189+ { 14800+ {
15190+ .addr = sdvo_priv->i2c_bus->slave_addr, 14801+ .addr = sdvo_priv->i2c_bus->slave_addr,
15191+ .flags = I2C_M_RD, 14802+ .flags = I2C_M_RD,
@@ -15199,7 +14810,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15199+ 14810+
15200+ if ((ret = i2c_transfer(&sdvo_priv->i2c_bus->adapter, msgs, 2)) == 2) 14811+ if ((ret = i2c_transfer(&sdvo_priv->i2c_bus->adapter, msgs, 2)) == 2)
15201+ { 14812+ {
15202+// DRM_DEBUG("got back from addr %02X = %02x\n", out_buf[0], buf[0]); 14813+// DRM_DEBUG("got back from addr %02X = %02x\n", out_buf[0], buf[0]);
15203+ *ch = buf[0]; 14814+ *ch = buf[0];
15204+ return true; 14815+ return true;
15205+ } 14816+ }
@@ -15224,7 +14835,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15224+ struct intel_output *intel_output = output->driver_private; 14835+ struct intel_output *intel_output = output->driver_private;
15225+ u8 out_buf[2]; 14836+ u8 out_buf[2];
15226+ struct i2c_msg msgs[] = { 14837+ struct i2c_msg msgs[] = {
15227+ { 14838+ {
15228+ .addr = intel_output->i2c_bus->slave_addr, 14839+ .addr = intel_output->i2c_bus->slave_addr,
15229+ .flags = 0, 14840+ .flags = 0,
15230+ .len = 2, 14841+ .len = 2,
@@ -15313,7 +14924,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15313+ printk("(%02X)",cmd); 14924+ printk("(%02X)",cmd);
15314+ printk("\n"); 14925+ printk("\n");
15315+ } 14926+ }
15316+ 14927+
15317+ for (i = 0; i < args_len; i++) { 14928+ for (i = 0; i < args_len; i++) {
15318+ intel_sdvo_write_byte(output, SDVO_I2C_ARG_0 - i, ((u8*)args)[i]); 14929+ intel_sdvo_write_byte(output, SDVO_I2C_ARG_0 - i, ((u8*)args)[i]);
15319+ } 14930+ }
@@ -15473,7 +15084,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15473+ state = SDVO_ENCODER_STATE_OFF; 15084+ state = SDVO_ENCODER_STATE_OFF;
15474+ break; 15085+ break;
15475+ } 15086+ }
15476+ 15087+
15477+ intel_sdvo_write_cmd(output, SDVO_CMD_SET_ENCODER_POWER_STATE, &state, 15088+ intel_sdvo_write_cmd(output, SDVO_CMD_SET_ENCODER_POWER_STATE, &state,
15478+ sizeof(state)); 15089+ sizeof(state));
15479+ status = intel_sdvo_read_response(output, NULL, 0); 15090+ status = intel_sdvo_read_response(output, NULL, 0);
@@ -15798,7 +15409,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
15798+ break; 15409+ break;
15799+ } 15410+ }
15800+} 15411+}
15801+#endif 15412+#endif
15802+ 15413+
15803+static bool i830_sdvo_set_tvoutputs_formats(struct drm_output * output) 15414+static bool i830_sdvo_set_tvoutputs_formats(struct drm_output * output)
15804+{ 15415+{
@@ -16031,7 +15642,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
16031+ u32 * pHDTVStdMask, u32 *pTVStdFormat) 15642+ u32 * pHDTVStdMask, u32 *pTVStdFormat)
16032+{ 15643+{
16033+ struct intel_output *intel_output = output->driver_private; 15644+ struct intel_output *intel_output = output->driver_private;
16034+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 15645+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
16035+ 15646+
16036+ u8 byRets[6]; 15647+ u8 byRets[6];
16037+ u8 status; 15648+ u8 status;
@@ -16069,7 +15680,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
16069+ else 15680+ else
16070+ *pTVStdFormat = (((u32) byRets[2] & 0xF8) | 15681+ *pTVStdFormat = (((u32) byRets[2] & 0xF8) |
16071+ ((u32) byRets[3] << 8) | 15682+ ((u32) byRets[3] << 8) |
16072+ ((u32) byRets[4] << 16) | ((u32) byRets[5] << 24)); 15683+ ((u32) byRets[4] << 16) | ((u32) byRets[5] << 24));
16073+ DRM_DEBUG("BIOS TV format is %d\n",*pTVStdFormat); 15684+ DRM_DEBUG("BIOS TV format is %d\n",*pTVStdFormat);
16074+ return TRUE; 15685+ return TRUE;
16075+ 15686+
@@ -17681,7 +17292,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17681+ if (!crtc->fb) { 17292+ if (!crtc->fb) {
17682+ DRM_ERROR("Can't set mode without attached fb\n"); 17293+ DRM_ERROR("Can't set mode without attached fb\n");
17683+ return; 17294+ return;
17684+ } 17295+ }
17685+ is_sdvo = TRUE; 17296+ is_sdvo = TRUE;
17686+ ok = TRUE; 17297+ ok = TRUE;
17687+ ulDotClock = mode->clock * 1000 / 1000; /*xiaolin, fixme, do i need to by 1k hz */ 17298+ ulDotClock = mode->clock * 1000 / 1000; /*xiaolin, fixme, do i need to by 1k hz */
@@ -17707,7 +17318,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17707+ clock.m1 = 0x10; 17318+ clock.m1 = 0x10;
17708+ clock.m2 = 0x8; 17319+ clock.m2 = 0x8;
17709+ } else if ((dotclock >= 140500) && (dotclock <= 200000)) { 17320+ } else if ((dotclock >= 140500) && (dotclock <= 200000)) {
17710+ 17321+
17711+ DRM_DEBUG("dotclock is between 140500 and 200000!\n"); 17322+ DRM_DEBUG("dotclock is between 140500 and 200000!\n");
17712+ clock.p1 = 0x1; 17323+ clock.p1 = 0x1;
17713+ /*CG was using 0x10 from spreadsheet it should be 0 */ 17324+ /*CG was using 0x10 from spreadsheet it should be 0 */
@@ -17775,7 +17386,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17775+ else 17386+ else
17776+ { pipeconf &= ~PIPEACONF_DOUBLE_WIDE; DRM_DEBUG("non PIPEACONF_DOUBLE_WIDE\n");} 17387+ { pipeconf &= ~PIPEACONF_DOUBLE_WIDE; DRM_DEBUG("non PIPEACONF_DOUBLE_WIDE\n");}
17777+ } 17388+ }
17778+ 17389+
17779+ dspcntr |= DISPLAY_PLANE_ENABLE; 17390+ dspcntr |= DISPLAY_PLANE_ENABLE;
17780+ pipeconf |= PIPEACONF_ENABLE; 17391+ pipeconf |= PIPEACONF_ENABLE;
17781+ dpll |= DPLL_VCO_ENABLE; 17392+ dpll |= DPLL_VCO_ENABLE;
@@ -17786,12 +17397,12 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17786+ 17397+
17787+ print_Pll("chosen", &clock); 17398+ print_Pll("chosen", &clock);
17788+ DRM_DEBUG("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); 17399+ DRM_DEBUG("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B');
17789+ drm_mode_debug_printmodeline(dev, mode); 17400+ drm_mode_debug_printmodeline(dev, mode);
17790+ DRM_DEBUG("Modeline %d:\"%s\" %d %d %d %d %d %d %d %d\n", 17401+ DRM_DEBUG("Modeline %d:\"%s\" %d %d %d %d %d %d %d %d\n",
17791+ mode->mode_id, mode->name, mode->crtc_htotal, mode->crtc_hdisplay, 17402+ mode->mode_id, mode->name, mode->crtc_htotal, mode->crtc_hdisplay,
17792+ mode->crtc_hblank_end, mode->crtc_hblank_start, 17403+ mode->crtc_hblank_end, mode->crtc_hblank_start,
17793+ mode->crtc_vtotal, mode->crtc_vdisplay, 17404+ mode->crtc_vtotal, mode->crtc_vdisplay,
17794+ mode->crtc_vblank_end, mode->crtc_vblank_start); 17405+ mode->crtc_vblank_end, mode->crtc_vblank_start);
17795+ DRM_DEBUG("clock regs: 0x%08x, 0x%08x,dspntr is 0x%8x, pipeconf is 0x%8x\n", (int)dpll, 17406+ DRM_DEBUG("clock regs: 0x%08x, 0x%08x,dspntr is 0x%8x, pipeconf is 0x%8x\n", (int)dpll,
17796+ (int)fp,(int)dspcntr,(int)pipeconf); 17407+ (int)fp,(int)dspcntr,(int)pipeconf);
17797+ 17408+
@@ -17851,14 +17462,14 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17851+ } 17462+ }
17852+ I915_WRITE(pipeconf_reg, pipeconf); 17463+ I915_WRITE(pipeconf_reg, pipeconf);
17853+ I915_READ(pipeconf_reg); 17464+ I915_READ(pipeconf_reg);
17854+ 17465+
17855+ intel_wait_for_vblank(dev); 17466+ intel_wait_for_vblank(dev);
17856+ 17467+
17857+ I915_WRITE(dspcntr_reg, dspcntr); 17468+ I915_WRITE(dspcntr_reg, dspcntr);
17858+ /* Flush the plane changes */ 17469+ /* Flush the plane changes */
17859+ //intel_pipe_set_base(crtc, 0, 0); 17470+ //intel_pipe_set_base(crtc, 0, 0);
17860+ /* Disable the VGA plane that we never use */ 17471+ /* Disable the VGA plane that we never use */
17861+ //I915_WRITE(VGACNTRL, VGA_DISP_DISABLE); 17472+ //I915_WRITE(VGACNTRL, VGA_DISP_DISABLE);
17862+ //intel_wait_for_vblank(dev); 17473+ //intel_wait_for_vblank(dev);
17863+ 17474+
17864+} 17475+}
@@ -17890,7 +17501,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17890+ mode = &tv_modes[0].mode_entry; 17501+ mode = &tv_modes[0].mode_entry;
17891+ drm_mode_set_crtcinfo(mode, 0); 17502+ drm_mode_set_crtcinfo(mode, 0);
17892+ } 17503+ }
17893+ } 17504+ }
17894+ save_mode = mode; 17505+ save_mode = mode;
17895+#if 0 17506+#if 0
17896+ width = mode->crtc_hdisplay; 17507+ width = mode->crtc_hdisplay;
@@ -17915,7 +17526,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17915+ output_dtd.part1.v_blank = v_blank_len & 0xff; 17526+ output_dtd.part1.v_blank = v_blank_len & 0xff;
17916+ output_dtd.part1.v_high = (((height >> 8) & 0xf) << 4) | 17527+ output_dtd.part1.v_high = (((height >> 8) & 0xf) << 4) |
17917+ ((v_blank_len >> 8) & 0xf); 17528+ ((v_blank_len >> 8) & 0xf);
17918+ 17529+
17919+ output_dtd.part2.h_sync_off = h_sync_offset; 17530+ output_dtd.part2.h_sync_off = h_sync_offset;
17920+ output_dtd.part2.h_sync_width = h_sync_len & 0xff; 17531+ output_dtd.part2.h_sync_width = h_sync_len & 0xff;
17921+ output_dtd.part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 | 17532+ output_dtd.part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
@@ -17923,7 +17534,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17923+ output_dtd.part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) | 17534+ output_dtd.part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
17924+ ((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) | 17535+ ((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) |
17925+ ((v_sync_len & 0x30) >> 4); 17536+ ((v_sync_len & 0x30) >> 4);
17926+ 17537+
17927+ output_dtd.part2.dtd_flags = 0x18; 17538+ output_dtd.part2.dtd_flags = 0x18;
17928+ if (mode->flags & V_PHSYNC) 17539+ if (mode->flags & V_PHSYNC)
17929+ output_dtd.part2.dtd_flags |= 0x2; 17540+ output_dtd.part2.dtd_flags |= 0x2;
@@ -17940,9 +17551,9 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17940+ //intel_sdvo_set_active_outputs(output, sdvo_priv->active_outputs); 17551+ //intel_sdvo_set_active_outputs(output, sdvo_priv->active_outputs);
17941+ memset(&output_dtd, 0, sizeof(struct intel_sdvo_dtd)); 17552+ memset(&output_dtd, 0, sizeof(struct intel_sdvo_dtd));
17942+ /* check if this mode can be supported or not */ 17553+ /* check if this mode can be supported or not */
17943+ 17554+
17944+ i830_translate_timing2dtd(mode, &output_dtd); 17555+ i830_translate_timing2dtd(mode, &output_dtd);
17945+#endif 17556+#endif
17946+ intel_sdvo_set_target_output(output, 0); 17557+ intel_sdvo_set_target_output(output, 0);
17947+ /* set the target input & output first */ 17558+ /* set the target input & output first */
17948+ /* Set the input timing to the screen. Assume always input 0. */ 17559+ /* Set the input timing to the screen. Assume always input 0. */
@@ -17973,7 +17584,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17973+ /* Set the overscan values now as input timing is dependent on overscan values */ 17584+ /* Set the overscan values now as input timing is dependent on overscan values */
17974+ 17585+
17975+ } 17586+ }
17976+ 17587+
17977+ 17588+
17978+ /* We would like to use i830_sdvo_create_preferred_input_timing() to 17589+ /* We would like to use i830_sdvo_create_preferred_input_timing() to
17979+ * provide the device with a timing it can support, if it supports that 17590+ * provide the device with a timing it can support, if it supports that
@@ -17985,16 +17596,16 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
17985+ width, height); 17596+ width, height);
17986+ if (success) { 17597+ if (success) {
17987+ struct intel_sdvo_dtd *input_dtd; 17598+ struct intel_sdvo_dtd *input_dtd;
17988+ 17599+
17989+ intel_sdvo_get_preferred_input_timing(output, &input_dtd); 17600+ intel_sdvo_get_preferred_input_timing(output, &input_dtd);
17990+ intel_sdvo_set_input_timing(output, &input_dtd); 17601+ intel_sdvo_set_input_timing(output, &input_dtd);
17991+ } 17602+ }
17992+#else 17603+#else
17993+ /* Set input timing (in DTD) */ 17604+ /* Set input timing (in DTD) */
17994+ intel_sdvo_set_input_timing(output, &output_dtd); 17605+ intel_sdvo_set_input_timing(output, &output_dtd);
17995+#endif 17606+#endif
17996+ if (sdvo_priv->ActiveDevice == SDVO_DEVICE_TV) { 17607+ if (sdvo_priv->ActiveDevice == SDVO_DEVICE_TV) {
17997+ 17608+
17998+ DRM_DEBUG("xxintel_sdvo_mode_set tv path\n"); 17609+ DRM_DEBUG("xxintel_sdvo_mode_set tv path\n");
17999+ i830_tv_program_display_params(output); 17610+ i830_tv_program_display_params(output);
18000+ /* translate dtd 2 timing */ 17611+ /* translate dtd 2 timing */
@@ -18030,7 +17641,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18030+ intel_sdvo_set_clock_rate_mult(output, 17641+ intel_sdvo_set_clock_rate_mult(output,
18031+ SDVO_CLOCK_RATE_MULT_4X); 17642+ SDVO_CLOCK_RATE_MULT_4X);
18032+ break; 17643+ break;
18033+ } 17644+ }
18034+ } 17645+ }
18035+ /* Set the SDVO control regs. */ 17646+ /* Set the SDVO control regs. */
18036+ if (0/*IS_I965GM(dev)*/) { 17647+ if (0/*IS_I965GM(dev)*/) {
@@ -18052,17 +17663,17 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18052+ 17663+
18053+ sdvo_pixel_multiply = intel_sdvo_get_pixel_multiplier(mode); 17664+ sdvo_pixel_multiply = intel_sdvo_get_pixel_multiplier(mode);
18054+ if (IS_I965G(dev)) { 17665+ if (IS_I965G(dev)) {
18055+ /* done in crtc_mode_set as the dpll_md reg must be written 17666+ /* done in crtc_mode_set as the dpll_md reg must be written
18056+ early */ 17667+ early */
18057+ } else if (IS_POULSBO(dev) || IS_I945G(dev) || IS_I945GM(dev)) { 17668+ } else if (IS_POULSBO(dev) || IS_I945G(dev) || IS_I945GM(dev)) {
18058+ /* done in crtc_mode_set as it lives inside the 17669+ /* done in crtc_mode_set as it lives inside the
18059+ dpll register */ 17670+ dpll register */
18060+ } else { 17671+ } else {
18061+ sdvox |= (sdvo_pixel_multiply - 1) << SDVO_PORT_MULTIPLY_SHIFT; 17672+ sdvox |= (sdvo_pixel_multiply - 1) << SDVO_PORT_MULTIPLY_SHIFT;
18062+ } 17673+ }
18063+ 17674+
18064+ intel_sdvo_write_sdvox(output, sdvox); 17675+ intel_sdvo_write_sdvox(output, sdvox);
18065+ i830_sdvo_set_iomap(output); 17676+ i830_sdvo_set_iomap(output);
18066+} 17677+}
18067+ 17678+
18068+static void intel_sdvo_dpms(struct drm_output *output, int mode) 17679+static void intel_sdvo_dpms(struct drm_output *output, int mode)
@@ -18097,18 +17708,18 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18097+ bool input1, input2; 17708+ bool input1, input2;
18098+ int i; 17709+ int i;
18099+ u8 status; 17710+ u8 status;
18100+ 17711+
18101+ temp = I915_READ(sdvo_priv->output_device); 17712+ temp = I915_READ(sdvo_priv->output_device);
18102+ if ((temp & SDVO_ENABLE) == 0) 17713+ if ((temp & SDVO_ENABLE) == 0)
18103+ intel_sdvo_write_sdvox(output, temp | SDVO_ENABLE); 17714+ intel_sdvo_write_sdvox(output, temp | SDVO_ENABLE);
18104+ for (i = 0; i < 2; i++) 17715+ for (i = 0; i < 2; i++)
18105+ intel_wait_for_vblank(dev); 17716+ intel_wait_for_vblank(dev);
18106+ 17717+
18107+ status = intel_sdvo_get_trained_inputs(output, &input1, 17718+ status = intel_sdvo_get_trained_inputs(output, &input1,
18108+ &input2); 17719+ &input2);
18109+ 17720+
18110+ 17721+
18111+ /* Warn if the device reported failure to sync. 17722+ /* Warn if the device reported failure to sync.
18112+ * A lot of SDVO devices fail to notify of sync, but it's 17723+ * A lot of SDVO devices fail to notify of sync, but it's
18113+ * a given it the status is a success, we succeeded. 17724+ * a given it the status is a success, we succeeded.
18114+ */ 17725+ */
@@ -18116,13 +17727,13 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18116+ DRM_DEBUG("First %s output reported failure to sync\n", 17727+ DRM_DEBUG("First %s output reported failure to sync\n",
18117+ SDVO_NAME(sdvo_priv)); 17728+ SDVO_NAME(sdvo_priv));
18118+ } 17729+ }
18119+ 17730+
18120+ if (0) 17731+ if (0)
18121+ intel_sdvo_set_encoder_power_state(output, mode); 17732+ intel_sdvo_set_encoder_power_state(output, mode);
18122+ 17733+
18123+ DRM_DEBUG("xiaolin active output is %d\n",sdvo_priv->active_outputs); 17734+ DRM_DEBUG("xiaolin active output is %d\n",sdvo_priv->active_outputs);
18124+ intel_sdvo_set_active_outputs(output, sdvo_priv->active_outputs); 17735+ intel_sdvo_set_active_outputs(output, sdvo_priv->active_outputs);
18125+ } 17736+ }
18126+ return; 17737+ return;
18127+} 17738+}
18128+ 17739+
@@ -18152,7 +17763,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18152+ 17763+
18153+ intel_sdvo_set_target_output(output, sdvo_priv->active_outputs); 17764+ intel_sdvo_set_target_output(output, sdvo_priv->active_outputs);
18154+ intel_sdvo_get_output_timing(output, 17765+ intel_sdvo_get_output_timing(output,
18155+ &sdvo_priv->save_output_dtd[sdvo_priv->active_outputs]); 17766+ &sdvo_priv->save_output_dtd[sdvo_priv->active_outputs]);
18156+ sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->output_device); 17767+ sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->output_device);
18157+} 17768+}
18158+ 17769+
@@ -18181,11 +17792,11 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18181+ intel_sdvo_set_target_input(output, false, true); 17792+ intel_sdvo_set_target_input(output, false, true);
18182+ intel_sdvo_set_input_timing(output, &sdvo_priv->save_input_dtd_2); 17793+ intel_sdvo_set_input_timing(output, &sdvo_priv->save_input_dtd_2);
18183+ } 17794+ }
18184+ 17795+
18185+ intel_sdvo_set_clock_rate_mult(output, sdvo_priv->save_sdvo_mult); 17796+ intel_sdvo_set_clock_rate_mult(output, sdvo_priv->save_sdvo_mult);
18186+ 17797+
18187+ I915_WRITE(sdvo_priv->output_device, sdvo_priv->save_SDVOX); 17798+ I915_WRITE(sdvo_priv->output_device, sdvo_priv->save_SDVOX);
18188+ 17799+
18189+ if (sdvo_priv->save_SDVOX & SDVO_ENABLE) 17800+ if (sdvo_priv->save_SDVOX & SDVO_ENABLE)
18190+ { 17801+ {
18191+ for (i = 0; i < 2; i++) 17802+ for (i = 0; i < 2; i++)
@@ -18195,8 +17806,8 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18195+ DRM_DEBUG("First %s output reported failure to sync\n", 17806+ DRM_DEBUG("First %s output reported failure to sync\n",
18196+ SDVO_NAME(sdvo_priv)); 17807+ SDVO_NAME(sdvo_priv));
18197+ } 17808+ }
18198+ 17809+
18199+ i830_sdvo_set_iomap(output); 17810+ i830_sdvo_set_iomap(output);
18200+ intel_sdvo_set_active_outputs(output, sdvo_priv->save_active_outputs); 17811+ intel_sdvo_set_active_outputs(output, sdvo_priv->save_active_outputs);
18201+} 17812+}
18202+ 17813+
@@ -18207,10 +17818,10 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18207+ 17818+
18208+ bool find = FALSE; 17819+ bool find = FALSE;
18209+ int i; 17820+ int i;
18210+ 17821+
18211+ DRM_DEBUG("i830_tv_mode_find,0x%x\n", sdvo_priv->TVStandard); 17822+ DRM_DEBUG("i830_tv_mode_find,0x%x\n", sdvo_priv->TVStandard);
18212+ 17823+
18213+ for (i = 0; i < NUM_TV_MODES; i++) 17824+ for (i = 0; i < NUM_TV_MODES; i++)
18214+ { 17825+ {
18215+ const tv_mode_t *tv_mode = &tv_modes[i]; 17826+ const tv_mode_t *tv_mode = &tv_modes[i];
18216+ if (strcmp (tv_mode->mode_entry.name, pMode->name) == 0 17827+ if (strcmp (tv_mode->mode_entry.name, pMode->name) == 0
@@ -18228,7 +17839,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18228+{ 17839+{
18229+ struct intel_output *intel_output = output->driver_private; 17840+ struct intel_output *intel_output = output->driver_private;
18230+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 17841+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
18231+ 17842+
18232+ bool status = TRUE; 17843+ bool status = TRUE;
18233+ DRM_DEBUG("xxintel_sdvo_mode_valid\n"); 17844+ DRM_DEBUG("xxintel_sdvo_mode_valid\n");
18234+ 17845+
@@ -18279,7 +17890,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18279+ u32 dwTVStdBitmask = 0; 17890+ u32 dwTVStdBitmask = 0;
18280+ 17891+
18281+ struct intel_output *intel_output = output->driver_private; 17892+ struct intel_output *intel_output = output->driver_private;
18282+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 17893+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
18283+ 17894+
18284+ 17895+
18285+ /* Get supported TV Standard */ 17896+ /* Get supported TV Standard */
@@ -18302,15 +17913,15 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18302+ char *name_suffix; 17913+ char *name_suffix;
18303+ char *name_prefix; 17914+ char *name_prefix;
18304+ unsigned char bytes[2]; 17915+ unsigned char bytes[2];
18305+ 17916+
18306+ struct drm_device *dev = output->dev; 17917+ struct drm_device *dev = output->dev;
18307+ 17918+
18308+ struct intel_output *intel_output = output->driver_private; 17919+ struct intel_output *intel_output = output->driver_private;
18309+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 17920+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
18310+ 17921+
18311+ DRM_DEBUG("xxintel_sdvo_detect\n"); 17922+ DRM_DEBUG("xxintel_sdvo_detect\n");
18312+ intel_sdvo_dpms(output, DPMSModeOn); 17923+ intel_sdvo_dpms(output, DPMSModeOn);
18313+ 17924+
18314+ if (!intel_sdvo_get_capabilities(output, &sdvo_priv->caps)) { 17925+ if (!intel_sdvo_get_capabilities(output, &sdvo_priv->caps)) {
18315+ /*No SDVO support, power down the pipe */ 17926+ /*No SDVO support, power down the pipe */
18316+ intel_sdvo_dpms(output, DPMSModeOff); 17927+ intel_sdvo_dpms(output, DPMSModeOff);
@@ -18339,10 +17950,10 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18339+ 17950+
18340+ if ((status != SDVO_CMD_STATUS_SUCCESS) || (response[0] == 0 && response[1] == 0)) { 17951+ if ((status != SDVO_CMD_STATUS_SUCCESS) || (response[0] == 0 && response[1] == 0)) {
18341+ udelay(500); 17952+ udelay(500);
18342+ continue; 17953+ continue;
18343+ } else 17954+ } else
18344+ break; 17955+ break;
18345+ } 17956+ }
18346+ if (response[0] != 0 || response[1] != 0) { 17957+ if (response[0] != 0 || response[1] != 0) {
18347+ /*Check what device types are connected to the hardware CRT/HDTV/S-Video/Composite */ 17958+ /*Check what device types are connected to the hardware CRT/HDTV/S-Video/Composite */
18348+ /*in case of CRT and multiple TV's attached give preference in the order mentioned below */ 17959+ /*in case of CRT and multiple TV's attached give preference in the order mentioned below */
@@ -18420,9 +18031,9 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18420+ /*sdvo_priv->TVStandard = TVSTANDARD_NTSC_M;*/ 18031+ /*sdvo_priv->TVStandard = TVSTANDARD_NTSC_M;*/
18421+ sdvo_priv->TVMode = TVMODE_SDTV; 18032+ sdvo_priv->TVMode = TVMODE_SDTV;
18422+ } 18033+ }
18423+ 18034+
18424+ /*intel_output->pDevice->TVEnabled = TRUE;*/ 18035+ /*intel_output->pDevice->TVEnabled = TRUE;*/
18425+ 18036+
18426+ i830_tv_get_default_params(output); 18037+ i830_tv_get_default_params(output);
18427+ /*Init Display parameter for TV */ 18038+ /*Init Display parameter for TV */
18428+ sdvo_priv->OverScanX.Value = 0xffffffff; 18039+ sdvo_priv->OverScanX.Value = 0xffffffff;
@@ -18441,7 +18052,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18441+ sdvo_priv->dispParams.Saturation.Value = 0x45; 18052+ sdvo_priv->dispParams.Saturation.Value = 0x45;
18442+ sdvo_priv->dispParams.Hue.Value = 0x40; 18053+ sdvo_priv->dispParams.Hue.Value = 0x40;
18443+ sdvo_priv->dispParams.Dither.Value = 0; 18054+ sdvo_priv->dispParams.Dither.Value = 0;
18444+ 18055+
18445+ } 18056+ }
18446+ else { 18057+ else {
18447+ name_prefix = "RGB0"; 18058+ name_prefix = "RGB0";
@@ -18474,7 +18085,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18474+ intel_sdvo_dpms(output, DPMSModeOff); 18085+ intel_sdvo_dpms(output, DPMSModeOff);
18475+ sdvo_priv->ActiveDevice = SDVO_DEVICE_NONE; 18086+ sdvo_priv->ActiveDevice = SDVO_DEVICE_NONE;
18476+ return output_status_disconnected; 18087+ return output_status_disconnected;
18477+ } 18088+ }
18478+} 18089+}
18479+ 18090+
18480+static int i830_sdvo_get_tvmode_from_table(struct drm_output *output) 18091+static int i830_sdvo_get_tvmode_from_table(struct drm_output *output)
@@ -18491,13 +18102,13 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18491+ ((sdvo_priv->TVMode == TVMODE_SDTV) && /*sdtv mode list */ 18102+ ((sdvo_priv->TVMode == TVMODE_SDTV) && /*sdtv mode list */
18492+ (tv_modes[i].dwSupportedSDTVvss & TVSTANDARD_SDTV_ALL))) { 18103+ (tv_modes[i].dwSupportedSDTVvss & TVSTANDARD_SDTV_ALL))) {
18493+ struct drm_display_mode *newmode; 18104+ struct drm_display_mode *newmode;
18494+ newmode = drm_mode_duplicate(dev, &tv_modes[i].mode_entry); 18105+ newmode = drm_mode_duplicate(dev, &tv_modes[i].mode_entry);
18495+ drm_mode_set_crtcinfo(newmode,0); 18106+ drm_mode_set_crtcinfo(newmode,0);
18496+ drm_mode_probed_add(output, newmode); 18107+ drm_mode_probed_add(output, newmode);
18497+ modes++; 18108+ modes++;
18498+ } 18109+ }
18499+ 18110+
18500+ return modes; 18111+ return modes;
18501+ 18112+
18502+} 18113+}
18503+ 18114+
@@ -18527,7 +18138,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18527+#if 0 18138+#if 0
18528+ /* Mac mini hack. On this device, I get DDC through the analog, which 18139+ /* Mac mini hack. On this device, I get DDC through the analog, which
18529+ * load-detects as disconnected. I fail to DDC through the SDVO DDC, 18140+ * load-detects as disconnected. I fail to DDC through the SDVO DDC,
18530+ * but it does load-detect as connected. So, just steal the DDC bits 18141+ * but it does load-detect as connected. So, just steal the DDC bits
18531+ * from analog when we fail at finding it the right way. 18142+ * from analog when we fail at finding it the right way.
18532+ */ 18143+ */
18533+ /* TODO */ 18144+ /* TODO */
@@ -18579,11 +18190,11 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18579+ 18190+
18580+ int count = 3; 18191+ int count = 3;
18581+ u8 response[2]; 18192+ u8 response[2];
18582+ u8 status; 18193+ u8 status;
18583+ unsigned char bytes[2]; 18194+ unsigned char bytes[2];
18584+ 18195+
18585+ DRM_DEBUG("xxintel_sdvo_init\n"); 18196+ DRM_DEBUG("xxintel_sdvo_init\n");
18586+ 18197+
18587+ if (IS_POULSBO(dev)) { 18198+ if (IS_POULSBO(dev)) {
18588+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0); 18199+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);
18589+ u32 sku_value = 0; 18200+ u32 sku_value = 0;
@@ -18788,7 +18399,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18788+ name_prefix = "RGB0"; 18399+ name_prefix = "RGB0";
18789+ DRM_INFO("non TV is attaced\n"); 18400+ DRM_INFO("non TV is attaced\n");
18790+ } 18401+ }
18791+ 18402+
18792+ strcpy(name, name_prefix); 18403+ strcpy(name, name_prefix);
18793+ strcat(name, name_suffix); 18404+ strcat(name, name_suffix);
18794+ if (!drm_output_rename(output, name)) { 18405+ if (!drm_output_rename(output, name)) {
@@ -18815,7 +18426,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18815+ 18426+
18816+ /* Set the input timing to the screen. Assume always input 0. */ 18427+ /* Set the input timing to the screen. Assume always input 0. */
18817+ intel_sdvo_set_target_input(output, true, false); 18428+ intel_sdvo_set_target_input(output, true, false);
18818+ 18429+
18819+ intel_sdvo_get_input_pixel_clock_range(output, 18430+ intel_sdvo_get_input_pixel_clock_range(output,
18820+ &sdvo_priv->pixel_clock_min, 18431+ &sdvo_priv->pixel_clock_min,
18821+ &sdvo_priv->pixel_clock_max); 18432+ &sdvo_priv->pixel_clock_max);
@@ -18833,17 +18444,17 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo.c
18833+ (sdvo_priv->caps.sdvo_inputs_mask & 0x1) ? 'Y' : 'N', 18444+ (sdvo_priv->caps.sdvo_inputs_mask & 0x1) ? 'Y' : 'N',
18834+ (sdvo_priv->caps.sdvo_inputs_mask & 0x2) ? 'Y' : 'N', 18445+ (sdvo_priv->caps.sdvo_inputs_mask & 0x2) ? 'Y' : 'N',
18835+ /* check currently supported outputs */ 18446+ /* check currently supported outputs */
18836+ sdvo_priv->caps.output_flags & 18447+ sdvo_priv->caps.output_flags &
18837+ (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_RGB0) ? 'Y' : 'N', 18448+ (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_RGB0) ? 'Y' : 'N',
18838+ sdvo_priv->caps.output_flags & 18449+ sdvo_priv->caps.output_flags &
18839+ (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); 18450+ (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
18840+ 18451+
18841+ intel_output->ddc_bus = i2cbus; 18452+ intel_output->ddc_bus = i2cbus;
18842+} 18453+}
18843Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo_regs.h 18454Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo_regs.h
18844=================================================================== 18455===================================================================
18845--- /dev/null 1970-01-01 00:00:00.000000000 +0000 18456--- /dev/null 1970-01-01 00:00:00.000000000 +0000
18846+++ linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo_regs.h 2009-01-14 11:58:01.000000000 +0000 18457+++ linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo_regs.h 2009-02-05 13:29:33.000000000 +0000
18847@@ -0,0 +1,580 @@ 18458@@ -0,0 +1,580 @@
18848+/* 18459+/*
18849+ * Copyright ?2006-2007 Intel Corporation 18460+ * Copyright ?2006-2007 Intel Corporation
@@ -19428,7 +19039,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/intel_sdvo_regs.h
19428Index: linux-2.6.27/drivers/gpu/drm/psb/psb_buffer.c 19039Index: linux-2.6.27/drivers/gpu/drm/psb/psb_buffer.c
19429=================================================================== 19040===================================================================
19430--- /dev/null 1970-01-01 00:00:00.000000000 +0000 19041--- /dev/null 1970-01-01 00:00:00.000000000 +0000
19431+++ linux-2.6.27/drivers/gpu/drm/psb/psb_buffer.c 2009-01-14 11:58:01.000000000 +0000 19042+++ linux-2.6.27/drivers/gpu/drm/psb/psb_buffer.c 2009-02-05 13:29:33.000000000 +0000
19432@@ -0,0 +1,437 @@ 19043@@ -0,0 +1,437 @@
19433+/************************************************************************** 19044+/**************************************************************************
19434+ * Copyright (c) 2007, Intel Corporation. 19045+ * Copyright (c) 2007, Intel Corporation.
@@ -19870,7 +19481,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_buffer.c
19870Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drm.h 19481Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drm.h
19871=================================================================== 19482===================================================================
19872--- /dev/null 1970-01-01 00:00:00.000000000 +0000 19483--- /dev/null 1970-01-01 00:00:00.000000000 +0000
19873+++ linux-2.6.27/drivers/gpu/drm/psb/psb_drm.h 2009-01-14 11:58:01.000000000 +0000 19484+++ linux-2.6.27/drivers/gpu/drm/psb/psb_drm.h 2009-02-05 13:29:33.000000000 +0000
19874@@ -0,0 +1,370 @@ 19485@@ -0,0 +1,370 @@
19875+/************************************************************************** 19486+/**************************************************************************
19876+ * Copyright (c) 2007, Intel Corporation. 19487+ * Copyright (c) 2007, Intel Corporation.
@@ -20245,7 +19856,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drm.h
20245Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c 19856Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
20246=================================================================== 19857===================================================================
20247--- /dev/null 1970-01-01 00:00:00.000000000 +0000 19858--- /dev/null 1970-01-01 00:00:00.000000000 +0000
20248+++ linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c 2009-01-14 11:58:01.000000000 +0000 19859+++ linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c 2009-02-05 13:29:33.000000000 +0000
20249@@ -0,0 +1,1006 @@ 19860@@ -0,0 +1,1006 @@
20250+/************************************************************************** 19861+/**************************************************************************
20251+ * Copyright (c) 2007, Intel Corporation. 19862+ * Copyright (c) 2007, Intel Corporation.
@@ -20712,7 +20323,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
20712+ mutex_lock(&dev->mode_config.mutex); 20323+ mutex_lock(&dev->mode_config.mutex);
20713+ 20324+
20714+ drm_crtc_probe_output_modes(dev, 2048, 2048); 20325+ drm_crtc_probe_output_modes(dev, 2048, 2048);
20715+ 20326+
20716+ /* strncpy(drm_init_mode, psb_init_mode, strlen(psb_init_mode)); */ 20327+ /* strncpy(drm_init_mode, psb_init_mode, strlen(psb_init_mode)); */
20717+ drm_init_xres = psb_init_xres; 20328+ drm_init_xres = psb_init_xres;
20718+ drm_init_yres = psb_init_yres; 20329+ drm_init_yres = psb_init_yres;
@@ -20800,7 +20411,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
20800+ psb_scheduler_init(dev, &dev_priv->scheduler); 20411+ psb_scheduler_init(dev, &dev_priv->scheduler);
20801+ 20412+
20802+ resource_start = pci_resource_start(dev->pdev, PSB_MMIO_RESOURCE); 20413+ resource_start = pci_resource_start(dev->pdev, PSB_MMIO_RESOURCE);
20803+ 20414+
20804+ dev_priv->msvdx_reg = 20415+ dev_priv->msvdx_reg =
20805+ ioremap(resource_start + PSB_MSVDX_OFFSET, PSB_MSVDX_SIZE); 20416+ ioremap(resource_start + PSB_MSVDX_OFFSET, PSB_MSVDX_SIZE);
20806+ if (!dev_priv->msvdx_reg) 20417+ if (!dev_priv->msvdx_reg)
@@ -20955,7 +20566,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
20955+ } while (ret == -EINTR); 20566+ } while (ret == -EINTR);
20956+ 20567+
20957+ } 20568+ }
20958+ 20569+
20959+ /* Issue software reset */ 20570+ /* Issue software reset */
20960+ PSB_WMSVDX32 (msvdx_sw_reset_all, MSVDX_CONTROL); 20571+ PSB_WMSVDX32 (msvdx_sw_reset_all, MSVDX_CONTROL);
20961+ 20572+
@@ -21025,7 +20636,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
21025+#ifdef USE_PAT_WC 20636+#ifdef USE_PAT_WC
21026+#warning Init pat 20637+#warning Init pat
21027+ /* for single CPU's we do it here, then for more than one CPU we 20638+ /* for single CPU's we do it here, then for more than one CPU we
21028+ * use the CPU notifier to reinit PAT on those CPU's. 20639+ * use the CPU notifier to reinit PAT on those CPU's.
21029+ */ 20640+ */
21030+ drm_init_pat(); 20641+ drm_init_pat();
21031+#endif 20642+#endif
@@ -21102,7 +20713,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
21102+ if (drm_psb_no_fb == 0) 20713+ if (drm_psb_no_fb == 0)
21103+ psbfb_resume(dev); 20714+ psbfb_resume(dev);
21104+#ifdef WA_NO_FB_GARBAGE_DISPLAY 20715+#ifdef WA_NO_FB_GARBAGE_DISPLAY
21105+ else { 20716+ else {
21106+ if(num_registered_fb) 20717+ if(num_registered_fb)
21107+ { 20718+ {
21108+ struct fb_info *fb_info=registered_fb[0]; 20719+ struct fb_info *fb_info=registered_fb[0];
@@ -21116,7 +20727,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
21116+ printk("set the fb_set_suspend resume end\n"); 20727+ printk("set the fb_set_suspend resume end\n");
21117+ } 20728+ }
21118+ } 20729+ }
21119+ } 20730+ }
21120+#endif 20731+#endif
21121+ 20732+
21122+ return 0; 20733+ return 0;
@@ -21256,7 +20867,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.c
21256Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.h 20867Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.h
21257=================================================================== 20868===================================================================
21258--- /dev/null 1970-01-01 00:00:00.000000000 +0000 20869--- /dev/null 1970-01-01 00:00:00.000000000 +0000
21259+++ linux-2.6.27/drivers/gpu/drm/psb/psb_drv.h 2009-01-14 11:58:01.000000000 +0000 20870+++ linux-2.6.27/drivers/gpu/drm/psb/psb_drv.h 2009-02-05 13:29:33.000000000 +0000
21260@@ -0,0 +1,775 @@ 20871@@ -0,0 +1,775 @@
21261+/************************************************************************** 20872+/**************************************************************************
21262+ * Copyright (c) 2007, Intel Corporation. 20873+ * Copyright (c) 2007, Intel Corporation.
@@ -21709,7 +21320,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.h
21709+ struct mutex msvdx_mutex; 21320+ struct mutex msvdx_mutex;
21710+ struct list_head msvdx_queue; 21321+ struct list_head msvdx_queue;
21711+ int msvdx_busy; 21322+ int msvdx_busy;
21712+ 21323+
21713+}; 21324+};
21714+ 21325+
21715+struct psb_mmu_driver; 21326+struct psb_mmu_driver;
@@ -22036,7 +21647,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_drv.h
22036Index: linux-2.6.27/drivers/gpu/drm/psb/psb_fb.c 21647Index: linux-2.6.27/drivers/gpu/drm/psb/psb_fb.c
22037=================================================================== 21648===================================================================
22038--- /dev/null 1970-01-01 00:00:00.000000000 +0000 21649--- /dev/null 1970-01-01 00:00:00.000000000 +0000
22039+++ linux-2.6.27/drivers/gpu/drm/psb/psb_fb.c 2009-01-14 12:03:18.000000000 +0000 21650+++ linux-2.6.27/drivers/gpu/drm/psb/psb_fb.c 2009-02-05 13:29:33.000000000 +0000
22040@@ -0,0 +1,1330 @@ 21651@@ -0,0 +1,1330 @@
22041+/************************************************************************** 21652+/**************************************************************************
22042+ * Copyright (c) 2007, Intel Corporation. 21653+ * Copyright (c) 2007, Intel Corporation.
@@ -23371,7 +22982,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_fb.c
23371Index: linux-2.6.27/drivers/gpu/drm/psb/psb_fence.c 22982Index: linux-2.6.27/drivers/gpu/drm/psb/psb_fence.c
23372=================================================================== 22983===================================================================
23373--- /dev/null 1970-01-01 00:00:00.000000000 +0000 22984--- /dev/null 1970-01-01 00:00:00.000000000 +0000
23374+++ linux-2.6.27/drivers/gpu/drm/psb/psb_fence.c 2009-01-14 11:58:01.000000000 +0000 22985+++ linux-2.6.27/drivers/gpu/drm/psb/psb_fence.c 2009-02-05 13:29:33.000000000 +0000
23375@@ -0,0 +1,285 @@ 22986@@ -0,0 +1,285 @@
23376+/************************************************************************** 22987+/**************************************************************************
23377+ * Copyright (c) 2007, Intel Corporation. 22988+ * Copyright (c) 2007, Intel Corporation.
@@ -23661,7 +23272,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_fence.c
23661Index: linux-2.6.27/drivers/gpu/drm/psb/psb_gtt.c 23272Index: linux-2.6.27/drivers/gpu/drm/psb/psb_gtt.c
23662=================================================================== 23273===================================================================
23663--- /dev/null 1970-01-01 00:00:00.000000000 +0000 23274--- /dev/null 1970-01-01 00:00:00.000000000 +0000
23664+++ linux-2.6.27/drivers/gpu/drm/psb/psb_gtt.c 2009-01-14 11:58:01.000000000 +0000 23275+++ linux-2.6.27/drivers/gpu/drm/psb/psb_gtt.c 2009-02-05 13:29:33.000000000 +0000
23665@@ -0,0 +1,233 @@ 23276@@ -0,0 +1,233 @@
23666+/************************************************************************** 23277+/**************************************************************************
23667+ * Copyright (c) 2007, Intel Corporation. 23278+ * Copyright (c) 2007, Intel Corporation.
@@ -23899,7 +23510,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_gtt.c
23899Index: linux-2.6.27/drivers/gpu/drm/psb/psb_i2c.c 23510Index: linux-2.6.27/drivers/gpu/drm/psb/psb_i2c.c
23900=================================================================== 23511===================================================================
23901--- /dev/null 1970-01-01 00:00:00.000000000 +0000 23512--- /dev/null 1970-01-01 00:00:00.000000000 +0000
23902+++ linux-2.6.27/drivers/gpu/drm/psb/psb_i2c.c 2009-01-14 11:58:01.000000000 +0000 23513+++ linux-2.6.27/drivers/gpu/drm/psb/psb_i2c.c 2009-02-05 13:29:33.000000000 +0000
23903@@ -0,0 +1,179 @@ 23514@@ -0,0 +1,179 @@
23904+/* 23515+/*
23905+ * Copyright © 2006-2007 Intel Corporation 23516+ * Copyright © 2006-2007 Intel Corporation
@@ -24083,7 +23694,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_i2c.c
24083Index: linux-2.6.27/drivers/gpu/drm/psb/psb_irq.c 23694Index: linux-2.6.27/drivers/gpu/drm/psb/psb_irq.c
24084=================================================================== 23695===================================================================
24085--- /dev/null 1970-01-01 00:00:00.000000000 +0000 23696--- /dev/null 1970-01-01 00:00:00.000000000 +0000
24086+++ linux-2.6.27/drivers/gpu/drm/psb/psb_irq.c 2009-01-14 11:58:01.000000000 +0000 23697+++ linux-2.6.27/drivers/gpu/drm/psb/psb_irq.c 2009-02-05 13:29:33.000000000 +0000
24087@@ -0,0 +1,382 @@ 23698@@ -0,0 +1,382 @@
24088+/************************************************************************** 23699+/**************************************************************************
24089+ * Copyright (c) 2007, Intel Corporation. 23700+ * Copyright (c) 2007, Intel Corporation.
@@ -24470,7 +24081,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_irq.c
24470Index: linux-2.6.27/drivers/gpu/drm/psb/psb_mmu.c 24081Index: linux-2.6.27/drivers/gpu/drm/psb/psb_mmu.c
24471=================================================================== 24082===================================================================
24472--- /dev/null 1970-01-01 00:00:00.000000000 +0000 24083--- /dev/null 1970-01-01 00:00:00.000000000 +0000
24473+++ linux-2.6.27/drivers/gpu/drm/psb/psb_mmu.c 2009-01-14 11:58:01.000000000 +0000 24084+++ linux-2.6.27/drivers/gpu/drm/psb/psb_mmu.c 2009-02-05 13:29:33.000000000 +0000
24474@@ -0,0 +1,1037 @@ 24085@@ -0,0 +1,1037 @@
24475+/************************************************************************** 24086+/**************************************************************************
24476+ * Copyright (c) 2007, Intel Corporation. 24087+ * Copyright (c) 2007, Intel Corporation.
@@ -25512,7 +25123,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_mmu.c
25512Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c 25123Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c
25513=================================================================== 25124===================================================================
25514--- /dev/null 1970-01-01 00:00:00.000000000 +0000 25125--- /dev/null 1970-01-01 00:00:00.000000000 +0000
25515+++ linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c 2009-01-14 11:58:01.000000000 +0000 25126+++ linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c 2009-02-05 13:29:33.000000000 +0000
25516@@ -0,0 +1,676 @@ 25127@@ -0,0 +1,676 @@
25517+/** 25128+/**
25518+ * file psb_msvdx.c 25129+ * file psb_msvdx.c
@@ -25652,7 +25263,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c
25652+ { 25263+ {
25653+ mmu_ptd |= 1; 25264+ mmu_ptd |= 1;
25654+ PSB_DEBUG_GENERAL ("MSVDX: Setting MMU invalidate flag\n"); 25265+ PSB_DEBUG_GENERAL ("MSVDX: Setting MMU invalidate flag\n");
25655+ } 25266+ }
25656+ /* PTD */ 25267+ /* PTD */
25657+ MEMIO_WRITE_FIELD (cmd, FW_VA_RENDER_MMUPTD, mmu_ptd); 25268+ MEMIO_WRITE_FIELD (cmd, FW_VA_RENDER_MMUPTD, mmu_ptd);
25658+ break; 25269+ break;
@@ -26160,8 +25771,8 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c
26160+ } 25771+ }
26161+ if (dev_priv->msvdx_start_idle) 25772+ if (dev_priv->msvdx_start_idle)
26162+ dev_priv->msvdx_start_idle = 0; 25773+ dev_priv->msvdx_start_idle = 0;
26163+ } 25774+ }
26164+ else 25775+ else
26165+ { 25776+ {
26166+ if (dev_priv->msvdx_needs_reset == 0) 25777+ if (dev_priv->msvdx_needs_reset == 0)
26167+ { 25778+ {
@@ -26193,7 +25804,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.c
26193Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.h 25804Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.h
26194=================================================================== 25805===================================================================
26195--- /dev/null 1970-01-01 00:00:00.000000000 +0000 25806--- /dev/null 1970-01-01 00:00:00.000000000 +0000
26196+++ linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.h 2009-01-14 11:58:01.000000000 +0000 25807+++ linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.h 2009-02-05 13:29:33.000000000 +0000
26197@@ -0,0 +1,564 @@ 25808@@ -0,0 +1,564 @@
26198+/************************************************************************** 25809+/**************************************************************************
26199+ * 25810+ *
@@ -26762,7 +26373,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdx.h
26762Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c 26373Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c
26763=================================================================== 26374===================================================================
26764--- /dev/null 1970-01-01 00:00:00.000000000 +0000 26375--- /dev/null 1970-01-01 00:00:00.000000000 +0000
26765+++ linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c 2009-01-14 11:58:01.000000000 +0000 26376+++ linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c 2009-02-05 13:29:33.000000000 +0000
26766@@ -0,0 +1,625 @@ 26377@@ -0,0 +1,625 @@
26767+/** 26378+/**
26768+ * file psb_msvdxinit.c 26379+ * file psb_msvdxinit.c
@@ -27066,7 +26677,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c
27066+ PSB_DEBUG_GENERAL("MSVDX: Detected Poulsbo D1 or later revision.\n"); 26677+ PSB_DEBUG_GENERAL("MSVDX: Detected Poulsbo D1 or later revision.\n");
27067+ PSB_WMSVDX32 (MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D1, MSVDX_COMMS_OFFSET_FLAGS); 26678+ PSB_WMSVDX32 (MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D1, MSVDX_COMMS_OFFSET_FLAGS);
27068+ } 26679+ }
27069+ else 26680+ else
27070+ { 26681+ {
27071+ PSB_DEBUG_GENERAL("MSVDX: Detected Poulsbo D0 or earlier revision.\n"); 26682+ PSB_DEBUG_GENERAL("MSVDX: Detected Poulsbo D0 or earlier revision.\n");
27072+ PSB_WMSVDX32 (MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D0, MSVDX_COMMS_OFFSET_FLAGS); 26683+ PSB_WMSVDX32 (MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D0, MSVDX_COMMS_OFFSET_FLAGS);
@@ -27212,7 +26823,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c
27212+ /* Clear any pending interrupt flags */ 26823+ /* Clear any pending interrupt flags */
27213+ PSB_WMSVDX32 (0xFFFFFFFF, MSVDX_INTERRUPT_CLEAR); 26824+ PSB_WMSVDX32 (0xFFFFFFFF, MSVDX_INTERRUPT_CLEAR);
27214+ } 26825+ }
27215+ 26826+
27216+ mutex_destroy (&dev_priv->msvdx_mutex); 26827+ mutex_destroy (&dev_priv->msvdx_mutex);
27217+ 26828+
27218+ return ret; 26829+ return ret;
@@ -27381,7 +26992,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c
27381+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0); 26992+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);
27382+ 26993+
27383+ hw_info->rev_id = dev_priv->psb_rev_id; 26994+ hw_info->rev_id = dev_priv->psb_rev_id;
27384+ 26995+
27385+ /*read the fuse info to determine the caps*/ 26996+ /*read the fuse info to determine the caps*/
27386+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE); 26997+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE);
27387+ pci_read_config_dword(pci_root, 0xD4, &hw_info->caps); 26998+ pci_read_config_dword(pci_root, 0xD4, &hw_info->caps);
@@ -27392,7 +27003,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_msvdxinit.c
27392Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reg.h 27003Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reg.h
27393=================================================================== 27004===================================================================
27394--- /dev/null 1970-01-01 00:00:00.000000000 +0000 27005--- /dev/null 1970-01-01 00:00:00.000000000 +0000
27395+++ linux-2.6.27/drivers/gpu/drm/psb/psb_reg.h 2009-01-14 11:58:01.000000000 +0000 27006+++ linux-2.6.27/drivers/gpu/drm/psb/psb_reg.h 2009-02-05 13:29:33.000000000 +0000
27396@@ -0,0 +1,562 @@ 27007@@ -0,0 +1,562 @@
27397+/************************************************************************** 27008+/**************************************************************************
27398+ * 27009+ *
@@ -27410,7 +27021,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reg.h
27410+ * more details. 27021+ * more details.
27411+ * 27022+ *
27412+ * You should have received a copy of the GNU General Public License along with 27023+ * You should have received a copy of the GNU General Public License along with
27413+ * this program; if not, write to the Free Software Foundation, Inc., 27024+ * this program; if not, write to the Free Software Foundation, Inc.,
27414+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 27025+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
27415+ * 27026+ *
27416+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 27027+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
@@ -27959,7 +27570,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reg.h
27959Index: linux-2.6.27/drivers/gpu/drm/psb/psb_regman.c 27570Index: linux-2.6.27/drivers/gpu/drm/psb/psb_regman.c
27960=================================================================== 27571===================================================================
27961--- /dev/null 1970-01-01 00:00:00.000000000 +0000 27572--- /dev/null 1970-01-01 00:00:00.000000000 +0000
27962+++ linux-2.6.27/drivers/gpu/drm/psb/psb_regman.c 2009-01-14 11:58:01.000000000 +0000 27573+++ linux-2.6.27/drivers/gpu/drm/psb/psb_regman.c 2009-02-05 13:29:33.000000000 +0000
27963@@ -0,0 +1,175 @@ 27574@@ -0,0 +1,175 @@
27964+/************************************************************************** 27575+/**************************************************************************
27965+ * Copyright (c) 2007, Intel Corporation. 27576+ * Copyright (c) 2007, Intel Corporation.
@@ -28139,7 +27750,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_regman.c
28139Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reset.c 27750Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reset.c
28140=================================================================== 27751===================================================================
28141--- /dev/null 1970-01-01 00:00:00.000000000 +0000 27752--- /dev/null 1970-01-01 00:00:00.000000000 +0000
28142+++ linux-2.6.27/drivers/gpu/drm/psb/psb_reset.c 2009-01-14 11:58:01.000000000 +0000 27753+++ linux-2.6.27/drivers/gpu/drm/psb/psb_reset.c 2009-02-05 13:29:33.000000000 +0000
28143@@ -0,0 +1,374 @@ 27754@@ -0,0 +1,374 @@
28144+/************************************************************************** 27755+/**************************************************************************
28145+ * Copyright (c) 2007, Intel Corporation. 27756+ * Copyright (c) 2007, Intel Corporation.
@@ -28518,7 +28129,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_reset.c
28518Index: linux-2.6.27/drivers/gpu/drm/psb/psb_scene.c 28129Index: linux-2.6.27/drivers/gpu/drm/psb/psb_scene.c
28519=================================================================== 28130===================================================================
28520--- /dev/null 1970-01-01 00:00:00.000000000 +0000 28131--- /dev/null 1970-01-01 00:00:00.000000000 +0000
28521+++ linux-2.6.27/drivers/gpu/drm/psb/psb_scene.c 2009-01-14 11:58:01.000000000 +0000 28132+++ linux-2.6.27/drivers/gpu/drm/psb/psb_scene.c 2009-02-05 13:29:33.000000000 +0000
28522@@ -0,0 +1,531 @@ 28133@@ -0,0 +1,531 @@
28523+/************************************************************************** 28134+/**************************************************************************
28524+ * Copyright (c) 2007, Intel Corporation. 28135+ * Copyright (c) 2007, Intel Corporation.
@@ -29054,7 +28665,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_scene.c
29054Index: linux-2.6.27/drivers/gpu/drm/psb/psb_scene.h 28665Index: linux-2.6.27/drivers/gpu/drm/psb/psb_scene.h
29055=================================================================== 28666===================================================================
29056--- /dev/null 1970-01-01 00:00:00.000000000 +0000 28667--- /dev/null 1970-01-01 00:00:00.000000000 +0000
29057+++ linux-2.6.27/drivers/gpu/drm/psb/psb_scene.h 2009-01-14 11:58:01.000000000 +0000 28668+++ linux-2.6.27/drivers/gpu/drm/psb/psb_scene.h 2009-02-05 13:29:33.000000000 +0000
29058@@ -0,0 +1,112 @@ 28669@@ -0,0 +1,112 @@
29059+/************************************************************************** 28670+/**************************************************************************
29060+ * Copyright (c) 2007, Intel Corporation. 28671+ * Copyright (c) 2007, Intel Corporation.
@@ -29171,7 +28782,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_scene.h
29171Index: linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.c 28782Index: linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.c
29172=================================================================== 28783===================================================================
29173--- /dev/null 1970-01-01 00:00:00.000000000 +0000 28784--- /dev/null 1970-01-01 00:00:00.000000000 +0000
29174+++ linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.c 2009-01-14 11:58:01.000000000 +0000 28785+++ linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.c 2009-02-05 13:29:33.000000000 +0000
29175@@ -0,0 +1,1445 @@ 28786@@ -0,0 +1,1445 @@
29176+/************************************************************************** 28787+/**************************************************************************
29177+ * Copyright (c) 2007, Intel Corporation. 28788+ * Copyright (c) 2007, Intel Corporation.
@@ -30621,7 +30232,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.c
30621Index: linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.h 30232Index: linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.h
30622=================================================================== 30233===================================================================
30623--- /dev/null 1970-01-01 00:00:00.000000000 +0000 30234--- /dev/null 1970-01-01 00:00:00.000000000 +0000
30624+++ linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.h 2009-01-14 11:58:01.000000000 +0000 30235+++ linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.h 2009-02-05 13:29:33.000000000 +0000
30625@@ -0,0 +1,170 @@ 30236@@ -0,0 +1,170 @@
30626+/************************************************************************** 30237+/**************************************************************************
30627+ * Copyright (c) 2007, Intel Corporation. 30238+ * Copyright (c) 2007, Intel Corporation.
@@ -30796,7 +30407,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_schedule.h
30796Index: linux-2.6.27/drivers/gpu/drm/psb/psb_setup.c 30407Index: linux-2.6.27/drivers/gpu/drm/psb/psb_setup.c
30797=================================================================== 30408===================================================================
30798--- /dev/null 1970-01-01 00:00:00.000000000 +0000 30409--- /dev/null 1970-01-01 00:00:00.000000000 +0000
30799+++ linux-2.6.27/drivers/gpu/drm/psb/psb_setup.c 2009-01-14 11:58:01.000000000 +0000 30410+++ linux-2.6.27/drivers/gpu/drm/psb/psb_setup.c 2009-02-05 13:29:33.000000000 +0000
30800@@ -0,0 +1,17 @@ 30411@@ -0,0 +1,17 @@
30801+#include "drmP.h" 30412+#include "drmP.h"
30802+#include "drm.h" 30413+#include "drm.h"
@@ -30818,7 +30429,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_setup.c
30818Index: linux-2.6.27/drivers/gpu/drm/psb/psb_sgx.c 30429Index: linux-2.6.27/drivers/gpu/drm/psb/psb_sgx.c
30819=================================================================== 30430===================================================================
30820--- /dev/null 1970-01-01 00:00:00.000000000 +0000 30431--- /dev/null 1970-01-01 00:00:00.000000000 +0000
30821+++ linux-2.6.27/drivers/gpu/drm/psb/psb_sgx.c 2009-01-14 11:58:01.000000000 +0000 30432+++ linux-2.6.27/drivers/gpu/drm/psb/psb_sgx.c 2009-02-05 13:29:33.000000000 +0000
30822@@ -0,0 +1,1422 @@ 30433@@ -0,0 +1,1422 @@
30823+/************************************************************************** 30434+/**************************************************************************
30824+ * Copyright (c) 2007, Intel Corporation. 30435+ * Copyright (c) 2007, Intel Corporation.
@@ -32245,7 +31856,7 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_sgx.c
32245Index: linux-2.6.27/drivers/gpu/drm/psb/psb_xhw.c 31856Index: linux-2.6.27/drivers/gpu/drm/psb/psb_xhw.c
32246=================================================================== 31857===================================================================
32247--- /dev/null 1970-01-01 00:00:00.000000000 +0000 31858--- /dev/null 1970-01-01 00:00:00.000000000 +0000
32248+++ linux-2.6.27/drivers/gpu/drm/psb/psb_xhw.c 2009-01-14 11:58:01.000000000 +0000 31859+++ linux-2.6.27/drivers/gpu/drm/psb/psb_xhw.c 2009-02-05 13:29:33.000000000 +0000
32249@@ -0,0 +1,614 @@ 31860@@ -0,0 +1,614 @@
32250+/************************************************************************** 31861+/**************************************************************************
32251+ * Copyright (c) 2007, Intel Corporation. 31862+ * Copyright (c) 2007, Intel Corporation.
@@ -32863,8 +32474,8 @@ Index: linux-2.6.27/drivers/gpu/drm/psb/psb_xhw.c
32863+} 32474+}
32864Index: linux-2.6.27/drivers/gpu/drm/Kconfig 32475Index: linux-2.6.27/drivers/gpu/drm/Kconfig
32865=================================================================== 32476===================================================================
32866--- linux-2.6.27.orig/drivers/gpu/drm/Kconfig 2009-01-14 11:54:35.000000000 +0000 32477--- linux-2.6.27.orig/drivers/gpu/drm/Kconfig 2008-10-09 23:13:53.000000000 +0100
32867+++ linux-2.6.27/drivers/gpu/drm/Kconfig 2009-01-14 11:58:01.000000000 +0000 32478+++ linux-2.6.27/drivers/gpu/drm/Kconfig 2009-02-05 13:29:33.000000000 +0000
32868@@ -105,3 +105,9 @@ 32479@@ -105,3 +105,9 @@
32869 help 32480 help
32870 Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister 32481 Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister
@@ -32878,7 +32489,7 @@ Index: linux-2.6.27/drivers/gpu/drm/Kconfig
32878Index: linux-2.6.27/include/drm/drm_crtc.h 32489Index: linux-2.6.27/include/drm/drm_crtc.h
32879=================================================================== 32490===================================================================
32880--- /dev/null 1970-01-01 00:00:00.000000000 +0000 32491--- /dev/null 1970-01-01 00:00:00.000000000 +0000
32881+++ linux-2.6.27/include/drm/drm_crtc.h 2009-01-14 12:01:13.000000000 +0000 32492+++ linux-2.6.27/include/drm/drm_crtc.h 2009-02-05 13:29:33.000000000 +0000
32882@@ -0,0 +1,592 @@ 32493@@ -0,0 +1,592 @@
32883+/* 32494+/*
32884+ * Copyright © 2006 Keith Packard 32495+ * Copyright © 2006 Keith Packard
@@ -33321,7 +32932,7 @@ Index: linux-2.6.27/include/drm/drm_crtc.h
33321+ 32932+
33322+ /* these are modes added by probing with DDC or the BIOS */ 32933+ /* these are modes added by probing with DDC or the BIOS */
33323+ struct list_head probed_modes; 32934+ struct list_head probed_modes;
33324+ 32935+
33325+ /* xf86MonPtr MonInfo; */ 32936+ /* xf86MonPtr MonInfo; */
33326+ enum subpixel_order subpixel_order; 32937+ enum subpixel_order subpixel_order;
33327+ int mm_width, mm_height; 32938+ int mm_width, mm_height;
@@ -33440,7 +33051,7 @@ Index: linux-2.6.27/include/drm/drm_crtc.h
33440+extern struct drm_property *drm_property_create(struct drm_device *dev, int flags, 33051+extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
33441+ const char *name, int num_values); 33052+ const char *name, int num_values);
33442+extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); 33053+extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
33443+extern int drm_property_add_enum(struct drm_property *property, int index, 33054+extern int drm_property_add_enum(struct drm_property *property, int index,
33444+ uint32_t value, const char *name); 33055+ uint32_t value, const char *name);
33445+ 33056+
33446+/* IOCTLs */ 33057+/* IOCTLs */
@@ -33475,7 +33086,7 @@ Index: linux-2.6.27/include/drm/drm_crtc.h
33475Index: linux-2.6.27/include/drm/drm_edid.h 33086Index: linux-2.6.27/include/drm/drm_edid.h
33476=================================================================== 33087===================================================================
33477--- /dev/null 1970-01-01 00:00:00.000000000 +0000 33088--- /dev/null 1970-01-01 00:00:00.000000000 +0000
33478+++ linux-2.6.27/include/drm/drm_edid.h 2009-01-14 11:58:01.000000000 +0000 33089+++ linux-2.6.27/include/drm/drm_edid.h 2009-02-05 13:29:33.000000000 +0000
33479@@ -0,0 +1,179 @@ 33090@@ -0,0 +1,179 @@
33480+#ifndef __DRM_EDID_H__ 33091+#ifndef __DRM_EDID_H__
33481+#define __DRM_EDID_H__ 33092+#define __DRM_EDID_H__
@@ -33659,7 +33270,7 @@ Index: linux-2.6.27/include/drm/drm_edid.h
33659Index: linux-2.6.27/include/drm/drm_objects.h 33270Index: linux-2.6.27/include/drm/drm_objects.h
33660=================================================================== 33271===================================================================
33661--- /dev/null 1970-01-01 00:00:00.000000000 +0000 33272--- /dev/null 1970-01-01 00:00:00.000000000 +0000
33662+++ linux-2.6.27/include/drm/drm_objects.h 2009-01-14 11:58:01.000000000 +0000 33273+++ linux-2.6.27/include/drm/drm_objects.h 2009-02-05 13:29:33.000000000 +0000
33663@@ -0,0 +1,717 @@ 33274@@ -0,0 +1,717 @@
33664+/************************************************************************** 33275+/**************************************************************************
33665+ * 33276+ *
@@ -33858,7 +33469,7 @@ Index: linux-2.6.27/include/drm/drm_objects.h
33858+ * 33469+ *
33859+ * poll() : Call drm_fence_handler with any new information. 33470+ * poll() : Call drm_fence_handler with any new information.
33860+ * 33471+ *
33861+ * needed_flush() : Given the current state of the fence->type flags and previusly 33472+ * needed_flush() : Given the current state of the fence->type flags and previusly
33862+ * executed or queued flushes, return the type_flags that need flushing. 33473+ * executed or queued flushes, return the type_flags that need flushing.
33863+ * 33474+ *
33864+ * wait(): Wait for the "mask" flags to signal on a given fence, performing 33475+ * wait(): Wait for the "mask" flags to signal on a given fence, performing
@@ -34201,7 +33812,7 @@ Index: linux-2.6.27/include/drm/drm_objects.h
34201+ int (*command_stream_barrier) (struct drm_buffer_object *bo, 33812+ int (*command_stream_barrier) (struct drm_buffer_object *bo,
34202+ uint32_t new_fence_class, 33813+ uint32_t new_fence_class,
34203+ uint32_t new_fence_type, 33814+ uint32_t new_fence_type,
34204+ int no_wait); 33815+ int no_wait);
34205+}; 33816+};
34206+ 33817+
34207+/* 33818+/*
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0001-fastboot-retry-mounting-the-root-fs-if-we-can-t-fin.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0001-fastboot-retry-mounting-the-root-fs-if-we-can-t-fin.patch
new file mode 100644
index 0000000000..8f34a0f3f4
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0001-fastboot-retry-mounting-the-root-fs-if-we-can-t-fin.patch
@@ -0,0 +1,61 @@
1From 0384d086e31092628596af98b1e33fad586cef0a Mon Sep 17 00:00:00 2001
2From: Arjan van de Ven <arjan@linux.intel.com>
3Date: Sun, 20 Jul 2008 13:01:28 -0700
4Subject: [PATCH] fastboot: retry mounting the root fs if we can't find init
5
6currently we wait until all device init is done before trying to mount
7the root fs, and to consequently execute init.
8
9In preparation for relaxing the first delay, this patch adds a retry
10attempt in case /sbin/init is not found. Before retrying, the code
11will wait for all device init to complete.
12
13While this patch by itself doesn't gain boot time yet (it needs follow on
14patches), the alternative already is to panic()...
15
16Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
17---
18--- a/init/main.c 2009-01-07 18:29:11.000000000 -0800
19+++ b/init/main.c 2009-01-07 18:32:08.000000000 -0800
20@@ -837,6 +837,7 @@ static void run_init_process(char *init_
21 */
22 static noinline int init_post(void)
23 {
24+ int retry_count = 1;
25 /* need to finish all async __init code before freeing the memory */
26 async_synchronize_full();
27 free_initmem();
28@@ -859,6 +860,8 @@ static noinline int init_post(void)
29 ramdisk_execute_command);
30 }
31
32+retry:
33+
34 /*
35 * We try each of these until one succeeds.
36 *
37@@ -871,6 +874,23 @@ static noinline int init_post(void)
38 "defaults...\n", execute_command);
39 }
40 run_init_process("/sbin/init");
41+
42+ if (retry_count > 0) {
43+ retry_count--;
44+ /*
45+ * We haven't found init yet... potentially because the device
46+ * is still being probed. We need to
47+ * - flush keventd and friends
48+ * - wait for the known devices to complete their probing
49+ * - try to mount the root fs again
50+ */
51+ flush_scheduled_work();
52+ while (driver_probe_done() != 0)
53+ msleep(100);
54+ prepare_namespace();
55+ goto retry;
56+ }
57+
58 run_init_process("/etc/init");
59 run_init_process("/bin/init");
60 run_init_process("/bin/sh");
61
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0002-fastboot-remove-wait-for-all-devices-before-mounti.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0002-fastboot-remove-wait-for-all-devices-before-mounti.patch
new file mode 100644
index 0000000000..9ea6d62a63
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0002-fastboot-remove-wait-for-all-devices-before-mounti.patch
@@ -0,0 +1,38 @@
1From dce8113d033975f56630cf6d2a6a908cfb66059d Mon Sep 17 00:00:00 2001
2From: Arjan van de Ven <arjan@linux.intel.com>
3Date: Sun, 20 Jul 2008 13:12:16 -0700
4Subject: [PATCH] fastboot: remove "wait for all devices before mounting root" delay
5
6In the non-initrd case, we wait for all devices to finish their
7probing before we try to mount the rootfs.
8In practice, this means that we end up waiting 2 extra seconds for
9the PS/2 mouse probing even though the root holding device has been
10ready since a long time.
11
12The previous two patches in this series made the RAID autodetect code
13do it's own "wait for probing to be done" code, and added
14"wait and retry" functionality in case the root device isn't actually
15available.
16
17These two changes should make it safe to remove the delay itself,
18and this patch does this. On my test laptop, this reduces the boot time
19by 2 seconds (kernel time goes from 3.9 to 1.9 seconds).
20
21Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
22---
23--- a/init/do_mounts.c 2009-01-07 18:42:10.000000000 -0800
24+++ b/init/do_mounts.c 2009-01-07 18:43:02.000000000 -0800
25@@ -370,10 +370,12 @@ void __init prepare_namespace(void)
26 ssleep(root_delay);
27 }
28
29+#if 0
30 /* wait for the known devices to complete their probing */
31 while (driver_probe_done() != 0)
32 msleep(100);
33+#endif
34 async_synchronize_full();
35
36 md_run_setup();
37
38
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0003-fastboot-remove-duplicate-unpack_to_rootfs.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0003-fastboot-remove-duplicate-unpack_to_rootfs.patch
new file mode 100644
index 0000000000..ea4c617ed9
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0003-fastboot-remove-duplicate-unpack_to_rootfs.patch
@@ -0,0 +1,161 @@
1From 24559ecf972ff482222f6fc152f15468d2380e2d Mon Sep 17 00:00:00 2001
2From: Li, Shaohua <shaohua.li@intel.com>
3Date: Wed, 13 Aug 2008 17:26:01 +0800
4Subject: [PATCH] fastboot: remove duplicate unpack_to_rootfs()
5
6we check if initrd is initramfs first and then do real unpack. The
7check isn't required, we can directly do unpack. If initrd isn't
8initramfs, we can remove garbage. In my laptop, this saves 0.1s boot
9time. This penalizes non-initramfs case, but now initramfs is mostly
10widely used.
11
12Signed-off-by: Shaohua Li <shaohua.li@intel.com>
13Acked-by: Arjan van de Ven <arjan@infradead.org>
14Signed-off-by: Ingo Molnar <mingo@elte.hu>
15---
16 init/initramfs.c | 71 ++++++++++++++++++++++++++++++++++++++++++-----------
17 1 files changed, 56 insertions(+), 15 deletions(-)
18
19diff --git a/init/initramfs.c b/init/initramfs.c
20index 4f5ba75..6b5c1dc 100644
21--- a/init/initramfs.c
22+++ b/init/initramfs.c
23@@ -5,6 +5,7 @@
24 #include <linux/fcntl.h>
25 #include <linux/delay.h>
26 #include <linux/string.h>
27+#include <linux/dirent.h>
28 #include <linux/syscalls.h>
29 #include <linux/utime.h>
30
31@@ -166,8 +167,6 @@ static __initdata char *victim;
32 static __initdata unsigned count;
33 static __initdata loff_t this_header, next_header;
34
35-static __initdata int dry_run;
36-
37 static inline void __init eat(unsigned n)
38 {
39 victim += n;
40@@ -229,10 +228,6 @@ static int __init do_header(void)
41 parse_header(collected);
42 next_header = this_header + N_ALIGN(name_len) + body_len;
43 next_header = (next_header + 3) & ~3;
44- if (dry_run) {
45- read_into(name_buf, N_ALIGN(name_len), GotName);
46- return 0;
47- }
48 state = SkipIt;
49 if (name_len <= 0 || name_len > PATH_MAX)
50 return 0;
51@@ -303,8 +298,6 @@ static int __init do_name(void)
52 free_hash();
53 return 0;
54 }
55- if (dry_run)
56- return 0;
57 clean_path(collected, mode);
58 if (S_ISREG(mode)) {
59 int ml = maybe_link();
60@@ -475,10 +468,9 @@ static void __init flush_window(void)
61 outcnt = 0;
62 }
63
64-static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
65+static char * __init unpack_to_rootfs(char *buf, unsigned len)
66 {
67 int written;
68- dry_run = check_only;
69 header_buf = kmalloc(110, GFP_KERNEL);
70 symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
71 name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);
72@@ -573,10 +565,57 @@ skip:
73 initrd_end = 0;
74 }
75
76+#define BUF_SIZE 1024
77+static void __init clean_rootfs(void)
78+{
79+ int fd;
80+ void *buf;
81+ struct linux_dirent64 *dirp;
82+ int count;
83+
84+ fd = sys_open("/", O_RDONLY, 0);
85+ WARN_ON(fd < 0);
86+ if (fd < 0)
87+ return;
88+ buf = kzalloc(BUF_SIZE, GFP_KERNEL);
89+ WARN_ON(!buf);
90+ if (!buf) {
91+ sys_close(fd);
92+ return;
93+ }
94+
95+ dirp = buf;
96+ count = sys_getdents64(fd, dirp, BUF_SIZE);
97+ while (count > 0) {
98+ while (count > 0) {
99+ struct stat st;
100+ int ret;
101+
102+ ret = sys_newlstat(dirp->d_name, &st);
103+ WARN_ON_ONCE(ret);
104+ if (!ret) {
105+ if (S_ISDIR(st.st_mode))
106+ sys_rmdir(dirp->d_name);
107+ else
108+ sys_unlink(dirp->d_name);
109+ }
110+
111+ count -= dirp->d_reclen;
112+ dirp = (void *)dirp + dirp->d_reclen;
113+ }
114+ dirp = buf;
115+ memset(buf, 0, BUF_SIZE);
116+ count = sys_getdents64(fd, dirp, BUF_SIZE);
117+ }
118+
119+ sys_close(fd);
120+ kfree(buf);
121+}
122+
123 static int __init populate_rootfs(void)
124 {
125 char *err = unpack_to_rootfs(__initramfs_start,
126- __initramfs_end - __initramfs_start, 0);
127+ __initramfs_end - __initramfs_start);
128 if (err)
129 panic(err);
130 if (initrd_start) {
131@@ -584,13 +623,15 @@ static int __init populate_rootfs(void)
132 int fd;
133 printk(KERN_INFO "checking if image is initramfs...");
134 err = unpack_to_rootfs((char *)initrd_start,
135- initrd_end - initrd_start, 1);
136+ initrd_end - initrd_start);
137 if (!err) {
138 printk(" it is\n");
139- unpack_to_rootfs((char *)initrd_start,
140- initrd_end - initrd_start, 0);
141 free_initrd();
142 return 0;
143+ } else {
144+ clean_rootfs();
145+ unpack_to_rootfs(__initramfs_start,
146+ __initramfs_end - __initramfs_start);
147 }
148 printk("it isn't (%s); looks like an initrd\n", err);
149 fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
150@@ -603,7 +644,7 @@ static int __init populate_rootfs(void)
151 #else
152 printk(KERN_INFO "Unpacking initramfs...");
153 err = unpack_to_rootfs((char *)initrd_start,
154- initrd_end - initrd_start, 0);
155+ initrd_end - initrd_start);
156 if (err)
157 panic(err);
158 printk(" done\n");
159--
1601.5.5.1
161
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0004-superreadahead-patch.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0004-superreadahead-patch.patch
new file mode 100644
index 0000000000..e4e2001104
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0004-superreadahead-patch.patch
@@ -0,0 +1,66 @@
1From be9df3282d24a7326bba2eea986c79d822f0e998 Mon Sep 17 00:00:00 2001
2From: Arjan van de Ven <arjan@linux.intel.com>
3Date: Sun, 21 Sep 2008 11:58:27 -0700
4Subject: [PATCH] superreadahead patch
5
6---
7 fs/ext3/ioctl.c | 3 +++
8 fs/ext3/super.c | 1 +
9 include/linux/ext3_fs.h | 1 +
10 include/linux/fs.h | 2 ++
11 4 files changed, 7 insertions(+), 0 deletions(-)
12
13diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c
14index b7394d0..c2e7f23 100644
15--- a/fs/ext3/ioctl.c
16+++ b/fs/ext3/ioctl.c
17@@ -290,6 +290,9 @@ group_add_out:
18 mnt_drop_write(filp->f_path.mnt);
19 return err;
20 }
21+ case EXT3_IOC_INODE_JIFFIES: {
22+ return inode->created_when;
23+ }
24
25
26 default:
27diff --git a/fs/ext3/super.c b/fs/ext3/super.c
28index f6c94f2..268dd1d 100644
29--- a/fs/ext3/super.c
30+++ b/fs/ext3/super.c
31@@ -461,6 +461,7 @@ static struct inode *ext3_alloc_inode(struct super_block *sb)
32 #endif
33 ei->i_block_alloc_info = NULL;
34 ei->vfs_inode.i_version = 1;
35+ ei->vfs_inode.created_when = jiffies;
36 return &ei->vfs_inode;
37 }
38
39diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h
40index d14f029..fff5510 100644
41--- a/include/linux/ext3_fs.h
42+++ b/include/linux/ext3_fs.h
43@@ -225,6 +225,7 @@ struct ext3_new_group_data {
44 #endif
45 #define EXT3_IOC_GETRSVSZ _IOR('f', 5, long)
46 #define EXT3_IOC_SETRSVSZ _IOW('f', 6, long)
47+#define EXT3_IOC_INODE_JIFFIES _IOR('f', 19, long)
48
49 /*
50 * ioctl commands in 32 bit emulation
51diff --git a/include/linux/fs.h b/include/linux/fs.h
52index 4a853ef..c346136 100644
53--- a/include/linux/fs.h
54+++ b/include/linux/fs.h
55@@ -685,6 +685,8 @@ struct inode {
56 void *i_security;
57 #endif
58 void *i_private; /* fs or device private pointer */
59+
60+ unsigned long created_when; /* jiffies of creation time */
61 };
62
63 /*
64--
651.5.5.1
66
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0005-fastboot-async-enable-default.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0005-fastboot-async-enable-default.patch
new file mode 100644
index 0000000000..6eea4f6e17
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0005-fastboot-async-enable-default.patch
@@ -0,0 +1,12 @@
1--- a/kernel/async.c 2009-01-19 18:30:29.000000000 -0800
2+++ b/kernel/async.c 2009-01-19 18:31:12.000000000 -0800
3@@ -65,7 +65,7 @@ static LIST_HEAD(async_pending);
4 static LIST_HEAD(async_running);
5 static DEFINE_SPINLOCK(async_lock);
6
7-static int async_enabled = 0;
8+static int async_enabled = 1;
9
10 struct async_entry {
11 struct list_head list;
12
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0006-Revert-drm-i915-GEM-on-PAE-has-problems-disable.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0006-Revert-drm-i915-GEM-on-PAE-has-problems-disable.patch
new file mode 100644
index 0000000000..77c9fa6ef3
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0006-Revert-drm-i915-GEM-on-PAE-has-problems-disable.patch
@@ -0,0 +1,55 @@
1From ee977685870767221dc763338bb6ed5fd83f65be Mon Sep 17 00:00:00 2001
2From: Yong Wang <yong.y.wang@intel.com>
3Date: Tue, 6 Jan 2009 15:13:41 +0800
4Subject: [PATCH] Revert "drm/i915: GEM on PAE has problems - disable it for now."
5
6This reverts commit ac5c4e76180a74c7f922f6fa71ace0cef45fa433.
7---
8 drivers/gpu/drm/i915/i915_dma.c | 10 +---------
9 drivers/gpu/drm/i915/i915_drv.h | 2 --
10 2 files changed, 1 insertions(+), 11 deletions(-)
11
12diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
13index afa8a12..553dd4b 100644
14--- a/drivers/gpu/drm/i915/i915_dma.c
15+++ b/drivers/gpu/drm/i915/i915_dma.c
16@@ -717,7 +717,7 @@ static int i915_getparam(struct drm_device *dev, void *data,
17 value = dev->pci_device;
18 break;
19 case I915_PARAM_HAS_GEM:
20- value = dev_priv->has_gem;
21+ value = 1;
22 break;
23 default:
24 DRM_ERROR("Unknown parameter %d\n", param->param);
25@@ -830,14 +830,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
26
27 dev_priv->regs = ioremap(base, size);
28
29-#ifdef CONFIG_HIGHMEM64G
30- /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */
31- dev_priv->has_gem = 0;
32-#else
33- /* enable GEM by default */
34- dev_priv->has_gem = 1;
35-#endif
36-
37 i915_gem_load(dev);
38
39 /* Init HWS */
40diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
41index b3cc473..adc972c 100644
42--- a/drivers/gpu/drm/i915/i915_drv.h
43+++ b/drivers/gpu/drm/i915/i915_drv.h
44@@ -106,8 +106,6 @@ struct intel_opregion {
45 typedef struct drm_i915_private {
46 struct drm_device *dev;
47
48- int has_gem;
49-
50 void __iomem *regs;
51 drm_local_map_t *sarea;
52
53--
541.5.5.1
55
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0007-acer-error-msg.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0007-acer-error-msg.patch
new file mode 100644
index 0000000000..7bf897ab57
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/0007-acer-error-msg.patch
@@ -0,0 +1,17 @@
1From: Arjan van de Ven <arjan@linux.intel.com>
2Date: Fri, 23 Jan 2009
3
4Small fix changing error msg to info msg in acer wmi driver
5---
6diff -durp a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
7--- a/drivers/platform/x86/acer-wmi.c 2009-01-23 13:58:36.000000000 -0800
8+++ b/drivers/platform/x86/acer-wmi.c 2009-01-23 14:00:12.000000000 -0800
9@@ -1290,7 +1290,7 @@ static int __init acer_wmi_init(void)
10 AMW0_find_mailled();
11
12 if (!interface) {
13- printk(ACER_ERR "No or unsupported WMI interface, unable to "
14+ printk(ACER_INFO "No or unsupported WMI interface, unable to "
15 "load\n");
16 return -ENODEV;
17 }
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-menlow b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-menlow
new file mode 100644
index 0000000000..30c1656220
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-menlow
@@ -0,0 +1,3137 @@
1#
2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.27
4# Wed Jan 14 11:45:36 2009
5#
6# CONFIG_64BIT is not set
7CONFIG_X86_32=y
8# CONFIG_X86_64 is not set
9CONFIG_X86=y
10CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
11# CONFIG_GENERIC_LOCKBREAK is not set
12CONFIG_GENERIC_TIME=y
13CONFIG_GENERIC_CMOS_UPDATE=y
14CONFIG_CLOCKSOURCE_WATCHDOG=y
15CONFIG_GENERIC_CLOCKEVENTS=y
16CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
17CONFIG_LOCKDEP_SUPPORT=y
18CONFIG_STACKTRACE_SUPPORT=y
19CONFIG_HAVE_LATENCYTOP_SUPPORT=y
20CONFIG_FAST_CMPXCHG_LOCAL=y
21CONFIG_MMU=y
22CONFIG_ZONE_DMA=y
23CONFIG_GENERIC_ISA_DMA=y
24CONFIG_GENERIC_IOMAP=y
25CONFIG_GENERIC_BUG=y
26CONFIG_GENERIC_HWEIGHT=y
27# CONFIG_GENERIC_GPIO is not set
28CONFIG_ARCH_MAY_HAVE_PC_FDC=y
29# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
30CONFIG_RWSEM_XCHGADD_ALGORITHM=y
31# CONFIG_ARCH_HAS_ILOG2_U32 is not set
32# CONFIG_ARCH_HAS_ILOG2_U64 is not set
33CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
34CONFIG_GENERIC_CALIBRATE_DELAY=y
35# CONFIG_GENERIC_TIME_VSYSCALL is not set
36CONFIG_ARCH_HAS_CPU_RELAX=y
37CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
38CONFIG_HAVE_SETUP_PER_CPU_AREA=y
39# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set
40CONFIG_ARCH_HIBERNATION_POSSIBLE=y
41CONFIG_ARCH_SUSPEND_POSSIBLE=y
42# CONFIG_ZONE_DMA32 is not set
43CONFIG_ARCH_POPULATES_NODE_MAP=y
44# CONFIG_AUDIT_ARCH is not set
45CONFIG_ARCH_SUPPORTS_AOUT=y
46CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
47CONFIG_GENERIC_HARDIRQS=y
48CONFIG_GENERIC_IRQ_PROBE=y
49CONFIG_GENERIC_PENDING_IRQ=y
50CONFIG_X86_SMP=y
51CONFIG_X86_32_SMP=y
52CONFIG_X86_HT=y
53CONFIG_X86_BIOS_REBOOT=y
54CONFIG_X86_TRAMPOLINE=y
55CONFIG_KTIME_SCALAR=y
56CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
57
58#
59# General setup
60#
61CONFIG_EXPERIMENTAL=y
62CONFIG_LOCK_KERNEL=y
63CONFIG_INIT_ENV_ARG_LIMIT=32
64CONFIG_LOCALVERSION="-default"
65# CONFIG_LOCALVERSION_AUTO is not set
66CONFIG_SWAP=y
67CONFIG_SYSVIPC=y
68CONFIG_SYSVIPC_SYSCTL=y
69CONFIG_POSIX_MQUEUE=y
70CONFIG_BSD_PROCESS_ACCT=y
71CONFIG_BSD_PROCESS_ACCT_V3=y
72CONFIG_TASKSTATS=y
73CONFIG_TASK_DELAY_ACCT=y
74# CONFIG_TASK_XACCT is not set
75CONFIG_AUDIT=y
76CONFIG_AUDITSYSCALL=y
77CONFIG_AUDIT_TREE=y
78CONFIG_IKCONFIG=y
79CONFIG_IKCONFIG_PROC=y
80CONFIG_LOG_BUF_SHIFT=15
81# CONFIG_CGROUPS is not set
82CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
83# CONFIG_GROUP_SCHED is not set
84CONFIG_SYSFS_DEPRECATED=y
85CONFIG_SYSFS_DEPRECATED_V2=y
86CONFIG_RELAY=y
87CONFIG_NAMESPACES=y
88# CONFIG_UTS_NS is not set
89# CONFIG_IPC_NS is not set
90# CONFIG_USER_NS is not set
91# CONFIG_PID_NS is not set
92CONFIG_BLK_DEV_INITRD=y
93CONFIG_INITRAMFS_SOURCE=""
94CONFIG_CC_OPTIMIZE_FOR_SIZE=y
95# CONFIG_FASTBOOT is not set
96CONFIG_SYSCTL=y
97# CONFIG_EMBEDDED is not set
98CONFIG_UID16=y
99CONFIG_SYSCTL_SYSCALL=y
100CONFIG_KALLSYMS=y
101CONFIG_KALLSYMS_ALL=y
102# CONFIG_KALLSYMS_EXTRA_PASS is not set
103CONFIG_HOTPLUG=y
104CONFIG_PRINTK=y
105CONFIG_BUG=y
106CONFIG_ELF_CORE=y
107CONFIG_PCSPKR_PLATFORM=y
108CONFIG_COMPAT_BRK=y
109CONFIG_BASE_FULL=y
110CONFIG_FUTEX=y
111CONFIG_ANON_INODES=y
112CONFIG_EPOLL=y
113CONFIG_SIGNALFD=y
114CONFIG_TIMERFD=y
115CONFIG_EVENTFD=y
116CONFIG_SHMEM=y
117CONFIG_VM_EVENT_COUNTERS=y
118CONFIG_SLAB=y
119# CONFIG_SLUB is not set
120# CONFIG_SLOB is not set
121CONFIG_PROFILING=y
122# CONFIG_MARKERS is not set
123# CONFIG_OPROFILE is not set
124CONFIG_HAVE_OPROFILE=y
125# CONFIG_KPROBES is not set
126CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
127CONFIG_HAVE_IOREMAP_PROT=y
128CONFIG_HAVE_KPROBES=y
129CONFIG_HAVE_KRETPROBES=y
130# CONFIG_HAVE_ARCH_TRACEHOOK is not set
131# CONFIG_HAVE_DMA_ATTRS is not set
132CONFIG_USE_GENERIC_SMP_HELPERS=y
133# CONFIG_HAVE_CLK is not set
134CONFIG_PROC_PAGE_MONITOR=y
135CONFIG_HAVE_GENERIC_DMA_COHERENT=y
136CONFIG_SLABINFO=y
137CONFIG_RT_MUTEXES=y
138# CONFIG_TINY_SHMEM is not set
139CONFIG_BASE_SMALL=0
140CONFIG_MODULES=y
141# CONFIG_MODULE_FORCE_LOAD is not set
142CONFIG_MODULE_UNLOAD=y
143CONFIG_MODULE_FORCE_UNLOAD=y
144CONFIG_MODVERSIONS=y
145CONFIG_MODULE_SRCVERSION_ALL=y
146CONFIG_KMOD=y
147CONFIG_STOP_MACHINE=y
148CONFIG_BLOCK=y
149CONFIG_LBD=y
150CONFIG_BLK_DEV_IO_TRACE=y
151CONFIG_LSF=y
152# CONFIG_BLK_DEV_BSG is not set
153# CONFIG_BLK_DEV_INTEGRITY is not set
154
155#
156# IO Schedulers
157#
158CONFIG_IOSCHED_NOOP=y
159CONFIG_IOSCHED_AS=y
160CONFIG_IOSCHED_DEADLINE=y
161CONFIG_IOSCHED_CFQ=y
162# CONFIG_DEFAULT_AS is not set
163# CONFIG_DEFAULT_DEADLINE is not set
164CONFIG_DEFAULT_CFQ=y
165# CONFIG_DEFAULT_NOOP is not set
166CONFIG_DEFAULT_IOSCHED="cfq"
167CONFIG_CLASSIC_RCU=y
168
169#
170# Processor type and features
171#
172CONFIG_TICK_ONESHOT=y
173CONFIG_NO_HZ=y
174CONFIG_HIGH_RES_TIMERS=y
175CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
176CONFIG_SMP=y
177CONFIG_X86_FIND_SMP_CONFIG=y
178CONFIG_X86_MPPARSE=y
179# CONFIG_X86_PC is not set
180# CONFIG_X86_ELAN is not set
181# CONFIG_X86_VOYAGER is not set
182CONFIG_X86_GENERICARCH=y
183# CONFIG_X86_NUMAQ is not set
184# CONFIG_X86_SUMMIT is not set
185# CONFIG_X86_ES7000 is not set
186# CONFIG_X86_BIGSMP is not set
187# CONFIG_X86_VSMP is not set
188# CONFIG_X86_RDC321X is not set
189CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
190# CONFIG_PARAVIRT_GUEST is not set
191# CONFIG_MEMTEST is not set
192CONFIG_X86_CYCLONE_TIMER=y
193# CONFIG_M386 is not set
194# CONFIG_M486 is not set
195CONFIG_M586=y
196# CONFIG_M586TSC is not set
197# CONFIG_M586MMX is not set
198# CONFIG_M686 is not set
199# CONFIG_MPENTIUMII is not set
200# CONFIG_MPENTIUMIII is not set
201# CONFIG_MPENTIUMM is not set
202# CONFIG_MPENTIUM4 is not set
203# CONFIG_MK6 is not set
204# CONFIG_MK7 is not set
205# CONFIG_MK8 is not set
206# CONFIG_MCRUSOE is not set
207# CONFIG_MEFFICEON is not set
208# CONFIG_MWINCHIPC6 is not set
209# CONFIG_MWINCHIP2 is not set
210# CONFIG_MWINCHIP3D is not set
211# CONFIG_MGEODEGX1 is not set
212# CONFIG_MGEODE_LX is not set
213# CONFIG_MCYRIXIII is not set
214# CONFIG_MVIAC3_2 is not set
215# CONFIG_MVIAC7 is not set
216# CONFIG_MPSC is not set
217# CONFIG_MCORE2 is not set
218# CONFIG_GENERIC_CPU is not set
219CONFIG_X86_GENERIC=y
220CONFIG_X86_CPU=y
221CONFIG_X86_CMPXCHG=y
222CONFIG_X86_L1_CACHE_SHIFT=7
223CONFIG_X86_XADD=y
224CONFIG_X86_PPRO_FENCE=y
225CONFIG_X86_F00F_BUG=y
226CONFIG_X86_WP_WORKS_OK=y
227CONFIG_X86_INVLPG=y
228CONFIG_X86_BSWAP=y
229CONFIG_X86_POPAD_OK=y
230CONFIG_X86_ALIGNMENT_16=y
231CONFIG_X86_INTEL_USERCOPY=y
232CONFIG_X86_MINIMUM_CPU_FAMILY=4
233CONFIG_HPET_TIMER=y
234CONFIG_DMI=y
235# CONFIG_IOMMU_HELPER is not set
236CONFIG_NR_CPUS=8
237# CONFIG_SCHED_SMT is not set
238CONFIG_SCHED_MC=y
239# CONFIG_PREEMPT_NONE is not set
240CONFIG_PREEMPT_VOLUNTARY=y
241# CONFIG_PREEMPT is not set
242CONFIG_X86_LOCAL_APIC=y
243CONFIG_X86_IO_APIC=y
244CONFIG_X86_MCE=y
245CONFIG_X86_MCE_NONFATAL=y
246# CONFIG_X86_MCE_P4THERMAL is not set
247CONFIG_VM86=y
248# CONFIG_TOSHIBA is not set
249# CONFIG_I8K is not set
250CONFIG_X86_REBOOTFIXUPS=y
251CONFIG_MICROCODE=m
252CONFIG_MICROCODE_OLD_INTERFACE=y
253CONFIG_X86_MSR=m
254CONFIG_X86_CPUID=m
255# CONFIG_NOHIGHMEM is not set
256CONFIG_HIGHMEM4G=y
257# CONFIG_HIGHMEM64G is not set
258CONFIG_PAGE_OFFSET=0xC0000000
259CONFIG_HIGHMEM=y
260CONFIG_SELECT_MEMORY_MODEL=y
261CONFIG_FLATMEM_MANUAL=y
262# CONFIG_DISCONTIGMEM_MANUAL is not set
263# CONFIG_SPARSEMEM_MANUAL is not set
264CONFIG_FLATMEM=y
265CONFIG_FLAT_NODE_MEM_MAP=y
266# CONFIG_SPARSEMEM_STATIC is not set
267# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
268CONFIG_PAGEFLAGS_EXTENDED=y
269CONFIG_SPLIT_PTLOCK_CPUS=4
270# CONFIG_RESOURCES_64BIT is not set
271CONFIG_ZONE_DMA_FLAG=1
272CONFIG_BOUNCE=y
273CONFIG_VIRT_TO_BUS=y
274CONFIG_HIGHPTE=y
275# CONFIG_MATH_EMULATION is not set
276CONFIG_MTRR=y
277# CONFIG_MTRR_SANITIZER is not set
278# CONFIG_X86_PAT is not set
279CONFIG_EFI=y
280# CONFIG_IRQBALANCE is not set
281CONFIG_SECCOMP=y
282# CONFIG_HZ_100 is not set
283CONFIG_HZ_250=y
284# CONFIG_HZ_300 is not set
285# CONFIG_HZ_1000 is not set
286CONFIG_HZ=250
287CONFIG_SCHED_HRTICK=y
288CONFIG_KEXEC=y
289# CONFIG_CRASH_DUMP is not set
290# CONFIG_KEXEC_JUMP is not set
291CONFIG_PHYSICAL_START=0x100000
292# CONFIG_RELOCATABLE is not set
293CONFIG_PHYSICAL_ALIGN=0x100000
294CONFIG_HOTPLUG_CPU=y
295CONFIG_COMPAT_VDSO=y
296CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
297
298#
299# Power management options
300#
301CONFIG_PM=y
302# CONFIG_PM_DEBUG is not set
303CONFIG_PM_SLEEP_SMP=y
304CONFIG_PM_SLEEP=y
305CONFIG_SUSPEND=y
306CONFIG_SUSPEND_FREEZER=y
307CONFIG_HIBERNATION=y
308CONFIG_PM_STD_PARTITION=""
309CONFIG_ACPI=y
310CONFIG_ACPI_SLEEP=y
311CONFIG_ACPI_PROCFS=y
312CONFIG_ACPI_PROCFS_POWER=y
313CONFIG_ACPI_SYSFS_POWER=y
314CONFIG_ACPI_PROC_EVENT=y
315CONFIG_ACPI_AC=y
316CONFIG_ACPI_BATTERY=y
317CONFIG_ACPI_BUTTON=y
318CONFIG_ACPI_VIDEO=y
319CONFIG_ACPI_FAN=y
320CONFIG_ACPI_DOCK=y
321# CONFIG_ACPI_BAY is not set
322CONFIG_ACPI_PROCESSOR=y
323CONFIG_ACPI_HOTPLUG_CPU=y
324CONFIG_ACPI_THERMAL=y
325# CONFIG_ACPI_WMI is not set
326# CONFIG_ACPI_ASUS is not set
327# CONFIG_ACPI_TOSHIBA is not set
328CONFIG_ACPI_CUSTOM_DSDT_FILE=""
329# CONFIG_ACPI_CUSTOM_DSDT is not set
330CONFIG_ACPI_BLACKLIST_YEAR=2001
331# CONFIG_ACPI_DEBUG is not set
332CONFIG_ACPI_EC=y
333# CONFIG_ACPI_PCI_SLOT is not set
334CONFIG_ACPI_POWER=y
335CONFIG_ACPI_SYSTEM=y
336CONFIG_X86_PM_TIMER=y
337CONFIG_ACPI_CONTAINER=y
338CONFIG_ACPI_SBS=y
339CONFIG_X86_APM_BOOT=y
340CONFIG_APM=y
341# CONFIG_APM_IGNORE_USER_SUSPEND is not set
342CONFIG_APM_DO_ENABLE=y
343# CONFIG_APM_CPU_IDLE is not set
344CONFIG_APM_DISPLAY_BLANK=y
345CONFIG_APM_ALLOW_INTS=y
346# CONFIG_APM_REAL_MODE_POWER_OFF is not set
347
348#
349# CPU Frequency scaling
350#
351CONFIG_CPU_FREQ=y
352CONFIG_CPU_FREQ_TABLE=y
353# CONFIG_CPU_FREQ_DEBUG is not set
354CONFIG_CPU_FREQ_STAT=m
355CONFIG_CPU_FREQ_STAT_DETAILS=y
356# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
357# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
358CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
359# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
360# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
361CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
362CONFIG_CPU_FREQ_GOV_POWERSAVE=m
363CONFIG_CPU_FREQ_GOV_USERSPACE=y
364CONFIG_CPU_FREQ_GOV_ONDEMAND=m
365CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
366
367#
368# CPUFreq processor drivers
369#
370CONFIG_X86_ACPI_CPUFREQ=y
371# CONFIG_X86_POWERNOW_K6 is not set
372# CONFIG_X86_POWERNOW_K7 is not set
373# CONFIG_X86_POWERNOW_K8 is not set
374# CONFIG_X86_GX_SUSPMOD is not set
375CONFIG_X86_SPEEDSTEP_CENTRINO=m
376CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y
377CONFIG_X86_SPEEDSTEP_ICH=m
378CONFIG_X86_SPEEDSTEP_SMI=m
379CONFIG_X86_P4_CLOCKMOD=m
380# CONFIG_X86_CPUFREQ_NFORCE2 is not set
381# CONFIG_X86_LONGRUN is not set
382# CONFIG_X86_LONGHAUL is not set
383# CONFIG_X86_E_POWERSAVER is not set
384
385#
386# shared options
387#
388# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
389CONFIG_X86_SPEEDSTEP_LIB=m
390CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y
391CONFIG_CPU_IDLE=y
392CONFIG_CPU_IDLE_GOV_LADDER=y
393CONFIG_CPU_IDLE_GOV_MENU=y
394
395#
396# Bus options (PCI etc.)
397#
398CONFIG_PCI=y
399# CONFIG_PCI_GOBIOS is not set
400# CONFIG_PCI_GOMMCONFIG is not set
401# CONFIG_PCI_GODIRECT is not set
402# CONFIG_PCI_GOOLPC is not set
403CONFIG_PCI_GOANY=y
404CONFIG_PCI_BIOS=y
405CONFIG_PCI_DIRECT=y
406CONFIG_PCI_MMCONFIG=y
407CONFIG_PCI_DOMAINS=y
408CONFIG_PCIEPORTBUS=y
409CONFIG_HOTPLUG_PCI_PCIE=m
410CONFIG_PCIEAER=y
411# CONFIG_PCIEASPM is not set
412CONFIG_ARCH_SUPPORTS_MSI=y
413CONFIG_PCI_MSI=y
414CONFIG_PCI_LEGACY=y
415# CONFIG_PCI_DEBUG is not set
416CONFIG_HT_IRQ=y
417CONFIG_ISA_DMA_API=y
418CONFIG_ISA=y
419# CONFIG_EISA is not set
420# CONFIG_MCA is not set
421# CONFIG_SCx200 is not set
422# CONFIG_OLPC is not set
423# CONFIG_PCCARD is not set
424CONFIG_HOTPLUG_PCI=m
425CONFIG_HOTPLUG_PCI_FAKE=m
426# CONFIG_HOTPLUG_PCI_COMPAQ is not set
427# CONFIG_HOTPLUG_PCI_IBM is not set
428CONFIG_HOTPLUG_PCI_ACPI=m
429CONFIG_HOTPLUG_PCI_ACPI_IBM=m
430CONFIG_HOTPLUG_PCI_CPCI=y
431CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
432CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
433CONFIG_HOTPLUG_PCI_SHPC=m
434
435#
436# Executable file formats / Emulations
437#
438CONFIG_BINFMT_ELF=y
439CONFIG_BINFMT_AOUT=m
440CONFIG_BINFMT_MISC=m
441CONFIG_NET=y
442
443#
444# Networking options
445#
446CONFIG_PACKET=m
447CONFIG_PACKET_MMAP=y
448CONFIG_UNIX=y
449CONFIG_XFRM=y
450CONFIG_XFRM_USER=m
451# CONFIG_XFRM_SUB_POLICY is not set
452# CONFIG_XFRM_MIGRATE is not set
453# CONFIG_XFRM_STATISTICS is not set
454CONFIG_XFRM_IPCOMP=m
455CONFIG_NET_KEY=m
456# CONFIG_NET_KEY_MIGRATE is not set
457CONFIG_INET=y
458CONFIG_IP_MULTICAST=y
459CONFIG_IP_ADVANCED_ROUTER=y
460CONFIG_ASK_IP_FIB_HASH=y
461# CONFIG_IP_FIB_TRIE is not set
462CONFIG_IP_FIB_HASH=y
463CONFIG_IP_MULTIPLE_TABLES=y
464CONFIG_IP_ROUTE_MULTIPATH=y
465CONFIG_IP_ROUTE_VERBOSE=y
466CONFIG_IP_PNP=y
467CONFIG_IP_PNP_DHCP=y
468CONFIG_IP_PNP_BOOTP=y
469CONFIG_IP_PNP_RARP=y
470CONFIG_NET_IPIP=m
471CONFIG_NET_IPGRE=m
472CONFIG_NET_IPGRE_BROADCAST=y
473CONFIG_IP_MROUTE=y
474CONFIG_IP_PIMSM_V1=y
475CONFIG_IP_PIMSM_V2=y
476# CONFIG_ARPD is not set
477CONFIG_SYN_COOKIES=y
478CONFIG_INET_AH=m
479CONFIG_INET_ESP=m
480CONFIG_INET_IPCOMP=m
481CONFIG_INET_XFRM_TUNNEL=m
482CONFIG_INET_TUNNEL=m
483CONFIG_INET_XFRM_MODE_TRANSPORT=m
484CONFIG_INET_XFRM_MODE_TUNNEL=m
485CONFIG_INET_XFRM_MODE_BEET=y
486# CONFIG_INET_LRO is not set
487CONFIG_INET_DIAG=m
488CONFIG_INET_TCP_DIAG=m
489CONFIG_TCP_CONG_ADVANCED=y
490CONFIG_TCP_CONG_BIC=m
491CONFIG_TCP_CONG_CUBIC=m
492CONFIG_TCP_CONG_WESTWOOD=m
493CONFIG_TCP_CONG_HTCP=m
494CONFIG_TCP_CONG_HSTCP=m
495CONFIG_TCP_CONG_HYBLA=m
496CONFIG_TCP_CONG_VEGAS=m
497CONFIG_TCP_CONG_SCALABLE=m
498CONFIG_TCP_CONG_LP=m
499CONFIG_TCP_CONG_VENO=m
500# CONFIG_TCP_CONG_YEAH is not set
501# CONFIG_TCP_CONG_ILLINOIS is not set
502# CONFIG_DEFAULT_BIC is not set
503# CONFIG_DEFAULT_CUBIC is not set
504# CONFIG_DEFAULT_HTCP is not set
505# CONFIG_DEFAULT_VEGAS is not set
506# CONFIG_DEFAULT_WESTWOOD is not set
507CONFIG_DEFAULT_RENO=y
508CONFIG_DEFAULT_TCP_CONG="reno"
509# CONFIG_TCP_MD5SIG is not set
510CONFIG_IP_VS=m
511# CONFIG_IP_VS_DEBUG is not set
512CONFIG_IP_VS_TAB_BITS=12
513
514#
515# IPVS transport protocol load balancing support
516#
517CONFIG_IP_VS_PROTO_TCP=y
518CONFIG_IP_VS_PROTO_UDP=y
519CONFIG_IP_VS_PROTO_ESP=y
520CONFIG_IP_VS_PROTO_AH=y
521
522#
523# IPVS scheduler
524#
525CONFIG_IP_VS_RR=m
526CONFIG_IP_VS_WRR=m
527CONFIG_IP_VS_LC=m
528CONFIG_IP_VS_WLC=m
529CONFIG_IP_VS_LBLC=m
530CONFIG_IP_VS_LBLCR=m
531CONFIG_IP_VS_DH=m
532CONFIG_IP_VS_SH=m
533CONFIG_IP_VS_SED=m
534CONFIG_IP_VS_NQ=m
535
536#
537# IPVS application helper
538#
539CONFIG_IP_VS_FTP=m
540CONFIG_IPV6=m
541CONFIG_IPV6_PRIVACY=y
542CONFIG_IPV6_ROUTER_PREF=y
543CONFIG_IPV6_ROUTE_INFO=y
544# CONFIG_IPV6_OPTIMISTIC_DAD is not set
545CONFIG_INET6_AH=m
546CONFIG_INET6_ESP=m
547CONFIG_INET6_IPCOMP=m
548# CONFIG_IPV6_MIP6 is not set
549CONFIG_INET6_XFRM_TUNNEL=m
550CONFIG_INET6_TUNNEL=m
551CONFIG_INET6_XFRM_MODE_TRANSPORT=m
552CONFIG_INET6_XFRM_MODE_TUNNEL=m
553CONFIG_INET6_XFRM_MODE_BEET=m
554# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
555CONFIG_IPV6_SIT=m
556CONFIG_IPV6_NDISC_NODETYPE=y
557CONFIG_IPV6_TUNNEL=m
558# CONFIG_IPV6_MULTIPLE_TABLES is not set
559# CONFIG_IPV6_MROUTE is not set
560# CONFIG_NETLABEL is not set
561CONFIG_NETWORK_SECMARK=y
562CONFIG_NETFILTER=y
563# CONFIG_NETFILTER_DEBUG is not set
564CONFIG_NETFILTER_ADVANCED=y
565CONFIG_BRIDGE_NETFILTER=y
566
567#
568# Core Netfilter Configuration
569#
570CONFIG_NETFILTER_NETLINK=m
571CONFIG_NETFILTER_NETLINK_QUEUE=m
572CONFIG_NETFILTER_NETLINK_LOG=m
573# CONFIG_NF_CONNTRACK is not set
574CONFIG_NETFILTER_XTABLES=m
575CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
576# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
577CONFIG_NETFILTER_XT_TARGET_MARK=m
578CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
579# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
580# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
581# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
582CONFIG_NETFILTER_XT_TARGET_SECMARK=m
583# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
584# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
585CONFIG_NETFILTER_XT_MATCH_COMMENT=m
586CONFIG_NETFILTER_XT_MATCH_DCCP=m
587# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
588CONFIG_NETFILTER_XT_MATCH_ESP=m
589# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
590CONFIG_NETFILTER_XT_MATCH_LENGTH=m
591CONFIG_NETFILTER_XT_MATCH_LIMIT=m
592CONFIG_NETFILTER_XT_MATCH_MAC=m
593CONFIG_NETFILTER_XT_MATCH_MARK=m
594# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
595CONFIG_NETFILTER_XT_MATCH_POLICY=m
596CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
597CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
598CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
599CONFIG_NETFILTER_XT_MATCH_QUOTA=m
600# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
601CONFIG_NETFILTER_XT_MATCH_REALM=m
602CONFIG_NETFILTER_XT_MATCH_SCTP=m
603CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
604CONFIG_NETFILTER_XT_MATCH_STRING=m
605CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
606# CONFIG_NETFILTER_XT_MATCH_TIME is not set
607# CONFIG_NETFILTER_XT_MATCH_U32 is not set
608# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
609
610#
611# IP: Netfilter Configuration
612#
613CONFIG_IP_NF_QUEUE=m
614CONFIG_IP_NF_IPTABLES=m
615CONFIG_IP_NF_MATCH_RECENT=m
616CONFIG_IP_NF_MATCH_ECN=m
617CONFIG_IP_NF_MATCH_AH=m
618CONFIG_IP_NF_MATCH_TTL=m
619CONFIG_IP_NF_MATCH_ADDRTYPE=m
620CONFIG_IP_NF_FILTER=m
621CONFIG_IP_NF_TARGET_REJECT=m
622CONFIG_IP_NF_TARGET_LOG=m
623CONFIG_IP_NF_TARGET_ULOG=m
624CONFIG_IP_NF_MANGLE=m
625CONFIG_IP_NF_TARGET_ECN=m
626CONFIG_IP_NF_TARGET_TTL=m
627CONFIG_IP_NF_RAW=m
628# CONFIG_IP_NF_SECURITY is not set
629CONFIG_IP_NF_ARPTABLES=m
630CONFIG_IP_NF_ARPFILTER=m
631CONFIG_IP_NF_ARP_MANGLE=m
632
633#
634# IPv6: Netfilter Configuration
635#
636CONFIG_IP6_NF_QUEUE=m
637CONFIG_IP6_NF_IPTABLES=m
638CONFIG_IP6_NF_MATCH_RT=m
639CONFIG_IP6_NF_MATCH_OPTS=m
640CONFIG_IP6_NF_MATCH_FRAG=m
641CONFIG_IP6_NF_MATCH_HL=m
642CONFIG_IP6_NF_MATCH_IPV6HEADER=m
643CONFIG_IP6_NF_MATCH_AH=m
644# CONFIG_IP6_NF_MATCH_MH is not set
645CONFIG_IP6_NF_MATCH_EUI64=m
646CONFIG_IP6_NF_FILTER=m
647CONFIG_IP6_NF_TARGET_LOG=m
648CONFIG_IP6_NF_TARGET_REJECT=m
649CONFIG_IP6_NF_MANGLE=m
650CONFIG_IP6_NF_TARGET_HL=m
651CONFIG_IP6_NF_RAW=m
652# CONFIG_IP6_NF_SECURITY is not set
653
654#
655# DECnet: Netfilter Configuration
656#
657CONFIG_DECNET_NF_GRABULATOR=m
658
659#
660# Bridge: Netfilter Configuration
661#
662CONFIG_BRIDGE_NF_EBTABLES=m
663CONFIG_BRIDGE_EBT_BROUTE=m
664CONFIG_BRIDGE_EBT_T_FILTER=m
665CONFIG_BRIDGE_EBT_T_NAT=m
666CONFIG_BRIDGE_EBT_802_3=m
667CONFIG_BRIDGE_EBT_AMONG=m
668CONFIG_BRIDGE_EBT_ARP=m
669CONFIG_BRIDGE_EBT_IP=m
670# CONFIG_BRIDGE_EBT_IP6 is not set
671CONFIG_BRIDGE_EBT_LIMIT=m
672CONFIG_BRIDGE_EBT_MARK=m
673CONFIG_BRIDGE_EBT_PKTTYPE=m
674CONFIG_BRIDGE_EBT_STP=m
675CONFIG_BRIDGE_EBT_VLAN=m
676CONFIG_BRIDGE_EBT_ARPREPLY=m
677CONFIG_BRIDGE_EBT_DNAT=m
678CONFIG_BRIDGE_EBT_MARK_T=m
679CONFIG_BRIDGE_EBT_REDIRECT=m
680CONFIG_BRIDGE_EBT_SNAT=m
681CONFIG_BRIDGE_EBT_LOG=m
682CONFIG_BRIDGE_EBT_ULOG=m
683# CONFIG_BRIDGE_EBT_NFLOG is not set
684CONFIG_IP_DCCP=m
685CONFIG_INET_DCCP_DIAG=m
686CONFIG_IP_DCCP_ACKVEC=y
687
688#
689# DCCP CCIDs Configuration (EXPERIMENTAL)
690#
691CONFIG_IP_DCCP_CCID2=m
692# CONFIG_IP_DCCP_CCID2_DEBUG is not set
693CONFIG_IP_DCCP_CCID3=m
694# CONFIG_IP_DCCP_CCID3_DEBUG is not set
695CONFIG_IP_DCCP_CCID3_RTO=100
696CONFIG_IP_DCCP_TFRC_LIB=m
697
698#
699# DCCP Kernel Hacking
700#
701# CONFIG_IP_DCCP_DEBUG is not set
702CONFIG_IP_SCTP=m
703# CONFIG_SCTP_DBG_MSG is not set
704# CONFIG_SCTP_DBG_OBJCNT is not set
705# CONFIG_SCTP_HMAC_NONE is not set
706# CONFIG_SCTP_HMAC_SHA1 is not set
707CONFIG_SCTP_HMAC_MD5=y
708# CONFIG_TIPC is not set
709CONFIG_ATM=m
710CONFIG_ATM_CLIP=m
711CONFIG_ATM_CLIP_NO_ICMP=y
712CONFIG_ATM_LANE=m
713CONFIG_ATM_MPOA=m
714CONFIG_ATM_BR2684=m
715# CONFIG_ATM_BR2684_IPFILTER is not set
716CONFIG_STP=m
717CONFIG_BRIDGE=m
718CONFIG_VLAN_8021Q=m
719# CONFIG_VLAN_8021Q_GVRP is not set
720CONFIG_DECNET=m
721CONFIG_DECNET_ROUTER=y
722CONFIG_LLC=m
723CONFIG_LLC2=m
724CONFIG_IPX=m
725# CONFIG_IPX_INTERN is not set
726CONFIG_ATALK=m
727CONFIG_DEV_APPLETALK=m
728CONFIG_LTPC=m
729CONFIG_COPS=m
730CONFIG_COPS_DAYNA=y
731CONFIG_COPS_TANGENT=y
732CONFIG_IPDDP=m
733CONFIG_IPDDP_ENCAP=y
734CONFIG_IPDDP_DECAP=y
735CONFIG_X25=m
736CONFIG_LAPB=m
737CONFIG_ECONET=m
738# CONFIG_ECONET_AUNUDP is not set
739# CONFIG_ECONET_NATIVE is not set
740CONFIG_WAN_ROUTER=m
741CONFIG_NET_SCHED=y
742
743#
744# Queueing/Scheduling
745#
746CONFIG_NET_SCH_CBQ=m
747CONFIG_NET_SCH_HTB=m
748CONFIG_NET_SCH_HFSC=m
749CONFIG_NET_SCH_ATM=m
750CONFIG_NET_SCH_PRIO=m
751CONFIG_NET_SCH_RED=m
752CONFIG_NET_SCH_SFQ=m
753CONFIG_NET_SCH_TEQL=m
754CONFIG_NET_SCH_TBF=m
755CONFIG_NET_SCH_GRED=m
756CONFIG_NET_SCH_DSMARK=m
757CONFIG_NET_SCH_NETEM=m
758CONFIG_NET_SCH_INGRESS=m
759
760#
761# Classification
762#
763CONFIG_NET_CLS=y
764CONFIG_NET_CLS_BASIC=m
765CONFIG_NET_CLS_TCINDEX=m
766CONFIG_NET_CLS_ROUTE4=m
767CONFIG_NET_CLS_ROUTE=y
768CONFIG_NET_CLS_FW=m
769CONFIG_NET_CLS_U32=m
770CONFIG_CLS_U32_PERF=y
771CONFIG_CLS_U32_MARK=y
772CONFIG_NET_CLS_RSVP=m
773CONFIG_NET_CLS_RSVP6=m
774# CONFIG_NET_CLS_FLOW is not set
775# CONFIG_NET_EMATCH is not set
776CONFIG_NET_CLS_ACT=y
777CONFIG_NET_ACT_POLICE=m
778CONFIG_NET_ACT_GACT=m
779CONFIG_GACT_PROB=y
780CONFIG_NET_ACT_MIRRED=m
781CONFIG_NET_ACT_IPT=m
782# CONFIG_NET_ACT_NAT is not set
783CONFIG_NET_ACT_PEDIT=m
784CONFIG_NET_ACT_SIMP=m
785# CONFIG_NET_CLS_IND is not set
786CONFIG_NET_SCH_FIFO=y
787
788#
789# Network testing
790#
791CONFIG_NET_PKTGEN=m
792# CONFIG_HAMRADIO is not set
793# CONFIG_CAN is not set
794# CONFIG_IRDA is not set
795CONFIG_BT=m
796CONFIG_BT_L2CAP=m
797CONFIG_BT_SCO=m
798CONFIG_BT_RFCOMM=m
799CONFIG_BT_RFCOMM_TTY=y
800CONFIG_BT_BNEP=m
801CONFIG_BT_BNEP_MC_FILTER=y
802CONFIG_BT_BNEP_PROTO_FILTER=y
803CONFIG_BT_HIDP=m
804
805#
806# Bluetooth device drivers
807#
808CONFIG_BT_HCIUSB=m
809CONFIG_BT_HCIUSB_SCO=y
810# CONFIG_BT_HCIBTUSB is not set
811# CONFIG_BT_HCIBTSDIO is not set
812CONFIG_BT_HCIUART=m
813CONFIG_BT_HCIUART_H4=y
814CONFIG_BT_HCIUART_BCSP=y
815# CONFIG_BT_HCIUART_LL is not set
816CONFIG_BT_HCIBCM203X=m
817CONFIG_BT_HCIBPA10X=m
818CONFIG_BT_HCIBFUSB=m
819CONFIG_BT_HCIVHCI=m
820# CONFIG_AF_RXRPC is not set
821CONFIG_FIB_RULES=y
822
823#
824# Wireless
825#
826# CONFIG_CFG80211 is not set
827CONFIG_WIRELESS_EXT=y
828CONFIG_WIRELESS_EXT_SYSFS=y
829# CONFIG_MAC80211 is not set
830CONFIG_IEEE80211=m
831# CONFIG_IEEE80211_DEBUG is not set
832CONFIG_IEEE80211_CRYPT_WEP=m
833CONFIG_IEEE80211_CRYPT_CCMP=m
834CONFIG_IEEE80211_CRYPT_TKIP=m
835# CONFIG_RFKILL is not set
836# CONFIG_NET_9P is not set
837
838#
839# Device Drivers
840#
841
842#
843# Generic Driver Options
844#
845CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
846# CONFIG_STANDALONE is not set
847CONFIG_PREVENT_FIRMWARE_BUILD=y
848CONFIG_FW_LOADER=y
849CONFIG_FIRMWARE_IN_KERNEL=y
850CONFIG_EXTRA_FIRMWARE=""
851# CONFIG_DEBUG_DRIVER is not set
852# CONFIG_DEBUG_DEVRES is not set
853# CONFIG_SYS_HYPERVISOR is not set
854CONFIG_CONNECTOR=y
855CONFIG_PROC_EVENTS=y
856CONFIG_MTD=m
857# CONFIG_MTD_DEBUG is not set
858CONFIG_MTD_CONCAT=m
859CONFIG_MTD_PARTITIONS=y
860CONFIG_MTD_REDBOOT_PARTS=m
861CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
862# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
863# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
864# CONFIG_MTD_AR7_PARTS is not set
865
866#
867# User Modules And Translation Layers
868#
869CONFIG_MTD_CHAR=m
870CONFIG_MTD_BLKDEVS=m
871CONFIG_MTD_BLOCK=m
872# CONFIG_MTD_BLOCK_RO is not set
873# CONFIG_FTL is not set
874# CONFIG_NFTL is not set
875# CONFIG_INFTL is not set
876CONFIG_RFD_FTL=m
877# CONFIG_SSFDC is not set
878# CONFIG_MTD_OOPS is not set
879
880#
881# RAM/ROM/Flash chip drivers
882#
883CONFIG_MTD_CFI=m
884CONFIG_MTD_JEDECPROBE=m
885CONFIG_MTD_GEN_PROBE=m
886CONFIG_MTD_CFI_ADV_OPTIONS=y
887CONFIG_MTD_CFI_NOSWAP=y
888# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
889# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
890# CONFIG_MTD_CFI_GEOMETRY is not set
891CONFIG_MTD_MAP_BANK_WIDTH_1=y
892CONFIG_MTD_MAP_BANK_WIDTH_2=y
893CONFIG_MTD_MAP_BANK_WIDTH_4=y
894# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
895# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
896# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
897CONFIG_MTD_CFI_I1=y
898CONFIG_MTD_CFI_I2=y
899# CONFIG_MTD_CFI_I4 is not set
900# CONFIG_MTD_CFI_I8 is not set
901# CONFIG_MTD_OTP is not set
902CONFIG_MTD_CFI_INTELEXT=m
903CONFIG_MTD_CFI_AMDSTD=m
904CONFIG_MTD_CFI_STAA=m
905CONFIG_MTD_CFI_UTIL=m
906# CONFIG_MTD_RAM is not set
907# CONFIG_MTD_ROM is not set
908CONFIG_MTD_ABSENT=m
909
910#
911# Mapping drivers for chip access
912#
913CONFIG_MTD_COMPLEX_MAPPINGS=y
914CONFIG_MTD_PHYSMAP=m
915CONFIG_MTD_PHYSMAP_START=0x8000000
916CONFIG_MTD_PHYSMAP_LEN=0x4000000
917CONFIG_MTD_PHYSMAP_BANKWIDTH=2
918CONFIG_MTD_SC520CDP=m
919CONFIG_MTD_NETSC520=m
920CONFIG_MTD_TS5500=m
921CONFIG_MTD_SBC_GXX=m
922CONFIG_MTD_AMD76XROM=m
923CONFIG_MTD_ICHXROM=m
924# CONFIG_MTD_ESB2ROM is not set
925# CONFIG_MTD_CK804XROM is not set
926CONFIG_MTD_SCB2_FLASH=m
927CONFIG_MTD_NETtel=m
928CONFIG_MTD_DILNETPC=m
929CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000
930CONFIG_MTD_L440GX=m
931CONFIG_MTD_PCI=m
932# CONFIG_MTD_INTEL_VR_NOR is not set
933# CONFIG_MTD_PLATRAM is not set
934
935#
936# Self-contained MTD device drivers
937#
938CONFIG_MTD_PMC551=m
939CONFIG_MTD_PMC551_BUGFIX=y
940# CONFIG_MTD_PMC551_DEBUG is not set
941# CONFIG_MTD_DATAFLASH is not set
942# CONFIG_MTD_M25P80 is not set
943CONFIG_MTD_SLRAM=m
944CONFIG_MTD_PHRAM=m
945CONFIG_MTD_MTDRAM=m
946CONFIG_MTDRAM_TOTAL_SIZE=4096
947CONFIG_MTDRAM_ERASE_SIZE=128
948CONFIG_MTD_BLOCK2MTD=m
949
950#
951# Disk-On-Chip Device Drivers
952#
953CONFIG_MTD_DOC2000=m
954CONFIG_MTD_DOC2001=m
955CONFIG_MTD_DOC2001PLUS=m
956CONFIG_MTD_DOCPROBE=m
957CONFIG_MTD_DOCECC=m
958CONFIG_MTD_DOCPROBE_ADVANCED=y
959CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
960CONFIG_MTD_DOCPROBE_HIGH=y
961CONFIG_MTD_DOCPROBE_55AA=y
962CONFIG_MTD_NAND=m
963# CONFIG_MTD_NAND_VERIFY_WRITE is not set
964CONFIG_MTD_NAND_ECC_SMC=y
965# CONFIG_MTD_NAND_MUSEUM_IDS is not set
966CONFIG_MTD_NAND_IDS=m
967CONFIG_MTD_NAND_DISKONCHIP=m
968# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
969CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
970CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y
971# CONFIG_MTD_NAND_CAFE is not set
972CONFIG_MTD_NAND_CS553X=m
973CONFIG_MTD_NAND_NANDSIM=m
974# CONFIG_MTD_NAND_PLATFORM is not set
975# CONFIG_MTD_ALAUDA is not set
976CONFIG_MTD_ONENAND=m
977# CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
978CONFIG_MTD_ONENAND_OTP=y
979# CONFIG_MTD_ONENAND_2X_PROGRAM is not set
980# CONFIG_MTD_ONENAND_SIM is not set
981
982#
983# UBI - Unsorted block images
984#
985# CONFIG_MTD_UBI is not set
986# CONFIG_PARPORT is not set
987CONFIG_PNP=y
988# CONFIG_PNP_DEBUG is not set
989
990#
991# Protocols
992#
993# CONFIG_ISAPNP is not set
994CONFIG_PNPBIOS=y
995CONFIG_PNPBIOS_PROC_FS=y
996CONFIG_PNPACPI=y
997CONFIG_BLK_DEV=y
998# CONFIG_BLK_DEV_FD is not set
999CONFIG_BLK_DEV_XD=m
1000CONFIG_BLK_CPQ_DA=m
1001CONFIG_BLK_CPQ_CISS_DA=m
1002CONFIG_CISS_SCSI_TAPE=y
1003CONFIG_BLK_DEV_DAC960=m
1004CONFIG_BLK_DEV_UMEM=m
1005# CONFIG_BLK_DEV_COW_COMMON is not set
1006CONFIG_BLK_DEV_LOOP=y
1007CONFIG_BLK_DEV_CRYPTOLOOP=m
1008CONFIG_BLK_DEV_NBD=m
1009CONFIG_BLK_DEV_SX8=m
1010# CONFIG_BLK_DEV_UB is not set
1011CONFIG_BLK_DEV_RAM=y
1012CONFIG_BLK_DEV_RAM_COUNT=16
1013CONFIG_BLK_DEV_RAM_SIZE=64000
1014# CONFIG_BLK_DEV_XIP is not set
1015CONFIG_CDROM_PKTCDVD=m
1016CONFIG_CDROM_PKTCDVD_BUFFERS=8
1017CONFIG_CDROM_PKTCDVD_WCACHE=y
1018CONFIG_ATA_OVER_ETH=m
1019# CONFIG_BLK_DEV_HD is not set
1020CONFIG_MISC_DEVICES=y
1021# CONFIG_IBM_ASM is not set
1022# CONFIG_PHANTOM is not set
1023# CONFIG_EEPROM_93CX6 is not set
1024# CONFIG_SGI_IOC4 is not set
1025# CONFIG_TIFM_CORE is not set
1026# CONFIG_ACER_WMI is not set
1027# CONFIG_ASUS_LAPTOP is not set
1028# CONFIG_FUJITSU_LAPTOP is not set
1029# CONFIG_TC1100_WMI is not set
1030# CONFIG_MSI_LAPTOP is not set
1031# CONFIG_COMPAL_LAPTOP is not set
1032# CONFIG_SONY_LAPTOP is not set
1033# CONFIG_THINKPAD_ACPI is not set
1034# CONFIG_INTEL_MENLOW is not set
1035# CONFIG_EEEPC_LAPTOP is not set
1036# CONFIG_ENCLOSURE_SERVICES is not set
1037# CONFIG_HP_ILO is not set
1038CONFIG_HAVE_IDE=y
1039# CONFIG_IDE is not set
1040
1041#
1042# SCSI device support
1043#
1044CONFIG_RAID_ATTRS=m
1045CONFIG_SCSI=y
1046CONFIG_SCSI_DMA=y
1047# CONFIG_SCSI_TGT is not set
1048CONFIG_SCSI_NETLINK=y
1049CONFIG_SCSI_PROC_FS=y
1050
1051#
1052# SCSI support type (disk, tape, CD-ROM)
1053#
1054CONFIG_BLK_DEV_SD=y
1055CONFIG_CHR_DEV_ST=m
1056CONFIG_CHR_DEV_OSST=m
1057CONFIG_BLK_DEV_SR=y
1058# CONFIG_BLK_DEV_SR_VENDOR is not set
1059CONFIG_CHR_DEV_SG=y
1060CONFIG_CHR_DEV_SCH=m
1061
1062#
1063# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
1064#
1065CONFIG_SCSI_MULTI_LUN=y
1066CONFIG_SCSI_CONSTANTS=y
1067CONFIG_SCSI_LOGGING=y
1068# CONFIG_SCSI_SCAN_ASYNC is not set
1069CONFIG_SCSI_WAIT_SCAN=m
1070
1071#
1072# SCSI Transports
1073#
1074CONFIG_SCSI_SPI_ATTRS=m
1075CONFIG_SCSI_FC_ATTRS=m
1076CONFIG_SCSI_ISCSI_ATTRS=m
1077# CONFIG_SCSI_SAS_LIBSAS is not set
1078# CONFIG_SCSI_SRP_ATTRS is not set
1079CONFIG_SCSI_LOWLEVEL=y
1080# CONFIG_ISCSI_TCP is not set
1081# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
1082# CONFIG_SCSI_3W_9XXX is not set
1083# CONFIG_SCSI_7000FASST is not set
1084# CONFIG_SCSI_ACARD is not set
1085# CONFIG_SCSI_AHA152X is not set
1086# CONFIG_SCSI_AHA1542 is not set
1087# CONFIG_SCSI_AACRAID is not set
1088# CONFIG_SCSI_AIC7XXX is not set
1089# CONFIG_SCSI_AIC7XXX_OLD is not set
1090# CONFIG_SCSI_AIC79XX is not set
1091# CONFIG_SCSI_AIC94XX is not set
1092# CONFIG_SCSI_DPT_I2O is not set
1093# CONFIG_SCSI_ADVANSYS is not set
1094# CONFIG_SCSI_IN2000 is not set
1095# CONFIG_SCSI_ARCMSR is not set
1096# CONFIG_MEGARAID_NEWGEN is not set
1097# CONFIG_MEGARAID_LEGACY is not set
1098# CONFIG_MEGARAID_SAS is not set
1099# CONFIG_SCSI_HPTIOP is not set
1100# CONFIG_SCSI_BUSLOGIC is not set
1101# CONFIG_SCSI_DMX3191D is not set
1102# CONFIG_SCSI_DTC3280 is not set
1103# CONFIG_SCSI_EATA is not set
1104# CONFIG_SCSI_FUTURE_DOMAIN is not set
1105CONFIG_SCSI_GDTH=m
1106# CONFIG_SCSI_GENERIC_NCR5380 is not set
1107# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
1108# CONFIG_SCSI_IPS is not set
1109# CONFIG_SCSI_INITIO is not set
1110# CONFIG_SCSI_INIA100 is not set
1111# CONFIG_SCSI_MVSAS is not set
1112# CONFIG_SCSI_NCR53C406A is not set
1113# CONFIG_SCSI_STEX is not set
1114# CONFIG_SCSI_SYM53C8XX_2 is not set
1115# CONFIG_SCSI_IPR is not set
1116# CONFIG_SCSI_PAS16 is not set
1117# CONFIG_SCSI_QLOGIC_FAS is not set
1118# CONFIG_SCSI_QLOGIC_1280 is not set
1119# CONFIG_SCSI_QLA_FC is not set
1120# CONFIG_SCSI_QLA_ISCSI is not set
1121# CONFIG_SCSI_LPFC is not set
1122# CONFIG_SCSI_SYM53C416 is not set
1123# CONFIG_SCSI_DC395x is not set
1124# CONFIG_SCSI_DC390T is not set
1125# CONFIG_SCSI_T128 is not set
1126# CONFIG_SCSI_U14_34F is not set
1127# CONFIG_SCSI_ULTRASTOR is not set
1128# CONFIG_SCSI_NSP32 is not set
1129# CONFIG_SCSI_DEBUG is not set
1130# CONFIG_SCSI_SRP is not set
1131# CONFIG_SCSI_DH is not set
1132CONFIG_ATA=y
1133# CONFIG_ATA_NONSTANDARD is not set
1134CONFIG_ATA_ACPI=y
1135CONFIG_SATA_PMP=y
1136# CONFIG_SATA_AHCI is not set
1137# CONFIG_SATA_SIL24 is not set
1138CONFIG_ATA_SFF=y
1139# CONFIG_SATA_SVW is not set
1140CONFIG_ATA_PIIX=y
1141# CONFIG_SATA_MV is not set
1142# CONFIG_SATA_NV is not set
1143# CONFIG_PDC_ADMA is not set
1144# CONFIG_SATA_QSTOR is not set
1145# CONFIG_SATA_PROMISE is not set
1146# CONFIG_SATA_SX4 is not set
1147# CONFIG_SATA_SIL is not set
1148# CONFIG_SATA_SIS is not set
1149# CONFIG_SATA_ULI is not set
1150# CONFIG_SATA_VIA is not set
1151# CONFIG_SATA_VITESSE is not set
1152# CONFIG_SATA_INIC162X is not set
1153# CONFIG_PATA_ACPI is not set
1154# CONFIG_PATA_ALI is not set
1155# CONFIG_PATA_AMD is not set
1156# CONFIG_PATA_ARTOP is not set
1157# CONFIG_PATA_ATIIXP is not set
1158# CONFIG_PATA_CMD640_PCI is not set
1159# CONFIG_PATA_CMD64X is not set
1160# CONFIG_PATA_CS5520 is not set
1161# CONFIG_PATA_CS5530 is not set
1162# CONFIG_PATA_CS5535 is not set
1163# CONFIG_PATA_CS5536 is not set
1164# CONFIG_PATA_CYPRESS is not set
1165# CONFIG_PATA_EFAR is not set
1166CONFIG_ATA_GENERIC=y
1167# CONFIG_PATA_HPT366 is not set
1168# CONFIG_PATA_HPT37X is not set
1169# CONFIG_PATA_HPT3X2N is not set
1170# CONFIG_PATA_HPT3X3 is not set
1171# CONFIG_PATA_IT821X is not set
1172# CONFIG_PATA_IT8213 is not set
1173# CONFIG_PATA_JMICRON is not set
1174# CONFIG_PATA_LEGACY is not set
1175# CONFIG_PATA_TRIFLEX is not set
1176# CONFIG_PATA_MARVELL is not set
1177CONFIG_PATA_MPIIX=y
1178# CONFIG_PATA_OLDPIIX is not set
1179# CONFIG_PATA_NETCELL is not set
1180# CONFIG_PATA_NINJA32 is not set
1181# CONFIG_PATA_NS87410 is not set
1182# CONFIG_PATA_NS87415 is not set
1183# CONFIG_PATA_OPTI is not set
1184# CONFIG_PATA_OPTIDMA is not set
1185# CONFIG_PATA_PDC_OLD is not set
1186# CONFIG_PATA_QDI is not set
1187# CONFIG_PATA_RADISYS is not set
1188# CONFIG_PATA_RZ1000 is not set
1189# CONFIG_PATA_SC1200 is not set
1190# CONFIG_PATA_SERVERWORKS is not set
1191# CONFIG_PATA_PDC2027X is not set
1192# CONFIG_PATA_SIL680 is not set
1193# CONFIG_PATA_SIS is not set
1194# CONFIG_PATA_VIA is not set
1195# CONFIG_PATA_WINBOND is not set
1196# CONFIG_PATA_WINBOND_VLB is not set
1197# CONFIG_PATA_SCH is not set
1198# CONFIG_MD is not set
1199# CONFIG_FUSION is not set
1200
1201#
1202# IEEE 1394 (FireWire) support
1203#
1204
1205#
1206# Enable only one of the two stacks, unless you know what you are doing
1207#
1208# CONFIG_FIREWIRE is not set
1209CONFIG_IEEE1394=m
1210CONFIG_IEEE1394_OHCI1394=m
1211# CONFIG_IEEE1394_PCILYNX is not set
1212CONFIG_IEEE1394_SBP2=m
1213# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
1214CONFIG_IEEE1394_ETH1394_ROM_ENTRY=y
1215CONFIG_IEEE1394_ETH1394=m
1216CONFIG_IEEE1394_RAWIO=m
1217CONFIG_IEEE1394_VIDEO1394=m
1218CONFIG_IEEE1394_DV1394=m
1219# CONFIG_IEEE1394_VERBOSEDEBUG is not set
1220CONFIG_I2O=m
1221CONFIG_I2O_LCT_NOTIFY_ON_CHANGES=y
1222CONFIG_I2O_EXT_ADAPTEC=y
1223CONFIG_I2O_CONFIG=m
1224CONFIG_I2O_CONFIG_OLD_IOCTL=y
1225CONFIG_I2O_BUS=m
1226CONFIG_I2O_BLOCK=m
1227CONFIG_I2O_SCSI=m
1228CONFIG_I2O_PROC=m
1229# CONFIG_MACINTOSH_DRIVERS is not set
1230CONFIG_NETDEVICES=y
1231CONFIG_IFB=m
1232CONFIG_DUMMY=m
1233CONFIG_BONDING=m
1234# CONFIG_MACVLAN is not set
1235CONFIG_EQUALIZER=m
1236CONFIG_TUN=m
1237# CONFIG_VETH is not set
1238# CONFIG_NET_SB1000 is not set
1239# CONFIG_ARCNET is not set
1240CONFIG_PHYLIB=m
1241
1242#
1243# MII PHY device drivers
1244#
1245CONFIG_MARVELL_PHY=m
1246CONFIG_DAVICOM_PHY=m
1247CONFIG_QSEMI_PHY=m
1248CONFIG_LXT_PHY=m
1249CONFIG_CICADA_PHY=m
1250CONFIG_VITESSE_PHY=m
1251CONFIG_SMSC_PHY=m
1252# CONFIG_BROADCOM_PHY is not set
1253# CONFIG_ICPLUS_PHY is not set
1254# CONFIG_REALTEK_PHY is not set
1255# CONFIG_MDIO_BITBANG is not set
1256CONFIG_NET_ETHERNET=y
1257CONFIG_MII=y
1258# CONFIG_HAPPYMEAL is not set
1259# CONFIG_SUNGEM is not set
1260# CONFIG_CASSINI is not set
1261CONFIG_NET_VENDOR_3COM=y
1262CONFIG_EL1=m
1263CONFIG_EL2=m
1264CONFIG_ELPLUS=m
1265CONFIG_EL16=m
1266CONFIG_EL3=m
1267CONFIG_3C515=m
1268CONFIG_VORTEX=m
1269CONFIG_TYPHOON=m
1270# CONFIG_LANCE is not set
1271CONFIG_NET_VENDOR_SMC=y
1272CONFIG_WD80x3=m
1273CONFIG_ULTRA=m
1274CONFIG_SMC9194=m
1275# CONFIG_ENC28J60 is not set
1276# CONFIG_NET_VENDOR_RACAL is not set
1277CONFIG_NET_TULIP=y
1278CONFIG_DE2104X=m
1279CONFIG_TULIP=m
1280# CONFIG_TULIP_MWI is not set
1281# CONFIG_TULIP_MMIO is not set
1282CONFIG_TULIP_NAPI=y
1283CONFIG_TULIP_NAPI_HW_MITIGATION=y
1284CONFIG_DE4X5=m
1285CONFIG_WINBOND_840=m
1286CONFIG_DM9102=m
1287CONFIG_ULI526X=m
1288# CONFIG_AT1700 is not set
1289# CONFIG_DEPCA is not set
1290# CONFIG_HP100 is not set
1291# CONFIG_NET_ISA is not set
1292# CONFIG_IBM_NEW_EMAC_ZMII is not set
1293# CONFIG_IBM_NEW_EMAC_RGMII is not set
1294# CONFIG_IBM_NEW_EMAC_TAH is not set
1295# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
1296CONFIG_NET_PCI=y
1297# CONFIG_PCNET32 is not set
1298# CONFIG_AMD8111_ETH is not set
1299# CONFIG_ADAPTEC_STARFIRE is not set
1300# CONFIG_AC3200 is not set
1301# CONFIG_APRICOT is not set
1302# CONFIG_B44 is not set
1303# CONFIG_FORCEDETH is not set
1304# CONFIG_CS89x0 is not set
1305# CONFIG_EEPRO100 is not set
1306CONFIG_E100=m
1307# CONFIG_FEALNX is not set
1308# CONFIG_NATSEMI is not set
1309CONFIG_NE2K_PCI=m
1310CONFIG_8139CP=m
1311CONFIG_8139TOO=m
1312# CONFIG_8139TOO_PIO is not set
1313# CONFIG_8139TOO_TUNE_TWISTER is not set
1314CONFIG_8139TOO_8129=y
1315# CONFIG_8139_OLD_RX_RESET is not set
1316# CONFIG_R6040 is not set
1317# CONFIG_SIS900 is not set
1318CONFIG_EPIC100=m
1319# CONFIG_SUNDANCE is not set
1320# CONFIG_TLAN is not set
1321# CONFIG_VIA_RHINE is not set
1322# CONFIG_SC92031 is not set
1323CONFIG_NETDEV_1000=y
1324# CONFIG_ACENIC is not set
1325# CONFIG_DL2K is not set
1326CONFIG_E1000=m
1327CONFIG_E1000_DISABLE_PACKET_SPLIT=y
1328# CONFIG_E1000E is not set
1329# CONFIG_IP1000 is not set
1330# CONFIG_IGB is not set
1331# CONFIG_NS83820 is not set
1332# CONFIG_HAMACHI is not set
1333# CONFIG_YELLOWFIN is not set
1334# CONFIG_R8169 is not set
1335# CONFIG_SIS190 is not set
1336CONFIG_SKGE=y
1337# CONFIG_SKGE_DEBUG is not set
1338CONFIG_SKY2=y
1339# CONFIG_SKY2_DEBUG is not set
1340# CONFIG_VIA_VELOCITY is not set
1341# CONFIG_TIGON3 is not set
1342# CONFIG_BNX2 is not set
1343# CONFIG_QLA3XXX is not set
1344# CONFIG_ATL1 is not set
1345# CONFIG_ATL1E is not set
1346CONFIG_NETDEV_10000=y
1347# CONFIG_CHELSIO_T1 is not set
1348# CONFIG_CHELSIO_T3 is not set
1349# CONFIG_IXGBE is not set
1350CONFIG_IXGB=m
1351# CONFIG_S2IO is not set
1352# CONFIG_MYRI10GE is not set
1353# CONFIG_NETXEN_NIC is not set
1354# CONFIG_NIU is not set
1355# CONFIG_MLX4_CORE is not set
1356# CONFIG_TEHUTI is not set
1357# CONFIG_BNX2X is not set
1358# CONFIG_SFC is not set
1359# CONFIG_TR is not set
1360
1361#
1362# Wireless LAN
1363#
1364# CONFIG_WLAN_PRE80211 is not set
1365CONFIG_WLAN_80211=y
1366CONFIG_IPW2100=m
1367# CONFIG_IPW2100_MONITOR is not set
1368# CONFIG_IPW2100_DEBUG is not set
1369CONFIG_IPW2200=m
1370# CONFIG_IPW2200_MONITOR is not set
1371# CONFIG_IPW2200_QOS is not set
1372# CONFIG_IPW2200_DEBUG is not set
1373# CONFIG_LIBERTAS is not set
1374# CONFIG_AIRO is not set
1375# CONFIG_HERMES is not set
1376# CONFIG_ATMEL is not set
1377# CONFIG_PRISM54 is not set
1378# CONFIG_USB_ZD1201 is not set
1379# CONFIG_USB_NET_RNDIS_WLAN is not set
1380# CONFIG_IWLWIFI_LEDS is not set
1381# CONFIG_HOSTAP is not set
1382
1383#
1384# USB Network Adapters
1385#
1386CONFIG_USB_CATC=m
1387CONFIG_USB_KAWETH=m
1388CONFIG_USB_PEGASUS=m
1389CONFIG_USB_RTL8150=m
1390CONFIG_USB_USBNET=y
1391CONFIG_USB_NET_AX8817X=y
1392CONFIG_USB_NET_CDCETHER=m
1393# CONFIG_USB_NET_DM9601 is not set
1394CONFIG_USB_NET_GL620A=m
1395CONFIG_USB_NET_NET1080=m
1396CONFIG_USB_NET_PLUSB=m
1397# CONFIG_USB_NET_MCS7830 is not set
1398CONFIG_USB_NET_RNDIS_HOST=m
1399CONFIG_USB_NET_CDC_SUBSET=m
1400CONFIG_USB_ALI_M5632=y
1401CONFIG_USB_AN2720=y
1402CONFIG_USB_BELKIN=y
1403CONFIG_USB_ARMLINUX=y
1404CONFIG_USB_EPSON2888=y
1405# CONFIG_USB_KC2190 is not set
1406CONFIG_USB_NET_ZAURUS=m
1407# CONFIG_WAN is not set
1408CONFIG_ATM_DRIVERS=y
1409# CONFIG_ATM_DUMMY is not set
1410# CONFIG_ATM_TCP is not set
1411# CONFIG_ATM_LANAI is not set
1412# CONFIG_ATM_ENI is not set
1413# CONFIG_ATM_FIRESTREAM is not set
1414# CONFIG_ATM_ZATM is not set
1415# CONFIG_ATM_NICSTAR is not set
1416# CONFIG_ATM_IDT77252 is not set
1417# CONFIG_ATM_AMBASSADOR is not set
1418# CONFIG_ATM_HORIZON is not set
1419# CONFIG_ATM_IA is not set
1420# CONFIG_ATM_FORE200E is not set
1421# CONFIG_ATM_HE is not set
1422# CONFIG_FDDI is not set
1423# CONFIG_HIPPI is not set
1424CONFIG_PPP=m
1425CONFIG_PPP_MULTILINK=y
1426CONFIG_PPP_FILTER=y
1427CONFIG_PPP_ASYNC=m
1428CONFIG_PPP_SYNC_TTY=m
1429CONFIG_PPP_DEFLATE=m
1430CONFIG_PPP_BSDCOMP=m
1431CONFIG_PPP_MPPE=m
1432CONFIG_PPPOE=m
1433CONFIG_PPPOATM=m
1434# CONFIG_PPPOL2TP is not set
1435CONFIG_SLIP=m
1436CONFIG_SLIP_COMPRESSED=y
1437CONFIG_SLHC=m
1438CONFIG_SLIP_SMART=y
1439CONFIG_SLIP_MODE_SLIP6=y
1440CONFIG_NET_FC=y
1441CONFIG_NETCONSOLE=m
1442# CONFIG_NETCONSOLE_DYNAMIC is not set
1443CONFIG_NETPOLL=y
1444CONFIG_NETPOLL_TRAP=y
1445CONFIG_NET_POLL_CONTROLLER=y
1446# CONFIG_ISDN is not set
1447CONFIG_PHONE=m
1448# CONFIG_PHONE_IXJ is not set
1449
1450#
1451# Input device support
1452#
1453CONFIG_INPUT=y
1454CONFIG_INPUT_FF_MEMLESS=y
1455CONFIG_INPUT_POLLDEV=m
1456
1457#
1458# Userland interfaces
1459#
1460CONFIG_INPUT_MOUSEDEV=y
1461CONFIG_INPUT_MOUSEDEV_PSAUX=y
1462CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
1463CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
1464CONFIG_INPUT_JOYDEV=m
1465CONFIG_INPUT_EVDEV=y
1466# CONFIG_INPUT_EVBUG is not set
1467
1468#
1469# Input Device Drivers
1470#
1471CONFIG_INPUT_KEYBOARD=y
1472CONFIG_KEYBOARD_ATKBD=y
1473CONFIG_KEYBOARD_SUNKBD=m
1474# CONFIG_KEYBOARD_LKKBD is not set
1475CONFIG_KEYBOARD_XTKBD=m
1476CONFIG_KEYBOARD_NEWTON=m
1477# CONFIG_KEYBOARD_STOWAWAY is not set
1478CONFIG_INPUT_MOUSE=y
1479CONFIG_MOUSE_PS2=y
1480CONFIG_MOUSE_PS2_ALPS=y
1481CONFIG_MOUSE_PS2_LOGIPS2PP=y
1482CONFIG_MOUSE_PS2_SYNAPTICS=y
1483CONFIG_MOUSE_PS2_LIFEBOOK=y
1484CONFIG_MOUSE_PS2_TRACKPOINT=y
1485# CONFIG_MOUSE_PS2_TOUCHKIT is not set
1486CONFIG_MOUSE_SERIAL=m
1487# CONFIG_MOUSE_APPLETOUCH is not set
1488# CONFIG_MOUSE_BCM5974 is not set
1489CONFIG_MOUSE_INPORT=m
1490CONFIG_MOUSE_ATIXL=y
1491CONFIG_MOUSE_LOGIBM=m
1492CONFIG_MOUSE_PC110PAD=m
1493# CONFIG_MOUSE_VSXXXAA is not set
1494CONFIG_INPUT_JOYSTICK=y
1495CONFIG_JOYSTICK_ANALOG=m
1496CONFIG_JOYSTICK_A3D=m
1497CONFIG_JOYSTICK_ADI=m
1498CONFIG_JOYSTICK_COBRA=m
1499CONFIG_JOYSTICK_GF2K=m
1500CONFIG_JOYSTICK_GRIP=m
1501CONFIG_JOYSTICK_GRIP_MP=m
1502CONFIG_JOYSTICK_GUILLEMOT=m
1503CONFIG_JOYSTICK_INTERACT=m
1504CONFIG_JOYSTICK_SIDEWINDER=m
1505CONFIG_JOYSTICK_TMDC=m
1506CONFIG_JOYSTICK_IFORCE=m
1507CONFIG_JOYSTICK_IFORCE_USB=y
1508CONFIG_JOYSTICK_IFORCE_232=y
1509CONFIG_JOYSTICK_WARRIOR=m
1510CONFIG_JOYSTICK_MAGELLAN=m
1511CONFIG_JOYSTICK_SPACEORB=m
1512CONFIG_JOYSTICK_SPACEBALL=m
1513CONFIG_JOYSTICK_STINGER=m
1514CONFIG_JOYSTICK_TWIDJOY=m
1515# CONFIG_JOYSTICK_ZHENHUA is not set
1516CONFIG_JOYSTICK_JOYDUMP=m
1517# CONFIG_JOYSTICK_XPAD is not set
1518# CONFIG_INPUT_TABLET is not set
1519CONFIG_INPUT_TOUCHSCREEN=y
1520CONFIG_TOUCHSCREEN_ADS7846=m
1521# CONFIG_TOUCHSCREEN_FUJITSU is not set
1522CONFIG_TOUCHSCREEN_GUNZE=m
1523CONFIG_TOUCHSCREEN_ELO=m
1524CONFIG_TOUCHSCREEN_MTOUCH=m
1525# CONFIG_TOUCHSCREEN_INEXIO is not set
1526CONFIG_TOUCHSCREEN_MK712=m
1527# CONFIG_TOUCHSCREEN_HTCPEN is not set
1528# CONFIG_TOUCHSCREEN_PENMOUNT is not set
1529# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
1530# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
1531# CONFIG_TOUCHSCREEN_UCB1400 is not set
1532# CONFIG_TOUCHSCREEN_WM97XX is not set
1533# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
1534# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
1535CONFIG_INPUT_MISC=y
1536CONFIG_INPUT_PCSPKR=y
1537# CONFIG_INPUT_APANEL is not set
1538CONFIG_INPUT_WISTRON_BTNS=m
1539# CONFIG_INPUT_ATLAS_BTNS is not set
1540# CONFIG_INPUT_ATI_REMOTE is not set
1541# CONFIG_INPUT_ATI_REMOTE2 is not set
1542# CONFIG_INPUT_KEYSPAN_REMOTE is not set
1543# CONFIG_INPUT_POWERMATE is not set
1544# CONFIG_INPUT_YEALINK is not set
1545CONFIG_INPUT_UINPUT=m
1546
1547#
1548# Hardware I/O ports
1549#
1550CONFIG_SERIO=y
1551CONFIG_SERIO_I8042=y
1552CONFIG_SERIO_SERPORT=m
1553CONFIG_SERIO_CT82C710=m
1554CONFIG_SERIO_PCIPS2=m
1555CONFIG_SERIO_LIBPS2=y
1556CONFIG_SERIO_RAW=m
1557CONFIG_GAMEPORT=m
1558CONFIG_GAMEPORT_NS558=m
1559CONFIG_GAMEPORT_L4=m
1560CONFIG_GAMEPORT_EMU10K1=m
1561CONFIG_GAMEPORT_FM801=m
1562
1563#
1564# Character devices
1565#
1566CONFIG_VT=y
1567CONFIG_CONSOLE_TRANSLATIONS=y
1568CONFIG_VT_CONSOLE=y
1569CONFIG_HW_CONSOLE=y
1570CONFIG_VT_HW_CONSOLE_BINDING=y
1571CONFIG_DEVKMEM=y
1572CONFIG_SERIAL_NONSTANDARD=y
1573# CONFIG_COMPUTONE is not set
1574# CONFIG_ROCKETPORT is not set
1575# CONFIG_CYCLADES is not set
1576# CONFIG_DIGIEPCA is not set
1577# CONFIG_ESPSERIAL is not set
1578# CONFIG_MOXA_INTELLIO is not set
1579# CONFIG_MOXA_SMARTIO is not set
1580# CONFIG_ISI is not set
1581# CONFIG_SYNCLINK is not set
1582# CONFIG_SYNCLINKMP is not set
1583# CONFIG_SYNCLINK_GT is not set
1584# CONFIG_N_HDLC is not set
1585# CONFIG_RISCOM8 is not set
1586# CONFIG_SPECIALIX is not set
1587# CONFIG_SX is not set
1588# CONFIG_RIO is not set
1589# CONFIG_STALDRV is not set
1590# CONFIG_NOZOMI is not set
1591
1592#
1593# Serial drivers
1594#
1595CONFIG_SERIAL_8250=y
1596CONFIG_SERIAL_8250_CONSOLE=y
1597CONFIG_FIX_EARLYCON_MEM=y
1598CONFIG_SERIAL_8250_PCI=y
1599CONFIG_SERIAL_8250_PNP=y
1600CONFIG_SERIAL_8250_NR_UARTS=8
1601CONFIG_SERIAL_8250_RUNTIME_UARTS=4
1602CONFIG_SERIAL_8250_EXTENDED=y
1603# CONFIG_SERIAL_8250_MANY_PORTS is not set
1604CONFIG_SERIAL_8250_SHARE_IRQ=y
1605# CONFIG_SERIAL_8250_DETECT_IRQ is not set
1606# CONFIG_SERIAL_8250_RSA is not set
1607
1608#
1609# Non-8250 serial port support
1610#
1611CONFIG_SERIAL_CORE=y
1612CONFIG_SERIAL_CORE_CONSOLE=y
1613CONFIG_SERIAL_JSM=y
1614CONFIG_UNIX98_PTYS=y
1615CONFIG_LEGACY_PTYS=y
1616CONFIG_LEGACY_PTY_COUNT=64
1617CONFIG_IPMI_HANDLER=m
1618CONFIG_IPMI_PANIC_EVENT=y
1619CONFIG_IPMI_PANIC_STRING=y
1620CONFIG_IPMI_DEVICE_INTERFACE=m
1621CONFIG_IPMI_SI=m
1622CONFIG_IPMI_WATCHDOG=m
1623CONFIG_IPMI_POWEROFF=m
1624CONFIG_HW_RANDOM=y
1625CONFIG_HW_RANDOM_INTEL=m
1626# CONFIG_HW_RANDOM_AMD is not set
1627# CONFIG_HW_RANDOM_GEODE is not set
1628# CONFIG_HW_RANDOM_VIA is not set
1629CONFIG_NVRAM=m
1630# CONFIG_DTLK is not set
1631# CONFIG_R3964 is not set
1632# CONFIG_APPLICOM is not set
1633# CONFIG_SONYPI is not set
1634# CONFIG_MWAVE is not set
1635# CONFIG_PC8736x_GPIO is not set
1636# CONFIG_NSC_GPIO is not set
1637# CONFIG_CS5535_GPIO is not set
1638CONFIG_RAW_DRIVER=m
1639CONFIG_MAX_RAW_DEVS=4096
1640CONFIG_HPET=y
1641CONFIG_HPET_MMAP=y
1642CONFIG_HANGCHECK_TIMER=m
1643# CONFIG_TCG_TPM is not set
1644# CONFIG_TELCLOCK is not set
1645CONFIG_DEVPORT=y
1646CONFIG_I2C=m
1647CONFIG_I2C_BOARDINFO=y
1648CONFIG_I2C_CHARDEV=m
1649CONFIG_I2C_HELPER_AUTO=y
1650CONFIG_I2C_ALGOBIT=m
1651CONFIG_I2C_ALGOPCA=m
1652
1653#
1654# I2C Hardware Bus support
1655#
1656
1657#
1658# PC SMBus host controller drivers
1659#
1660CONFIG_I2C_ALI1535=m
1661CONFIG_I2C_ALI1563=m
1662CONFIG_I2C_ALI15X3=m
1663CONFIG_I2C_AMD756=m
1664CONFIG_I2C_AMD756_S4882=m
1665CONFIG_I2C_AMD8111=m
1666CONFIG_I2C_I801=m
1667# CONFIG_I2C_ISCH is not set
1668CONFIG_I2C_PIIX4=m
1669CONFIG_I2C_NFORCE2=m
1670# CONFIG_I2C_NFORCE2_S4985 is not set
1671CONFIG_I2C_SIS5595=m
1672CONFIG_I2C_SIS630=m
1673CONFIG_I2C_SIS96X=m
1674CONFIG_I2C_VIA=m
1675CONFIG_I2C_VIAPRO=m
1676
1677#
1678# I2C system bus drivers (mostly embedded / system-on-chip)
1679#
1680CONFIG_I2C_OCORES=m
1681# CONFIG_I2C_SIMTEC is not set
1682
1683#
1684# External I2C/SMBus adapter drivers
1685#
1686CONFIG_I2C_PARPORT_LIGHT=m
1687# CONFIG_I2C_TAOS_EVM is not set
1688# CONFIG_I2C_TINY_USB is not set
1689
1690#
1691# Graphics adapter I2C/DDC channel drivers
1692#
1693CONFIG_I2C_VOODOO3=m
1694
1695#
1696# Other I2C/SMBus bus drivers
1697#
1698CONFIG_I2C_PCA_ISA=m
1699# CONFIG_I2C_PCA_PLATFORM is not set
1700CONFIG_I2C_STUB=m
1701CONFIG_SCx200_ACB=m
1702
1703#
1704# Miscellaneous I2C Chip support
1705#
1706# CONFIG_DS1682 is not set
1707# CONFIG_AT24 is not set
1708CONFIG_SENSORS_EEPROM=m
1709CONFIG_SENSORS_PCF8574=m
1710# CONFIG_PCF8575 is not set
1711CONFIG_SENSORS_PCA9539=m
1712CONFIG_SENSORS_PCF8591=m
1713CONFIG_SENSORS_MAX6875=m
1714# CONFIG_SENSORS_TSL2550 is not set
1715# CONFIG_I2C_DEBUG_CORE is not set
1716# CONFIG_I2C_DEBUG_ALGO is not set
1717# CONFIG_I2C_DEBUG_BUS is not set
1718# CONFIG_I2C_DEBUG_CHIP is not set
1719CONFIG_SPI=y
1720# CONFIG_SPI_DEBUG is not set
1721CONFIG_SPI_MASTER=y
1722
1723#
1724# SPI Master Controller Drivers
1725#
1726CONFIG_SPI_BITBANG=m
1727
1728#
1729# SPI Protocol Masters
1730#
1731# CONFIG_SPI_AT25 is not set
1732# CONFIG_SPI_SPIDEV is not set
1733# CONFIG_SPI_TLE62X0 is not set
1734CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
1735# CONFIG_GPIOLIB is not set
1736CONFIG_W1=m
1737CONFIG_W1_CON=y
1738
1739#
1740# 1-wire Bus Masters
1741#
1742CONFIG_W1_MASTER_MATROX=m
1743CONFIG_W1_MASTER_DS2490=m
1744CONFIG_W1_MASTER_DS2482=m
1745
1746#
1747# 1-wire Slaves
1748#
1749CONFIG_W1_SLAVE_THERM=m
1750CONFIG_W1_SLAVE_SMEM=m
1751CONFIG_W1_SLAVE_DS2433=m
1752CONFIG_W1_SLAVE_DS2433_CRC=y
1753# CONFIG_W1_SLAVE_DS2760 is not set
1754CONFIG_POWER_SUPPLY=y
1755# CONFIG_POWER_SUPPLY_DEBUG is not set
1756# CONFIG_PDA_POWER is not set
1757# CONFIG_BATTERY_DS2760 is not set
1758CONFIG_HWMON=y
1759CONFIG_HWMON_VID=m
1760# CONFIG_SENSORS_ABITUGURU is not set
1761# CONFIG_SENSORS_ABITUGURU3 is not set
1762# CONFIG_SENSORS_AD7414 is not set
1763# CONFIG_SENSORS_AD7418 is not set
1764# CONFIG_SENSORS_ADCXX is not set
1765# CONFIG_SENSORS_ADM1021 is not set
1766# CONFIG_SENSORS_ADM1025 is not set
1767# CONFIG_SENSORS_ADM1026 is not set
1768# CONFIG_SENSORS_ADM1029 is not set
1769# CONFIG_SENSORS_ADM1031 is not set
1770# CONFIG_SENSORS_ADM9240 is not set
1771# CONFIG_SENSORS_ADT7470 is not set
1772# CONFIG_SENSORS_ADT7473 is not set
1773# CONFIG_SENSORS_K8TEMP is not set
1774# CONFIG_SENSORS_ASB100 is not set
1775# CONFIG_SENSORS_ATXP1 is not set
1776# CONFIG_SENSORS_DS1621 is not set
1777# CONFIG_SENSORS_I5K_AMB is not set
1778# CONFIG_SENSORS_F71805F is not set
1779# CONFIG_SENSORS_F71882FG is not set
1780# CONFIG_SENSORS_F75375S is not set
1781# CONFIG_SENSORS_FSCHER is not set
1782# CONFIG_SENSORS_FSCPOS is not set
1783# CONFIG_SENSORS_FSCHMD is not set
1784# CONFIG_SENSORS_GL518SM is not set
1785# CONFIG_SENSORS_GL520SM is not set
1786# CONFIG_SENSORS_CORETEMP is not set
1787# CONFIG_SENSORS_IBMAEM is not set
1788# CONFIG_SENSORS_IBMPEX is not set
1789# CONFIG_SENSORS_IT87 is not set
1790# CONFIG_SENSORS_LM63 is not set
1791# CONFIG_SENSORS_LM70 is not set
1792# CONFIG_SENSORS_LM75 is not set
1793# CONFIG_SENSORS_LM77 is not set
1794# CONFIG_SENSORS_LM78 is not set
1795# CONFIG_SENSORS_LM80 is not set
1796# CONFIG_SENSORS_LM83 is not set
1797CONFIG_SENSORS_LM85=m
1798# CONFIG_SENSORS_LM87 is not set
1799# CONFIG_SENSORS_LM90 is not set
1800# CONFIG_SENSORS_LM92 is not set
1801# CONFIG_SENSORS_LM93 is not set
1802# CONFIG_SENSORS_MAX1619 is not set
1803# CONFIG_SENSORS_MAX6650 is not set
1804# CONFIG_SENSORS_PC87360 is not set
1805# CONFIG_SENSORS_PC87427 is not set
1806# CONFIG_SENSORS_SIS5595 is not set
1807# CONFIG_SENSORS_DME1737 is not set
1808# CONFIG_SENSORS_SMSC47M1 is not set
1809# CONFIG_SENSORS_SMSC47M192 is not set
1810# CONFIG_SENSORS_SMSC47B397 is not set
1811# CONFIG_SENSORS_ADS7828 is not set
1812# CONFIG_SENSORS_THMC50 is not set
1813# CONFIG_SENSORS_VIA686A is not set
1814# CONFIG_SENSORS_VT1211 is not set
1815# CONFIG_SENSORS_VT8231 is not set
1816# CONFIG_SENSORS_W83781D is not set
1817# CONFIG_SENSORS_W83791D is not set
1818# CONFIG_SENSORS_W83792D is not set
1819# CONFIG_SENSORS_W83793 is not set
1820# CONFIG_SENSORS_W83L785TS is not set
1821# CONFIG_SENSORS_W83L786NG is not set
1822# CONFIG_SENSORS_W83627HF is not set
1823# CONFIG_SENSORS_W83627EHF is not set
1824# CONFIG_SENSORS_HDAPS is not set
1825# CONFIG_SENSORS_APPLESMC is not set
1826# CONFIG_HWMON_DEBUG_CHIP is not set
1827CONFIG_THERMAL=y
1828# CONFIG_THERMAL_HWMON is not set
1829# CONFIG_WATCHDOG is not set
1830
1831#
1832# Sonics Silicon Backplane
1833#
1834CONFIG_SSB_POSSIBLE=y
1835# CONFIG_SSB is not set
1836
1837#
1838# Multifunction device drivers
1839#
1840# CONFIG_MFD_CORE is not set
1841# CONFIG_MFD_SM501 is not set
1842# CONFIG_HTC_PASIC3 is not set
1843# CONFIG_MFD_TMIO is not set
1844
1845#
1846# Multimedia devices
1847#
1848
1849#
1850# Multimedia core support
1851#
1852CONFIG_VIDEO_DEV=m
1853CONFIG_VIDEO_V4L2_COMMON=m
1854CONFIG_VIDEO_ALLOW_V4L1=y
1855CONFIG_VIDEO_V4L1_COMPAT=y
1856CONFIG_DVB_CORE=m
1857CONFIG_VIDEO_MEDIA=m
1858
1859#
1860# Multimedia drivers
1861#
1862# CONFIG_MEDIA_ATTACH is not set
1863CONFIG_MEDIA_TUNER=m
1864# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set
1865CONFIG_MEDIA_TUNER_SIMPLE=m
1866CONFIG_MEDIA_TUNER_TDA8290=m
1867CONFIG_MEDIA_TUNER_TDA18271=m
1868CONFIG_MEDIA_TUNER_TDA9887=m
1869CONFIG_MEDIA_TUNER_TEA5761=m
1870CONFIG_MEDIA_TUNER_TEA5767=m
1871CONFIG_MEDIA_TUNER_MT20XX=m
1872CONFIG_MEDIA_TUNER_MT2060=m
1873CONFIG_MEDIA_TUNER_XC2028=m
1874CONFIG_MEDIA_TUNER_XC5000=m
1875CONFIG_VIDEO_V4L2=m
1876CONFIG_VIDEO_V4L1=m
1877CONFIG_VIDEOBUF_GEN=m
1878CONFIG_VIDEOBUF_VMALLOC=m
1879CONFIG_VIDEO_IR=m
1880CONFIG_VIDEO_TVEEPROM=m
1881CONFIG_VIDEO_TUNER=m
1882CONFIG_VIDEO_CAPTURE_DRIVERS=y
1883# CONFIG_VIDEO_ADV_DEBUG is not set
1884CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
1885CONFIG_VIDEO_IR_I2C=m
1886CONFIG_VIDEO_MSP3400=m
1887CONFIG_VIDEO_CS53L32A=m
1888CONFIG_VIDEO_WM8775=m
1889CONFIG_VIDEO_SAA711X=m
1890CONFIG_VIDEO_TVP5150=m
1891CONFIG_VIDEO_CX25840=m
1892CONFIG_VIDEO_CX2341X=m
1893# CONFIG_VIDEO_VIVI is not set
1894# CONFIG_VIDEO_BT848 is not set
1895# CONFIG_VIDEO_PMS is not set
1896# CONFIG_VIDEO_CPIA is not set
1897# CONFIG_VIDEO_CPIA2 is not set
1898# CONFIG_VIDEO_SAA5246A is not set
1899# CONFIG_VIDEO_SAA5249 is not set
1900# CONFIG_TUNER_3036 is not set
1901# CONFIG_VIDEO_STRADIS is not set
1902# CONFIG_VIDEO_ZORAN is not set
1903# CONFIG_VIDEO_SAA7134 is not set
1904# CONFIG_VIDEO_MXB is not set
1905# CONFIG_VIDEO_DPC is not set
1906# CONFIG_VIDEO_HEXIUM_ORION is not set
1907# CONFIG_VIDEO_HEXIUM_GEMINI is not set
1908# CONFIG_VIDEO_CX88 is not set
1909# CONFIG_VIDEO_CX23885 is not set
1910# CONFIG_VIDEO_AU0828 is not set
1911# CONFIG_VIDEO_IVTV is not set
1912# CONFIG_VIDEO_CX18 is not set
1913# CONFIG_VIDEO_CAFE_CCIC is not set
1914CONFIG_V4L_USB_DRIVERS=y
1915# CONFIG_USB_VIDEO_CLASS is not set
1916# CONFIG_USB_GSPCA is not set
1917CONFIG_VIDEO_PVRUSB2=m
1918CONFIG_VIDEO_PVRUSB2_SYSFS=y
1919CONFIG_VIDEO_PVRUSB2_DVB=y
1920# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
1921CONFIG_VIDEO_EM28XX=m
1922# CONFIG_VIDEO_EM28XX_ALSA is not set
1923# CONFIG_VIDEO_EM28XX_DVB is not set
1924# CONFIG_VIDEO_USBVISION is not set
1925CONFIG_VIDEO_USBVIDEO=m
1926CONFIG_USB_VICAM=m
1927CONFIG_USB_IBMCAM=m
1928CONFIG_USB_KONICAWC=m
1929CONFIG_USB_QUICKCAM_MESSENGER=m
1930CONFIG_USB_ET61X251=m
1931CONFIG_VIDEO_OVCAMCHIP=m
1932CONFIG_USB_W9968CF=m
1933CONFIG_USB_OV511=m
1934CONFIG_USB_SE401=m
1935CONFIG_USB_SN9C102=m
1936CONFIG_USB_STV680=m
1937# CONFIG_USB_ZC0301 is not set
1938CONFIG_USB_PWC=m
1939# CONFIG_USB_PWC_DEBUG is not set
1940# CONFIG_USB_ZR364XX is not set
1941# CONFIG_USB_STKWEBCAM is not set
1942# CONFIG_USB_S2255 is not set
1943# CONFIG_SOC_CAMERA is not set
1944# CONFIG_VIDEO_SH_MOBILE_CEU is not set
1945CONFIG_RADIO_ADAPTERS=y
1946# CONFIG_RADIO_CADET is not set
1947# CONFIG_RADIO_RTRACK is not set
1948# CONFIG_RADIO_RTRACK2 is not set
1949# CONFIG_RADIO_AZTECH is not set
1950# CONFIG_RADIO_GEMTEK is not set
1951# CONFIG_RADIO_GEMTEK_PCI is not set
1952# CONFIG_RADIO_MAXIRADIO is not set
1953# CONFIG_RADIO_MAESTRO is not set
1954# CONFIG_RADIO_SF16FMI is not set
1955# CONFIG_RADIO_SF16FMR2 is not set
1956# CONFIG_RADIO_TERRATEC is not set
1957# CONFIG_RADIO_TRUST is not set
1958# CONFIG_RADIO_TYPHOON is not set
1959# CONFIG_RADIO_ZOLTRIX is not set
1960# CONFIG_USB_DSBR is not set
1961# CONFIG_USB_SI470X is not set
1962CONFIG_DVB_CAPTURE_DRIVERS=y
1963
1964#
1965# Supported SAA7146 based PCI Adapters
1966#
1967# CONFIG_TTPCI_EEPROM is not set
1968# CONFIG_DVB_AV7110 is not set
1969# CONFIG_DVB_BUDGET_CORE is not set
1970
1971#
1972# Supported USB Adapters
1973#
1974CONFIG_DVB_USB=m
1975# CONFIG_DVB_USB_DEBUG is not set
1976CONFIG_DVB_USB_A800=m
1977CONFIG_DVB_USB_DIBUSB_MB=m
1978# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
1979CONFIG_DVB_USB_DIBUSB_MC=m
1980# CONFIG_DVB_USB_DIB0700 is not set
1981CONFIG_DVB_USB_UMT_010=m
1982# CONFIG_DVB_USB_CXUSB is not set
1983# CONFIG_DVB_USB_M920X is not set
1984# CONFIG_DVB_USB_GL861 is not set
1985# CONFIG_DVB_USB_AU6610 is not set
1986CONFIG_DVB_USB_DIGITV=m
1987CONFIG_DVB_USB_VP7045=m
1988CONFIG_DVB_USB_VP702X=m
1989CONFIG_DVB_USB_GP8PSK=m
1990CONFIG_DVB_USB_NOVA_T_USB2=m
1991# CONFIG_DVB_USB_TTUSB2 is not set
1992CONFIG_DVB_USB_DTT200U=m
1993# CONFIG_DVB_USB_OPERA1 is not set
1994# CONFIG_DVB_USB_AF9005 is not set
1995# CONFIG_DVB_USB_DW2102 is not set
1996# CONFIG_DVB_USB_ANYSEE is not set
1997# CONFIG_DVB_TTUSB_BUDGET is not set
1998# CONFIG_DVB_TTUSB_DEC is not set
1999# CONFIG_DVB_CINERGYT2 is not set
2000# CONFIG_DVB_SIANO_SMS1XXX is not set
2001
2002#
2003# Supported FlexCopII (B2C2) Adapters
2004#
2005# CONFIG_DVB_B2C2_FLEXCOP is not set
2006
2007#
2008# Supported BT878 Adapters
2009#
2010
2011#
2012# Supported Pluto2 Adapters
2013#
2014# CONFIG_DVB_PLUTO2 is not set
2015
2016#
2017# Supported DVB Frontends
2018#
2019
2020#
2021# Customise DVB Frontends
2022#
2023# CONFIG_DVB_FE_CUSTOMISE is not set
2024
2025#
2026# DVB-S (satellite) frontends
2027#
2028CONFIG_DVB_CX24110=m
2029CONFIG_DVB_CX24123=m
2030CONFIG_DVB_MT312=m
2031CONFIG_DVB_S5H1420=m
2032CONFIG_DVB_STV0299=m
2033CONFIG_DVB_TDA8083=m
2034CONFIG_DVB_TDA10086=m
2035CONFIG_DVB_VES1X93=m
2036# CONFIG_DVB_TUNER_ITD1000 is not set
2037CONFIG_DVB_TDA826X=m
2038CONFIG_DVB_TUA6100=m
2039
2040#
2041# DVB-T (terrestrial) frontends
2042#
2043CONFIG_DVB_SP8870=m
2044CONFIG_DVB_SP887X=m
2045CONFIG_DVB_CX22700=m
2046CONFIG_DVB_CX22702=m
2047# CONFIG_DVB_DRX397XD is not set
2048CONFIG_DVB_L64781=m
2049CONFIG_DVB_TDA1004X=m
2050CONFIG_DVB_NXT6000=m
2051CONFIG_DVB_MT352=m
2052CONFIG_DVB_ZL10353=m
2053CONFIG_DVB_DIB3000MB=m
2054CONFIG_DVB_DIB3000MC=m
2055# CONFIG_DVB_DIB7000M is not set
2056# CONFIG_DVB_DIB7000P is not set
2057CONFIG_DVB_TDA10048=m
2058
2059#
2060# DVB-C (cable) frontends
2061#
2062CONFIG_DVB_VES1820=m
2063CONFIG_DVB_TDA10021=m
2064# CONFIG_DVB_TDA10023 is not set
2065CONFIG_DVB_STV0297=m
2066
2067#
2068# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
2069#
2070CONFIG_DVB_NXT200X=m
2071CONFIG_DVB_OR51211=m
2072CONFIG_DVB_OR51132=m
2073CONFIG_DVB_BCM3510=m
2074CONFIG_DVB_LGDT330X=m
2075CONFIG_DVB_S5H1409=m
2076# CONFIG_DVB_AU8522 is not set
2077CONFIG_DVB_S5H1411=m
2078
2079#
2080# Digital terrestrial only tuners/PLL
2081#
2082CONFIG_DVB_PLL=m
2083# CONFIG_DVB_TUNER_DIB0070 is not set
2084
2085#
2086# SEC control devices for DVB-S
2087#
2088CONFIG_DVB_LNBP21=m
2089# CONFIG_DVB_ISL6405 is not set
2090CONFIG_DVB_ISL6421=m
2091CONFIG_DAB=y
2092CONFIG_USB_DABUSB=m
2093
2094#
2095# Graphics support
2096#
2097CONFIG_AGP=m
2098# CONFIG_AGP_ALI is not set
2099# CONFIG_AGP_ATI is not set
2100# CONFIG_AGP_AMD is not set
2101# CONFIG_AGP_AMD64 is not set
2102CONFIG_AGP_INTEL=m
2103CONFIG_AGP_NVIDIA=m
2104# CONFIG_AGP_SIS is not set
2105# CONFIG_AGP_SWORKS is not set
2106# CONFIG_AGP_VIA is not set
2107# CONFIG_AGP_EFFICEON is not set
2108CONFIG_DRM=m
2109# CONFIG_DRM_TDFX is not set
2110# CONFIG_DRM_R128 is not set
2111# CONFIG_DRM_RADEON is not set
2112# CONFIG_DRM_I810 is not set
2113# CONFIG_DRM_I830 is not set
2114# CONFIG_DRM_I915 is not set
2115# CONFIG_DRM_MGA is not set
2116# CONFIG_DRM_SIS is not set
2117# CONFIG_DRM_VIA is not set
2118# CONFIG_DRM_SAVAGE is not set
2119CONFIG_DRM_PSB=m
2120CONFIG_VGASTATE=m
2121CONFIG_VIDEO_OUTPUT_CONTROL=y
2122CONFIG_FB=y
2123CONFIG_FIRMWARE_EDID=y
2124CONFIG_FB_DDC=m
2125CONFIG_FB_CFB_FILLRECT=y
2126CONFIG_FB_CFB_COPYAREA=y
2127CONFIG_FB_CFB_IMAGEBLIT=y
2128# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
2129# CONFIG_FB_SYS_FILLRECT is not set
2130# CONFIG_FB_SYS_COPYAREA is not set
2131# CONFIG_FB_SYS_IMAGEBLIT is not set
2132# CONFIG_FB_FOREIGN_ENDIAN is not set
2133# CONFIG_FB_SYS_FOPS is not set
2134# CONFIG_FB_SVGALIB is not set
2135# CONFIG_FB_MACMODES is not set
2136CONFIG_FB_BACKLIGHT=y
2137CONFIG_FB_MODE_HELPERS=y
2138CONFIG_FB_TILEBLITTING=y
2139
2140#
2141# Frame buffer hardware drivers
2142#
2143# CONFIG_FB_CIRRUS is not set
2144# CONFIG_FB_PM2 is not set
2145# CONFIG_FB_CYBER2000 is not set
2146# CONFIG_FB_ARC is not set
2147# CONFIG_FB_ASILIANT is not set
2148# CONFIG_FB_IMSTT is not set
2149CONFIG_FB_VGA16=m
2150# CONFIG_FB_UVESA is not set
2151CONFIG_FB_VESA=y
2152# CONFIG_FB_EFI is not set
2153# CONFIG_FB_IMAC is not set
2154# CONFIG_FB_N411 is not set
2155# CONFIG_FB_HGA is not set
2156# CONFIG_FB_S1D13XXX is not set
2157CONFIG_FB_NVIDIA=m
2158CONFIG_FB_NVIDIA_I2C=y
2159# CONFIG_FB_NVIDIA_DEBUG is not set
2160CONFIG_FB_NVIDIA_BACKLIGHT=y
2161CONFIG_FB_RIVA=m
2162CONFIG_FB_RIVA_I2C=y
2163# CONFIG_FB_RIVA_DEBUG is not set
2164CONFIG_FB_RIVA_BACKLIGHT=y
2165CONFIG_FB_I810=m
2166CONFIG_FB_I810_GTF=y
2167CONFIG_FB_I810_I2C=y
2168# CONFIG_FB_LE80578 is not set
2169CONFIG_FB_INTEL=m
2170# CONFIG_FB_INTEL_DEBUG is not set
2171CONFIG_FB_INTEL_I2C=y
2172# CONFIG_FB_MATROX is not set
2173CONFIG_FB_RADEON=m
2174CONFIG_FB_RADEON_I2C=y
2175CONFIG_FB_RADEON_BACKLIGHT=y
2176# CONFIG_FB_RADEON_DEBUG is not set
2177# CONFIG_FB_ATY128 is not set
2178CONFIG_FB_ATY=m
2179CONFIG_FB_ATY_CT=y
2180CONFIG_FB_ATY_GENERIC_LCD=y
2181CONFIG_FB_ATY_GX=y
2182CONFIG_FB_ATY_BACKLIGHT=y
2183# CONFIG_FB_S3 is not set
2184# CONFIG_FB_SAVAGE is not set
2185# CONFIG_FB_SIS is not set
2186# CONFIG_FB_NEOMAGIC is not set
2187# CONFIG_FB_KYRO is not set
2188# CONFIG_FB_3DFX is not set
2189# CONFIG_FB_VOODOO1 is not set
2190# CONFIG_FB_VT8623 is not set
2191# CONFIG_FB_CYBLA is not set
2192# CONFIG_FB_TRIDENT is not set
2193# CONFIG_FB_ARK is not set
2194# CONFIG_FB_PM3 is not set
2195# CONFIG_FB_CARMINE is not set
2196# CONFIG_FB_GEODE is not set
2197# CONFIG_FB_VIRTUAL is not set
2198CONFIG_BACKLIGHT_LCD_SUPPORT=y
2199CONFIG_LCD_CLASS_DEVICE=m
2200# CONFIG_LCD_LTV350QV is not set
2201# CONFIG_LCD_ILI9320 is not set
2202# CONFIG_LCD_VGG2432A4 is not set
2203# CONFIG_LCD_PLATFORM is not set
2204CONFIG_BACKLIGHT_CLASS_DEVICE=y
2205# CONFIG_BACKLIGHT_CORGI is not set
2206# CONFIG_BACKLIGHT_PROGEAR is not set
2207# CONFIG_BACKLIGHT_MBP_NVIDIA is not set
2208
2209#
2210# Display device support
2211#
2212# CONFIG_DISPLAY_SUPPORT is not set
2213
2214#
2215# Console display driver support
2216#
2217CONFIG_VGA_CONSOLE=y
2218CONFIG_VGACON_SOFT_SCROLLBACK=y
2219CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
2220CONFIG_VIDEO_SELECT=y
2221CONFIG_MDA_CONSOLE=m
2222CONFIG_DUMMY_CONSOLE=y
2223CONFIG_FRAMEBUFFER_CONSOLE=y
2224# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
2225CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
2226# CONFIG_FONTS is not set
2227CONFIG_FONT_8x8=y
2228CONFIG_FONT_8x16=y
2229# CONFIG_LOGO is not set
2230CONFIG_SOUND=m
2231CONFIG_SND=m
2232CONFIG_SND_TIMER=m
2233CONFIG_SND_PCM=m
2234CONFIG_SND_HWDEP=m
2235CONFIG_SND_RAWMIDI=m
2236CONFIG_SND_SEQUENCER=m
2237CONFIG_SND_SEQ_DUMMY=m
2238CONFIG_SND_OSSEMUL=y
2239CONFIG_SND_MIXER_OSS=m
2240CONFIG_SND_PCM_OSS=m
2241CONFIG_SND_PCM_OSS_PLUGINS=y
2242CONFIG_SND_SEQUENCER_OSS=y
2243CONFIG_SND_DYNAMIC_MINORS=y
2244CONFIG_SND_SUPPORT_OLD_API=y
2245CONFIG_SND_VERBOSE_PROCFS=y
2246CONFIG_SND_VERBOSE_PRINTK=y
2247CONFIG_SND_DEBUG=y
2248# CONFIG_SND_DEBUG_VERBOSE is not set
2249# CONFIG_SND_PCM_XRUN_DEBUG is not set
2250CONFIG_SND_VMASTER=y
2251CONFIG_SND_MPU401_UART=m
2252CONFIG_SND_AC97_CODEC=m
2253CONFIG_SND_DRIVERS=y
2254CONFIG_SND_DUMMY=m
2255CONFIG_SND_VIRMIDI=m
2256CONFIG_SND_MTPAV=m
2257CONFIG_SND_SERIAL_U16550=m
2258CONFIG_SND_MPU401=m
2259CONFIG_SND_AC97_POWER_SAVE=y
2260CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0
2261CONFIG_SND_ISA=y
2262# CONFIG_SND_ADLIB is not set
2263# CONFIG_SND_AD1816A is not set
2264# CONFIG_SND_AD1848 is not set
2265# CONFIG_SND_ALS100 is not set
2266# CONFIG_SND_AZT2320 is not set
2267# CONFIG_SND_CMI8330 is not set
2268# CONFIG_SND_CS4231 is not set
2269# CONFIG_SND_CS4232 is not set
2270# CONFIG_SND_CS4236 is not set
2271# CONFIG_SND_DT019X is not set
2272# CONFIG_SND_ES968 is not set
2273# CONFIG_SND_ES1688 is not set
2274# CONFIG_SND_ES18XX is not set
2275# CONFIG_SND_SC6000 is not set
2276# CONFIG_SND_GUSCLASSIC is not set
2277# CONFIG_SND_GUSEXTREME is not set
2278# CONFIG_SND_GUSMAX is not set
2279# CONFIG_SND_INTERWAVE is not set
2280# CONFIG_SND_INTERWAVE_STB is not set
2281# CONFIG_SND_OPL3SA2 is not set
2282# CONFIG_SND_OPTI92X_AD1848 is not set
2283# CONFIG_SND_OPTI92X_CS4231 is not set
2284# CONFIG_SND_OPTI93X is not set
2285# CONFIG_SND_MIRO is not set
2286# CONFIG_SND_SB8 is not set
2287# CONFIG_SND_SB16 is not set
2288# CONFIG_SND_SBAWE is not set
2289# CONFIG_SND_SGALAXY is not set
2290# CONFIG_SND_SSCAPE is not set
2291# CONFIG_SND_WAVEFRONT is not set
2292CONFIG_SND_PCI=y
2293# CONFIG_SND_AD1889 is not set
2294# CONFIG_SND_ALS300 is not set
2295# CONFIG_SND_ALS4000 is not set
2296# CONFIG_SND_ALI5451 is not set
2297# CONFIG_SND_ATIIXP is not set
2298# CONFIG_SND_ATIIXP_MODEM is not set
2299# CONFIG_SND_AU8810 is not set
2300# CONFIG_SND_AU8820 is not set
2301# CONFIG_SND_AU8830 is not set
2302# CONFIG_SND_AW2 is not set
2303# CONFIG_SND_AZT3328 is not set
2304# CONFIG_SND_BT87X is not set
2305# CONFIG_SND_CA0106 is not set
2306# CONFIG_SND_CMIPCI is not set
2307# CONFIG_SND_OXYGEN is not set
2308# CONFIG_SND_CS4281 is not set
2309# CONFIG_SND_CS46XX is not set
2310# CONFIG_SND_CS5530 is not set
2311# CONFIG_SND_CS5535AUDIO is not set
2312# CONFIG_SND_DARLA20 is not set
2313# CONFIG_SND_GINA20 is not set
2314# CONFIG_SND_LAYLA20 is not set
2315# CONFIG_SND_DARLA24 is not set
2316# CONFIG_SND_GINA24 is not set
2317# CONFIG_SND_LAYLA24 is not set
2318# CONFIG_SND_MONA is not set
2319# CONFIG_SND_MIA is not set
2320# CONFIG_SND_ECHO3G is not set
2321# CONFIG_SND_INDIGO is not set
2322# CONFIG_SND_INDIGOIO is not set
2323# CONFIG_SND_INDIGODJ is not set
2324# CONFIG_SND_EMU10K1 is not set
2325# CONFIG_SND_EMU10K1X is not set
2326# CONFIG_SND_ENS1370 is not set
2327# CONFIG_SND_ENS1371 is not set
2328# CONFIG_SND_ES1938 is not set
2329# CONFIG_SND_ES1968 is not set
2330# CONFIG_SND_FM801 is not set
2331CONFIG_SND_HDA_INTEL=m
2332# CONFIG_SND_HDA_HWDEP is not set
2333CONFIG_SND_HDA_CODEC_REALTEK=y
2334CONFIG_SND_HDA_CODEC_ANALOG=y
2335CONFIG_SND_HDA_CODEC_SIGMATEL=y
2336CONFIG_SND_HDA_CODEC_VIA=y
2337CONFIG_SND_HDA_CODEC_ATIHDMI=y
2338CONFIG_SND_HDA_CODEC_CONEXANT=y
2339CONFIG_SND_HDA_CODEC_CMEDIA=y
2340CONFIG_SND_HDA_CODEC_SI3054=y
2341CONFIG_SND_HDA_GENERIC=y
2342# CONFIG_SND_HDA_POWER_SAVE is not set
2343# CONFIG_SND_HDSP is not set
2344# CONFIG_SND_HDSPM is not set
2345# CONFIG_SND_HIFIER is not set
2346# CONFIG_SND_ICE1712 is not set
2347# CONFIG_SND_ICE1724 is not set
2348CONFIG_SND_INTEL8X0=m
2349CONFIG_SND_INTEL8X0M=m
2350# CONFIG_SND_KORG1212 is not set
2351# CONFIG_SND_MAESTRO3 is not set
2352# CONFIG_SND_MIXART is not set
2353# CONFIG_SND_NM256 is not set
2354# CONFIG_SND_PCXHR is not set
2355# CONFIG_SND_RIPTIDE is not set
2356# CONFIG_SND_RME32 is not set
2357# CONFIG_SND_RME96 is not set
2358# CONFIG_SND_RME9652 is not set
2359# CONFIG_SND_SIS7019 is not set
2360# CONFIG_SND_SONICVIBES is not set
2361# CONFIG_SND_TRIDENT is not set
2362# CONFIG_SND_VIA82XX is not set
2363# CONFIG_SND_VIA82XX_MODEM is not set
2364# CONFIG_SND_VIRTUOSO is not set
2365# CONFIG_SND_VX222 is not set
2366# CONFIG_SND_YMFPCI is not set
2367CONFIG_SND_SPI=y
2368CONFIG_SND_USB=y
2369CONFIG_SND_USB_AUDIO=m
2370# CONFIG_SND_USB_USX2Y is not set
2371# CONFIG_SND_USB_CAIAQ is not set
2372# CONFIG_SND_SOC is not set
2373# CONFIG_SOUND_PRIME is not set
2374CONFIG_AC97_BUS=m
2375CONFIG_HID_SUPPORT=y
2376CONFIG_HID=y
2377# CONFIG_HID_DEBUG is not set
2378# CONFIG_HIDRAW is not set
2379
2380#
2381# USB Input Devices
2382#
2383CONFIG_USB_HID=y
2384CONFIG_USB_HIDINPUT_POWERBOOK=y
2385CONFIG_HID_FF=y
2386CONFIG_HID_PID=y
2387CONFIG_LOGITECH_FF=y
2388# CONFIG_LOGIRUMBLEPAD2_FF is not set
2389# CONFIG_PANTHERLORD_FF is not set
2390CONFIG_THRUSTMASTER_FF=y
2391# CONFIG_ZEROPLUS_FF is not set
2392CONFIG_USB_HIDDEV=y
2393CONFIG_USB_SUPPORT=y
2394CONFIG_USB_ARCH_HAS_HCD=y
2395CONFIG_USB_ARCH_HAS_OHCI=y
2396CONFIG_USB_ARCH_HAS_EHCI=y
2397CONFIG_USB=y
2398# CONFIG_USB_DEBUG is not set
2399# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
2400
2401#
2402# Miscellaneous USB options
2403#
2404CONFIG_USB_DEVICEFS=y
2405CONFIG_USB_DEVICE_CLASS=y
2406# CONFIG_USB_DYNAMIC_MINORS is not set
2407CONFIG_USB_SUSPEND=y
2408# CONFIG_USB_OTG is not set
2409CONFIG_USB_MON=y
2410
2411#
2412# USB Host Controller Drivers
2413#
2414# CONFIG_USB_C67X00_HCD is not set
2415CONFIG_USB_EHCI_HCD=y
2416CONFIG_USB_EHCI_ROOT_HUB_TT=y
2417CONFIG_USB_EHCI_TT_NEWSCHED=y
2418# CONFIG_USB_ISP116X_HCD is not set
2419# CONFIG_USB_ISP1760_HCD is not set
2420CONFIG_USB_OHCI_HCD=y
2421# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
2422# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
2423CONFIG_USB_OHCI_LITTLE_ENDIAN=y
2424CONFIG_USB_UHCI_HCD=y
2425# CONFIG_USB_SL811_HCD is not set
2426# CONFIG_USB_R8A66597_HCD is not set
2427# CONFIG_USB_GADGET_MUSB_HDRC is not set
2428
2429#
2430# USB Device Class drivers
2431#
2432CONFIG_USB_ACM=m
2433CONFIG_USB_PRINTER=m
2434# CONFIG_USB_WDM is not set
2435
2436#
2437# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
2438#
2439
2440#
2441# may also be needed; see USB_STORAGE Help for more information
2442#
2443CONFIG_USB_STORAGE=y
2444# CONFIG_USB_STORAGE_DEBUG is not set
2445CONFIG_USB_STORAGE_DATAFAB=y
2446CONFIG_USB_STORAGE_FREECOM=y
2447# CONFIG_USB_STORAGE_ISD200 is not set
2448CONFIG_USB_STORAGE_DPCM=y
2449CONFIG_USB_STORAGE_USBAT=y
2450CONFIG_USB_STORAGE_SDDR09=y
2451CONFIG_USB_STORAGE_SDDR55=y
2452CONFIG_USB_STORAGE_JUMPSHOT=y
2453CONFIG_USB_STORAGE_ALAUDA=y
2454# CONFIG_USB_STORAGE_ONETOUCH is not set
2455# CONFIG_USB_STORAGE_KARMA is not set
2456# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
2457# CONFIG_USB_LIBUSUAL is not set
2458
2459#
2460# USB Imaging devices
2461#
2462CONFIG_USB_MDC800=m
2463CONFIG_USB_MICROTEK=m
2464
2465#
2466# USB port drivers
2467#
2468CONFIG_USB_SERIAL=m
2469CONFIG_USB_EZUSB=y
2470CONFIG_USB_SERIAL_GENERIC=y
2471# CONFIG_USB_SERIAL_AIRCABLE is not set
2472CONFIG_USB_SERIAL_ARK3116=m
2473CONFIG_USB_SERIAL_BELKIN=m
2474# CONFIG_USB_SERIAL_CH341 is not set
2475CONFIG_USB_SERIAL_WHITEHEAT=m
2476CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
2477CONFIG_USB_SERIAL_CP2101=m
2478CONFIG_USB_SERIAL_CYPRESS_M8=m
2479CONFIG_USB_SERIAL_EMPEG=m
2480CONFIG_USB_SERIAL_FTDI_SIO=m
2481CONFIG_USB_SERIAL_FUNSOFT=m
2482CONFIG_USB_SERIAL_VISOR=m
2483CONFIG_USB_SERIAL_IPAQ=m
2484CONFIG_USB_SERIAL_IR=m
2485CONFIG_USB_SERIAL_EDGEPORT=m
2486CONFIG_USB_SERIAL_EDGEPORT_TI=m
2487CONFIG_USB_SERIAL_GARMIN=m
2488CONFIG_USB_SERIAL_IPW=m
2489# CONFIG_USB_SERIAL_IUU is not set
2490CONFIG_USB_SERIAL_KEYSPAN_PDA=m
2491CONFIG_USB_SERIAL_KEYSPAN=m
2492CONFIG_USB_SERIAL_KEYSPAN_MPR=y
2493CONFIG_USB_SERIAL_KEYSPAN_USA28=y
2494CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
2495CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
2496CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
2497CONFIG_USB_SERIAL_KEYSPAN_USA19=y
2498CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
2499CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
2500CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
2501CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
2502CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
2503CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
2504CONFIG_USB_SERIAL_KLSI=m
2505CONFIG_USB_SERIAL_KOBIL_SCT=m
2506CONFIG_USB_SERIAL_MCT_U232=m
2507# CONFIG_USB_SERIAL_MOS7720 is not set
2508# CONFIG_USB_SERIAL_MOS7840 is not set
2509# CONFIG_USB_SERIAL_MOTOROLA is not set
2510CONFIG_USB_SERIAL_NAVMAN=m
2511CONFIG_USB_SERIAL_PL2303=m
2512# CONFIG_USB_SERIAL_OTI6858 is not set
2513# CONFIG_USB_SERIAL_SPCP8X5 is not set
2514CONFIG_USB_SERIAL_HP4X=m
2515CONFIG_USB_SERIAL_SAFE=m
2516CONFIG_USB_SERIAL_SAFE_PADDED=y
2517CONFIG_USB_SERIAL_SIERRAWIRELESS=m
2518CONFIG_USB_SERIAL_TI=m
2519CONFIG_USB_SERIAL_CYBERJACK=m
2520CONFIG_USB_SERIAL_XIRCOM=m
2521CONFIG_USB_SERIAL_OPTION=m
2522CONFIG_USB_SERIAL_OMNINET=m
2523# CONFIG_USB_SERIAL_DEBUG is not set
2524
2525#
2526# USB Miscellaneous drivers
2527#
2528CONFIG_USB_EMI62=m
2529CONFIG_USB_EMI26=m
2530# CONFIG_USB_ADUTUX is not set
2531CONFIG_USB_RIO500=m
2532CONFIG_USB_LEGOTOWER=m
2533CONFIG_USB_LCD=m
2534# CONFIG_USB_BERRY_CHARGE is not set
2535CONFIG_USB_LED=m
2536CONFIG_USB_CYPRESS_CY7C63=m
2537CONFIG_USB_CYTHERM=m
2538# CONFIG_USB_PHIDGET is not set
2539CONFIG_USB_IDMOUSE=m
2540# CONFIG_USB_FTDI_ELAN is not set
2541CONFIG_USB_APPLEDISPLAY=m
2542CONFIG_USB_SISUSBVGA=m
2543CONFIG_USB_SISUSBVGA_CON=y
2544CONFIG_USB_LD=m
2545# CONFIG_USB_TRANCEVIBRATOR is not set
2546# CONFIG_USB_IOWARRIOR is not set
2547# CONFIG_USB_TEST is not set
2548# CONFIG_USB_ISIGHTFW is not set
2549CONFIG_USB_ATM=m
2550CONFIG_USB_SPEEDTOUCH=m
2551CONFIG_USB_CXACRU=m
2552CONFIG_USB_UEAGLEATM=m
2553CONFIG_USB_XUSBATM=m
2554CONFIG_USB_GADGET=y
2555# CONFIG_USB_GADGET_DEBUG is not set
2556CONFIG_USB_GADGET_DEBUG_FILES=y
2557# CONFIG_USB_GADGET_DEBUG_FS is not set
2558CONFIG_USB_GADGET_SELECTED=y
2559CONFIG_USB_GADGET_AMD5536UDC=y
2560CONFIG_USB_AMD5536UDC=y
2561# CONFIG_USB_GADGET_ATMEL_USBA is not set
2562# CONFIG_USB_GADGET_FSL_USB2 is not set
2563# CONFIG_USB_GADGET_NET2280 is not set
2564# CONFIG_USB_GADGET_PXA25X is not set
2565# CONFIG_USB_GADGET_M66592 is not set
2566# CONFIG_USB_GADGET_PXA27X is not set
2567# CONFIG_USB_GADGET_GOKU is not set
2568# CONFIG_USB_GADGET_LH7A40X is not set
2569# CONFIG_USB_GADGET_OMAP is not set
2570# CONFIG_USB_GADGET_S3C2410 is not set
2571# CONFIG_USB_GADGET_AT91 is not set
2572# CONFIG_USB_GADGET_DUMMY_HCD is not set
2573CONFIG_USB_GADGET_DUALSPEED=y
2574# CONFIG_USB_ZERO is not set
2575CONFIG_USB_ETH=m
2576CONFIG_USB_ETH_RNDIS=y
2577# CONFIG_USB_GADGETFS is not set
2578CONFIG_USB_FILE_STORAGE=m
2579CONFIG_USB_FILE_STORAGE_TEST=y
2580# CONFIG_USB_G_SERIAL is not set
2581# CONFIG_USB_MIDI_GADGET is not set
2582# CONFIG_USB_G_PRINTER is not set
2583# CONFIG_USB_CDC_COMPOSITE is not set
2584CONFIG_MMC=y
2585# CONFIG_MMC_DEBUG is not set
2586CONFIG_MMC_UNSAFE_RESUME=y
2587
2588#
2589# MMC/SD Card Drivers
2590#
2591CONFIG_MMC_BLOCK=y
2592CONFIG_MMC_BLOCK_BOUNCE=y
2593# CONFIG_SDIO_UART is not set
2594# CONFIG_MMC_TEST is not set
2595
2596#
2597# MMC/SD Host Controller Drivers
2598#
2599CONFIG_MMC_SDHCI=y
2600# CONFIG_MMC_SDHCI_PCI is not set
2601# CONFIG_MMC_WBSD is not set
2602# CONFIG_MMC_TIFM_SD is not set
2603# CONFIG_MEMSTICK is not set
2604CONFIG_NEW_LEDS=y
2605CONFIG_LEDS_CLASS=m
2606
2607#
2608# LED drivers
2609#
2610# CONFIG_LEDS_PCA9532 is not set
2611# CONFIG_LEDS_CLEVO_MAIL is not set
2612# CONFIG_LEDS_PCA955X is not set
2613
2614#
2615# LED Triggers
2616#
2617CONFIG_LEDS_TRIGGERS=y
2618CONFIG_LEDS_TRIGGER_TIMER=m
2619CONFIG_LEDS_TRIGGER_HEARTBEAT=m
2620# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
2621# CONFIG_ACCESSIBILITY is not set
2622# CONFIG_INFINIBAND is not set
2623# CONFIG_EDAC is not set
2624CONFIG_RTC_LIB=m
2625CONFIG_RTC_CLASS=m
2626
2627#
2628# RTC interfaces
2629#
2630CONFIG_RTC_INTF_SYSFS=y
2631CONFIG_RTC_INTF_PROC=y
2632CONFIG_RTC_INTF_DEV=y
2633CONFIG_RTC_INTF_DEV_UIE_EMUL=y
2634CONFIG_RTC_DRV_TEST=m
2635
2636#
2637# I2C RTC drivers
2638#
2639CONFIG_RTC_DRV_DS1307=m
2640# CONFIG_RTC_DRV_DS1374 is not set
2641CONFIG_RTC_DRV_DS1672=m
2642# CONFIG_RTC_DRV_MAX6900 is not set
2643CONFIG_RTC_DRV_RS5C372=m
2644CONFIG_RTC_DRV_ISL1208=m
2645CONFIG_RTC_DRV_X1205=m
2646CONFIG_RTC_DRV_PCF8563=m
2647CONFIG_RTC_DRV_PCF8583=m
2648# CONFIG_RTC_DRV_M41T80 is not set
2649# CONFIG_RTC_DRV_S35390A is not set
2650# CONFIG_RTC_DRV_FM3130 is not set
2651
2652#
2653# SPI RTC drivers
2654#
2655# CONFIG_RTC_DRV_M41T94 is not set
2656# CONFIG_RTC_DRV_DS1305 is not set
2657CONFIG_RTC_DRV_MAX6902=m
2658# CONFIG_RTC_DRV_R9701 is not set
2659CONFIG_RTC_DRV_RS5C348=m
2660
2661#
2662# Platform RTC drivers
2663#
2664# CONFIG_RTC_DRV_CMOS is not set
2665# CONFIG_RTC_DRV_DS1511 is not set
2666CONFIG_RTC_DRV_DS1553=m
2667CONFIG_RTC_DRV_DS1742=m
2668# CONFIG_RTC_DRV_STK17TA8 is not set
2669CONFIG_RTC_DRV_M48T86=m
2670# CONFIG_RTC_DRV_M48T59 is not set
2671CONFIG_RTC_DRV_V3020=m
2672
2673#
2674# on-CPU RTC drivers
2675#
2676# CONFIG_DMADEVICES is not set
2677# CONFIG_UIO is not set
2678
2679#
2680# Firmware Drivers
2681#
2682CONFIG_EDD=m
2683# CONFIG_EDD_OFF is not set
2684CONFIG_FIRMWARE_MEMMAP=y
2685# CONFIG_EFI_VARS is not set
2686# CONFIG_DELL_RBU is not set
2687# CONFIG_DCDBAS is not set
2688CONFIG_DMIID=y
2689# CONFIG_ISCSI_IBFT_FIND is not set
2690
2691#
2692# File systems
2693#
2694CONFIG_EXT2_FS=y
2695CONFIG_EXT2_FS_XATTR=y
2696CONFIG_EXT2_FS_POSIX_ACL=y
2697CONFIG_EXT2_FS_SECURITY=y
2698# CONFIG_EXT2_FS_XIP is not set
2699CONFIG_EXT3_FS=y
2700CONFIG_EXT3_FS_XATTR=y
2701CONFIG_EXT3_FS_POSIX_ACL=y
2702CONFIG_EXT3_FS_SECURITY=y
2703# CONFIG_EXT4DEV_FS is not set
2704CONFIG_JBD=y
2705# CONFIG_JBD_DEBUG is not set
2706CONFIG_FS_MBCACHE=y
2707CONFIG_REISERFS_FS=m
2708# CONFIG_REISERFS_CHECK is not set
2709# CONFIG_REISERFS_PROC_INFO is not set
2710CONFIG_REISERFS_FS_XATTR=y
2711CONFIG_REISERFS_FS_POSIX_ACL=y
2712CONFIG_REISERFS_FS_SECURITY=y
2713CONFIG_JFS_FS=m
2714CONFIG_JFS_POSIX_ACL=y
2715CONFIG_JFS_SECURITY=y
2716# CONFIG_JFS_DEBUG is not set
2717CONFIG_JFS_STATISTICS=y
2718CONFIG_FS_POSIX_ACL=y
2719# CONFIG_XFS_FS is not set
2720# CONFIG_GFS2_FS is not set
2721# CONFIG_OCFS2_FS is not set
2722CONFIG_DNOTIFY=y
2723CONFIG_INOTIFY=y
2724CONFIG_INOTIFY_USER=y
2725CONFIG_QUOTA=y
2726# CONFIG_QUOTA_NETLINK_INTERFACE is not set
2727CONFIG_PRINT_QUOTA_WARNING=y
2728CONFIG_QFMT_V1=m
2729CONFIG_QFMT_V2=m
2730CONFIG_QUOTACTL=y
2731CONFIG_AUTOFS_FS=m
2732CONFIG_AUTOFS4_FS=m
2733CONFIG_FUSE_FS=m
2734CONFIG_GENERIC_ACL=y
2735
2736#
2737# CD-ROM/DVD Filesystems
2738#
2739CONFIG_ISO9660_FS=y
2740CONFIG_JOLIET=y
2741CONFIG_ZISOFS=y
2742CONFIG_UDF_FS=m
2743CONFIG_UDF_NLS=y
2744
2745#
2746# DOS/FAT/NT Filesystems
2747#
2748CONFIG_FAT_FS=y
2749CONFIG_MSDOS_FS=y
2750CONFIG_VFAT_FS=y
2751CONFIG_FAT_DEFAULT_CODEPAGE=437
2752CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
2753CONFIG_NTFS_FS=m
2754# CONFIG_NTFS_DEBUG is not set
2755CONFIG_NTFS_RW=y
2756
2757#
2758# Pseudo filesystems
2759#
2760CONFIG_PROC_FS=y
2761CONFIG_PROC_KCORE=y
2762CONFIG_PROC_SYSCTL=y
2763CONFIG_SYSFS=y
2764CONFIG_TMPFS=y
2765CONFIG_TMPFS_POSIX_ACL=y
2766CONFIG_HUGETLBFS=y
2767CONFIG_HUGETLB_PAGE=y
2768CONFIG_CONFIGFS_FS=m
2769
2770#
2771# Miscellaneous filesystems
2772#
2773CONFIG_ADFS_FS=m
2774# CONFIG_ADFS_FS_RW is not set
2775CONFIG_AFFS_FS=m
2776# CONFIG_ECRYPT_FS is not set
2777CONFIG_HFS_FS=m
2778CONFIG_HFSPLUS_FS=m
2779CONFIG_BEFS_FS=m
2780# CONFIG_BEFS_DEBUG is not set
2781CONFIG_BFS_FS=m
2782CONFIG_EFS_FS=m
2783CONFIG_JFFS2_FS=m
2784CONFIG_JFFS2_FS_DEBUG=0
2785CONFIG_JFFS2_FS_WRITEBUFFER=y
2786# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
2787CONFIG_JFFS2_SUMMARY=y
2788CONFIG_JFFS2_FS_XATTR=y
2789CONFIG_JFFS2_FS_POSIX_ACL=y
2790CONFIG_JFFS2_FS_SECURITY=y
2791CONFIG_JFFS2_COMPRESSION_OPTIONS=y
2792CONFIG_JFFS2_ZLIB=y
2793# CONFIG_JFFS2_LZO is not set
2794CONFIG_JFFS2_RTIME=y
2795# CONFIG_JFFS2_RUBIN is not set
2796# CONFIG_JFFS2_CMODE_NONE is not set
2797CONFIG_JFFS2_CMODE_PRIORITY=y
2798# CONFIG_JFFS2_CMODE_SIZE is not set
2799# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
2800CONFIG_CRAMFS=y
2801CONFIG_VXFS_FS=m
2802# CONFIG_MINIX_FS is not set
2803# CONFIG_OMFS_FS is not set
2804CONFIG_HPFS_FS=m
2805CONFIG_QNX4FS_FS=m
2806CONFIG_ROMFS_FS=m
2807CONFIG_SYSV_FS=m
2808CONFIG_UFS_FS=m
2809CONFIG_UFS_FS_WRITE=y
2810# CONFIG_UFS_DEBUG is not set
2811CONFIG_NETWORK_FILESYSTEMS=y
2812CONFIG_NFS_FS=m
2813CONFIG_NFS_V3=y
2814CONFIG_NFS_V3_ACL=y
2815CONFIG_NFS_V4=y
2816CONFIG_NFSD=m
2817CONFIG_NFSD_V2_ACL=y
2818CONFIG_NFSD_V3=y
2819CONFIG_NFSD_V3_ACL=y
2820CONFIG_NFSD_V4=y
2821CONFIG_LOCKD=m
2822CONFIG_LOCKD_V4=y
2823CONFIG_EXPORTFS=m
2824CONFIG_NFS_ACL_SUPPORT=m
2825CONFIG_NFS_COMMON=y
2826CONFIG_SUNRPC=m
2827CONFIG_SUNRPC_GSS=m
2828CONFIG_RPCSEC_GSS_KRB5=m
2829CONFIG_RPCSEC_GSS_SPKM3=m
2830CONFIG_SMB_FS=y
2831# CONFIG_SMB_NLS_DEFAULT is not set
2832CONFIG_CIFS=m
2833CONFIG_CIFS_STATS=y
2834CONFIG_CIFS_STATS2=y
2835CONFIG_CIFS_WEAK_PW_HASH=y
2836# CONFIG_CIFS_UPCALL is not set
2837CONFIG_CIFS_XATTR=y
2838CONFIG_CIFS_POSIX=y
2839# CONFIG_CIFS_DEBUG2 is not set
2840# CONFIG_CIFS_EXPERIMENTAL is not set
2841# CONFIG_NCP_FS is not set
2842# CONFIG_CODA_FS is not set
2843# CONFIG_AFS_FS is not set
2844
2845#
2846# Partition Types
2847#
2848CONFIG_PARTITION_ADVANCED=y
2849# CONFIG_ACORN_PARTITION is not set
2850CONFIG_OSF_PARTITION=y
2851# CONFIG_AMIGA_PARTITION is not set
2852CONFIG_ATARI_PARTITION=y
2853CONFIG_MAC_PARTITION=y
2854CONFIG_MSDOS_PARTITION=y
2855CONFIG_BSD_DISKLABEL=y
2856# CONFIG_MINIX_SUBPARTITION is not set
2857CONFIG_SOLARIS_X86_PARTITION=y
2858CONFIG_UNIXWARE_DISKLABEL=y
2859CONFIG_LDM_PARTITION=y
2860# CONFIG_LDM_DEBUG is not set
2861CONFIG_SGI_PARTITION=y
2862CONFIG_ULTRIX_PARTITION=y
2863CONFIG_SUN_PARTITION=y
2864CONFIG_KARMA_PARTITION=y
2865CONFIG_EFI_PARTITION=y
2866# CONFIG_SYSV68_PARTITION is not set
2867CONFIG_NLS=y
2868CONFIG_NLS_DEFAULT="utf8"
2869CONFIG_NLS_CODEPAGE_437=y
2870CONFIG_NLS_CODEPAGE_737=m
2871CONFIG_NLS_CODEPAGE_775=m
2872CONFIG_NLS_CODEPAGE_850=m
2873CONFIG_NLS_CODEPAGE_852=m
2874CONFIG_NLS_CODEPAGE_855=m
2875CONFIG_NLS_CODEPAGE_857=m
2876CONFIG_NLS_CODEPAGE_860=m
2877CONFIG_NLS_CODEPAGE_861=m
2878CONFIG_NLS_CODEPAGE_862=m
2879CONFIG_NLS_CODEPAGE_863=m
2880CONFIG_NLS_CODEPAGE_864=m
2881CONFIG_NLS_CODEPAGE_865=m
2882CONFIG_NLS_CODEPAGE_866=m
2883CONFIG_NLS_CODEPAGE_869=m
2884CONFIG_NLS_CODEPAGE_936=m
2885CONFIG_NLS_CODEPAGE_950=m
2886CONFIG_NLS_CODEPAGE_932=m
2887CONFIG_NLS_CODEPAGE_949=m
2888CONFIG_NLS_CODEPAGE_874=m
2889CONFIG_NLS_ISO8859_8=m
2890CONFIG_NLS_CODEPAGE_1250=m
2891CONFIG_NLS_CODEPAGE_1251=m
2892CONFIG_NLS_ASCII=y
2893CONFIG_NLS_ISO8859_1=y
2894CONFIG_NLS_ISO8859_2=m
2895CONFIG_NLS_ISO8859_3=m
2896CONFIG_NLS_ISO8859_4=m
2897CONFIG_NLS_ISO8859_5=m
2898CONFIG_NLS_ISO8859_6=m
2899CONFIG_NLS_ISO8859_7=m
2900CONFIG_NLS_ISO8859_9=m
2901CONFIG_NLS_ISO8859_13=m
2902CONFIG_NLS_ISO8859_14=m
2903CONFIG_NLS_ISO8859_15=m
2904CONFIG_NLS_KOI8_R=m
2905CONFIG_NLS_KOI8_U=m
2906CONFIG_NLS_UTF8=m
2907# CONFIG_DLM is not set
2908
2909#
2910# Kernel hacking
2911#
2912CONFIG_TRACE_IRQFLAGS_SUPPORT=y
2913# CONFIG_PRINTK_TIME is not set
2914CONFIG_ENABLE_WARN_DEPRECATED=y
2915CONFIG_ENABLE_MUST_CHECK=y
2916CONFIG_FRAME_WARN=1024
2917CONFIG_MAGIC_SYSRQ=y
2918# CONFIG_UNUSED_SYMBOLS is not set
2919CONFIG_DEBUG_FS=y
2920# CONFIG_HEADERS_CHECK is not set
2921CONFIG_DEBUG_KERNEL=y
2922# CONFIG_DEBUG_SHIRQ is not set
2923CONFIG_DETECT_SOFTLOCKUP=y
2924# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
2925CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
2926CONFIG_SCHED_DEBUG=y
2927# CONFIG_SCHEDSTATS is not set
2928CONFIG_TIMER_STATS=y
2929# CONFIG_DEBUG_OBJECTS is not set
2930# CONFIG_DEBUG_SLAB is not set
2931# CONFIG_DEBUG_RT_MUTEXES is not set
2932# CONFIG_RT_MUTEX_TESTER is not set
2933# CONFIG_DEBUG_SPINLOCK is not set
2934# CONFIG_DEBUG_MUTEXES is not set
2935# CONFIG_DEBUG_LOCK_ALLOC is not set
2936# CONFIG_PROVE_LOCKING is not set
2937# CONFIG_LOCK_STAT is not set
2938# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
2939# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
2940# CONFIG_DEBUG_KOBJECT is not set
2941# CONFIG_DEBUG_HIGHMEM is not set
2942CONFIG_DEBUG_BUGVERBOSE=y
2943# CONFIG_DEBUG_INFO is not set
2944# CONFIG_DEBUG_VM is not set
2945# CONFIG_DEBUG_WRITECOUNT is not set
2946CONFIG_DEBUG_MEMORY_INIT=y
2947# CONFIG_DEBUG_LIST is not set
2948# CONFIG_DEBUG_SG is not set
2949# CONFIG_FRAME_POINTER is not set
2950# CONFIG_BOOT_PRINTK_DELAY is not set
2951# CONFIG_RCU_TORTURE_TEST is not set
2952# CONFIG_BACKTRACE_SELF_TEST is not set
2953# CONFIG_FAULT_INJECTION is not set
2954# CONFIG_LATENCYTOP is not set
2955# CONFIG_SYSCTL_SYSCALL_CHECK is not set
2956CONFIG_HAVE_FTRACE=y
2957CONFIG_HAVE_DYNAMIC_FTRACE=y
2958# CONFIG_FTRACE is not set
2959# CONFIG_IRQSOFF_TRACER is not set
2960# CONFIG_SYSPROF_TRACER is not set
2961# CONFIG_SCHED_TRACER is not set
2962# CONFIG_CONTEXT_SWITCH_TRACER is not set
2963# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
2964# CONFIG_SAMPLES is not set
2965CONFIG_HAVE_ARCH_KGDB=y
2966# CONFIG_KGDB is not set
2967# CONFIG_STRICT_DEVMEM is not set
2968CONFIG_X86_VERBOSE_BOOTUP=y
2969CONFIG_EARLY_PRINTK=y
2970# CONFIG_DEBUG_STACKOVERFLOW is not set
2971# CONFIG_DEBUG_STACK_USAGE is not set
2972# CONFIG_DEBUG_PAGEALLOC is not set
2973# CONFIG_DEBUG_PER_CPU_MAPS is not set
2974# CONFIG_X86_PTDUMP is not set
2975# CONFIG_DEBUG_RODATA is not set
2976# CONFIG_DEBUG_NX_TEST is not set
2977# CONFIG_4KSTACKS is not set
2978CONFIG_DOUBLEFAULT=y
2979# CONFIG_MMIOTRACE is not set
2980CONFIG_IO_DELAY_TYPE_0X80=0
2981CONFIG_IO_DELAY_TYPE_0XED=1
2982CONFIG_IO_DELAY_TYPE_UDELAY=2
2983CONFIG_IO_DELAY_TYPE_NONE=3
2984CONFIG_IO_DELAY_0X80=y
2985# CONFIG_IO_DELAY_0XED is not set
2986# CONFIG_IO_DELAY_UDELAY is not set
2987# CONFIG_IO_DELAY_NONE is not set
2988CONFIG_DEFAULT_IO_DELAY_TYPE=0
2989# CONFIG_DEBUG_BOOT_PARAMS is not set
2990# CONFIG_CPA_DEBUG is not set
2991# CONFIG_OPTIMIZE_INLINING is not set
2992
2993#
2994# Security options
2995#
2996CONFIG_KEYS=y
2997CONFIG_KEYS_DEBUG_PROC_KEYS=y
2998CONFIG_SECURITY=y
2999CONFIG_SECURITY_NETWORK=y
3000# CONFIG_SECURITY_NETWORK_XFRM is not set
3001# CONFIG_SECURITY_FILE_CAPABILITIES is not set
3002# CONFIG_SECURITY_ROOTPLUG is not set
3003CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
3004CONFIG_SECURITY_SELINUX=y
3005CONFIG_SECURITY_SELINUX_BOOTPARAM=y
3006CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
3007CONFIG_SECURITY_SELINUX_DISABLE=y
3008CONFIG_SECURITY_SELINUX_DEVELOP=y
3009CONFIG_SECURITY_SELINUX_AVC_STATS=y
3010CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
3011# CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT is not set
3012# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
3013CONFIG_CRYPTO=y
3014
3015#
3016# Crypto core or helper
3017#
3018CONFIG_CRYPTO_ALGAPI=y
3019CONFIG_CRYPTO_AEAD=m
3020CONFIG_CRYPTO_BLKCIPHER=y
3021CONFIG_CRYPTO_HASH=y
3022CONFIG_CRYPTO_MANAGER=y
3023# CONFIG_CRYPTO_GF128MUL is not set
3024CONFIG_CRYPTO_NULL=m
3025# CONFIG_CRYPTO_CRYPTD is not set
3026CONFIG_CRYPTO_AUTHENC=m
3027CONFIG_CRYPTO_TEST=m
3028
3029#
3030# Authenticated Encryption with Associated Data
3031#
3032# CONFIG_CRYPTO_CCM is not set
3033# CONFIG_CRYPTO_GCM is not set
3034# CONFIG_CRYPTO_SEQIV is not set
3035
3036#
3037# Block modes
3038#
3039CONFIG_CRYPTO_CBC=y
3040# CONFIG_CRYPTO_CTR is not set
3041# CONFIG_CRYPTO_CTS is not set
3042CONFIG_CRYPTO_ECB=m
3043# CONFIG_CRYPTO_LRW is not set
3044CONFIG_CRYPTO_PCBC=m
3045# CONFIG_CRYPTO_XTS is not set
3046
3047#
3048# Hash modes
3049#
3050CONFIG_CRYPTO_HMAC=y
3051# CONFIG_CRYPTO_XCBC is not set
3052
3053#
3054# Digest
3055#
3056CONFIG_CRYPTO_CRC32C=m
3057CONFIG_CRYPTO_MD4=m
3058CONFIG_CRYPTO_MD5=y
3059CONFIG_CRYPTO_MICHAEL_MIC=m
3060# CONFIG_CRYPTO_RMD128 is not set
3061# CONFIG_CRYPTO_RMD160 is not set
3062# CONFIG_CRYPTO_RMD256 is not set
3063# CONFIG_CRYPTO_RMD320 is not set
3064CONFIG_CRYPTO_SHA1=m
3065CONFIG_CRYPTO_SHA256=m
3066CONFIG_CRYPTO_SHA512=m
3067CONFIG_CRYPTO_TGR192=m
3068CONFIG_CRYPTO_WP512=m
3069
3070#
3071# Ciphers
3072#
3073CONFIG_CRYPTO_AES=m
3074CONFIG_CRYPTO_AES_586=m
3075CONFIG_CRYPTO_ANUBIS=m
3076CONFIG_CRYPTO_ARC4=m
3077CONFIG_CRYPTO_BLOWFISH=m
3078# CONFIG_CRYPTO_CAMELLIA is not set
3079CONFIG_CRYPTO_CAST5=y
3080CONFIG_CRYPTO_CAST6=m
3081CONFIG_CRYPTO_DES=y
3082# CONFIG_CRYPTO_FCRYPT is not set
3083CONFIG_CRYPTO_KHAZAD=m
3084# CONFIG_CRYPTO_SALSA20 is not set
3085# CONFIG_CRYPTO_SALSA20_586 is not set
3086# CONFIG_CRYPTO_SEED is not set
3087CONFIG_CRYPTO_SERPENT=m
3088CONFIG_CRYPTO_TEA=m
3089CONFIG_CRYPTO_TWOFISH=m
3090CONFIG_CRYPTO_TWOFISH_COMMON=m
3091# CONFIG_CRYPTO_TWOFISH_586 is not set
3092
3093#
3094# Compression
3095#
3096CONFIG_CRYPTO_DEFLATE=m
3097# CONFIG_CRYPTO_LZO is not set
3098CONFIG_CRYPTO_HW=y
3099CONFIG_CRYPTO_DEV_PADLOCK=m
3100CONFIG_CRYPTO_DEV_PADLOCK_AES=m
3101CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
3102CONFIG_CRYPTO_DEV_GEODE=m
3103# CONFIG_CRYPTO_DEV_HIFN_795X is not set
3104CONFIG_HAVE_KVM=y
3105CONFIG_VIRTUALIZATION=y
3106# CONFIG_KVM is not set
3107# CONFIG_LGUEST is not set
3108# CONFIG_VIRTIO_PCI is not set
3109# CONFIG_VIRTIO_BALLOON is not set
3110
3111#
3112# Library routines
3113#
3114CONFIG_BITREVERSE=y
3115CONFIG_GENERIC_FIND_FIRST_BIT=y
3116CONFIG_GENERIC_FIND_NEXT_BIT=y
3117CONFIG_CRC_CCITT=m
3118CONFIG_CRC16=m
3119# CONFIG_CRC_T10DIF is not set
3120CONFIG_CRC_ITU_T=m
3121CONFIG_CRC32=y
3122# CONFIG_CRC7 is not set
3123CONFIG_LIBCRC32C=m
3124CONFIG_AUDIT_GENERIC=y
3125CONFIG_ZLIB_INFLATE=y
3126CONFIG_ZLIB_DEFLATE=m
3127CONFIG_REED_SOLOMON=m
3128CONFIG_REED_SOLOMON_DEC16=y
3129CONFIG_TEXTSEARCH=y
3130CONFIG_TEXTSEARCH_KMP=m
3131CONFIG_TEXTSEARCH_BM=m
3132CONFIG_TEXTSEARCH_FSM=m
3133CONFIG_PLIST=y
3134CONFIG_HAS_IOMEM=y
3135CONFIG_HAS_IOPORT=y
3136CONFIG_HAS_DMA=y
3137CONFIG_CHECK_SIGNATURE=y
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-netbook b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-netbook
new file mode 100644
index 0000000000..b520435082
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/defconfig-netbook
@@ -0,0 +1,2403 @@
1#
2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.27
4# Wed Nov 5 17:17:12 2008
5#
6# CONFIG_64BIT is not set
7CONFIG_X86_32=y
8# CONFIG_X86_64 is not set
9CONFIG_X86=y
10CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
11# CONFIG_GENERIC_LOCKBREAK is not set
12CONFIG_GENERIC_TIME=y
13CONFIG_GENERIC_CMOS_UPDATE=y
14CONFIG_CLOCKSOURCE_WATCHDOG=y
15CONFIG_GENERIC_CLOCKEVENTS=y
16CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
17CONFIG_LOCKDEP_SUPPORT=y
18CONFIG_STACKTRACE_SUPPORT=y
19CONFIG_HAVE_LATENCYTOP_SUPPORT=y
20CONFIG_FAST_CMPXCHG_LOCAL=y
21CONFIG_MMU=y
22CONFIG_ZONE_DMA=y
23CONFIG_GENERIC_ISA_DMA=y
24CONFIG_GENERIC_IOMAP=y
25CONFIG_GENERIC_BUG=y
26CONFIG_GENERIC_HWEIGHT=y
27# CONFIG_GENERIC_GPIO is not set
28CONFIG_ARCH_MAY_HAVE_PC_FDC=y
29# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
30CONFIG_RWSEM_XCHGADD_ALGORITHM=y
31# CONFIG_ARCH_HAS_ILOG2_U32 is not set
32# CONFIG_ARCH_HAS_ILOG2_U64 is not set
33CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
34CONFIG_GENERIC_CALIBRATE_DELAY=y
35# CONFIG_GENERIC_TIME_VSYSCALL is not set
36CONFIG_ARCH_HAS_CPU_RELAX=y
37CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
38CONFIG_HAVE_SETUP_PER_CPU_AREA=y
39# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set
40CONFIG_ARCH_HIBERNATION_POSSIBLE=y
41CONFIG_ARCH_SUSPEND_POSSIBLE=y
42# CONFIG_ZONE_DMA32 is not set
43CONFIG_ARCH_POPULATES_NODE_MAP=y
44# CONFIG_AUDIT_ARCH is not set
45CONFIG_ARCH_SUPPORTS_AOUT=y
46CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
47CONFIG_GENERIC_HARDIRQS=y
48CONFIG_GENERIC_IRQ_PROBE=y
49CONFIG_GENERIC_PENDING_IRQ=y
50CONFIG_X86_SMP=y
51CONFIG_X86_32_SMP=y
52CONFIG_X86_HT=y
53CONFIG_X86_BIOS_REBOOT=y
54CONFIG_X86_TRAMPOLINE=y
55CONFIG_KTIME_SCALAR=y
56CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
57
58#
59# General setup
60#
61CONFIG_EXPERIMENTAL=y
62CONFIG_LOCK_KERNEL=y
63CONFIG_INIT_ENV_ARG_LIMIT=32
64CONFIG_LOCALVERSION="-netbook"
65# CONFIG_LOCALVERSION_AUTO is not set
66CONFIG_SWAP=y
67CONFIG_SYSVIPC=y
68CONFIG_SYSVIPC_SYSCTL=y
69CONFIG_POSIX_MQUEUE=y
70CONFIG_BSD_PROCESS_ACCT=y
71CONFIG_BSD_PROCESS_ACCT_V3=y
72CONFIG_TASKSTATS=y
73CONFIG_TASK_DELAY_ACCT=y
74CONFIG_TASK_XACCT=y
75CONFIG_TASK_IO_ACCOUNTING=y
76CONFIG_AUDIT=y
77CONFIG_AUDITSYSCALL=y
78CONFIG_AUDIT_TREE=y
79CONFIG_IKCONFIG=y
80CONFIG_IKCONFIG_PROC=y
81CONFIG_LOG_BUF_SHIFT=17
82# CONFIG_CGROUPS is not set
83CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
84# CONFIG_GROUP_SCHED is not set
85# CONFIG_SYSFS_DEPRECATED_V2 is not set
86CONFIG_RELAY=y
87CONFIG_NAMESPACES=y
88# CONFIG_UTS_NS is not set
89# CONFIG_IPC_NS is not set
90CONFIG_USER_NS=y
91# CONFIG_PID_NS is not set
92CONFIG_BLK_DEV_INITRD=y
93CONFIG_INITRAMFS_SOURCE=""
94CONFIG_CC_OPTIMIZE_FOR_SIZE=y
95CONFIG_FASTBOOT=y
96CONFIG_SYSCTL=y
97# CONFIG_EMBEDDED is not set
98CONFIG_UID16=y
99CONFIG_SYSCTL_SYSCALL=y
100CONFIG_KALLSYMS=y
101CONFIG_KALLSYMS_ALL=y
102CONFIG_KALLSYMS_EXTRA_PASS=y
103CONFIG_HOTPLUG=y
104CONFIG_PRINTK=y
105CONFIG_BUG=y
106CONFIG_ELF_CORE=y
107CONFIG_PCSPKR_PLATFORM=y
108# CONFIG_COMPAT_BRK is not set
109CONFIG_BASE_FULL=y
110CONFIG_FUTEX=y
111CONFIG_ANON_INODES=y
112CONFIG_EPOLL=y
113CONFIG_SIGNALFD=y
114CONFIG_TIMERFD=y
115CONFIG_EVENTFD=y
116CONFIG_SHMEM=y
117CONFIG_VM_EVENT_COUNTERS=y
118CONFIG_SLAB=y
119# CONFIG_SLUB is not set
120# CONFIG_SLOB is not set
121CONFIG_PROFILING=y
122# CONFIG_MARKERS is not set
123# CONFIG_OPROFILE is not set
124CONFIG_HAVE_OPROFILE=y
125# CONFIG_KPROBES is not set
126CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
127CONFIG_HAVE_IOREMAP_PROT=y
128CONFIG_HAVE_KPROBES=y
129CONFIG_HAVE_KRETPROBES=y
130# CONFIG_HAVE_ARCH_TRACEHOOK is not set
131# CONFIG_HAVE_DMA_ATTRS is not set
132CONFIG_USE_GENERIC_SMP_HELPERS=y
133# CONFIG_HAVE_CLK is not set
134CONFIG_PROC_PAGE_MONITOR=y
135CONFIG_HAVE_GENERIC_DMA_COHERENT=y
136CONFIG_SLABINFO=y
137CONFIG_RT_MUTEXES=y
138# CONFIG_TINY_SHMEM is not set
139CONFIG_BASE_SMALL=0
140CONFIG_MODULES=y
141# CONFIG_MODULE_FORCE_LOAD is not set
142CONFIG_MODULE_UNLOAD=y
143# CONFIG_MODULE_FORCE_UNLOAD is not set
144# CONFIG_MODVERSIONS is not set
145# CONFIG_MODULE_SRCVERSION_ALL is not set
146CONFIG_KMOD=y
147CONFIG_STOP_MACHINE=y
148CONFIG_BLOCK=y
149# CONFIG_LBD is not set
150CONFIG_BLK_DEV_IO_TRACE=y
151# CONFIG_LSF is not set
152CONFIG_BLK_DEV_BSG=y
153# CONFIG_BLK_DEV_INTEGRITY is not set
154
155#
156# IO Schedulers
157#
158CONFIG_IOSCHED_NOOP=y
159# CONFIG_IOSCHED_AS is not set
160# CONFIG_IOSCHED_DEADLINE is not set
161CONFIG_IOSCHED_CFQ=y
162# CONFIG_DEFAULT_AS is not set
163# CONFIG_DEFAULT_DEADLINE is not set
164CONFIG_DEFAULT_CFQ=y
165# CONFIG_DEFAULT_NOOP is not set
166CONFIG_DEFAULT_IOSCHED="cfq"
167CONFIG_CLASSIC_RCU=y
168
169#
170# Processor type and features
171#
172CONFIG_TICK_ONESHOT=y
173CONFIG_NO_HZ=y
174CONFIG_HIGH_RES_TIMERS=y
175CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
176CONFIG_SMP=y
177CONFIG_X86_FIND_SMP_CONFIG=y
178CONFIG_X86_MPPARSE=y
179CONFIG_X86_PC=y
180# CONFIG_X86_ELAN is not set
181# CONFIG_X86_VOYAGER is not set
182# CONFIG_X86_GENERICARCH is not set
183# CONFIG_X86_VSMP is not set
184# CONFIG_X86_RDC321X is not set
185CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
186# CONFIG_PARAVIRT_GUEST is not set
187# CONFIG_MEMTEST is not set
188# CONFIG_M386 is not set
189# CONFIG_M486 is not set
190# CONFIG_M586 is not set
191# CONFIG_M586TSC is not set
192# CONFIG_M586MMX is not set
193CONFIG_M686=y
194# CONFIG_MPENTIUMII is not set
195# CONFIG_MPENTIUMIII is not set
196# CONFIG_MPENTIUMM is not set
197# CONFIG_MPENTIUM4 is not set
198# CONFIG_MK6 is not set
199# CONFIG_MK7 is not set
200# CONFIG_MK8 is not set
201# CONFIG_MCRUSOE is not set
202# CONFIG_MEFFICEON is not set
203# CONFIG_MWINCHIPC6 is not set
204# CONFIG_MWINCHIP2 is not set
205# CONFIG_MWINCHIP3D is not set
206# CONFIG_MGEODEGX1 is not set
207# CONFIG_MGEODE_LX is not set
208# CONFIG_MCYRIXIII is not set
209# CONFIG_MVIAC3_2 is not set
210# CONFIG_MVIAC7 is not set
211# CONFIG_MPSC is not set
212# CONFIG_MCORE2 is not set
213# CONFIG_GENERIC_CPU is not set
214# CONFIG_X86_GENERIC is not set
215CONFIG_X86_CPU=y
216CONFIG_X86_CMPXCHG=y
217CONFIG_X86_L1_CACHE_SHIFT=5
218CONFIG_X86_XADD=y
219# CONFIG_X86_PPRO_FENCE is not set
220CONFIG_X86_WP_WORKS_OK=y
221CONFIG_X86_INVLPG=y
222CONFIG_X86_BSWAP=y
223CONFIG_X86_POPAD_OK=y
224CONFIG_X86_USE_PPRO_CHECKSUM=y
225CONFIG_X86_TSC=y
226CONFIG_X86_CMOV=y
227CONFIG_X86_MINIMUM_CPU_FAMILY=4
228CONFIG_X86_DEBUGCTLMSR=y
229CONFIG_HPET_TIMER=y
230CONFIG_HPET_EMULATE_RTC=y
231CONFIG_DMI=y
232# CONFIG_IOMMU_HELPER is not set
233CONFIG_NR_CPUS=2
234CONFIG_SCHED_SMT=y
235CONFIG_SCHED_MC=y
236# CONFIG_PREEMPT_NONE is not set
237CONFIG_PREEMPT_VOLUNTARY=y
238# CONFIG_PREEMPT is not set
239CONFIG_X86_LOCAL_APIC=y
240CONFIG_X86_IO_APIC=y
241CONFIG_X86_MCE=y
242# CONFIG_X86_MCE_NONFATAL is not set
243# CONFIG_X86_MCE_P4THERMAL is not set
244CONFIG_VM86=y
245# CONFIG_TOSHIBA is not set
246# CONFIG_I8K is not set
247# CONFIG_X86_REBOOTFIXUPS is not set
248CONFIG_MICROCODE=y
249CONFIG_MICROCODE_OLD_INTERFACE=y
250CONFIG_X86_MSR=y
251CONFIG_X86_CPUID=y
252# CONFIG_NOHIGHMEM is not set
253CONFIG_HIGHMEM4G=y
254# CONFIG_HIGHMEM64G is not set
255CONFIG_PAGE_OFFSET=0xC0000000
256CONFIG_HIGHMEM=y
257CONFIG_NEED_NODE_MEMMAP_SIZE=y
258CONFIG_ARCH_FLATMEM_ENABLE=y
259CONFIG_ARCH_SPARSEMEM_ENABLE=y
260CONFIG_ARCH_SELECT_MEMORY_MODEL=y
261CONFIG_SELECT_MEMORY_MODEL=y
262# CONFIG_FLATMEM_MANUAL is not set
263# CONFIG_DISCONTIGMEM_MANUAL is not set
264CONFIG_SPARSEMEM_MANUAL=y
265CONFIG_SPARSEMEM=y
266CONFIG_HAVE_MEMORY_PRESENT=y
267CONFIG_SPARSEMEM_STATIC=y
268# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
269
270#
271# Memory hotplug is currently incompatible with Software Suspend
272#
273CONFIG_PAGEFLAGS_EXTENDED=y
274CONFIG_SPLIT_PTLOCK_CPUS=4
275CONFIG_RESOURCES_64BIT=y
276CONFIG_ZONE_DMA_FLAG=1
277CONFIG_BOUNCE=y
278CONFIG_VIRT_TO_BUS=y
279# CONFIG_HIGHPTE is not set
280# CONFIG_MATH_EMULATION is not set
281CONFIG_MTRR=y
282# CONFIG_MTRR_SANITIZER is not set
283# CONFIG_X86_PAT is not set
284# CONFIG_EFI is not set
285# CONFIG_IRQBALANCE is not set
286# CONFIG_SECCOMP is not set
287# CONFIG_HZ_100 is not set
288# CONFIG_HZ_250 is not set
289# CONFIG_HZ_300 is not set
290CONFIG_HZ_1000=y
291CONFIG_HZ=1000
292CONFIG_SCHED_HRTICK=y
293CONFIG_KEXEC=y
294CONFIG_CRASH_DUMP=y
295# CONFIG_KEXEC_JUMP is not set
296CONFIG_PHYSICAL_START=0x400000
297CONFIG_RELOCATABLE=y
298CONFIG_PHYSICAL_ALIGN=0x200000
299CONFIG_HOTPLUG_CPU=y
300CONFIG_COMPAT_VDSO=y
301CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
302
303#
304# Power management options
305#
306CONFIG_PM=y
307CONFIG_PM_DEBUG=y
308# CONFIG_PM_VERBOSE is not set
309CONFIG_CAN_PM_TRACE=y
310CONFIG_PM_TRACE=y
311CONFIG_PM_TRACE_RTC=y
312CONFIG_PM_SLEEP_SMP=y
313CONFIG_PM_SLEEP=y
314CONFIG_SUSPEND=y
315# CONFIG_PM_TEST_SUSPEND is not set
316CONFIG_SUSPEND_FREEZER=y
317CONFIG_HIBERNATION=y
318CONFIG_PM_STD_PARTITION=""
319CONFIG_ACPI=y
320CONFIG_ACPI_SLEEP=y
321CONFIG_ACPI_PROCFS=y
322CONFIG_ACPI_PROCFS_POWER=y
323CONFIG_ACPI_SYSFS_POWER=y
324CONFIG_ACPI_PROC_EVENT=y
325CONFIG_ACPI_AC=y
326CONFIG_ACPI_BATTERY=m
327CONFIG_ACPI_BUTTON=y
328CONFIG_ACPI_VIDEO=y
329CONFIG_ACPI_FAN=y
330CONFIG_ACPI_DOCK=y
331# CONFIG_ACPI_BAY is not set
332CONFIG_ACPI_PROCESSOR=y
333CONFIG_ACPI_HOTPLUG_CPU=y
334CONFIG_ACPI_THERMAL=y
335CONFIG_ACPI_WMI=m
336CONFIG_ACPI_ASUS=y
337# CONFIG_ACPI_TOSHIBA is not set
338# CONFIG_ACPI_CUSTOM_DSDT is not set
339CONFIG_ACPI_BLACKLIST_YEAR=0
340# CONFIG_ACPI_DEBUG is not set
341CONFIG_ACPI_EC=y
342# CONFIG_ACPI_PCI_SLOT is not set
343CONFIG_ACPI_POWER=y
344CONFIG_ACPI_SYSTEM=y
345CONFIG_X86_PM_TIMER=y
346CONFIG_ACPI_CONTAINER=y
347CONFIG_ACPI_SBS=m
348# CONFIG_APM is not set
349
350#
351# CPU Frequency scaling
352#
353CONFIG_CPU_FREQ=y
354CONFIG_CPU_FREQ_TABLE=y
355CONFIG_CPU_FREQ_DEBUG=y
356CONFIG_CPU_FREQ_STAT=m
357CONFIG_CPU_FREQ_STAT_DETAILS=y
358CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
359# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
360# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
361# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
362# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
363CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
364# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
365CONFIG_CPU_FREQ_GOV_USERSPACE=y
366CONFIG_CPU_FREQ_GOV_ONDEMAND=y
367# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
368
369#
370# CPUFreq processor drivers
371#
372CONFIG_X86_ACPI_CPUFREQ=y
373# CONFIG_X86_POWERNOW_K6 is not set
374# CONFIG_X86_POWERNOW_K7 is not set
375# CONFIG_X86_POWERNOW_K8 is not set
376# CONFIG_X86_GX_SUSPMOD is not set
377# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
378# CONFIG_X86_SPEEDSTEP_ICH is not set
379# CONFIG_X86_SPEEDSTEP_SMI is not set
380# CONFIG_X86_P4_CLOCKMOD is not set
381# CONFIG_X86_CPUFREQ_NFORCE2 is not set
382# CONFIG_X86_LONGRUN is not set
383# CONFIG_X86_LONGHAUL is not set
384# CONFIG_X86_E_POWERSAVER is not set
385
386#
387# shared options
388#
389# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
390# CONFIG_X86_SPEEDSTEP_LIB is not set
391CONFIG_CPU_IDLE=y
392CONFIG_CPU_IDLE_GOV_LADDER=y
393CONFIG_CPU_IDLE_GOV_MENU=y
394
395#
396# Bus options (PCI etc.)
397#
398CONFIG_PCI=y
399# CONFIG_PCI_GOBIOS is not set
400# CONFIG_PCI_GOMMCONFIG is not set
401# CONFIG_PCI_GODIRECT is not set
402# CONFIG_PCI_GOOLPC is not set
403CONFIG_PCI_GOANY=y
404CONFIG_PCI_BIOS=y
405CONFIG_PCI_DIRECT=y
406CONFIG_PCI_MMCONFIG=y
407CONFIG_PCI_DOMAINS=y
408CONFIG_PCIEPORTBUS=y
409CONFIG_PCIEAER=y
410CONFIG_PCIEASPM=y
411# CONFIG_PCIEASPM_DEBUG is not set
412CONFIG_ARCH_SUPPORTS_MSI=y
413CONFIG_PCI_MSI=y
414CONFIG_PCI_LEGACY=y
415# CONFIG_PCI_DEBUG is not set
416CONFIG_HT_IRQ=y
417CONFIG_ISA_DMA_API=y
418# CONFIG_ISA is not set
419# CONFIG_MCA is not set
420# CONFIG_SCx200 is not set
421# CONFIG_OLPC is not set
422CONFIG_K8_NB=y
423# CONFIG_PCCARD is not set
424# CONFIG_HOTPLUG_PCI is not set
425
426#
427# Executable file formats / Emulations
428#
429CONFIG_BINFMT_ELF=y
430# CONFIG_BINFMT_AOUT is not set
431CONFIG_BINFMT_MISC=y
432CONFIG_NET=y
433
434#
435# Networking options
436#
437CONFIG_PACKET=y
438CONFIG_PACKET_MMAP=y
439CONFIG_UNIX=y
440CONFIG_XFRM=y
441CONFIG_XFRM_USER=y
442CONFIG_XFRM_SUB_POLICY=y
443CONFIG_XFRM_MIGRATE=y
444CONFIG_XFRM_STATISTICS=y
445CONFIG_XFRM_IPCOMP=m
446CONFIG_NET_KEY=m
447CONFIG_NET_KEY_MIGRATE=y
448CONFIG_INET=y
449CONFIG_IP_MULTICAST=y
450# CONFIG_IP_ADVANCED_ROUTER is not set
451CONFIG_IP_FIB_HASH=y
452# CONFIG_IP_PNP is not set
453# CONFIG_NET_IPIP is not set
454# CONFIG_NET_IPGRE is not set
455CONFIG_IP_MROUTE=y
456CONFIG_IP_PIMSM_V1=y
457CONFIG_IP_PIMSM_V2=y
458# CONFIG_ARPD is not set
459CONFIG_SYN_COOKIES=y
460CONFIG_INET_AH=m
461CONFIG_INET_ESP=m
462CONFIG_INET_IPCOMP=m
463CONFIG_INET_XFRM_TUNNEL=m
464CONFIG_INET_TUNNEL=m
465CONFIG_INET_XFRM_MODE_TRANSPORT=m
466CONFIG_INET_XFRM_MODE_TUNNEL=m
467CONFIG_INET_XFRM_MODE_BEET=m
468CONFIG_INET_LRO=y
469CONFIG_INET_DIAG=m
470CONFIG_INET_TCP_DIAG=m
471CONFIG_TCP_CONG_ADVANCED=y
472CONFIG_TCP_CONG_BIC=m
473CONFIG_TCP_CONG_CUBIC=y
474# CONFIG_TCP_CONG_WESTWOOD is not set
475# CONFIG_TCP_CONG_HTCP is not set
476# CONFIG_TCP_CONG_HSTCP is not set
477# CONFIG_TCP_CONG_HYBLA is not set
478# CONFIG_TCP_CONG_VEGAS is not set
479# CONFIG_TCP_CONG_SCALABLE is not set
480# CONFIG_TCP_CONG_LP is not set
481# CONFIG_TCP_CONG_VENO is not set
482# CONFIG_TCP_CONG_YEAH is not set
483# CONFIG_TCP_CONG_ILLINOIS is not set
484# CONFIG_DEFAULT_BIC is not set
485CONFIG_DEFAULT_CUBIC=y
486# CONFIG_DEFAULT_HTCP is not set
487# CONFIG_DEFAULT_VEGAS is not set
488# CONFIG_DEFAULT_WESTWOOD is not set
489# CONFIG_DEFAULT_RENO is not set
490CONFIG_DEFAULT_TCP_CONG="cubic"
491CONFIG_TCP_MD5SIG=y
492# CONFIG_IP_VS is not set
493CONFIG_IPV6=y
494CONFIG_IPV6_PRIVACY=y
495CONFIG_IPV6_ROUTER_PREF=y
496CONFIG_IPV6_ROUTE_INFO=y
497CONFIG_IPV6_OPTIMISTIC_DAD=y
498CONFIG_INET6_AH=m
499CONFIG_INET6_ESP=m
500CONFIG_INET6_IPCOMP=m
501CONFIG_IPV6_MIP6=m
502CONFIG_INET6_XFRM_TUNNEL=m
503CONFIG_INET6_TUNNEL=m
504CONFIG_INET6_XFRM_MODE_TRANSPORT=m
505CONFIG_INET6_XFRM_MODE_TUNNEL=m
506CONFIG_INET6_XFRM_MODE_BEET=m
507CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
508CONFIG_IPV6_SIT=m
509CONFIG_IPV6_NDISC_NODETYPE=y
510CONFIG_IPV6_TUNNEL=m
511CONFIG_IPV6_MULTIPLE_TABLES=y
512CONFIG_IPV6_SUBTREES=y
513# CONFIG_IPV6_MROUTE is not set
514CONFIG_NETLABEL=y
515CONFIG_NETWORK_SECMARK=y
516CONFIG_NETFILTER=y
517# CONFIG_NETFILTER_DEBUG is not set
518CONFIG_NETFILTER_ADVANCED=y
519
520#
521# Core Netfilter Configuration
522#
523CONFIG_NETFILTER_NETLINK=m
524CONFIG_NETFILTER_NETLINK_QUEUE=m
525CONFIG_NETFILTER_NETLINK_LOG=m
526CONFIG_NF_CONNTRACK=y
527CONFIG_NF_CT_ACCT=y
528CONFIG_NF_CONNTRACK_MARK=y
529CONFIG_NF_CONNTRACK_SECMARK=y
530CONFIG_NF_CONNTRACK_EVENTS=y
531# CONFIG_NF_CT_PROTO_DCCP is not set
532CONFIG_NF_CT_PROTO_GRE=m
533CONFIG_NF_CT_PROTO_SCTP=m
534CONFIG_NF_CT_PROTO_UDPLITE=m
535CONFIG_NF_CONNTRACK_AMANDA=m
536CONFIG_NF_CONNTRACK_FTP=m
537CONFIG_NF_CONNTRACK_H323=m
538CONFIG_NF_CONNTRACK_IRC=m
539CONFIG_NF_CONNTRACK_NETBIOS_NS=m
540CONFIG_NF_CONNTRACK_PPTP=m
541CONFIG_NF_CONNTRACK_SANE=m
542CONFIG_NF_CONNTRACK_SIP=m
543CONFIG_NF_CONNTRACK_TFTP=m
544CONFIG_NF_CT_NETLINK=m
545CONFIG_NETFILTER_XTABLES=y
546CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
547CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
548CONFIG_NETFILTER_XT_TARGET_DSCP=m
549CONFIG_NETFILTER_XT_TARGET_MARK=m
550CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
551CONFIG_NETFILTER_XT_TARGET_NFLOG=m
552CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
553CONFIG_NETFILTER_XT_TARGET_RATEEST=m
554CONFIG_NETFILTER_XT_TARGET_TRACE=m
555CONFIG_NETFILTER_XT_TARGET_SECMARK=m
556CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
557CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
558CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
559CONFIG_NETFILTER_XT_MATCH_COMMENT=m
560CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
561CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
562CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
563CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
564# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
565CONFIG_NETFILTER_XT_MATCH_DSCP=m
566CONFIG_NETFILTER_XT_MATCH_ESP=m
567CONFIG_NETFILTER_XT_MATCH_HELPER=m
568CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
569CONFIG_NETFILTER_XT_MATCH_LENGTH=m
570CONFIG_NETFILTER_XT_MATCH_LIMIT=m
571CONFIG_NETFILTER_XT_MATCH_MAC=m
572CONFIG_NETFILTER_XT_MATCH_MARK=m
573CONFIG_NETFILTER_XT_MATCH_OWNER=m
574CONFIG_NETFILTER_XT_MATCH_POLICY=m
575CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
576CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
577CONFIG_NETFILTER_XT_MATCH_QUOTA=m
578CONFIG_NETFILTER_XT_MATCH_RATEEST=m
579CONFIG_NETFILTER_XT_MATCH_REALM=m
580CONFIG_NETFILTER_XT_MATCH_SCTP=m
581CONFIG_NETFILTER_XT_MATCH_STATE=y
582CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
583CONFIG_NETFILTER_XT_MATCH_STRING=m
584CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
585CONFIG_NETFILTER_XT_MATCH_TIME=m
586CONFIG_NETFILTER_XT_MATCH_U32=m
587CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
588
589#
590# IP: Netfilter Configuration
591#
592CONFIG_NF_CONNTRACK_IPV4=y
593# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
594CONFIG_IP_NF_QUEUE=m
595CONFIG_IP_NF_IPTABLES=y
596CONFIG_IP_NF_MATCH_RECENT=m
597CONFIG_IP_NF_MATCH_ECN=m
598CONFIG_IP_NF_MATCH_AH=m
599CONFIG_IP_NF_MATCH_TTL=m
600CONFIG_IP_NF_MATCH_ADDRTYPE=m
601CONFIG_IP_NF_FILTER=y
602CONFIG_IP_NF_TARGET_REJECT=y
603CONFIG_IP_NF_TARGET_LOG=m
604CONFIG_IP_NF_TARGET_ULOG=m
605CONFIG_NF_NAT=m
606CONFIG_NF_NAT_NEEDED=y
607CONFIG_IP_NF_TARGET_MASQUERADE=m
608CONFIG_IP_NF_TARGET_REDIRECT=m
609CONFIG_IP_NF_TARGET_NETMAP=m
610CONFIG_NF_NAT_SNMP_BASIC=m
611CONFIG_NF_NAT_PROTO_GRE=m
612CONFIG_NF_NAT_PROTO_UDPLITE=m
613CONFIG_NF_NAT_PROTO_SCTP=m
614CONFIG_NF_NAT_FTP=m
615CONFIG_NF_NAT_IRC=m
616CONFIG_NF_NAT_TFTP=m
617CONFIG_NF_NAT_AMANDA=m
618CONFIG_NF_NAT_PPTP=m
619CONFIG_NF_NAT_H323=m
620CONFIG_NF_NAT_SIP=m
621CONFIG_IP_NF_MANGLE=m
622CONFIG_IP_NF_TARGET_ECN=m
623CONFIG_IP_NF_TARGET_TTL=m
624CONFIG_IP_NF_TARGET_CLUSTERIP=m
625CONFIG_IP_NF_RAW=m
626# CONFIG_IP_NF_SECURITY is not set
627CONFIG_IP_NF_ARPTABLES=m
628CONFIG_IP_NF_ARPFILTER=m
629CONFIG_IP_NF_ARP_MANGLE=m
630
631#
632# IPv6: Netfilter Configuration
633#
634CONFIG_NF_CONNTRACK_IPV6=y
635CONFIG_IP6_NF_QUEUE=m
636CONFIG_IP6_NF_IPTABLES=y
637CONFIG_IP6_NF_MATCH_RT=m
638CONFIG_IP6_NF_MATCH_OPTS=m
639CONFIG_IP6_NF_MATCH_FRAG=m
640CONFIG_IP6_NF_MATCH_HL=m
641CONFIG_IP6_NF_MATCH_IPV6HEADER=m
642CONFIG_IP6_NF_MATCH_AH=m
643CONFIG_IP6_NF_MATCH_MH=m
644CONFIG_IP6_NF_MATCH_EUI64=m
645CONFIG_IP6_NF_FILTER=y
646CONFIG_IP6_NF_TARGET_LOG=m
647CONFIG_IP6_NF_TARGET_REJECT=y
648CONFIG_IP6_NF_MANGLE=m
649CONFIG_IP6_NF_TARGET_HL=m
650CONFIG_IP6_NF_RAW=m
651# CONFIG_IP6_NF_SECURITY is not set
652# CONFIG_IP_DCCP is not set
653# CONFIG_IP_SCTP is not set
654# CONFIG_TIPC is not set
655# CONFIG_ATM is not set
656# CONFIG_BRIDGE is not set
657# CONFIG_VLAN_8021Q is not set
658# CONFIG_DECNET is not set
659# CONFIG_LLC2 is not set
660# CONFIG_IPX is not set
661# CONFIG_ATALK is not set
662# CONFIG_X25 is not set
663# CONFIG_LAPB is not set
664# CONFIG_ECONET is not set
665# CONFIG_WAN_ROUTER is not set
666# CONFIG_NET_SCHED is not set
667CONFIG_NET_CLS_ROUTE=y
668
669#
670# Network testing
671#
672# CONFIG_NET_PKTGEN is not set
673# CONFIG_HAMRADIO is not set
674# CONFIG_CAN is not set
675# CONFIG_IRDA is not set
676CONFIG_BT=m
677CONFIG_BT_L2CAP=m
678CONFIG_BT_SCO=m
679CONFIG_BT_RFCOMM=m
680CONFIG_BT_RFCOMM_TTY=y
681CONFIG_BT_BNEP=m
682# CONFIG_BT_BNEP_MC_FILTER is not set
683# CONFIG_BT_BNEP_PROTO_FILTER is not set
684# CONFIG_BT_HIDP is not set
685
686#
687# Bluetooth device drivers
688#
689CONFIG_BT_HCIUSB=m
690CONFIG_BT_HCIUSB_SCO=y
691# CONFIG_BT_HCIBTUSB is not set
692CONFIG_BT_HCIBTSDIO=m
693CONFIG_BT_HCIUART=m
694CONFIG_BT_HCIUART_H4=y
695CONFIG_BT_HCIUART_BCSP=y
696CONFIG_BT_HCIUART_LL=y
697CONFIG_BT_HCIBCM203X=m
698CONFIG_BT_HCIBPA10X=m
699CONFIG_BT_HCIBFUSB=m
700CONFIG_BT_HCIVHCI=m
701# CONFIG_AF_RXRPC is not set
702CONFIG_FIB_RULES=y
703
704#
705# Wireless
706#
707CONFIG_CFG80211=m
708CONFIG_NL80211=y
709CONFIG_WIRELESS_EXT=y
710# CONFIG_WIRELESS_EXT_SYSFS is not set
711CONFIG_MAC80211=m
712
713#
714# Rate control algorithm selection
715#
716CONFIG_MAC80211_RC_PID=y
717CONFIG_MAC80211_RC_DEFAULT_PID=y
718CONFIG_MAC80211_RC_DEFAULT="pid"
719CONFIG_MAC80211_MESH=y
720CONFIG_MAC80211_LEDS=y
721CONFIG_MAC80211_DEBUGFS=y
722# CONFIG_MAC80211_DEBUG_MENU is not set
723CONFIG_IEEE80211=m
724# CONFIG_IEEE80211_DEBUG is not set
725CONFIG_IEEE80211_CRYPT_WEP=m
726CONFIG_IEEE80211_CRYPT_CCMP=m
727CONFIG_IEEE80211_CRYPT_TKIP=m
728CONFIG_RFKILL=m
729CONFIG_RFKILL_INPUT=m
730CONFIG_RFKILL_LEDS=y
731# CONFIG_NET_9P is not set
732
733#
734# Device Drivers
735#
736
737#
738# Generic Driver Options
739#
740CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
741CONFIG_STANDALONE=y
742CONFIG_PREVENT_FIRMWARE_BUILD=y
743CONFIG_FW_LOADER=y
744CONFIG_FIRMWARE_IN_KERNEL=y
745CONFIG_EXTRA_FIRMWARE=""
746# CONFIG_DEBUG_DRIVER is not set
747CONFIG_DEBUG_DEVRES=y
748# CONFIG_SYS_HYPERVISOR is not set
749CONFIG_CONNECTOR=y
750CONFIG_PROC_EVENTS=y
751# CONFIG_MTD is not set
752# CONFIG_PARPORT is not set
753CONFIG_PNP=y
754# CONFIG_PNP_DEBUG is not set
755
756#
757# Protocols
758#
759CONFIG_PNPACPI=y
760CONFIG_BLK_DEV=y
761# CONFIG_BLK_DEV_FD is not set
762# CONFIG_BLK_CPQ_DA is not set
763# CONFIG_BLK_CPQ_CISS_DA is not set
764# CONFIG_BLK_DEV_DAC960 is not set
765# CONFIG_BLK_DEV_UMEM is not set
766# CONFIG_BLK_DEV_COW_COMMON is not set
767CONFIG_BLK_DEV_LOOP=y
768CONFIG_BLK_DEV_CRYPTOLOOP=m
769# CONFIG_BLK_DEV_NBD is not set
770# CONFIG_BLK_DEV_SX8 is not set
771# CONFIG_BLK_DEV_UB is not set
772# CONFIG_BLK_DEV_RAM is not set
773CONFIG_CDROM_PKTCDVD=m
774CONFIG_CDROM_PKTCDVD_BUFFERS=8
775# CONFIG_CDROM_PKTCDVD_WCACHE is not set
776# CONFIG_ATA_OVER_ETH is not set
777# CONFIG_BLK_DEV_HD is not set
778CONFIG_MISC_DEVICES=y
779# CONFIG_IBM_ASM is not set
780# CONFIG_PHANTOM is not set
781CONFIG_EEPROM_93CX6=m
782# CONFIG_SGI_IOC4 is not set
783CONFIG_TIFM_CORE=m
784CONFIG_TIFM_7XX1=m
785# CONFIG_ACER_WMI is not set
786# CONFIG_FUJITSU_LAPTOP is not set
787# CONFIG_TC1100_WMI is not set
788# CONFIG_HP_WMI is not set
789# CONFIG_MSI_LAPTOP is not set
790# CONFIG_COMPAL_LAPTOP is not set
791# CONFIG_SONY_LAPTOP is not set
792# CONFIG_THINKPAD_ACPI is not set
793# CONFIG_INTEL_MENLOW is not set
794CONFIG_EEEPC_LAPTOP=y
795# CONFIG_ENCLOSURE_SERVICES is not set
796# CONFIG_HP_ILO is not set
797CONFIG_HAVE_IDE=y
798# CONFIG_IDE is not set
799
800#
801# SCSI device support
802#
803CONFIG_RAID_ATTRS=m
804CONFIG_SCSI=y
805CONFIG_SCSI_DMA=y
806# CONFIG_SCSI_TGT is not set
807# CONFIG_SCSI_NETLINK is not set
808CONFIG_SCSI_PROC_FS=y
809
810#
811# SCSI support type (disk, tape, CD-ROM)
812#
813CONFIG_BLK_DEV_SD=y
814CONFIG_CHR_DEV_ST=m
815# CONFIG_CHR_DEV_OSST is not set
816CONFIG_BLK_DEV_SR=y
817CONFIG_BLK_DEV_SR_VENDOR=y
818# CONFIG_CHR_DEV_SG is not set
819CONFIG_CHR_DEV_SCH=m
820
821#
822# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
823#
824CONFIG_SCSI_MULTI_LUN=y
825CONFIG_SCSI_CONSTANTS=y
826CONFIG_SCSI_LOGGING=y
827CONFIG_SCSI_SCAN_ASYNC=y
828CONFIG_SCSI_WAIT_SCAN=m
829
830#
831# SCSI Transports
832#
833# CONFIG_SCSI_SPI_ATTRS is not set
834# CONFIG_SCSI_FC_ATTRS is not set
835# CONFIG_SCSI_ISCSI_ATTRS is not set
836# CONFIG_SCSI_SAS_ATTRS is not set
837# CONFIG_SCSI_SAS_LIBSAS is not set
838# CONFIG_SCSI_SRP_ATTRS is not set
839CONFIG_SCSI_LOWLEVEL=y
840# CONFIG_ISCSI_TCP is not set
841# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
842# CONFIG_SCSI_3W_9XXX is not set
843# CONFIG_SCSI_ACARD is not set
844# CONFIG_SCSI_AACRAID is not set
845# CONFIG_SCSI_AIC7XXX is not set
846# CONFIG_SCSI_AIC7XXX_OLD is not set
847# CONFIG_SCSI_AIC79XX is not set
848# CONFIG_SCSI_AIC94XX is not set
849# CONFIG_SCSI_DPT_I2O is not set
850# CONFIG_SCSI_ADVANSYS is not set
851# CONFIG_SCSI_ARCMSR is not set
852# CONFIG_MEGARAID_NEWGEN is not set
853# CONFIG_MEGARAID_LEGACY is not set
854# CONFIG_MEGARAID_SAS is not set
855# CONFIG_SCSI_HPTIOP is not set
856# CONFIG_SCSI_BUSLOGIC is not set
857# CONFIG_SCSI_DMX3191D is not set
858# CONFIG_SCSI_EATA is not set
859# CONFIG_SCSI_FUTURE_DOMAIN is not set
860# CONFIG_SCSI_GDTH is not set
861# CONFIG_SCSI_IPS is not set
862# CONFIG_SCSI_INITIO is not set
863# CONFIG_SCSI_INIA100 is not set
864# CONFIG_SCSI_MVSAS is not set
865# CONFIG_SCSI_STEX is not set
866# CONFIG_SCSI_SYM53C8XX_2 is not set
867# CONFIG_SCSI_IPR is not set
868# CONFIG_SCSI_QLOGIC_1280 is not set
869# CONFIG_SCSI_QLA_FC is not set
870# CONFIG_SCSI_QLA_ISCSI is not set
871# CONFIG_SCSI_LPFC is not set
872# CONFIG_SCSI_DC395x is not set
873# CONFIG_SCSI_DC390T is not set
874# CONFIG_SCSI_NSP32 is not set
875# CONFIG_SCSI_DEBUG is not set
876# CONFIG_SCSI_SRP is not set
877# CONFIG_SCSI_DH is not set
878CONFIG_ATA=y
879# CONFIG_ATA_NONSTANDARD is not set
880CONFIG_ATA_ACPI=y
881# CONFIG_SATA_PMP is not set
882CONFIG_SATA_AHCI=y
883# CONFIG_SATA_SIL24 is not set
884CONFIG_ATA_SFF=y
885# CONFIG_SATA_SVW is not set
886CONFIG_ATA_PIIX=y
887# CONFIG_SATA_MV is not set
888# CONFIG_SATA_NV is not set
889# CONFIG_PDC_ADMA is not set
890# CONFIG_SATA_QSTOR is not set
891# CONFIG_SATA_PROMISE is not set
892# CONFIG_SATA_SX4 is not set
893# CONFIG_SATA_SIL is not set
894# CONFIG_SATA_SIS is not set
895# CONFIG_SATA_ULI is not set
896# CONFIG_SATA_VIA is not set
897# CONFIG_SATA_VITESSE is not set
898# CONFIG_SATA_INIC162X is not set
899# CONFIG_PATA_ACPI is not set
900# CONFIG_PATA_ALI is not set
901# CONFIG_PATA_AMD is not set
902# CONFIG_PATA_ARTOP is not set
903# CONFIG_PATA_ATIIXP is not set
904# CONFIG_PATA_CMD640_PCI is not set
905# CONFIG_PATA_CMD64X is not set
906# CONFIG_PATA_CS5520 is not set
907# CONFIG_PATA_CS5530 is not set
908# CONFIG_PATA_CS5535 is not set
909# CONFIG_PATA_CS5536 is not set
910# CONFIG_PATA_CYPRESS is not set
911# CONFIG_PATA_EFAR is not set
912# CONFIG_ATA_GENERIC is not set
913# CONFIG_PATA_HPT366 is not set
914# CONFIG_PATA_HPT37X is not set
915# CONFIG_PATA_HPT3X2N is not set
916# CONFIG_PATA_HPT3X3 is not set
917# CONFIG_PATA_IT821X is not set
918# CONFIG_PATA_IT8213 is not set
919# CONFIG_PATA_JMICRON is not set
920# CONFIG_PATA_TRIFLEX is not set
921# CONFIG_PATA_MARVELL is not set
922# CONFIG_PATA_MPIIX is not set
923# CONFIG_PATA_OLDPIIX is not set
924# CONFIG_PATA_NETCELL is not set
925# CONFIG_PATA_NINJA32 is not set
926# CONFIG_PATA_NS87410 is not set
927# CONFIG_PATA_NS87415 is not set
928# CONFIG_PATA_OPTI is not set
929# CONFIG_PATA_OPTIDMA is not set
930# CONFIG_PATA_PDC_OLD is not set
931# CONFIG_PATA_RADISYS is not set
932# CONFIG_PATA_RZ1000 is not set
933# CONFIG_PATA_SC1200 is not set
934# CONFIG_PATA_SERVERWORKS is not set
935# CONFIG_PATA_PDC2027X is not set
936# CONFIG_PATA_SIL680 is not set
937# CONFIG_PATA_SIS is not set
938# CONFIG_PATA_VIA is not set
939# CONFIG_PATA_WINBOND is not set
940CONFIG_PATA_SCH=y
941# CONFIG_MD is not set
942# CONFIG_FUSION is not set
943
944#
945# IEEE 1394 (FireWire) support
946#
947
948#
949# Enable only one of the two stacks, unless you know what you are doing
950#
951# CONFIG_FIREWIRE is not set
952# CONFIG_IEEE1394 is not set
953# CONFIG_I2O is not set
954# CONFIG_MACINTOSH_DRIVERS is not set
955CONFIG_NETDEVICES=y
956# CONFIG_DUMMY is not set
957# CONFIG_BONDING is not set
958CONFIG_MACVLAN=m
959# CONFIG_EQUALIZER is not set
960# CONFIG_TUN is not set
961# CONFIG_VETH is not set
962# CONFIG_NET_SB1000 is not set
963# CONFIG_ARCNET is not set
964CONFIG_PHYLIB=m
965
966#
967# MII PHY device drivers
968#
969CONFIG_MARVELL_PHY=m
970CONFIG_DAVICOM_PHY=m
971CONFIG_QSEMI_PHY=m
972CONFIG_LXT_PHY=m
973CONFIG_CICADA_PHY=m
974CONFIG_VITESSE_PHY=m
975CONFIG_SMSC_PHY=m
976CONFIG_BROADCOM_PHY=m
977CONFIG_ICPLUS_PHY=m
978CONFIG_REALTEK_PHY=m
979CONFIG_MDIO_BITBANG=m
980CONFIG_NET_ETHERNET=y
981CONFIG_MII=m
982CONFIG_HAPPYMEAL=m
983CONFIG_SUNGEM=m
984CONFIG_CASSINI=m
985CONFIG_NET_VENDOR_3COM=y
986# CONFIG_VORTEX is not set
987# CONFIG_TYPHOON is not set
988# CONFIG_NET_TULIP is not set
989# CONFIG_HP100 is not set
990# CONFIG_IBM_NEW_EMAC_ZMII is not set
991# CONFIG_IBM_NEW_EMAC_RGMII is not set
992# CONFIG_IBM_NEW_EMAC_TAH is not set
993# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
994# CONFIG_NET_PCI is not set
995# CONFIG_B44 is not set
996CONFIG_NETDEV_1000=y
997# CONFIG_ACENIC is not set
998# CONFIG_DL2K is not set
999# CONFIG_E1000 is not set
1000# CONFIG_E1000E is not set
1001# CONFIG_IP1000 is not set
1002# CONFIG_IGB is not set
1003# CONFIG_NS83820 is not set
1004# CONFIG_HAMACHI is not set
1005# CONFIG_YELLOWFIN is not set
1006# CONFIG_R8169 is not set
1007# CONFIG_SIS190 is not set
1008# CONFIG_SKGE is not set
1009# CONFIG_SKY2 is not set
1010# CONFIG_VIA_VELOCITY is not set
1011# CONFIG_TIGON3 is not set
1012# CONFIG_BNX2 is not set
1013# CONFIG_QLA3XXX is not set
1014CONFIG_ATL1=m
1015CONFIG_ATL1E=m
1016# CONFIG_NETDEV_10000 is not set
1017# CONFIG_TR is not set
1018
1019#
1020# Wireless LAN
1021#
1022CONFIG_WLAN_PRE80211=y
1023# CONFIG_STRIP is not set
1024CONFIG_WLAN_80211=y
1025# CONFIG_IPW2100 is not set
1026# CONFIG_IPW2200 is not set
1027# CONFIG_LIBERTAS is not set
1028# CONFIG_AIRO is not set
1029# CONFIG_HERMES is not set
1030# CONFIG_ATMEL is not set
1031# CONFIG_PRISM54 is not set
1032CONFIG_USB_ZD1201=m
1033CONFIG_USB_NET_RNDIS_WLAN=m
1034CONFIG_RTL8180=m
1035CONFIG_RTL8187=m
1036# CONFIG_ADM8211 is not set
1037# CONFIG_MAC80211_HWSIM is not set
1038# CONFIG_P54_COMMON is not set
1039CONFIG_ATH5K=m
1040# CONFIG_ATH5K_DEBUG is not set
1041# CONFIG_ATH9K is not set
1042CONFIG_IWLWIFI=m
1043CONFIG_IWLCORE=m
1044# CONFIG_IWLWIFI_LEDS is not set
1045CONFIG_IWLWIFI_RFKILL=y
1046# CONFIG_IWLWIFI_DEBUG is not set
1047# CONFIG_IWLAGN is not set
1048CONFIG_IWL3945=m
1049CONFIG_IWL3945_RFKILL=y
1050# CONFIG_IWL3945_SPECTRUM_MEASUREMENT is not set
1051# CONFIG_IWL3945_LEDS is not set
1052# CONFIG_IWL3945_DEBUG is not set
1053# CONFIG_HOSTAP is not set
1054# CONFIG_B43 is not set
1055# CONFIG_B43LEGACY is not set
1056# CONFIG_ZD1211RW is not set
1057CONFIG_RT2X00=m
1058CONFIG_RT2X00_LIB=m
1059CONFIG_RT2X00_LIB_PCI=m
1060CONFIG_RT2X00_LIB_USB=m
1061CONFIG_RT2X00_LIB_FIRMWARE=y
1062CONFIG_RT2X00_LIB_RFKILL=y
1063CONFIG_RT2X00_LIB_LEDS=y
1064CONFIG_RT2400PCI=m
1065CONFIG_RT2400PCI_RFKILL=y
1066CONFIG_RT2400PCI_LEDS=y
1067CONFIG_RT2500PCI=m
1068CONFIG_RT2500PCI_RFKILL=y
1069CONFIG_RT2500PCI_LEDS=y
1070CONFIG_RT61PCI=m
1071CONFIG_RT61PCI_RFKILL=y
1072CONFIG_RT61PCI_LEDS=y
1073CONFIG_RT2500USB=m
1074CONFIG_RT2500USB_LEDS=y
1075CONFIG_RT73USB=m
1076CONFIG_RT73USB_LEDS=y
1077CONFIG_RT2X00_LIB_DEBUGFS=y
1078# CONFIG_RT2X00_DEBUG is not set
1079
1080#
1081# USB Network Adapters
1082#
1083CONFIG_USB_CATC=m
1084CONFIG_USB_KAWETH=m
1085CONFIG_USB_PEGASUS=m
1086CONFIG_USB_RTL8150=m
1087CONFIG_USB_USBNET=m
1088CONFIG_USB_NET_AX8817X=m
1089CONFIG_USB_NET_CDCETHER=m
1090CONFIG_USB_NET_DM9601=m
1091CONFIG_USB_NET_GL620A=m
1092CONFIG_USB_NET_NET1080=m
1093CONFIG_USB_NET_PLUSB=m
1094CONFIG_USB_NET_MCS7830=m
1095CONFIG_USB_NET_RNDIS_HOST=m
1096CONFIG_USB_NET_CDC_SUBSET=m
1097CONFIG_USB_ALI_M5632=y
1098CONFIG_USB_AN2720=y
1099CONFIG_USB_BELKIN=y
1100CONFIG_USB_ARMLINUX=y
1101CONFIG_USB_EPSON2888=y
1102CONFIG_USB_KC2190=y
1103CONFIG_USB_NET_ZAURUS=m
1104# CONFIG_USB_HSO is not set
1105# CONFIG_WAN is not set
1106# CONFIG_FDDI is not set
1107# CONFIG_HIPPI is not set
1108CONFIG_PPP=m
1109CONFIG_PPP_MULTILINK=y
1110CONFIG_PPP_FILTER=y
1111CONFIG_PPP_ASYNC=m
1112CONFIG_PPP_SYNC_TTY=m
1113CONFIG_PPP_DEFLATE=m
1114# CONFIG_PPP_BSDCOMP is not set
1115CONFIG_PPP_MPPE=m
1116CONFIG_PPPOE=m
1117CONFIG_PPPOL2TP=m
1118# CONFIG_SLIP is not set
1119CONFIG_SLHC=m
1120CONFIG_NET_FC=y
1121CONFIG_NETCONSOLE=m
1122CONFIG_NETCONSOLE_DYNAMIC=y
1123CONFIG_NETPOLL=y
1124CONFIG_NETPOLL_TRAP=y
1125CONFIG_NET_POLL_CONTROLLER=y
1126# CONFIG_ISDN is not set
1127# CONFIG_PHONE is not set
1128
1129#
1130# Input device support
1131#
1132CONFIG_INPUT=y
1133CONFIG_INPUT_FF_MEMLESS=y
1134CONFIG_INPUT_POLLDEV=m
1135
1136#
1137# Userland interfaces
1138#
1139CONFIG_INPUT_MOUSEDEV=y
1140# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
1141CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
1142CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
1143CONFIG_INPUT_JOYDEV=m
1144CONFIG_INPUT_EVDEV=y
1145# CONFIG_INPUT_EVBUG is not set
1146
1147#
1148# Input Device Drivers
1149#
1150CONFIG_INPUT_KEYBOARD=y
1151CONFIG_KEYBOARD_ATKBD=y
1152# CONFIG_KEYBOARD_SUNKBD is not set
1153# CONFIG_KEYBOARD_LKKBD is not set
1154# CONFIG_KEYBOARD_XTKBD is not set
1155# CONFIG_KEYBOARD_NEWTON is not set
1156# CONFIG_KEYBOARD_STOWAWAY is not set
1157CONFIG_INPUT_MOUSE=y
1158CONFIG_MOUSE_PS2=y
1159CONFIG_MOUSE_PS2_ALPS=y
1160CONFIG_MOUSE_PS2_LOGIPS2PP=y
1161CONFIG_MOUSE_PS2_SYNAPTICS=y
1162CONFIG_MOUSE_PS2_LIFEBOOK=y
1163CONFIG_MOUSE_PS2_TRACKPOINT=y
1164# CONFIG_MOUSE_PS2_TOUCHKIT is not set
1165CONFIG_MOUSE_SERIAL=m
1166# CONFIG_MOUSE_APPLETOUCH is not set
1167# CONFIG_MOUSE_BCM5974 is not set
1168CONFIG_MOUSE_VSXXXAA=m
1169CONFIG_INPUT_JOYSTICK=y
1170# CONFIG_JOYSTICK_ANALOG is not set
1171# CONFIG_JOYSTICK_A3D is not set
1172# CONFIG_JOYSTICK_ADI is not set
1173# CONFIG_JOYSTICK_COBRA is not set
1174# CONFIG_JOYSTICK_GF2K is not set
1175# CONFIG_JOYSTICK_GRIP is not set
1176# CONFIG_JOYSTICK_GRIP_MP is not set
1177# CONFIG_JOYSTICK_GUILLEMOT is not set
1178# CONFIG_JOYSTICK_INTERACT is not set
1179# CONFIG_JOYSTICK_SIDEWINDER is not set
1180# CONFIG_JOYSTICK_TMDC is not set
1181# CONFIG_JOYSTICK_IFORCE is not set
1182# CONFIG_JOYSTICK_WARRIOR is not set
1183# CONFIG_JOYSTICK_MAGELLAN is not set
1184# CONFIG_JOYSTICK_SPACEORB is not set
1185# CONFIG_JOYSTICK_SPACEBALL is not set
1186# CONFIG_JOYSTICK_STINGER is not set
1187# CONFIG_JOYSTICK_TWIDJOY is not set
1188# CONFIG_JOYSTICK_ZHENHUA is not set
1189# CONFIG_JOYSTICK_JOYDUMP is not set
1190# CONFIG_JOYSTICK_XPAD is not set
1191# CONFIG_INPUT_TABLET is not set
1192CONFIG_INPUT_TOUCHSCREEN=y
1193CONFIG_TOUCHSCREEN_FUJITSU=m
1194CONFIG_TOUCHSCREEN_GUNZE=m
1195CONFIG_TOUCHSCREEN_ELO=m
1196CONFIG_TOUCHSCREEN_MTOUCH=m
1197CONFIG_TOUCHSCREEN_INEXIO=m
1198CONFIG_TOUCHSCREEN_MK712=m
1199CONFIG_TOUCHSCREEN_PENMOUNT=m
1200CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
1201CONFIG_TOUCHSCREEN_TOUCHWIN=m
1202CONFIG_TOUCHSCREEN_UCB1400=m
1203# CONFIG_TOUCHSCREEN_WM97XX is not set
1204CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
1205CONFIG_TOUCHSCREEN_USB_EGALAX=y
1206CONFIG_TOUCHSCREEN_USB_PANJIT=y
1207CONFIG_TOUCHSCREEN_USB_3M=y
1208CONFIG_TOUCHSCREEN_USB_ITM=y
1209CONFIG_TOUCHSCREEN_USB_ETURBO=y
1210CONFIG_TOUCHSCREEN_USB_GUNZE=y
1211CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
1212CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
1213CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
1214CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
1215CONFIG_TOUCHSCREEN_USB_GOTOP=y
1216CONFIG_TOUCHSCREEN_TOUCHIT213=m
1217CONFIG_INPUT_MISC=y
1218# CONFIG_INPUT_PCSPKR is not set
1219# CONFIG_INPUT_APANEL is not set
1220# CONFIG_INPUT_WISTRON_BTNS is not set
1221CONFIG_INPUT_ATLAS_BTNS=m
1222CONFIG_INPUT_ATI_REMOTE=m
1223CONFIG_INPUT_ATI_REMOTE2=m
1224CONFIG_INPUT_KEYSPAN_REMOTE=m
1225CONFIG_INPUT_POWERMATE=m
1226CONFIG_INPUT_YEALINK=m
1227CONFIG_INPUT_UINPUT=m
1228
1229#
1230# Hardware I/O ports
1231#
1232CONFIG_SERIO=y
1233CONFIG_SERIO_I8042=y
1234CONFIG_SERIO_SERPORT=y
1235# CONFIG_SERIO_CT82C710 is not set
1236# CONFIG_SERIO_PCIPS2 is not set
1237CONFIG_SERIO_LIBPS2=y
1238CONFIG_SERIO_RAW=m
1239# CONFIG_GAMEPORT is not set
1240
1241#
1242# Character devices
1243#
1244CONFIG_VT=y
1245CONFIG_CONSOLE_TRANSLATIONS=y
1246CONFIG_VT_CONSOLE=y
1247CONFIG_HW_CONSOLE=y
1248CONFIG_VT_HW_CONSOLE_BINDING=y
1249# CONFIG_DEVKMEM is not set
1250# CONFIG_SERIAL_NONSTANDARD is not set
1251# CONFIG_NOZOMI is not set
1252
1253#
1254# Serial drivers
1255#
1256# CONFIG_SERIAL_8250 is not set
1257CONFIG_FIX_EARLYCON_MEM=y
1258
1259#
1260# Non-8250 serial port support
1261#
1262# CONFIG_SERIAL_JSM is not set
1263CONFIG_UNIX98_PTYS=y
1264# CONFIG_LEGACY_PTYS is not set
1265# CONFIG_IPMI_HANDLER is not set
1266# CONFIG_HW_RANDOM is not set
1267# CONFIG_NVRAM is not set
1268# CONFIG_R3964 is not set
1269# CONFIG_APPLICOM is not set
1270# CONFIG_SONYPI is not set
1271# CONFIG_MWAVE is not set
1272# CONFIG_PC8736x_GPIO is not set
1273# CONFIG_NSC_GPIO is not set
1274# CONFIG_CS5535_GPIO is not set
1275# CONFIG_RAW_DRIVER is not set
1276CONFIG_HPET=y
1277# CONFIG_HPET_MMAP is not set
1278# CONFIG_HANGCHECK_TIMER is not set
1279# CONFIG_TCG_TPM is not set
1280# CONFIG_TELCLOCK is not set
1281CONFIG_DEVPORT=y
1282CONFIG_I2C=y
1283CONFIG_I2C_BOARDINFO=y
1284# CONFIG_I2C_CHARDEV is not set
1285CONFIG_I2C_HELPER_AUTO=y
1286CONFIG_I2C_ALGOBIT=y
1287
1288#
1289# I2C Hardware Bus support
1290#
1291
1292#
1293# PC SMBus host controller drivers
1294#
1295# CONFIG_I2C_ALI1535 is not set
1296# CONFIG_I2C_ALI1563 is not set
1297# CONFIG_I2C_ALI15X3 is not set
1298# CONFIG_I2C_AMD756 is not set
1299# CONFIG_I2C_AMD8111 is not set
1300# CONFIG_I2C_I801 is not set
1301# CONFIG_I2C_ISCH is not set
1302# CONFIG_I2C_PIIX4 is not set
1303# CONFIG_I2C_NFORCE2 is not set
1304# CONFIG_I2C_SIS5595 is not set
1305# CONFIG_I2C_SIS630 is not set
1306# CONFIG_I2C_SIS96X is not set
1307# CONFIG_I2C_VIA is not set
1308# CONFIG_I2C_VIAPRO is not set
1309
1310#
1311# I2C system bus drivers (mostly embedded / system-on-chip)
1312#
1313# CONFIG_I2C_OCORES is not set
1314# CONFIG_I2C_SIMTEC is not set
1315
1316#
1317# External I2C/SMBus adapter drivers
1318#
1319# CONFIG_I2C_PARPORT_LIGHT is not set
1320# CONFIG_I2C_TAOS_EVM is not set
1321# CONFIG_I2C_TINY_USB is not set
1322
1323#
1324# Graphics adapter I2C/DDC channel drivers
1325#
1326# CONFIG_I2C_VOODOO3 is not set
1327
1328#
1329# Other I2C/SMBus bus drivers
1330#
1331# CONFIG_I2C_PCA_PLATFORM is not set
1332# CONFIG_I2C_STUB is not set
1333# CONFIG_SCx200_ACB is not set
1334
1335#
1336# Miscellaneous I2C Chip support
1337#
1338# CONFIG_DS1682 is not set
1339# CONFIG_AT24 is not set
1340# CONFIG_SENSORS_EEPROM is not set
1341# CONFIG_SENSORS_PCF8574 is not set
1342# CONFIG_PCF8575 is not set
1343# CONFIG_SENSORS_PCA9539 is not set
1344# CONFIG_SENSORS_PCF8591 is not set
1345# CONFIG_SENSORS_MAX6875 is not set
1346# CONFIG_SENSORS_TSL2550 is not set
1347# CONFIG_I2C_DEBUG_CORE is not set
1348# CONFIG_I2C_DEBUG_ALGO is not set
1349# CONFIG_I2C_DEBUG_BUS is not set
1350# CONFIG_I2C_DEBUG_CHIP is not set
1351# CONFIG_SPI is not set
1352CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
1353# CONFIG_GPIOLIB is not set
1354# CONFIG_W1 is not set
1355CONFIG_POWER_SUPPLY=y
1356# CONFIG_POWER_SUPPLY_DEBUG is not set
1357# CONFIG_PDA_POWER is not set
1358# CONFIG_BATTERY_DS2760 is not set
1359CONFIG_HWMON=y
1360# CONFIG_HWMON_VID is not set
1361# CONFIG_SENSORS_ABITUGURU is not set
1362# CONFIG_SENSORS_ABITUGURU3 is not set
1363# CONFIG_SENSORS_AD7414 is not set
1364# CONFIG_SENSORS_AD7418 is not set
1365# CONFIG_SENSORS_ADM1021 is not set
1366# CONFIG_SENSORS_ADM1025 is not set
1367# CONFIG_SENSORS_ADM1026 is not set
1368# CONFIG_SENSORS_ADM1029 is not set
1369# CONFIG_SENSORS_ADM1031 is not set
1370# CONFIG_SENSORS_ADM9240 is not set
1371# CONFIG_SENSORS_ADT7470 is not set
1372# CONFIG_SENSORS_ADT7473 is not set
1373# CONFIG_SENSORS_K8TEMP is not set
1374# CONFIG_SENSORS_ASB100 is not set
1375# CONFIG_SENSORS_ATXP1 is not set
1376# CONFIG_SENSORS_DS1621 is not set
1377# CONFIG_SENSORS_I5K_AMB is not set
1378# CONFIG_SENSORS_F71805F is not set
1379# CONFIG_SENSORS_F71882FG is not set
1380# CONFIG_SENSORS_F75375S is not set
1381# CONFIG_SENSORS_FSCHER is not set
1382# CONFIG_SENSORS_FSCPOS is not set
1383# CONFIG_SENSORS_FSCHMD is not set
1384# CONFIG_SENSORS_GL518SM is not set
1385# CONFIG_SENSORS_GL520SM is not set
1386# CONFIG_SENSORS_CORETEMP is not set
1387# CONFIG_SENSORS_IT87 is not set
1388# CONFIG_SENSORS_LM63 is not set
1389# CONFIG_SENSORS_LM75 is not set
1390# CONFIG_SENSORS_LM77 is not set
1391# CONFIG_SENSORS_LM78 is not set
1392# CONFIG_SENSORS_LM80 is not set
1393# CONFIG_SENSORS_LM83 is not set
1394# CONFIG_SENSORS_LM85 is not set
1395# CONFIG_SENSORS_LM87 is not set
1396# CONFIG_SENSORS_LM90 is not set
1397# CONFIG_SENSORS_LM92 is not set
1398# CONFIG_SENSORS_LM93 is not set
1399# CONFIG_SENSORS_MAX1619 is not set
1400# CONFIG_SENSORS_MAX6650 is not set
1401# CONFIG_SENSORS_PC87360 is not set
1402# CONFIG_SENSORS_PC87427 is not set
1403# CONFIG_SENSORS_SIS5595 is not set
1404# CONFIG_SENSORS_DME1737 is not set
1405# CONFIG_SENSORS_SMSC47M1 is not set
1406# CONFIG_SENSORS_SMSC47M192 is not set
1407# CONFIG_SENSORS_SMSC47B397 is not set
1408# CONFIG_SENSORS_ADS7828 is not set
1409# CONFIG_SENSORS_THMC50 is not set
1410# CONFIG_SENSORS_VIA686A is not set
1411# CONFIG_SENSORS_VT1211 is not set
1412# CONFIG_SENSORS_VT8231 is not set
1413# CONFIG_SENSORS_W83781D is not set
1414# CONFIG_SENSORS_W83791D is not set
1415# CONFIG_SENSORS_W83792D is not set
1416# CONFIG_SENSORS_W83793 is not set
1417# CONFIG_SENSORS_W83L785TS is not set
1418# CONFIG_SENSORS_W83L786NG is not set
1419# CONFIG_SENSORS_W83627HF is not set
1420# CONFIG_SENSORS_W83627EHF is not set
1421# CONFIG_SENSORS_HDAPS is not set
1422# CONFIG_SENSORS_APPLESMC is not set
1423# CONFIG_HWMON_DEBUG_CHIP is not set
1424CONFIG_THERMAL=y
1425# CONFIG_THERMAL_HWMON is not set
1426# CONFIG_WATCHDOG is not set
1427
1428#
1429# Sonics Silicon Backplane
1430#
1431CONFIG_SSB_POSSIBLE=y
1432# CONFIG_SSB is not set
1433
1434#
1435# Multifunction device drivers
1436#
1437# CONFIG_MFD_CORE is not set
1438# CONFIG_MFD_SM501 is not set
1439# CONFIG_HTC_PASIC3 is not set
1440# CONFIG_MFD_TMIO is not set
1441
1442#
1443# Multimedia devices
1444#
1445
1446#
1447# Multimedia core support
1448#
1449CONFIG_VIDEO_DEV=y
1450CONFIG_VIDEO_V4L2_COMMON=y
1451# CONFIG_VIDEO_ALLOW_V4L1 is not set
1452CONFIG_VIDEO_V4L1_COMPAT=y
1453CONFIG_DVB_CORE=y
1454CONFIG_VIDEO_MEDIA=y
1455
1456#
1457# Multimedia drivers
1458#
1459# CONFIG_MEDIA_ATTACH is not set
1460CONFIG_MEDIA_TUNER=y
1461# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set
1462CONFIG_MEDIA_TUNER_SIMPLE=y
1463CONFIG_MEDIA_TUNER_TDA8290=y
1464CONFIG_MEDIA_TUNER_TDA9887=y
1465CONFIG_MEDIA_TUNER_TEA5761=y
1466CONFIG_MEDIA_TUNER_TEA5767=y
1467CONFIG_MEDIA_TUNER_MT20XX=y
1468CONFIG_MEDIA_TUNER_XC2028=y
1469CONFIG_MEDIA_TUNER_XC5000=y
1470CONFIG_VIDEO_V4L2=y
1471CONFIG_VIDEO_CAPTURE_DRIVERS=y
1472# CONFIG_VIDEO_ADV_DEBUG is not set
1473CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
1474# CONFIG_VIDEO_VIVI is not set
1475# CONFIG_VIDEO_BT848 is not set
1476# CONFIG_VIDEO_SAA5246A is not set
1477# CONFIG_VIDEO_SAA5249 is not set
1478# CONFIG_VIDEO_SAA7134 is not set
1479# CONFIG_VIDEO_HEXIUM_ORION is not set
1480# CONFIG_VIDEO_HEXIUM_GEMINI is not set
1481# CONFIG_VIDEO_CX88 is not set
1482# CONFIG_VIDEO_CX23885 is not set
1483# CONFIG_VIDEO_AU0828 is not set
1484# CONFIG_VIDEO_CX18 is not set
1485# CONFIG_VIDEO_CAFE_CCIC is not set
1486CONFIG_V4L_USB_DRIVERS=y
1487CONFIG_USB_VIDEO_CLASS=m
1488CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
1489# CONFIG_USB_GSPCA is not set
1490# CONFIG_VIDEO_PVRUSB2 is not set
1491# CONFIG_VIDEO_EM28XX is not set
1492# CONFIG_VIDEO_USBVISION is not set
1493# CONFIG_USB_ET61X251 is not set
1494# CONFIG_USB_SN9C102 is not set
1495# CONFIG_USB_ZC0301 is not set
1496# CONFIG_USB_ZR364XX is not set
1497# CONFIG_USB_STKWEBCAM is not set
1498# CONFIG_USB_S2255 is not set
1499# CONFIG_SOC_CAMERA is not set
1500# CONFIG_VIDEO_SH_MOBILE_CEU is not set
1501# CONFIG_RADIO_ADAPTERS is not set
1502# CONFIG_DVB_CAPTURE_DRIVERS is not set
1503# CONFIG_DAB is not set
1504
1505#
1506# Graphics support
1507#
1508CONFIG_AGP=y
1509# CONFIG_AGP_ALI is not set
1510# CONFIG_AGP_ATI is not set
1511# CONFIG_AGP_AMD is not set
1512CONFIG_AGP_AMD64=y
1513CONFIG_AGP_INTEL=y
1514# CONFIG_AGP_NVIDIA is not set
1515# CONFIG_AGP_SIS is not set
1516# CONFIG_AGP_SWORKS is not set
1517# CONFIG_AGP_VIA is not set
1518# CONFIG_AGP_EFFICEON is not set
1519CONFIG_DRM=y
1520# CONFIG_DRM_TDFX is not set
1521# CONFIG_DRM_R128 is not set
1522# CONFIG_DRM_RADEON is not set
1523CONFIG_DRM_I810=y
1524# CONFIG_DRM_I830 is not set
1525CONFIG_DRM_I915=y
1526# CONFIG_DRM_MGA is not set
1527# CONFIG_DRM_SIS is not set
1528# CONFIG_DRM_VIA is not set
1529# CONFIG_DRM_SAVAGE is not set
1530# CONFIG_VGASTATE is not set
1531CONFIG_VIDEO_OUTPUT_CONTROL=y
1532CONFIG_FB=y
1533CONFIG_FIRMWARE_EDID=y
1534CONFIG_FB_DDC=y
1535CONFIG_FB_CFB_FILLRECT=y
1536CONFIG_FB_CFB_COPYAREA=y
1537CONFIG_FB_CFB_IMAGEBLIT=y
1538# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
1539# CONFIG_FB_SYS_FILLRECT is not set
1540# CONFIG_FB_SYS_COPYAREA is not set
1541# CONFIG_FB_SYS_IMAGEBLIT is not set
1542# CONFIG_FB_FOREIGN_ENDIAN is not set
1543# CONFIG_FB_SYS_FOPS is not set
1544# CONFIG_FB_SVGALIB is not set
1545# CONFIG_FB_MACMODES is not set
1546# CONFIG_FB_BACKLIGHT is not set
1547CONFIG_FB_MODE_HELPERS=y
1548# CONFIG_FB_TILEBLITTING is not set
1549
1550#
1551# Frame buffer hardware drivers
1552#
1553# CONFIG_FB_CIRRUS is not set
1554# CONFIG_FB_PM2 is not set
1555# CONFIG_FB_CYBER2000 is not set
1556# CONFIG_FB_ARC is not set
1557# CONFIG_FB_ASILIANT is not set
1558# CONFIG_FB_IMSTT is not set
1559# CONFIG_FB_VGA16 is not set
1560# CONFIG_FB_UVESA is not set
1561# CONFIG_FB_VESA is not set
1562# CONFIG_FB_EFI is not set
1563# CONFIG_FB_N411 is not set
1564# CONFIG_FB_HGA is not set
1565# CONFIG_FB_S1D13XXX is not set
1566# CONFIG_FB_NVIDIA is not set
1567# CONFIG_FB_RIVA is not set
1568# CONFIG_FB_I810 is not set
1569# CONFIG_FB_LE80578 is not set
1570CONFIG_FB_INTEL=y
1571CONFIG_FB_INTEL_DEBUG=y
1572CONFIG_FB_INTEL_I2C=y
1573# CONFIG_FB_MATROX is not set
1574# CONFIG_FB_RADEON is not set
1575# CONFIG_FB_ATY128 is not set
1576# CONFIG_FB_ATY is not set
1577# CONFIG_FB_S3 is not set
1578# CONFIG_FB_SAVAGE is not set
1579# CONFIG_FB_SIS is not set
1580# CONFIG_FB_NEOMAGIC is not set
1581# CONFIG_FB_KYRO is not set
1582# CONFIG_FB_3DFX is not set
1583# CONFIG_FB_VOODOO1 is not set
1584# CONFIG_FB_VT8623 is not set
1585# CONFIG_FB_CYBLA is not set
1586# CONFIG_FB_TRIDENT is not set
1587# CONFIG_FB_ARK is not set
1588# CONFIG_FB_PM3 is not set
1589# CONFIG_FB_CARMINE is not set
1590# CONFIG_FB_GEODE is not set
1591# CONFIG_FB_VIRTUAL is not set
1592CONFIG_BACKLIGHT_LCD_SUPPORT=y
1593CONFIG_LCD_CLASS_DEVICE=y
1594# CONFIG_LCD_ILI9320 is not set
1595CONFIG_LCD_PLATFORM=y
1596CONFIG_BACKLIGHT_CLASS_DEVICE=y
1597# CONFIG_BACKLIGHT_CORGI is not set
1598# CONFIG_BACKLIGHT_PROGEAR is not set
1599CONFIG_BACKLIGHT_MBP_NVIDIA=y
1600
1601#
1602# Display device support
1603#
1604CONFIG_DISPLAY_SUPPORT=y
1605
1606#
1607# Display hardware drivers
1608#
1609
1610#
1611# Console display driver support
1612#
1613CONFIG_VGA_CONSOLE=y
1614CONFIG_VGACON_SOFT_SCROLLBACK=y
1615CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
1616CONFIG_VIDEO_SELECT=y
1617CONFIG_DUMMY_CONSOLE=y
1618CONFIG_FRAMEBUFFER_CONSOLE=y
1619# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
1620# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
1621# CONFIG_FONTS is not set
1622CONFIG_FONT_8x8=y
1623CONFIG_FONT_8x16=y
1624# CONFIG_LOGO is not set
1625CONFIG_SOUND=y
1626CONFIG_SND=y
1627CONFIG_SND_TIMER=y
1628CONFIG_SND_PCM=y
1629CONFIG_SND_HWDEP=y
1630CONFIG_SND_RAWMIDI=m
1631CONFIG_SND_SEQUENCER=y
1632CONFIG_SND_SEQ_DUMMY=y
1633# CONFIG_SND_MIXER_OSS is not set
1634# CONFIG_SND_PCM_OSS is not set
1635# CONFIG_SND_SEQUENCER_OSS is not set
1636CONFIG_SND_DYNAMIC_MINORS=y
1637# CONFIG_SND_SUPPORT_OLD_API is not set
1638CONFIG_SND_VERBOSE_PROCFS=y
1639CONFIG_SND_VERBOSE_PRINTK=y
1640CONFIG_SND_DEBUG=y
1641# CONFIG_SND_DEBUG_VERBOSE is not set
1642CONFIG_SND_PCM_XRUN_DEBUG=y
1643CONFIG_SND_VMASTER=y
1644CONFIG_SND_AC97_CODEC=y
1645CONFIG_SND_DRIVERS=y
1646# CONFIG_SND_PCSP is not set
1647# CONFIG_SND_DUMMY is not set
1648# CONFIG_SND_VIRMIDI is not set
1649# CONFIG_SND_MTPAV is not set
1650# CONFIG_SND_SERIAL_U16550 is not set
1651# CONFIG_SND_MPU401 is not set
1652CONFIG_SND_AC97_POWER_SAVE=y
1653CONFIG_SND_AC97_POWER_SAVE_DEFAULT=5
1654CONFIG_SND_PCI=y
1655# CONFIG_SND_AD1889 is not set
1656# CONFIG_SND_ALS300 is not set
1657# CONFIG_SND_ALS4000 is not set
1658# CONFIG_SND_ALI5451 is not set
1659# CONFIG_SND_ATIIXP is not set
1660# CONFIG_SND_ATIIXP_MODEM is not set
1661# CONFIG_SND_AU8810 is not set
1662# CONFIG_SND_AU8820 is not set
1663# CONFIG_SND_AU8830 is not set
1664# CONFIG_SND_AW2 is not set
1665# CONFIG_SND_AZT3328 is not set
1666# CONFIG_SND_BT87X is not set
1667# CONFIG_SND_CA0106 is not set
1668# CONFIG_SND_CMIPCI is not set
1669# CONFIG_SND_OXYGEN is not set
1670# CONFIG_SND_CS4281 is not set
1671# CONFIG_SND_CS46XX is not set
1672# CONFIG_SND_CS5530 is not set
1673# CONFIG_SND_CS5535AUDIO is not set
1674# CONFIG_SND_DARLA20 is not set
1675# CONFIG_SND_GINA20 is not set
1676# CONFIG_SND_LAYLA20 is not set
1677# CONFIG_SND_DARLA24 is not set
1678# CONFIG_SND_GINA24 is not set
1679# CONFIG_SND_LAYLA24 is not set
1680# CONFIG_SND_MONA is not set
1681# CONFIG_SND_MIA is not set
1682# CONFIG_SND_ECHO3G is not set
1683# CONFIG_SND_INDIGO is not set
1684# CONFIG_SND_INDIGOIO is not set
1685# CONFIG_SND_INDIGODJ is not set
1686# CONFIG_SND_EMU10K1 is not set
1687# CONFIG_SND_EMU10K1X is not set
1688# CONFIG_SND_ENS1370 is not set
1689# CONFIG_SND_ENS1371 is not set
1690# CONFIG_SND_ES1938 is not set
1691# CONFIG_SND_ES1968 is not set
1692# CONFIG_SND_FM801 is not set
1693CONFIG_SND_HDA_INTEL=y
1694CONFIG_SND_HDA_HWDEP=y
1695CONFIG_SND_HDA_CODEC_REALTEK=y
1696CONFIG_SND_HDA_CODEC_ANALOG=y
1697CONFIG_SND_HDA_CODEC_SIGMATEL=y
1698CONFIG_SND_HDA_CODEC_VIA=y
1699CONFIG_SND_HDA_CODEC_ATIHDMI=y
1700CONFIG_SND_HDA_CODEC_CONEXANT=y
1701CONFIG_SND_HDA_CODEC_CMEDIA=y
1702CONFIG_SND_HDA_CODEC_SI3054=y
1703CONFIG_SND_HDA_GENERIC=y
1704CONFIG_SND_HDA_POWER_SAVE=y
1705CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
1706# CONFIG_SND_HDSP is not set
1707# CONFIG_SND_HDSPM is not set
1708# CONFIG_SND_HIFIER is not set
1709# CONFIG_SND_ICE1712 is not set
1710# CONFIG_SND_ICE1724 is not set
1711CONFIG_SND_INTEL8X0=y
1712# CONFIG_SND_INTEL8X0M is not set
1713# CONFIG_SND_KORG1212 is not set
1714# CONFIG_SND_MAESTRO3 is not set
1715# CONFIG_SND_MIXART is not set
1716# CONFIG_SND_NM256 is not set
1717# CONFIG_SND_PCXHR is not set
1718# CONFIG_SND_RIPTIDE is not set
1719# CONFIG_SND_RME32 is not set
1720# CONFIG_SND_RME96 is not set
1721# CONFIG_SND_RME9652 is not set
1722# CONFIG_SND_SIS7019 is not set
1723# CONFIG_SND_SONICVIBES is not set
1724# CONFIG_SND_TRIDENT is not set
1725# CONFIG_SND_VIA82XX is not set
1726# CONFIG_SND_VIA82XX_MODEM is not set
1727# CONFIG_SND_VIRTUOSO is not set
1728# CONFIG_SND_VX222 is not set
1729# CONFIG_SND_YMFPCI is not set
1730CONFIG_SND_USB=y
1731CONFIG_SND_USB_AUDIO=m
1732CONFIG_SND_USB_USX2Y=m
1733CONFIG_SND_USB_CAIAQ=m
1734CONFIG_SND_USB_CAIAQ_INPUT=y
1735# CONFIG_SND_SOC is not set
1736# CONFIG_SOUND_PRIME is not set
1737CONFIG_AC97_BUS=y
1738CONFIG_HID_SUPPORT=y
1739CONFIG_HID=y
1740CONFIG_HID_DEBUG=y
1741CONFIG_HIDRAW=y
1742
1743#
1744# USB Input Devices
1745#
1746CONFIG_USB_HID=y
1747CONFIG_USB_HIDINPUT_POWERBOOK=y
1748CONFIG_HID_FF=y
1749CONFIG_HID_PID=y
1750CONFIG_LOGITECH_FF=y
1751# CONFIG_LOGIRUMBLEPAD2_FF is not set
1752CONFIG_PANTHERLORD_FF=y
1753CONFIG_THRUSTMASTER_FF=y
1754CONFIG_ZEROPLUS_FF=y
1755CONFIG_USB_HIDDEV=y
1756CONFIG_USB_SUPPORT=y
1757CONFIG_USB_ARCH_HAS_HCD=y
1758CONFIG_USB_ARCH_HAS_OHCI=y
1759CONFIG_USB_ARCH_HAS_EHCI=y
1760CONFIG_USB=y
1761# CONFIG_USB_DEBUG is not set
1762CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
1763
1764#
1765# Miscellaneous USB options
1766#
1767CONFIG_USB_DEVICEFS=y
1768# CONFIG_USB_DEVICE_CLASS is not set
1769# CONFIG_USB_DYNAMIC_MINORS is not set
1770CONFIG_USB_SUSPEND=y
1771# CONFIG_USB_OTG is not set
1772CONFIG_USB_MON=y
1773
1774#
1775# USB Host Controller Drivers
1776#
1777# CONFIG_USB_C67X00_HCD is not set
1778CONFIG_USB_EHCI_HCD=y
1779CONFIG_USB_EHCI_ROOT_HUB_TT=y
1780CONFIG_USB_EHCI_TT_NEWSCHED=y
1781# CONFIG_USB_ISP116X_HCD is not set
1782# CONFIG_USB_ISP1760_HCD is not set
1783CONFIG_USB_OHCI_HCD=m
1784# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
1785# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
1786CONFIG_USB_OHCI_LITTLE_ENDIAN=y
1787CONFIG_USB_UHCI_HCD=m
1788CONFIG_USB_U132_HCD=m
1789CONFIG_USB_SL811_HCD=m
1790# CONFIG_USB_R8A66597_HCD is not set
1791
1792#
1793# USB Device Class drivers
1794#
1795CONFIG_USB_ACM=m
1796CONFIG_USB_PRINTER=m
1797# CONFIG_USB_WDM is not set
1798
1799#
1800# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
1801#
1802
1803#
1804# may also be needed; see USB_STORAGE Help for more information
1805#
1806CONFIG_USB_STORAGE=y
1807# CONFIG_USB_STORAGE_DEBUG is not set
1808CONFIG_USB_STORAGE_DATAFAB=y
1809CONFIG_USB_STORAGE_FREECOM=y
1810CONFIG_USB_STORAGE_ISD200=y
1811CONFIG_USB_STORAGE_DPCM=y
1812CONFIG_USB_STORAGE_USBAT=y
1813CONFIG_USB_STORAGE_SDDR09=y
1814CONFIG_USB_STORAGE_SDDR55=y
1815CONFIG_USB_STORAGE_JUMPSHOT=y
1816CONFIG_USB_STORAGE_ALAUDA=y
1817# CONFIG_USB_STORAGE_ONETOUCH is not set
1818CONFIG_USB_STORAGE_KARMA=y
1819# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
1820# CONFIG_USB_LIBUSUAL is not set
1821
1822#
1823# USB Imaging devices
1824#
1825CONFIG_USB_MDC800=m
1826CONFIG_USB_MICROTEK=m
1827
1828#
1829# USB port drivers
1830#
1831CONFIG_USB_SERIAL=m
1832CONFIG_USB_EZUSB=y
1833CONFIG_USB_SERIAL_GENERIC=y
1834CONFIG_USB_SERIAL_AIRCABLE=m
1835CONFIG_USB_SERIAL_ARK3116=m
1836CONFIG_USB_SERIAL_BELKIN=m
1837CONFIG_USB_SERIAL_CH341=m
1838CONFIG_USB_SERIAL_WHITEHEAT=m
1839CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
1840CONFIG_USB_SERIAL_CP2101=m
1841CONFIG_USB_SERIAL_CYPRESS_M8=m
1842CONFIG_USB_SERIAL_EMPEG=m
1843CONFIG_USB_SERIAL_FTDI_SIO=m
1844CONFIG_USB_SERIAL_FUNSOFT=m
1845CONFIG_USB_SERIAL_VISOR=m
1846CONFIG_USB_SERIAL_IPAQ=m
1847CONFIG_USB_SERIAL_IR=m
1848CONFIG_USB_SERIAL_EDGEPORT=m
1849CONFIG_USB_SERIAL_EDGEPORT_TI=m
1850CONFIG_USB_SERIAL_GARMIN=m
1851CONFIG_USB_SERIAL_IPW=m
1852CONFIG_USB_SERIAL_IUU=m
1853CONFIG_USB_SERIAL_KEYSPAN_PDA=m
1854CONFIG_USB_SERIAL_KEYSPAN=m
1855CONFIG_USB_SERIAL_KEYSPAN_MPR=y
1856CONFIG_USB_SERIAL_KEYSPAN_USA28=y
1857CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
1858CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
1859CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
1860CONFIG_USB_SERIAL_KEYSPAN_USA19=y
1861CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
1862CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
1863CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
1864CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
1865CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
1866CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
1867CONFIG_USB_SERIAL_KLSI=m
1868CONFIG_USB_SERIAL_KOBIL_SCT=m
1869CONFIG_USB_SERIAL_MCT_U232=m
1870CONFIG_USB_SERIAL_MOS7720=m
1871CONFIG_USB_SERIAL_MOS7840=m
1872# CONFIG_USB_SERIAL_MOTOROLA is not set
1873CONFIG_USB_SERIAL_NAVMAN=m
1874CONFIG_USB_SERIAL_PL2303=m
1875CONFIG_USB_SERIAL_OTI6858=m
1876# CONFIG_USB_SERIAL_SPCP8X5 is not set
1877CONFIG_USB_SERIAL_HP4X=m
1878CONFIG_USB_SERIAL_SAFE=m
1879CONFIG_USB_SERIAL_SAFE_PADDED=y
1880CONFIG_USB_SERIAL_SIERRAWIRELESS=m
1881CONFIG_USB_SERIAL_TI=m
1882CONFIG_USB_SERIAL_CYBERJACK=m
1883CONFIG_USB_SERIAL_XIRCOM=m
1884CONFIG_USB_SERIAL_OPTION=m
1885CONFIG_USB_SERIAL_OMNINET=m
1886CONFIG_USB_SERIAL_DEBUG=m
1887
1888#
1889# USB Miscellaneous drivers
1890#
1891CONFIG_USB_EMI62=m
1892CONFIG_USB_EMI26=m
1893CONFIG_USB_ADUTUX=m
1894# CONFIG_USB_RIO500 is not set
1895CONFIG_USB_LEGOTOWER=m
1896CONFIG_USB_LCD=m
1897CONFIG_USB_BERRY_CHARGE=m
1898CONFIG_USB_LED=m
1899# CONFIG_USB_CYPRESS_CY7C63 is not set
1900# CONFIG_USB_CYTHERM is not set
1901CONFIG_USB_PHIDGET=m
1902CONFIG_USB_PHIDGETKIT=m
1903CONFIG_USB_PHIDGETMOTORCONTROL=m
1904CONFIG_USB_PHIDGETSERVO=m
1905CONFIG_USB_IDMOUSE=m
1906CONFIG_USB_FTDI_ELAN=m
1907CONFIG_USB_APPLEDISPLAY=m
1908CONFIG_USB_SISUSBVGA=m
1909CONFIG_USB_SISUSBVGA_CON=y
1910CONFIG_USB_LD=m
1911CONFIG_USB_TRANCEVIBRATOR=m
1912CONFIG_USB_IOWARRIOR=m
1913# CONFIG_USB_TEST is not set
1914# CONFIG_USB_ISIGHTFW is not set
1915# CONFIG_USB_GADGET is not set
1916CONFIG_MMC=m
1917# CONFIG_MMC_DEBUG is not set
1918# CONFIG_MMC_UNSAFE_RESUME is not set
1919
1920#
1921# MMC/SD Card Drivers
1922#
1923CONFIG_MMC_BLOCK=m
1924CONFIG_MMC_BLOCK_BOUNCE=y
1925CONFIG_SDIO_UART=m
1926# CONFIG_MMC_TEST is not set
1927
1928#
1929# MMC/SD Host Controller Drivers
1930#
1931CONFIG_MMC_SDHCI=m
1932# CONFIG_MMC_SDHCI_PCI is not set
1933CONFIG_MMC_WBSD=m
1934CONFIG_MMC_TIFM_SD=m
1935CONFIG_MEMSTICK=m
1936CONFIG_MEMSTICK_DEBUG=y
1937
1938#
1939# MemoryStick drivers
1940#
1941# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
1942CONFIG_MSPRO_BLOCK=m
1943
1944#
1945# MemoryStick Host Controller Drivers
1946#
1947# CONFIG_MEMSTICK_TIFM_MS is not set
1948# CONFIG_MEMSTICK_JMICRON_38X is not set
1949CONFIG_NEW_LEDS=y
1950CONFIG_LEDS_CLASS=m
1951
1952#
1953# LED drivers
1954#
1955# CONFIG_LEDS_PCA9532 is not set
1956# CONFIG_LEDS_CLEVO_MAIL is not set
1957# CONFIG_LEDS_PCA955X is not set
1958
1959#
1960# LED Triggers
1961#
1962CONFIG_LEDS_TRIGGERS=y
1963# CONFIG_LEDS_TRIGGER_TIMER is not set
1964# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
1965# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
1966# CONFIG_ACCESSIBILITY is not set
1967# CONFIG_INFINIBAND is not set
1968# CONFIG_EDAC is not set
1969CONFIG_RTC_LIB=y
1970CONFIG_RTC_CLASS=y
1971# CONFIG_RTC_HCTOSYS is not set
1972# CONFIG_RTC_DEBUG is not set
1973
1974#
1975# RTC interfaces
1976#
1977CONFIG_RTC_INTF_SYSFS=y
1978CONFIG_RTC_INTF_PROC=y
1979CONFIG_RTC_INTF_DEV=y
1980# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
1981# CONFIG_RTC_DRV_TEST is not set
1982
1983#
1984# I2C RTC drivers
1985#
1986# CONFIG_RTC_DRV_DS1307 is not set
1987# CONFIG_RTC_DRV_DS1374 is not set
1988# CONFIG_RTC_DRV_DS1672 is not set
1989# CONFIG_RTC_DRV_MAX6900 is not set
1990# CONFIG_RTC_DRV_RS5C372 is not set
1991# CONFIG_RTC_DRV_ISL1208 is not set
1992# CONFIG_RTC_DRV_X1205 is not set
1993# CONFIG_RTC_DRV_PCF8563 is not set
1994# CONFIG_RTC_DRV_PCF8583 is not set
1995# CONFIG_RTC_DRV_M41T80 is not set
1996# CONFIG_RTC_DRV_S35390A is not set
1997# CONFIG_RTC_DRV_FM3130 is not set
1998
1999#
2000# SPI RTC drivers
2001#
2002
2003#
2004# Platform RTC drivers
2005#
2006CONFIG_RTC_DRV_CMOS=y
2007# CONFIG_RTC_DRV_DS1511 is not set
2008# CONFIG_RTC_DRV_DS1553 is not set
2009# CONFIG_RTC_DRV_DS1742 is not set
2010# CONFIG_RTC_DRV_STK17TA8 is not set
2011# CONFIG_RTC_DRV_M48T86 is not set
2012# CONFIG_RTC_DRV_M48T59 is not set
2013# CONFIG_RTC_DRV_V3020 is not set
2014
2015#
2016# on-CPU RTC drivers
2017#
2018# CONFIG_DMADEVICES is not set
2019# CONFIG_UIO is not set
2020
2021#
2022# Firmware Drivers
2023#
2024# CONFIG_EDD is not set
2025CONFIG_FIRMWARE_MEMMAP=y
2026# CONFIG_DELL_RBU is not set
2027# CONFIG_DCDBAS is not set
2028# CONFIG_DMIID is not set
2029# CONFIG_ISCSI_IBFT_FIND is not set
2030
2031#
2032# File systems
2033#
2034# CONFIG_EXT2_FS is not set
2035CONFIG_EXT3_FS=y
2036CONFIG_EXT3_FS_XATTR=y
2037CONFIG_EXT3_FS_POSIX_ACL=y
2038CONFIG_EXT3_FS_SECURITY=y
2039# CONFIG_EXT4DEV_FS is not set
2040CONFIG_JBD=y
2041# CONFIG_JBD_DEBUG is not set
2042CONFIG_FS_MBCACHE=y
2043# CONFIG_REISERFS_FS is not set
2044# CONFIG_JFS_FS is not set
2045CONFIG_FS_POSIX_ACL=y
2046# CONFIG_XFS_FS is not set
2047# CONFIG_OCFS2_FS is not set
2048CONFIG_DNOTIFY=y
2049CONFIG_INOTIFY=y
2050CONFIG_INOTIFY_USER=y
2051CONFIG_QUOTA=y
2052CONFIG_QUOTA_NETLINK_INTERFACE=y
2053# CONFIG_PRINT_QUOTA_WARNING is not set
2054# CONFIG_QFMT_V1 is not set
2055CONFIG_QFMT_V2=y
2056CONFIG_QUOTACTL=y
2057# CONFIG_AUTOFS_FS is not set
2058# CONFIG_AUTOFS4_FS is not set
2059CONFIG_FUSE_FS=m
2060CONFIG_GENERIC_ACL=y
2061
2062#
2063# CD-ROM/DVD Filesystems
2064#
2065CONFIG_ISO9660_FS=y
2066CONFIG_JOLIET=y
2067CONFIG_ZISOFS=y
2068CONFIG_UDF_FS=m
2069CONFIG_UDF_NLS=y
2070
2071#
2072# DOS/FAT/NT Filesystems
2073#
2074CONFIG_FAT_FS=y
2075CONFIG_MSDOS_FS=y
2076CONFIG_VFAT_FS=y
2077CONFIG_FAT_DEFAULT_CODEPAGE=437
2078CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
2079# CONFIG_NTFS_FS is not set
2080
2081#
2082# Pseudo filesystems
2083#
2084CONFIG_PROC_FS=y
2085CONFIG_PROC_KCORE=y
2086CONFIG_PROC_VMCORE=y
2087CONFIG_PROC_SYSCTL=y
2088CONFIG_SYSFS=y
2089CONFIG_TMPFS=y
2090CONFIG_TMPFS_POSIX_ACL=y
2091CONFIG_HUGETLBFS=y
2092CONFIG_HUGETLB_PAGE=y
2093CONFIG_CONFIGFS_FS=m
2094
2095#
2096# Miscellaneous filesystems
2097#
2098# CONFIG_ADFS_FS is not set
2099# CONFIG_AFFS_FS is not set
2100# CONFIG_ECRYPT_FS is not set
2101# CONFIG_HFS_FS is not set
2102# CONFIG_HFSPLUS_FS is not set
2103# CONFIG_BEFS_FS is not set
2104# CONFIG_BFS_FS is not set
2105# CONFIG_EFS_FS is not set
2106# CONFIG_CRAMFS is not set
2107# CONFIG_VXFS_FS is not set
2108# CONFIG_MINIX_FS is not set
2109# CONFIG_OMFS_FS is not set
2110# CONFIG_HPFS_FS is not set
2111# CONFIG_QNX4FS_FS is not set
2112# CONFIG_ROMFS_FS is not set
2113# CONFIG_SYSV_FS is not set
2114# CONFIG_UFS_FS is not set
2115CONFIG_NETWORK_FILESYSTEMS=y
2116# CONFIG_NFS_FS is not set
2117# CONFIG_NFSD is not set
2118# CONFIG_SMB_FS is not set
2119# CONFIG_CIFS is not set
2120# CONFIG_NCP_FS is not set
2121# CONFIG_CODA_FS is not set
2122# CONFIG_AFS_FS is not set
2123
2124#
2125# Partition Types
2126#
2127CONFIG_PARTITION_ADVANCED=y
2128# CONFIG_ACORN_PARTITION is not set
2129CONFIG_OSF_PARTITION=y
2130CONFIG_AMIGA_PARTITION=y
2131# CONFIG_ATARI_PARTITION is not set
2132CONFIG_MAC_PARTITION=y
2133CONFIG_MSDOS_PARTITION=y
2134CONFIG_BSD_DISKLABEL=y
2135CONFIG_MINIX_SUBPARTITION=y
2136CONFIG_SOLARIS_X86_PARTITION=y
2137CONFIG_UNIXWARE_DISKLABEL=y
2138# CONFIG_LDM_PARTITION is not set
2139CONFIG_SGI_PARTITION=y
2140# CONFIG_ULTRIX_PARTITION is not set
2141CONFIG_SUN_PARTITION=y
2142CONFIG_KARMA_PARTITION=y
2143CONFIG_EFI_PARTITION=y
2144# CONFIG_SYSV68_PARTITION is not set
2145CONFIG_NLS=y
2146CONFIG_NLS_DEFAULT="utf8"
2147CONFIG_NLS_CODEPAGE_437=y
2148CONFIG_NLS_CODEPAGE_737=m
2149CONFIG_NLS_CODEPAGE_775=m
2150CONFIG_NLS_CODEPAGE_850=m
2151CONFIG_NLS_CODEPAGE_852=m
2152CONFIG_NLS_CODEPAGE_855=m
2153CONFIG_NLS_CODEPAGE_857=m
2154CONFIG_NLS_CODEPAGE_860=m
2155CONFIG_NLS_CODEPAGE_861=m
2156CONFIG_NLS_CODEPAGE_862=m
2157CONFIG_NLS_CODEPAGE_863=m
2158CONFIG_NLS_CODEPAGE_864=m
2159CONFIG_NLS_CODEPAGE_865=m
2160CONFIG_NLS_CODEPAGE_866=m
2161CONFIG_NLS_CODEPAGE_869=m
2162CONFIG_NLS_CODEPAGE_936=m
2163CONFIG_NLS_CODEPAGE_950=m
2164CONFIG_NLS_CODEPAGE_932=m
2165CONFIG_NLS_CODEPAGE_949=m
2166CONFIG_NLS_CODEPAGE_874=m
2167CONFIG_NLS_ISO8859_8=m
2168CONFIG_NLS_CODEPAGE_1250=m
2169CONFIG_NLS_CODEPAGE_1251=m
2170CONFIG_NLS_ASCII=y
2171CONFIG_NLS_ISO8859_1=m
2172CONFIG_NLS_ISO8859_2=m
2173CONFIG_NLS_ISO8859_3=m
2174CONFIG_NLS_ISO8859_4=m
2175CONFIG_NLS_ISO8859_5=m
2176CONFIG_NLS_ISO8859_6=m
2177CONFIG_NLS_ISO8859_7=m
2178CONFIG_NLS_ISO8859_9=m
2179CONFIG_NLS_ISO8859_13=m
2180CONFIG_NLS_ISO8859_14=m
2181CONFIG_NLS_ISO8859_15=m
2182CONFIG_NLS_KOI8_R=m
2183CONFIG_NLS_KOI8_U=m
2184CONFIG_NLS_UTF8=m
2185# CONFIG_DLM is not set
2186
2187#
2188# Kernel hacking
2189#
2190CONFIG_TRACE_IRQFLAGS_SUPPORT=y
2191CONFIG_PRINTK_TIME=y
2192# CONFIG_ENABLE_WARN_DEPRECATED is not set
2193CONFIG_ENABLE_MUST_CHECK=y
2194CONFIG_FRAME_WARN=1024
2195CONFIG_MAGIC_SYSRQ=y
2196CONFIG_UNUSED_SYMBOLS=y
2197CONFIG_DEBUG_FS=y
2198# CONFIG_HEADERS_CHECK is not set
2199CONFIG_DEBUG_KERNEL=y
2200CONFIG_DEBUG_SHIRQ=y
2201CONFIG_DETECT_SOFTLOCKUP=y
2202# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
2203CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
2204CONFIG_SCHED_DEBUG=y
2205CONFIG_SCHEDSTATS=y
2206CONFIG_TIMER_STATS=y
2207# CONFIG_DEBUG_OBJECTS is not set
2208# CONFIG_DEBUG_SLAB is not set
2209# CONFIG_DEBUG_RT_MUTEXES is not set
2210# CONFIG_RT_MUTEX_TESTER is not set
2211# CONFIG_DEBUG_SPINLOCK is not set
2212# CONFIG_DEBUG_MUTEXES is not set
2213# CONFIG_DEBUG_LOCK_ALLOC is not set
2214# CONFIG_PROVE_LOCKING is not set
2215# CONFIG_LOCK_STAT is not set
2216CONFIG_DEBUG_SPINLOCK_SLEEP=y
2217# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
2218CONFIG_STACKTRACE=y
2219# CONFIG_DEBUG_KOBJECT is not set
2220# CONFIG_DEBUG_HIGHMEM is not set
2221CONFIG_DEBUG_BUGVERBOSE=y
2222# CONFIG_DEBUG_INFO is not set
2223# CONFIG_DEBUG_VM is not set
2224# CONFIG_DEBUG_WRITECOUNT is not set
2225CONFIG_DEBUG_MEMORY_INIT=y
2226CONFIG_DEBUG_LIST=y
2227# CONFIG_DEBUG_SG is not set
2228CONFIG_FRAME_POINTER=y
2229CONFIG_BOOT_PRINTK_DELAY=y
2230# CONFIG_RCU_TORTURE_TEST is not set
2231# CONFIG_BACKTRACE_SELF_TEST is not set
2232# CONFIG_FAULT_INJECTION is not set
2233CONFIG_LATENCYTOP=y
2234CONFIG_SYSCTL_SYSCALL_CHECK=y
2235CONFIG_HAVE_FTRACE=y
2236CONFIG_HAVE_DYNAMIC_FTRACE=y
2237CONFIG_TRACING=y
2238# CONFIG_FTRACE is not set
2239# CONFIG_IRQSOFF_TRACER is not set
2240CONFIG_SYSPROF_TRACER=y
2241# CONFIG_SCHED_TRACER is not set
2242# CONFIG_CONTEXT_SWITCH_TRACER is not set
2243# CONFIG_FTRACE_STARTUP_TEST is not set
2244# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
2245# CONFIG_SAMPLES is not set
2246CONFIG_HAVE_ARCH_KGDB=y
2247# CONFIG_KGDB is not set
2248# CONFIG_STRICT_DEVMEM is not set
2249CONFIG_X86_VERBOSE_BOOTUP=y
2250CONFIG_EARLY_PRINTK=y
2251# CONFIG_DEBUG_STACKOVERFLOW is not set
2252# CONFIG_DEBUG_STACK_USAGE is not set
2253# CONFIG_DEBUG_PAGEALLOC is not set
2254# CONFIG_DEBUG_PER_CPU_MAPS is not set
2255CONFIG_X86_PTDUMP=y
2256CONFIG_DEBUG_RODATA=y
2257# CONFIG_DEBUG_RODATA_TEST is not set
2258# CONFIG_DEBUG_NX_TEST is not set
2259# CONFIG_4KSTACKS is not set
2260CONFIG_DOUBLEFAULT=y
2261# CONFIG_MMIOTRACE is not set
2262CONFIG_IO_DELAY_TYPE_0X80=0
2263CONFIG_IO_DELAY_TYPE_0XED=1
2264CONFIG_IO_DELAY_TYPE_UDELAY=2
2265CONFIG_IO_DELAY_TYPE_NONE=3
2266CONFIG_IO_DELAY_0X80=y
2267# CONFIG_IO_DELAY_0XED is not set
2268# CONFIG_IO_DELAY_UDELAY is not set
2269# CONFIG_IO_DELAY_NONE is not set
2270CONFIG_DEFAULT_IO_DELAY_TYPE=0
2271CONFIG_DEBUG_BOOT_PARAMS=y
2272# CONFIG_CPA_DEBUG is not set
2273# CONFIG_OPTIMIZE_INLINING is not set
2274
2275#
2276# Security options
2277#
2278CONFIG_KEYS=y
2279CONFIG_KEYS_DEBUG_PROC_KEYS=y
2280CONFIG_SECURITY=y
2281CONFIG_SECURITY_NETWORK=y
2282CONFIG_SECURITY_NETWORK_XFRM=y
2283CONFIG_SECURITY_FILE_CAPABILITIES=y
2284# CONFIG_SECURITY_ROOTPLUG is not set
2285CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=65536
2286# CONFIG_SECURITY_SELINUX is not set
2287# CONFIG_SECURITY_SMACK is not set
2288CONFIG_CRYPTO=y
2289
2290#
2291# Crypto core or helper
2292#
2293CONFIG_CRYPTO_ALGAPI=y
2294CONFIG_CRYPTO_AEAD=m
2295CONFIG_CRYPTO_BLKCIPHER=m
2296CONFIG_CRYPTO_HASH=y
2297CONFIG_CRYPTO_MANAGER=y
2298CONFIG_CRYPTO_GF128MUL=m
2299CONFIG_CRYPTO_NULL=m
2300# CONFIG_CRYPTO_CRYPTD is not set
2301CONFIG_CRYPTO_AUTHENC=m
2302CONFIG_CRYPTO_TEST=m
2303
2304#
2305# Authenticated Encryption with Associated Data
2306#
2307CONFIG_CRYPTO_CCM=m
2308CONFIG_CRYPTO_GCM=m
2309CONFIG_CRYPTO_SEQIV=m
2310
2311#
2312# Block modes
2313#
2314CONFIG_CRYPTO_CBC=m
2315CONFIG_CRYPTO_CTR=m
2316# CONFIG_CRYPTO_CTS is not set
2317CONFIG_CRYPTO_ECB=m
2318CONFIG_CRYPTO_LRW=m
2319CONFIG_CRYPTO_PCBC=m
2320CONFIG_CRYPTO_XTS=m
2321
2322#
2323# Hash modes
2324#
2325CONFIG_CRYPTO_HMAC=y
2326CONFIG_CRYPTO_XCBC=m
2327
2328#
2329# Digest
2330#
2331CONFIG_CRYPTO_CRC32C=m
2332CONFIG_CRYPTO_MD4=m
2333CONFIG_CRYPTO_MD5=y
2334CONFIG_CRYPTO_MICHAEL_MIC=m
2335# CONFIG_CRYPTO_RMD128 is not set
2336# CONFIG_CRYPTO_RMD160 is not set
2337# CONFIG_CRYPTO_RMD256 is not set
2338# CONFIG_CRYPTO_RMD320 is not set
2339CONFIG_CRYPTO_SHA1=y
2340CONFIG_CRYPTO_SHA256=m
2341CONFIG_CRYPTO_SHA512=m
2342CONFIG_CRYPTO_TGR192=m
2343CONFIG_CRYPTO_WP512=m
2344
2345#
2346# Ciphers
2347#
2348CONFIG_CRYPTO_AES=m
2349# CONFIG_CRYPTO_AES_586 is not set
2350CONFIG_CRYPTO_ANUBIS=m
2351CONFIG_CRYPTO_ARC4=m
2352CONFIG_CRYPTO_BLOWFISH=m
2353CONFIG_CRYPTO_CAMELLIA=m
2354CONFIG_CRYPTO_CAST5=m
2355CONFIG_CRYPTO_CAST6=m
2356CONFIG_CRYPTO_DES=m
2357CONFIG_CRYPTO_FCRYPT=m
2358CONFIG_CRYPTO_KHAZAD=m
2359CONFIG_CRYPTO_SALSA20=m
2360# CONFIG_CRYPTO_SALSA20_586 is not set
2361CONFIG_CRYPTO_SEED=m
2362CONFIG_CRYPTO_SERPENT=m
2363CONFIG_CRYPTO_TEA=m
2364CONFIG_CRYPTO_TWOFISH=m
2365CONFIG_CRYPTO_TWOFISH_COMMON=m
2366# CONFIG_CRYPTO_TWOFISH_586 is not set
2367
2368#
2369# Compression
2370#
2371CONFIG_CRYPTO_DEFLATE=m
2372# CONFIG_CRYPTO_LZO is not set
2373CONFIG_CRYPTO_HW=y
2374# CONFIG_CRYPTO_DEV_PADLOCK is not set
2375# CONFIG_CRYPTO_DEV_GEODE is not set
2376# CONFIG_CRYPTO_DEV_HIFN_795X is not set
2377CONFIG_HAVE_KVM=y
2378# CONFIG_VIRTUALIZATION is not set
2379
2380#
2381# Library routines
2382#
2383CONFIG_BITREVERSE=y
2384CONFIG_GENERIC_FIND_FIRST_BIT=y
2385CONFIG_GENERIC_FIND_NEXT_BIT=y
2386CONFIG_CRC_CCITT=m
2387CONFIG_CRC16=m
2388CONFIG_CRC_T10DIF=y
2389CONFIG_CRC_ITU_T=m
2390CONFIG_CRC32=y
2391# CONFIG_CRC7 is not set
2392CONFIG_LIBCRC32C=m
2393CONFIG_AUDIT_GENERIC=y
2394CONFIG_ZLIB_INFLATE=y
2395CONFIG_ZLIB_DEFLATE=m
2396CONFIG_TEXTSEARCH=y
2397CONFIG_TEXTSEARCH_KMP=m
2398CONFIG_TEXTSEARCH_BM=m
2399CONFIG_TEXTSEARCH_FSM=m
2400CONFIG_PLIST=y
2401CONFIG_HAS_IOMEM=y
2402CONFIG_HAS_IOPORT=y
2403CONFIG_HAS_DMA=y
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch
new file mode 100644
index 0000000000..1841a681d2
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch
@@ -0,0 +1,1627 @@
1Index: linux-2.6.28/drivers/gpu/drm/i915/intel_tv.c
2===================================================================
3--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_tv.c 2009-02-19 12:59:22.000000000 +0000
4+++ linux-2.6.28/drivers/gpu/drm/i915/intel_tv.c 2009-02-19 12:59:28.000000000 +0000
5@@ -902,7 +902,7 @@
6 intel_tv_dpms(struct drm_encoder *encoder, int mode)
7 {
8 struct drm_device *dev = encoder->dev;
9- struct drm_i915_private *dev_priv = dev->dev_private;
10+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
11
12 switch(mode) {
13 case DRM_MODE_DPMS_ON:
14@@ -920,7 +920,7 @@
15 intel_tv_save(struct drm_connector *connector)
16 {
17 struct drm_device *dev = connector->dev;
18- struct drm_i915_private *dev_priv = dev->dev_private;
19+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20 struct intel_output *intel_output = to_intel_output(connector);
21 struct intel_tv_priv *tv_priv = intel_output->dev_priv;
22 int i;
23@@ -970,7 +970,7 @@
24 intel_tv_restore(struct drm_connector *connector)
25 {
26 struct drm_device *dev = connector->dev;
27- struct drm_i915_private *dev_priv = dev->dev_private;
28+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
29 struct intel_output *intel_output = to_intel_output(connector);
30 struct intel_tv_priv *tv_priv = intel_output->dev_priv;
31 struct drm_crtc *crtc = connector->encoder->crtc;
32@@ -1117,7 +1117,7 @@
33 struct drm_display_mode *adjusted_mode)
34 {
35 struct drm_device *dev = encoder->dev;
36- struct drm_i915_private *dev_priv = dev->dev_private;
37+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
38 struct drm_crtc *crtc = encoder->crtc;
39 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
40 struct intel_output *intel_output = enc_to_intel_output(encoder);
41@@ -1362,6 +1362,7 @@
42 struct drm_encoder *encoder = &intel_output->enc;
43 struct drm_device *dev = encoder->dev;
44 struct drm_i915_private *dev_priv = dev->dev_private;
45+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
46 unsigned long irqflags;
47 u32 tv_ctl, save_tv_ctl;
48 u32 tv_dac, save_tv_dac;
49@@ -1626,6 +1627,7 @@
50 intel_tv_init(struct drm_device *dev)
51 {
52 struct drm_i915_private *dev_priv = dev->dev_private;
53+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
54 struct drm_connector *connector;
55 struct intel_output *intel_output;
56 struct intel_tv_priv *tv_priv;
57Index: linux-2.6.28/drivers/gpu/drm/i915/intel_modes.c
58===================================================================
59--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_modes.c 2009-02-19 12:59:22.000000000 +0000
60+++ linux-2.6.28/drivers/gpu/drm/i915/intel_modes.c 2009-02-19 12:59:28.000000000 +0000
61@@ -81,3 +81,6 @@
62
63 return ret;
64 }
65+EXPORT_SYMBOL(intel_ddc_get_modes);
66+
67+MODULE_LICENSE("GPL and additional rights");
68Index: linux-2.6.28/drivers/gpu/drm/i915/intel_i2c.c
69===================================================================
70--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_i2c.c 2009-02-19 12:59:22.000000000 +0000
71+++ linux-2.6.28/drivers/gpu/drm/i915/intel_i2c.c 2009-02-20 14:50:20.000000000 +0000
72@@ -43,7 +43,7 @@
73 static int get_clock(void *data)
74 {
75 struct intel_i2c_chan *chan = data;
76- struct drm_i915_private *dev_priv = chan->drm_dev->dev_private;
77+ struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private;
78 u32 val;
79
80 val = I915_READ(chan->reg);
81@@ -53,7 +53,7 @@
82 static int get_data(void *data)
83 {
84 struct intel_i2c_chan *chan = data;
85- struct drm_i915_private *dev_priv = chan->drm_dev->dev_private;
86+ struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private;
87 u32 val;
88
89 val = I915_READ(chan->reg);
90@@ -64,7 +64,7 @@
91 {
92 struct intel_i2c_chan *chan = data;
93 struct drm_device *dev = chan->drm_dev;
94- struct drm_i915_private *dev_priv = chan->drm_dev->dev_private;
95+ struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private;
96 u32 reserved = 0, clock_bits;
97
98 /* On most chips, these bits must be preserved in software. */
99@@ -85,7 +85,7 @@
100 {
101 struct intel_i2c_chan *chan = data;
102 struct drm_device *dev = chan->drm_dev;
103- struct drm_i915_private *dev_priv = chan->drm_dev->dev_private;
104+ struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private;
105 u32 reserved = 0, data_bits;
106
107 /* On most chips, these bits must be preserved in software. */
108@@ -167,6 +167,7 @@
109 kfree(chan);
110 return NULL;
111 }
112+EXPORT_SYMBOL(intel_i2c_create);
113
114 /**
115 * intel_i2c_destroy - unregister and free i2c bus resources
116@@ -182,3 +183,4 @@
117 i2c_del_adapter(&chan->adapter);
118 kfree(chan);
119 }
120+EXPORT_SYMBOL(intel_i2c_destroy);
121Index: linux-2.6.28/drivers/gpu/drm/i915/intel_dvo.c
122===================================================================
123--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_dvo.c 2009-02-19 12:59:22.000000000 +0000
124+++ linux-2.6.28/drivers/gpu/drm/i915/intel_dvo.c 2009-02-19 15:14:20.000000000 +0000
125@@ -78,7 +78,7 @@
126
127 static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
128 {
129- struct drm_i915_private *dev_priv = encoder->dev->dev_private;
130+ struct drm_i915_common_private *dev_priv_common = encoder->dev->dev_private;
131 struct intel_output *intel_output = enc_to_intel_output(encoder);
132 struct intel_dvo_device *dvo = intel_output->dev_priv;
133 u32 dvo_reg = dvo->dvo_reg;
134@@ -98,15 +98,16 @@
135 static void intel_dvo_save(struct drm_connector *connector)
136 {
137 struct drm_i915_private *dev_priv = connector->dev->dev_private;
138+ struct drm_i915_common_private *dev_priv_common = connector->dev->dev_private;
139 struct intel_output *intel_output = to_intel_output(connector);
140 struct intel_dvo_device *dvo = intel_output->dev_priv;
141
142 /* Each output should probably just save the registers it touches,
143 * but for now, use more overkill.
144 */
145- dev_priv->saveDVOA = I915_READ(DVOA);
146- dev_priv->saveDVOB = I915_READ(DVOB);
147- dev_priv->saveDVOC = I915_READ(DVOC);
148+ dev_priv->common.saveDVOA = I915_READ(DVOA);
149+ dev_priv->common.saveDVOB = I915_READ(DVOB);
150+ dev_priv->common.saveDVOC = I915_READ(DVOC);
151
152 dvo->dev_ops->save(dvo);
153 }
154@@ -114,14 +115,15 @@
155 static void intel_dvo_restore(struct drm_connector *connector)
156 {
157 struct drm_i915_private *dev_priv = connector->dev->dev_private;
158+ struct drm_i915_common_private *dev_priv_common = connector->dev->dev_private;
159 struct intel_output *intel_output = to_intel_output(connector);
160 struct intel_dvo_device *dvo = intel_output->dev_priv;
161
162 dvo->dev_ops->restore(dvo);
163
164- I915_WRITE(DVOA, dev_priv->saveDVOA);
165- I915_WRITE(DVOB, dev_priv->saveDVOB);
166- I915_WRITE(DVOC, dev_priv->saveDVOC);
167+ I915_WRITE(DVOA, dev_priv->common.saveDVOA);
168+ I915_WRITE(DVOB, dev_priv->common.saveDVOB);
169+ I915_WRITE(DVOC, dev_priv->common.saveDVOC);
170 }
171
172 static int intel_dvo_mode_valid(struct drm_connector *connector,
173@@ -183,7 +185,7 @@
174 struct drm_display_mode *adjusted_mode)
175 {
176 struct drm_device *dev = encoder->dev;
177- struct drm_i915_private *dev_priv = dev->dev_private;
178+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
179 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
180 struct intel_output *intel_output = enc_to_intel_output(encoder);
181 struct intel_dvo_device *dvo = intel_output->dev_priv;
182@@ -349,7 +351,7 @@
183 intel_dvo_get_current_mode (struct drm_connector *connector)
184 {
185 struct drm_device *dev = connector->dev;
186- struct drm_i915_private *dev_priv = dev->dev_private;
187+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
188 struct intel_output *intel_output = to_intel_output(connector);
189 struct intel_dvo_device *dvo = intel_output->dev_priv;
190 uint32_t dvo_reg = dvo->dvo_reg;
191Index: linux-2.6.28/drivers/gpu/drm/i915/intel_hdmi.c
192===================================================================
193--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_hdmi.c 2009-02-19 12:59:22.000000000 +0000
194+++ linux-2.6.28/drivers/gpu/drm/i915/intel_hdmi.c 2009-02-19 12:59:28.000000000 +0000
195@@ -46,7 +46,7 @@
196 struct drm_display_mode *adjusted_mode)
197 {
198 struct drm_device *dev = encoder->dev;
199- struct drm_i915_private *dev_priv = dev->dev_private;
200+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
201 struct drm_crtc *crtc = encoder->crtc;
202 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
203 struct intel_output *intel_output = enc_to_intel_output(encoder);
204@@ -71,7 +71,7 @@
205 static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode)
206 {
207 struct drm_device *dev = encoder->dev;
208- struct drm_i915_private *dev_priv = dev->dev_private;
209+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
210 struct intel_output *intel_output = enc_to_intel_output(encoder);
211 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
212 u32 temp;
213@@ -89,7 +89,7 @@
214 static void intel_hdmi_save(struct drm_connector *connector)
215 {
216 struct drm_device *dev = connector->dev;
217- struct drm_i915_private *dev_priv = dev->dev_private;
218+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
219 struct intel_output *intel_output = to_intel_output(connector);
220 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
221
222@@ -99,7 +99,7 @@
223 static void intel_hdmi_restore(struct drm_connector *connector)
224 {
225 struct drm_device *dev = connector->dev;
226- struct drm_i915_private *dev_priv = dev->dev_private;
227+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
228 struct intel_output *intel_output = to_intel_output(connector);
229 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
230
231@@ -132,7 +132,7 @@
232 intel_hdmi_detect(struct drm_connector *connector)
233 {
234 struct drm_device *dev = connector->dev;
235- struct drm_i915_private *dev_priv = dev->dev_private;
236+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
237 struct intel_output *intel_output = to_intel_output(connector);
238 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
239 u32 temp, bit;
240@@ -220,7 +220,7 @@
241
242 void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
243 {
244- struct drm_i915_private *dev_priv = dev->dev_private;
245+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
246 struct drm_connector *connector;
247 struct intel_output *intel_output;
248 struct intel_hdmi_priv *hdmi_priv;
249Index: linux-2.6.28/drivers/gpu/drm/i915/i915_suspend.c
250===================================================================
251--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_suspend.c 2009-02-19 12:59:22.000000000 +0000
252+++ linux-2.6.28/drivers/gpu/drm/i915/i915_suspend.c 2009-02-19 12:59:28.000000000 +0000
253@@ -31,7 +31,7 @@
254
255 static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe)
256 {
257- struct drm_i915_private *dev_priv = dev->dev_private;
258+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
259
260 if (pipe == PIPE_A)
261 return (I915_READ(DPLL_A) & DPLL_VCO_ENABLE);
262@@ -41,7 +41,7 @@
263
264 static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
265 {
266- struct drm_i915_private *dev_priv = dev->dev_private;
267+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
268 unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B);
269 u32 *array;
270 int i;
271@@ -50,9 +50,9 @@
272 return;
273
274 if (pipe == PIPE_A)
275- array = dev_priv->save_palette_a;
276+ array = dev_priv_common->save_palette_a;
277 else
278- array = dev_priv->save_palette_b;
279+ array = dev_priv_common->save_palette_b;
280
281 for(i = 0; i < 256; i++)
282 array[i] = I915_READ(reg + (i << 2));
283@@ -60,7 +60,7 @@
284
285 static void i915_restore_palette(struct drm_device *dev, enum pipe pipe)
286 {
287- struct drm_i915_private *dev_priv = dev->dev_private;
288+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
289 unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B);
290 u32 *array;
291 int i;
292@@ -69,9 +69,9 @@
293 return;
294
295 if (pipe == PIPE_A)
296- array = dev_priv->save_palette_a;
297+ array = dev_priv_common->save_palette_a;
298 else
299- array = dev_priv->save_palette_b;
300+ array = dev_priv_common->save_palette_b;
301
302 for(i = 0; i < 256; i++)
303 I915_WRITE(reg + (i << 2), array[i]);
304@@ -79,7 +79,7 @@
305
306 static u8 i915_read_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg)
307 {
308- struct drm_i915_private *dev_priv = dev->dev_private;
309+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
310
311 I915_WRITE8(index_port, reg);
312 return I915_READ8(data_port);
313@@ -87,7 +87,7 @@
314
315 static u8 i915_read_ar(struct drm_device *dev, u16 st01, u8 reg, u16 palette_enable)
316 {
317- struct drm_i915_private *dev_priv = dev->dev_private;
318+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
319
320 I915_READ8(st01);
321 I915_WRITE8(VGA_AR_INDEX, palette_enable | reg);
322@@ -96,7 +96,7 @@
323
324 static void i915_write_ar(struct drm_device *dev, u16 st01, u8 reg, u8 val, u16 palette_enable)
325 {
326- struct drm_i915_private *dev_priv = dev->dev_private;
327+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
328
329 I915_READ8(st01);
330 I915_WRITE8(VGA_AR_INDEX, palette_enable | reg);
331@@ -105,7 +105,7 @@
332
333 static void i915_write_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg, u8 val)
334 {
335- struct drm_i915_private *dev_priv = dev->dev_private;
336+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
337
338 I915_WRITE8(index_port, reg);
339 I915_WRITE8(data_port, val);
340@@ -113,7 +113,8 @@
341
342 static void i915_save_vga(struct drm_device *dev)
343 {
344- struct drm_i915_private *dev_priv = dev->dev_private;
345+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
346+ struct drm_i915_common_private *dev_priv = dev->dev_private;
347 int i;
348 u16 cr_index, cr_data, st01;
349
350@@ -176,7 +177,8 @@
351
352 static void i915_restore_vga(struct drm_device *dev)
353 {
354- struct drm_i915_private *dev_priv = dev->dev_private;
355+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
356+ struct drm_i915_common_private *dev_priv = dev->dev_private;
357 int i;
358 u16 cr_index, cr_data, st01;
359
360@@ -235,7 +237,8 @@
361
362 int i915_save_state(struct drm_device *dev)
363 {
364- struct drm_i915_private *dev_priv = dev->dev_private;
365+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
366+ struct drm_i915_common_private *dev_priv = dev->dev_private;
367 int i;
368
369 pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
370@@ -367,7 +370,8 @@
371
372 int i915_restore_state(struct drm_device *dev)
373 {
374- struct drm_i915_private *dev_priv = dev->dev_private;
375+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
376+ struct drm_i915_common_private *dev_priv = dev->dev_private;
377 int i;
378
379 pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);
380Index: linux-2.6.28/drivers/gpu/drm/i915/i915_opregion.c
381===================================================================
382--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_opregion.c 2009-02-19 12:59:22.000000000 +0000
383+++ linux-2.6.28/drivers/gpu/drm/i915/i915_opregion.c 2009-02-19 12:59:28.000000000 +0000
384@@ -139,6 +139,7 @@
385 static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
386 {
387 struct drm_i915_private *dev_priv = dev->dev_private;
388+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
389 struct opregion_asle *asle = dev_priv->opregion.asle;
390 u32 blc_pwm_ctl, blc_pwm_ctl2;
391
392@@ -172,7 +173,8 @@
393
394 static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb)
395 {
396- struct drm_i915_private *dev_priv = dev->dev_private;
397+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
398+
399 if (pfmb & ASLE_PFMB_PWM_VALID) {
400 u32 blc_pwm_ctl = I915_READ(BLC_PWM_CTL);
401 u32 pwm = pfmb & ASLE_PFMB_PWM_MASK;
402Index: linux-2.6.28/drivers/gpu/drm/i915/i915_gem.c
403===================================================================
404--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_gem.c 2009-02-19 12:59:22.000000000 +0000
405+++ linux-2.6.28/drivers/gpu/drm/i915/i915_gem.c 2009-02-19 12:59:28.000000000 +0000
406@@ -877,6 +877,7 @@
407 i915_add_request(struct drm_device *dev, uint32_t flush_domains)
408 {
409 drm_i915_private_t *dev_priv = dev->dev_private;
410+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
411 struct drm_i915_gem_request *request;
412 uint32_t seqno;
413 int was_empty;
414@@ -942,6 +943,7 @@
415 static uint32_t
416 i915_retire_commands(struct drm_device *dev)
417 {
418+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
419 drm_i915_private_t *dev_priv = dev->dev_private;
420 uint32_t cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
421 uint32_t flush_domains = 0;
422@@ -1049,12 +1051,14 @@
423 void
424 i915_gem_retire_work_handler(struct work_struct *work)
425 {
426+ struct drm_i915_common_private *dev_priv_common;
427 drm_i915_private_t *dev_priv;
428 struct drm_device *dev;
429
430 dev_priv = container_of(work, drm_i915_private_t,
431 mm.retire_work.work);
432 dev = dev_priv->dev;
433+ dev_priv_common = dev->dev_private;
434
435 mutex_lock(&dev->struct_mutex);
436 i915_gem_retire_requests(dev);
437@@ -1109,6 +1113,7 @@
438 uint32_t invalidate_domains,
439 uint32_t flush_domains)
440 {
441+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
442 drm_i915_private_t *dev_priv = dev->dev_private;
443 uint32_t cmd;
444 RING_LOCALS;
445@@ -1422,7 +1427,7 @@
446 {
447 struct drm_gem_object *obj = reg->obj;
448 struct drm_device *dev = obj->dev;
449- drm_i915_private_t *dev_priv = dev->dev_private;
450+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
451 struct drm_i915_gem_object *obj_priv = obj->driver_private;
452 int regnum = obj_priv->fence_reg;
453 uint64_t val;
454@@ -1442,8 +1447,8 @@
455 {
456 struct drm_gem_object *obj = reg->obj;
457 struct drm_device *dev = obj->dev;
458- drm_i915_private_t *dev_priv = dev->dev_private;
459 struct drm_i915_gem_object *obj_priv = obj->driver_private;
460+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
461 int regnum = obj_priv->fence_reg;
462 uint32_t val;
463 uint32_t pitch_val;
464@@ -1475,7 +1480,7 @@
465 {
466 struct drm_gem_object *obj = reg->obj;
467 struct drm_device *dev = obj->dev;
468- drm_i915_private_t *dev_priv = dev->dev_private;
469+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
470 struct drm_i915_gem_object *obj_priv = obj->driver_private;
471 int regnum = obj_priv->fence_reg;
472 uint32_t val;
473@@ -1605,6 +1610,7 @@
474 {
475 struct drm_device *dev = obj->dev;
476 drm_i915_private_t *dev_priv = dev->dev_private;
477+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
478 struct drm_i915_gem_object *obj_priv = obj->driver_private;
479
480 if (IS_I965G(dev))
481@@ -2327,6 +2333,7 @@
482 uint64_t exec_offset)
483 {
484 drm_i915_private_t *dev_priv = dev->dev_private;
485+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
486 struct drm_clip_rect __user *boxes = (struct drm_clip_rect __user *)
487 (uintptr_t) exec->cliprects_ptr;
488 int nbox = exec->num_cliprects;
489@@ -3035,6 +3042,7 @@
490 i915_gem_init_hws(struct drm_device *dev)
491 {
492 drm_i915_private_t *dev_priv = dev->dev_private;
493+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
494 struct drm_gem_object *obj;
495 struct drm_i915_gem_object *obj_priv;
496 int ret;
497@@ -3081,6 +3089,7 @@
498 i915_gem_init_ringbuffer(struct drm_device *dev)
499 {
500 drm_i915_private_t *dev_priv = dev->dev_private;
501+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
502 struct drm_gem_object *obj;
503 struct drm_i915_gem_object *obj_priv;
504 drm_i915_ring_buffer_t *ring = &dev_priv->ring;
505@@ -3186,6 +3195,7 @@
506 void
507 i915_gem_cleanup_ringbuffer(struct drm_device *dev)
508 {
509+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
510 drm_i915_private_t *dev_priv = dev->dev_private;
511
512 if (dev_priv->ring.ring_obj == NULL)
513Index: linux-2.6.28/drivers/gpu/drm/i915/i915_gem_proc.c
514===================================================================
515--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_gem_proc.c 2009-02-19 12:59:22.000000000 +0000
516+++ linux-2.6.28/drivers/gpu/drm/i915/i915_gem_proc.c 2009-02-19 12:59:28.000000000 +0000
517@@ -213,6 +213,7 @@
518 struct drm_minor *minor = (struct drm_minor *) data;
519 struct drm_device *dev = minor->dev;
520 drm_i915_private_t *dev_priv = dev->dev_private;
521+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
522 int len = 0;
523
524 if (offset > DRM_PROC_LIMIT) {
525Index: linux-2.6.28/drivers/gpu/drm/i915/i915_gem_tiling.c
526===================================================================
527--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_gem_tiling.c 2009-02-19 12:59:22.000000000 +0000
528+++ linux-2.6.28/drivers/gpu/drm/i915/i915_gem_tiling.c 2009-02-19 12:59:28.000000000 +0000
529@@ -87,6 +87,7 @@
530 i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
531 {
532 drm_i915_private_t *dev_priv = dev->dev_private;
533+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
534 uint32_t swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;
535 uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
536
537Index: linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c
538===================================================================
539--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_irq.c 2009-02-19 12:59:22.000000000 +0000
540+++ linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c 2009-02-20 14:53:08.000000000 +0000
541@@ -64,6 +64,8 @@
542 void
543 i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
544 {
545+ struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv;
546+
547 if ((dev_priv->irq_mask_reg & mask) != 0) {
548 dev_priv->irq_mask_reg &= ~mask;
549 I915_WRITE(IMR, dev_priv->irq_mask_reg);
550@@ -74,6 +76,8 @@
551 static inline void
552 i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
553 {
554+ struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv;
555+
556 if ((dev_priv->irq_mask_reg & mask) != mask) {
557 dev_priv->irq_mask_reg |= mask;
558 I915_WRITE(IMR, dev_priv->irq_mask_reg);
559@@ -94,6 +98,8 @@
560 void
561 i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
562 {
563+ struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv;
564+
565 if ((dev_priv->pipestat[pipe] & mask) != mask) {
566 u32 reg = i915_pipestat(pipe);
567
568@@ -107,6 +113,8 @@
569 void
570 i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
571 {
572+ struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv;
573+
574 if ((dev_priv->pipestat[pipe] & mask) != 0) {
575 u32 reg = i915_pipestat(pipe);
576
577@@ -128,7 +136,7 @@
578 static int
579 i915_pipe_enabled(struct drm_device *dev, int pipe)
580 {
581- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
582+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
583 unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF;
584
585 if (I915_READ(pipeconf) & PIPEACONF_ENABLE)
586@@ -142,7 +150,7 @@
587 */
588 u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
589 {
590- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
591+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
592 unsigned long high_frame;
593 unsigned long low_frame;
594 u32 high1, high2, low, count;
595@@ -178,6 +186,7 @@
596 {
597 struct drm_device *dev = (struct drm_device *) arg;
598 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
599+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
600 struct drm_i915_master_private *master_priv;
601 u32 iir, new_iir;
602 u32 pipea_stats, pipeb_stats;
603@@ -284,6 +293,7 @@
604 static int i915_emit_irq(struct drm_device * dev)
605 {
606 drm_i915_private_t *dev_priv = dev->dev_private;
607+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
608 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
609 RING_LOCALS;
610
611@@ -409,6 +419,7 @@
612 */
613 int i915_enable_vblank(struct drm_device *dev, int pipe)
614 {
615+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
616 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
617 unsigned long irqflags;
618 int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
619@@ -510,6 +521,7 @@
620 */
621 void i915_driver_irq_preinstall(struct drm_device * dev)
622 {
623+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
624 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
625
626 atomic_set(&dev_priv->irq_received, 0);
627@@ -554,6 +566,7 @@
628
629 void i915_driver_irq_uninstall(struct drm_device * dev)
630 {
631+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
632 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
633
634 if (!dev_priv)
635Index: linux-2.6.28/drivers/gpu/drm/i915/Makefile
636===================================================================
637--- linux-2.6.28.orig/drivers/gpu/drm/i915/Makefile 2009-02-19 12:59:23.000000000 +0000
638+++ linux-2.6.28/drivers/gpu/drm/i915/Makefile 2009-02-19 12:59:28.000000000 +0000
639@@ -9,24 +9,29 @@
640 i915_gem_debug.o \
641 i915_gem_proc.o \
642 i915_gem_tiling.o \
643- intel_display.o \
644- intel_crt.o \
645- intel_lvds.o \
646 intel_bios.o \
647- intel_hdmi.o \
648- intel_sdvo.o \
649- intel_modes.o \
650- intel_i2c.o \
651 intel_fb.o \
652 intel_tv.o \
653+
654+intel_gfx_common-y := \
655+ intel_display.o \
656+ intel_modes.o \
657+ intel_i2c.o \
658+ intel_crt.o \
659 intel_dvo.o \
660+ intel_hdmi.o \
661+ intel_lvds.o \
662+ intel_sdvo.o \
663 dvo_ch7xxx.o \
664 dvo_ch7017.o \
665 dvo_ivch.o \
666 dvo_tfp410.o \
667 dvo_sil164.o
668
669+
670 i915-$(CONFIG_ACPI) += i915_opregion.o
671 i915-$(CONFIG_COMPAT) += i915_ioc32.o
672
673 obj-$(CONFIG_DRM_I915) += i915.o
674+
675+obj-$(CONFIG_DRM_INTEL_COMMON) += intel_gfx_common.o
676Index: linux-2.6.28/drivers/gpu/drm/i915/i915_common.h
677===================================================================
678--- /dev/null 1970-01-01 00:00:00.000000000 +0000
679+++ linux-2.6.28/drivers/gpu/drm/i915/i915_common.h 2009-02-20 14:49:42.000000000 +0000
680@@ -0,0 +1,184 @@
681+/*
682+ *
683+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
684+ * All Rights Reserved.
685+ *
686+ * Permission is hereby granted, free of charge, to any person obtaining a
687+ * copy of this software and associated documentation files (the
688+ * "Software"), to deal in the Software without restriction, including
689+ * without limitation the rights to use, copy, modify, merge, publish,
690+ * distribute, sub license, and/or sell copies of the Software, and to
691+ * permit persons to whom the Software is furnished to do so, subject to
692+ * the following conditions:
693+ *
694+ * The above copyright notice and this permission notice (including the
695+ * next paragraph) shall be included in all copies or substantial portions
696+ * of the Software.
697+ *
698+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
699+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
700+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
701+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
702+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
703+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
704+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
705+ *
706+ */
707+
708+#ifndef _I915_COMMON_H_
709+#define _I915_COMMON_H_
710+
711+typedef struct drm_i915_common_private {
712+ //struct drm_device *dev;
713+
714+ void __iomem *regs;
715+
716+ //drm_dma_handle_t *status_page_dmah;
717+ //void *hw_status_page;
718+ //dma_addr_t dma_status_page;
719+ //uint32_t counter;
720+ //unsigned int status_gfx_addr;
721+ //drm_local_map_t hws_map;
722+ //struct drm_gem_object *hws_obj;
723+
724+ //unsigned int cpp;
725+ //int back_offset;
726+ //int front_offset;
727+ //int current_page;
728+ //int page_flipping;
729+
730+ //wait_queue_head_t irq_queue;
731+ //atomic_t irq_received;
732+ /** Protects user_irq_refcount and irq_mask_reg */
733+ //spinlock_t user_irq_lock;
734+ /** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */
735+ //int user_irq_refcount;
736+ /** Cached value of IMR to avoid reads in updating the bitfield */
737+ //u32 irq_mask_reg;
738+ //u32 pipestat[2];
739+
740+ //int tex_lru_log_granularity;
741+ //int allow_batchbuffer;
742+ //struct mem_block *agp_heap;
743+ //unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
744+ //int vblank_pipe;
745+
746+ //bool cursor_needs_physical;
747+
748+ //struct drm_mm vram;
749+
750+ //int irq_enabled;
751+
752+ /* LVDS info */
753+ int backlight_duty_cycle; /* restore backlight to this value */
754+ bool panel_wants_dither;
755+ struct drm_display_mode *panel_fixed_mode;
756+ //struct drm_display_mode *vbt_mode; /* if any */
757+
758+ /* Feature bits from the VBIOS */
759+ //unsigned int int_tv_support:1;
760+ //unsigned int lvds_dither:1;
761+ //unsigned int lvds_vbt:1;
762+ //unsigned int int_crt_support:1;
763+
764+ //int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */
765+ //int num_fence_regs; /* 8 on pre-965, 16 otherwise */
766+
767+ /* Register state */
768+ u8 saveLBB;
769+ u32 saveDSPACNTR;
770+ u32 saveDSPBCNTR;
771+ u32 saveDSPARB;
772+ u32 saveRENDERSTANDBY;
773+ u32 saveHWS;
774+ u32 savePIPEACONF;
775+ u32 savePIPEBCONF;
776+ u32 savePIPEASRC;
777+ u32 savePIPEBSRC;
778+ u32 saveFPA0;
779+ u32 saveFPA1;
780+ u32 saveDPLL_A;
781+ u32 saveDPLL_A_MD;
782+ u32 saveHTOTAL_A;
783+ u32 saveHBLANK_A;
784+ u32 saveHSYNC_A;
785+ u32 saveVTOTAL_A;
786+ u32 saveVBLANK_A;
787+ u32 saveVSYNC_A;
788+ u32 saveBCLRPAT_A;
789+ u32 savePIPEASTAT;
790+ u32 saveDSPASTRIDE;
791+ u32 saveDSPASIZE;
792+ u32 saveDSPAPOS;
793+ u32 saveDSPAADDR;
794+ u32 saveDSPASURF;
795+ u32 saveDSPATILEOFF;
796+ u32 savePFIT_PGM_RATIOS;
797+ u32 saveBLC_PWM_CTL;
798+ u32 saveBLC_PWM_CTL2;
799+ u32 saveFPB0;
800+ u32 saveFPB1;
801+ u32 saveDPLL_B;
802+ u32 saveDPLL_B_MD;
803+ u32 saveHTOTAL_B;
804+ u32 saveHBLANK_B;
805+ u32 saveHSYNC_B;
806+ u32 saveVTOTAL_B;
807+ u32 saveVBLANK_B;
808+ u32 saveVSYNC_B;
809+ u32 saveBCLRPAT_B;
810+ u32 savePIPEBSTAT;
811+ u32 saveDSPBSTRIDE;
812+ u32 saveDSPBSIZE;
813+ u32 saveDSPBPOS;
814+ u32 saveDSPBADDR;
815+ u32 saveDSPBSURF;
816+ u32 saveDSPBTILEOFF;
817+ u32 saveVGA0;
818+ u32 saveVGA1;
819+ u32 saveVGA_PD;
820+ u32 saveVGACNTRL;
821+ u32 saveADPA;
822+ u32 saveLVDS;
823+ u32 savePP_ON_DELAYS;
824+ u32 savePP_OFF_DELAYS;
825+ u32 saveDVOA;
826+ u32 saveDVOB;
827+ u32 saveDVOC;
828+ u32 savePP_ON;
829+ u32 savePP_OFF;
830+ u32 savePP_CONTROL;
831+ u32 savePP_DIVISOR;
832+ u32 savePFIT_CONTROL;
833+ u32 save_palette_a[256];
834+ u32 save_palette_b[256];
835+ u32 saveFBC_CFB_BASE;
836+ u32 saveFBC_LL_BASE;
837+ u32 saveFBC_CONTROL;
838+ u32 saveFBC_CONTROL2;
839+ u32 saveIER;
840+ u32 saveIIR;
841+ u32 saveIMR;
842+ u32 saveCACHE_MODE_0;
843+ u32 saveD_STATE;
844+ u32 saveCG_2D_DIS;
845+ u32 saveMI_ARB_STATE;
846+ u32 saveSWF0[16];
847+ u32 saveSWF1[16];
848+ u32 saveSWF2[3];
849+ u8 saveMSR;
850+ u8 saveSR[8];
851+ u8 saveGR[25];
852+ u8 saveAR_INDEX;
853+ u8 saveAR[21];
854+ u8 saveDACMASK;
855+ u8 saveDACDATA[256*3]; /* 256 3-byte colors */
856+ u8 saveCR[37];
857+} drm_i915_common_private_t;
858+
859+struct drm_i915_master_private {
860+ drm_local_map_t *sarea;
861+ struct _drm_i915_sarea *sarea_priv;
862+};
863+
864+#endif
865Index: linux-2.6.28/drivers/gpu/drm/i915/i915_drv.h
866===================================================================
867--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_drv.h 2009-02-19 12:59:23.000000000 +0000
868+++ linux-2.6.28/drivers/gpu/drm/i915/i915_drv.h 2009-02-19 16:30:19.000000000 +0000
869@@ -32,6 +32,7 @@
870
871 #include "i915_reg.h"
872 #include "intel_bios.h"
873+#include "i915_common.h"
874 #include <linux/io-mapping.h>
875
876 /* General customization:
877@@ -116,10 +117,6 @@
878 int enabled;
879 };
880
881-struct drm_i915_master_private {
882- drm_local_map_t *sarea;
883- struct _drm_i915_sarea *sarea_priv;
884-};
885 #define I915_FENCE_REG_NONE -1
886
887 struct drm_i915_fence_reg {
888@@ -127,12 +124,15 @@
889 };
890
891 typedef struct drm_i915_private {
892- struct drm_device *dev;
893+ /* common is assumed to be the first item in this structure */
894+ struct drm_i915_common_private common;
895
896- void __iomem *regs;
897-
898- drm_i915_ring_buffer_t ring;
899+ struct drm_device *dev;
900
901+ //void __iomem *regs;
902+
903+ drm_i915_ring_buffer_t ring;
904+
905 drm_dma_handle_t *status_page_dmah;
906 void *hw_status_page;
907 dma_addr_t dma_status_page;
908@@ -169,12 +169,12 @@
909
910 int irq_enabled;
911
912- struct intel_opregion opregion;
913-
914+ struct intel_opregion opregion;
915+
916 /* LVDS info */
917- int backlight_duty_cycle; /* restore backlight to this value */
918- bool panel_wants_dither;
919- struct drm_display_mode *panel_fixed_mode;
920+ //int backlight_duty_cycle; /* restore backlight to this value */
921+ //bool panel_wants_dither;
922+ //struct drm_display_mode *panel_fixed_mode;
923 struct drm_display_mode *vbt_mode; /* if any */
924
925 /* Feature bits from the VBIOS */
926@@ -183,101 +183,10 @@
927 unsigned int lvds_vbt:1;
928 unsigned int int_crt_support:1;
929
930- struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
931+ struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
932 int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */
933 int num_fence_regs; /* 8 on pre-965, 16 otherwise */
934
935- /* Register state */
936- u8 saveLBB;
937- u32 saveDSPACNTR;
938- u32 saveDSPBCNTR;
939- u32 saveDSPARB;
940- u32 saveRENDERSTANDBY;
941- u32 saveHWS;
942- u32 savePIPEACONF;
943- u32 savePIPEBCONF;
944- u32 savePIPEASRC;
945- u32 savePIPEBSRC;
946- u32 saveFPA0;
947- u32 saveFPA1;
948- u32 saveDPLL_A;
949- u32 saveDPLL_A_MD;
950- u32 saveHTOTAL_A;
951- u32 saveHBLANK_A;
952- u32 saveHSYNC_A;
953- u32 saveVTOTAL_A;
954- u32 saveVBLANK_A;
955- u32 saveVSYNC_A;
956- u32 saveBCLRPAT_A;
957- u32 savePIPEASTAT;
958- u32 saveDSPASTRIDE;
959- u32 saveDSPASIZE;
960- u32 saveDSPAPOS;
961- u32 saveDSPAADDR;
962- u32 saveDSPASURF;
963- u32 saveDSPATILEOFF;
964- u32 savePFIT_PGM_RATIOS;
965- u32 saveBLC_PWM_CTL;
966- u32 saveBLC_PWM_CTL2;
967- u32 saveFPB0;
968- u32 saveFPB1;
969- u32 saveDPLL_B;
970- u32 saveDPLL_B_MD;
971- u32 saveHTOTAL_B;
972- u32 saveHBLANK_B;
973- u32 saveHSYNC_B;
974- u32 saveVTOTAL_B;
975- u32 saveVBLANK_B;
976- u32 saveVSYNC_B;
977- u32 saveBCLRPAT_B;
978- u32 savePIPEBSTAT;
979- u32 saveDSPBSTRIDE;
980- u32 saveDSPBSIZE;
981- u32 saveDSPBPOS;
982- u32 saveDSPBADDR;
983- u32 saveDSPBSURF;
984- u32 saveDSPBTILEOFF;
985- u32 saveVGA0;
986- u32 saveVGA1;
987- u32 saveVGA_PD;
988- u32 saveVGACNTRL;
989- u32 saveADPA;
990- u32 saveLVDS;
991- u32 savePP_ON_DELAYS;
992- u32 savePP_OFF_DELAYS;
993- u32 saveDVOA;
994- u32 saveDVOB;
995- u32 saveDVOC;
996- u32 savePP_ON;
997- u32 savePP_OFF;
998- u32 savePP_CONTROL;
999- u32 savePP_DIVISOR;
1000- u32 savePFIT_CONTROL;
1001- u32 save_palette_a[256];
1002- u32 save_palette_b[256];
1003- u32 saveFBC_CFB_BASE;
1004- u32 saveFBC_LL_BASE;
1005- u32 saveFBC_CONTROL;
1006- u32 saveFBC_CONTROL2;
1007- u32 saveIER;
1008- u32 saveIIR;
1009- u32 saveIMR;
1010- u32 saveCACHE_MODE_0;
1011- u32 saveD_STATE;
1012- u32 saveCG_2D_DIS;
1013- u32 saveMI_ARB_STATE;
1014- u32 saveSWF0[16];
1015- u32 saveSWF1[16];
1016- u32 saveSWF2[3];
1017- u8 saveMSR;
1018- u8 saveSR[8];
1019- u8 saveGR[25];
1020- u8 saveAR_INDEX;
1021- u8 saveAR[21];
1022- u8 saveDACMASK;
1023- u8 saveDACDATA[256*3]; /* 256 3-byte colors */
1024- u8 saveCR[37];
1025-
1026 struct {
1027 struct drm_mm gtt_space;
1028
1029@@ -672,17 +581,18 @@
1030 LOCK_TEST_WITH_RETURN(dev, file_priv); \
1031 } while (0)
1032
1033-#define I915_READ(reg) readl(dev_priv->regs + (reg))
1034-#define I915_WRITE(reg, val) writel(val, dev_priv->regs + (reg))
1035-#define I915_READ16(reg) readw(dev_priv->regs + (reg))
1036-#define I915_WRITE16(reg, val) writel(val, dev_priv->regs + (reg))
1037-#define I915_READ8(reg) readb(dev_priv->regs + (reg))
1038-#define I915_WRITE8(reg, val) writeb(val, dev_priv->regs + (reg))
1039+
1040+#define I915_READ(reg) readl(dev_priv_common->regs + (reg))
1041+#define I915_WRITE(reg, val) writel(val, dev_priv_common->regs + (reg))
1042+#define I915_READ16(reg) readw(dev_priv_common->regs + (reg))
1043+#define I915_WRITE16(reg, val) writel(val, dev_priv_common->regs + (reg))
1044+#define I915_READ8(reg) readb(dev_priv_common->regs + (reg))
1045+#define I915_WRITE8(reg, val) writeb(val, dev_priv_common->regs + (reg))
1046 #ifdef writeq
1047-#define I915_WRITE64(reg, val) writeq(val, dev_priv->regs + (reg))
1048+#define I915_WRITE64(reg, val) writeq(val, dev_priv_common->regs + (reg))
1049 #else
1050-#define I915_WRITE64(reg, val) (writel(val, dev_priv->regs + (reg)), \
1051- writel(upper_32_bits(val), dev_priv->regs + \
1052+#define I915_WRITE64(reg, val) (writel(val, dev_priv_common->regs + (reg)), \
1053+ writel(upper_32_bits(val), dev_priv_common->regs + \
1054 (reg) + 4))
1055 #endif
1056 #define POSTING_READ(reg) (void)I915_READ(reg)
1057@@ -776,10 +686,15 @@
1058 (dev)->pci_device == 0x29D2)
1059
1060 #define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \
1061- IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev))
1062+ IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev) || \
1063+ IS_POULSBO(dev))
1064+
1065+#define IS_POULSBO(dev) (((dev)->pci_device == 0x8108) || \
1066+ ((dev)->pci_device == 0x8109))
1067
1068 #define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \
1069- IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev))
1070+ IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev) || \
1071+ IS_POULSBO(dev))
1072
1073 #define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev))
1074 #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev))
1075Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c
1076===================================================================
1077--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_display.c 2009-02-19 12:59:23.000000000 +0000
1078+++ linux-2.6.28/drivers/gpu/drm/i915/intel_display.c 2009-02-20 14:53:08.000000000 +0000
1079@@ -282,7 +282,7 @@
1080 int refclk, intel_clock_t *best_clock)
1081 {
1082 struct drm_device *dev = crtc->dev;
1083- struct drm_i915_private *dev_priv = dev->dev_private;
1084+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1085 intel_clock_t clock;
1086 const intel_limit_t *limit = intel_limit(crtc);
1087 int err = target;
1088@@ -475,7 +475,7 @@
1089 {
1090 struct drm_device *dev = crtc->dev;
1091 struct drm_i915_master_private *master_priv;
1092- struct drm_i915_private *dev_priv = dev->dev_private;
1093+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1094 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1095 int pipe = intel_crtc->pipe;
1096 int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
1097@@ -613,6 +613,7 @@
1098 /* lvds has its own version of prepare see intel_lvds_prepare */
1099 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
1100 }
1101+EXPORT_SYMBOL(intel_encoder_prepare);
1102
1103 void intel_encoder_commit (struct drm_encoder *encoder)
1104 {
1105@@ -620,6 +621,7 @@
1106 /* lvds has its own version of commit see intel_lvds_commit */
1107 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
1108 }
1109+EXPORT_SYMBOL(intel_encoder_commit);
1110
1111 static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
1112 struct drm_display_mode *mode,
1113@@ -687,7 +689,7 @@
1114 */
1115 static int intel_panel_fitter_pipe (struct drm_device *dev)
1116 {
1117- struct drm_i915_private *dev_priv = dev->dev_private;
1118+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1119 u32 pfit_control;
1120
1121 /* i830 doesn't have a panel fitter */
1122@@ -715,7 +717,7 @@
1123 struct drm_framebuffer *old_fb)
1124 {
1125 struct drm_device *dev = crtc->dev;
1126- struct drm_i915_private *dev_priv = dev->dev_private;
1127+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1128 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1129 int pipe = intel_crtc->pipe;
1130 int fp_reg = (pipe == 0) ? FPA0 : FPB0;
1131@@ -980,7 +982,7 @@
1132 uint32_t width, uint32_t height)
1133 {
1134 struct drm_device *dev = crtc->dev;
1135- struct drm_i915_private *dev_priv = dev->dev_private;
1136+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1137 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1138 struct drm_gem_object *bo;
1139 struct drm_i915_gem_object *obj_priv;
1140@@ -1071,7 +1073,7 @@
1141 static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
1142 {
1143 struct drm_device *dev = crtc->dev;
1144- struct drm_i915_private *dev_priv = dev->dev_private;
1145+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1146 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1147 int pipe = intel_crtc->pipe;
1148 uint32_t temp = 0;
1149@@ -1106,6 +1108,7 @@
1150 intel_crtc->lut_g[regno] = green >> 8;
1151 intel_crtc->lut_b[regno] = blue >> 8;
1152 }
1153+EXPORT_SYMBOL(intel_crtc_fb_gamma_set);
1154
1155 static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
1156 u16 *blue, uint32_t size)
1157@@ -1228,6 +1231,7 @@
1158
1159 return crtc;
1160 }
1161+EXPORT_SYMBOL(intel_get_load_detect_pipe);
1162
1163 void intel_release_load_detect_pipe(struct intel_output *intel_output, int dpms_mode)
1164 {
1165@@ -1251,11 +1255,12 @@
1166 crtc_funcs->dpms(crtc, dpms_mode);
1167 }
1168 }
1169+EXPORT_SYMBOL(intel_release_load_detect_pipe);
1170
1171 /* Returns the clock of the currently programmed mode of the given pipe. */
1172 static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)
1173 {
1174- struct drm_i915_private *dev_priv = dev->dev_private;
1175+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1176 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1177 int pipe = intel_crtc->pipe;
1178 u32 dpll = I915_READ((pipe == 0) ? DPLL_A : DPLL_B);
1179@@ -1333,7 +1338,7 @@
1180 struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
1181 struct drm_crtc *crtc)
1182 {
1183- struct drm_i915_private *dev_priv = dev->dev_private;
1184+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1185 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1186 int pipe = intel_crtc->pipe;
1187 struct drm_display_mode *mode;
1188@@ -1361,6 +1366,7 @@
1189
1190 return mode;
1191 }
1192+EXPORT_SYMBOL(intel_crtc_mode_get);
1193
1194 static void intel_crtc_destroy(struct drm_crtc *crtc)
1195 {
1196@@ -1415,11 +1421,6 @@
1197 intel_crtc->mode_set.connectors = (struct drm_connector **)(intel_crtc + 1);
1198 intel_crtc->mode_set.num_connectors = 0;
1199
1200- if (i915_fbpercrtc) {
1201-
1202-
1203-
1204- }
1205 }
1206
1207 struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe)
1208@@ -1433,6 +1434,7 @@
1209 }
1210 return crtc;
1211 }
1212+EXPORT_SYMBOL(intel_get_crtc_from_pipe);
1213
1214 static int intel_connector_clones(struct drm_device *dev, int type_mask)
1215 {
1216@@ -1575,7 +1577,7 @@
1217
1218 return 0;
1219 }
1220-
1221+EXPORT_SYMBOL(intel_framebuffer_create);
1222
1223 static struct drm_framebuffer *
1224 intel_user_framebuffer_create(struct drm_device *dev,
1225@@ -1643,12 +1645,13 @@
1226
1227 intel_setup_outputs(dev);
1228 }
1229+EXPORT_SYMBOL(intel_modeset_init);
1230
1231 void intel_modeset_cleanup(struct drm_device *dev)
1232 {
1233 drm_mode_config_cleanup(dev);
1234 }
1235-
1236+EXPORT_SYMBOL(intel_modeset_cleanup);
1237
1238 /* current intel driver doesn't take advantage of encoders
1239 always give back the encoder for the connector
1240@@ -1659,3 +1662,5 @@
1241
1242 return &intel_output->enc;
1243 }
1244+EXPORT_SYMBOL(intel_best_encoder);
1245+
1246Index: linux-2.6.28/drivers/gpu/drm/i915/intel_crt.c
1247===================================================================
1248--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_crt.c 2009-02-19 12:59:23.000000000 +0000
1249+++ linux-2.6.28/drivers/gpu/drm/i915/intel_crt.c 2009-02-20 14:53:08.000000000 +0000
1250@@ -36,7 +36,7 @@
1251 static void intel_crt_dpms(struct drm_encoder *encoder, int mode)
1252 {
1253 struct drm_device *dev = encoder->dev;
1254- struct drm_i915_private *dev_priv = dev->dev_private;
1255+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1256 u32 temp;
1257
1258 temp = I915_READ(ADPA);
1259@@ -88,7 +88,7 @@
1260 struct drm_device *dev = encoder->dev;
1261 struct drm_crtc *crtc = encoder->crtc;
1262 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1263- struct drm_i915_private *dev_priv = dev->dev_private;
1264+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1265 int dpll_md_reg;
1266 u32 adpa, dpll_md;
1267
1268@@ -132,7 +132,7 @@
1269 static bool intel_crt_detect_hotplug(struct drm_connector *connector)
1270 {
1271 struct drm_device *dev = connector->dev;
1272- struct drm_i915_private *dev_priv = dev->dev_private;
1273+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1274 u32 temp;
1275
1276 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1277Index: linux-2.6.28/drivers/gpu/drm/i915/i915_dma.c
1278===================================================================
1279--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_dma.c 2009-02-19 12:59:23.000000000 +0000
1280+++ linux-2.6.28/drivers/gpu/drm/i915/i915_dma.c 2009-02-20 12:12:41.000000000 +0000
1281@@ -41,6 +41,7 @@
1282 int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
1283 {
1284 drm_i915_private_t *dev_priv = dev->dev_private;
1285+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1286 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1287 drm_i915_ring_buffer_t *ring = &(dev_priv->ring);
1288 u32 acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD;
1289@@ -82,6 +83,7 @@
1290 static int i915_init_phys_hws(struct drm_device *dev)
1291 {
1292 drm_i915_private_t *dev_priv = dev->dev_private;
1293+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1294 /* Program Hardware Status Page */
1295 dev_priv->status_page_dmah =
1296 drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff);
1297@@ -107,6 +109,8 @@
1298 static void i915_free_hws(struct drm_device *dev)
1299 {
1300 drm_i915_private_t *dev_priv = dev->dev_private;
1301+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1302+
1303 if (dev_priv->status_page_dmah) {
1304 drm_pci_free(dev, dev_priv->status_page_dmah);
1305 dev_priv->status_page_dmah = NULL;
1306@@ -124,6 +128,7 @@
1307 void i915_kernel_lost_context(struct drm_device * dev)
1308 {
1309 drm_i915_private_t *dev_priv = dev->dev_private;
1310+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1311 struct drm_i915_master_private *master_priv;
1312 drm_i915_ring_buffer_t *ring = &(dev_priv->ring);
1313
1314@@ -231,6 +236,7 @@
1315 static int i915_dma_resume(struct drm_device * dev)
1316 {
1317 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1318+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1319
1320 DRM_DEBUG("%s\n", __func__);
1321
1322@@ -358,6 +364,7 @@
1323
1324 static int i915_emit_cmds(struct drm_device * dev, int __user * buffer, int dwords)
1325 {
1326+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1327 drm_i915_private_t *dev_priv = dev->dev_private;
1328 int i;
1329 RING_LOCALS;
1330@@ -401,6 +408,7 @@
1331 int i, int DR1, int DR4)
1332 {
1333 drm_i915_private_t *dev_priv = dev->dev_private;
1334+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1335 struct drm_clip_rect box;
1336 RING_LOCALS;
1337
1338@@ -442,6 +450,7 @@
1339 static void i915_emit_breadcrumb(struct drm_device *dev)
1340 {
1341 drm_i915_private_t *dev_priv = dev->dev_private;
1342+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1343 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1344 RING_LOCALS;
1345
1346@@ -495,6 +504,7 @@
1347 drm_i915_batchbuffer_t * batch)
1348 {
1349 drm_i915_private_t *dev_priv = dev->dev_private;
1350+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1351 struct drm_clip_rect __user *boxes = batch->cliprects;
1352 int nbox = batch->num_cliprects;
1353 int i = 0, count;
1354@@ -544,6 +554,7 @@
1355
1356 static int i915_dispatch_flip(struct drm_device * dev)
1357 {
1358+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1359 drm_i915_private_t *dev_priv = dev->dev_private;
1360 struct drm_i915_master_private *master_priv =
1361 dev->primary->master->driver_priv;
1362@@ -775,6 +786,7 @@
1363 static int i915_set_status_page(struct drm_device *dev, void *data,
1364 struct drm_file *file_priv)
1365 {
1366+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1367 drm_i915_private_t *dev_priv = dev->dev_private;
1368 drm_i915_hws_addr_t *hws = data;
1369
1370@@ -930,6 +942,7 @@
1371
1372 static int i915_load_modeset_init(struct drm_device *dev)
1373 {
1374+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1375 struct drm_i915_private *dev_priv = dev->dev_private;
1376 unsigned long agp_size, prealloc_size;
1377 int fb_bar = IS_I9XX(dev) ? 2 : 0;
1378@@ -1073,8 +1086,8 @@
1379 base = drm_get_resource_start(dev, mmio_bar);
1380 size = drm_get_resource_len(dev, mmio_bar);
1381
1382- dev_priv->regs = ioremap(base, size);
1383- if (!dev_priv->regs) {
1384+ dev_priv->common.regs = ioremap(base, size);
1385+ if (!dev_priv->common.regs) {
1386 DRM_ERROR("failed to map registers\n");
1387 ret = -EIO;
1388 goto free_priv;
1389@@ -1126,7 +1139,7 @@
1390 return 0;
1391
1392 out_rmmap:
1393- iounmap(dev_priv->regs);
1394+ iounmap(dev_priv->common.regs);
1395 free_priv:
1396 drm_free(dev_priv, sizeof(struct drm_i915_private), DRM_MEM_DRIVER);
1397 return ret;
1398@@ -1144,8 +1157,8 @@
1399 if (dev->pdev->msi_enabled)
1400 pci_disable_msi(dev->pdev);
1401
1402- if (dev_priv->regs != NULL)
1403- iounmap(dev_priv->regs);
1404+ if (dev_priv->common.regs != NULL)
1405+ iounmap(dev_priv->common.regs);
1406
1407 intel_opregion_free(dev);
1408
1409Index: linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c
1410===================================================================
1411--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_sdvo.c 2009-02-19 12:59:23.000000000 +0000
1412+++ linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c 2009-02-20 14:53:08.000000000 +0000
1413@@ -62,7 +62,7 @@
1414 static void intel_sdvo_write_sdvox(struct intel_output *intel_output, u32 val)
1415 {
1416 struct drm_device *dev = intel_output->base.dev;
1417- struct drm_i915_private *dev_priv = dev->dev_private;
1418+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1419 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
1420 u32 bval = val, cval = val;
1421 int i;
1422@@ -552,7 +552,7 @@
1423 struct drm_display_mode *adjusted_mode)
1424 {
1425 struct drm_device *dev = encoder->dev;
1426- struct drm_i915_private *dev_priv = dev->dev_private;
1427+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1428 struct drm_crtc *crtc = encoder->crtc;
1429 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1430 struct intel_output *intel_output = enc_to_intel_output(encoder);
1431@@ -659,7 +659,7 @@
1432 if (IS_I965G(dev)) {
1433 /* done in crtc_mode_set as the dpll_md reg must be written
1434 early */
1435- } else if (IS_I945G(dev) || IS_I945GM(dev)) {
1436+ } else if (IS_POULSBO(dev) || IS_I945G(dev) || IS_I945GM(dev)) {
1437 /* done in crtc_mode_set as it lives inside the
1438 dpll register */
1439 } else {
1440@@ -672,7 +672,7 @@
1441 static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
1442 {
1443 struct drm_device *dev = encoder->dev;
1444- struct drm_i915_private *dev_priv = dev->dev_private;
1445+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1446 struct intel_output *intel_output = enc_to_intel_output(encoder);
1447 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
1448 u32 temp;
1449@@ -722,7 +722,7 @@
1450 static void intel_sdvo_save(struct drm_connector *connector)
1451 {
1452 struct drm_device *dev = connector->dev;
1453- struct drm_i915_private *dev_priv = dev->dev_private;
1454+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1455 struct intel_output *intel_output = to_intel_output(connector);
1456 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
1457 int o;
1458@@ -759,7 +759,7 @@
1459 static void intel_sdvo_restore(struct drm_connector *connector)
1460 {
1461 struct drm_device *dev = connector->dev;
1462- struct drm_i915_private *dev_priv = dev->dev_private;
1463+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1464 struct intel_output *intel_output = to_intel_output(connector);
1465 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
1466 int o;
1467Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c
1468===================================================================
1469--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_lvds.c 2009-02-19 12:59:23.000000000 +0000
1470+++ linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c 2009-02-20 14:53:08.000000000 +0000
1471@@ -67,7 +67,7 @@
1472 */
1473 static void intel_lvds_set_power(struct drm_device *dev, bool on)
1474 {
1475- struct drm_i915_private *dev_priv = dev->dev_private;
1476+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1477 u32 pp_status;
1478
1479 if (on) {
1480@@ -104,35 +104,35 @@
1481 static void intel_lvds_save(struct drm_connector *connector)
1482 {
1483 struct drm_device *dev = connector->dev;
1484- struct drm_i915_private *dev_priv = dev->dev_private;
1485+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1486
1487- dev_priv->savePP_ON = I915_READ(PP_ON_DELAYS);
1488- dev_priv->savePP_OFF = I915_READ(PP_OFF_DELAYS);
1489- dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL);
1490- dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR);
1491- dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);
1492- dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL &
1493+ dev_priv_common->savePP_ON = I915_READ(PP_ON_DELAYS);
1494+ dev_priv_common->savePP_OFF = I915_READ(PP_OFF_DELAYS);
1495+ dev_priv_common->savePP_CONTROL = I915_READ(PP_CONTROL);
1496+ dev_priv_common->savePP_DIVISOR = I915_READ(PP_DIVISOR);
1497+ dev_priv_common->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);
1498+ dev_priv_common->backlight_duty_cycle = (dev_priv_common->saveBLC_PWM_CTL &
1499 BACKLIGHT_DUTY_CYCLE_MASK);
1500
1501 /*
1502 * If the light is off at server startup, just make it full brightness
1503 */
1504- if (dev_priv->backlight_duty_cycle == 0)
1505- dev_priv->backlight_duty_cycle =
1506+ if (dev_priv_common->backlight_duty_cycle == 0)
1507+ lvds_backlight=
1508 intel_lvds_get_max_backlight(dev);
1509 }
1510
1511 static void intel_lvds_restore(struct drm_connector *connector)
1512 {
1513 struct drm_device *dev = connector->dev;
1514- struct drm_i915_private *dev_priv = dev->dev_private;
1515+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1516
1517- I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL);
1518- I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON);
1519- I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF);
1520- I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR);
1521- I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL);
1522- if (dev_priv->savePP_CONTROL & POWER_TARGET_ON)
1523+ I915_WRITE(BLC_PWM_CTL, dev_priv_common->saveBLC_PWM_CTL);
1524+ I915_WRITE(PP_ON_DELAYS, dev_priv_common->savePP_ON);
1525+ I915_WRITE(PP_OFF_DELAYS, dev_priv_common->savePP_OFF);
1526+ I915_WRITE(PP_DIVISOR, dev_priv_common->savePP_DIVISOR);
1527+ I915_WRITE(PP_CONTROL, dev_priv_common->savePP_CONTROL);
1528+ if (dev_priv_common->savePP_CONTROL & POWER_TARGET_ON)
1529 intel_lvds_set_power(dev, true);
1530 else
1531 intel_lvds_set_power(dev, false);
1532@@ -142,8 +142,8 @@
1533 struct drm_display_mode *mode)
1534 {
1535 struct drm_device *dev = connector->dev;
1536- struct drm_i915_private *dev_priv = dev->dev_private;
1537- struct drm_display_mode *fixed_mode = dev_priv->panel_fixed_mode;
1538+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1539+ struct drm_display_mode *fixed_mode = dev_priv_common->panel_fixed_mode;
1540
1541 if (fixed_mode) {
1542 if (mode->hdisplay > fixed_mode->hdisplay)
1543@@ -160,7 +160,7 @@
1544 struct drm_display_mode *adjusted_mode)
1545 {
1546 struct drm_device *dev = encoder->dev;
1547- struct drm_i915_private *dev_priv = dev->dev_private;
1548+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1549 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
1550 struct drm_encoder *tmp_encoder;
1551
1552@@ -240,7 +240,7 @@
1553 struct drm_display_mode *adjusted_mode)
1554 {
1555 struct drm_device *dev = encoder->dev;
1556- struct drm_i915_private *dev_priv = dev->dev_private;
1557+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
1558 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
1559 u32 pfit_control;
1560
1561@@ -264,7 +264,7 @@
1562 pfit_control = 0;
1563
1564 if (!IS_I965G(dev)) {
1565- if (dev_priv->panel_wants_dither)
1566+ if (dev_priv_common->panel_wants_dither)
1567 pfit_control |= PANEL_8TO6_DITHER_ENABLE;
1568 }
1569 else
1570@@ -475,16 +475,16 @@
1571 crtc = intel_get_crtc_from_pipe(dev, pipe);
1572
1573 if (crtc && (lvds & LVDS_PORT_EN)) {
1574- dev_priv->panel_fixed_mode = intel_crtc_mode_get(dev, crtc);
1575- if (dev_priv->panel_fixed_mode) {
1576- dev_priv->panel_fixed_mode->type |=
1577+ dev_priv_common->panel_fixed_mode = intel_crtc_mode_get(dev, crtc);
1578+ if (dev_priv_common->panel_fixed_mode) {
1579+ dev_priv_common->panel_fixed_mode->type |=
1580 DRM_MODE_TYPE_PREFERRED;
1581 goto out; /* FIXME: check for quirks */
1582 }
1583 }
1584
1585 /* If we still don't have a mode after all that, give up. */
1586- if (!dev_priv->panel_fixed_mode)
1587+ if (!dev_priv_common->panel_fixed_mode)
1588 goto failed;
1589
1590 /* FIXME: detect aopen & mac mini type stuff automatically? */
1591@@ -509,9 +509,9 @@
1592 * 800x600 display.
1593 */
1594
1595- if (dev_priv->panel_fixed_mode != NULL &&
1596- dev_priv->panel_fixed_mode->hdisplay == 800 &&
1597- dev_priv->panel_fixed_mode->vdisplay == 600) {
1598+ if (dev_priv_common->panel_fixed_mode != NULL &&
1599+ dev_priv_common->panel_fixed_mode->hdisplay == 800 &&
1600+ dev_priv_common->panel_fixed_mode->vdisplay == 600) {
1601 DRM_DEBUG("Suspected Mac Mini, ignoring the LVDS\n");
1602 goto failed;
1603 }
1604Index: linux-2.6.28/drivers/gpu/drm/Kconfig
1605===================================================================
1606--- linux-2.6.28.orig/drivers/gpu/drm/Kconfig 2009-02-19 12:59:22.000000000 +0000
1607+++ linux-2.6.28/drivers/gpu/drm/Kconfig 2009-02-20 14:53:08.000000000 +0000
1608@@ -43,6 +43,11 @@
1609
1610 If M is selected, the module will be called radeon.
1611
1612+config DRM_INTEL_COMMON
1613+ tristate
1614+ help
1615+ Code common to several Intel drivers (autoselected)
1616+
1617 config DRM_I810
1618 tristate "Intel I810"
1619 depends on DRM && AGP && AGP_INTEL
1620@@ -70,6 +75,7 @@
1621 select FB_CFB_FILLRECT
1622 select FB_CFB_COPYAREA
1623 select FB_CFB_IMAGEBLIT
1624+ select DRM_INTEL_COMMON
1625 depends on FB
1626 tristate "i915 driver"
1627 help
diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch
new file mode 100644
index 0000000000..5b20badffa
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch
@@ -0,0 +1,21564 @@
1Index: linux-2.6.28/include/drm/drm.h
2===================================================================
3--- linux-2.6.28.orig/include/drm/drm.h 2009-02-20 12:22:53.000000000 +0000
4+++ linux-2.6.28/include/drm/drm.h 2009-02-20 12:23:06.000000000 +0000
5@@ -174,6 +174,7 @@
6 _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
7 _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */
8 _DRM_GEM = 6, /**< GEM object */
9+ _DRM_TTM = 7,
10 };
11
12 /**
13@@ -601,6 +602,271 @@
14
15 #include "drm_mode.h"
16
17+#define DRM_FENCE_FLAG_EMIT 0x00000001
18+#define DRM_FENCE_FLAG_SHAREABLE 0x00000002
19+#define DRM_FENCE_FLAG_WAIT_LAZY 0x00000004
20+#define DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS 0x00000008
21+#define DRM_FENCE_FLAG_NO_USER 0x00000010
22+
23+/* Reserved for driver use */
24+#define DRM_FENCE_MASK_DRIVER 0xFF000000
25+
26+#define DRM_FENCE_TYPE_EXE 0x00000001
27+
28+struct drm_fence_arg {
29+ unsigned int handle;
30+ unsigned int fence_class;
31+ unsigned int type;
32+ unsigned int flags;
33+ unsigned int signaled;
34+ unsigned int error;
35+ unsigned int sequence;
36+ unsigned int pad64;
37+ uint64_t expand_pad[2]; /*Future expansion */
38+};
39+
40+/* Buffer permissions, referring to how the GPU uses the buffers.
41+ * these translate to fence types used for the buffers.
42+ * Typically a texture buffer is read, A destination buffer is write and
43+ * a command (batch-) buffer is exe. Can be or-ed together.
44+ */
45+
46+#define DRM_BO_FLAG_READ (1ULL << 0)
47+#define DRM_BO_FLAG_WRITE (1ULL << 1)
48+#define DRM_BO_FLAG_EXE (1ULL << 2)
49+
50+/*
51+ * Status flags. Can be read to determine the actual state of a buffer.
52+ * Can also be set in the buffer mask before validation.
53+ */
54+
55+/*
56+ * Mask: Never evict this buffer. Not even with force. This type of buffer is only
57+ * available to root and must be manually removed before buffer manager shutdown
58+ * or lock.
59+ * Flags: Acknowledge
60+ */
61+#define DRM_BO_FLAG_NO_EVICT (1ULL << 4)
62+
63+/*
64+ * Mask: Require that the buffer is placed in mappable memory when validated.
65+ * If not set the buffer may or may not be in mappable memory when validated.
66+ * Flags: If set, the buffer is in mappable memory.
67+ */
68+#define DRM_BO_FLAG_MAPPABLE (1ULL << 5)
69+
70+/* Mask: The buffer should be shareable with other processes.
71+ * Flags: The buffer is shareable with other processes.
72+ */
73+#define DRM_BO_FLAG_SHAREABLE (1ULL << 6)
74+
75+/* Mask: If set, place the buffer in cache-coherent memory if available.
76+ * If clear, never place the buffer in cache coherent memory if validated.
77+ * Flags: The buffer is currently in cache-coherent memory.
78+ */
79+#define DRM_BO_FLAG_CACHED (1ULL << 7)
80+
81+/* Mask: Make sure that every time this buffer is validated,
82+ * it ends up on the same location provided that the memory mask is the same.
83+ * The buffer will also not be evicted when claiming space for
84+ * other buffers. Basically a pinned buffer but it may be thrown out as
85+ * part of buffer manager shutdown or locking.
86+ * Flags: Acknowledge.
87+ */
88+#define DRM_BO_FLAG_NO_MOVE (1ULL << 8)
89+
90+/* Mask: Make sure the buffer is in cached memory when mapped
91+ * Flags: Acknowledge.
92+ * Buffers allocated with this flag should not be used for suballocators
93+ * This type may have issues on CPUs with over-aggressive caching
94+ * http://marc.info/?l=linux-kernel&m=102376926732464&w=2
95+ */
96+#define DRM_BO_FLAG_CACHED_MAPPED (1ULL << 19)
97+
98+
99+/* Mask: Force DRM_BO_FLAG_CACHED flag strictly also if it is set.
100+ * Flags: Acknowledge.
101+ */
102+#define DRM_BO_FLAG_FORCE_CACHING (1ULL << 13)
103+
104+/*
105+ * Mask: Force DRM_BO_FLAG_MAPPABLE flag strictly also if it is clear.
106+ * Flags: Acknowledge.
107+ */
108+#define DRM_BO_FLAG_FORCE_MAPPABLE (1ULL << 14)
109+#define DRM_BO_FLAG_TILE (1ULL << 15)
110+
111+/*
112+ * Memory type flags that can be or'ed together in the mask, but only
113+ * one appears in flags.
114+ */
115+
116+/* System memory */
117+#define DRM_BO_FLAG_MEM_LOCAL (1ULL << 24)
118+/* Translation table memory */
119+#define DRM_BO_FLAG_MEM_TT (1ULL << 25)
120+/* Vram memory */
121+#define DRM_BO_FLAG_MEM_VRAM (1ULL << 26)
122+/* Up to the driver to define. */
123+#define DRM_BO_FLAG_MEM_PRIV0 (1ULL << 27)
124+#define DRM_BO_FLAG_MEM_PRIV1 (1ULL << 28)
125+#define DRM_BO_FLAG_MEM_PRIV2 (1ULL << 29)
126+#define DRM_BO_FLAG_MEM_PRIV3 (1ULL << 30)
127+#define DRM_BO_FLAG_MEM_PRIV4 (1ULL << 31)
128+/* We can add more of these now with a 64-bit flag type */
129+
130+/* Memory flag mask */
131+#define DRM_BO_MASK_MEM 0x00000000FF000000ULL
132+#define DRM_BO_MASK_MEMTYPE 0x00000000FF0800A0ULL
133+
134+/* Driver-private flags */
135+#define DRM_BO_MASK_DRIVER 0xFFFF000000000000ULL
136+
137+/* Don't block on validate and map */
138+#define DRM_BO_HINT_DONT_BLOCK 0x00000002
139+/* Don't place this buffer on the unfenced list.*/
140+#define DRM_BO_HINT_DONT_FENCE 0x00000004
141+#define DRM_BO_HINT_WAIT_LAZY 0x00000008
142+#define DRM_BO_HINT_PRESUMED_OFFSET 0x00000010
143+
144+#define DRM_BO_INIT_MAGIC 0xfe769812
145+#define DRM_BO_INIT_MAJOR 1
146+#define DRM_BO_INIT_MINOR 0
147+#define DRM_BO_INIT_PATCH 0
148+
149+
150+struct drm_bo_info_req {
151+ uint64_t mask;
152+ uint64_t flags;
153+ unsigned int handle;
154+ unsigned int hint;
155+ unsigned int fence_class;
156+ unsigned int desired_tile_stride;
157+ unsigned int tile_info;
158+ unsigned int pad64;
159+ uint64_t presumed_offset;
160+};
161+
162+struct drm_bo_create_req {
163+ uint64_t mask;
164+ uint64_t size;
165+ uint64_t buffer_start;
166+ unsigned int hint;
167+ unsigned int page_alignment;
168+};
169+
170+
171+/*
172+ * Reply flags
173+ */
174+
175+#define DRM_BO_REP_BUSY 0x00000001
176+
177+struct drm_bo_info_rep {
178+ uint64_t flags;
179+ uint64_t mask;
180+ uint64_t size;
181+ uint64_t offset;
182+ uint64_t arg_handle;
183+ uint64_t buffer_start;
184+ unsigned int handle;
185+ unsigned int fence_flags;
186+ unsigned int rep_flags;
187+ unsigned int page_alignment;
188+ unsigned int desired_tile_stride;
189+ unsigned int hw_tile_stride;
190+ unsigned int tile_info;
191+ unsigned int pad64;
192+ uint64_t expand_pad[4]; /*Future expansion */
193+};
194+
195+struct drm_bo_arg_rep {
196+ struct drm_bo_info_rep bo_info;
197+ int ret;
198+ unsigned int pad64;
199+};
200+
201+struct drm_bo_create_arg {
202+ union {
203+ struct drm_bo_create_req req;
204+ struct drm_bo_info_rep rep;
205+ } d;
206+};
207+
208+struct drm_bo_handle_arg {
209+ unsigned int handle;
210+};
211+
212+struct drm_bo_reference_info_arg {
213+ union {
214+ struct drm_bo_handle_arg req;
215+ struct drm_bo_info_rep rep;
216+ } d;
217+};
218+
219+struct drm_bo_map_wait_idle_arg {
220+ union {
221+ struct drm_bo_info_req req;
222+ struct drm_bo_info_rep rep;
223+ } d;
224+};
225+
226+struct drm_bo_op_req {
227+ enum {
228+ drm_bo_validate,
229+ drm_bo_fence,
230+ drm_bo_ref_fence,
231+ } op;
232+ unsigned int arg_handle;
233+ struct drm_bo_info_req bo_req;
234+};
235+
236+
237+struct drm_bo_op_arg {
238+ uint64_t next;
239+ union {
240+ struct drm_bo_op_req req;
241+ struct drm_bo_arg_rep rep;
242+ } d;
243+ int handled;
244+ unsigned int pad64;
245+};
246+
247+
248+#define DRM_BO_MEM_LOCAL 0
249+#define DRM_BO_MEM_TT 1
250+#define DRM_BO_MEM_VRAM 2
251+#define DRM_BO_MEM_PRIV0 3
252+#define DRM_BO_MEM_PRIV1 4
253+#define DRM_BO_MEM_PRIV2 5
254+#define DRM_BO_MEM_PRIV3 6
255+#define DRM_BO_MEM_PRIV4 7
256+
257+#define DRM_BO_MEM_TYPES 8 /* For now. */
258+
259+#define DRM_BO_LOCK_UNLOCK_BM (1 << 0)
260+#define DRM_BO_LOCK_IGNORE_NO_EVICT (1 << 1)
261+
262+struct drm_bo_version_arg {
263+ uint32_t major;
264+ uint32_t minor;
265+ uint32_t patchlevel;
266+};
267+
268+struct drm_mm_type_arg {
269+ unsigned int mem_type;
270+ unsigned int lock_flags;
271+};
272+
273+struct drm_mm_init_arg {
274+ unsigned int magic;
275+ unsigned int major;
276+ unsigned int minor;
277+ unsigned int mem_type;
278+ uint64_t p_offset;
279+ uint64_t p_size;
280+};
281+
282 #define DRM_IOCTL_BASE 'd'
283 #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
284 #define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
285@@ -688,6 +954,39 @@
286 #define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
287 #define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
288
289+#define DRM_IOCTL_MM_INIT DRM_IOWR(0xc0, struct drm_mm_init_arg)
290+#define DRM_IOCTL_MM_TAKEDOWN DRM_IOWR(0xc1, struct drm_mm_type_arg)
291+#define DRM_IOCTL_MM_LOCK DRM_IOWR(0xc2, struct drm_mm_type_arg)
292+#define DRM_IOCTL_MM_UNLOCK DRM_IOWR(0xc3, struct drm_mm_type_arg)
293+
294+#define DRM_IOCTL_FENCE_CREATE DRM_IOWR(0xc4, struct drm_fence_arg)
295+#define DRM_IOCTL_FENCE_REFERENCE DRM_IOWR(0xc6, struct drm_fence_arg)
296+#define DRM_IOCTL_FENCE_UNREFERENCE DRM_IOWR(0xc7, struct drm_fence_arg)
297+#define DRM_IOCTL_FENCE_SIGNALED DRM_IOWR(0xc8, struct drm_fence_arg)
298+#define DRM_IOCTL_FENCE_FLUSH DRM_IOWR(0xc9, struct drm_fence_arg)
299+#define DRM_IOCTL_FENCE_WAIT DRM_IOWR(0xca, struct drm_fence_arg)
300+#define DRM_IOCTL_FENCE_EMIT DRM_IOWR(0xcb, struct drm_fence_arg)
301+#define DRM_IOCTL_FENCE_BUFFERS DRM_IOWR(0xcc, struct drm_fence_arg)
302+
303+#define DRM_IOCTL_BO_CREATE DRM_IOWR(0xcd, struct drm_bo_create_arg)
304+#define DRM_IOCTL_BO_MAP DRM_IOWR(0xcf, struct drm_bo_map_wait_idle_arg)
305+#define DRM_IOCTL_BO_UNMAP DRM_IOWR(0xd0, struct drm_bo_handle_arg)
306+#define DRM_IOCTL_BO_REFERENCE DRM_IOWR(0xd1, struct drm_bo_reference_info_arg)
307+#define DRM_IOCTL_BO_UNREFERENCE DRM_IOWR(0xd2, struct drm_bo_handle_arg)
308+#define DRM_IOCTL_BO_SETSTATUS DRM_IOWR(0xd3, struct drm_bo_map_wait_idle_arg)
309+#define DRM_IOCTL_BO_INFO DRM_IOWR(0xd4, struct drm_bo_reference_info_arg)
310+#define DRM_IOCTL_BO_WAIT_IDLE DRM_IOWR(0xd5, struct drm_bo_map_wait_idle_arg)
311+#define DRM_IOCTL_BO_VERSION DRM_IOR(0xd6, struct drm_bo_version_arg)
312+
313+
314+#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
315+#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
316+#define DRM_IOCTL_MODE_GETOUTPUT DRM_IOWR(0xA2, struct drm_mode_get_output)
317+
318+#define DRM_IOCTL_MODE_ADDMODE DRM_IOWR(0xA7, struct drm_mode_modeinfo)
319+#define DRM_IOCTL_MODE_RMMODE DRM_IOWR(0xA8, unsigned int)
320+/*@}*/
321+
322 /**
323 * Device specific ioctls should only be in their respective headers
324 * The device specific ioctl range is from 0x40 to 0x99.
325@@ -742,6 +1041,11 @@
326 typedef struct drm_agp_info drm_agp_info_t;
327 typedef struct drm_scatter_gather drm_scatter_gather_t;
328 typedef struct drm_set_version drm_set_version_t;
329+
330+typedef struct drm_fence_arg drm_fence_arg_t;
331+typedef struct drm_mm_type_arg drm_mm_type_arg_t;
332+typedef struct drm_mm_init_arg drm_mm_init_arg_t;
333+typedef enum drm_bo_type drm_bo_type_t;
334 #endif
335
336 #endif
337Index: linux-2.6.28/include/drm/drmP.h
338===================================================================
339--- linux-2.6.28.orig/include/drm/drmP.h 2009-02-20 12:22:53.000000000 +0000
340+++ linux-2.6.28/include/drm/drmP.h 2009-02-20 12:30:10.000000000 +0000
341@@ -57,6 +57,7 @@
342 #include <linux/dma-mapping.h>
343 #include <linux/mm.h>
344 #include <linux/cdev.h>
345+#include <linux/i2c.h>
346 #include <linux/mutex.h>
347 #if defined(__alpha__) || defined(__powerpc__)
348 #include <asm/pgtable.h> /* For pte_wrprotect */
349@@ -147,9 +148,24 @@
350 #define DRM_MEM_CTXLIST 21
351 #define DRM_MEM_MM 22
352 #define DRM_MEM_HASHTAB 23
353+#define DRM_MEM_OBJECTS 24
354+#define DRM_MEM_FENCE 25
355+#define DRM_MEM_TTM 26
356+#define DRM_MEM_BUFOBJ 27
357
358 #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
359 #define DRM_MAP_HASH_OFFSET 0x10000000
360+#define DRM_MAP_HASH_ORDER 12
361+#define DRM_OBJECT_HASH_ORDER 12
362+#define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFFUL >> PAGE_SHIFT) + 1)
363+#define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFFUL >> PAGE_SHIFT) * 16)
364+/*
365+ * This should be small enough to allow the use of kmalloc for hash tables
366+ * instead of vmalloc.
367+ */
368+
369+#define DRM_FILE_HASH_ORDER 8
370+#define DRM_MM_INIT_MAX_PAGES 256
371
372 /*@}*/
373
374@@ -378,6 +394,14 @@
375 struct drm_freelist freelist;
376 };
377
378+
379+enum drm_ref_type {
380+ _DRM_REF_USE = 0,
381+ _DRM_REF_TYPE1,
382+ _DRM_NO_REF_TYPES
383+};
384+
385+
386 /** File private data */
387 struct drm_file {
388 int authenticated;
389@@ -387,6 +411,7 @@
390 unsigned long ioctl_count;
391 struct list_head lhead;
392 struct drm_minor *minor;
393+ int remove_auth_on_close;
394 unsigned long lock_count;
395
396 /** Mapping of mm object handles to object pointers. */
397@@ -394,6 +419,16 @@
398 /** Lock for synchronization of access to object_idr. */
399 spinlock_t table_lock;
400
401+ /*
402+ * The user object hash table is global and resides in the
403+ * drm_device structure. We protect the lists and hash tables with the
404+ * device struct_mutex. A bit coarse-grained but probably the best
405+ * option.
406+ */
407+
408+ struct list_head refd_objects;
409+
410+ struct drm_open_hash refd_object_hash[_DRM_NO_REF_TYPES];
411 struct file *filp;
412 void *driver_priv;
413
414@@ -659,6 +694,10 @@
415 void *driver_priv; /**< Private structure for driver to use */
416 };
417
418+#include "drm_objects.h"
419+#include "drm_edid.h"
420+#include "drm_crtc.h"
421+
422 /**
423 * DRM driver structure. This structure represent the common code for
424 * a family of cards. There will one drm_device for each card present
425@@ -766,6 +805,13 @@
426 int (*proc_init)(struct drm_minor *minor);
427 void (*proc_cleanup)(struct drm_minor *minor);
428
429+ /* FB routines, if present */
430+ int (*fb_probe)(struct drm_device *dev, struct drm_crtc *crtc);
431+ int (*fb_remove)(struct drm_device *dev, struct drm_crtc *crtc);
432+
433+ struct drm_fence_driver *fence_driver;
434+ struct drm_bo_driver *bo_driver;
435+
436 /**
437 * Driver-specific constructor for drm_gem_objects, to set up
438 * obj->driver_private.
439@@ -821,8 +867,11 @@
440 */
441 struct drm_device {
442 struct list_head driver_item; /**< list of devices per driver */
443+ //char *unique; /**< Unique identifier: e.g., busid */
444+ //int unique_len; /**< Length of unique field */
445 char *devname; /**< For /proc/interrupts */
446 int if_version; /**< Highest interface version set */
447+ //int blocked; /**< Blocked due to VC switch? */
448
449 /** \name Locks */
450 /*@{ */
451@@ -847,12 +896,18 @@
452 /*@} */
453
454 struct list_head filelist;
455+ struct drm_open_hash magiclist; /**< magic hash table */
456+ struct list_head magicfree;
457
458 /** \name Memory management */
459 /*@{ */
460 struct list_head maplist; /**< Linked list of regions */
461 int map_count; /**< Number of mappable regions */
462 struct drm_open_hash map_hash; /**< User token hash table for maps */
463+ struct drm_mm offset_manager; /**< User token manager */
464+ struct drm_open_hash object_hash; /**< User token hash table for objects */
465+ struct address_space *dev_mapping; /**< For unmap_mapping_range() */
466+ struct page *ttm_dummy_page;
467
468 /** \name Context handle management */
469 /*@{ */
470@@ -864,6 +919,7 @@
471
472 struct list_head vmalist; /**< List of vmas (for debugging) */
473
474+ struct drm_lock_data lock; /**< Information on hardware lock */
475 /*@} */
476
477 /** \name DMA queues (contexts) */
478@@ -936,7 +992,6 @@
479 int num_crtcs; /**< Number of CRTCs on this device */
480 void *dev_private; /**< device private data */
481 void *mm_private;
482- struct address_space *dev_mapping;
483 struct drm_sigdata sigdata; /**< For block_all_signals */
484 sigset_t sigmask;
485
486@@ -945,6 +1000,8 @@
487 unsigned int agp_buffer_token;
488 struct drm_minor *control; /**< Control node for card */
489 struct drm_minor *primary; /**< render type primary screen head */
490+ struct drm_fence_manager fm;
491+ struct drm_buffer_manager bm;
492
493 /** \name Drawable information */
494 /*@{ */
495@@ -976,6 +1033,27 @@
496 return dev->pdev->irq;
497 }
498
499+#if __OS_HAS_AGP
500+struct drm_agp_ttm_backend {
501+ struct drm_ttm_backend backend;
502+ DRM_AGP_MEM *mem;
503+ struct agp_bridge_data *bridge;
504+ int populated;
505+};
506+#endif
507+
508+typedef struct ati_pcigart_ttm_backend {
509+ struct drm_ttm_backend backend;
510+ int populated;
511+ void (*gart_flush_fn)(struct drm_device *dev);
512+ struct drm_ati_pcigart_info *gart_info;
513+ unsigned long offset;
514+ struct page **pages;
515+ int num_pages;
516+ int bound;
517+ struct drm_device *dev;
518+} ati_pcigart_ttm_backend_t;
519+
520 static __inline__ int drm_core_check_feature(struct drm_device *dev,
521 int feature)
522 {
523@@ -1042,6 +1120,9 @@
524 /* Driver support (drm_drv.h) */
525 extern int drm_init(struct drm_driver *driver);
526 extern void drm_exit(struct drm_driver *driver);
527+extern void drm_cleanup_pci(struct pci_dev *pdev);
528+extern void drm_vbl_send_signals(struct drm_device *dev, int crtc);
529+extern struct drm_ttm_backend *drm_agp_init_ttm(struct drm_device *dev);
530 extern int drm_ioctl(struct inode *inode, struct file *filp,
531 unsigned int cmd, unsigned long arg);
532 extern long drm_compat_ioctl(struct file *filp,
533Index: linux-2.6.28/include/drm/drm_pciids.h
534===================================================================
535--- linux-2.6.28.orig/include/drm/drm_pciids.h 2009-02-20 12:22:53.000000000 +0000
536+++ linux-2.6.28/include/drm/drm_pciids.h 2009-02-20 12:23:06.000000000 +0000
537@@ -419,3 +419,9 @@
538 {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
539 {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
540 {0, 0, 0}
541+
542+#define psb_PCI_IDS \
543+ {0x8086, 0x8108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PSB_8108}, \
544+ {0x8086, 0x8109, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PSB_8109}, \
545+ {0, 0, 0}
546+
547Index: linux-2.6.28/drivers/gpu/drm/Makefile
548===================================================================
549--- linux-2.6.28.orig/drivers/gpu/drm/Makefile 2009-02-20 12:22:53.000000000 +0000
550+++ linux-2.6.28/drivers/gpu/drm/Makefile 2009-02-20 12:23:06.000000000 +0000
551@@ -10,6 +10,8 @@
552 drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
553 drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
554 drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
555+ drm_fence.o drm_object.o drm_ttm.o drm_bo.o \
556+ drm_bo_lock.o drm_bo_move.o drm_regman.o \
557 drm_crtc.o drm_crtc_helper.o drm_modes.o drm_edid.o
558
559 drm-$(CONFIG_COMPAT) += drm_ioc32.o
560@@ -22,6 +24,7 @@
561 obj-$(CONFIG_DRM_I810) += i810/
562 obj-$(CONFIG_DRM_I830) += i830/
563 obj-$(CONFIG_DRM_I915) += i915/
564+obj-$(CONFIG_DRM_PSB) += psb/
565 obj-$(CONFIG_DRM_SIS) += sis/
566 obj-$(CONFIG_DRM_SAVAGE)+= savage/
567 obj-$(CONFIG_DRM_VIA) +=via/
568Index: linux-2.6.28/drivers/gpu/drm/drm_agpsupport.c
569===================================================================
570--- linux-2.6.28.orig/drivers/gpu/drm/drm_agpsupport.c 2009-02-20 12:22:53.000000000 +0000
571+++ linux-2.6.28/drivers/gpu/drm/drm_agpsupport.c 2009-02-20 12:23:06.000000000 +0000
572@@ -502,4 +502,156 @@
573 }
574 EXPORT_SYMBOL(drm_agp_chipset_flush);
575
576+/*
577+ * AGP ttm backend interface.
578+ */
579+
580+#ifndef AGP_USER_TYPES
581+#define AGP_USER_TYPES (1 << 16)
582+#define AGP_USER_MEMORY (AGP_USER_TYPES)
583+#define AGP_USER_CACHED_MEMORY (AGP_USER_TYPES + 1)
584+#endif
585+#define AGP_REQUIRED_MAJOR 0
586+#define AGP_REQUIRED_MINOR 102
587+
588+static int drm_agp_needs_unbind_cache_adjust(struct drm_ttm_backend *backend)
589+{
590+ return ((backend->flags & DRM_BE_FLAG_BOUND_CACHED) ? 0 : 1);
591+}
592+
593+
594+static int drm_agp_populate(struct drm_ttm_backend *backend,
595+ unsigned long num_pages, struct page **pages)
596+{
597+ struct drm_agp_ttm_backend *agp_be =
598+ container_of(backend, struct drm_agp_ttm_backend, backend);
599+ struct page **cur_page, **last_page = pages + num_pages;
600+ DRM_AGP_MEM *mem;
601+
602+ DRM_DEBUG("drm_agp_populate_ttm\n");
603+ mem = drm_agp_allocate_memory(agp_be->bridge, num_pages, AGP_USER_MEMORY);
604+ if (!mem)
605+ return -ENOMEM;
606+
607+ DRM_DEBUG("Current page count is %ld\n", (long) mem->page_count);
608+ mem->page_count = 0;
609+ for (cur_page = pages; cur_page < last_page; ++cur_page)
610+ mem->memory[mem->page_count++] = phys_to_gart(page_to_phys(*cur_page));
611+ agp_be->mem = mem;
612+ return 0;
613+}
614+
615+static int drm_agp_bind_ttm(struct drm_ttm_backend *backend,
616+ struct drm_bo_mem_reg *bo_mem)
617+{
618+ struct drm_agp_ttm_backend *agp_be =
619+ container_of(backend, struct drm_agp_ttm_backend, backend);
620+ DRM_AGP_MEM *mem = agp_be->mem;
621+ int ret;
622+ int snooped = (bo_mem->flags & DRM_BO_FLAG_CACHED) && !(bo_mem->flags & DRM_BO_FLAG_CACHED_MAPPED);
623+
624+ DRM_DEBUG("drm_agp_bind_ttm\n");
625+ mem->is_flushed = 1;
626+ mem->type = AGP_USER_MEMORY;
627+ /* CACHED MAPPED implies not snooped memory */
628+ if (snooped)
629+ mem->type = AGP_USER_CACHED_MEMORY;
630+
631+ ret = drm_agp_bind_memory(mem, bo_mem->mm_node->start);
632+ if (ret)
633+ DRM_ERROR("AGP Bind memory failed\n");
634+
635+ DRM_FLAG_MASKED(backend->flags, (bo_mem->flags & DRM_BO_FLAG_CACHED) ?
636+ DRM_BE_FLAG_BOUND_CACHED : 0,
637+ DRM_BE_FLAG_BOUND_CACHED);
638+ return ret;
639+}
640+
641+static int drm_agp_unbind_ttm(struct drm_ttm_backend *backend)
642+{
643+ struct drm_agp_ttm_backend *agp_be =
644+ container_of(backend, struct drm_agp_ttm_backend, backend);
645+
646+ DRM_DEBUG("drm_agp_unbind_ttm\n");
647+ if (agp_be->mem->is_bound)
648+ return drm_agp_unbind_memory(agp_be->mem);
649+ else
650+ return 0;
651+}
652+
653+static void drm_agp_clear_ttm(struct drm_ttm_backend *backend)
654+{
655+ struct drm_agp_ttm_backend *agp_be =
656+ container_of(backend, struct drm_agp_ttm_backend, backend);
657+ DRM_AGP_MEM *mem = agp_be->mem;
658+
659+ DRM_DEBUG("drm_agp_clear_ttm\n");
660+ if (mem) {
661+ backend->func->unbind(backend);
662+ agp_free_memory(mem);
663+ }
664+ agp_be->mem = NULL;
665+}
666+
667+static void drm_agp_destroy_ttm(struct drm_ttm_backend *backend)
668+{
669+ struct drm_agp_ttm_backend *agp_be;
670+
671+ if (backend) {
672+ DRM_DEBUG("drm_agp_destroy_ttm\n");
673+ agp_be = container_of(backend, struct drm_agp_ttm_backend, backend);
674+ if (agp_be && agp_be->mem)
675+ backend->func->clear(backend);
676+ }
677+}
678+
679+static struct drm_ttm_backend_func agp_ttm_backend = {
680+ .needs_ub_cache_adjust = drm_agp_needs_unbind_cache_adjust,
681+ .populate = drm_agp_populate,
682+ .clear = drm_agp_clear_ttm,
683+ .bind = drm_agp_bind_ttm,
684+ .unbind = drm_agp_unbind_ttm,
685+ .destroy = drm_agp_destroy_ttm,
686+};
687+
688+struct drm_ttm_backend *drm_agp_init_ttm(struct drm_device *dev)
689+{
690+
691+ struct drm_agp_ttm_backend *agp_be;
692+ struct agp_kern_info *info;
693+
694+ if (!dev->agp) {
695+ DRM_ERROR("AGP is not initialized.\n");
696+ return NULL;
697+ }
698+ info = &dev->agp->agp_info;
699+
700+ if (info->version.major != AGP_REQUIRED_MAJOR ||
701+ info->version.minor < AGP_REQUIRED_MINOR) {
702+ DRM_ERROR("Wrong agpgart version %d.%d\n"
703+ "\tYou need at least version %d.%d.\n",
704+ info->version.major,
705+ info->version.minor,
706+ AGP_REQUIRED_MAJOR,
707+ AGP_REQUIRED_MINOR);
708+ return NULL;
709+ }
710+
711+
712+ agp_be = drm_calloc(1, sizeof(*agp_be), DRM_MEM_TTM);
713+ if (!agp_be)
714+ return NULL;
715+
716+ agp_be->mem = NULL;
717+
718+ agp_be->bridge = dev->agp->bridge;
719+ agp_be->populated = 0;
720+ agp_be->backend.func = &agp_ttm_backend;
721+ agp_be->backend.dev = dev;
722+
723+ return &agp_be->backend;
724+}
725+EXPORT_SYMBOL(drm_agp_init_ttm);
726+
727+
728 #endif /* __OS_HAS_AGP */
729Index: linux-2.6.28/drivers/gpu/drm/drm_bo.c
730===================================================================
731--- /dev/null 1970-01-01 00:00:00.000000000 +0000
732+++ linux-2.6.28/drivers/gpu/drm/drm_bo.c 2009-02-20 12:23:06.000000000 +0000
733@@ -0,0 +1,2660 @@
734+/**************************************************************************
735+ *
736+ * Copyright (c) 2006-2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
737+ * All Rights Reserved.
738+ *
739+ * Permission is hereby granted, free of charge, to any person obtaining a
740+ * copy of this software and associated documentation files (the
741+ * "Software"), to deal in the Software without restriction, including
742+ * without limitation the rights to use, copy, modify, merge, publish,
743+ * distribute, sub license, and/or sell copies of the Software, and to
744+ * permit persons to whom the Software is furnished to do so, subject to
745+ * the following conditions:
746+ *
747+ * The above copyright notice and this permission notice (including the
748+ * next paragraph) shall be included in all copies or substantial portions
749+ * of the Software.
750+ *
751+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
752+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
753+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
754+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
755+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
756+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
757+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
758+ *
759+ **************************************************************************/
760+/*
761+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
762+ */
763+
764+#include "drmP.h"
765+
766+/*
767+ * Locking may look a bit complicated but isn't really:
768+ *
769+ * The buffer usage atomic_t needs to be protected by dev->struct_mutex
770+ * when there is a chance that it can be zero before or after the operation.
771+ *
772+ * dev->struct_mutex also protects all lists and list heads,
773+ * Hash tables and hash heads.
774+ *
775+ * bo->mutex protects the buffer object itself excluding the usage field.
776+ * bo->mutex does also protect the buffer list heads, so to manipulate those,
777+ * we need both the bo->mutex and the dev->struct_mutex.
778+ *
779+ * Locking order is bo->mutex, dev->struct_mutex. Therefore list traversal
780+ * is a bit complicated. When dev->struct_mutex is released to grab bo->mutex,
781+ * the list traversal will, in general, need to be restarted.
782+ *
783+ */
784+
785+static void drm_bo_destroy_locked(struct drm_buffer_object *bo);
786+static int drm_bo_setup_vm_locked(struct drm_buffer_object *bo);
787+static void drm_bo_takedown_vm_locked(struct drm_buffer_object *bo);
788+static void drm_bo_unmap_virtual(struct drm_buffer_object *bo);
789+
790+static inline uint64_t drm_bo_type_flags(unsigned type)
791+{
792+ return (1ULL << (24 + type));
793+}
794+
795+/*
796+ * bo locked. dev->struct_mutex locked.
797+ */
798+
799+void drm_bo_add_to_pinned_lru(struct drm_buffer_object *bo)
800+{
801+ struct drm_mem_type_manager *man;
802+
803+ DRM_ASSERT_LOCKED(&bo->dev->struct_mutex);
804+ DRM_ASSERT_LOCKED(&bo->mutex);
805+
806+ man = &bo->dev->bm.man[bo->pinned_mem_type];
807+ list_add_tail(&bo->pinned_lru, &man->pinned);
808+}
809+
810+void drm_bo_add_to_lru(struct drm_buffer_object *bo)
811+{
812+ struct drm_mem_type_manager *man;
813+
814+ DRM_ASSERT_LOCKED(&bo->dev->struct_mutex);
815+
816+ if (!(bo->mem.mask & (DRM_BO_FLAG_NO_MOVE | DRM_BO_FLAG_NO_EVICT))
817+ || bo->mem.mem_type != bo->pinned_mem_type) {
818+ man = &bo->dev->bm.man[bo->mem.mem_type];
819+ list_add_tail(&bo->lru, &man->lru);
820+ } else {
821+ INIT_LIST_HEAD(&bo->lru);
822+ }
823+}
824+
825+static int drm_bo_vm_pre_move(struct drm_buffer_object *bo, int old_is_pci)
826+{
827+#ifdef DRM_ODD_MM_COMPAT
828+ int ret;
829+
830+ if (!bo->map_list.map)
831+ return 0;
832+
833+ ret = drm_bo_lock_kmm(bo);
834+ if (ret)
835+ return ret;
836+ drm_bo_unmap_virtual(bo);
837+ if (old_is_pci)
838+ drm_bo_finish_unmap(bo);
839+#else
840+ if (!bo->map_list.map)
841+ return 0;
842+
843+ drm_bo_unmap_virtual(bo);
844+#endif
845+ return 0;
846+}
847+
848+static void drm_bo_vm_post_move(struct drm_buffer_object *bo)
849+{
850+#ifdef DRM_ODD_MM_COMPAT
851+ int ret;
852+
853+ if (!bo->map_list.map)
854+ return;
855+
856+ ret = drm_bo_remap_bound(bo);
857+ if (ret) {
858+ DRM_ERROR("Failed to remap a bound buffer object.\n"
859+ "\tThis might cause a sigbus later.\n");
860+ }
861+ drm_bo_unlock_kmm(bo);
862+#endif
863+}
864+
865+/*
866+ * Call bo->mutex locked.
867+ */
868+
869+static int drm_bo_add_ttm(struct drm_buffer_object *bo)
870+{
871+ struct drm_device *dev = bo->dev;
872+ int ret = 0;
873+
874+ DRM_ASSERT_LOCKED(&bo->mutex);
875+ bo->ttm = NULL;
876+
877+ switch (bo->type) {
878+ case drm_bo_type_dc:
879+ case drm_bo_type_kernel:
880+ bo->ttm = drm_ttm_init(dev, bo->num_pages << PAGE_SHIFT);
881+ if (!bo->ttm)
882+ ret = -ENOMEM;
883+ break;
884+ case drm_bo_type_user:
885+ bo->ttm = drm_ttm_init(dev, bo->num_pages << PAGE_SHIFT);
886+ if (!bo->ttm)
887+ ret = -ENOMEM;
888+
889+ ret = drm_ttm_set_user(bo->ttm, current,
890+ bo->mem.mask & DRM_BO_FLAG_WRITE,
891+ bo->buffer_start,
892+ bo->num_pages,
893+ dev->bm.dummy_read_page);
894+ if (ret)
895+ return ret;
896+
897+ break;
898+ default:
899+ DRM_ERROR("Illegal buffer object type\n");
900+ ret = -EINVAL;
901+ break;
902+ }
903+
904+ return ret;
905+}
906+
907+static int drm_bo_handle_move_mem(struct drm_buffer_object *bo,
908+ struct drm_bo_mem_reg *mem,
909+ int evict, int no_wait)
910+{
911+ struct drm_device *dev = bo->dev;
912+ struct drm_buffer_manager *bm = &dev->bm;
913+ int old_is_pci = drm_mem_reg_is_pci(dev, &bo->mem);
914+ int new_is_pci = drm_mem_reg_is_pci(dev, mem);
915+ struct drm_mem_type_manager *old_man = &bm->man[bo->mem.mem_type];
916+ struct drm_mem_type_manager *new_man = &bm->man[mem->mem_type];
917+ int ret = 0;
918+
919+ if (old_is_pci || new_is_pci ||
920+ ((mem->flags ^ bo->mem.flags) & DRM_BO_FLAG_CACHED))
921+ ret = drm_bo_vm_pre_move(bo, old_is_pci);
922+ if (ret)
923+ return ret;
924+
925+ /*
926+ * Create and bind a ttm if required.
927+ */
928+
929+ if (!(new_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && (bo->ttm == NULL)) {
930+ ret = drm_bo_add_ttm(bo);
931+ if (ret)
932+ goto out_err;
933+
934+ if (mem->mem_type != DRM_BO_MEM_LOCAL) {
935+ ret = drm_bind_ttm(bo->ttm, mem);
936+ if (ret)
937+ goto out_err;
938+ }
939+
940+ if (bo->mem.mem_type == DRM_BO_MEM_LOCAL) {
941+
942+ struct drm_bo_mem_reg *old_mem = &bo->mem;
943+ uint64_t save_flags = old_mem->flags;
944+ uint64_t save_mask = old_mem->mask;
945+
946+ *old_mem = *mem;
947+ mem->mm_node = NULL;
948+ old_mem->mask = save_mask;
949+ DRM_FLAG_MASKED(save_flags, mem->flags,
950+ DRM_BO_MASK_MEMTYPE);
951+ goto moved;
952+ }
953+
954+ }
955+
956+ if (!(old_man->flags & _DRM_FLAG_MEMTYPE_FIXED) &&
957+ !(new_man->flags & _DRM_FLAG_MEMTYPE_FIXED)) {
958+
959+ ret = drm_bo_move_ttm(bo, evict, no_wait, mem);
960+
961+ } else if (dev->driver->bo_driver->move) {
962+ ret = dev->driver->bo_driver->move(bo, evict, no_wait, mem);
963+
964+ } else {
965+
966+ ret = drm_bo_move_memcpy(bo, evict, no_wait, mem);
967+
968+ }
969+
970+ if (ret)
971+ goto out_err;
972+
973+moved:
974+ if (old_is_pci || new_is_pci)
975+ drm_bo_vm_post_move(bo);
976+
977+ if (bo->priv_flags & _DRM_BO_FLAG_EVICTED) {
978+ ret =
979+ dev->driver->bo_driver->invalidate_caches(dev,
980+ bo->mem.flags);
981+ if (ret)
982+ DRM_ERROR("Can not flush read caches\n");
983+ }
984+
985+ DRM_FLAG_MASKED(bo->priv_flags,
986+ (evict) ? _DRM_BO_FLAG_EVICTED : 0,
987+ _DRM_BO_FLAG_EVICTED);
988+
989+ if (bo->mem.mm_node)
990+ bo->offset = (bo->mem.mm_node->start << PAGE_SHIFT) +
991+ bm->man[bo->mem.mem_type].gpu_offset;
992+
993+
994+ return 0;
995+
996+out_err:
997+ if (old_is_pci || new_is_pci)
998+ drm_bo_vm_post_move(bo);
999+
1000+ new_man = &bm->man[bo->mem.mem_type];
1001+ if ((new_man->flags & _DRM_FLAG_MEMTYPE_FIXED) && bo->ttm) {
1002+ drm_ttm_unbind(bo->ttm);
1003+ drm_destroy_ttm(bo->ttm);
1004+ bo->ttm = NULL;
1005+ }
1006+
1007+ return ret;
1008+}
1009+
1010+/*
1011+ * Call bo->mutex locked.
1012+ * Wait until the buffer is idle.
1013+ */
1014+
1015+int drm_bo_wait(struct drm_buffer_object *bo, int lazy, int ignore_signals,
1016+ int no_wait)
1017+{
1018+ int ret;
1019+
1020+ DRM_ASSERT_LOCKED(&bo->mutex);
1021+
1022+ if (bo->fence) {
1023+ if (drm_fence_object_signaled(bo->fence, bo->fence_type)) {
1024+ drm_fence_usage_deref_unlocked(&bo->fence);
1025+ return 0;
1026+ }
1027+ if (no_wait)
1028+ return -EBUSY;
1029+
1030+ ret = drm_fence_object_wait(bo->fence, lazy, ignore_signals,
1031+ bo->fence_type);
1032+ if (ret)
1033+ return ret;
1034+
1035+ drm_fence_usage_deref_unlocked(&bo->fence);
1036+ }
1037+ return 0;
1038+}
1039+EXPORT_SYMBOL(drm_bo_wait);
1040+
1041+static int drm_bo_expire_fence(struct drm_buffer_object *bo, int allow_errors)
1042+{
1043+ struct drm_device *dev = bo->dev;
1044+ struct drm_buffer_manager *bm = &dev->bm;
1045+
1046+ if (bo->fence) {
1047+ if (bm->nice_mode) {
1048+ unsigned long _end = jiffies + 3 * DRM_HZ;
1049+ int ret;
1050+ do {
1051+ ret = drm_bo_wait(bo, 0, 1, 0);
1052+ if (ret && allow_errors)
1053+ return ret;
1054+
1055+ } while (ret && !time_after_eq(jiffies, _end));
1056+
1057+ if (bo->fence) {
1058+ bm->nice_mode = 0;
1059+ DRM_ERROR("Detected GPU lockup or "
1060+ "fence driver was taken down. "
1061+ "Evicting buffer.\n");
1062+ }
1063+ }
1064+ if (bo->fence)
1065+ drm_fence_usage_deref_unlocked(&bo->fence);
1066+ }
1067+ return 0;
1068+}
1069+
1070+/*
1071+ * Call dev->struct_mutex locked.
1072+ * Attempts to remove all private references to a buffer by expiring its
1073+ * fence object and removing from lru lists and memory managers.
1074+ */
1075+
1076+static void drm_bo_cleanup_refs(struct drm_buffer_object *bo, int remove_all)
1077+{
1078+ struct drm_device *dev = bo->dev;
1079+ struct drm_buffer_manager *bm = &dev->bm;
1080+
1081+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
1082+
1083+ atomic_inc(&bo->usage);
1084+ mutex_unlock(&dev->struct_mutex);
1085+ mutex_lock(&bo->mutex);
1086+
1087+ DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED);
1088+
1089+ if (bo->fence && drm_fence_object_signaled(bo->fence,
1090+ bo->fence_type))
1091+ drm_fence_usage_deref_unlocked(&bo->fence);
1092+
1093+ if (bo->fence && remove_all)
1094+ (void)drm_bo_expire_fence(bo, 0);
1095+
1096+ mutex_lock(&dev->struct_mutex);
1097+
1098+ if (!atomic_dec_and_test(&bo->usage))
1099+ goto out;
1100+
1101+ if (!bo->fence) {
1102+ list_del_init(&bo->lru);
1103+ if (bo->mem.mm_node) {
1104+ drm_mm_put_block(bo->mem.mm_node);
1105+ if (bo->pinned_node == bo->mem.mm_node)
1106+ bo->pinned_node = NULL;
1107+ bo->mem.mm_node = NULL;
1108+ }
1109+ list_del_init(&bo->pinned_lru);
1110+ if (bo->pinned_node) {
1111+ drm_mm_put_block(bo->pinned_node);
1112+ bo->pinned_node = NULL;
1113+ }
1114+ list_del_init(&bo->ddestroy);
1115+ mutex_unlock(&bo->mutex);
1116+ drm_bo_destroy_locked(bo);
1117+ return;
1118+ }
1119+
1120+ if (list_empty(&bo->ddestroy)) {
1121+ drm_fence_object_flush(bo->fence, bo->fence_type);
1122+ list_add_tail(&bo->ddestroy, &bm->ddestroy);
1123+ schedule_delayed_work(&bm->wq,
1124+ ((DRM_HZ / 100) < 1) ? 1 : DRM_HZ / 100);
1125+ }
1126+
1127+out:
1128+ mutex_unlock(&bo->mutex);
1129+ return;
1130+}
1131+
1132+static void drm_bo_unreserve_size(unsigned long size)
1133+{
1134+ //drm_free_memctl(size);
1135+}
1136+
1137+/*
1138+ * Verify that refcount is 0 and that there are no internal references
1139+ * to the buffer object. Then destroy it.
1140+ */
1141+
1142+static void drm_bo_destroy_locked(struct drm_buffer_object *bo)
1143+{
1144+ struct drm_device *dev = bo->dev;
1145+ struct drm_buffer_manager *bm = &dev->bm;
1146+ unsigned long reserved_size;
1147+
1148+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
1149+
1150+ if (list_empty(&bo->lru) && bo->mem.mm_node == NULL &&
1151+ list_empty(&bo->pinned_lru) && bo->pinned_node == NULL &&
1152+ list_empty(&bo->ddestroy) && atomic_read(&bo->usage) == 0) {
1153+ if (bo->fence != NULL) {
1154+ DRM_ERROR("Fence was non-zero.\n");
1155+ drm_bo_cleanup_refs(bo, 0);
1156+ return;
1157+ }
1158+
1159+#ifdef DRM_ODD_MM_COMPAT
1160+ BUG_ON(!list_empty(&bo->vma_list));
1161+ BUG_ON(!list_empty(&bo->p_mm_list));
1162+#endif
1163+
1164+ if (bo->ttm) {
1165+ drm_ttm_unbind(bo->ttm);
1166+ drm_destroy_ttm(bo->ttm);
1167+ bo->ttm = NULL;
1168+ }
1169+
1170+ atomic_dec(&bm->count);
1171+
1172+ reserved_size = bo->reserved_size;
1173+
1174+ drm_free(bo, sizeof(*bo), DRM_MEM_BUFOBJ);
1175+ drm_bo_unreserve_size(reserved_size);
1176+
1177+ return;
1178+ }
1179+
1180+ /*
1181+ * Some stuff is still trying to reference the buffer object.
1182+ * Get rid of those references.
1183+ */
1184+
1185+ drm_bo_cleanup_refs(bo, 0);
1186+
1187+ return;
1188+}
1189+
1190+/*
1191+ * Call dev->struct_mutex locked.
1192+ */
1193+
1194+static void drm_bo_delayed_delete(struct drm_device *dev, int remove_all)
1195+{
1196+ struct drm_buffer_manager *bm = &dev->bm;
1197+
1198+ struct drm_buffer_object *entry, *nentry;
1199+ struct list_head *list, *next;
1200+
1201+ list_for_each_safe(list, next, &bm->ddestroy) {
1202+ entry = list_entry(list, struct drm_buffer_object, ddestroy);
1203+
1204+ nentry = NULL;
1205+ if (next != &bm->ddestroy) {
1206+ nentry = list_entry(next, struct drm_buffer_object,
1207+ ddestroy);
1208+ atomic_inc(&nentry->usage);
1209+ }
1210+
1211+ drm_bo_cleanup_refs(entry, remove_all);
1212+
1213+ if (nentry)
1214+ atomic_dec(&nentry->usage);
1215+ }
1216+}
1217+
1218+static void drm_bo_delayed_workqueue(struct work_struct *work)
1219+{
1220+ struct drm_buffer_manager *bm =
1221+ container_of(work, struct drm_buffer_manager, wq.work);
1222+ struct drm_device *dev = container_of(bm, struct drm_device, bm);
1223+
1224+ DRM_DEBUG("Delayed delete Worker\n");
1225+
1226+ mutex_lock(&dev->struct_mutex);
1227+ if (!bm->initialized) {
1228+ mutex_unlock(&dev->struct_mutex);
1229+ return;
1230+ }
1231+ drm_bo_delayed_delete(dev, 0);
1232+ if (bm->initialized && !list_empty(&bm->ddestroy)) {
1233+ schedule_delayed_work(&bm->wq,
1234+ ((DRM_HZ / 100) < 1) ? 1 : DRM_HZ / 100);
1235+ }
1236+ mutex_unlock(&dev->struct_mutex);
1237+}
1238+
1239+void drm_bo_usage_deref_locked(struct drm_buffer_object **bo)
1240+{
1241+ struct drm_buffer_object *tmp_bo = *bo;
1242+ bo = NULL;
1243+
1244+ DRM_ASSERT_LOCKED(&tmp_bo->dev->struct_mutex);
1245+
1246+ if (atomic_dec_and_test(&tmp_bo->usage))
1247+ drm_bo_destroy_locked(tmp_bo);
1248+}
1249+EXPORT_SYMBOL(drm_bo_usage_deref_locked);
1250+
1251+static void drm_bo_base_deref_locked(struct drm_file *file_priv,
1252+ struct drm_user_object *uo)
1253+{
1254+ struct drm_buffer_object *bo =
1255+ drm_user_object_entry(uo, struct drm_buffer_object, base);
1256+
1257+ DRM_ASSERT_LOCKED(&bo->dev->struct_mutex);
1258+
1259+ drm_bo_takedown_vm_locked(bo);
1260+ drm_bo_usage_deref_locked(&bo);
1261+}
1262+
1263+void drm_bo_usage_deref_unlocked(struct drm_buffer_object **bo)
1264+{
1265+ struct drm_buffer_object *tmp_bo = *bo;
1266+ struct drm_device *dev = tmp_bo->dev;
1267+
1268+ *bo = NULL;
1269+ if (atomic_dec_and_test(&tmp_bo->usage)) {
1270+ mutex_lock(&dev->struct_mutex);
1271+ if (atomic_read(&tmp_bo->usage) == 0)
1272+ drm_bo_destroy_locked(tmp_bo);
1273+ mutex_unlock(&dev->struct_mutex);
1274+ }
1275+}
1276+EXPORT_SYMBOL(drm_bo_usage_deref_unlocked);
1277+
1278+void drm_putback_buffer_objects(struct drm_device *dev)
1279+{
1280+ struct drm_buffer_manager *bm = &dev->bm;
1281+ struct list_head *list = &bm->unfenced;
1282+ struct drm_buffer_object *entry, *next;
1283+
1284+ mutex_lock(&dev->struct_mutex);
1285+ list_for_each_entry_safe(entry, next, list, lru) {
1286+ atomic_inc(&entry->usage);
1287+ mutex_unlock(&dev->struct_mutex);
1288+
1289+ mutex_lock(&entry->mutex);
1290+ BUG_ON(!(entry->priv_flags & _DRM_BO_FLAG_UNFENCED));
1291+ mutex_lock(&dev->struct_mutex);
1292+
1293+ list_del_init(&entry->lru);
1294+ DRM_FLAG_MASKED(entry->priv_flags, 0, _DRM_BO_FLAG_UNFENCED);
1295+ wake_up_all(&entry->event_queue);
1296+
1297+ /*
1298+ * FIXME: Might want to put back on head of list
1299+ * instead of tail here.
1300+ */
1301+
1302+ drm_bo_add_to_lru(entry);
1303+ mutex_unlock(&entry->mutex);
1304+ drm_bo_usage_deref_locked(&entry);
1305+ }
1306+ mutex_unlock(&dev->struct_mutex);
1307+}
1308+EXPORT_SYMBOL(drm_putback_buffer_objects);
1309+
1310+
1311+/*
1312+ * Note. The caller has to register (if applicable)
1313+ * and deregister fence object usage.
1314+ */
1315+
1316+int drm_fence_buffer_objects(struct drm_device *dev,
1317+ struct list_head *list,
1318+ uint32_t fence_flags,
1319+ struct drm_fence_object *fence,
1320+ struct drm_fence_object **used_fence)
1321+{
1322+ struct drm_buffer_manager *bm = &dev->bm;
1323+ struct drm_buffer_object *entry;
1324+ uint32_t fence_type = 0;
1325+ uint32_t fence_class = ~0;
1326+ int count = 0;
1327+ int ret = 0;
1328+ struct list_head *l;
1329+
1330+ mutex_lock(&dev->struct_mutex);
1331+
1332+ if (!list)
1333+ list = &bm->unfenced;
1334+
1335+ if (fence)
1336+ fence_class = fence->fence_class;
1337+
1338+ list_for_each_entry(entry, list, lru) {
1339+ BUG_ON(!(entry->priv_flags & _DRM_BO_FLAG_UNFENCED));
1340+ fence_type |= entry->new_fence_type;
1341+ if (fence_class == ~0)
1342+ fence_class = entry->new_fence_class;
1343+ else if (entry->new_fence_class != fence_class) {
1344+ DRM_ERROR("Unmatching fence classes on unfenced list: "
1345+ "%d and %d.\n",
1346+ fence_class,
1347+ entry->new_fence_class);
1348+ ret = -EINVAL;
1349+ goto out;
1350+ }
1351+ count++;
1352+ }
1353+
1354+ if (!count) {
1355+ ret = -EINVAL;
1356+ goto out;
1357+ }
1358+
1359+ if (fence) {
1360+ if ((fence_type & fence->type) != fence_type ||
1361+ (fence->fence_class != fence_class)) {
1362+ DRM_ERROR("Given fence doesn't match buffers "
1363+ "on unfenced list.\n");
1364+ ret = -EINVAL;
1365+ goto out;
1366+ }
1367+ } else {
1368+ mutex_unlock(&dev->struct_mutex);
1369+ ret = drm_fence_object_create(dev, fence_class, fence_type,
1370+ fence_flags | DRM_FENCE_FLAG_EMIT,
1371+ &fence);
1372+ mutex_lock(&dev->struct_mutex);
1373+ if (ret)
1374+ goto out;
1375+ }
1376+
1377+ count = 0;
1378+ l = list->next;
1379+ while (l != list) {
1380+ prefetch(l->next);
1381+ entry = list_entry(l, struct drm_buffer_object, lru);
1382+ atomic_inc(&entry->usage);
1383+ mutex_unlock(&dev->struct_mutex);
1384+ mutex_lock(&entry->mutex);
1385+ mutex_lock(&dev->struct_mutex);
1386+ list_del_init(l);
1387+ if (entry->priv_flags & _DRM_BO_FLAG_UNFENCED) {
1388+ count++;
1389+ if (entry->fence)
1390+ drm_fence_usage_deref_locked(&entry->fence);
1391+ entry->fence = drm_fence_reference_locked(fence);
1392+ entry->fence_class = entry->new_fence_class;
1393+ entry->fence_type = entry->new_fence_type;
1394+ DRM_FLAG_MASKED(entry->priv_flags, 0,
1395+ _DRM_BO_FLAG_UNFENCED);
1396+ wake_up_all(&entry->event_queue);
1397+ drm_bo_add_to_lru(entry);
1398+ }
1399+ mutex_unlock(&entry->mutex);
1400+ drm_bo_usage_deref_locked(&entry);
1401+ l = list->next;
1402+ }
1403+ DRM_DEBUG("Fenced %d buffers\n", count);
1404+out:
1405+ mutex_unlock(&dev->struct_mutex);
1406+ *used_fence = fence;
1407+ return ret;
1408+}
1409+EXPORT_SYMBOL(drm_fence_buffer_objects);
1410+
1411+/*
1412+ * bo->mutex locked
1413+ */
1414+
1415+static int drm_bo_evict(struct drm_buffer_object *bo, unsigned mem_type,
1416+ int no_wait)
1417+{
1418+ int ret = 0;
1419+ struct drm_device *dev = bo->dev;
1420+ struct drm_bo_mem_reg evict_mem;
1421+
1422+ /*
1423+ * Someone might have modified the buffer before we took the
1424+ * buffer mutex.
1425+ */
1426+
1427+ if (bo->priv_flags & _DRM_BO_FLAG_UNFENCED)
1428+ goto out;
1429+ if (bo->mem.mem_type != mem_type)
1430+ goto out;
1431+
1432+ ret = drm_bo_wait(bo, 0, 0, no_wait);
1433+
1434+ if (ret && ret != -EAGAIN) {
1435+ DRM_ERROR("Failed to expire fence before "
1436+ "buffer eviction.\n");
1437+ goto out;
1438+ }
1439+
1440+ evict_mem = bo->mem;
1441+ evict_mem.mm_node = NULL;
1442+
1443+ evict_mem = bo->mem;
1444+ evict_mem.mask = dev->driver->bo_driver->evict_mask(bo);
1445+ ret = drm_bo_mem_space(bo, &evict_mem, no_wait);
1446+
1447+ if (ret) {
1448+ if (ret != -EAGAIN)
1449+ DRM_ERROR("Failed to find memory space for "
1450+ "buffer 0x%p eviction.\n", bo);
1451+ goto out;
1452+ }
1453+
1454+ ret = drm_bo_handle_move_mem(bo, &evict_mem, 1, no_wait);
1455+
1456+ if (ret) {
1457+ if (ret != -EAGAIN)
1458+ DRM_ERROR("Buffer eviction failed\n");
1459+ goto out;
1460+ }
1461+
1462+ mutex_lock(&dev->struct_mutex);
1463+ if (evict_mem.mm_node) {
1464+ if (evict_mem.mm_node != bo->pinned_node)
1465+ drm_mm_put_block(evict_mem.mm_node);
1466+ evict_mem.mm_node = NULL;
1467+ }
1468+ list_del(&bo->lru);
1469+ drm_bo_add_to_lru(bo);
1470+ mutex_unlock(&dev->struct_mutex);
1471+
1472+ DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_EVICTED,
1473+ _DRM_BO_FLAG_EVICTED);
1474+
1475+out:
1476+ return ret;
1477+}
1478+
1479+/**
1480+ * Repeatedly evict memory from the LRU for @mem_type until we create enough
1481+ * space, or we've evicted everything and there isn't enough space.
1482+ */
1483+static int drm_bo_mem_force_space(struct drm_device *dev,
1484+ struct drm_bo_mem_reg *mem,
1485+ uint32_t mem_type, int no_wait)
1486+{
1487+ struct drm_mm_node *node;
1488+ struct drm_buffer_manager *bm = &dev->bm;
1489+ struct drm_buffer_object *entry;
1490+ struct drm_mem_type_manager *man = &bm->man[mem_type];
1491+ struct list_head *lru;
1492+ unsigned long num_pages = mem->num_pages;
1493+ int ret;
1494+
1495+ mutex_lock(&dev->struct_mutex);
1496+ do {
1497+ node = drm_mm_search_free(&man->manager, num_pages,
1498+ mem->page_alignment, 1);
1499+ if (node)
1500+ break;
1501+
1502+ lru = &man->lru;
1503+ if (lru->next == lru)
1504+ break;
1505+
1506+ entry = list_entry(lru->next, struct drm_buffer_object, lru);
1507+ atomic_inc(&entry->usage);
1508+ mutex_unlock(&dev->struct_mutex);
1509+ mutex_lock(&entry->mutex);
1510+ BUG_ON(entry->mem.flags & (DRM_BO_FLAG_NO_MOVE | DRM_BO_FLAG_NO_EVICT));
1511+
1512+ ret = drm_bo_evict(entry, mem_type, no_wait);
1513+ mutex_unlock(&entry->mutex);
1514+ drm_bo_usage_deref_unlocked(&entry);
1515+ if (ret)
1516+ return ret;
1517+ mutex_lock(&dev->struct_mutex);
1518+ } while (1);
1519+
1520+ if (!node) {
1521+ mutex_unlock(&dev->struct_mutex);
1522+ return -ENOMEM;
1523+ }
1524+
1525+ node = drm_mm_get_block(node, num_pages, mem->page_alignment);
1526+ if (!node) {
1527+ mutex_unlock(&dev->struct_mutex);
1528+ return -ENOMEM;
1529+ }
1530+
1531+ mutex_unlock(&dev->struct_mutex);
1532+ mem->mm_node = node;
1533+ mem->mem_type = mem_type;
1534+ return 0;
1535+}
1536+
1537+static int drm_bo_mt_compatible(struct drm_mem_type_manager *man,
1538+ int disallow_fixed,
1539+ uint32_t mem_type,
1540+ uint64_t mask, uint32_t *res_mask)
1541+{
1542+ uint64_t cur_flags = drm_bo_type_flags(mem_type);
1543+ uint64_t flag_diff;
1544+
1545+ if ((man->flags & _DRM_FLAG_MEMTYPE_FIXED) && disallow_fixed)
1546+ return 0;
1547+ if (man->flags & _DRM_FLAG_MEMTYPE_CACHED)
1548+ cur_flags |= DRM_BO_FLAG_CACHED;
1549+ if (man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE)
1550+ cur_flags |= DRM_BO_FLAG_MAPPABLE;
1551+ if (man->flags & _DRM_FLAG_MEMTYPE_CSELECT)
1552+ DRM_FLAG_MASKED(cur_flags, mask, DRM_BO_FLAG_CACHED);
1553+
1554+ if ((cur_flags & mask & DRM_BO_MASK_MEM) == 0)
1555+ return 0;
1556+
1557+ if (mem_type == DRM_BO_MEM_LOCAL) {
1558+ *res_mask = cur_flags;
1559+ return 1;
1560+ }
1561+
1562+ flag_diff = (mask ^ cur_flags);
1563+ if (flag_diff & DRM_BO_FLAG_CACHED_MAPPED)
1564+ cur_flags |= DRM_BO_FLAG_CACHED_MAPPED;
1565+
1566+ if ((flag_diff & DRM_BO_FLAG_CACHED) &&
1567+ (!(mask & DRM_BO_FLAG_CACHED) ||
1568+ (mask & DRM_BO_FLAG_FORCE_CACHING)))
1569+ return 0;
1570+
1571+ if ((flag_diff & DRM_BO_FLAG_MAPPABLE) &&
1572+ ((mask & DRM_BO_FLAG_MAPPABLE) ||
1573+ (mask & DRM_BO_FLAG_FORCE_MAPPABLE)))
1574+ return 0;
1575+
1576+ *res_mask = cur_flags;
1577+ return 1;
1578+}
1579+
1580+/**
1581+ * Creates space for memory region @mem according to its type.
1582+ *
1583+ * This function first searches for free space in compatible memory types in
1584+ * the priority order defined by the driver. If free space isn't found, then
1585+ * drm_bo_mem_force_space is attempted in priority order to evict and find
1586+ * space.
1587+ */
1588+int drm_bo_mem_space(struct drm_buffer_object *bo,
1589+ struct drm_bo_mem_reg *mem, int no_wait)
1590+{
1591+ struct drm_device *dev = bo->dev;
1592+ struct drm_buffer_manager *bm = &dev->bm;
1593+ struct drm_mem_type_manager *man;
1594+
1595+ uint32_t num_prios = dev->driver->bo_driver->num_mem_type_prio;
1596+ const uint32_t *prios = dev->driver->bo_driver->mem_type_prio;
1597+ uint32_t i;
1598+ uint32_t mem_type = DRM_BO_MEM_LOCAL;
1599+ uint32_t cur_flags;
1600+ int type_found = 0;
1601+ int type_ok = 0;
1602+ int has_eagain = 0;
1603+ struct drm_mm_node *node = NULL;
1604+ int ret;
1605+
1606+ mem->mm_node = NULL;
1607+ for (i = 0; i < num_prios; ++i) {
1608+ mem_type = prios[i];
1609+ man = &bm->man[mem_type];
1610+
1611+ type_ok = drm_bo_mt_compatible(man,
1612+ bo->type == drm_bo_type_user,
1613+ mem_type, mem->mask,
1614+ &cur_flags);
1615+
1616+ if (!type_ok)
1617+ continue;
1618+
1619+ if (mem_type == DRM_BO_MEM_LOCAL)
1620+ break;
1621+
1622+ if ((mem_type == bo->pinned_mem_type) &&
1623+ (bo->pinned_node != NULL)) {
1624+ node = bo->pinned_node;
1625+ break;
1626+ }
1627+
1628+ mutex_lock(&dev->struct_mutex);
1629+ if (man->has_type && man->use_type) {
1630+ type_found = 1;
1631+ node = drm_mm_search_free(&man->manager, mem->num_pages,
1632+ mem->page_alignment, 1);
1633+ if (node)
1634+ node = drm_mm_get_block(node, mem->num_pages,
1635+ mem->page_alignment);
1636+ }
1637+ mutex_unlock(&dev->struct_mutex);
1638+ if (node)
1639+ break;
1640+ }
1641+
1642+ if ((type_ok && (mem_type == DRM_BO_MEM_LOCAL)) || node) {
1643+ mem->mm_node = node;
1644+ mem->mem_type = mem_type;
1645+ mem->flags = cur_flags;
1646+ return 0;
1647+ }
1648+
1649+ if (!type_found)
1650+ return -EINVAL;
1651+
1652+ num_prios = dev->driver->bo_driver->num_mem_busy_prio;
1653+ prios = dev->driver->bo_driver->mem_busy_prio;
1654+
1655+ for (i = 0; i < num_prios; ++i) {
1656+ mem_type = prios[i];
1657+ man = &bm->man[mem_type];
1658+
1659+ if (!man->has_type)
1660+ continue;
1661+
1662+ if (!drm_bo_mt_compatible(man,
1663+ bo->type == drm_bo_type_user,
1664+ mem_type,
1665+ mem->mask,
1666+ &cur_flags))
1667+ continue;
1668+
1669+ ret = drm_bo_mem_force_space(dev, mem, mem_type, no_wait);
1670+
1671+ if (ret == 0 && mem->mm_node) {
1672+ mem->flags = cur_flags;
1673+ return 0;
1674+ }
1675+
1676+ if (ret == -EAGAIN)
1677+ has_eagain = 1;
1678+ }
1679+
1680+ ret = (has_eagain) ? -EAGAIN : -ENOMEM;
1681+ return ret;
1682+}
1683+EXPORT_SYMBOL(drm_bo_mem_space);
1684+
1685+static int drm_bo_new_mask(struct drm_buffer_object *bo,
1686+ uint64_t new_flags, uint64_t used_mask)
1687+{
1688+ uint32_t new_props;
1689+
1690+ if (bo->type == drm_bo_type_user &&
1691+ ((new_flags & (DRM_BO_FLAG_CACHED | DRM_BO_FLAG_FORCE_CACHING)) !=
1692+ (DRM_BO_FLAG_CACHED | DRM_BO_FLAG_FORCE_CACHING))) {
1693+ DRM_ERROR("User buffers require cache-coherent memory.\n");
1694+ return -EINVAL;
1695+ }
1696+
1697+ if ((used_mask & DRM_BO_FLAG_NO_EVICT) && !DRM_SUSER(DRM_CURPROC)) {
1698+ DRM_ERROR("DRM_BO_FLAG_NO_EVICT is only available to priviliged processes.\n");
1699+ return -EPERM;
1700+ }
1701+
1702+ if (likely(used_mask & DRM_BO_MASK_MEM) &&
1703+ (bo->mem.flags & DRM_BO_FLAG_NO_EVICT) &&
1704+ !DRM_SUSER(DRM_CURPROC)) {
1705+ if (likely(bo->mem.flags & new_flags & used_mask &
1706+ DRM_BO_MASK_MEM))
1707+ new_flags = (new_flags & ~DRM_BO_MASK_MEM) |
1708+ (bo->mem.flags & DRM_BO_MASK_MEM);
1709+ else {
1710+ DRM_ERROR("Incompatible memory type specification "
1711+ "for NO_EVICT buffer.\n");
1712+ return -EPERM;
1713+ }
1714+ }
1715+
1716+ if ((new_flags & DRM_BO_FLAG_NO_MOVE)) {
1717+ DRM_ERROR("DRM_BO_FLAG_NO_MOVE is not properly implemented yet.\n");
1718+ return -EPERM;
1719+ }
1720+
1721+ new_props = new_flags & (DRM_BO_FLAG_EXE | DRM_BO_FLAG_WRITE |
1722+ DRM_BO_FLAG_READ);
1723+
1724+ if (!new_props) {
1725+ DRM_ERROR("Invalid buffer object rwx properties\n");
1726+ return -EINVAL;
1727+ }
1728+
1729+ bo->mem.mask = new_flags;
1730+ return 0;
1731+}
1732+
1733+/*
1734+ * Call dev->struct_mutex locked.
1735+ */
1736+
1737+struct drm_buffer_object *drm_lookup_buffer_object(struct drm_file *file_priv,
1738+ uint32_t handle, int check_owner)
1739+{
1740+ struct drm_user_object *uo;
1741+ struct drm_buffer_object *bo;
1742+
1743+ uo = drm_lookup_user_object(file_priv, handle);
1744+
1745+ if (!uo || (uo->type != drm_buffer_type)) {
1746+ DRM_ERROR("Could not find buffer object 0x%08x\n", handle);
1747+ return NULL;
1748+ }
1749+
1750+ if (check_owner && file_priv != uo->owner) {
1751+ if (!drm_lookup_ref_object(file_priv, uo, _DRM_REF_USE))
1752+ return NULL;
1753+ }
1754+
1755+ bo = drm_user_object_entry(uo, struct drm_buffer_object, base);
1756+ atomic_inc(&bo->usage);
1757+ return bo;
1758+}
1759+EXPORT_SYMBOL(drm_lookup_buffer_object);
1760+
1761+/*
1762+ * Call bo->mutex locked.
1763+ * Returns 1 if the buffer is currently rendered to or from. 0 otherwise.
1764+ * Doesn't do any fence flushing as opposed to the drm_bo_busy function.
1765+ */
1766+
1767+static int drm_bo_quick_busy(struct drm_buffer_object *bo)
1768+{
1769+ struct drm_fence_object *fence = bo->fence;
1770+
1771+ BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
1772+ if (fence) {
1773+ if (drm_fence_object_signaled(fence, bo->fence_type)) {
1774+ drm_fence_usage_deref_unlocked(&bo->fence);
1775+ return 0;
1776+ }
1777+ return 1;
1778+ }
1779+ return 0;
1780+}
1781+
1782+/*
1783+ * Call bo->mutex locked.
1784+ * Returns 1 if the buffer is currently rendered to or from. 0 otherwise.
1785+ */
1786+
1787+static int drm_bo_busy(struct drm_buffer_object *bo)
1788+{
1789+ struct drm_fence_object *fence = bo->fence;
1790+
1791+ BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
1792+ if (fence) {
1793+ if (drm_fence_object_signaled(fence, bo->fence_type)) {
1794+ drm_fence_usage_deref_unlocked(&bo->fence);
1795+ return 0;
1796+ }
1797+ drm_fence_object_flush(fence, DRM_FENCE_TYPE_EXE);
1798+ if (drm_fence_object_signaled(fence, bo->fence_type)) {
1799+ drm_fence_usage_deref_unlocked(&bo->fence);
1800+ return 0;
1801+ }
1802+ return 1;
1803+ }
1804+ return 0;
1805+}
1806+
1807+static int drm_bo_evict_cached(struct drm_buffer_object *bo)
1808+{
1809+ int ret = 0;
1810+
1811+ BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
1812+ if (bo->mem.mm_node)
1813+ ret = drm_bo_evict(bo, DRM_BO_MEM_TT, 1);
1814+ return ret;
1815+}
1816+
1817+/*
1818+ * Wait until a buffer is unmapped.
1819+ */
1820+
1821+static int drm_bo_wait_unmapped(struct drm_buffer_object *bo, int no_wait)
1822+{
1823+ int ret = 0;
1824+
1825+ if ((atomic_read(&bo->mapped) >= 0) && no_wait)
1826+ return -EBUSY;
1827+
1828+ DRM_WAIT_ON(ret, bo->event_queue, 3 * DRM_HZ,
1829+ atomic_read(&bo->mapped) == -1);
1830+
1831+ if (ret == -EINTR)
1832+ ret = -EAGAIN;
1833+
1834+ return ret;
1835+}
1836+
1837+static int drm_bo_check_unfenced(struct drm_buffer_object *bo)
1838+{
1839+ int ret;
1840+
1841+ mutex_lock(&bo->mutex);
1842+ ret = (bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
1843+ mutex_unlock(&bo->mutex);
1844+ return ret;
1845+}
1846+
1847+/*
1848+ * Wait until a buffer, scheduled to be fenced moves off the unfenced list.
1849+ * Until then, we cannot really do anything with it except delete it.
1850+ */
1851+
1852+static int drm_bo_wait_unfenced(struct drm_buffer_object *bo, int no_wait,
1853+ int eagain_if_wait)
1854+{
1855+ int ret = (bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
1856+
1857+ if (ret && no_wait)
1858+ return -EBUSY;
1859+ else if (!ret)
1860+ return 0;
1861+
1862+ ret = 0;
1863+ mutex_unlock(&bo->mutex);
1864+ DRM_WAIT_ON(ret, bo->event_queue, 3 * DRM_HZ,
1865+ !drm_bo_check_unfenced(bo));
1866+ mutex_lock(&bo->mutex);
1867+ if (ret == -EINTR)
1868+ return -EAGAIN;
1869+ ret = (bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
1870+ if (ret) {
1871+ DRM_ERROR("Timeout waiting for buffer to become fenced\n");
1872+ return -EBUSY;
1873+ }
1874+ if (eagain_if_wait)
1875+ return -EAGAIN;
1876+
1877+ return 0;
1878+}
1879+
1880+/*
1881+ * Fill in the ioctl reply argument with buffer info.
1882+ * Bo locked.
1883+ */
1884+
1885+void drm_bo_fill_rep_arg(struct drm_buffer_object *bo,
1886+ struct drm_bo_info_rep *rep)
1887+{
1888+ if (!rep)
1889+ return;
1890+
1891+ rep->handle = bo->base.hash.key;
1892+ rep->flags = bo->mem.flags;
1893+ rep->size = bo->num_pages * PAGE_SIZE;
1894+ rep->offset = bo->offset;
1895+
1896+ if (bo->type == drm_bo_type_dc)
1897+ rep->arg_handle = bo->map_list.user_token;
1898+ else
1899+ rep->arg_handle = 0;
1900+
1901+ rep->mask = bo->mem.mask;
1902+ rep->buffer_start = bo->buffer_start;
1903+ rep->fence_flags = bo->fence_type;
1904+ rep->rep_flags = 0;
1905+ rep->page_alignment = bo->mem.page_alignment;
1906+
1907+ if ((bo->priv_flags & _DRM_BO_FLAG_UNFENCED) || drm_bo_quick_busy(bo)) {
1908+ DRM_FLAG_MASKED(rep->rep_flags, DRM_BO_REP_BUSY,
1909+ DRM_BO_REP_BUSY);
1910+ }
1911+}
1912+EXPORT_SYMBOL(drm_bo_fill_rep_arg);
1913+
1914+/*
1915+ * Wait for buffer idle and register that we've mapped the buffer.
1916+ * Mapping is registered as a drm_ref_object with type _DRM_REF_TYPE1,
1917+ * so that if the client dies, the mapping is automatically
1918+ * unregistered.
1919+ */
1920+
1921+static int drm_buffer_object_map(struct drm_file *file_priv, uint32_t handle,
1922+ uint32_t map_flags, unsigned hint,
1923+ struct drm_bo_info_rep *rep)
1924+{
1925+ struct drm_buffer_object *bo;
1926+ struct drm_device *dev = file_priv->minor->dev;
1927+ int ret = 0;
1928+ int no_wait = hint & DRM_BO_HINT_DONT_BLOCK;
1929+
1930+ mutex_lock(&dev->struct_mutex);
1931+ bo = drm_lookup_buffer_object(file_priv, handle, 1);
1932+ mutex_unlock(&dev->struct_mutex);
1933+
1934+ if (!bo)
1935+ return -EINVAL;
1936+
1937+ mutex_lock(&bo->mutex);
1938+ ret = drm_bo_wait_unfenced(bo, no_wait, 0);
1939+ if (ret)
1940+ goto out;
1941+
1942+ /*
1943+ * If this returns true, we are currently unmapped.
1944+ * We need to do this test, because unmapping can
1945+ * be done without the bo->mutex held.
1946+ */
1947+
1948+ while (1) {
1949+ if (atomic_inc_and_test(&bo->mapped)) {
1950+ if (no_wait && drm_bo_busy(bo)) {
1951+ atomic_dec(&bo->mapped);
1952+ ret = -EBUSY;
1953+ goto out;
1954+ }
1955+ ret = drm_bo_wait(bo, 0, 0, no_wait);
1956+ if (ret) {
1957+ atomic_dec(&bo->mapped);
1958+ goto out;
1959+ }
1960+
1961+ if (bo->mem.flags & DRM_BO_FLAG_CACHED_MAPPED)
1962+ drm_bo_evict_cached(bo);
1963+
1964+ break;
1965+ } else if (bo->mem.flags & DRM_BO_FLAG_CACHED_MAPPED) {
1966+
1967+ /*
1968+ * We are already mapped with different flags.
1969+ * need to wait for unmap.
1970+ */
1971+
1972+ ret = drm_bo_wait_unmapped(bo, no_wait);
1973+ if (ret)
1974+ goto out;
1975+
1976+ continue;
1977+ }
1978+ break;
1979+ }
1980+
1981+ mutex_lock(&dev->struct_mutex);
1982+ ret = drm_add_ref_object(file_priv, &bo->base, _DRM_REF_TYPE1);
1983+ mutex_unlock(&dev->struct_mutex);
1984+ if (ret) {
1985+ if (atomic_add_negative(-1, &bo->mapped))
1986+ wake_up_all(&bo->event_queue);
1987+
1988+ } else
1989+ drm_bo_fill_rep_arg(bo, rep);
1990+out:
1991+ mutex_unlock(&bo->mutex);
1992+ drm_bo_usage_deref_unlocked(&bo);
1993+ return ret;
1994+}
1995+
1996+static int drm_buffer_object_unmap(struct drm_file *file_priv, uint32_t handle)
1997+{
1998+ struct drm_device *dev = file_priv->minor->dev;
1999+ struct drm_buffer_object *bo;
2000+ struct drm_ref_object *ro;
2001+ int ret = 0;
2002+
2003+ mutex_lock(&dev->struct_mutex);
2004+
2005+ bo = drm_lookup_buffer_object(file_priv, handle, 1);
2006+ if (!bo) {
2007+ ret = -EINVAL;
2008+ goto out;
2009+ }
2010+
2011+ ro = drm_lookup_ref_object(file_priv, &bo->base, _DRM_REF_TYPE1);
2012+ if (!ro) {
2013+ ret = -EINVAL;
2014+ goto out;
2015+ }
2016+
2017+ drm_remove_ref_object(file_priv, ro);
2018+ drm_bo_usage_deref_locked(&bo);
2019+out:
2020+ mutex_unlock(&dev->struct_mutex);
2021+ return ret;
2022+}
2023+
2024+/*
2025+ * Call struct-sem locked.
2026+ */
2027+
2028+static void drm_buffer_user_object_unmap(struct drm_file *file_priv,
2029+ struct drm_user_object *uo,
2030+ enum drm_ref_type action)
2031+{
2032+ struct drm_buffer_object *bo =
2033+ drm_user_object_entry(uo, struct drm_buffer_object, base);
2034+
2035+ /*
2036+ * We DON'T want to take the bo->lock here, because we want to
2037+ * hold it when we wait for unmapped buffer.
2038+ */
2039+
2040+ BUG_ON(action != _DRM_REF_TYPE1);
2041+
2042+ if (atomic_add_negative(-1, &bo->mapped))
2043+ wake_up_all(&bo->event_queue);
2044+}
2045+
2046+/*
2047+ * bo->mutex locked.
2048+ * Note that new_mem_flags are NOT transferred to the bo->mem.mask.
2049+ */
2050+
2051+int drm_bo_move_buffer(struct drm_buffer_object *bo, uint64_t new_mem_flags,
2052+ int no_wait, int move_unfenced)
2053+{
2054+ struct drm_device *dev = bo->dev;
2055+ struct drm_buffer_manager *bm = &dev->bm;
2056+ int ret = 0;
2057+ struct drm_bo_mem_reg mem;
2058+ /*
2059+ * Flush outstanding fences.
2060+ */
2061+
2062+ drm_bo_busy(bo);
2063+
2064+ /*
2065+ * Wait for outstanding fences.
2066+ */
2067+
2068+ ret = drm_bo_wait(bo, 0, 0, no_wait);
2069+ if (ret)
2070+ return ret;
2071+
2072+ mem.num_pages = bo->num_pages;
2073+ mem.size = mem.num_pages << PAGE_SHIFT;
2074+ mem.mask = new_mem_flags;
2075+ mem.page_alignment = bo->mem.page_alignment;
2076+
2077+ mutex_lock(&bm->evict_mutex);
2078+ mutex_lock(&dev->struct_mutex);
2079+ list_del_init(&bo->lru);
2080+ mutex_unlock(&dev->struct_mutex);
2081+
2082+ /*
2083+ * Determine where to move the buffer.
2084+ */
2085+ ret = drm_bo_mem_space(bo, &mem, no_wait);
2086+ if (ret)
2087+ goto out_unlock;
2088+
2089+ ret = drm_bo_handle_move_mem(bo, &mem, 0, no_wait);
2090+
2091+out_unlock:
2092+ mutex_lock(&dev->struct_mutex);
2093+ if (ret || !move_unfenced) {
2094+ if (mem.mm_node) {
2095+ if (mem.mm_node != bo->pinned_node)
2096+ drm_mm_put_block(mem.mm_node);
2097+ mem.mm_node = NULL;
2098+ }
2099+ drm_bo_add_to_lru(bo);
2100+ if (bo->priv_flags & _DRM_BO_FLAG_UNFENCED) {
2101+ wake_up_all(&bo->event_queue);
2102+ DRM_FLAG_MASKED(bo->priv_flags, 0,
2103+ _DRM_BO_FLAG_UNFENCED);
2104+ }
2105+ } else {
2106+ list_add_tail(&bo->lru, &bm->unfenced);
2107+ DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_UNFENCED,
2108+ _DRM_BO_FLAG_UNFENCED);
2109+ }
2110+ mutex_unlock(&dev->struct_mutex);
2111+ mutex_unlock(&bm->evict_mutex);
2112+ return ret;
2113+}
2114+
2115+static int drm_bo_mem_compat(struct drm_bo_mem_reg *mem)
2116+{
2117+ uint32_t flag_diff = (mem->mask ^ mem->flags);
2118+
2119+ if ((mem->mask & mem->flags & DRM_BO_MASK_MEM) == 0)
2120+ return 0;
2121+ if ((flag_diff & DRM_BO_FLAG_CACHED) &&
2122+ (/* !(mem->mask & DRM_BO_FLAG_CACHED) ||*/
2123+ (mem->mask & DRM_BO_FLAG_FORCE_CACHING)))
2124+ return 0;
2125+
2126+ if ((flag_diff & DRM_BO_FLAG_MAPPABLE) &&
2127+ ((mem->mask & DRM_BO_FLAG_MAPPABLE) ||
2128+ (mem->mask & DRM_BO_FLAG_FORCE_MAPPABLE)))
2129+ return 0;
2130+ return 1;
2131+}
2132+
2133+/*
2134+ * bo locked.
2135+ */
2136+
2137+static int drm_buffer_object_validate(struct drm_buffer_object *bo,
2138+ uint32_t fence_class,
2139+ int move_unfenced, int no_wait)
2140+{
2141+ struct drm_device *dev = bo->dev;
2142+ struct drm_buffer_manager *bm = &dev->bm;
2143+ struct drm_bo_driver *driver = dev->driver->bo_driver;
2144+ uint32_t ftype;
2145+ int ret;
2146+
2147+ DRM_DEBUG("New flags 0x%016llx, Old flags 0x%016llx\n",
2148+ (unsigned long long) bo->mem.mask,
2149+ (unsigned long long) bo->mem.flags);
2150+
2151+ ret = driver->fence_type(bo, &fence_class, &ftype);
2152+
2153+ if (ret) {
2154+ DRM_ERROR("Driver did not support given buffer permissions\n");
2155+ return ret;
2156+ }
2157+
2158+ /*
2159+ * We're switching command submission mechanism,
2160+ * or cannot simply rely on the hardware serializing for us.
2161+ *
2162+ * Insert a driver-dependant barrier or wait for buffer idle.
2163+ */
2164+
2165+ if ((fence_class != bo->fence_class) ||
2166+ ((ftype ^ bo->fence_type) & bo->fence_type)) {
2167+
2168+ ret = -EINVAL;
2169+ if (driver->command_stream_barrier) {
2170+ ret = driver->command_stream_barrier(bo,
2171+ fence_class,
2172+ ftype,
2173+ no_wait);
2174+ }
2175+ if (ret)
2176+ ret = drm_bo_wait(bo, 0, 0, no_wait);
2177+
2178+ if (ret)
2179+ return ret;
2180+
2181+ }
2182+
2183+ bo->new_fence_class = fence_class;
2184+ bo->new_fence_type = ftype;
2185+
2186+ ret = drm_bo_wait_unmapped(bo, no_wait);
2187+ if (ret) {
2188+ DRM_ERROR("Timed out waiting for buffer unmap.\n");
2189+ return ret;
2190+ }
2191+
2192+ /*
2193+ * Check whether we need to move buffer.
2194+ */
2195+
2196+ if (!drm_bo_mem_compat(&bo->mem)) {
2197+ ret = drm_bo_move_buffer(bo, bo->mem.mask, no_wait,
2198+ move_unfenced);
2199+ if (ret) {
2200+ if (ret != -EAGAIN)
2201+ DRM_ERROR("Failed moving buffer.\n");
2202+ if (ret == -ENOMEM)
2203+ DRM_ERROR("Out of aperture space.\n");
2204+ return ret;
2205+ }
2206+ }
2207+
2208+ /*
2209+ * Pinned buffers.
2210+ */
2211+
2212+ if (bo->mem.mask & (DRM_BO_FLAG_NO_EVICT | DRM_BO_FLAG_NO_MOVE)) {
2213+ bo->pinned_mem_type = bo->mem.mem_type;
2214+ mutex_lock(&dev->struct_mutex);
2215+ list_del_init(&bo->pinned_lru);
2216+ drm_bo_add_to_pinned_lru(bo);
2217+
2218+ if (bo->pinned_node != bo->mem.mm_node) {
2219+ if (bo->pinned_node != NULL)
2220+ drm_mm_put_block(bo->pinned_node);
2221+ bo->pinned_node = bo->mem.mm_node;
2222+ }
2223+
2224+ mutex_unlock(&dev->struct_mutex);
2225+
2226+ } else if (bo->pinned_node != NULL) {
2227+
2228+ mutex_lock(&dev->struct_mutex);
2229+
2230+ if (bo->pinned_node != bo->mem.mm_node)
2231+ drm_mm_put_block(bo->pinned_node);
2232+
2233+ list_del_init(&bo->pinned_lru);
2234+ bo->pinned_node = NULL;
2235+ mutex_unlock(&dev->struct_mutex);
2236+
2237+ }
2238+
2239+ /*
2240+ * We might need to add a TTM.
2241+ */
2242+
2243+ if (bo->mem.mem_type == DRM_BO_MEM_LOCAL && bo->ttm == NULL) {
2244+ ret = drm_bo_add_ttm(bo);
2245+ if (ret)
2246+ return ret;
2247+ }
2248+ DRM_FLAG_MASKED(bo->mem.flags, bo->mem.mask, ~DRM_BO_MASK_MEMTYPE);
2249+
2250+ /*
2251+ * Finally, adjust lru to be sure.
2252+ */
2253+
2254+ mutex_lock(&dev->struct_mutex);
2255+ list_del(&bo->lru);
2256+ if (move_unfenced) {
2257+ list_add_tail(&bo->lru, &bm->unfenced);
2258+ DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_UNFENCED,
2259+ _DRM_BO_FLAG_UNFENCED);
2260+ } else {
2261+ drm_bo_add_to_lru(bo);
2262+ if (bo->priv_flags & _DRM_BO_FLAG_UNFENCED) {
2263+ wake_up_all(&bo->event_queue);
2264+ DRM_FLAG_MASKED(bo->priv_flags, 0,
2265+ _DRM_BO_FLAG_UNFENCED);
2266+ }
2267+ }
2268+ mutex_unlock(&dev->struct_mutex);
2269+
2270+ return 0;
2271+}
2272+
2273+int drm_bo_do_validate(struct drm_buffer_object *bo,
2274+ uint64_t flags, uint64_t mask, uint32_t hint,
2275+ uint32_t fence_class,
2276+ int no_wait,
2277+ struct drm_bo_info_rep *rep)
2278+{
2279+ int ret;
2280+
2281+ mutex_lock(&bo->mutex);
2282+ ret = drm_bo_wait_unfenced(bo, no_wait, 0);
2283+
2284+ if (ret)
2285+ goto out;
2286+
2287+ DRM_FLAG_MASKED(flags, bo->mem.mask, ~mask);
2288+ ret = drm_bo_new_mask(bo, flags, mask);
2289+ if (ret)
2290+ goto out;
2291+
2292+ ret = drm_buffer_object_validate(bo,
2293+ fence_class,
2294+ !(hint & DRM_BO_HINT_DONT_FENCE),
2295+ no_wait);
2296+out:
2297+ if (rep)
2298+ drm_bo_fill_rep_arg(bo, rep);
2299+
2300+ mutex_unlock(&bo->mutex);
2301+ return ret;
2302+}
2303+EXPORT_SYMBOL(drm_bo_do_validate);
2304+
2305+
2306+int drm_bo_handle_validate(struct drm_file *file_priv, uint32_t handle,
2307+ uint32_t fence_class,
2308+ uint64_t flags, uint64_t mask,
2309+ uint32_t hint,
2310+ int use_old_fence_class,
2311+ struct drm_bo_info_rep *rep,
2312+ struct drm_buffer_object **bo_rep)
2313+{
2314+ struct drm_device *dev = file_priv->minor->dev;
2315+ struct drm_buffer_object *bo;
2316+ int ret;
2317+ int no_wait = hint & DRM_BO_HINT_DONT_BLOCK;
2318+
2319+ mutex_lock(&dev->struct_mutex);
2320+ bo = drm_lookup_buffer_object(file_priv, handle, 1);
2321+ mutex_unlock(&dev->struct_mutex);
2322+
2323+ if (!bo)
2324+ return -EINVAL;
2325+
2326+ if (use_old_fence_class)
2327+ fence_class = bo->fence_class;
2328+
2329+ /*
2330+ * Only allow creator to change shared buffer mask.
2331+ */
2332+
2333+ if (bo->base.owner != file_priv)
2334+ mask &= ~(DRM_BO_FLAG_NO_EVICT | DRM_BO_FLAG_NO_MOVE);
2335+
2336+
2337+ ret = drm_bo_do_validate(bo, flags, mask, hint, fence_class,
2338+ no_wait, rep);
2339+
2340+ if (!ret && bo_rep)
2341+ *bo_rep = bo;
2342+ else
2343+ drm_bo_usage_deref_unlocked(&bo);
2344+
2345+ return ret;
2346+}
2347+EXPORT_SYMBOL(drm_bo_handle_validate);
2348+
2349+static int drm_bo_handle_info(struct drm_file *file_priv, uint32_t handle,
2350+ struct drm_bo_info_rep *rep)
2351+{
2352+ struct drm_device *dev = file_priv->minor->dev;
2353+ struct drm_buffer_object *bo;
2354+
2355+ mutex_lock(&dev->struct_mutex);
2356+ bo = drm_lookup_buffer_object(file_priv, handle, 1);
2357+ mutex_unlock(&dev->struct_mutex);
2358+
2359+ if (!bo)
2360+ return -EINVAL;
2361+
2362+ mutex_lock(&bo->mutex);
2363+ if (!(bo->priv_flags & _DRM_BO_FLAG_UNFENCED))
2364+ (void)drm_bo_busy(bo);
2365+ drm_bo_fill_rep_arg(bo, rep);
2366+ mutex_unlock(&bo->mutex);
2367+ drm_bo_usage_deref_unlocked(&bo);
2368+ return 0;
2369+}
2370+
2371+static int drm_bo_handle_wait(struct drm_file *file_priv, uint32_t handle,
2372+ uint32_t hint,
2373+ struct drm_bo_info_rep *rep)
2374+{
2375+ struct drm_device *dev = file_priv->minor->dev;
2376+ struct drm_buffer_object *bo;
2377+ int no_wait = hint & DRM_BO_HINT_DONT_BLOCK;
2378+ int ret;
2379+
2380+ mutex_lock(&dev->struct_mutex);
2381+ bo = drm_lookup_buffer_object(file_priv, handle, 1);
2382+ mutex_unlock(&dev->struct_mutex);
2383+
2384+ if (!bo)
2385+ return -EINVAL;
2386+
2387+ mutex_lock(&bo->mutex);
2388+ ret = drm_bo_wait_unfenced(bo, no_wait, 0);
2389+ if (ret)
2390+ goto out;
2391+ ret = drm_bo_wait(bo, hint & DRM_BO_HINT_WAIT_LAZY, 0, no_wait);
2392+ if (ret)
2393+ goto out;
2394+
2395+ drm_bo_fill_rep_arg(bo, rep);
2396+
2397+out:
2398+ mutex_unlock(&bo->mutex);
2399+ drm_bo_usage_deref_unlocked(&bo);
2400+ return ret;
2401+}
2402+
2403+static inline size_t drm_size_align(size_t size)
2404+{
2405+ size_t tmpSize = 4;
2406+ if (size > PAGE_SIZE)
2407+ return PAGE_ALIGN(size);
2408+ while (tmpSize < size)
2409+ tmpSize <<= 1;
2410+
2411+ return (size_t) tmpSize;
2412+}
2413+
2414+static int drm_bo_reserve_size(struct drm_device *dev,
2415+ int user_bo,
2416+ unsigned long num_pages,
2417+ unsigned long *size)
2418+{
2419+ struct drm_bo_driver *driver = dev->driver->bo_driver;
2420+
2421+ *size = drm_size_align(sizeof(struct drm_buffer_object)) +
2422+ /* Always account for a TTM, even for fixed memory types */
2423+ drm_ttm_size(dev, num_pages, user_bo) +
2424+ /* user space mapping structure */
2425+ drm_size_align(sizeof(drm_local_map_t)) +
2426+ /* file offset space, aperture space, pinned space */
2427+ 3*drm_size_align(sizeof(struct drm_mm_node *)) +
2428+ /* ttm backend */
2429+ driver->backend_size(dev, num_pages);
2430+
2431+ // FIXME - ENOMEM?
2432+ return 0;
2433+}
2434+
2435+int drm_buffer_object_create(struct drm_device *dev,
2436+ unsigned long size,
2437+ enum drm_bo_type type,
2438+ uint64_t mask,
2439+ uint32_t hint,
2440+ uint32_t page_alignment,
2441+ unsigned long buffer_start,
2442+ struct drm_buffer_object **buf_obj)
2443+{
2444+ struct drm_buffer_manager *bm = &dev->bm;
2445+ struct drm_buffer_object *bo;
2446+ int ret = 0;
2447+ unsigned long num_pages;
2448+ unsigned long reserved_size;
2449+
2450+ size += buffer_start & ~PAGE_MASK;
2451+ num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
2452+ if (num_pages == 0) {
2453+ DRM_ERROR("Illegal buffer object size.\n");
2454+ return -EINVAL;
2455+ }
2456+
2457+ ret = drm_bo_reserve_size(dev, type == drm_bo_type_user,
2458+ num_pages, &reserved_size);
2459+
2460+ if (ret) {
2461+ DRM_DEBUG("Failed reserving space for buffer object.\n");
2462+ return ret;
2463+ }
2464+
2465+ bo = drm_calloc(1, sizeof(*bo), DRM_MEM_BUFOBJ);
2466+
2467+ if (!bo) {
2468+ drm_bo_unreserve_size(num_pages);
2469+ return -ENOMEM;
2470+ }
2471+
2472+ mutex_init(&bo->mutex);
2473+ mutex_lock(&bo->mutex);
2474+
2475+ bo->reserved_size = reserved_size;
2476+ atomic_set(&bo->usage, 1);
2477+ atomic_set(&bo->mapped, -1);
2478+ DRM_INIT_WAITQUEUE(&bo->event_queue);
2479+ INIT_LIST_HEAD(&bo->lru);
2480+ INIT_LIST_HEAD(&bo->pinned_lru);
2481+ INIT_LIST_HEAD(&bo->ddestroy);
2482+#ifdef DRM_ODD_MM_COMPAT
2483+ INIT_LIST_HEAD(&bo->p_mm_list);
2484+ INIT_LIST_HEAD(&bo->vma_list);
2485+#endif
2486+ bo->dev = dev;
2487+ bo->type = type;
2488+ bo->num_pages = num_pages;
2489+ bo->mem.mem_type = DRM_BO_MEM_LOCAL;
2490+ bo->mem.num_pages = bo->num_pages;
2491+ bo->mem.mm_node = NULL;
2492+ bo->mem.page_alignment = page_alignment;
2493+ bo->buffer_start = buffer_start & PAGE_MASK;
2494+ bo->priv_flags = 0;
2495+ bo->mem.flags = DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_CACHED |
2496+ DRM_BO_FLAG_MAPPABLE;
2497+ bo->mem.mask = DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_CACHED |
2498+ DRM_BO_FLAG_MAPPABLE;
2499+ atomic_inc(&bm->count);
2500+ ret = drm_bo_new_mask(bo, mask, mask);
2501+ if (ret)
2502+ goto out_err;
2503+
2504+ if (bo->type == drm_bo_type_dc) {
2505+ mutex_lock(&dev->struct_mutex);
2506+ ret = drm_bo_setup_vm_locked(bo);
2507+ mutex_unlock(&dev->struct_mutex);
2508+ if (ret)
2509+ goto out_err;
2510+ }
2511+
2512+ ret = drm_buffer_object_validate(bo, 0, 0, hint & DRM_BO_HINT_DONT_BLOCK);
2513+ if (ret)
2514+ goto out_err;
2515+
2516+ mutex_unlock(&bo->mutex);
2517+ *buf_obj = bo;
2518+ return 0;
2519+
2520+out_err:
2521+ mutex_unlock(&bo->mutex);
2522+
2523+ drm_bo_usage_deref_unlocked(&bo);
2524+ return ret;
2525+}
2526+EXPORT_SYMBOL(drm_buffer_object_create);
2527+
2528+
2529+static int drm_bo_add_user_object(struct drm_file *file_priv,
2530+ struct drm_buffer_object *bo, int shareable)
2531+{
2532+ struct drm_device *dev = file_priv->minor->dev;
2533+ int ret;
2534+
2535+ mutex_lock(&dev->struct_mutex);
2536+ ret = drm_add_user_object(file_priv, &bo->base, shareable);
2537+ if (ret)
2538+ goto out;
2539+
2540+ bo->base.remove = drm_bo_base_deref_locked;
2541+ bo->base.type = drm_buffer_type;
2542+ bo->base.ref_struct_locked = NULL;
2543+ bo->base.unref = drm_buffer_user_object_unmap;
2544+
2545+out:
2546+ mutex_unlock(&dev->struct_mutex);
2547+ return ret;
2548+}
2549+
2550+int drm_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2551+{
2552+ struct drm_bo_create_arg *arg = data;
2553+ struct drm_bo_create_req *req = &arg->d.req;
2554+ struct drm_bo_info_rep *rep = &arg->d.rep;
2555+ struct drm_buffer_object *entry;
2556+ enum drm_bo_type bo_type;
2557+ int ret = 0;
2558+
2559+ DRM_DEBUG("drm_bo_create_ioctl: %dkb, %dkb align\n",
2560+ (int)(req->size / 1024), req->page_alignment * 4);
2561+
2562+ if (!dev->bm.initialized) {
2563+ DRM_ERROR("Buffer object manager is not initialized.\n");
2564+ return -EINVAL;
2565+ }
2566+
2567+ bo_type = (req->buffer_start) ? drm_bo_type_user : drm_bo_type_dc;
2568+
2569+ if (bo_type == drm_bo_type_user)
2570+ req->mask &= ~DRM_BO_FLAG_SHAREABLE;
2571+
2572+ ret = drm_buffer_object_create(file_priv->minor->dev,
2573+ req->size, bo_type, req->mask,
2574+ req->hint, req->page_alignment,
2575+ req->buffer_start, &entry);
2576+ if (ret)
2577+ goto out;
2578+
2579+ ret = drm_bo_add_user_object(file_priv, entry,
2580+ req->mask & DRM_BO_FLAG_SHAREABLE);
2581+ if (ret) {
2582+ drm_bo_usage_deref_unlocked(&entry);
2583+ goto out;
2584+ }
2585+
2586+ mutex_lock(&entry->mutex);
2587+ drm_bo_fill_rep_arg(entry, rep);
2588+ mutex_unlock(&entry->mutex);
2589+
2590+out:
2591+ return ret;
2592+}
2593+
2594+int drm_bo_setstatus_ioctl(struct drm_device *dev,
2595+ void *data, struct drm_file *file_priv)
2596+{
2597+ struct drm_bo_map_wait_idle_arg *arg = data;
2598+ struct drm_bo_info_req *req = &arg->d.req;
2599+ struct drm_bo_info_rep *rep = &arg->d.rep;
2600+ int ret;
2601+
2602+ if (!dev->bm.initialized) {
2603+ DRM_ERROR("Buffer object manager is not initialized.\n");
2604+ return -EINVAL;
2605+ }
2606+
2607+ ret = drm_bo_read_lock(&dev->bm.bm_lock);
2608+ if (ret)
2609+ return ret;
2610+
2611+ ret = drm_bo_handle_validate(file_priv, req->handle, req->fence_class,
2612+ req->flags,
2613+ req->mask,
2614+ req->hint | DRM_BO_HINT_DONT_FENCE,
2615+ 1,
2616+ rep, NULL);
2617+
2618+ (void) drm_bo_read_unlock(&dev->bm.bm_lock);
2619+ if (ret)
2620+ return ret;
2621+
2622+ return 0;
2623+}
2624+
2625+int drm_bo_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2626+{
2627+ struct drm_bo_map_wait_idle_arg *arg = data;
2628+ struct drm_bo_info_req *req = &arg->d.req;
2629+ struct drm_bo_info_rep *rep = &arg->d.rep;
2630+ int ret;
2631+ if (!dev->bm.initialized) {
2632+ DRM_ERROR("Buffer object manager is not initialized.\n");
2633+ return -EINVAL;
2634+ }
2635+
2636+ ret = drm_buffer_object_map(file_priv, req->handle, req->mask,
2637+ req->hint, rep);
2638+ if (ret)
2639+ return ret;
2640+
2641+ return 0;
2642+}
2643+
2644+int drm_bo_unmap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2645+{
2646+ struct drm_bo_handle_arg *arg = data;
2647+ int ret;
2648+ if (!dev->bm.initialized) {
2649+ DRM_ERROR("Buffer object manager is not initialized.\n");
2650+ return -EINVAL;
2651+ }
2652+
2653+ ret = drm_buffer_object_unmap(file_priv, arg->handle);
2654+ return ret;
2655+}
2656+
2657+
2658+int drm_bo_reference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2659+{
2660+ struct drm_bo_reference_info_arg *arg = data;
2661+ struct drm_bo_handle_arg *req = &arg->d.req;
2662+ struct drm_bo_info_rep *rep = &arg->d.rep;
2663+ struct drm_user_object *uo;
2664+ int ret;
2665+
2666+ if (!dev->bm.initialized) {
2667+ DRM_ERROR("Buffer object manager is not initialized.\n");
2668+ return -EINVAL;
2669+ }
2670+
2671+ ret = drm_user_object_ref(file_priv, req->handle,
2672+ drm_buffer_type, &uo);
2673+ if (ret)
2674+ return ret;
2675+
2676+ ret = drm_bo_handle_info(file_priv, req->handle, rep);
2677+ if (ret)
2678+ return ret;
2679+
2680+ return 0;
2681+}
2682+
2683+int drm_bo_unreference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2684+{
2685+ struct drm_bo_handle_arg *arg = data;
2686+ int ret = 0;
2687+
2688+ if (!dev->bm.initialized) {
2689+ DRM_ERROR("Buffer object manager is not initialized.\n");
2690+ return -EINVAL;
2691+ }
2692+
2693+ ret = drm_user_object_unref(file_priv, arg->handle, drm_buffer_type);
2694+ return ret;
2695+}
2696+
2697+int drm_bo_info_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2698+{
2699+ struct drm_bo_reference_info_arg *arg = data;
2700+ struct drm_bo_handle_arg *req = &arg->d.req;
2701+ struct drm_bo_info_rep *rep = &arg->d.rep;
2702+ int ret;
2703+
2704+ if (!dev->bm.initialized) {
2705+ DRM_ERROR("Buffer object manager is not initialized.\n");
2706+ return -EINVAL;
2707+ }
2708+
2709+ ret = drm_bo_handle_info(file_priv, req->handle, rep);
2710+ if (ret)
2711+ return ret;
2712+
2713+ return 0;
2714+}
2715+
2716+int drm_bo_wait_idle_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
2717+{
2718+ struct drm_bo_map_wait_idle_arg *arg = data;
2719+ struct drm_bo_info_req *req = &arg->d.req;
2720+ struct drm_bo_info_rep *rep = &arg->d.rep;
2721+ int ret;
2722+ if (!dev->bm.initialized) {
2723+ DRM_ERROR("Buffer object manager is not initialized.\n");
2724+ return -EINVAL;
2725+ }
2726+
2727+ ret = drm_bo_handle_wait(file_priv, req->handle,
2728+ req->hint, rep);
2729+ if (ret)
2730+ return ret;
2731+
2732+ return 0;
2733+}
2734+
2735+static int drm_bo_leave_list(struct drm_buffer_object *bo,
2736+ uint32_t mem_type,
2737+ int free_pinned,
2738+ int allow_errors)
2739+{
2740+ struct drm_device *dev = bo->dev;
2741+ int ret = 0;
2742+
2743+ mutex_lock(&bo->mutex);
2744+
2745+ ret = drm_bo_expire_fence(bo, allow_errors);
2746+ if (ret)
2747+ goto out;
2748+
2749+ if (free_pinned) {
2750+ DRM_FLAG_MASKED(bo->mem.flags, 0, DRM_BO_FLAG_NO_MOVE);
2751+ mutex_lock(&dev->struct_mutex);
2752+ list_del_init(&bo->pinned_lru);
2753+ if (bo->pinned_node == bo->mem.mm_node)
2754+ bo->pinned_node = NULL;
2755+ if (bo->pinned_node != NULL) {
2756+ drm_mm_put_block(bo->pinned_node);
2757+ bo->pinned_node = NULL;
2758+ }
2759+ mutex_unlock(&dev->struct_mutex);
2760+ }
2761+
2762+ if (bo->mem.flags & DRM_BO_FLAG_NO_EVICT) {
2763+ DRM_ERROR("A DRM_BO_NO_EVICT buffer present at "
2764+ "cleanup. Removing flag and evicting.\n");
2765+ bo->mem.flags &= ~DRM_BO_FLAG_NO_EVICT;
2766+ bo->mem.mask &= ~DRM_BO_FLAG_NO_EVICT;
2767+ }
2768+
2769+ if (bo->mem.mem_type == mem_type)
2770+ ret = drm_bo_evict(bo, mem_type, 0);
2771+
2772+ if (ret) {
2773+ if (allow_errors) {
2774+ goto out;
2775+ } else {
2776+ ret = 0;
2777+ DRM_ERROR("Cleanup eviction failed\n");
2778+ }
2779+ }
2780+
2781+out:
2782+ mutex_unlock(&bo->mutex);
2783+ return ret;
2784+}
2785+
2786+
2787+static struct drm_buffer_object *drm_bo_entry(struct list_head *list,
2788+ int pinned_list)
2789+{
2790+ if (pinned_list)
2791+ return list_entry(list, struct drm_buffer_object, pinned_lru);
2792+ else
2793+ return list_entry(list, struct drm_buffer_object, lru);
2794+}
2795+
2796+/*
2797+ * dev->struct_mutex locked.
2798+ */
2799+
2800+static int drm_bo_force_list_clean(struct drm_device *dev,
2801+ struct list_head *head,
2802+ unsigned mem_type,
2803+ int free_pinned,
2804+ int allow_errors,
2805+ int pinned_list)
2806+{
2807+ struct list_head *list, *next, *prev;
2808+ struct drm_buffer_object *entry, *nentry;
2809+ int ret;
2810+ int do_restart;
2811+
2812+ /*
2813+ * The list traversal is a bit odd here, because an item may
2814+ * disappear from the list when we release the struct_mutex or
2815+ * when we decrease the usage count. Also we're not guaranteed
2816+ * to drain pinned lists, so we can't always restart.
2817+ */
2818+
2819+restart:
2820+ nentry = NULL;
2821+ list_for_each_safe(list, next, head) {
2822+ prev = list->prev;
2823+
2824+ entry = (nentry != NULL) ? nentry: drm_bo_entry(list, pinned_list);
2825+ atomic_inc(&entry->usage);
2826+ if (nentry) {
2827+ atomic_dec(&nentry->usage);
2828+ nentry = NULL;
2829+ }
2830+
2831+ /*
2832+ * Protect the next item from destruction, so we can check
2833+ * its list pointers later on.
2834+ */
2835+
2836+ if (next != head) {
2837+ nentry = drm_bo_entry(next, pinned_list);
2838+ atomic_inc(&nentry->usage);
2839+ }
2840+ mutex_unlock(&dev->struct_mutex);
2841+
2842+ ret = drm_bo_leave_list(entry, mem_type, free_pinned,
2843+ allow_errors);
2844+ mutex_lock(&dev->struct_mutex);
2845+
2846+ drm_bo_usage_deref_locked(&entry);
2847+ if (ret)
2848+ return ret;
2849+
2850+ /*
2851+ * Has the next item disappeared from the list?
2852+ */
2853+
2854+ do_restart = ((next->prev != list) && (next->prev != prev));
2855+
2856+ if (nentry != NULL && do_restart)
2857+ drm_bo_usage_deref_locked(&nentry);
2858+
2859+ if (do_restart)
2860+ goto restart;
2861+ }
2862+ return 0;
2863+}
2864+
2865+int drm_bo_clean_mm(struct drm_device *dev, unsigned mem_type)
2866+{
2867+ struct drm_buffer_manager *bm = &dev->bm;
2868+ struct drm_mem_type_manager *man = &bm->man[mem_type];
2869+ int ret = -EINVAL;
2870+
2871+ if (mem_type >= DRM_BO_MEM_TYPES) {
2872+ DRM_ERROR("Illegal memory type %d\n", mem_type);
2873+ return ret;
2874+ }
2875+
2876+ if (!man->has_type) {
2877+ DRM_ERROR("Trying to take down uninitialized "
2878+ "memory manager type %u\n", mem_type);
2879+ return ret;
2880+ }
2881+ man->use_type = 0;
2882+ man->has_type = 0;
2883+
2884+ ret = 0;
2885+ if (mem_type > 0) {
2886+ BUG_ON(!list_empty(&bm->unfenced));
2887+ drm_bo_force_list_clean(dev, &man->lru, mem_type, 1, 0, 0);
2888+ drm_bo_force_list_clean(dev, &man->pinned, mem_type, 1, 0, 1);
2889+
2890+ if (drm_mm_clean(&man->manager)) {
2891+ drm_mm_takedown(&man->manager);
2892+ } else {
2893+ ret = -EBUSY;
2894+ }
2895+ }
2896+
2897+ return ret;
2898+}
2899+EXPORT_SYMBOL(drm_bo_clean_mm);
2900+
2901+/**
2902+ *Evict all buffers of a particular mem_type, but leave memory manager
2903+ *regions for NO_MOVE buffers intact. New buffers cannot be added at this
2904+ *point since we have the hardware lock.
2905+ */
2906+
2907+static int drm_bo_lock_mm(struct drm_device *dev, unsigned mem_type)
2908+{
2909+ int ret;
2910+ struct drm_buffer_manager *bm = &dev->bm;
2911+ struct drm_mem_type_manager *man = &bm->man[mem_type];
2912+
2913+ if (mem_type == 0 || mem_type >= DRM_BO_MEM_TYPES) {
2914+ DRM_ERROR("Illegal memory manager memory type %u.\n", mem_type);
2915+ return -EINVAL;
2916+ }
2917+
2918+ if (!man->has_type) {
2919+ DRM_ERROR("Memory type %u has not been initialized.\n",
2920+ mem_type);
2921+ return 0;
2922+ }
2923+
2924+ ret = drm_bo_force_list_clean(dev, &man->lru, mem_type, 0, 1, 0);
2925+ if (ret)
2926+ return ret;
2927+ ret = drm_bo_force_list_clean(dev, &man->pinned, mem_type, 0, 1, 1);
2928+
2929+ return ret;
2930+}
2931+
2932+int drm_bo_init_mm(struct drm_device *dev,
2933+ unsigned type,
2934+ unsigned long p_offset, unsigned long p_size)
2935+{
2936+ struct drm_buffer_manager *bm = &dev->bm;
2937+ int ret = -EINVAL;
2938+ struct drm_mem_type_manager *man;
2939+
2940+ if (type >= DRM_BO_MEM_TYPES) {
2941+ DRM_ERROR("Illegal memory type %d\n", type);
2942+ return ret;
2943+ }
2944+
2945+ man = &bm->man[type];
2946+ if (man->has_type) {
2947+ DRM_ERROR("Memory manager already initialized for type %d\n",
2948+ type);
2949+ return ret;
2950+ }
2951+
2952+ ret = dev->driver->bo_driver->init_mem_type(dev, type, man);
2953+ if (ret)
2954+ return ret;
2955+
2956+ ret = 0;
2957+ if (type != DRM_BO_MEM_LOCAL) {
2958+ if (!p_size) {
2959+ DRM_ERROR("Zero size memory manager type %d\n", type);
2960+ return ret;
2961+ }
2962+ ret = drm_mm_init(&man->manager, p_offset, p_size);
2963+ if (ret)
2964+ return ret;
2965+ }
2966+ man->has_type = 1;
2967+ man->use_type = 1;
2968+
2969+ INIT_LIST_HEAD(&man->lru);
2970+ INIT_LIST_HEAD(&man->pinned);
2971+
2972+ return 0;
2973+}
2974+EXPORT_SYMBOL(drm_bo_init_mm);
2975+
2976+/*
2977+ * This function is intended to be called on drm driver unload.
2978+ * If you decide to call it from lastclose, you must protect the call
2979+ * from a potentially racing drm_bo_driver_init in firstopen.
2980+ * (This may happen on X server restart).
2981+ */
2982+
2983+int drm_bo_driver_finish(struct drm_device *dev)
2984+{
2985+ struct drm_buffer_manager *bm = &dev->bm;
2986+ int ret = 0;
2987+ unsigned i = DRM_BO_MEM_TYPES;
2988+ struct drm_mem_type_manager *man;
2989+
2990+ mutex_lock(&dev->struct_mutex);
2991+
2992+ if (!bm->initialized)
2993+ goto out;
2994+ bm->initialized = 0;
2995+
2996+ while (i--) {
2997+ man = &bm->man[i];
2998+ if (man->has_type) {
2999+ man->use_type = 0;
3000+ if ((i != DRM_BO_MEM_LOCAL) && drm_bo_clean_mm(dev, i)) {
3001+ ret = -EBUSY;
3002+ DRM_ERROR("DRM memory manager type %d "
3003+ "is not clean.\n", i);
3004+ }
3005+ man->has_type = 0;
3006+ }
3007+ }
3008+ mutex_unlock(&dev->struct_mutex);
3009+
3010+ if (!cancel_delayed_work(&bm->wq))
3011+ flush_scheduled_work();
3012+
3013+ mutex_lock(&dev->struct_mutex);
3014+ drm_bo_delayed_delete(dev, 1);
3015+ if (list_empty(&bm->ddestroy))
3016+ DRM_DEBUG("Delayed destroy list was clean\n");
3017+
3018+ if (list_empty(&bm->man[0].lru))
3019+ DRM_DEBUG("Swap list was clean\n");
3020+
3021+ if (list_empty(&bm->man[0].pinned))
3022+ DRM_DEBUG("NO_MOVE list was clean\n");
3023+
3024+ if (list_empty(&bm->unfenced))
3025+ DRM_DEBUG("Unfenced list was clean\n");
3026+
3027+ __free_page(bm->dummy_read_page);
3028+
3029+out:
3030+ mutex_unlock(&dev->struct_mutex);
3031+ return ret;
3032+}
3033+EXPORT_SYMBOL(drm_bo_driver_finish);
3034+
3035+/*
3036+ * This function is intended to be called on drm driver load.
3037+ * If you decide to call it from firstopen, you must protect the call
3038+ * from a potentially racing drm_bo_driver_finish in lastclose.
3039+ * (This may happen on X server restart).
3040+ */
3041+
3042+int drm_bo_driver_init(struct drm_device *dev)
3043+{
3044+ struct drm_bo_driver *driver = dev->driver->bo_driver;
3045+ struct drm_buffer_manager *bm = &dev->bm;
3046+ int ret = -EINVAL;
3047+
3048+ bm->dummy_read_page = NULL;
3049+ drm_bo_init_lock(&bm->bm_lock);
3050+ mutex_lock(&dev->struct_mutex);
3051+ if (!driver)
3052+ goto out_unlock;
3053+
3054+ bm->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
3055+ if (!bm->dummy_read_page) {
3056+ ret = -ENOMEM;
3057+ goto out_unlock;
3058+ }
3059+
3060+
3061+ /*
3062+ * Initialize the system memory buffer type.
3063+ * Other types need to be driver / IOCTL initialized.
3064+ */
3065+ ret = drm_bo_init_mm(dev, DRM_BO_MEM_LOCAL, 0, 0);
3066+ if (ret)
3067+ goto out_unlock;
3068+
3069+ INIT_DELAYED_WORK(&bm->wq, drm_bo_delayed_workqueue);
3070+
3071+ bm->initialized = 1;
3072+ bm->nice_mode = 1;
3073+ atomic_set(&bm->count, 0);
3074+ bm->cur_pages = 0;
3075+ INIT_LIST_HEAD(&bm->unfenced);
3076+ INIT_LIST_HEAD(&bm->ddestroy);
3077+out_unlock:
3078+ mutex_unlock(&dev->struct_mutex);
3079+ return ret;
3080+}
3081+EXPORT_SYMBOL(drm_bo_driver_init);
3082+
3083+int drm_mm_init_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
3084+{
3085+ struct drm_mm_init_arg *arg = data;
3086+ struct drm_buffer_manager *bm = &dev->bm;
3087+ struct drm_bo_driver *driver = dev->driver->bo_driver;
3088+ int ret;
3089+
3090+ if (!driver) {
3091+ DRM_ERROR("Buffer objects are not supported by this driver\n");
3092+ return -EINVAL;
3093+ }
3094+
3095+ ret = drm_bo_write_lock(&bm->bm_lock, file_priv);
3096+ if (ret)
3097+ return ret;
3098+
3099+ ret = -EINVAL;
3100+ if (arg->magic != DRM_BO_INIT_MAGIC) {
3101+ DRM_ERROR("You are using an old libdrm that is not compatible with\n"
3102+ "\tthe kernel DRM module. Please upgrade your libdrm.\n");
3103+ return -EINVAL;
3104+ }
3105+ if (arg->major != DRM_BO_INIT_MAJOR) {
3106+ DRM_ERROR("libdrm and kernel DRM buffer object interface major\n"
3107+ "\tversion don't match. Got %d, expected %d.\n",
3108+ arg->major, DRM_BO_INIT_MAJOR);
3109+ return -EINVAL;
3110+ }
3111+
3112+ mutex_lock(&dev->struct_mutex);
3113+ if (!bm->initialized) {
3114+ DRM_ERROR("DRM memory manager was not initialized.\n");
3115+ goto out;
3116+ }
3117+ if (arg->mem_type == 0) {
3118+ DRM_ERROR("System memory buffers already initialized.\n");
3119+ goto out;
3120+ }
3121+ ret = drm_bo_init_mm(dev, arg->mem_type,
3122+ arg->p_offset, arg->p_size);
3123+
3124+out:
3125+ mutex_unlock(&dev->struct_mutex);
3126+ (void) drm_bo_write_unlock(&bm->bm_lock, file_priv);
3127+
3128+ if (ret)
3129+ return ret;
3130+
3131+ return 0;
3132+}
3133+
3134+int drm_mm_takedown_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
3135+{
3136+ struct drm_mm_type_arg *arg = data;
3137+ struct drm_buffer_manager *bm = &dev->bm;
3138+ struct drm_bo_driver *driver = dev->driver->bo_driver;
3139+ int ret;
3140+
3141+ if (!driver) {
3142+ DRM_ERROR("Buffer objects are not supported by this driver\n");
3143+ return -EINVAL;
3144+ }
3145+
3146+ ret = drm_bo_write_lock(&bm->bm_lock, file_priv);
3147+ if (ret)
3148+ return ret;
3149+
3150+ mutex_lock(&dev->struct_mutex);
3151+ ret = -EINVAL;
3152+ if (!bm->initialized) {
3153+ DRM_ERROR("DRM memory manager was not initialized\n");
3154+ goto out;
3155+ }
3156+ if (arg->mem_type == 0) {
3157+ DRM_ERROR("No takedown for System memory buffers.\n");
3158+ goto out;
3159+ }
3160+ ret = 0;
3161+ if (drm_bo_clean_mm(dev, arg->mem_type)) {
3162+ DRM_ERROR("Memory manager type %d not clean. "
3163+ "Delaying takedown\n", arg->mem_type);
3164+ }
3165+out:
3166+ mutex_unlock(&dev->struct_mutex);
3167+ (void) drm_bo_write_unlock(&bm->bm_lock, file_priv);
3168+
3169+ if (ret)
3170+ return ret;
3171+
3172+ return 0;
3173+}
3174+
3175+int drm_mm_lock_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
3176+{
3177+ struct drm_mm_type_arg *arg = data;
3178+ struct drm_bo_driver *driver = dev->driver->bo_driver;
3179+ int ret;
3180+
3181+ if (!driver) {
3182+ DRM_ERROR("Buffer objects are not supported by this driver\n");
3183+ return -EINVAL;
3184+ }
3185+
3186+ if (arg->lock_flags & DRM_BO_LOCK_IGNORE_NO_EVICT) {
3187+ DRM_ERROR("Lock flag DRM_BO_LOCK_IGNORE_NO_EVICT not supported yet.\n");
3188+ return -EINVAL;
3189+ }
3190+
3191+ if (arg->lock_flags & DRM_BO_LOCK_UNLOCK_BM) {
3192+ ret = drm_bo_write_lock(&dev->bm.bm_lock, file_priv);
3193+ if (ret)
3194+ return ret;
3195+ }
3196+
3197+ mutex_lock(&dev->struct_mutex);
3198+ ret = drm_bo_lock_mm(dev, arg->mem_type);
3199+ mutex_unlock(&dev->struct_mutex);
3200+ if (ret) {
3201+ (void) drm_bo_write_unlock(&dev->bm.bm_lock, file_priv);
3202+ return ret;
3203+ }
3204+
3205+ return 0;
3206+}
3207+
3208+int drm_mm_unlock_ioctl(struct drm_device *dev,
3209+ void *data,
3210+ struct drm_file *file_priv)
3211+{
3212+ struct drm_mm_type_arg *arg = data;
3213+ struct drm_bo_driver *driver = dev->driver->bo_driver;
3214+ int ret;
3215+
3216+ if (!driver) {
3217+ DRM_ERROR("Buffer objects are not supported by this driver\n");
3218+ return -EINVAL;
3219+ }
3220+
3221+ if (arg->lock_flags & DRM_BO_LOCK_UNLOCK_BM) {
3222+ ret = drm_bo_write_unlock(&dev->bm.bm_lock, file_priv);
3223+ if (ret)
3224+ return ret;
3225+ }
3226+
3227+ return 0;
3228+}
3229+
3230+/*
3231+ * buffer object vm functions.
3232+ */
3233+
3234+int drm_mem_reg_is_pci(struct drm_device *dev, struct drm_bo_mem_reg *mem)
3235+{
3236+ struct drm_buffer_manager *bm = &dev->bm;
3237+ struct drm_mem_type_manager *man = &bm->man[mem->mem_type];
3238+
3239+ if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) {
3240+ if (mem->mem_type == DRM_BO_MEM_LOCAL)
3241+ return 0;
3242+
3243+ if (man->flags & _DRM_FLAG_MEMTYPE_CMA)
3244+ return 0;
3245+
3246+ if (mem->flags & DRM_BO_FLAG_CACHED)
3247+ return 0;
3248+ }
3249+ return 1;
3250+}
3251+EXPORT_SYMBOL(drm_mem_reg_is_pci);
3252+
3253+/**
3254+ * \c Get the PCI offset for the buffer object memory.
3255+ *
3256+ * \param bo The buffer object.
3257+ * \param bus_base On return the base of the PCI region
3258+ * \param bus_offset On return the byte offset into the PCI region
3259+ * \param bus_size On return the byte size of the buffer object or zero if
3260+ * the buffer object memory is not accessible through a PCI region.
3261+ * \return Failure indication.
3262+ *
3263+ * Returns -EINVAL if the buffer object is currently not mappable.
3264+ * Otherwise returns zero.
3265+ */
3266+
3267+int drm_bo_pci_offset(struct drm_device *dev,
3268+ struct drm_bo_mem_reg *mem,
3269+ unsigned long *bus_base,
3270+ unsigned long *bus_offset, unsigned long *bus_size)
3271+{
3272+ struct drm_buffer_manager *bm = &dev->bm;
3273+ struct drm_mem_type_manager *man = &bm->man[mem->mem_type];
3274+
3275+ *bus_size = 0;
3276+ if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE))
3277+ return -EINVAL;
3278+
3279+ if (drm_mem_reg_is_pci(dev, mem)) {
3280+ *bus_offset = mem->mm_node->start << PAGE_SHIFT;
3281+ *bus_size = mem->num_pages << PAGE_SHIFT;
3282+ *bus_base = man->io_offset;
3283+ }
3284+
3285+ return 0;
3286+}
3287+
3288+/**
3289+ * \c Kill all user-space virtual mappings of this buffer object.
3290+ *
3291+ * \param bo The buffer object.
3292+ *
3293+ * Call bo->mutex locked.
3294+ */
3295+
3296+void drm_bo_unmap_virtual(struct drm_buffer_object *bo)
3297+{
3298+ struct drm_device *dev = bo->dev;
3299+ loff_t offset = ((loff_t) bo->map_list.hash.key) << PAGE_SHIFT;
3300+ loff_t holelen = ((loff_t) bo->mem.num_pages) << PAGE_SHIFT;
3301+
3302+ if (!dev->dev_mapping)
3303+ return;
3304+
3305+ unmap_mapping_range(dev->dev_mapping, offset, holelen, 1);
3306+}
3307+
3308+static void drm_bo_takedown_vm_locked(struct drm_buffer_object *bo)
3309+{
3310+ struct drm_map_list *list;
3311+ drm_local_map_t *map;
3312+ struct drm_device *dev = bo->dev;
3313+
3314+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
3315+ if (bo->type != drm_bo_type_dc)
3316+ return;
3317+
3318+ list = &bo->map_list;
3319+ if (list->user_token) {
3320+ drm_ht_remove_item(&dev->map_hash, &list->hash);
3321+ list->user_token = 0;
3322+ }
3323+ if (list->file_offset_node) {
3324+ drm_mm_put_block(list->file_offset_node);
3325+ list->file_offset_node = NULL;
3326+ }
3327+
3328+ map = list->map;
3329+ if (!map)
3330+ return;
3331+
3332+ drm_free(map, sizeof(*map), DRM_MEM_BUFOBJ);
3333+ list->map = NULL;
3334+ list->user_token = 0ULL;
3335+ drm_bo_usage_deref_locked(&bo);
3336+}
3337+
3338+static int drm_bo_setup_vm_locked(struct drm_buffer_object *bo)
3339+{
3340+ struct drm_map_list *list = &bo->map_list;
3341+ drm_local_map_t *map;
3342+ struct drm_device *dev = bo->dev;
3343+
3344+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
3345+ list->map = drm_calloc(1, sizeof(*map), DRM_MEM_BUFOBJ);
3346+ if (!list->map)
3347+ return -ENOMEM;
3348+
3349+ map = list->map;
3350+ map->offset = 0;
3351+ map->type = _DRM_TTM;
3352+ map->flags = _DRM_REMOVABLE;
3353+ map->size = bo->mem.num_pages * PAGE_SIZE;
3354+ atomic_inc(&bo->usage);
3355+ map->handle = (void *)bo;
3356+
3357+ list->file_offset_node = drm_mm_search_free(&dev->offset_manager,
3358+ bo->mem.num_pages, 0, 0);
3359+
3360+ if (!list->file_offset_node) {
3361+ drm_bo_takedown_vm_locked(bo);
3362+ return -ENOMEM;
3363+ }
3364+
3365+ list->file_offset_node = drm_mm_get_block(list->file_offset_node,
3366+ bo->mem.num_pages, 0);
3367+ if (!list->file_offset_node) {
3368+ drm_bo_takedown_vm_locked(bo);
3369+ return -ENOMEM;
3370+ }
3371+
3372+ list->hash.key = list->file_offset_node->start;
3373+ if (drm_ht_insert_item(&dev->map_hash, &list->hash)) {
3374+ drm_bo_takedown_vm_locked(bo);
3375+ return -ENOMEM;
3376+ }
3377+
3378+ list->user_token = ((uint64_t) list->hash.key) << PAGE_SHIFT;
3379+
3380+ return 0;
3381+}
3382+
3383+int drm_bo_version_ioctl(struct drm_device *dev, void *data,
3384+ struct drm_file *file_priv)
3385+{
3386+ struct drm_bo_version_arg *arg = (struct drm_bo_version_arg *)data;
3387+
3388+ arg->major = DRM_BO_INIT_MAJOR;
3389+ arg->minor = DRM_BO_INIT_MINOR;
3390+ arg->patchlevel = DRM_BO_INIT_PATCH;
3391+
3392+ return 0;
3393+}
3394Index: linux-2.6.28/drivers/gpu/drm/drm_bo_lock.c
3395===================================================================
3396--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3397+++ linux-2.6.28/drivers/gpu/drm/drm_bo_lock.c 2009-02-20 12:23:06.000000000 +0000
3398@@ -0,0 +1,175 @@
3399+/**************************************************************************
3400+ *
3401+ * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
3402+ * All Rights Reserved.
3403+ *
3404+ * Permission is hereby granted, free of charge, to any person obtaining a
3405+ * copy of this software and associated documentation files (the
3406+ * "Software"), to deal in the Software without restriction, including
3407+ * without limitation the rights to use, copy, modify, merge, publish,
3408+ * distribute, sub license, and/or sell copies of the Software, and to
3409+ * permit persons to whom the Software is furnished to do so, subject to
3410+ * the following conditions:
3411+ *
3412+ * The above copyright notice and this permission notice (including the
3413+ * next paragraph) shall be included in all copies or substantial portions
3414+ * of the Software.
3415+ *
3416+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3417+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3418+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
3419+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
3420+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
3421+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
3422+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
3423+ *
3424+ **************************************************************************/
3425+/*
3426+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
3427+ */
3428+
3429+/*
3430+ * This file implements a simple replacement for the buffer manager use
3431+ * of the heavyweight hardware lock.
3432+ * The lock is a read-write lock. Taking it in read mode is fast, and
3433+ * intended for in-kernel use only.
3434+ * Taking it in write mode is slow.
3435+ *
3436+ * The write mode is used only when there is a need to block all
3437+ * user-space processes from allocating a
3438+ * new memory area.
3439+ * Typical use in write mode is X server VT switching, and it's allowed
3440+ * to leave kernel space with the write lock held. If a user-space process
3441+ * dies while having the write-lock, it will be released during the file
3442+ * descriptor release.
3443+ *
3444+ * The read lock is typically placed at the start of an IOCTL- or
3445+ * user-space callable function that may end up allocating a memory area.
3446+ * This includes setstatus, super-ioctls and no_pfn; the latter may move
3447+ * unmappable regions to mappable. It's a bug to leave kernel space with the
3448+ * read lock held.
3449+ *
3450+ * Both read- and write lock taking is interruptible for low signal-delivery
3451+ * latency. The locking functions will return -EAGAIN if interrupted by a
3452+ * signal.
3453+ *
3454+ * Locking order: The lock should be taken BEFORE any kernel mutexes
3455+ * or spinlocks.
3456+ */
3457+
3458+#include "drmP.h"
3459+
3460+void drm_bo_init_lock(struct drm_bo_lock *lock)
3461+{
3462+ DRM_INIT_WAITQUEUE(&lock->queue);
3463+ atomic_set(&lock->write_lock_pending, 0);
3464+ atomic_set(&lock->readers, 0);
3465+}
3466+
3467+void drm_bo_read_unlock(struct drm_bo_lock *lock)
3468+{
3469+ if (unlikely(atomic_add_negative(-1, &lock->readers)))
3470+ BUG();
3471+ if (atomic_read(&lock->readers) == 0)
3472+ wake_up_interruptible(&lock->queue);
3473+}
3474+EXPORT_SYMBOL(drm_bo_read_unlock);
3475+
3476+int drm_bo_read_lock(struct drm_bo_lock *lock)
3477+{
3478+ while (unlikely(atomic_read(&lock->write_lock_pending) != 0)) {
3479+ int ret;
3480+ ret = wait_event_interruptible
3481+ (lock->queue, atomic_read(&lock->write_lock_pending) == 0);
3482+ if (ret)
3483+ return -EAGAIN;
3484+ }
3485+
3486+ while (unlikely(!atomic_add_unless(&lock->readers, 1, -1))) {
3487+ int ret;
3488+ ret = wait_event_interruptible
3489+ (lock->queue, atomic_add_unless(&lock->readers, 1, -1));
3490+ if (ret)
3491+ return -EAGAIN;
3492+ }
3493+ return 0;
3494+}
3495+EXPORT_SYMBOL(drm_bo_read_lock);
3496+
3497+static int __drm_bo_write_unlock(struct drm_bo_lock *lock)
3498+{
3499+ if (unlikely(atomic_cmpxchg(&lock->readers, -1, 0) != -1))
3500+ return -EINVAL;
3501+ if (unlikely(atomic_cmpxchg(&lock->write_lock_pending, 1, 0) != 1))
3502+ return -EINVAL;
3503+ wake_up_interruptible(&lock->queue);
3504+ return 0;
3505+}
3506+
3507+static void drm_bo_write_lock_remove(struct drm_file *file_priv,
3508+ struct drm_user_object *item)
3509+{
3510+ struct drm_bo_lock *lock = container_of(item, struct drm_bo_lock, base);
3511+ int ret;
3512+
3513+ ret = __drm_bo_write_unlock(lock);
3514+ BUG_ON(ret);
3515+}
3516+
3517+int drm_bo_write_lock(struct drm_bo_lock *lock, struct drm_file *file_priv)
3518+{
3519+ int ret = 0;
3520+ struct drm_device *dev;
3521+
3522+ if (unlikely(atomic_cmpxchg(&lock->write_lock_pending, 0, 1) != 0))
3523+ return -EINVAL;
3524+
3525+ while (unlikely(atomic_cmpxchg(&lock->readers, 0, -1) != 0)) {
3526+ ret = wait_event_interruptible
3527+ (lock->queue, atomic_cmpxchg(&lock->readers, 0, -1) == 0);
3528+
3529+ if (ret) {
3530+ atomic_set(&lock->write_lock_pending, 0);
3531+ wake_up_interruptible(&lock->queue);
3532+ return -EAGAIN;
3533+ }
3534+ }
3535+
3536+ /*
3537+ * Add a dummy user-object, the destructor of which will
3538+ * make sure the lock is released if the client dies
3539+ * while holding it.
3540+ */
3541+
3542+ dev = file_priv->minor->dev;
3543+ mutex_lock(&dev->struct_mutex);
3544+ ret = drm_add_user_object(file_priv, &lock->base, 0);
3545+ lock->base.remove = &drm_bo_write_lock_remove;
3546+ lock->base.type = drm_lock_type;
3547+ if (ret)
3548+ (void)__drm_bo_write_unlock(lock);
3549+
3550+ mutex_unlock(&dev->struct_mutex);
3551+
3552+ return ret;
3553+}
3554+
3555+int drm_bo_write_unlock(struct drm_bo_lock *lock, struct drm_file *file_priv)
3556+{
3557+ struct drm_device *dev = file_priv->minor->dev;
3558+ struct drm_ref_object *ro;
3559+
3560+ mutex_lock(&dev->struct_mutex);
3561+
3562+ if (lock->base.owner != file_priv) {
3563+ mutex_unlock(&dev->struct_mutex);
3564+ return -EINVAL;
3565+ }
3566+ ro = drm_lookup_ref_object(file_priv, &lock->base, _DRM_REF_USE);
3567+ BUG_ON(!ro);
3568+ drm_remove_ref_object(file_priv, ro);
3569+ lock->base.owner = NULL;
3570+
3571+ mutex_unlock(&dev->struct_mutex);
3572+ return 0;
3573+}
3574Index: linux-2.6.28/drivers/gpu/drm/drm_bo_move.c
3575===================================================================
3576--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3577+++ linux-2.6.28/drivers/gpu/drm/drm_bo_move.c 2009-02-20 12:23:06.000000000 +0000
3578@@ -0,0 +1,590 @@
3579+/**************************************************************************
3580+ *
3581+ * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
3582+ * All Rights Reserved.
3583+ *
3584+ * Permission is hereby granted, free of charge, to any person obtaining a
3585+ * copy of this software and associated documentation files (the
3586+ * "Software"), to deal in the Software without restriction, including
3587+ * without limitation the rights to use, copy, modify, merge, publish,
3588+ * distribute, sub license, and/or sell copies of the Software, and to
3589+ * permit persons to whom the Software is furnished to do so, subject to
3590+ * the following conditions:
3591+ *
3592+ * The above copyright notice and this permission notice (including the
3593+ * next paragraph) shall be included in all copies or substantial portions
3594+ * of the Software.
3595+ *
3596+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3597+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3598+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
3599+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
3600+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
3601+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
3602+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
3603+ *
3604+ **************************************************************************/
3605+/*
3606+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
3607+ */
3608+
3609+#include "drmP.h"
3610+
3611+/**
3612+ * Free the old memory node unless it's a pinned region and we
3613+ * have not been requested to free also pinned regions.
3614+ */
3615+
3616+static void drm_bo_free_old_node(struct drm_buffer_object *bo)
3617+{
3618+ struct drm_bo_mem_reg *old_mem = &bo->mem;
3619+
3620+ if (old_mem->mm_node && (old_mem->mm_node != bo->pinned_node)) {
3621+ mutex_lock(&bo->dev->struct_mutex);
3622+ drm_mm_put_block(old_mem->mm_node);
3623+ mutex_unlock(&bo->dev->struct_mutex);
3624+ }
3625+ old_mem->mm_node = NULL;
3626+}
3627+
3628+int drm_bo_move_ttm(struct drm_buffer_object *bo,
3629+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem)
3630+{
3631+ struct drm_ttm *ttm = bo->ttm;
3632+ struct drm_bo_mem_reg *old_mem = &bo->mem;
3633+ uint64_t save_flags = old_mem->flags;
3634+ uint64_t save_mask = old_mem->mask;
3635+ int ret;
3636+
3637+ if (old_mem->mem_type != DRM_BO_MEM_LOCAL) {
3638+ if (evict)
3639+ drm_ttm_evict(ttm);
3640+ else
3641+ drm_ttm_unbind(ttm);
3642+
3643+ drm_bo_free_old_node(bo);
3644+ DRM_FLAG_MASKED(old_mem->flags,
3645+ DRM_BO_FLAG_CACHED | DRM_BO_FLAG_MAPPABLE |
3646+ DRM_BO_FLAG_MEM_LOCAL, DRM_BO_MASK_MEMTYPE);
3647+ old_mem->mem_type = DRM_BO_MEM_LOCAL;
3648+ save_flags = old_mem->flags;
3649+ }
3650+ if (new_mem->mem_type != DRM_BO_MEM_LOCAL) {
3651+ ret = drm_bind_ttm(ttm, new_mem);
3652+ if (ret)
3653+ return ret;
3654+ }
3655+
3656+ *old_mem = *new_mem;
3657+ new_mem->mm_node = NULL;
3658+ old_mem->mask = save_mask;
3659+ DRM_FLAG_MASKED(save_flags, new_mem->flags, DRM_BO_MASK_MEMTYPE);
3660+ return 0;
3661+}
3662+EXPORT_SYMBOL(drm_bo_move_ttm);
3663+
3664+/**
3665+ * \c Return a kernel virtual address to the buffer object PCI memory.
3666+ *
3667+ * \param bo The buffer object.
3668+ * \return Failure indication.
3669+ *
3670+ * Returns -EINVAL if the buffer object is currently not mappable.
3671+ * Returns -ENOMEM if the ioremap operation failed.
3672+ * Otherwise returns zero.
3673+ *
3674+ * After a successfull call, bo->iomap contains the virtual address, or NULL
3675+ * if the buffer object content is not accessible through PCI space.
3676+ * Call bo->mutex locked.
3677+ */
3678+
3679+int drm_mem_reg_ioremap(struct drm_device *dev, struct drm_bo_mem_reg *mem,
3680+ void **virtual)
3681+{
3682+ struct drm_buffer_manager *bm = &dev->bm;
3683+ struct drm_mem_type_manager *man = &bm->man[mem->mem_type];
3684+ unsigned long bus_offset;
3685+ unsigned long bus_size;
3686+ unsigned long bus_base;
3687+ int ret;
3688+ void *addr;
3689+
3690+ *virtual = NULL;
3691+ ret = drm_bo_pci_offset(dev, mem, &bus_base, &bus_offset, &bus_size);
3692+ if (ret || bus_size == 0)
3693+ return ret;
3694+
3695+ if (!(man->flags & _DRM_FLAG_NEEDS_IOREMAP))
3696+ addr = (void *)(((u8 *) man->io_addr) + bus_offset);
3697+ else {
3698+ addr = ioremap_nocache(bus_base + bus_offset, bus_size);
3699+ if (!addr)
3700+ return -ENOMEM;
3701+ }
3702+ *virtual = addr;
3703+ return 0;
3704+}
3705+EXPORT_SYMBOL(drm_mem_reg_ioremap);
3706+
3707+/**
3708+ * \c Unmap mapping obtained using drm_bo_ioremap
3709+ *
3710+ * \param bo The buffer object.
3711+ *
3712+ * Call bo->mutex locked.
3713+ */
3714+
3715+void drm_mem_reg_iounmap(struct drm_device *dev, struct drm_bo_mem_reg *mem,
3716+ void *virtual)
3717+{
3718+ struct drm_buffer_manager *bm;
3719+ struct drm_mem_type_manager *man;
3720+
3721+ bm = &dev->bm;
3722+ man = &bm->man[mem->mem_type];
3723+
3724+ if (virtual && (man->flags & _DRM_FLAG_NEEDS_IOREMAP))
3725+ iounmap(virtual);
3726+}
3727+EXPORT_SYMBOL(drm_mem_reg_iounmap);
3728+
3729+static int drm_copy_io_page(void *dst, void *src, unsigned long page)
3730+{
3731+ uint32_t *dstP =
3732+ (uint32_t *) ((unsigned long)dst + (page << PAGE_SHIFT));
3733+ uint32_t *srcP =
3734+ (uint32_t *) ((unsigned long)src + (page << PAGE_SHIFT));
3735+
3736+ int i;
3737+ for (i = 0; i < PAGE_SIZE / sizeof(uint32_t); ++i)
3738+ iowrite32(ioread32(srcP++), dstP++);
3739+ return 0;
3740+}
3741+
3742+static int drm_copy_io_ttm_page(struct drm_ttm *ttm, void *src,
3743+ unsigned long page)
3744+{
3745+ struct page *d = drm_ttm_get_page(ttm, page);
3746+ void *dst;
3747+
3748+ if (!d)
3749+ return -ENOMEM;
3750+
3751+ src = (void *)((unsigned long)src + (page << PAGE_SHIFT));
3752+ dst = kmap(d);
3753+ if (!dst)
3754+ return -ENOMEM;
3755+
3756+ memcpy_fromio(dst, src, PAGE_SIZE);
3757+ kunmap(d);
3758+ return 0;
3759+}
3760+
3761+static int drm_copy_ttm_io_page(struct drm_ttm *ttm, void *dst, unsigned long page)
3762+{
3763+ struct page *s = drm_ttm_get_page(ttm, page);
3764+ void *src;
3765+
3766+ if (!s)
3767+ return -ENOMEM;
3768+
3769+ dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT));
3770+ src = kmap(s);
3771+ if (!src)
3772+ return -ENOMEM;
3773+
3774+ memcpy_toio(dst, src, PAGE_SIZE);
3775+ kunmap(s);
3776+ return 0;
3777+}
3778+
3779+int drm_bo_move_memcpy(struct drm_buffer_object *bo,
3780+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem)
3781+{
3782+ struct drm_device *dev = bo->dev;
3783+ struct drm_mem_type_manager *man = &dev->bm.man[new_mem->mem_type];
3784+ struct drm_ttm *ttm = bo->ttm;
3785+ struct drm_bo_mem_reg *old_mem = &bo->mem;
3786+ struct drm_bo_mem_reg old_copy = *old_mem;
3787+ void *old_iomap;
3788+ void *new_iomap;
3789+ int ret;
3790+ uint64_t save_flags = old_mem->flags;
3791+ uint64_t save_mask = old_mem->mask;
3792+ unsigned long i;
3793+ unsigned long page;
3794+ unsigned long add = 0;
3795+ int dir;
3796+
3797+ ret = drm_mem_reg_ioremap(dev, old_mem, &old_iomap);
3798+ if (ret)
3799+ return ret;
3800+ ret = drm_mem_reg_ioremap(dev, new_mem, &new_iomap);
3801+ if (ret)
3802+ goto out;
3803+
3804+ if (old_iomap == NULL && new_iomap == NULL)
3805+ goto out2;
3806+ if (old_iomap == NULL && ttm == NULL)
3807+ goto out2;
3808+
3809+ add = 0;
3810+ dir = 1;
3811+
3812+ if ((old_mem->mem_type == new_mem->mem_type) &&
3813+ (new_mem->mm_node->start <
3814+ old_mem->mm_node->start + old_mem->mm_node->size)) {
3815+ dir = -1;
3816+ add = new_mem->num_pages - 1;
3817+ }
3818+
3819+ for (i = 0; i < new_mem->num_pages; ++i) {
3820+ page = i * dir + add;
3821+ if (old_iomap == NULL)
3822+ ret = drm_copy_ttm_io_page(ttm, new_iomap, page);
3823+ else if (new_iomap == NULL)
3824+ ret = drm_copy_io_ttm_page(ttm, old_iomap, page);
3825+ else
3826+ ret = drm_copy_io_page(new_iomap, old_iomap, page);
3827+ if (ret)
3828+ goto out1;
3829+ }
3830+ mb();
3831+out2:
3832+ drm_bo_free_old_node(bo);
3833+
3834+ *old_mem = *new_mem;
3835+ new_mem->mm_node = NULL;
3836+ old_mem->mask = save_mask;
3837+ DRM_FLAG_MASKED(save_flags, new_mem->flags, DRM_BO_MASK_MEMTYPE);
3838+
3839+ if ((man->flags & _DRM_FLAG_MEMTYPE_FIXED) && (ttm != NULL)) {
3840+ drm_ttm_unbind(ttm);
3841+ drm_destroy_ttm(ttm);
3842+ bo->ttm = NULL;
3843+ }
3844+
3845+out1:
3846+ drm_mem_reg_iounmap(dev, new_mem, new_iomap);
3847+out:
3848+ drm_mem_reg_iounmap(dev, &old_copy, old_iomap);
3849+ return ret;
3850+}
3851+EXPORT_SYMBOL(drm_bo_move_memcpy);
3852+
3853+/*
3854+ * Transfer a buffer object's memory and LRU status to a newly
3855+ * created object. User-space references remains with the old
3856+ * object. Call bo->mutex locked.
3857+ */
3858+
3859+int drm_buffer_object_transfer(struct drm_buffer_object *bo,
3860+ struct drm_buffer_object **new_obj)
3861+{
3862+ struct drm_buffer_object *fbo;
3863+ struct drm_device *dev = bo->dev;
3864+ struct drm_buffer_manager *bm = &dev->bm;
3865+
3866+ fbo = drm_calloc(1, sizeof(*fbo), DRM_MEM_BUFOBJ);
3867+ if (!fbo)
3868+ return -ENOMEM;
3869+
3870+ *fbo = *bo;
3871+ mutex_init(&fbo->mutex);
3872+ mutex_lock(&fbo->mutex);
3873+ mutex_lock(&dev->struct_mutex);
3874+
3875+ DRM_INIT_WAITQUEUE(&bo->event_queue);
3876+ INIT_LIST_HEAD(&fbo->ddestroy);
3877+ INIT_LIST_HEAD(&fbo->lru);
3878+ INIT_LIST_HEAD(&fbo->pinned_lru);
3879+#ifdef DRM_ODD_MM_COMPAT
3880+ INIT_LIST_HEAD(&fbo->vma_list);
3881+ INIT_LIST_HEAD(&fbo->p_mm_list);
3882+#endif
3883+
3884+ fbo->fence = drm_fence_reference_locked(bo->fence);
3885+ fbo->pinned_node = NULL;
3886+ fbo->mem.mm_node->private = (void *)fbo;
3887+ atomic_set(&fbo->usage, 1);
3888+ atomic_inc(&bm->count);
3889+ mutex_unlock(&dev->struct_mutex);
3890+ mutex_unlock(&fbo->mutex);
3891+ bo->reserved_size = 0;
3892+ *new_obj = fbo;
3893+ return 0;
3894+}
3895+
3896+/*
3897+ * Since move is underway, we need to block signals in this function.
3898+ * We cannot restart until it has finished.
3899+ */
3900+
3901+int drm_bo_move_accel_cleanup(struct drm_buffer_object *bo,
3902+ int evict, int no_wait, uint32_t fence_class,
3903+ uint32_t fence_type, uint32_t fence_flags,
3904+ struct drm_bo_mem_reg *new_mem)
3905+{
3906+ struct drm_device *dev = bo->dev;
3907+ struct drm_mem_type_manager *man = &dev->bm.man[new_mem->mem_type];
3908+ struct drm_bo_mem_reg *old_mem = &bo->mem;
3909+ int ret;
3910+ uint64_t save_flags = old_mem->flags;
3911+ uint64_t save_mask = old_mem->mask;
3912+ struct drm_buffer_object *old_obj;
3913+
3914+ if (bo->fence)
3915+ drm_fence_usage_deref_unlocked(&bo->fence);
3916+ ret = drm_fence_object_create(dev, fence_class, fence_type,
3917+ fence_flags | DRM_FENCE_FLAG_EMIT,
3918+ &bo->fence);
3919+ bo->fence_type = fence_type;
3920+ if (ret)
3921+ return ret;
3922+
3923+#ifdef DRM_ODD_MM_COMPAT
3924+ /*
3925+ * In this mode, we don't allow pipelining a copy blit,
3926+ * since the buffer will be accessible from user space
3927+ * the moment we return and rebuild the page tables.
3928+ *
3929+ * With normal vm operation, page tables are rebuilt
3930+ * on demand using fault(), which waits for buffer idle.
3931+ */
3932+ if (1)
3933+#else
3934+ if (evict || ((bo->mem.mm_node == bo->pinned_node) &&
3935+ bo->mem.mm_node != NULL))
3936+#endif
3937+ {
3938+ ret = drm_bo_wait(bo, 0, 1, 0);
3939+ if (ret)
3940+ return ret;
3941+
3942+ drm_bo_free_old_node(bo);
3943+
3944+ if ((man->flags & _DRM_FLAG_MEMTYPE_FIXED) && (bo->ttm != NULL)) {
3945+ drm_ttm_unbind(bo->ttm);
3946+ drm_destroy_ttm(bo->ttm);
3947+ bo->ttm = NULL;
3948+ }
3949+ } else {
3950+
3951+ /* This should help pipeline ordinary buffer moves.
3952+ *
3953+ * Hang old buffer memory on a new buffer object,
3954+ * and leave it to be released when the GPU
3955+ * operation has completed.
3956+ */
3957+
3958+ ret = drm_buffer_object_transfer(bo, &old_obj);
3959+
3960+ if (ret)
3961+ return ret;
3962+
3963+ if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED))
3964+ old_obj->ttm = NULL;
3965+ else
3966+ bo->ttm = NULL;
3967+
3968+ mutex_lock(&dev->struct_mutex);
3969+ list_del_init(&old_obj->lru);
3970+ DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED);
3971+ drm_bo_add_to_lru(old_obj);
3972+
3973+ drm_bo_usage_deref_locked(&old_obj);
3974+ mutex_unlock(&dev->struct_mutex);
3975+
3976+ }
3977+
3978+ *old_mem = *new_mem;
3979+ new_mem->mm_node = NULL;
3980+ old_mem->mask = save_mask;
3981+ DRM_FLAG_MASKED(save_flags, new_mem->flags, DRM_BO_MASK_MEMTYPE);
3982+ return 0;
3983+}
3984+EXPORT_SYMBOL(drm_bo_move_accel_cleanup);
3985+
3986+int drm_bo_same_page(unsigned long offset,
3987+ unsigned long offset2)
3988+{
3989+ return (offset & PAGE_MASK) == (offset2 & PAGE_MASK);
3990+}
3991+EXPORT_SYMBOL(drm_bo_same_page);
3992+
3993+unsigned long drm_bo_offset_end(unsigned long offset,
3994+ unsigned long end)
3995+{
3996+ offset = (offset + PAGE_SIZE) & PAGE_MASK;
3997+ return (end < offset) ? end : offset;
3998+}
3999+EXPORT_SYMBOL(drm_bo_offset_end);
4000+
4001+static pgprot_t drm_kernel_io_prot(uint32_t map_type)
4002+{
4003+ pgprot_t tmp = PAGE_KERNEL;
4004+
4005+#if defined(__i386__) || defined(__x86_64__)
4006+ if (boot_cpu_data.x86 > 3 && map_type != _DRM_AGP) {
4007+ pgprot_val(tmp) |= _PAGE_PCD;
4008+ pgprot_val(tmp) &= ~_PAGE_PWT;
4009+ }
4010+#elif defined(__powerpc__)
4011+ pgprot_val(tmp) |= _PAGE_NO_CACHE;
4012+ if (map_type == _DRM_REGISTERS)
4013+ pgprot_val(tmp) |= _PAGE_GUARDED;
4014+#endif
4015+#if defined(__ia64__)
4016+ if (map_type == _DRM_TTM)
4017+ tmp = pgprot_writecombine(tmp);
4018+ else
4019+ tmp = pgprot_noncached(tmp);
4020+#endif
4021+ return tmp;
4022+}
4023+
4024+static int drm_bo_ioremap(struct drm_buffer_object *bo, unsigned long bus_base,
4025+ unsigned long bus_offset, unsigned long bus_size,
4026+ struct drm_bo_kmap_obj *map)
4027+{
4028+ struct drm_device *dev = bo->dev;
4029+ struct drm_bo_mem_reg *mem = &bo->mem;
4030+ struct drm_mem_type_manager *man = &dev->bm.man[mem->mem_type];
4031+
4032+ if (!(man->flags & _DRM_FLAG_NEEDS_IOREMAP)) {
4033+ map->bo_kmap_type = bo_map_premapped;
4034+ map->virtual = (void *)(((u8 *) man->io_addr) + bus_offset);
4035+ } else {
4036+ map->bo_kmap_type = bo_map_iomap;
4037+ map->virtual = ioremap_nocache(bus_base + bus_offset, bus_size);
4038+ }
4039+ return (!map->virtual) ? -ENOMEM : 0;
4040+}
4041+
4042+static int drm_bo_kmap_ttm(struct drm_buffer_object *bo,
4043+ unsigned long start_page, unsigned long num_pages,
4044+ struct drm_bo_kmap_obj *map)
4045+{
4046+ struct drm_device *dev = bo->dev;
4047+ struct drm_bo_mem_reg *mem = &bo->mem;
4048+ struct drm_mem_type_manager *man = &dev->bm.man[mem->mem_type];
4049+ pgprot_t prot;
4050+ struct drm_ttm *ttm = bo->ttm;
4051+ struct page *d;
4052+ int i;
4053+
4054+ BUG_ON(!ttm);
4055+
4056+ if (num_pages == 1 && (mem->flags & DRM_BO_FLAG_CACHED)) {
4057+
4058+ /*
4059+ * We're mapping a single page, and the desired
4060+ * page protection is consistent with the bo.
4061+ */
4062+
4063+ map->bo_kmap_type = bo_map_kmap;
4064+ map->page = drm_ttm_get_page(ttm, start_page);
4065+ map->virtual = kmap(map->page);
4066+ } else {
4067+ /*
4068+ * Populate the part we're mapping;
4069+ */
4070+
4071+ for (i = start_page; i < start_page + num_pages; ++i) {
4072+ d = drm_ttm_get_page(ttm, i);
4073+ if (!d)
4074+ return -ENOMEM;
4075+ }
4076+
4077+ /*
4078+ * We need to use vmap to get the desired page protection
4079+ * or to make the buffer object look contigous.
4080+ */
4081+
4082+ prot = (mem->flags & DRM_BO_FLAG_CACHED) ?
4083+ PAGE_KERNEL :
4084+ drm_kernel_io_prot(man->drm_bus_maptype);
4085+ map->bo_kmap_type = bo_map_vmap;
4086+ map->virtual = vmap(ttm->pages + start_page,
4087+ num_pages, 0, prot);
4088+ }
4089+ return (!map->virtual) ? -ENOMEM : 0;
4090+}
4091+
4092+/*
4093+ * This function is to be used for kernel mapping of buffer objects.
4094+ * It chooses the appropriate mapping method depending on the memory type
4095+ * and caching policy the buffer currently has.
4096+ * Mapping multiple pages or buffers that live in io memory is a bit slow and
4097+ * consumes vmalloc space. Be restrictive with such mappings.
4098+ * Mapping single pages usually returns the logical kernel address,
4099+ * (which is fast)
4100+ * BUG may use slower temporary mappings for high memory pages or
4101+ * uncached / write-combined pages.
4102+ *
4103+ * The function fills in a drm_bo_kmap_obj which can be used to return the
4104+ * kernel virtual address of the buffer.
4105+ *
4106+ * Code servicing a non-priviliged user request is only allowed to map one
4107+ * page at a time. We might need to implement a better scheme to stop such
4108+ * processes from consuming all vmalloc space.
4109+ */
4110+
4111+int drm_bo_kmap(struct drm_buffer_object *bo, unsigned long start_page,
4112+ unsigned long num_pages, struct drm_bo_kmap_obj *map)
4113+{
4114+ int ret;
4115+ unsigned long bus_base;
4116+ unsigned long bus_offset;
4117+ unsigned long bus_size;
4118+
4119+ map->virtual = NULL;
4120+
4121+ if (num_pages > bo->num_pages)
4122+ return -EINVAL;
4123+ if (start_page > bo->num_pages)
4124+ return -EINVAL;
4125+#if 0
4126+ if (num_pages > 1 && !DRM_SUSER(DRM_CURPROC))
4127+ return -EPERM;
4128+#endif
4129+ ret = drm_bo_pci_offset(bo->dev, &bo->mem, &bus_base,
4130+ &bus_offset, &bus_size);
4131+
4132+ if (ret)
4133+ return ret;
4134+
4135+ if (bus_size == 0) {
4136+ return drm_bo_kmap_ttm(bo, start_page, num_pages, map);
4137+ } else {
4138+ bus_offset += start_page << PAGE_SHIFT;
4139+ bus_size = num_pages << PAGE_SHIFT;
4140+ return drm_bo_ioremap(bo, bus_base, bus_offset, bus_size, map);
4141+ }
4142+}
4143+EXPORT_SYMBOL(drm_bo_kmap);
4144+
4145+void drm_bo_kunmap(struct drm_bo_kmap_obj *map)
4146+{
4147+ if (!map->virtual)
4148+ return;
4149+
4150+ switch (map->bo_kmap_type) {
4151+ case bo_map_iomap:
4152+ iounmap(map->virtual);
4153+ break;
4154+ case bo_map_vmap:
4155+ vunmap(map->virtual);
4156+ break;
4157+ case bo_map_kmap:
4158+ kunmap(map->page);
4159+ break;
4160+ case bo_map_premapped:
4161+ break;
4162+ default:
4163+ BUG();
4164+ }
4165+ map->virtual = NULL;
4166+ map->page = NULL;
4167+}
4168+EXPORT_SYMBOL(drm_bo_kunmap);
4169Index: linux-2.6.28/drivers/gpu/drm/drm_bufs.c
4170===================================================================
4171--- linux-2.6.28.orig/drivers/gpu/drm/drm_bufs.c 2009-02-20 12:22:53.000000000 +0000
4172+++ linux-2.6.28/drivers/gpu/drm/drm_bufs.c 2009-02-20 12:23:06.000000000 +0000
4173@@ -435,6 +435,8 @@
4174 case _DRM_GEM:
4175 DRM_ERROR("tried to rmmap GEM object\n");
4176 break;
4177+ case _DRM_TTM:
4178+ BUG_ON(1);
4179 }
4180 drm_free(map, sizeof(*map), DRM_MEM_MAPS);
4181
4182Index: linux-2.6.28/drivers/gpu/drm/drm_drv.c
4183===================================================================
4184--- linux-2.6.28.orig/drivers/gpu/drm/drm_drv.c 2009-02-20 12:22:53.000000000 +0000
4185+++ linux-2.6.28/drivers/gpu/drm/drm_drv.c 2009-02-20 12:27:53.000000000 +0000
4186@@ -143,6 +143,34 @@
4187 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW),
4188 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW),
4189 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW),
4190+
4191+ DRM_IOCTL_DEF(DRM_IOCTL_MM_INIT, drm_mm_init_ioctl,
4192+ DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
4193+ DRM_IOCTL_DEF(DRM_IOCTL_MM_TAKEDOWN, drm_mm_takedown_ioctl,
4194+ DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
4195+ DRM_IOCTL_DEF(DRM_IOCTL_MM_LOCK, drm_mm_lock_ioctl,
4196+ DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
4197+ DRM_IOCTL_DEF(DRM_IOCTL_MM_UNLOCK, drm_mm_unlock_ioctl,
4198+ DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
4199+
4200+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_CREATE, drm_fence_create_ioctl, DRM_AUTH),
4201+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_REFERENCE, drm_fence_reference_ioctl, DRM_AUTH),
4202+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_UNREFERENCE, drm_fence_unreference_ioctl, DRM_AUTH),
4203+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_SIGNALED, drm_fence_signaled_ioctl, DRM_AUTH),
4204+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_FLUSH, drm_fence_flush_ioctl, DRM_AUTH),
4205+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_WAIT, drm_fence_wait_ioctl, DRM_AUTH),
4206+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_EMIT, drm_fence_emit_ioctl, DRM_AUTH),
4207+ DRM_IOCTL_DEF(DRM_IOCTL_FENCE_BUFFERS, drm_fence_buffers_ioctl, DRM_AUTH),
4208+
4209+ DRM_IOCTL_DEF(DRM_IOCTL_BO_CREATE, drm_bo_create_ioctl, DRM_AUTH),
4210+ DRM_IOCTL_DEF(DRM_IOCTL_BO_MAP, drm_bo_map_ioctl, DRM_AUTH),
4211+ DRM_IOCTL_DEF(DRM_IOCTL_BO_UNMAP, drm_bo_unmap_ioctl, DRM_AUTH),
4212+ DRM_IOCTL_DEF(DRM_IOCTL_BO_REFERENCE, drm_bo_reference_ioctl, DRM_AUTH),
4213+ DRM_IOCTL_DEF(DRM_IOCTL_BO_UNREFERENCE, drm_bo_unreference_ioctl, DRM_AUTH),
4214+ DRM_IOCTL_DEF(DRM_IOCTL_BO_SETSTATUS, drm_bo_setstatus_ioctl, DRM_AUTH),
4215+ DRM_IOCTL_DEF(DRM_IOCTL_BO_INFO, drm_bo_info_ioctl, DRM_AUTH),
4216+ DRM_IOCTL_DEF(DRM_IOCTL_BO_WAIT_IDLE, drm_bo_wait_idle_ioctl, DRM_AUTH),
4217+ DRM_IOCTL_DEF(DRM_IOCTL_BO_VERSION, drm_bo_version_ioctl, 0),
4218 };
4219
4220 #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
4221@@ -317,6 +345,9 @@
4222 if (dev->driver->unload)
4223 dev->driver->unload(dev);
4224
4225+ drm_bo_driver_finish(dev);
4226+ drm_fence_manager_takedown(dev);
4227+
4228 if (drm_core_has_AGP(dev) && dev->agp) {
4229 drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
4230 dev->agp = NULL;
4231@@ -324,6 +355,8 @@
4232
4233 drm_ht_remove(&dev->map_hash);
4234 drm_ctxbitmap_cleanup(dev);
4235+ drm_mm_takedown(&dev->offset_manager);
4236+ drm_ht_remove(&dev->object_hash);
4237
4238 if (drm_core_check_feature(dev, DRIVER_MODESET))
4239 drm_put_minor(&dev->control);
4240@@ -336,6 +369,17 @@
4241 DRM_ERROR("Cannot unload module\n");
4242 }
4243
4244+void drm_cleanup_pci(struct pci_dev *pdev)
4245+{
4246+ struct drm_device *dev = pci_get_drvdata(pdev);
4247+
4248+ pci_set_drvdata(pdev, NULL);
4249+ pci_release_regions(pdev);
4250+ if (dev)
4251+ drm_cleanup(dev);
4252+}
4253+EXPORT_SYMBOL(drm_cleanup_pci);
4254+
4255 void drm_exit(struct drm_driver *driver)
4256 {
4257 struct drm_device *dev, *tmp;
4258Index: linux-2.6.28/drivers/gpu/drm/drm_fence.c
4259===================================================================
4260--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4261+++ linux-2.6.28/drivers/gpu/drm/drm_fence.c 2009-02-20 12:23:06.000000000 +0000
4262@@ -0,0 +1,829 @@
4263+/**************************************************************************
4264+ *
4265+ * Copyright (c) 2006-2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
4266+ * All Rights Reserved.
4267+ *
4268+ * Permission is hereby granted, free of charge, to any person obtaining a
4269+ * copy of this software and associated documentation files (the
4270+ * "Software"), to deal in the Software without restriction, including
4271+ * without limitation the rights to use, copy, modify, merge, publish,
4272+ * distribute, sub license, and/or sell copies of the Software, and to
4273+ * permit persons to whom the Software is furnished to do so, subject to
4274+ * the following conditions:
4275+ *
4276+ * The above copyright notice and this permission notice (including the
4277+ * next paragraph) shall be included in all copies or substantial portions
4278+ * of the Software.
4279+ *
4280+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4281+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4282+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
4283+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
4284+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
4285+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
4286+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
4287+ *
4288+ **************************************************************************/
4289+/*
4290+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
4291+ */
4292+
4293+#include "drmP.h"
4294+
4295+
4296+/*
4297+ * Convenience function to be called by fence::wait methods that
4298+ * need polling.
4299+ */
4300+
4301+int drm_fence_wait_polling(struct drm_fence_object *fence, int lazy,
4302+ int interruptible, uint32_t mask,
4303+ unsigned long end_jiffies)
4304+{
4305+ struct drm_device *dev = fence->dev;
4306+ struct drm_fence_manager *fm = &dev->fm;
4307+ struct drm_fence_class_manager *fc = &fm->fence_class[fence->fence_class];
4308+ uint32_t count = 0;
4309+ int ret;
4310+
4311+ DECLARE_WAITQUEUE(entry, current);
4312+ add_wait_queue(&fc->fence_queue, &entry);
4313+
4314+ ret = 0;
4315+
4316+ for (;;) {
4317+ __set_current_state((interruptible) ?
4318+ TASK_INTERRUPTIBLE :
4319+ TASK_UNINTERRUPTIBLE);
4320+ if (drm_fence_object_signaled(fence, mask))
4321+ break;
4322+ if (time_after_eq(jiffies, end_jiffies)) {
4323+ ret = -EBUSY;
4324+ break;
4325+ }
4326+ if (lazy)
4327+ schedule_timeout(1);
4328+ else if ((++count & 0x0F) == 0){
4329+ __set_current_state(TASK_RUNNING);
4330+ schedule();
4331+ __set_current_state((interruptible) ?
4332+ TASK_INTERRUPTIBLE :
4333+ TASK_UNINTERRUPTIBLE);
4334+ }
4335+ if (interruptible && signal_pending(current)) {
4336+ ret = -EAGAIN;
4337+ break;
4338+ }
4339+ }
4340+ __set_current_state(TASK_RUNNING);
4341+ remove_wait_queue(&fc->fence_queue, &entry);
4342+ return ret;
4343+}
4344+EXPORT_SYMBOL(drm_fence_wait_polling);
4345+
4346+/*
4347+ * Typically called by the IRQ handler.
4348+ */
4349+
4350+void drm_fence_handler(struct drm_device *dev, uint32_t fence_class,
4351+ uint32_t sequence, uint32_t type, uint32_t error)
4352+{
4353+ int wake = 0;
4354+ uint32_t diff;
4355+ uint32_t relevant_type;
4356+ uint32_t new_type;
4357+ struct drm_fence_manager *fm = &dev->fm;
4358+ struct drm_fence_class_manager *fc = &fm->fence_class[fence_class];
4359+ struct drm_fence_driver *driver = dev->driver->fence_driver;
4360+ struct list_head *head;
4361+ struct drm_fence_object *fence, *next;
4362+ int found = 0;
4363+
4364+ if (list_empty(&fc->ring))
4365+ return;
4366+
4367+ list_for_each_entry(fence, &fc->ring, ring) {
4368+ diff = (sequence - fence->sequence) & driver->sequence_mask;
4369+ if (diff > driver->wrap_diff) {
4370+ found = 1;
4371+ break;
4372+ }
4373+ }
4374+
4375+ fc->waiting_types &= ~type;
4376+ head = (found) ? &fence->ring : &fc->ring;
4377+
4378+ list_for_each_entry_safe_reverse(fence, next, head, ring) {
4379+ if (&fence->ring == &fc->ring)
4380+ break;
4381+
4382+ if (error) {
4383+ fence->error = error;
4384+ fence->signaled_types = fence->type;
4385+ list_del_init(&fence->ring);
4386+ wake = 1;
4387+ break;
4388+ }
4389+
4390+ if (type & DRM_FENCE_TYPE_EXE)
4391+ type |= fence->native_types;
4392+
4393+ relevant_type = type & fence->type;
4394+ new_type = (fence->signaled_types | relevant_type) ^
4395+ fence->signaled_types;
4396+
4397+ if (new_type) {
4398+ fence->signaled_types |= new_type;
4399+ DRM_DEBUG("Fence 0x%08lx signaled 0x%08x\n",
4400+ fence->base.hash.key, fence->signaled_types);
4401+
4402+ if (driver->needed_flush)
4403+ fc->pending_flush |= driver->needed_flush(fence);
4404+
4405+ if (new_type & fence->waiting_types)
4406+ wake = 1;
4407+ }
4408+
4409+ fc->waiting_types |= fence->waiting_types & ~fence->signaled_types;
4410+
4411+ if (!(fence->type & ~fence->signaled_types)) {
4412+ DRM_DEBUG("Fence completely signaled 0x%08lx\n",
4413+ fence->base.hash.key);
4414+ list_del_init(&fence->ring);
4415+ }
4416+ }
4417+
4418+ /*
4419+ * Reinstate lost waiting types.
4420+ */
4421+
4422+ if ((fc->waiting_types & type) != type) {
4423+ head = head->prev;
4424+ list_for_each_entry(fence, head, ring) {
4425+ if (&fence->ring == &fc->ring)
4426+ break;
4427+ diff = (fc->highest_waiting_sequence - fence->sequence) &
4428+ driver->sequence_mask;
4429+ if (diff > driver->wrap_diff)
4430+ break;
4431+
4432+ fc->waiting_types |= fence->waiting_types & ~fence->signaled_types;
4433+ }
4434+ }
4435+
4436+ if (wake)
4437+ wake_up_all(&fc->fence_queue);
4438+}
4439+EXPORT_SYMBOL(drm_fence_handler);
4440+
4441+static void drm_fence_unring(struct drm_device *dev, struct list_head *ring)
4442+{
4443+ struct drm_fence_manager *fm = &dev->fm;
4444+ unsigned long flags;
4445+
4446+ write_lock_irqsave(&fm->lock, flags);
4447+ list_del_init(ring);
4448+ write_unlock_irqrestore(&fm->lock, flags);
4449+}
4450+
4451+void drm_fence_usage_deref_locked(struct drm_fence_object **fence)
4452+{
4453+ struct drm_fence_object *tmp_fence = *fence;
4454+ struct drm_device *dev = tmp_fence->dev;
4455+ struct drm_fence_manager *fm = &dev->fm;
4456+
4457+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
4458+ *fence = NULL;
4459+ if (atomic_dec_and_test(&tmp_fence->usage)) {
4460+ drm_fence_unring(dev, &tmp_fence->ring);
4461+ DRM_DEBUG("Destroyed a fence object 0x%08lx\n",
4462+ tmp_fence->base.hash.key);
4463+ atomic_dec(&fm->count);
4464+ BUG_ON(!list_empty(&tmp_fence->base.list));
4465+ drm_free(tmp_fence, sizeof(*tmp_fence), DRM_MEM_FENCE);
4466+ }
4467+}
4468+EXPORT_SYMBOL(drm_fence_usage_deref_locked);
4469+
4470+void drm_fence_usage_deref_unlocked(struct drm_fence_object **fence)
4471+{
4472+ struct drm_fence_object *tmp_fence = *fence;
4473+ struct drm_device *dev = tmp_fence->dev;
4474+ struct drm_fence_manager *fm = &dev->fm;
4475+
4476+ *fence = NULL;
4477+ if (atomic_dec_and_test(&tmp_fence->usage)) {
4478+ mutex_lock(&dev->struct_mutex);
4479+ if (atomic_read(&tmp_fence->usage) == 0) {
4480+ drm_fence_unring(dev, &tmp_fence->ring);
4481+ atomic_dec(&fm->count);
4482+ BUG_ON(!list_empty(&tmp_fence->base.list));
4483+ drm_free(tmp_fence, sizeof(*tmp_fence), DRM_MEM_FENCE);
4484+ }
4485+ mutex_unlock(&dev->struct_mutex);
4486+ }
4487+}
4488+EXPORT_SYMBOL(drm_fence_usage_deref_unlocked);
4489+
4490+struct drm_fence_object
4491+*drm_fence_reference_locked(struct drm_fence_object *src)
4492+{
4493+ DRM_ASSERT_LOCKED(&src->dev->struct_mutex);
4494+
4495+ atomic_inc(&src->usage);
4496+ return src;
4497+}
4498+
4499+void drm_fence_reference_unlocked(struct drm_fence_object **dst,
4500+ struct drm_fence_object *src)
4501+{
4502+ mutex_lock(&src->dev->struct_mutex);
4503+ *dst = src;
4504+ atomic_inc(&src->usage);
4505+ mutex_unlock(&src->dev->struct_mutex);
4506+}
4507+EXPORT_SYMBOL(drm_fence_reference_unlocked);
4508+
4509+static void drm_fence_object_destroy(struct drm_file *priv,
4510+ struct drm_user_object *base)
4511+{
4512+ struct drm_fence_object *fence =
4513+ drm_user_object_entry(base, struct drm_fence_object, base);
4514+
4515+ drm_fence_usage_deref_locked(&fence);
4516+}
4517+
4518+int drm_fence_object_signaled(struct drm_fence_object *fence, uint32_t mask)
4519+{
4520+ unsigned long flags;
4521+ int signaled;
4522+ struct drm_device *dev = fence->dev;
4523+ struct drm_fence_manager *fm = &dev->fm;
4524+ struct drm_fence_driver *driver = dev->driver->fence_driver;
4525+
4526+ mask &= fence->type;
4527+ read_lock_irqsave(&fm->lock, flags);
4528+ signaled = (mask & fence->signaled_types) == mask;
4529+ read_unlock_irqrestore(&fm->lock, flags);
4530+ if (!signaled && driver->poll) {
4531+ write_lock_irqsave(&fm->lock, flags);
4532+ driver->poll(dev, fence->fence_class, mask);
4533+ signaled = (mask & fence->signaled_types) == mask;
4534+ write_unlock_irqrestore(&fm->lock, flags);
4535+ }
4536+ return signaled;
4537+}
4538+EXPORT_SYMBOL(drm_fence_object_signaled);
4539+
4540+
4541+int drm_fence_object_flush(struct drm_fence_object *fence,
4542+ uint32_t type)
4543+{
4544+ struct drm_device *dev = fence->dev;
4545+ struct drm_fence_manager *fm = &dev->fm;
4546+ struct drm_fence_class_manager *fc = &fm->fence_class[fence->fence_class];
4547+ struct drm_fence_driver *driver = dev->driver->fence_driver;
4548+ unsigned long irq_flags;
4549+ uint32_t saved_pending_flush;
4550+ uint32_t diff;
4551+ int call_flush;
4552+
4553+ if (type & ~fence->type) {
4554+ DRM_ERROR("Flush trying to extend fence type, "
4555+ "0x%x, 0x%x\n", type, fence->type);
4556+ return -EINVAL;
4557+ }
4558+
4559+ write_lock_irqsave(&fm->lock, irq_flags);
4560+ fence->waiting_types |= type;
4561+ fc->waiting_types |= fence->waiting_types;
4562+ diff = (fence->sequence - fc->highest_waiting_sequence) &
4563+ driver->sequence_mask;
4564+
4565+ if (diff < driver->wrap_diff)
4566+ fc->highest_waiting_sequence = fence->sequence;
4567+
4568+ /*
4569+ * fence->waiting_types has changed. Determine whether
4570+ * we need to initiate some kind of flush as a result of this.
4571+ */
4572+
4573+ saved_pending_flush = fc->pending_flush;
4574+ if (driver->needed_flush)
4575+ fc->pending_flush |= driver->needed_flush(fence);
4576+
4577+ if (driver->poll)
4578+ driver->poll(dev, fence->fence_class, fence->waiting_types);
4579+
4580+ call_flush = fc->pending_flush;
4581+ write_unlock_irqrestore(&fm->lock, irq_flags);
4582+
4583+ if (call_flush && driver->flush)
4584+ driver->flush(dev, fence->fence_class);
4585+
4586+ return 0;
4587+}
4588+EXPORT_SYMBOL(drm_fence_object_flush);
4589+
4590+/*
4591+ * Make sure old fence objects are signaled before their fence sequences are
4592+ * wrapped around and reused.
4593+ */
4594+
4595+void drm_fence_flush_old(struct drm_device *dev, uint32_t fence_class,
4596+ uint32_t sequence)
4597+{
4598+ struct drm_fence_manager *fm = &dev->fm;
4599+ struct drm_fence_class_manager *fc = &fm->fence_class[fence_class];
4600+ struct drm_fence_object *fence;
4601+ unsigned long irq_flags;
4602+ struct drm_fence_driver *driver = dev->driver->fence_driver;
4603+ int call_flush;
4604+
4605+ uint32_t diff;
4606+
4607+ write_lock_irqsave(&fm->lock, irq_flags);
4608+
4609+ list_for_each_entry_reverse(fence, &fc->ring, ring) {
4610+ diff = (sequence - fence->sequence) & driver->sequence_mask;
4611+ if (diff <= driver->flush_diff)
4612+ break;
4613+
4614+ fence->waiting_types = fence->type;
4615+ fc->waiting_types |= fence->type;
4616+
4617+ if (driver->needed_flush)
4618+ fc->pending_flush |= driver->needed_flush(fence);
4619+ }
4620+
4621+ if (driver->poll)
4622+ driver->poll(dev, fence_class, fc->waiting_types);
4623+
4624+ call_flush = fc->pending_flush;
4625+ write_unlock_irqrestore(&fm->lock, irq_flags);
4626+
4627+ if (call_flush && driver->flush)
4628+ driver->flush(dev, fence->fence_class);
4629+
4630+ /*
4631+ * FIXME: Shold we implement a wait here for really old fences?
4632+ */
4633+
4634+}
4635+EXPORT_SYMBOL(drm_fence_flush_old);
4636+
4637+int drm_fence_object_wait(struct drm_fence_object *fence,
4638+ int lazy, int ignore_signals, uint32_t mask)
4639+{
4640+ struct drm_device *dev = fence->dev;
4641+ struct drm_fence_driver *driver = dev->driver->fence_driver;
4642+ struct drm_fence_manager *fm = &dev->fm;
4643+ struct drm_fence_class_manager *fc = &fm->fence_class[fence->fence_class];
4644+ int ret = 0;
4645+ unsigned long _end = 3 * DRM_HZ;
4646+
4647+ if (mask & ~fence->type) {
4648+ DRM_ERROR("Wait trying to extend fence type"
4649+ " 0x%08x 0x%08x\n", mask, fence->type);
4650+ BUG();
4651+ return -EINVAL;
4652+ }
4653+
4654+ if (driver->wait)
4655+ return driver->wait(fence, lazy, !ignore_signals, mask);
4656+
4657+
4658+ drm_fence_object_flush(fence, mask);
4659+ if (driver->has_irq(dev, fence->fence_class, mask)) {
4660+ if (!ignore_signals)
4661+ ret = wait_event_interruptible_timeout
4662+ (fc->fence_queue,
4663+ drm_fence_object_signaled(fence, mask),
4664+ 3 * DRM_HZ);
4665+ else
4666+ ret = wait_event_timeout
4667+ (fc->fence_queue,
4668+ drm_fence_object_signaled(fence, mask),
4669+ 3 * DRM_HZ);
4670+
4671+ if (unlikely(ret == -ERESTARTSYS))
4672+ return -EAGAIN;
4673+
4674+ if (unlikely(ret == 0))
4675+ return -EBUSY;
4676+
4677+ return 0;
4678+ }
4679+
4680+ return drm_fence_wait_polling(fence, lazy, !ignore_signals, mask,
4681+ _end);
4682+}
4683+EXPORT_SYMBOL(drm_fence_object_wait);
4684+
4685+
4686+
4687+int drm_fence_object_emit(struct drm_fence_object *fence, uint32_t fence_flags,
4688+ uint32_t fence_class, uint32_t type)
4689+{
4690+ struct drm_device *dev = fence->dev;
4691+ struct drm_fence_manager *fm = &dev->fm;
4692+ struct drm_fence_driver *driver = dev->driver->fence_driver;
4693+ struct drm_fence_class_manager *fc = &fm->fence_class[fence->fence_class];
4694+ unsigned long flags;
4695+ uint32_t sequence;
4696+ uint32_t native_types;
4697+ int ret;
4698+
4699+ drm_fence_unring(dev, &fence->ring);
4700+ ret = driver->emit(dev, fence_class, fence_flags, &sequence,
4701+ &native_types);
4702+ if (ret)
4703+ return ret;
4704+
4705+ write_lock_irqsave(&fm->lock, flags);
4706+ fence->fence_class = fence_class;
4707+ fence->type = type;
4708+ fence->waiting_types = 0;
4709+ fence->signaled_types = 0;
4710+ fence->error = 0;
4711+ fence->sequence = sequence;
4712+ fence->native_types = native_types;
4713+ if (list_empty(&fc->ring))
4714+ fc->highest_waiting_sequence = sequence - 1;
4715+ list_add_tail(&fence->ring, &fc->ring);
4716+ fc->latest_queued_sequence = sequence;
4717+ write_unlock_irqrestore(&fm->lock, flags);
4718+ return 0;
4719+}
4720+EXPORT_SYMBOL(drm_fence_object_emit);
4721+
4722+static int drm_fence_object_init(struct drm_device *dev, uint32_t fence_class,
4723+ uint32_t type,
4724+ uint32_t fence_flags,
4725+ struct drm_fence_object *fence)
4726+{
4727+ int ret = 0;
4728+ unsigned long flags;
4729+ struct drm_fence_manager *fm = &dev->fm;
4730+
4731+ mutex_lock(&dev->struct_mutex);
4732+ atomic_set(&fence->usage, 1);
4733+ mutex_unlock(&dev->struct_mutex);
4734+
4735+ write_lock_irqsave(&fm->lock, flags);
4736+ INIT_LIST_HEAD(&fence->ring);
4737+
4738+ /*
4739+ * Avoid hitting BUG() for kernel-only fence objects.
4740+ */
4741+
4742+ INIT_LIST_HEAD(&fence->base.list);
4743+ fence->fence_class = fence_class;
4744+ fence->type = type;
4745+ fence->signaled_types = 0;
4746+ fence->waiting_types = 0;
4747+ fence->sequence = 0;
4748+ fence->error = 0;
4749+ fence->dev = dev;
4750+ write_unlock_irqrestore(&fm->lock, flags);
4751+ if (fence_flags & DRM_FENCE_FLAG_EMIT) {
4752+ ret = drm_fence_object_emit(fence, fence_flags,
4753+ fence->fence_class, type);
4754+ }
4755+ return ret;
4756+}
4757+
4758+int drm_fence_add_user_object(struct drm_file *priv,
4759+ struct drm_fence_object *fence, int shareable)
4760+{
4761+ struct drm_device *dev = priv->minor->dev;
4762+ int ret;
4763+
4764+ mutex_lock(&dev->struct_mutex);
4765+ ret = drm_add_user_object(priv, &fence->base, shareable);
4766+ if (ret)
4767+ goto out;
4768+ atomic_inc(&fence->usage);
4769+ fence->base.type = drm_fence_type;
4770+ fence->base.remove = &drm_fence_object_destroy;
4771+ DRM_DEBUG("Fence 0x%08lx created\n", fence->base.hash.key);
4772+out:
4773+ mutex_unlock(&dev->struct_mutex);
4774+ return ret;
4775+}
4776+EXPORT_SYMBOL(drm_fence_add_user_object);
4777+
4778+int drm_fence_object_create(struct drm_device *dev, uint32_t fence_class,
4779+ uint32_t type, unsigned flags,
4780+ struct drm_fence_object **c_fence)
4781+{
4782+ struct drm_fence_object *fence;
4783+ int ret;
4784+ struct drm_fence_manager *fm = &dev->fm;
4785+
4786+ fence = drm_calloc(1, sizeof(*fence), DRM_MEM_FENCE);
4787+ if (!fence) {
4788+ DRM_INFO("Out of memory creating fence object.\n");
4789+ return -ENOMEM;
4790+ }
4791+ ret = drm_fence_object_init(dev, fence_class, type, flags, fence);
4792+ if (ret) {
4793+ drm_fence_usage_deref_unlocked(&fence);
4794+ return ret;
4795+ }
4796+ *c_fence = fence;
4797+ atomic_inc(&fm->count);
4798+
4799+ return 0;
4800+}
4801+EXPORT_SYMBOL(drm_fence_object_create);
4802+
4803+void drm_fence_manager_init(struct drm_device *dev)
4804+{
4805+ struct drm_fence_manager *fm = &dev->fm;
4806+ struct drm_fence_class_manager *fence_class;
4807+ struct drm_fence_driver *fed = dev->driver->fence_driver;
4808+ int i;
4809+ unsigned long flags;
4810+
4811+ rwlock_init(&fm->lock);
4812+ write_lock_irqsave(&fm->lock, flags);
4813+ fm->initialized = 0;
4814+ if (!fed)
4815+ goto out_unlock;
4816+
4817+ fm->initialized = 1;
4818+ fm->num_classes = fed->num_classes;
4819+ BUG_ON(fm->num_classes > _DRM_FENCE_CLASSES);
4820+
4821+ for (i = 0; i < fm->num_classes; ++i) {
4822+ fence_class = &fm->fence_class[i];
4823+
4824+ memset(fence_class, 0, sizeof(*fence_class));
4825+ INIT_LIST_HEAD(&fence_class->ring);
4826+ DRM_INIT_WAITQUEUE(&fence_class->fence_queue);
4827+ }
4828+
4829+ atomic_set(&fm->count, 0);
4830+ out_unlock:
4831+ write_unlock_irqrestore(&fm->lock, flags);
4832+}
4833+
4834+void drm_fence_fill_arg(struct drm_fence_object *fence,
4835+ struct drm_fence_arg *arg)
4836+{
4837+ struct drm_device *dev = fence->dev;
4838+ struct drm_fence_manager *fm = &dev->fm;
4839+ unsigned long irq_flags;
4840+
4841+ read_lock_irqsave(&fm->lock, irq_flags);
4842+ arg->handle = fence->base.hash.key;
4843+ arg->fence_class = fence->fence_class;
4844+ arg->type = fence->type;
4845+ arg->signaled = fence->signaled_types;
4846+ arg->error = fence->error;
4847+ arg->sequence = fence->sequence;
4848+ read_unlock_irqrestore(&fm->lock, irq_flags);
4849+}
4850+EXPORT_SYMBOL(drm_fence_fill_arg);
4851+
4852+void drm_fence_manager_takedown(struct drm_device *dev)
4853+{
4854+}
4855+
4856+struct drm_fence_object *drm_lookup_fence_object(struct drm_file *priv,
4857+ uint32_t handle)
4858+{
4859+ struct drm_device *dev = priv->minor->dev;
4860+ struct drm_user_object *uo;
4861+ struct drm_fence_object *fence;
4862+
4863+ mutex_lock(&dev->struct_mutex);
4864+ uo = drm_lookup_user_object(priv, handle);
4865+ if (!uo || (uo->type != drm_fence_type)) {
4866+ mutex_unlock(&dev->struct_mutex);
4867+ return NULL;
4868+ }
4869+ fence = drm_fence_reference_locked(drm_user_object_entry(uo, struct drm_fence_object, base));
4870+ mutex_unlock(&dev->struct_mutex);
4871+ return fence;
4872+}
4873+
4874+int drm_fence_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
4875+{
4876+ int ret;
4877+ struct drm_fence_manager *fm = &dev->fm;
4878+ struct drm_fence_arg *arg = data;
4879+ struct drm_fence_object *fence;
4880+ ret = 0;
4881+
4882+ if (!fm->initialized) {
4883+ DRM_ERROR("The DRM driver does not support fencing.\n");
4884+ return -EINVAL;
4885+ }
4886+
4887+ if (arg->flags & DRM_FENCE_FLAG_EMIT)
4888+ LOCK_TEST_WITH_RETURN(dev, file_priv);
4889+ ret = drm_fence_object_create(dev, arg->fence_class,
4890+ arg->type, arg->flags, &fence);
4891+ if (ret)
4892+ return ret;
4893+ ret = drm_fence_add_user_object(file_priv, fence,
4894+ arg->flags &
4895+ DRM_FENCE_FLAG_SHAREABLE);
4896+ if (ret) {
4897+ drm_fence_usage_deref_unlocked(&fence);
4898+ return ret;
4899+ }
4900+
4901+ /*
4902+ * usage > 0. No need to lock dev->struct_mutex;
4903+ */
4904+
4905+ arg->handle = fence->base.hash.key;
4906+
4907+ drm_fence_fill_arg(fence, arg);
4908+ drm_fence_usage_deref_unlocked(&fence);
4909+
4910+ return ret;
4911+}
4912+
4913+int drm_fence_reference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
4914+{
4915+ int ret;
4916+ struct drm_fence_manager *fm = &dev->fm;
4917+ struct drm_fence_arg *arg = data;
4918+ struct drm_fence_object *fence;
4919+ struct drm_user_object *uo;
4920+ ret = 0;
4921+
4922+ if (!fm->initialized) {
4923+ DRM_ERROR("The DRM driver does not support fencing.\n");
4924+ return -EINVAL;
4925+ }
4926+
4927+ ret = drm_user_object_ref(file_priv, arg->handle, drm_fence_type, &uo);
4928+ if (ret)
4929+ return ret;
4930+ fence = drm_lookup_fence_object(file_priv, arg->handle);
4931+ drm_fence_fill_arg(fence, arg);
4932+ drm_fence_usage_deref_unlocked(&fence);
4933+
4934+ return ret;
4935+}
4936+
4937+
4938+int drm_fence_unreference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
4939+{
4940+ int ret;
4941+ struct drm_fence_manager *fm = &dev->fm;
4942+ struct drm_fence_arg *arg = data;
4943+ ret = 0;
4944+
4945+ if (!fm->initialized) {
4946+ DRM_ERROR("The DRM driver does not support fencing.\n");
4947+ return -EINVAL;
4948+ }
4949+
4950+ return drm_user_object_unref(file_priv, arg->handle, drm_fence_type);
4951+}
4952+
4953+int drm_fence_signaled_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
4954+{
4955+ int ret;
4956+ struct drm_fence_manager *fm = &dev->fm;
4957+ struct drm_fence_arg *arg = data;
4958+ struct drm_fence_object *fence;
4959+ ret = 0;
4960+
4961+ if (!fm->initialized) {
4962+ DRM_ERROR("The DRM driver does not support fencing.\n");
4963+ return -EINVAL;
4964+ }
4965+
4966+ fence = drm_lookup_fence_object(file_priv, arg->handle);
4967+ if (!fence)
4968+ return -EINVAL;
4969+
4970+ drm_fence_fill_arg(fence, arg);
4971+ drm_fence_usage_deref_unlocked(&fence);
4972+
4973+ return ret;
4974+}
4975+
4976+int drm_fence_flush_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
4977+{
4978+ int ret;
4979+ struct drm_fence_manager *fm = &dev->fm;
4980+ struct drm_fence_arg *arg = data;
4981+ struct drm_fence_object *fence;
4982+ ret = 0;
4983+
4984+ if (!fm->initialized) {
4985+ DRM_ERROR("The DRM driver does not support fencing.\n");
4986+ return -EINVAL;
4987+ }
4988+
4989+ fence = drm_lookup_fence_object(file_priv, arg->handle);
4990+ if (!fence)
4991+ return -EINVAL;
4992+ ret = drm_fence_object_flush(fence, arg->type);
4993+
4994+ drm_fence_fill_arg(fence, arg);
4995+ drm_fence_usage_deref_unlocked(&fence);
4996+
4997+ return ret;
4998+}
4999+
5000+
5001+int drm_fence_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
5002+{
5003+ int ret;
5004+ struct drm_fence_manager *fm = &dev->fm;
5005+ struct drm_fence_arg *arg = data;
5006+ struct drm_fence_object *fence;
5007+ ret = 0;
5008+
5009+ if (!fm->initialized) {
5010+ DRM_ERROR("The DRM driver does not support fencing.\n");
5011+ return -EINVAL;
5012+ }
5013+
5014+ fence = drm_lookup_fence_object(file_priv, arg->handle);
5015+ if (!fence)
5016+ return -EINVAL;
5017+ ret = drm_fence_object_wait(fence,
5018+ arg->flags & DRM_FENCE_FLAG_WAIT_LAZY,
5019+ 0, arg->type);
5020+
5021+ drm_fence_fill_arg(fence, arg);
5022+ drm_fence_usage_deref_unlocked(&fence);
5023+
5024+ return ret;
5025+}
5026+
5027+
5028+int drm_fence_emit_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
5029+{
5030+ int ret;
5031+ struct drm_fence_manager *fm = &dev->fm;
5032+ struct drm_fence_arg *arg = data;
5033+ struct drm_fence_object *fence;
5034+ ret = 0;
5035+
5036+ if (!fm->initialized) {
5037+ DRM_ERROR("The DRM driver does not support fencing.\n");
5038+ return -EINVAL;
5039+ }
5040+
5041+ LOCK_TEST_WITH_RETURN(dev, file_priv);
5042+ fence = drm_lookup_fence_object(file_priv, arg->handle);
5043+ if (!fence)
5044+ return -EINVAL;
5045+ ret = drm_fence_object_emit(fence, arg->flags, arg->fence_class,
5046+ arg->type);
5047+
5048+ drm_fence_fill_arg(fence, arg);
5049+ drm_fence_usage_deref_unlocked(&fence);
5050+
5051+ return ret;
5052+}
5053+
5054+int drm_fence_buffers_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
5055+{
5056+ int ret;
5057+ struct drm_fence_manager *fm = &dev->fm;
5058+ struct drm_fence_arg *arg = data;
5059+ struct drm_fence_object *fence;
5060+ ret = 0;
5061+
5062+ if (!fm->initialized) {
5063+ DRM_ERROR("The DRM driver does not support fencing.\n");
5064+ return -EINVAL;
5065+ }
5066+
5067+ if (!dev->bm.initialized) {
5068+ DRM_ERROR("Buffer object manager is not initialized\n");
5069+ return -EINVAL;
5070+ }
5071+ LOCK_TEST_WITH_RETURN(dev, file_priv);
5072+ ret = drm_fence_buffer_objects(dev, NULL, arg->flags,
5073+ NULL, &fence);
5074+ if (ret)
5075+ return ret;
5076+
5077+ if (!(arg->flags & DRM_FENCE_FLAG_NO_USER)) {
5078+ ret = drm_fence_add_user_object(file_priv, fence,
5079+ arg->flags &
5080+ DRM_FENCE_FLAG_SHAREABLE);
5081+ if (ret)
5082+ return ret;
5083+ }
5084+
5085+ arg->handle = fence->base.hash.key;
5086+
5087+ drm_fence_fill_arg(fence, arg);
5088+ drm_fence_usage_deref_unlocked(&fence);
5089+
5090+ return ret;
5091+}
5092Index: linux-2.6.28/drivers/gpu/drm/drm_fops.c
5093===================================================================
5094--- linux-2.6.28.orig/drivers/gpu/drm/drm_fops.c 2009-02-20 12:22:53.000000000 +0000
5095+++ linux-2.6.28/drivers/gpu/drm/drm_fops.c 2009-02-20 12:31:55.000000000 +0000
5096@@ -1,3 +1,4 @@
5097+
5098 /**
5099 * \file drm_fops.c
5100 * File operations for DRM
5101@@ -232,6 +233,7 @@
5102 int minor_id = iminor(inode);
5103 struct drm_file *priv;
5104 int ret;
5105+ int i, j;
5106
5107 if (filp->f_flags & O_EXCL)
5108 return -EBUSY; /* No exclusive opens */
5109@@ -257,10 +259,24 @@
5110
5111 INIT_LIST_HEAD(&priv->lhead);
5112 INIT_LIST_HEAD(&priv->fbs);
5113+ INIT_LIST_HEAD(&priv->refd_objects);
5114
5115 if (dev->driver->driver_features & DRIVER_GEM)
5116 drm_gem_open(dev, priv);
5117
5118+ for (i = 0; i < _DRM_NO_REF_TYPES; ++i) {
5119+ ret = drm_ht_create(&priv->refd_object_hash[i],
5120+ DRM_FILE_HASH_ORDER);
5121+ if (ret)
5122+ break;
5123+ }
5124+
5125+ if (ret) {
5126+ for (j = 0; j < i; ++j)
5127+ drm_ht_remove(&priv->refd_object_hash[j]);
5128+ goto out_free;
5129+ }
5130+
5131 if (dev->driver->open) {
5132 ret = dev->driver->open(dev, priv);
5133 if (ret < 0)
5134Index: linux-2.6.28/drivers/gpu/drm/drm_irq.c
5135===================================================================
5136--- linux-2.6.28.orig/drivers/gpu/drm/drm_irq.c 2009-02-20 12:22:53.000000000 +0000
5137+++ linux-2.6.28/drivers/gpu/drm/drm_irq.c 2009-02-20 12:23:06.000000000 +0000
5138@@ -124,6 +124,7 @@
5139
5140 dev->num_crtcs = 0;
5141 }
5142+EXPORT_SYMBOL(drm_vblank_cleanup);
5143
5144 int drm_vblank_init(struct drm_device *dev, int num_crtcs)
5145 {
5146@@ -697,7 +698,7 @@
5147 *
5148 * If a signal is not requested, then calls vblank_wait().
5149 */
5150-static void drm_vbl_send_signals(struct drm_device *dev, int crtc)
5151+void drm_vbl_send_signals(struct drm_device *dev, int crtc)
5152 {
5153 struct drm_vbl_sig *vbl_sig, *tmp;
5154 struct list_head *vbl_sigs;
5155@@ -726,6 +727,7 @@
5156
5157 spin_unlock_irqrestore(&dev->vbl_lock, flags);
5158 }
5159+EXPORT_SYMBOL(drm_vbl_send_signals);
5160
5161 /**
5162 * drm_handle_vblank - handle a vblank event
5163Index: linux-2.6.28/drivers/gpu/drm/drm_object.c
5164===================================================================
5165--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5166+++ linux-2.6.28/drivers/gpu/drm/drm_object.c 2009-02-20 12:23:06.000000000 +0000
5167@@ -0,0 +1,294 @@
5168+/**************************************************************************
5169+ *
5170+ * Copyright (c) 2006-2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
5171+ * All Rights Reserved.
5172+ *
5173+ * Permission is hereby granted, free of charge, to any person obtaining a
5174+ * copy of this software and associated documentation files (the
5175+ * "Software"), to deal in the Software without restriction, including
5176+ * without limitation the rights to use, copy, modify, merge, publish,
5177+ * distribute, sub license, and/or sell copies of the Software, and to
5178+ * permit persons to whom the Software is furnished to do so, subject to
5179+ * the following conditions:
5180+ *
5181+ * The above copyright notice and this permission notice (including the
5182+ * next paragraph) shall be included in all copies or substantial portions
5183+ * of the Software.
5184+ *
5185+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5186+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5187+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
5188+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
5189+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
5190+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
5191+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
5192+ *
5193+ **************************************************************************/
5194+/*
5195+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
5196+ */
5197+
5198+#include "drmP.h"
5199+
5200+int drm_add_user_object(struct drm_file *priv, struct drm_user_object *item,
5201+ int shareable)
5202+{
5203+ struct drm_device *dev = priv->minor->dev;
5204+ int ret;
5205+
5206+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
5207+
5208+ /* The refcount will be bumped to 1 when we add the ref object below. */
5209+ atomic_set(&item->refcount, 0);
5210+ item->shareable = shareable;
5211+ item->owner = priv;
5212+
5213+ ret = drm_ht_just_insert_please(&dev->object_hash, &item->hash,
5214+ (unsigned long)item, 32, 0, 0);
5215+ if (ret)
5216+ return ret;
5217+
5218+ ret = drm_add_ref_object(priv, item, _DRM_REF_USE);
5219+ if (ret)
5220+ ret = drm_ht_remove_item(&dev->object_hash, &item->hash);
5221+
5222+ return ret;
5223+}
5224+EXPORT_SYMBOL(drm_add_user_object);
5225+
5226+struct drm_user_object *drm_lookup_user_object(struct drm_file *priv, uint32_t key)
5227+{
5228+ struct drm_device *dev = priv->minor->dev;
5229+ struct drm_hash_item *hash;
5230+ int ret;
5231+ struct drm_user_object *item;
5232+
5233+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
5234+
5235+ ret = drm_ht_find_item(&dev->object_hash, key, &hash);
5236+ if (ret)
5237+ return NULL;
5238+
5239+ item = drm_hash_entry(hash, struct drm_user_object, hash);
5240+
5241+ if (priv != item->owner) {
5242+ struct drm_open_hash *ht = &priv->refd_object_hash[_DRM_REF_USE];
5243+ ret = drm_ht_find_item(ht, (unsigned long)item, &hash);
5244+ if (ret) {
5245+ DRM_ERROR("Object not registered for usage\n");
5246+ return NULL;
5247+ }
5248+ }
5249+ return item;
5250+}
5251+EXPORT_SYMBOL(drm_lookup_user_object);
5252+
5253+static void drm_deref_user_object(struct drm_file *priv, struct drm_user_object *item)
5254+{
5255+ struct drm_device *dev = priv->minor->dev;
5256+ int ret;
5257+
5258+ if (atomic_dec_and_test(&item->refcount)) {
5259+ ret = drm_ht_remove_item(&dev->object_hash, &item->hash);
5260+ BUG_ON(ret);
5261+ item->remove(priv, item);
5262+ }
5263+}
5264+
5265+static int drm_object_ref_action(struct drm_file *priv, struct drm_user_object *ro,
5266+ enum drm_ref_type action)
5267+{
5268+ int ret = 0;
5269+
5270+ switch (action) {
5271+ case _DRM_REF_USE:
5272+ atomic_inc(&ro->refcount);
5273+ break;
5274+ default:
5275+ if (!ro->ref_struct_locked) {
5276+ break;
5277+ } else {
5278+ ro->ref_struct_locked(priv, ro, action);
5279+ }
5280+ }
5281+ return ret;
5282+}
5283+
5284+int drm_add_ref_object(struct drm_file *priv, struct drm_user_object *referenced_object,
5285+ enum drm_ref_type ref_action)
5286+{
5287+ int ret = 0;
5288+ struct drm_ref_object *item;
5289+ struct drm_open_hash *ht = &priv->refd_object_hash[ref_action];
5290+
5291+ DRM_ASSERT_LOCKED(&priv->minor->dev->struct_mutex);
5292+ if (!referenced_object->shareable && priv != referenced_object->owner) {
5293+ DRM_ERROR("Not allowed to reference this object\n");
5294+ return -EINVAL;
5295+ }
5296+
5297+ /*
5298+ * If this is not a usage reference, Check that usage has been registered
5299+ * first. Otherwise strange things may happen on destruction.
5300+ */
5301+
5302+ if ((ref_action != _DRM_REF_USE) && priv != referenced_object->owner) {
5303+ item =
5304+ drm_lookup_ref_object(priv, referenced_object,
5305+ _DRM_REF_USE);
5306+ if (!item) {
5307+ DRM_ERROR
5308+ ("Object not registered for usage by this client\n");
5309+ return -EINVAL;
5310+ }
5311+ }
5312+
5313+ if (NULL !=
5314+ (item =
5315+ drm_lookup_ref_object(priv, referenced_object, ref_action))) {
5316+ atomic_inc(&item->refcount);
5317+ return drm_object_ref_action(priv, referenced_object,
5318+ ref_action);
5319+ }
5320+
5321+ item = drm_calloc(1, sizeof(*item), DRM_MEM_OBJECTS);
5322+ if (item == NULL) {
5323+ DRM_ERROR("Could not allocate reference object\n");
5324+ return -ENOMEM;
5325+ }
5326+
5327+ atomic_set(&item->refcount, 1);
5328+ item->hash.key = (unsigned long)referenced_object;
5329+ ret = drm_ht_insert_item(ht, &item->hash);
5330+ item->unref_action = ref_action;
5331+
5332+ if (ret)
5333+ goto out;
5334+
5335+ list_add(&item->list, &priv->refd_objects);
5336+ ret = drm_object_ref_action(priv, referenced_object, ref_action);
5337+out:
5338+ return ret;
5339+}
5340+
5341+struct drm_ref_object *drm_lookup_ref_object(struct drm_file *priv,
5342+ struct drm_user_object *referenced_object,
5343+ enum drm_ref_type ref_action)
5344+{
5345+ struct drm_hash_item *hash;
5346+ int ret;
5347+
5348+ DRM_ASSERT_LOCKED(&priv->minor->dev->struct_mutex);
5349+ ret = drm_ht_find_item(&priv->refd_object_hash[ref_action],
5350+ (unsigned long)referenced_object, &hash);
5351+ if (ret)
5352+ return NULL;
5353+
5354+ return drm_hash_entry(hash, struct drm_ref_object, hash);
5355+}
5356+EXPORT_SYMBOL(drm_lookup_ref_object);
5357+
5358+static void drm_remove_other_references(struct drm_file *priv,
5359+ struct drm_user_object *ro)
5360+{
5361+ int i;
5362+ struct drm_open_hash *ht;
5363+ struct drm_hash_item *hash;
5364+ struct drm_ref_object *item;
5365+
5366+ for (i = _DRM_REF_USE + 1; i < _DRM_NO_REF_TYPES; ++i) {
5367+ ht = &priv->refd_object_hash[i];
5368+ while (!drm_ht_find_item(ht, (unsigned long)ro, &hash)) {
5369+ item = drm_hash_entry(hash, struct drm_ref_object, hash);
5370+ drm_remove_ref_object(priv, item);
5371+ }
5372+ }
5373+}
5374+
5375+void drm_remove_ref_object(struct drm_file *priv, struct drm_ref_object *item)
5376+{
5377+ int ret;
5378+ struct drm_user_object *user_object = (struct drm_user_object *) item->hash.key;
5379+ struct drm_open_hash *ht = &priv->refd_object_hash[item->unref_action];
5380+ enum drm_ref_type unref_action;
5381+
5382+ DRM_ASSERT_LOCKED(&priv->minor->dev->struct_mutex);
5383+ unref_action = item->unref_action;
5384+ if (atomic_dec_and_test(&item->refcount)) {
5385+ ret = drm_ht_remove_item(ht, &item->hash);
5386+ BUG_ON(ret);
5387+ list_del_init(&item->list);
5388+ if (unref_action == _DRM_REF_USE)
5389+ drm_remove_other_references(priv, user_object);
5390+ drm_free(item, sizeof(*item), DRM_MEM_OBJECTS);
5391+ }
5392+
5393+ switch (unref_action) {
5394+ case _DRM_REF_USE:
5395+ drm_deref_user_object(priv, user_object);
5396+ break;
5397+ default:
5398+ BUG_ON(!user_object->unref);
5399+ user_object->unref(priv, user_object, unref_action);
5400+ break;
5401+ }
5402+
5403+}
5404+EXPORT_SYMBOL(drm_remove_ref_object);
5405+
5406+int drm_user_object_ref(struct drm_file *priv, uint32_t user_token,
5407+ enum drm_object_type type, struct drm_user_object **object)
5408+{
5409+ struct drm_device *dev = priv->minor->dev;
5410+ struct drm_user_object *uo;
5411+ struct drm_hash_item *hash;
5412+ int ret;
5413+
5414+ mutex_lock(&dev->struct_mutex);
5415+ ret = drm_ht_find_item(&dev->object_hash, user_token, &hash);
5416+ if (ret) {
5417+ DRM_ERROR("Could not find user object to reference.\n");
5418+ goto out_err;
5419+ }
5420+ uo = drm_hash_entry(hash, struct drm_user_object, hash);
5421+ if (uo->type != type) {
5422+ ret = -EINVAL;
5423+ goto out_err;
5424+ }
5425+ ret = drm_add_ref_object(priv, uo, _DRM_REF_USE);
5426+ if (ret)
5427+ goto out_err;
5428+ mutex_unlock(&dev->struct_mutex);
5429+ *object = uo;
5430+ return 0;
5431+out_err:
5432+ mutex_unlock(&dev->struct_mutex);
5433+ return ret;
5434+}
5435+
5436+int drm_user_object_unref(struct drm_file *priv, uint32_t user_token,
5437+ enum drm_object_type type)
5438+{
5439+ struct drm_device *dev = priv->minor->dev;
5440+ struct drm_user_object *uo;
5441+ struct drm_ref_object *ro;
5442+ int ret;
5443+
5444+ mutex_lock(&dev->struct_mutex);
5445+ uo = drm_lookup_user_object(priv, user_token);
5446+ if (!uo || (uo->type != type)) {
5447+ ret = -EINVAL;
5448+ goto out_err;
5449+ }
5450+ ro = drm_lookup_ref_object(priv, uo, _DRM_REF_USE);
5451+ if (!ro) {
5452+ ret = -EINVAL;
5453+ goto out_err;
5454+ }
5455+ drm_remove_ref_object(priv, ro);
5456+ mutex_unlock(&dev->struct_mutex);
5457+ return 0;
5458+out_err:
5459+ mutex_unlock(&dev->struct_mutex);
5460+ return ret;
5461+}
5462Index: linux-2.6.28/drivers/gpu/drm/drm_regman.c
5463===================================================================
5464--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5465+++ linux-2.6.28/drivers/gpu/drm/drm_regman.c 2009-02-20 12:23:06.000000000 +0000
5466@@ -0,0 +1,200 @@
5467+/**************************************************************************
5468+ * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
5469+ * All Rights Reserved.
5470+ *
5471+ * Permission is hereby granted, free of charge, to any person obtaining a
5472+ * copy of this software and associated documentation files (the
5473+ * "Software"), to deal in the Software without restriction, including
5474+ * without limitation the rights to use, copy, modify, merge, publish,
5475+ * distribute, sub license, and/or sell copies of the Software, and to
5476+ * permit persons to whom the Software is furnished to do so, subject to
5477+ * the following conditions:
5478+ *
5479+ * The above copyright notice and this permission notice (including the
5480+ * next paragraph) shall be included in all copies or substantial portions
5481+ * of the Software.
5482+ *
5483+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5484+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5485+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
5486+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
5487+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
5488+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
5489+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
5490+ *
5491+ **************************************************************************/
5492+/*
5493+ * An allocate-fence manager implementation intended for sets of base-registers
5494+ * or tiling-registers.
5495+ */
5496+
5497+#include "drmP.h"
5498+
5499+/*
5500+ * Allocate a compatible register and put it on the unfenced list.
5501+ */
5502+
5503+int drm_regs_alloc(struct drm_reg_manager *manager,
5504+ const void *data,
5505+ uint32_t fence_class,
5506+ uint32_t fence_type,
5507+ int interruptible, int no_wait, struct drm_reg **reg)
5508+{
5509+ struct drm_reg *entry, *next_entry;
5510+ int ret;
5511+
5512+ *reg = NULL;
5513+
5514+ /*
5515+ * Search the unfenced list.
5516+ */
5517+
5518+ list_for_each_entry(entry, &manager->unfenced, head) {
5519+ if (manager->reg_reusable(entry, data)) {
5520+ entry->new_fence_type |= fence_type;
5521+ goto out;
5522+ }
5523+ }
5524+
5525+ /*
5526+ * Search the lru list.
5527+ */
5528+
5529+ list_for_each_entry_safe(entry, next_entry, &manager->lru, head) {
5530+ struct drm_fence_object *fence = entry->fence;
5531+ if (fence->fence_class == fence_class &&
5532+ (entry->fence_type & fence_type) == entry->fence_type &&
5533+ manager->reg_reusable(entry, data)) {
5534+ list_del(&entry->head);
5535+ entry->new_fence_type = fence_type;
5536+ list_add_tail(&entry->head, &manager->unfenced);
5537+ goto out;
5538+ }
5539+ }
5540+
5541+ /*
5542+ * Search the free list.
5543+ */
5544+
5545+ list_for_each_entry(entry, &manager->free, head) {
5546+ list_del(&entry->head);
5547+ entry->new_fence_type = fence_type;
5548+ list_add_tail(&entry->head, &manager->unfenced);
5549+ goto out;
5550+ }
5551+
5552+ if (no_wait)
5553+ return -EBUSY;
5554+
5555+ /*
5556+ * Go back to the lru list and try to expire fences.
5557+ */
5558+
5559+ list_for_each_entry_safe(entry, next_entry, &manager->lru, head) {
5560+ BUG_ON(!entry->fence);
5561+ ret = drm_fence_object_wait(entry->fence, 0, !interruptible,
5562+ entry->fence_type);
5563+ if (ret)
5564+ return ret;
5565+
5566+ drm_fence_usage_deref_unlocked(&entry->fence);
5567+ list_del(&entry->head);
5568+ entry->new_fence_type = fence_type;
5569+ list_add_tail(&entry->head, &manager->unfenced);
5570+ goto out;
5571+ }
5572+
5573+ /*
5574+ * Oops. All registers are used up :(.
5575+ */
5576+
5577+ return -EBUSY;
5578+out:
5579+ *reg = entry;
5580+ return 0;
5581+}
5582+EXPORT_SYMBOL(drm_regs_alloc);
5583+
5584+void drm_regs_fence(struct drm_reg_manager *manager,
5585+ struct drm_fence_object *fence)
5586+{
5587+ struct drm_reg *entry;
5588+ struct drm_reg *next_entry;
5589+
5590+ if (!fence) {
5591+
5592+ /*
5593+ * Old fence (if any) is still valid.
5594+ * Put back on free and lru lists.
5595+ */
5596+
5597+ list_for_each_entry_safe_reverse(entry, next_entry,
5598+ &manager->unfenced, head) {
5599+ list_del(&entry->head);
5600+ list_add(&entry->head, (entry->fence) ?
5601+ &manager->lru : &manager->free);
5602+ }
5603+ } else {
5604+
5605+ /*
5606+ * Fence with a new fence and put on lru list.
5607+ */
5608+
5609+ list_for_each_entry_safe(entry, next_entry, &manager->unfenced,
5610+ head) {
5611+ list_del(&entry->head);
5612+ if (entry->fence)
5613+ drm_fence_usage_deref_unlocked(&entry->fence);
5614+ drm_fence_reference_unlocked(&entry->fence, fence);
5615+
5616+ entry->fence_type = entry->new_fence_type;
5617+ BUG_ON((entry->fence_type & fence->type) !=
5618+ entry->fence_type);
5619+
5620+ list_add_tail(&entry->head, &manager->lru);
5621+ }
5622+ }
5623+}
5624+EXPORT_SYMBOL(drm_regs_fence);
5625+
5626+void drm_regs_free(struct drm_reg_manager *manager)
5627+{
5628+ struct drm_reg *entry;
5629+ struct drm_reg *next_entry;
5630+
5631+ drm_regs_fence(manager, NULL);
5632+
5633+ list_for_each_entry_safe(entry, next_entry, &manager->free, head) {
5634+ list_del(&entry->head);
5635+ manager->reg_destroy(entry);
5636+ }
5637+
5638+ list_for_each_entry_safe(entry, next_entry, &manager->lru, head) {
5639+
5640+ (void)drm_fence_object_wait(entry->fence, 1, 1,
5641+ entry->fence_type);
5642+ list_del(&entry->head);
5643+ drm_fence_usage_deref_unlocked(&entry->fence);
5644+ manager->reg_destroy(entry);
5645+ }
5646+}
5647+EXPORT_SYMBOL(drm_regs_free);
5648+
5649+void drm_regs_add(struct drm_reg_manager *manager, struct drm_reg *reg)
5650+{
5651+ reg->fence = NULL;
5652+ list_add_tail(&reg->head, &manager->free);
5653+}
5654+EXPORT_SYMBOL(drm_regs_add);
5655+
5656+void drm_regs_init(struct drm_reg_manager *manager,
5657+ int (*reg_reusable) (const struct drm_reg *, const void *),
5658+ void (*reg_destroy) (struct drm_reg *))
5659+{
5660+ INIT_LIST_HEAD(&manager->free);
5661+ INIT_LIST_HEAD(&manager->lru);
5662+ INIT_LIST_HEAD(&manager->unfenced);
5663+ manager->reg_reusable = reg_reusable;
5664+ manager->reg_destroy = reg_destroy;
5665+}
5666+EXPORT_SYMBOL(drm_regs_init);
5667Index: linux-2.6.28/drivers/gpu/drm/drm_stub.c
5668===================================================================
5669--- linux-2.6.28.orig/drivers/gpu/drm/drm_stub.c 2009-02-20 12:22:53.000000000 +0000
5670+++ linux-2.6.28/drivers/gpu/drm/drm_stub.c 2009-02-20 12:33:16.000000000 +0000
5671@@ -201,6 +201,7 @@
5672 init_timer(&dev->timer);
5673 mutex_init(&dev->struct_mutex);
5674 mutex_init(&dev->ctxlist_mutex);
5675+ mutex_init(&dev->bm.evict_mutex);
5676
5677 idr_init(&dev->drw_idr);
5678
5679@@ -216,6 +217,18 @@
5680 return -ENOMEM;
5681 }
5682
5683+ if (drm_mm_init(&dev->offset_manager, DRM_FILE_PAGE_OFFSET_START,
5684+ DRM_FILE_PAGE_OFFSET_SIZE)) {
5685+ drm_ht_remove(&dev->map_hash);
5686+ return -ENOMEM;
5687+ }
5688+
5689+ if (drm_ht_create(&dev->object_hash, DRM_OBJECT_HASH_ORDER)) {
5690+ drm_ht_remove(&dev->map_hash);
5691+ drm_mm_takedown(&dev->offset_manager);
5692+ return -ENOMEM;
5693+ }
5694+
5695 /* the DRM has 6 basic counters */
5696 dev->counters = 6;
5697 dev->types[0] = _DRM_STAT_LOCK;
5698@@ -261,6 +274,7 @@
5699 }
5700 }
5701
5702+ drm_fence_manager_init(dev);
5703 return 0;
5704
5705 error_out_unreg:
5706@@ -409,6 +423,8 @@
5707 drm_free(dev, sizeof(*dev), DRM_MEM_STUB);
5708 return ret;
5709 }
5710+EXPORT_SYMBOL(drm_get_dev);
5711+
5712
5713 /**
5714 * Put a device minor number.
5715Index: linux-2.6.28/drivers/gpu/drm/drm_ttm.c
5716===================================================================
5717--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5718+++ linux-2.6.28/drivers/gpu/drm/drm_ttm.c 2009-02-20 12:23:06.000000000 +0000
5719@@ -0,0 +1,430 @@
5720+/**************************************************************************
5721+ *
5722+ * Copyright (c) 2006-2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
5723+ * All Rights Reserved.
5724+ *
5725+ * Permission is hereby granted, free of charge, to any person obtaining a
5726+ * copy of this software and associated documentation files (the
5727+ * "Software"), to deal in the Software without restriction, including
5728+ * without limitation the rights to use, copy, modify, merge, publish,
5729+ * distribute, sub license, and/or sell copies of the Software, and to
5730+ * permit persons to whom the Software is furnished to do so, subject to
5731+ * the following conditions:
5732+ *
5733+ * The above copyright notice and this permission notice (including the
5734+ * next paragraph) shall be included in all copies or substantial portions
5735+ * of the Software.
5736+ *
5737+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5738+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5739+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
5740+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
5741+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
5742+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
5743+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
5744+ *
5745+ **************************************************************************/
5746+/*
5747+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
5748+ */
5749+
5750+#include "drmP.h"
5751+#include <asm/agp.h>
5752+
5753+static void drm_ttm_ipi_handler(void *null)
5754+{
5755+ flush_agp_cache();
5756+}
5757+
5758+void drm_ttm_cache_flush(void)
5759+{
5760+ if (on_each_cpu(drm_ttm_ipi_handler, NULL, 1) != 0)
5761+ DRM_ERROR("Timed out waiting for drm cache flush.\n");
5762+}
5763+EXPORT_SYMBOL(drm_ttm_cache_flush);
5764+
5765+/*
5766+ * Use kmalloc if possible. Otherwise fall back to vmalloc.
5767+ */
5768+
5769+static void ttm_alloc_pages(struct drm_ttm *ttm)
5770+{
5771+ unsigned long size = ttm->num_pages * sizeof(*ttm->pages);
5772+ ttm->pages = NULL;
5773+
5774+ if (size <= PAGE_SIZE)
5775+ ttm->pages = drm_calloc(1, size, DRM_MEM_TTM);
5776+
5777+ if (!ttm->pages) {
5778+ ttm->pages = vmalloc_user(size);
5779+ if (ttm->pages)
5780+ ttm->page_flags |= DRM_TTM_PAGE_VMALLOC;
5781+ }
5782+}
5783+
5784+static void ttm_free_pages(struct drm_ttm *ttm)
5785+{
5786+ unsigned long size = ttm->num_pages * sizeof(*ttm->pages);
5787+
5788+ if (ttm->page_flags & DRM_TTM_PAGE_VMALLOC) {
5789+ vfree(ttm->pages);
5790+ ttm->page_flags &= ~DRM_TTM_PAGE_VMALLOC;
5791+ } else {
5792+ drm_free(ttm->pages, size, DRM_MEM_TTM);
5793+ }
5794+ ttm->pages = NULL;
5795+}
5796+
5797+static struct page *drm_ttm_alloc_page(void)
5798+{
5799+ struct page *page;
5800+
5801+ page = alloc_page(GFP_KERNEL | __GFP_ZERO | GFP_DMA32);
5802+ if (!page)
5803+ return NULL;
5804+ return page;
5805+}
5806+
5807+/*
5808+ * Change caching policy for the linear kernel map
5809+ * for range of pages in a ttm.
5810+ */
5811+
5812+static int drm_set_caching(struct drm_ttm *ttm, int noncached)
5813+{
5814+ int i;
5815+ struct page **cur_page;
5816+ int do_tlbflush = 0;
5817+
5818+ if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) == noncached)
5819+ return 0;
5820+
5821+ if (noncached)
5822+ drm_ttm_cache_flush();
5823+
5824+ for (i = 0; i < ttm->num_pages; ++i) {
5825+ cur_page = ttm->pages + i;
5826+ if (*cur_page) {
5827+ if (!PageHighMem(*cur_page)) {
5828+ if (noncached) {
5829+ map_page_into_agp(*cur_page);
5830+ } else {
5831+ unmap_page_from_agp(*cur_page);
5832+ }
5833+ do_tlbflush = 1;
5834+ }
5835+ }
5836+ }
5837+ //if (do_tlbflush)
5838+ // flush_agp_mappings();
5839+
5840+ DRM_FLAG_MASKED(ttm->page_flags, noncached, DRM_TTM_PAGE_UNCACHED);
5841+
5842+ return 0;
5843+}
5844+
5845+
5846+static void drm_ttm_free_user_pages(struct drm_ttm *ttm)
5847+{
5848+ int write;
5849+ int dirty;
5850+ struct page *page;
5851+ int i;
5852+
5853+ BUG_ON(!(ttm->page_flags & DRM_TTM_PAGE_USER));
5854+ write = ((ttm->page_flags & DRM_TTM_PAGE_USER_WRITE) != 0);
5855+ dirty = ((ttm->page_flags & DRM_TTM_PAGE_USER_DIRTY) != 0);
5856+
5857+ for (i = 0; i < ttm->num_pages; ++i) {
5858+ page = ttm->pages[i];
5859+ if (page == NULL)
5860+ continue;
5861+
5862+ if (page == ttm->dummy_read_page) {
5863+ BUG_ON(write);
5864+ continue;
5865+ }
5866+
5867+ if (write && dirty && !PageReserved(page))
5868+ set_page_dirty_lock(page);
5869+
5870+ ttm->pages[i] = NULL;
5871+ put_page(page);
5872+ }
5873+}
5874+
5875+static void drm_ttm_free_alloced_pages(struct drm_ttm *ttm)
5876+{
5877+ int i;
5878+ struct drm_buffer_manager *bm = &ttm->dev->bm;
5879+ struct page **cur_page;
5880+
5881+ for (i = 0; i < ttm->num_pages; ++i) {
5882+ cur_page = ttm->pages + i;
5883+ if (*cur_page) {
5884+ if (page_count(*cur_page) != 1)
5885+ DRM_ERROR("Erroneous page count. Leaking pages.\n");
5886+ if (page_mapped(*cur_page))
5887+ DRM_ERROR("Erroneous map count. Leaking page mappings.\n");
5888+ __free_page(*cur_page);
5889+ --bm->cur_pages;
5890+ }
5891+ }
5892+}
5893+
5894+/*
5895+ * Free all resources associated with a ttm.
5896+ */
5897+
5898+int drm_destroy_ttm(struct drm_ttm *ttm)
5899+{
5900+ struct drm_ttm_backend *be;
5901+
5902+ if (!ttm)
5903+ return 0;
5904+
5905+ be = ttm->be;
5906+ if (be) {
5907+ be->func->destroy(be);
5908+ ttm->be = NULL;
5909+ }
5910+
5911+ if (ttm->pages) {
5912+ if (ttm->page_flags & DRM_TTM_PAGE_UNCACHED)
5913+ drm_set_caching(ttm, 0);
5914+
5915+ if (ttm->page_flags & DRM_TTM_PAGE_USER)
5916+ drm_ttm_free_user_pages(ttm);
5917+ else
5918+ drm_ttm_free_alloced_pages(ttm);
5919+
5920+ ttm_free_pages(ttm);
5921+ }
5922+
5923+ return 0;
5924+}
5925+
5926+struct page *drm_ttm_get_page(struct drm_ttm *ttm, int index)
5927+{
5928+ struct page *p;
5929+ struct drm_buffer_manager *bm = &ttm->dev->bm;
5930+
5931+ p = ttm->pages[index];
5932+ if (!p) {
5933+ p = drm_ttm_alloc_page();
5934+ if (!p)
5935+ return NULL;
5936+ ttm->pages[index] = p;
5937+ ++bm->cur_pages;
5938+ }
5939+ return p;
5940+}
5941+EXPORT_SYMBOL(drm_ttm_get_page);
5942+
5943+int drm_ttm_set_user(struct drm_ttm *ttm,
5944+ struct task_struct *tsk,
5945+ int write,
5946+ unsigned long start,
5947+ unsigned long num_pages,
5948+ struct page *dummy_read_page)
5949+{
5950+ struct mm_struct *mm = tsk->mm;
5951+ int ret;
5952+ int i;
5953+
5954+ BUG_ON(num_pages != ttm->num_pages);
5955+
5956+ ttm->dummy_read_page = dummy_read_page;
5957+ ttm->page_flags |= DRM_TTM_PAGE_USER |
5958+ ((write) ? DRM_TTM_PAGE_USER_WRITE : 0);
5959+
5960+
5961+ down_read(&mm->mmap_sem);
5962+ ret = get_user_pages(tsk, mm, start, num_pages,
5963+ write, 0, ttm->pages, NULL);
5964+ up_read(&mm->mmap_sem);
5965+
5966+ if (ret != num_pages && write) {
5967+ drm_ttm_free_user_pages(ttm);
5968+ return -ENOMEM;
5969+ }
5970+
5971+ for (i = 0; i < num_pages; ++i) {
5972+ if (ttm->pages[i] == NULL)
5973+ ttm->pages[i] = ttm->dummy_read_page;
5974+ }
5975+
5976+ return 0;
5977+}
5978+
5979+int drm_ttm_populate(struct drm_ttm *ttm)
5980+{
5981+ struct page *page;
5982+ unsigned long i;
5983+ struct drm_ttm_backend *be;
5984+
5985+ if (ttm->state != ttm_unpopulated)
5986+ return 0;
5987+
5988+ be = ttm->be;
5989+ for (i = 0; i < ttm->num_pages; ++i) {
5990+ page = drm_ttm_get_page(ttm, i);
5991+ if (!page)
5992+ return -ENOMEM;
5993+ }
5994+ be->func->populate(be, ttm->num_pages, ttm->pages);
5995+ ttm->state = ttm_unbound;
5996+ return 0;
5997+}
5998+
5999+static inline size_t drm_size_align(size_t size)
6000+{
6001+ size_t tmpSize = 4;
6002+ if (size > PAGE_SIZE)
6003+ return PAGE_ALIGN(size);
6004+ while (tmpSize < size)
6005+ tmpSize <<= 1;
6006+
6007+ return (size_t) tmpSize;
6008+}
6009+
6010+/*
6011+ * Calculate the estimated pinned memory usage of a ttm.
6012+ */
6013+
6014+unsigned long drm_ttm_size(struct drm_device *dev,
6015+ unsigned long num_pages,
6016+ int user_bo)
6017+{
6018+ struct drm_bo_driver *bo_driver = dev->driver->bo_driver;
6019+ unsigned long tmp;
6020+
6021+ tmp = drm_size_align(sizeof(struct drm_ttm)) +
6022+ drm_size_align(num_pages * sizeof(struct page *)) +
6023+ ((user_bo) ? 0 : drm_size_align(num_pages * PAGE_SIZE));
6024+
6025+ if (bo_driver->backend_size)
6026+ tmp += bo_driver->backend_size(dev, num_pages);
6027+ else
6028+ tmp += drm_size_align(num_pages * sizeof(struct page *)) +
6029+ 3*drm_size_align(sizeof(struct drm_ttm_backend));
6030+ return tmp;
6031+}
6032+
6033+
6034+/*
6035+ * Initialize a ttm.
6036+ */
6037+
6038+struct drm_ttm *drm_ttm_init(struct drm_device *dev, unsigned long size)
6039+{
6040+ struct drm_bo_driver *bo_driver = dev->driver->bo_driver;
6041+ struct drm_ttm *ttm;
6042+
6043+ if (!bo_driver)
6044+ return NULL;
6045+
6046+ ttm = drm_calloc(1, sizeof(*ttm), DRM_MEM_TTM);
6047+ if (!ttm)
6048+ return NULL;
6049+
6050+ ttm->dev = dev;
6051+ atomic_set(&ttm->vma_count, 0);
6052+
6053+ ttm->destroy = 0;
6054+ ttm->num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
6055+
6056+ ttm->page_flags = 0;
6057+
6058+ /*
6059+ * Account also for AGP module memory usage.
6060+ */
6061+
6062+ ttm_alloc_pages(ttm);
6063+ if (!ttm->pages) {
6064+ drm_destroy_ttm(ttm);
6065+ DRM_ERROR("Failed allocating page table\n");
6066+ return NULL;
6067+ }
6068+ ttm->be = bo_driver->create_ttm_backend_entry(dev);
6069+ if (!ttm->be) {
6070+ drm_destroy_ttm(ttm);
6071+ DRM_ERROR("Failed creating ttm backend entry\n");
6072+ return NULL;
6073+ }
6074+ ttm->state = ttm_unpopulated;
6075+ return ttm;
6076+}
6077+
6078+/*
6079+ * Unbind a ttm region from the aperture.
6080+ */
6081+
6082+void drm_ttm_evict(struct drm_ttm *ttm)
6083+{
6084+ struct drm_ttm_backend *be = ttm->be;
6085+ int ret;
6086+
6087+ if (ttm->state == ttm_bound) {
6088+ ret = be->func->unbind(be);
6089+ BUG_ON(ret);
6090+ }
6091+
6092+ ttm->state = ttm_evicted;
6093+}
6094+
6095+void drm_ttm_fixup_caching(struct drm_ttm *ttm)
6096+{
6097+
6098+ if (ttm->state == ttm_evicted) {
6099+ struct drm_ttm_backend *be = ttm->be;
6100+ if (be->func->needs_ub_cache_adjust(be))
6101+ drm_set_caching(ttm, 0);
6102+ ttm->state = ttm_unbound;
6103+ }
6104+}
6105+
6106+void drm_ttm_unbind(struct drm_ttm *ttm)
6107+{
6108+ if (ttm->state == ttm_bound)
6109+ drm_ttm_evict(ttm);
6110+
6111+ drm_ttm_fixup_caching(ttm);
6112+}
6113+
6114+int drm_bind_ttm(struct drm_ttm *ttm, struct drm_bo_mem_reg *bo_mem)
6115+{
6116+ struct drm_bo_driver *bo_driver = ttm->dev->driver->bo_driver;
6117+ int ret = 0;
6118+ struct drm_ttm_backend *be;
6119+
6120+ if (!ttm)
6121+ return -EINVAL;
6122+ if (ttm->state == ttm_bound)
6123+ return 0;
6124+
6125+ be = ttm->be;
6126+
6127+ ret = drm_ttm_populate(ttm);
6128+ if (ret)
6129+ return ret;
6130+
6131+ if (ttm->state == ttm_unbound && !(bo_mem->flags & DRM_BO_FLAG_CACHED))
6132+ drm_set_caching(ttm, DRM_TTM_PAGE_UNCACHED);
6133+ else if ((bo_mem->flags & DRM_BO_FLAG_CACHED_MAPPED) &&
6134+ bo_driver->ttm_cache_flush)
6135+ bo_driver->ttm_cache_flush(ttm);
6136+
6137+ ret = be->func->bind(be, bo_mem);
6138+ if (ret) {
6139+ ttm->state = ttm_evicted;
6140+ DRM_ERROR("Couldn't bind backend.\n");
6141+ return ret;
6142+ }
6143+
6144+ ttm->state = ttm_bound;
6145+ if (ttm->page_flags & DRM_TTM_PAGE_USER)
6146+ ttm->page_flags |= DRM_TTM_PAGE_USER_DIRTY;
6147+ return 0;
6148+}
6149+EXPORT_SYMBOL(drm_bind_ttm);
6150Index: linux-2.6.28/drivers/gpu/drm/drm_vm.c
6151===================================================================
6152--- linux-2.6.28.orig/drivers/gpu/drm/drm_vm.c 2009-02-20 12:22:53.000000000 +0000
6153+++ linux-2.6.28/drivers/gpu/drm/drm_vm.c 2009-02-20 12:23:06.000000000 +0000
6154@@ -40,6 +40,10 @@
6155
6156 static void drm_vm_open(struct vm_area_struct *vma);
6157 static void drm_vm_close(struct vm_area_struct *vma);
6158+static int drm_bo_mmap_locked(struct vm_area_struct *vma,
6159+ struct file *filp,
6160+ drm_local_map_t *map);
6161+
6162
6163 static pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma)
6164 {
6165@@ -270,6 +274,9 @@
6166 case _DRM_GEM:
6167 DRM_ERROR("tried to rmmap GEM object\n");
6168 break;
6169+ case _DRM_TTM:
6170+ BUG_ON(1);
6171+ break;
6172 }
6173 drm_free(map, sizeof(*map), DRM_MEM_MAPS);
6174 }
6175@@ -650,6 +657,8 @@
6176 vma->vm_flags |= VM_RESERVED;
6177 vma->vm_page_prot = drm_dma_prot(map->type, vma);
6178 break;
6179+ case _DRM_TTM:
6180+ return drm_bo_mmap_locked(vma, filp, map);
6181 default:
6182 return -EINVAL; /* This should never happen. */
6183 }
6184@@ -674,3 +683,213 @@
6185 return ret;
6186 }
6187 EXPORT_SYMBOL(drm_mmap);
6188+
6189+/**
6190+ * buffer object vm functions.
6191+ */
6192+
6193+/**
6194+ * \c Pagefault method for buffer objects.
6195+ *
6196+ * \param vma Virtual memory area.
6197+ * \param address File offset.
6198+ * \return Error or refault. The pfn is manually inserted.
6199+ *
6200+ * It's important that pfns are inserted while holding the bo->mutex lock.
6201+ * otherwise we might race with unmap_mapping_range() which is always
6202+ * called with the bo->mutex lock held.
6203+ *
6204+ * We're modifying the page attribute bits of the vma->vm_page_prot field,
6205+ * without holding the mmap_sem in write mode. Only in read mode.
6206+ * These bits are not used by the mm subsystem code, and we consider them
6207+ * protected by the bo->mutex lock.
6208+ */
6209+
6210+#define DRM_NOPFN_EXTRA 15 /* Fault 16 pages at a time in */
6211+
6212+int drm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
6213+{
6214+ struct drm_buffer_object *bo = (struct drm_buffer_object *) vma->vm_private_data;
6215+ unsigned long page_offset;
6216+ struct page *page = NULL;
6217+ struct drm_ttm *ttm = NULL;
6218+ struct drm_device *dev;
6219+ unsigned long pfn;
6220+ int err;
6221+ unsigned long bus_base;
6222+ unsigned long bus_offset;
6223+ unsigned long bus_size;
6224+ int i;
6225+ unsigned long ret = VM_FAULT_NOPAGE;
6226+ unsigned long address = (unsigned long)vmf->virtual_address;
6227+
6228+ if (address > vma->vm_end)
6229+ return VM_FAULT_SIGBUS;
6230+
6231+ dev = bo->dev;
6232+ err = drm_bo_read_lock(&dev->bm.bm_lock);
6233+ if (err)
6234+ return VM_FAULT_NOPAGE;
6235+
6236+ err = mutex_lock_interruptible(&bo->mutex);
6237+ if (err) {
6238+ drm_bo_read_unlock(&dev->bm.bm_lock);
6239+ return VM_FAULT_NOPAGE;
6240+ }
6241+
6242+ err = drm_bo_wait(bo, 0, 0, 0);
6243+ if (err) {
6244+ ret = (err != -EAGAIN) ? VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
6245+ goto out_unlock;
6246+ }
6247+
6248+ /*
6249+ * If buffer happens to be in a non-mappable location,
6250+ * move it to a mappable.
6251+ */
6252+
6253+ if (!(bo->mem.flags & DRM_BO_FLAG_MAPPABLE)) {
6254+ uint32_t new_mask = bo->mem.mask |
6255+ DRM_BO_FLAG_MAPPABLE |
6256+ DRM_BO_FLAG_FORCE_MAPPABLE;
6257+ err = drm_bo_move_buffer(bo, new_mask, 0, 0);
6258+ if (err) {
6259+ ret = (err != -EAGAIN) ? VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
6260+ goto out_unlock;
6261+ }
6262+ }
6263+
6264+ err = drm_bo_pci_offset(dev, &bo->mem, &bus_base, &bus_offset,
6265+ &bus_size);
6266+
6267+ if (err) {
6268+ ret = VM_FAULT_SIGBUS;
6269+ goto out_unlock;
6270+ }
6271+
6272+ page_offset = (address - vma->vm_start) >> PAGE_SHIFT;
6273+
6274+ if (bus_size) {
6275+ struct drm_mem_type_manager *man = &dev->bm.man[bo->mem.mem_type];
6276+
6277+ pfn = ((bus_base + bus_offset) >> PAGE_SHIFT) + page_offset;
6278+ vma->vm_page_prot = drm_io_prot(man->drm_bus_maptype, vma);
6279+ } else {
6280+ ttm = bo->ttm;
6281+
6282+ drm_ttm_fixup_caching(ttm);
6283+ page = drm_ttm_get_page(ttm, page_offset);
6284+ if (!page) {
6285+ ret = VM_FAULT_OOM;
6286+ goto out_unlock;
6287+ }
6288+ pfn = page_to_pfn(page);
6289+ vma->vm_page_prot = (bo->mem.flags & DRM_BO_FLAG_CACHED) ?
6290+ vm_get_page_prot(vma->vm_flags) :
6291+ drm_io_prot(_DRM_TTM, vma);
6292+ }
6293+
6294+ err = vm_insert_pfn(vma, address, pfn);
6295+ if (err) {
6296+ ret = (err != -EAGAIN) ? VM_FAULT_OOM : VM_FAULT_NOPAGE;
6297+ goto out_unlock;
6298+ }
6299+
6300+ for (i=0; i<DRM_NOPFN_EXTRA; ++i) {
6301+
6302+ if (++page_offset == bo->mem.num_pages)
6303+ break;
6304+ address = vma->vm_start + (page_offset << PAGE_SHIFT);
6305+ if (address >= vma->vm_end)
6306+ break;
6307+ if (bus_size) {
6308+ pfn = ((bus_base + bus_offset) >> PAGE_SHIFT)
6309+ + page_offset;
6310+ } else {
6311+ page = drm_ttm_get_page(ttm, page_offset);
6312+ if (!page)
6313+ break;
6314+ pfn = page_to_pfn(page);
6315+ }
6316+ if (vm_insert_pfn(vma, address, pfn))
6317+ break;
6318+ }
6319+out_unlock:
6320+ mutex_unlock(&bo->mutex);
6321+ drm_bo_read_unlock(&dev->bm.bm_lock);
6322+ return ret;
6323+}
6324+EXPORT_SYMBOL(drm_bo_vm_fault);
6325+
6326+static void drm_bo_vm_open_locked(struct vm_area_struct *vma)
6327+{
6328+ struct drm_buffer_object *bo = (struct drm_buffer_object *) vma->vm_private_data;
6329+
6330+ drm_vm_open_locked(vma);
6331+ atomic_inc(&bo->usage);
6332+}
6333+
6334+/**
6335+ * \c vma open method for buffer objects.
6336+ *
6337+ * \param vma virtual memory area.
6338+ */
6339+
6340+static void drm_bo_vm_open(struct vm_area_struct *vma)
6341+{
6342+ struct drm_buffer_object *bo = (struct drm_buffer_object *) vma->vm_private_data;
6343+ struct drm_device *dev = bo->dev;
6344+
6345+ mutex_lock(&dev->struct_mutex);
6346+ drm_bo_vm_open_locked(vma);
6347+ mutex_unlock(&dev->struct_mutex);
6348+}
6349+
6350+/**
6351+ * \c vma close method for buffer objects.
6352+ *
6353+ * \param vma virtual memory area.
6354+ */
6355+
6356+static void drm_bo_vm_close(struct vm_area_struct *vma)
6357+{
6358+ struct drm_buffer_object *bo = (struct drm_buffer_object *) vma->vm_private_data;
6359+ struct drm_device *dev = bo->dev;
6360+
6361+ drm_vm_close(vma);
6362+ if (bo) {
6363+ mutex_lock(&dev->struct_mutex);
6364+ drm_bo_usage_deref_locked((struct drm_buffer_object **)
6365+ &vma->vm_private_data);
6366+ mutex_unlock(&dev->struct_mutex);
6367+ }
6368+ return;
6369+}
6370+
6371+static struct vm_operations_struct drm_bo_vm_ops = {
6372+ .fault = drm_bo_vm_fault,
6373+ .open = drm_bo_vm_open,
6374+ .close = drm_bo_vm_close,
6375+};
6376+
6377+/**
6378+ * mmap buffer object memory.
6379+ *
6380+ * \param vma virtual memory area.
6381+ * \param file_priv DRM file private.
6382+ * \param map The buffer object drm map.
6383+ * \return zero on success or a negative number on failure.
6384+ */
6385+
6386+int drm_bo_mmap_locked(struct vm_area_struct *vma,
6387+ struct file *filp,
6388+ drm_local_map_t *map)
6389+{
6390+ vma->vm_ops = &drm_bo_vm_ops;
6391+ vma->vm_private_data = map->handle;
6392+ vma->vm_file = filp;
6393+ vma->vm_flags |= VM_RESERVED | VM_IO;
6394+ vma->vm_flags |= VM_PFNMAP;
6395+ drm_bo_vm_open_locked(vma);
6396+ return 0;
6397+}
6398Index: linux-2.6.28/drivers/gpu/drm/psb/Makefile
6399===================================================================
6400--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6401+++ linux-2.6.28/drivers/gpu/drm/psb/Makefile 2009-02-20 14:48:03.000000000 +0000
6402@@ -0,0 +1,12 @@
6403+#
6404+# Makefile for the drm device driver. This driver provides support for the
6405+# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
6406+
6407+ccflags-y := -Iinclude/drm
6408+
6409+psb-y := psb_drv.o psb_mmu.o psb_sgx.o psb_irq.o psb_fence.o psb_buffer.o \
6410+ psb_gtt.o psb_fb.o psb_msvdx.o \
6411+ psb_msvdxinit.o psb_regman.o psb_reset.o psb_scene.o \
6412+ psb_schedule.o psb_xhw.o
6413+
6414+obj-$(CONFIG_DRM_PSB) += psb.o
6415Index: linux-2.6.28/drivers/gpu/drm/psb/psb_buffer.c
6416===================================================================
6417--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6418+++ linux-2.6.28/drivers/gpu/drm/psb/psb_buffer.c 2009-02-20 12:23:06.000000000 +0000
6419@@ -0,0 +1,437 @@
6420+/**************************************************************************
6421+ * Copyright (c) 2007, Intel Corporation.
6422+ * All Rights Reserved.
6423+ *
6424+ * This program is free software; you can redistribute it and/or modify it
6425+ * under the terms and conditions of the GNU General Public License,
6426+ * version 2, as published by the Free Software Foundation.
6427+ *
6428+ * This program is distributed in the hope it will be useful, but WITHOUT
6429+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6430+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
6431+ * more details.
6432+ *
6433+ * You should have received a copy of the GNU General Public License along with
6434+ * this program; if not, write to the Free Software Foundation, Inc.,
6435+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
6436+ *
6437+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
6438+ * develop this driver.
6439+ *
6440+ **************************************************************************/
6441+/*
6442+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
6443+ */
6444+#include "drmP.h"
6445+#include "psb_drv.h"
6446+#include "psb_schedule.h"
6447+
6448+struct drm_psb_ttm_backend {
6449+ struct drm_ttm_backend base;
6450+ struct page **pages;
6451+ unsigned int desired_tile_stride;
6452+ unsigned int hw_tile_stride;
6453+ int mem_type;
6454+ unsigned long offset;
6455+ unsigned long num_pages;
6456+};
6457+
6458+int psb_fence_types(struct drm_buffer_object *bo, uint32_t * class,
6459+ uint32_t * type)
6460+{
6461+ switch (*class) {
6462+ case PSB_ENGINE_TA:
6463+ *type = DRM_FENCE_TYPE_EXE |
6464+ _PSB_FENCE_TYPE_TA_DONE | _PSB_FENCE_TYPE_RASTER_DONE;
6465+ if (bo->mem.mask & PSB_BO_FLAG_TA)
6466+ *type &= ~_PSB_FENCE_TYPE_RASTER_DONE;
6467+ if (bo->mem.mask & PSB_BO_FLAG_SCENE)
6468+ *type |= _PSB_FENCE_TYPE_SCENE_DONE;
6469+ if (bo->mem.mask & PSB_BO_FLAG_FEEDBACK)
6470+ *type |= _PSB_FENCE_TYPE_FEEDBACK;
6471+ break;
6472+ default:
6473+ *type = DRM_FENCE_TYPE_EXE;
6474+ }
6475+ return 0;
6476+}
6477+
6478+static inline size_t drm_size_align(size_t size)
6479+{
6480+ size_t tmpSize = 4;
6481+ if (size > PAGE_SIZE)
6482+ return PAGE_ALIGN(size);
6483+ while (tmpSize < size)
6484+ tmpSize <<= 1;
6485+
6486+ return (size_t) tmpSize;
6487+}
6488+
6489+/*
6490+ * Poulsbo GPU virtual space looks like this
6491+ * (We currently use only one MMU context).
6492+ *
6493+ * gatt_start = Start of GATT aperture in bus space.
6494+ * stolen_end = End of GATT populated by stolen memory in bus space.
6495+ * gatt_end = End of GATT
6496+ * twod_end = MIN(gatt_start + 256_MEM, gatt_end)
6497+ *
6498+ * 0x00000000 -> 0x10000000 Temporary mapping space for tiling- and copy operations.
6499+ * This space is not managed and is protected by the
6500+ * temp_mem mutex.
6501+ *
6502+ * 0x10000000 -> 0x20000000 DRM_PSB_MEM_KERNEL For kernel buffers.
6503+ *
6504+ * 0x20000000 -> gatt_start DRM_PSB_MEM_MMU For generic MMU-only use.
6505+ *
6506+ * gatt_start -> stolen_end DRM_BO_MEM_VRAM Pre-populated GATT pages.
6507+ *
6508+ * stolen_end -> twod_end DRM_BO_MEM_TT GATT memory usable by 2D engine.
6509+ *
6510+ * twod_end -> gatt_end DRM_BO_MEM_APER GATT memory not usable by 2D engine.
6511+ *
6512+ * gatt_end -> 0xffffffff Currently unused.
6513+ */
6514+
6515+int psb_init_mem_type(struct drm_device *dev, uint32_t type,
6516+ struct drm_mem_type_manager *man)
6517+{
6518+ struct drm_psb_private *dev_priv =
6519+ (struct drm_psb_private *)dev->dev_private;
6520+ struct psb_gtt *pg = dev_priv->pg;
6521+
6522+ switch (type) {
6523+ case DRM_BO_MEM_LOCAL:
6524+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6525+ _DRM_FLAG_MEMTYPE_CACHED;
6526+ man->drm_bus_maptype = 0;
6527+ break;
6528+ case DRM_PSB_MEM_KERNEL:
6529+ man->io_offset = 0x00000000;
6530+ man->io_size = 0x00000000;
6531+ man->io_addr = NULL;
6532+ man->drm_bus_maptype = _DRM_TTM;
6533+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6534+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA;
6535+ man->gpu_offset = PSB_MEM_KERNEL_START;
6536+ break;
6537+ case DRM_PSB_MEM_MMU:
6538+ man->io_offset = 0x00000000;
6539+ man->io_size = 0x00000000;
6540+ man->io_addr = NULL;
6541+ man->drm_bus_maptype = _DRM_TTM;
6542+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6543+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA;
6544+ man->gpu_offset = PSB_MEM_MMU_START;
6545+ break;
6546+ case DRM_PSB_MEM_PDS:
6547+ man->io_offset = 0x00000000;
6548+ man->io_size = 0x00000000;
6549+ man->io_addr = NULL;
6550+ man->drm_bus_maptype = _DRM_TTM;
6551+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6552+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA;
6553+ man->gpu_offset = PSB_MEM_PDS_START;
6554+ break;
6555+ case DRM_PSB_MEM_RASTGEOM:
6556+ man->io_offset = 0x00000000;
6557+ man->io_size = 0x00000000;
6558+ man->io_addr = NULL;
6559+ man->drm_bus_maptype = _DRM_TTM;
6560+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6561+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA;
6562+ man->gpu_offset = PSB_MEM_RASTGEOM_START;
6563+ break;
6564+ case DRM_BO_MEM_VRAM:
6565+ man->io_addr = NULL;
6566+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6567+ _DRM_FLAG_MEMTYPE_FIXED | _DRM_FLAG_NEEDS_IOREMAP;
6568+#ifdef PSB_WORKING_HOST_MMU_ACCESS
6569+ man->drm_bus_maptype = _DRM_AGP;
6570+ man->io_offset = pg->gatt_start;
6571+ man->io_size = pg->gatt_pages << PAGE_SHIFT;
6572+#else
6573+ man->drm_bus_maptype = _DRM_TTM; /* Forces uncached */
6574+ man->io_offset = pg->stolen_base;
6575+ man->io_size = pg->stolen_size;
6576+#endif
6577+ man->gpu_offset = pg->gatt_start;
6578+ break;
6579+ case DRM_BO_MEM_TT: /* Mappable GATT memory */
6580+ man->io_offset = pg->gatt_start;
6581+ man->io_size = pg->gatt_pages << PAGE_SHIFT;
6582+ man->io_addr = NULL;
6583+#ifdef PSB_WORKING_HOST_MMU_ACCESS
6584+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6585+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_NEEDS_IOREMAP;
6586+ man->drm_bus_maptype = _DRM_AGP;
6587+#else
6588+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6589+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA;
6590+ man->drm_bus_maptype = _DRM_TTM;
6591+#endif
6592+ man->gpu_offset = pg->gatt_start;
6593+ break;
6594+ case DRM_PSB_MEM_APER: /*MMU memory. Mappable. Not usable for 2D. */
6595+ man->io_offset = pg->gatt_start;
6596+ man->io_size = pg->gatt_pages << PAGE_SHIFT;
6597+ man->io_addr = NULL;
6598+#ifdef PSB_WORKING_HOST_MMU_ACCESS
6599+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6600+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_NEEDS_IOREMAP;
6601+ man->drm_bus_maptype = _DRM_AGP;
6602+#else
6603+ man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
6604+ _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA;
6605+ man->drm_bus_maptype = _DRM_TTM;
6606+#endif
6607+ man->gpu_offset = pg->gatt_start;
6608+ break;
6609+ default:
6610+ DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
6611+ return -EINVAL;
6612+ }
6613+ return 0;
6614+}
6615+
6616+uint32_t psb_evict_mask(struct drm_buffer_object * bo)
6617+{
6618+ switch (bo->mem.mem_type) {
6619+ case DRM_BO_MEM_VRAM:
6620+ return DRM_BO_FLAG_MEM_TT;
6621+ default:
6622+ return DRM_BO_FLAG_MEM_LOCAL;
6623+ }
6624+}
6625+
6626+int psb_invalidate_caches(struct drm_device *dev, uint64_t flags)
6627+{
6628+ return 0;
6629+}
6630+
6631+static int psb_move_blit(struct drm_buffer_object *bo,
6632+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem)
6633+{
6634+ struct drm_bo_mem_reg *old_mem = &bo->mem;
6635+ int dir = 0;
6636+
6637+ if ((old_mem->mem_type == new_mem->mem_type) &&
6638+ (new_mem->mm_node->start <
6639+ old_mem->mm_node->start + old_mem->mm_node->size)) {
6640+ dir = 1;
6641+ }
6642+
6643+ psb_emit_2d_copy_blit(bo->dev,
6644+ old_mem->mm_node->start << PAGE_SHIFT,
6645+ new_mem->mm_node->start << PAGE_SHIFT,
6646+ new_mem->num_pages, dir);
6647+
6648+ return drm_bo_move_accel_cleanup(bo, evict, no_wait, 0,
6649+ DRM_FENCE_TYPE_EXE, 0, new_mem);
6650+}
6651+
6652+/*
6653+ * Flip destination ttm into cached-coherent GATT,
6654+ * then blit and subsequently move out again.
6655+ */
6656+
6657+static int psb_move_flip(struct drm_buffer_object *bo,
6658+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem)
6659+{
6660+ struct drm_device *dev = bo->dev;
6661+ struct drm_bo_mem_reg tmp_mem;
6662+ int ret;
6663+
6664+ tmp_mem = *new_mem;
6665+ tmp_mem.mm_node = NULL;
6666+ tmp_mem.mask = DRM_BO_FLAG_MEM_TT |
6667+ DRM_BO_FLAG_CACHED | DRM_BO_FLAG_FORCE_CACHING;
6668+
6669+ ret = drm_bo_mem_space(bo, &tmp_mem, no_wait);
6670+ if (ret)
6671+ return ret;
6672+ ret = drm_bind_ttm(bo->ttm, &tmp_mem);
6673+ if (ret)
6674+ goto out_cleanup;
6675+ ret = psb_move_blit(bo, 1, no_wait, &tmp_mem);
6676+ if (ret)
6677+ goto out_cleanup;
6678+
6679+ ret = drm_bo_move_ttm(bo, evict, no_wait, new_mem);
6680+ out_cleanup:
6681+ if (tmp_mem.mm_node) {
6682+ mutex_lock(&dev->struct_mutex);
6683+ if (tmp_mem.mm_node != bo->pinned_node)
6684+ drm_mm_put_block(tmp_mem.mm_node);
6685+ tmp_mem.mm_node = NULL;
6686+ mutex_unlock(&dev->struct_mutex);
6687+ }
6688+ return ret;
6689+}
6690+
6691+int psb_move(struct drm_buffer_object *bo,
6692+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem)
6693+{
6694+ struct drm_bo_mem_reg *old_mem = &bo->mem;
6695+
6696+ if (old_mem->mem_type == DRM_BO_MEM_LOCAL) {
6697+ return drm_bo_move_memcpy(bo, evict, no_wait, new_mem);
6698+ } else if (new_mem->mem_type == DRM_BO_MEM_LOCAL) {
6699+ if (psb_move_flip(bo, evict, no_wait, new_mem))
6700+ return drm_bo_move_memcpy(bo, evict, no_wait, new_mem);
6701+ } else {
6702+ if (psb_move_blit(bo, evict, no_wait, new_mem))
6703+ return drm_bo_move_memcpy(bo, evict, no_wait, new_mem);
6704+ }
6705+ return 0;
6706+}
6707+
6708+static int drm_psb_tbe_nca(struct drm_ttm_backend *backend)
6709+{
6710+ return ((backend->flags & DRM_BE_FLAG_BOUND_CACHED) ? 0 : 1);
6711+}
6712+
6713+static int drm_psb_tbe_populate(struct drm_ttm_backend *backend,
6714+ unsigned long num_pages, struct page **pages)
6715+{
6716+ struct drm_psb_ttm_backend *psb_be =
6717+ container_of(backend, struct drm_psb_ttm_backend, base);
6718+
6719+ psb_be->pages = pages;
6720+ return 0;
6721+}
6722+
6723+static int drm_psb_tbe_unbind(struct drm_ttm_backend *backend)
6724+{
6725+ struct drm_device *dev = backend->dev;
6726+ struct drm_psb_private *dev_priv =
6727+ (struct drm_psb_private *)dev->dev_private;
6728+ struct drm_psb_ttm_backend *psb_be =
6729+ container_of(backend, struct drm_psb_ttm_backend, base);
6730+ struct psb_mmu_pd *pd = psb_mmu_get_default_pd(dev_priv->mmu);
6731+ struct drm_mem_type_manager *man = &dev->bm.man[psb_be->mem_type];
6732+
6733+ PSB_DEBUG_RENDER("MMU unbind.\n");
6734+
6735+ if (psb_be->mem_type == DRM_BO_MEM_TT) {
6736+ uint32_t gatt_p_offset = (psb_be->offset - man->gpu_offset) >>
6737+ PAGE_SHIFT;
6738+
6739+ (void)psb_gtt_remove_pages(dev_priv->pg, gatt_p_offset,
6740+ psb_be->num_pages,
6741+ psb_be->desired_tile_stride,
6742+ psb_be->hw_tile_stride);
6743+ }
6744+
6745+ psb_mmu_remove_pages(pd, psb_be->offset,
6746+ psb_be->num_pages,
6747+ psb_be->desired_tile_stride,
6748+ psb_be->hw_tile_stride);
6749+
6750+ return 0;
6751+}
6752+
6753+static int drm_psb_tbe_bind(struct drm_ttm_backend *backend,
6754+ struct drm_bo_mem_reg *bo_mem)
6755+{
6756+ struct drm_device *dev = backend->dev;
6757+ struct drm_psb_private *dev_priv =
6758+ (struct drm_psb_private *)dev->dev_private;
6759+ struct drm_psb_ttm_backend *psb_be =
6760+ container_of(backend, struct drm_psb_ttm_backend, base);
6761+ struct psb_mmu_pd *pd = psb_mmu_get_default_pd(dev_priv->mmu);
6762+ struct drm_mem_type_manager *man = &dev->bm.man[bo_mem->mem_type];
6763+ int type;
6764+ int ret = 0;
6765+
6766+ psb_be->mem_type = bo_mem->mem_type;
6767+ psb_be->num_pages = bo_mem->num_pages;
6768+ psb_be->desired_tile_stride = bo_mem->desired_tile_stride;
6769+ psb_be->hw_tile_stride = bo_mem->hw_tile_stride;
6770+ psb_be->desired_tile_stride = 0;
6771+ psb_be->hw_tile_stride = 0;
6772+ psb_be->offset = (bo_mem->mm_node->start << PAGE_SHIFT) +
6773+ man->gpu_offset;
6774+
6775+ type = (bo_mem->flags & DRM_BO_FLAG_CACHED) ? PSB_MMU_CACHED_MEMORY : 0;
6776+
6777+ PSB_DEBUG_RENDER("MMU bind.\n");
6778+ if (psb_be->mem_type == DRM_BO_MEM_TT) {
6779+ uint32_t gatt_p_offset = (psb_be->offset - man->gpu_offset) >>
6780+ PAGE_SHIFT;
6781+
6782+ ret = psb_gtt_insert_pages(dev_priv->pg, psb_be->pages,
6783+ gatt_p_offset,
6784+ psb_be->num_pages,
6785+ psb_be->desired_tile_stride,
6786+ psb_be->hw_tile_stride, type);
6787+ }
6788+
6789+ ret = psb_mmu_insert_pages(pd, psb_be->pages,
6790+ psb_be->offset, psb_be->num_pages,
6791+ psb_be->desired_tile_stride,
6792+ psb_be->hw_tile_stride, type);
6793+ if (ret)
6794+ goto out_err;
6795+
6796+ DRM_FLAG_MASKED(backend->flags, (bo_mem->flags & DRM_BO_FLAG_CACHED) ?
6797+ DRM_BE_FLAG_BOUND_CACHED : 0, DRM_BE_FLAG_BOUND_CACHED);
6798+
6799+ return 0;
6800+ out_err:
6801+ drm_psb_tbe_unbind(backend);
6802+ return ret;
6803+
6804+}
6805+
6806+static void drm_psb_tbe_clear(struct drm_ttm_backend *backend)
6807+{
6808+ struct drm_psb_ttm_backend *psb_be =
6809+ container_of(backend, struct drm_psb_ttm_backend, base);
6810+
6811+ psb_be->pages = NULL;
6812+ return;
6813+}
6814+
6815+static void drm_psb_tbe_destroy(struct drm_ttm_backend *backend)
6816+{
6817+ struct drm_psb_ttm_backend *psb_be =
6818+ container_of(backend, struct drm_psb_ttm_backend, base);
6819+
6820+ if (backend)
6821+ drm_free(psb_be, sizeof(*psb_be), DRM_MEM_TTM);
6822+}
6823+
6824+static struct drm_ttm_backend_func psb_ttm_backend = {
6825+ .needs_ub_cache_adjust = drm_psb_tbe_nca,
6826+ .populate = drm_psb_tbe_populate,
6827+ .clear = drm_psb_tbe_clear,
6828+ .bind = drm_psb_tbe_bind,
6829+ .unbind = drm_psb_tbe_unbind,
6830+ .destroy = drm_psb_tbe_destroy,
6831+};
6832+
6833+struct drm_ttm_backend *drm_psb_tbe_init(struct drm_device *dev)
6834+{
6835+ struct drm_psb_ttm_backend *psb_be;
6836+
6837+ psb_be = drm_calloc(1, sizeof(*psb_be), DRM_MEM_TTM);
6838+ if (!psb_be)
6839+ return NULL;
6840+ psb_be->pages = NULL;
6841+ psb_be->base.func = &psb_ttm_backend;
6842+ psb_be->base.dev = dev;
6843+
6844+ return &psb_be->base;
6845+}
6846+
6847+int psb_tbe_size(struct drm_device *dev, unsigned long num_pages)
6848+{
6849+ /*
6850+ * Return the size of the structures themselves and the
6851+ * estimated size of the pagedir and pagetable entries.
6852+ */
6853+
6854+ return drm_size_align(sizeof(struct drm_psb_ttm_backend)) +
6855+ 8*num_pages;
6856+}
6857Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drm.h
6858===================================================================
6859--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6860+++ linux-2.6.28/drivers/gpu/drm/psb/psb_drm.h 2009-02-20 12:23:06.000000000 +0000
6861@@ -0,0 +1,370 @@
6862+/**************************************************************************
6863+ * Copyright (c) 2007, Intel Corporation.
6864+ * All Rights Reserved.
6865+ *
6866+ * This program is free software; you can redistribute it and/or modify it
6867+ * under the terms and conditions of the GNU General Public License,
6868+ * version 2, as published by the Free Software Foundation.
6869+ *
6870+ * This program is distributed in the hope it will be useful, but WITHOUT
6871+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6872+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
6873+ * more details.
6874+ *
6875+ * You should have received a copy of the GNU General Public License along with
6876+ * this program; if not, write to the Free Software Foundation, Inc.,
6877+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
6878+ *
6879+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
6880+ * develop this driver.
6881+ *
6882+ **************************************************************************/
6883+/*
6884+ */
6885+
6886+#ifndef _PSB_DRM_H_
6887+#define _PSB_DRM_H_
6888+
6889+#if defined(__linux__) && !defined(__KERNEL__)
6890+#include<stdint.h>
6891+#endif
6892+
6893+/*
6894+ * Intel Poulsbo driver package version.
6895+ *
6896+ */
6897+/* #define PSB_PACKAGE_VERSION "ED"__DATE__*/
6898+#define PSB_PACKAGE_VERSION "2.1.0.32L.0019"
6899+
6900+#define DRM_PSB_SAREA_MAJOR 0
6901+#define DRM_PSB_SAREA_MINOR 1
6902+#define PSB_FIXED_SHIFT 16
6903+
6904+/*
6905+ * Public memory types.
6906+ */
6907+
6908+#define DRM_PSB_MEM_MMU DRM_BO_MEM_PRIV1
6909+#define DRM_PSB_FLAG_MEM_MMU DRM_BO_FLAG_MEM_PRIV1
6910+#define DRM_PSB_MEM_PDS DRM_BO_MEM_PRIV2
6911+#define DRM_PSB_FLAG_MEM_PDS DRM_BO_FLAG_MEM_PRIV2
6912+#define DRM_PSB_MEM_APER DRM_BO_MEM_PRIV3
6913+#define DRM_PSB_FLAG_MEM_APER DRM_BO_FLAG_MEM_PRIV3
6914+#define DRM_PSB_MEM_RASTGEOM DRM_BO_MEM_PRIV4
6915+#define DRM_PSB_FLAG_MEM_RASTGEOM DRM_BO_FLAG_MEM_PRIV4
6916+#define PSB_MEM_RASTGEOM_START 0x30000000
6917+
6918+typedef int32_t psb_fixed;
6919+typedef uint32_t psb_ufixed;
6920+
6921+static inline psb_fixed psb_int_to_fixed(int a)
6922+{
6923+ return a * (1 << PSB_FIXED_SHIFT);
6924+}
6925+
6926+static inline psb_ufixed psb_unsigned_to_ufixed(unsigned int a)
6927+{
6928+ return a << PSB_FIXED_SHIFT;
6929+}
6930+
6931+/*Status of the command sent to the gfx device.*/
6932+typedef enum {
6933+ DRM_CMD_SUCCESS,
6934+ DRM_CMD_FAILED,
6935+ DRM_CMD_HANG
6936+} drm_cmd_status_t;
6937+
6938+struct drm_psb_scanout {
6939+ uint32_t buffer_id; /* DRM buffer object ID */
6940+ uint32_t rotation; /* Rotation as in RR_rotation definitions */
6941+ uint32_t stride; /* Buffer stride in bytes */
6942+ uint32_t depth; /* Buffer depth in bits (NOT) bpp */
6943+ uint32_t width; /* Buffer width in pixels */
6944+ uint32_t height; /* Buffer height in lines */
6945+ psb_fixed transform[3][3]; /* Buffer composite transform */
6946+ /* (scaling, rot, reflect) */
6947+};
6948+
6949+#define DRM_PSB_SAREA_OWNERS 16
6950+#define DRM_PSB_SAREA_OWNER_2D 0
6951+#define DRM_PSB_SAREA_OWNER_3D 1
6952+
6953+#define DRM_PSB_SAREA_SCANOUTS 3
6954+
6955+struct drm_psb_sarea {
6956+ /* Track changes of this data structure */
6957+
6958+ uint32_t major;
6959+ uint32_t minor;
6960+
6961+ /* Last context to touch part of hw */
6962+ uint32_t ctx_owners[DRM_PSB_SAREA_OWNERS];
6963+
6964+ /* Definition of front- and rotated buffers */
6965+ uint32_t num_scanouts;
6966+ struct drm_psb_scanout scanouts[DRM_PSB_SAREA_SCANOUTS];
6967+
6968+ int pipeA_x;
6969+ int pipeA_y;
6970+ int pipeA_w;
6971+ int pipeA_h;
6972+ int pipeB_x;
6973+ int pipeB_y;
6974+ int pipeB_w;
6975+ int pipeB_h;
6976+ uint32_t msvdx_state;
6977+ uint32_t msvdx_context;
6978+};
6979+
6980+#define PSB_RELOC_MAGIC 0x67676767
6981+#define PSB_RELOC_SHIFT_MASK 0x0000FFFF
6982+#define PSB_RELOC_SHIFT_SHIFT 0
6983+#define PSB_RELOC_ALSHIFT_MASK 0xFFFF0000
6984+#define PSB_RELOC_ALSHIFT_SHIFT 16
6985+
6986+#define PSB_RELOC_OP_OFFSET 0 /* Offset of the indicated
6987+ * buffer
6988+ */
6989+#define PSB_RELOC_OP_2D_OFFSET 1 /* Offset of the indicated
6990+ * buffer, relative to 2D
6991+ * base address
6992+ */
6993+#define PSB_RELOC_OP_PDS_OFFSET 2 /* Offset of the indicated buffer,
6994+ * relative to PDS base address
6995+ */
6996+#define PSB_RELOC_OP_STRIDE 3 /* Stride of the indicated
6997+ * buffer (for tiling)
6998+ */
6999+#define PSB_RELOC_OP_USE_OFFSET 4 /* Offset of USE buffer
7000+ * relative to base reg
7001+ */
7002+#define PSB_RELOC_OP_USE_REG 5 /* Base reg of USE buffer */
7003+
7004+struct drm_psb_reloc {
7005+ uint32_t reloc_op;
7006+ uint32_t where; /* offset in destination buffer */
7007+ uint32_t buffer; /* Buffer reloc applies to */
7008+ uint32_t mask; /* Destination format: */
7009+ uint32_t shift; /* Destination format: */
7010+ uint32_t pre_add; /* Destination format: */
7011+ uint32_t background; /* Destination add */
7012+ uint32_t dst_buffer; /* Destination buffer. Index into buffer_list */
7013+ uint32_t arg0; /* Reloc-op dependant */
7014+ uint32_t arg1;
7015+};
7016+
7017+#define PSB_BO_FLAG_TA (1ULL << 48)
7018+#define PSB_BO_FLAG_SCENE (1ULL << 49)
7019+#define PSB_BO_FLAG_FEEDBACK (1ULL << 50)
7020+#define PSB_BO_FLAG_USSE (1ULL << 51)
7021+
7022+#define PSB_ENGINE_2D 0
7023+#define PSB_ENGINE_VIDEO 1
7024+#define PSB_ENGINE_RASTERIZER 2
7025+#define PSB_ENGINE_TA 3
7026+#define PSB_ENGINE_HPRAST 4
7027+
7028+/*
7029+ * For this fence class we have a couple of
7030+ * fence types.
7031+ */
7032+
7033+#define _PSB_FENCE_EXE_SHIFT 0
7034+#define _PSB_FENCE_TA_DONE_SHIFT 1
7035+#define _PSB_FENCE_RASTER_DONE_SHIFT 2
7036+#define _PSB_FENCE_SCENE_DONE_SHIFT 3
7037+#define _PSB_FENCE_FEEDBACK_SHIFT 4
7038+
7039+#define _PSB_ENGINE_TA_FENCE_TYPES 5
7040+#define _PSB_FENCE_TYPE_TA_DONE (1 << _PSB_FENCE_TA_DONE_SHIFT)
7041+#define _PSB_FENCE_TYPE_RASTER_DONE (1 << _PSB_FENCE_RASTER_DONE_SHIFT)
7042+#define _PSB_FENCE_TYPE_SCENE_DONE (1 << _PSB_FENCE_SCENE_DONE_SHIFT)
7043+#define _PSB_FENCE_TYPE_FEEDBACK (1 << _PSB_FENCE_FEEDBACK_SHIFT)
7044+
7045+#define PSB_ENGINE_HPRAST 4
7046+#define PSB_NUM_ENGINES 5
7047+
7048+#define PSB_TA_FLAG_FIRSTPASS (1 << 0)
7049+#define PSB_TA_FLAG_LASTPASS (1 << 1)
7050+
7051+#define PSB_FEEDBACK_OP_VISTEST (1 << 0)
7052+
7053+struct drm_psb_scene {
7054+ int handle_valid;
7055+ uint32_t handle;
7056+ uint32_t w;
7057+ uint32_t h;
7058+ uint32_t num_buffers;
7059+};
7060+
7061+struct drm_psb_hw_info
7062+{
7063+ uint32_t rev_id;
7064+ uint32_t caps;
7065+};
7066+
7067+typedef struct drm_psb_cmdbuf_arg {
7068+ uint64_t buffer_list; /* List of buffers to validate */
7069+ uint64_t clip_rects; /* See i915 counterpart */
7070+ uint64_t scene_arg;
7071+ uint64_t fence_arg;
7072+
7073+ uint32_t ta_flags;
7074+
7075+ uint32_t ta_handle; /* TA reg-value pairs */
7076+ uint32_t ta_offset;
7077+ uint32_t ta_size;
7078+
7079+ uint32_t oom_handle;
7080+ uint32_t oom_offset;
7081+ uint32_t oom_size;
7082+
7083+ uint32_t cmdbuf_handle; /* 2D Command buffer object or, */
7084+ uint32_t cmdbuf_offset; /* rasterizer reg-value pairs */
7085+ uint32_t cmdbuf_size;
7086+
7087+ uint32_t reloc_handle; /* Reloc buffer object */
7088+ uint32_t reloc_offset;
7089+ uint32_t num_relocs;
7090+
7091+ int32_t damage; /* Damage front buffer with cliprects */
7092+ /* Not implemented yet */
7093+ uint32_t fence_flags;
7094+ uint32_t engine;
7095+
7096+ /*
7097+ * Feedback;
7098+ */
7099+
7100+ uint32_t feedback_ops;
7101+ uint32_t feedback_handle;
7102+ uint32_t feedback_offset;
7103+ uint32_t feedback_breakpoints;
7104+ uint32_t feedback_size;
7105+} drm_psb_cmdbuf_arg_t;
7106+
7107+struct drm_psb_xhw_init_arg {
7108+ uint32_t operation;
7109+ uint32_t buffer_handle;
7110+};
7111+
7112+/*
7113+ * Feedback components:
7114+ */
7115+
7116+/*
7117+ * Vistest component. The number of these in the feedback buffer
7118+ * equals the number of vistest breakpoints + 1.
7119+ * This is currently the only feedback component.
7120+ */
7121+
7122+struct drm_psb_vistest {
7123+ uint32_t vt[8];
7124+};
7125+
7126+#define PSB_HW_COOKIE_SIZE 16
7127+#define PSB_HW_FEEDBACK_SIZE 8
7128+#define PSB_HW_OOM_CMD_SIZE 6
7129+
7130+struct drm_psb_xhw_arg {
7131+ uint32_t op;
7132+ int ret;
7133+ uint32_t irq_op;
7134+ uint32_t issue_irq;
7135+ uint32_t cookie[PSB_HW_COOKIE_SIZE];
7136+ union {
7137+ struct {
7138+ uint32_t w;
7139+ uint32_t h;
7140+ uint32_t size;
7141+ uint32_t clear_p_start;
7142+ uint32_t clear_num_pages;
7143+ } si;
7144+ struct {
7145+ uint32_t fire_flags;
7146+ uint32_t hw_context;
7147+ uint32_t offset;
7148+ uint32_t engine;
7149+ uint32_t flags;
7150+ uint32_t rca;
7151+ uint32_t num_oom_cmds;
7152+ uint32_t oom_cmds[PSB_HW_OOM_CMD_SIZE];
7153+ } sb;
7154+ struct {
7155+ uint32_t pages;
7156+ uint32_t size;
7157+ } bi;
7158+ struct {
7159+ uint32_t bca;
7160+ uint32_t rca;
7161+ uint32_t flags;
7162+ } oom;
7163+ struct {
7164+ uint32_t pt_offset;
7165+ uint32_t param_offset;
7166+ uint32_t flags;
7167+ } bl;
7168+ struct {
7169+ uint32_t value;
7170+ } cl;
7171+ uint32_t feedback[PSB_HW_FEEDBACK_SIZE];
7172+ } arg;
7173+};
7174+
7175+#define DRM_PSB_CMDBUF 0x00
7176+#define DRM_PSB_XHW_INIT 0x01
7177+#define DRM_PSB_XHW 0x02
7178+#define DRM_PSB_SCENE_UNREF 0x03
7179+/* Controlling the kernel modesetting buffers */
7180+#define DRM_PSB_KMS_OFF 0x04
7181+#define DRM_PSB_KMS_ON 0x05
7182+#define DRM_PSB_HW_INFO 0x06
7183+
7184+#define PSB_XHW_INIT 0x00
7185+#define PSB_XHW_TAKEDOWN 0x01
7186+
7187+#define PSB_XHW_FIRE_RASTER 0x00
7188+#define PSB_XHW_SCENE_INFO 0x01
7189+#define PSB_XHW_SCENE_BIND_FIRE 0x02
7190+#define PSB_XHW_TA_MEM_INFO 0x03
7191+#define PSB_XHW_RESET_DPM 0x04
7192+#define PSB_XHW_OOM 0x05
7193+#define PSB_XHW_TERMINATE 0x06
7194+#define PSB_XHW_VISTEST 0x07
7195+#define PSB_XHW_RESUME 0x08
7196+#define PSB_XHW_TA_MEM_LOAD 0x09
7197+#define PSB_XHW_CHECK_LOCKUP 0x0a
7198+
7199+#define PSB_SCENE_FLAG_DIRTY (1 << 0)
7200+#define PSB_SCENE_FLAG_COMPLETE (1 << 1)
7201+#define PSB_SCENE_FLAG_SETUP (1 << 2)
7202+#define PSB_SCENE_FLAG_SETUP_ONLY (1 << 3)
7203+#define PSB_SCENE_FLAG_CLEARED (1 << 4)
7204+
7205+#define PSB_TA_MEM_FLAG_TA (1 << 0)
7206+#define PSB_TA_MEM_FLAG_RASTER (1 << 1)
7207+#define PSB_TA_MEM_FLAG_HOSTA (1 << 2)
7208+#define PSB_TA_MEM_FLAG_HOSTD (1 << 3)
7209+#define PSB_TA_MEM_FLAG_INIT (1 << 4)
7210+#define PSB_TA_MEM_FLAG_NEW_PT_OFFSET (1 << 5)
7211+
7212+/*Raster fire will deallocate memory */
7213+#define PSB_FIRE_FLAG_RASTER_DEALLOC (1 << 0)
7214+/*Isp reset needed due to change in ZLS format */
7215+#define PSB_FIRE_FLAG_NEEDS_ISP_RESET (1 << 1)
7216+/*These are set by Xpsb. */
7217+#define PSB_FIRE_FLAG_XHW_MASK 0xff000000
7218+/*The task has had at least one OOM and Xpsb will
7219+ send back messages on each fire. */
7220+#define PSB_FIRE_FLAG_XHW_OOM (1 << 24)
7221+
7222+#define PSB_SCENE_ENGINE_TA 0
7223+#define PSB_SCENE_ENGINE_RASTER 1
7224+#define PSB_SCENE_NUM_ENGINES 2
7225+
7226+struct drm_psb_dev_info_arg {
7227+ uint32_t num_use_attribute_registers;
7228+};
7229+#define DRM_PSB_DEVINFO 0x01
7230+
7231+#endif
7232Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c
7233===================================================================
7234--- /dev/null 1970-01-01 00:00:00.000000000 +0000
7235+++ linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c 2009-02-20 14:48:16.000000000 +0000
7236@@ -0,0 +1,1028 @@
7237+/**************************************************************************
7238+ * Copyright (c) 2007, Intel Corporation.
7239+ * All Rights Reserved.
7240+ *
7241+ * This program is free software; you can redistribute it and/or modify it
7242+ * under the terms and conditions of the GNU General Public License,
7243+ * version 2, as published by the Free Software Foundation.
7244+ *
7245+ * This program is distributed in the hope it will be useful, but WITHOUT
7246+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7247+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
7248+ * more details.
7249+ *
7250+ * You should have received a copy of the GNU General Public License along with
7251+ * this program; if not, write to the Free Software Foundation, Inc.,
7252+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
7253+ *
7254+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
7255+ * develop this driver.
7256+ *
7257+ **************************************************************************/
7258+/*
7259+ */
7260+
7261+#include "drmP.h"
7262+#include "drm.h"
7263+#include "psb_drm.h"
7264+#include "psb_drv.h"
7265+#include "psb_reg.h"
7266+#include "../i915/i915_reg.h"
7267+#include "psb_msvdx.h"
7268+#include "drm_pciids.h"
7269+#include "psb_scene.h"
7270+#include "drm_crtc.h"
7271+#include "drm_crtc_helper.h"
7272+#include <linux/cpu.h>
7273+#include <linux/notifier.h>
7274+#include <linux/fb.h>
7275+
7276+extern int drm_helper_probe_connector_modes(struct drm_device *dev, uint32_t maxX, uint32_t maxY);
7277+
7278+int drm_psb_debug = 0;
7279+EXPORT_SYMBOL(drm_psb_debug);
7280+static int drm_psb_trap_pagefaults = 0;
7281+static int drm_psb_clock_gating = 0;
7282+static int drm_psb_ta_mem_size = 32 * 1024;
7283+int drm_psb_disable_vsync = 1;
7284+int drm_psb_no_fb = 0;
7285+int drm_psb_force_pipeb = 0;
7286+char* psb_init_mode;
7287+
7288+
7289+MODULE_PARM_DESC(debug, "Enable debug output");
7290+MODULE_PARM_DESC(clock_gating, "clock gating");
7291+MODULE_PARM_DESC(no_fb, "Disable FBdev");
7292+MODULE_PARM_DESC(trap_pagefaults, "Error and reset on MMU pagefaults");
7293+MODULE_PARM_DESC(disable_vsync, "Disable vsync interrupts");
7294+MODULE_PARM_DESC(force_pipeb, "Forces PIPEB to become primary fb");
7295+MODULE_PARM_DESC(ta_mem_size, "TA memory size in kiB");
7296+MODULE_PARM_DESC(mode, "initial mode name");
7297+MODULE_PARM_DESC(xres, "initial mode width");
7298+MODULE_PARM_DESC(yres, "initial mode height");
7299+
7300+module_param_named(debug, drm_psb_debug, int, 0600);
7301+module_param_named(clock_gating, drm_psb_clock_gating, int, 0600);
7302+module_param_named(no_fb, drm_psb_no_fb, int, 0600);
7303+module_param_named(trap_pagefaults, drm_psb_trap_pagefaults, int, 0600);
7304+module_param_named(disable_vsync, drm_psb_disable_vsync, int, 0600);
7305+module_param_named(force_pipeb, drm_psb_force_pipeb, int, 0600);
7306+module_param_named(ta_mem_size, drm_psb_ta_mem_size, int, 0600);
7307+module_param_named(mode, psb_init_mode, charp, 0600);
7308+
7309+static struct pci_device_id pciidlist[] = {
7310+ psb_PCI_IDS
7311+};
7312+
7313+#define DRM_PSB_CMDBUF_IOCTL DRM_IOW(DRM_PSB_CMDBUF, \
7314+ struct drm_psb_cmdbuf_arg)
7315+#define DRM_PSB_XHW_INIT_IOCTL DRM_IOR(DRM_PSB_XHW_INIT, \
7316+ struct drm_psb_xhw_init_arg)
7317+#define DRM_PSB_XHW_IOCTL DRM_IO(DRM_PSB_XHW)
7318+
7319+#define DRM_PSB_SCENE_UNREF_IOCTL DRM_IOWR(DRM_PSB_SCENE_UNREF, \
7320+ struct drm_psb_scene)
7321+#define DRM_PSB_HW_INFO_IOCTL DRM_IOR(DRM_PSB_HW_INFO, \
7322+ struct drm_psb_hw_info)
7323+
7324+#define DRM_PSB_KMS_OFF_IOCTL DRM_IO(DRM_PSB_KMS_OFF)
7325+#define DRM_PSB_KMS_ON_IOCTL DRM_IO(DRM_PSB_KMS_ON)
7326+
7327+static struct drm_ioctl_desc psb_ioctls[] = {
7328+ DRM_IOCTL_DEF(DRM_PSB_CMDBUF_IOCTL, psb_cmdbuf_ioctl, DRM_AUTH),
7329+ DRM_IOCTL_DEF(DRM_PSB_XHW_INIT_IOCTL, psb_xhw_init_ioctl,
7330+ DRM_ROOT_ONLY),
7331+ DRM_IOCTL_DEF(DRM_PSB_XHW_IOCTL, psb_xhw_ioctl, DRM_ROOT_ONLY),
7332+ DRM_IOCTL_DEF(DRM_PSB_SCENE_UNREF_IOCTL, drm_psb_scene_unref_ioctl,
7333+ DRM_AUTH),
7334+ DRM_IOCTL_DEF(DRM_PSB_KMS_OFF_IOCTL, psbfb_kms_off_ioctl,
7335+ DRM_ROOT_ONLY),
7336+ DRM_IOCTL_DEF(DRM_PSB_KMS_ON_IOCTL, psbfb_kms_on_ioctl, DRM_ROOT_ONLY),
7337+ DRM_IOCTL_DEF(DRM_PSB_HW_INFO_IOCTL, psb_hw_info_ioctl, DRM_AUTH),
7338+};
7339+static int psb_max_ioctl = DRM_ARRAY_SIZE(psb_ioctls);
7340+
7341+static int probe(struct pci_dev *pdev, const struct pci_device_id *ent);
7342+
7343+static int dri_library_name(struct drm_device *dev, char *buf)
7344+{
7345+ return snprintf(buf, PAGE_SIZE, "psb\n");
7346+}
7347+
7348+static void psb_set_uopt(struct drm_psb_uopt *uopt)
7349+{
7350+ uopt->clock_gating = drm_psb_clock_gating;
7351+}
7352+
7353+static void psb_lastclose(struct drm_device *dev)
7354+{
7355+ struct drm_psb_private *dev_priv =
7356+ (struct drm_psb_private *)dev->dev_private;
7357+
7358+ if (!dev->dev_private)
7359+ return;
7360+
7361+ mutex_lock(&dev->struct_mutex);
7362+ if (dev_priv->ta_mem)
7363+ psb_ta_mem_unref_devlocked(&dev_priv->ta_mem);
7364+ mutex_unlock(&dev->struct_mutex);
7365+ mutex_lock(&dev_priv->cmdbuf_mutex);
7366+ if (dev_priv->buffers) {
7367+ vfree(dev_priv->buffers);
7368+ dev_priv->buffers = NULL;
7369+ }
7370+ mutex_unlock(&dev_priv->cmdbuf_mutex);
7371+}
7372+
7373+static void psb_do_takedown(struct drm_device *dev)
7374+{
7375+ struct drm_psb_private *dev_priv =
7376+ (struct drm_psb_private *)dev->dev_private;
7377+
7378+ mutex_lock(&dev->struct_mutex);
7379+ if (dev->bm.initialized) {
7380+ if (dev_priv->have_mem_rastgeom) {
7381+ drm_bo_clean_mm(dev, DRM_PSB_MEM_RASTGEOM);
7382+ dev_priv->have_mem_rastgeom = 0;
7383+ }
7384+ if (dev_priv->have_mem_mmu) {
7385+ drm_bo_clean_mm(dev, DRM_PSB_MEM_MMU);
7386+ dev_priv->have_mem_mmu = 0;
7387+ }
7388+ if (dev_priv->have_mem_aper) {
7389+ drm_bo_clean_mm(dev, DRM_PSB_MEM_APER);
7390+ dev_priv->have_mem_aper = 0;
7391+ }
7392+ if (dev_priv->have_tt) {
7393+ drm_bo_clean_mm(dev, DRM_BO_MEM_TT);
7394+ dev_priv->have_tt = 0;
7395+ }
7396+ if (dev_priv->have_vram) {
7397+ drm_bo_clean_mm(dev, DRM_BO_MEM_VRAM);
7398+ dev_priv->have_vram = 0;
7399+ }
7400+ }
7401+ mutex_unlock(&dev->struct_mutex);
7402+
7403+ if (dev_priv->has_msvdx)
7404+ psb_msvdx_uninit(dev);
7405+
7406+ if (dev_priv->comm) {
7407+ kunmap(dev_priv->comm_page);
7408+ dev_priv->comm = NULL;
7409+ }
7410+ if (dev_priv->comm_page) {
7411+ __free_page(dev_priv->comm_page);
7412+ dev_priv->comm_page = NULL;
7413+ }
7414+}
7415+
7416+void psb_clockgating(struct drm_psb_private *dev_priv)
7417+{
7418+ uint32_t clock_gating;
7419+
7420+ if (dev_priv->uopt.clock_gating == 1) {
7421+ PSB_DEBUG_INIT("Disabling clock gating.\n");
7422+
7423+ clock_gating = (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7424+ _PSB_C_CLKGATECTL_2D_CLKG_SHIFT) |
7425+ (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7426+ _PSB_C_CLKGATECTL_ISP_CLKG_SHIFT) |
7427+ (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7428+ _PSB_C_CLKGATECTL_TSP_CLKG_SHIFT) |
7429+ (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7430+ _PSB_C_CLKGATECTL_TA_CLKG_SHIFT) |
7431+ (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7432+ _PSB_C_CLKGATECTL_DPM_CLKG_SHIFT) |
7433+ (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7434+ _PSB_C_CLKGATECTL_USE_CLKG_SHIFT);
7435+
7436+ } else if (dev_priv->uopt.clock_gating == 2) {
7437+ PSB_DEBUG_INIT("Enabling clock gating.\n");
7438+
7439+ clock_gating = (_PSB_C_CLKGATECTL_CLKG_AUTO <<
7440+ _PSB_C_CLKGATECTL_2D_CLKG_SHIFT) |
7441+ (_PSB_C_CLKGATECTL_CLKG_AUTO <<
7442+ _PSB_C_CLKGATECTL_ISP_CLKG_SHIFT) |
7443+ (_PSB_C_CLKGATECTL_CLKG_AUTO <<
7444+ _PSB_C_CLKGATECTL_TSP_CLKG_SHIFT) |
7445+ (_PSB_C_CLKGATECTL_CLKG_AUTO <<
7446+ _PSB_C_CLKGATECTL_TA_CLKG_SHIFT) |
7447+ (_PSB_C_CLKGATECTL_CLKG_AUTO <<
7448+ _PSB_C_CLKGATECTL_DPM_CLKG_SHIFT) |
7449+ (_PSB_C_CLKGATECTL_CLKG_AUTO <<
7450+ _PSB_C_CLKGATECTL_USE_CLKG_SHIFT);
7451+ } else
7452+ clock_gating = PSB_RSGX32(PSB_CR_CLKGATECTL);
7453+
7454+#ifdef FIX_TG_2D_CLOCKGATE
7455+ clock_gating &= ~_PSB_C_CLKGATECTL_2D_CLKG_MASK;
7456+ clock_gating |= (_PSB_C_CLKGATECTL_CLKG_DISABLED <<
7457+ _PSB_C_CLKGATECTL_2D_CLKG_SHIFT);
7458+#endif
7459+ PSB_WSGX32(clock_gating, PSB_CR_CLKGATECTL);
7460+ (void)PSB_RSGX32(PSB_CR_CLKGATECTL);
7461+}
7462+
7463+static int psb_master_create(struct drm_device *dev, struct drm_master *master)
7464+{
7465+ struct drm_i915_master_private *master_priv;
7466+
7467+ master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER);
7468+ if (!master_priv)
7469+ return -ENOMEM;
7470+
7471+ master->driver_priv = master_priv;
7472+ return 0;
7473+}
7474+
7475+static void psb_master_destroy(struct drm_device *dev, struct drm_master *master)
7476+{
7477+ struct drm_i915_master_private *master_priv = master->driver_priv;
7478+
7479+ if (!master_priv)
7480+ return;
7481+
7482+ drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER);
7483+
7484+ master->driver_priv = NULL;
7485+}
7486+
7487+
7488+static int psb_do_init(struct drm_device *dev)
7489+{
7490+ struct drm_psb_private *dev_priv =
7491+ (struct drm_psb_private *)dev->dev_private;
7492+ struct psb_gtt *pg = dev_priv->pg;
7493+
7494+ uint32_t stolen_gtt;
7495+ uint32_t tt_start;
7496+ uint32_t tt_pages;
7497+
7498+ int ret = -ENOMEM;
7499+
7500+ DRM_ERROR("Debug is 0x%08x\n", drm_psb_debug);
7501+
7502+ dev_priv->ta_mem_pages =
7503+ PSB_ALIGN_TO(drm_psb_ta_mem_size * 1024, PAGE_SIZE) >> PAGE_SHIFT;
7504+ dev_priv->comm_page = alloc_page(GFP_KERNEL);
7505+ if (!dev_priv->comm_page)
7506+ goto out_err;
7507+
7508+ dev_priv->comm = kmap(dev_priv->comm_page);
7509+ memset((void *)dev_priv->comm, 0, PAGE_SIZE);
7510+
7511+ dev_priv->has_msvdx = 1;
7512+ if (psb_msvdx_init(dev))
7513+ dev_priv->has_msvdx = 0;
7514+
7515+ /*
7516+ * Initialize sequence numbers for the different command
7517+ * submission mechanisms.
7518+ */
7519+
7520+ dev_priv->sequence[PSB_ENGINE_2D] = 0;
7521+ dev_priv->sequence[PSB_ENGINE_RASTERIZER] = 0;
7522+ dev_priv->sequence[PSB_ENGINE_TA] = 0;
7523+ dev_priv->sequence[PSB_ENGINE_HPRAST] = 0;
7524+
7525+ if (pg->gatt_start & 0x0FFFFFFF) {
7526+ DRM_ERROR("Gatt must be 256M aligned. This is a bug.\n");
7527+ ret = -EINVAL;
7528+ goto out_err;
7529+ }
7530+
7531+ stolen_gtt = (pg->stolen_size >> PAGE_SHIFT) * 4;
7532+ stolen_gtt = (stolen_gtt + PAGE_SIZE - 1) >> PAGE_SHIFT;
7533+ stolen_gtt = (stolen_gtt < pg->gtt_pages) ? stolen_gtt : pg->gtt_pages;
7534+
7535+ dev_priv->gatt_free_offset = pg->gatt_start +
7536+ (stolen_gtt << PAGE_SHIFT) * 1024;
7537+
7538+ /*
7539+ * Insert a cache-coherent communications page in mmu space
7540+ * just after the stolen area. Will be used for fencing etc.
7541+ */
7542+
7543+ dev_priv->comm_mmu_offset = dev_priv->gatt_free_offset;
7544+ dev_priv->gatt_free_offset += PAGE_SIZE;
7545+
7546+ ret = psb_mmu_insert_pages(psb_mmu_get_default_pd(dev_priv->mmu),
7547+ &dev_priv->comm_page,
7548+ dev_priv->comm_mmu_offset, 1, 0, 0,
7549+ PSB_MMU_CACHED_MEMORY);
7550+
7551+ if (ret)
7552+ goto out_err;
7553+
7554+ if (1 || drm_debug) {
7555+ uint32_t core_id = PSB_RSGX32(PSB_CR_CORE_ID);
7556+ uint32_t core_rev = PSB_RSGX32(PSB_CR_CORE_REVISION);
7557+ DRM_INFO("SGX core id = 0x%08x\n", core_id);
7558+ DRM_INFO("SGX core rev major = 0x%02x, minor = 0x%02x\n",
7559+ (core_rev & _PSB_CC_REVISION_MAJOR_MASK) >>
7560+ _PSB_CC_REVISION_MAJOR_SHIFT,
7561+ (core_rev & _PSB_CC_REVISION_MINOR_MASK) >>
7562+ _PSB_CC_REVISION_MINOR_SHIFT);
7563+ DRM_INFO
7564+ ("SGX core rev maintenance = 0x%02x, designer = 0x%02x\n",
7565+ (core_rev & _PSB_CC_REVISION_MAINTENANCE_MASK) >>
7566+ _PSB_CC_REVISION_MAINTENANCE_SHIFT,
7567+ (core_rev & _PSB_CC_REVISION_DESIGNER_MASK) >>
7568+ _PSB_CC_REVISION_DESIGNER_SHIFT);
7569+ }
7570+
7571+ dev_priv->irqmask_lock = SPIN_LOCK_UNLOCKED;
7572+ dev_priv->fence0_irq_on = 0;
7573+
7574+ tt_pages = (pg->gatt_pages < PSB_TT_PRIV0_PLIMIT) ?
7575+ pg->gatt_pages : PSB_TT_PRIV0_PLIMIT;
7576+ tt_start = dev_priv->gatt_free_offset - pg->gatt_start;
7577+ tt_pages -= tt_start >> PAGE_SHIFT;
7578+
7579+ mutex_lock(&dev->struct_mutex);
7580+
7581+ if (!drm_bo_init_mm(dev, DRM_BO_MEM_VRAM, 0,
7582+ pg->stolen_size >> PAGE_SHIFT)) {
7583+ dev_priv->have_vram = 1;
7584+ }
7585+
7586+ if (!drm_bo_init_mm(dev, DRM_BO_MEM_TT, tt_start >> PAGE_SHIFT,
7587+ tt_pages)) {
7588+ dev_priv->have_tt = 1;
7589+ }
7590+
7591+ if (!drm_bo_init_mm(dev, DRM_PSB_MEM_MMU, 0x00000000,
7592+ (pg->gatt_start -
7593+ PSB_MEM_MMU_START) >> PAGE_SHIFT)) {
7594+ dev_priv->have_mem_mmu = 1;
7595+ }
7596+
7597+ if (!drm_bo_init_mm(dev, DRM_PSB_MEM_RASTGEOM, 0x00000000,
7598+ (PSB_MEM_MMU_START -
7599+ PSB_MEM_RASTGEOM_START) >> PAGE_SHIFT)) {
7600+ dev_priv->have_mem_rastgeom = 1;
7601+ }
7602+#if 0
7603+ if (pg->gatt_pages > PSB_TT_PRIV0_PLIMIT) {
7604+ if (!drm_bo_init_mm(dev, DRM_PSB_MEM_APER, PSB_TT_PRIV0_PLIMIT,
7605+ pg->gatt_pages - PSB_TT_PRIV0_PLIMIT)) {
7606+ dev_priv->have_mem_aper = 1;
7607+ }
7608+ }
7609+#endif
7610+
7611+ mutex_unlock(&dev->struct_mutex);
7612+
7613+ return 0;
7614+ out_err:
7615+ psb_do_takedown(dev);
7616+ return ret;
7617+}
7618+
7619+static int psb_driver_unload(struct drm_device *dev)
7620+{
7621+ struct drm_psb_private *dev_priv =
7622+ (struct drm_psb_private *)dev->dev_private;
7623+
7624+ intel_modeset_cleanup(dev);
7625+
7626+ if (dev_priv) {
7627+ psb_watchdog_takedown(dev_priv);
7628+ psb_do_takedown(dev);
7629+ psb_xhw_takedown(dev_priv);
7630+ psb_scheduler_takedown(&dev_priv->scheduler);
7631+
7632+ mutex_lock(&dev->struct_mutex);
7633+ if (dev_priv->have_mem_pds) {
7634+ drm_bo_clean_mm(dev, DRM_PSB_MEM_PDS);
7635+ dev_priv->have_mem_pds = 0;
7636+ }
7637+ if (dev_priv->have_mem_kernel) {
7638+ drm_bo_clean_mm(dev, DRM_PSB_MEM_KERNEL);
7639+ dev_priv->have_mem_kernel = 0;
7640+ }
7641+ mutex_unlock(&dev->struct_mutex);
7642+
7643+ (void)drm_bo_driver_finish(dev);
7644+
7645+ if (dev_priv->pf_pd) {
7646+ psb_mmu_free_pagedir(dev_priv->pf_pd);
7647+ dev_priv->pf_pd = NULL;
7648+ }
7649+ if (dev_priv->mmu) {
7650+ struct psb_gtt *pg = dev_priv->pg;
7651+
7652+ down_read(&pg->sem);
7653+ psb_mmu_remove_pfn_sequence(psb_mmu_get_default_pd
7654+ (dev_priv->mmu),
7655+ pg->gatt_start,
7656+ pg->
7657+ stolen_size >> PAGE_SHIFT);
7658+ up_read(&pg->sem);
7659+ psb_mmu_driver_takedown(dev_priv->mmu);
7660+ dev_priv->mmu = NULL;
7661+ }
7662+ psb_gtt_takedown(dev_priv->pg, 1);
7663+ if (dev_priv->scratch_page) {
7664+ __free_page(dev_priv->scratch_page);
7665+ dev_priv->scratch_page = NULL;
7666+ }
7667+ psb_takedown_use_base(dev_priv);
7668+ if (dev_priv->common.regs) {
7669+ iounmap(dev_priv->common.regs);
7670+ dev_priv->common.regs = NULL;
7671+ }
7672+ if (dev_priv->sgx_reg) {
7673+ iounmap(dev_priv->sgx_reg);
7674+ dev_priv->sgx_reg = NULL;
7675+ }
7676+ if (dev_priv->msvdx_reg) {
7677+ iounmap(dev_priv->msvdx_reg);
7678+ dev_priv->msvdx_reg = NULL;
7679+ }
7680+
7681+ drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
7682+ dev->dev_private = NULL;
7683+ }
7684+ return 0;
7685+}
7686+
7687+static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb)
7688+{
7689+ struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
7690+ struct drm_device *dev = fb->dev;
7691+
7692+ //if (fb->fbdev)
7693+ // intelfb_remove(dev, fb);
7694+
7695+ drm_framebuffer_cleanup(fb);
7696+ mutex_lock(&dev->struct_mutex);
7697+ drm_gem_object_unreference(intel_fb->obj);
7698+ mutex_unlock(&dev->struct_mutex);
7699+
7700+ kfree(intel_fb);
7701+}
7702+
7703+static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb,
7704+ struct drm_file *file_priv,
7705+ unsigned int *handle)
7706+{
7707+ struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
7708+ struct drm_gem_object *object = intel_fb->obj;
7709+
7710+ return drm_gem_handle_create(file_priv, object, handle);
7711+}
7712+
7713+static const struct drm_framebuffer_funcs psb_fb_funcs = {
7714+ .destroy = psb_user_framebuffer_destroy,
7715+ .create_handle = psb_user_framebuffer_create_handle,
7716+};
7717+
7718+int psb_framebuffer_create(struct drm_device *dev,
7719+ struct drm_mode_fb_cmd *mode_cmd,
7720+ struct drm_framebuffer **fb,
7721+ struct drm_gem_object *obj)
7722+{
7723+ struct intel_framebuffer *intel_fb;
7724+ int ret;
7725+
7726+ intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
7727+ if (!intel_fb)
7728+ return -ENOMEM;
7729+
7730+ ret = drm_framebuffer_init(dev, &intel_fb->base, &psb_fb_funcs);
7731+ if (ret) {
7732+ DRM_ERROR("framebuffer init failed %d\n", ret);
7733+ return ret;
7734+ }
7735+
7736+ drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
7737+
7738+ intel_fb->obj = obj;
7739+
7740+ *fb = &intel_fb->base;
7741+
7742+ return 0;
7743+}
7744+
7745+
7746+static struct drm_framebuffer *
7747+psb_user_framebuffer_create(struct drm_device *dev,
7748+ struct drm_file *filp,
7749+ struct drm_mode_fb_cmd *mode_cmd)
7750+{
7751+ struct drm_gem_object *obj;
7752+ struct drm_framebuffer *fb;
7753+ int ret;
7754+
7755+ obj = drm_gem_object_lookup(dev, filp, mode_cmd->handle);
7756+ if (!obj)
7757+ return NULL;
7758+
7759+ ret = psb_framebuffer_create(dev, mode_cmd, &fb, obj);
7760+ if (ret) {
7761+ drm_gem_object_unreference(obj);
7762+ return NULL;
7763+ }
7764+
7765+ return fb;
7766+}
7767+
7768+
7769+int psbfb_probe2(struct drm_device *dev)
7770+{
7771+ return 0;
7772+}
7773+
7774+static const struct drm_mode_config_funcs psb_mode_funcs = {
7775+ .fb_create = psb_user_framebuffer_create,
7776+ .fb_changed = psbfb_probe2,
7777+};
7778+
7779+static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
7780+{
7781+ struct drm_psb_private *dev_priv;
7782+ unsigned long resource_start;
7783+ struct psb_gtt *pg;
7784+ int ret = -ENOMEM;
7785+
7786+ DRM_INFO("psb - %s\n", PSB_PACKAGE_VERSION);
7787+ dev_priv = drm_calloc(1, sizeof(*dev_priv), DRM_MEM_DRIVER);
7788+ if (dev_priv == NULL)
7789+ return -ENOMEM;
7790+
7791+ mutex_init(&dev_priv->temp_mem);
7792+ mutex_init(&dev_priv->cmdbuf_mutex);
7793+ mutex_init(&dev_priv->reset_mutex);
7794+ psb_init_disallowed();
7795+
7796+ atomic_set(&dev_priv->msvdx_mmu_invaldc, 0);
7797+
7798+#ifdef FIX_TG_16
7799+ atomic_set(&dev_priv->lock_2d, 0);
7800+ atomic_set(&dev_priv->ta_wait_2d, 0);
7801+ atomic_set(&dev_priv->ta_wait_2d_irq, 0);
7802+ atomic_set(&dev_priv->waiters_2d, 0);;
7803+ DRM_INIT_WAITQUEUE(&dev_priv->queue_2d);
7804+#else
7805+ mutex_init(&dev_priv->mutex_2d);
7806+#endif
7807+
7808+ spin_lock_init(&dev_priv->reloc_lock);
7809+
7810+ DRM_INIT_WAITQUEUE(&dev_priv->rel_mapped_queue);
7811+ DRM_INIT_WAITQUEUE(&dev_priv->event_2d_queue);
7812+
7813+ dev->dev_private = (void *)dev_priv;
7814+ dev_priv->chipset = chipset;
7815+ psb_set_uopt(&dev_priv->uopt);
7816+
7817+ psb_watchdog_init(dev_priv);
7818+ psb_scheduler_init(dev, &dev_priv->scheduler);
7819+
7820+ resource_start = pci_resource_start(dev->pdev, PSB_MMIO_RESOURCE);
7821+
7822+ dev_priv->msvdx_reg =
7823+ ioremap(resource_start + PSB_MSVDX_OFFSET, PSB_MSVDX_SIZE);
7824+ if (!dev_priv->msvdx_reg)
7825+ goto out_err;
7826+
7827+ dev_priv->common.regs =
7828+ ioremap(resource_start + PSB_VDC_OFFSET, PSB_VDC_SIZE);
7829+ if (!dev_priv->common.regs)
7830+ goto out_err;
7831+
7832+ dev_priv->sgx_reg =
7833+ ioremap(resource_start + PSB_SGX_OFFSET, PSB_SGX_SIZE);
7834+ if (!dev_priv->sgx_reg)
7835+ goto out_err;
7836+
7837+ psb_clockgating(dev_priv);
7838+ if (psb_init_use_base(dev_priv, 3, 13))
7839+ goto out_err;
7840+
7841+ dev_priv->scratch_page = alloc_page(GFP_DMA32 | __GFP_ZERO);
7842+ if (!dev_priv->scratch_page)
7843+ goto out_err;
7844+
7845+ dev_priv->pg = psb_gtt_alloc(dev);
7846+ if (!dev_priv->pg)
7847+ goto out_err;
7848+
7849+ ret = psb_gtt_init(dev_priv->pg, 0);
7850+ if (ret)
7851+ goto out_err;
7852+
7853+ dev_priv->mmu = psb_mmu_driver_init(dev_priv->sgx_reg,
7854+ drm_psb_trap_pagefaults, 0,
7855+ &dev_priv->msvdx_mmu_invaldc);
7856+ if (!dev_priv->mmu)
7857+ goto out_err;
7858+
7859+ pg = dev_priv->pg;
7860+
7861+ /*
7862+ * Make sgx MMU aware of the stolen memory area we call VRAM.
7863+ */
7864+
7865+ down_read(&pg->sem);
7866+ ret =
7867+ psb_mmu_insert_pfn_sequence(psb_mmu_get_default_pd(dev_priv->mmu),
7868+ pg->stolen_base >> PAGE_SHIFT,
7869+ pg->gatt_start,
7870+ pg->stolen_size >> PAGE_SHIFT, 0);
7871+ up_read(&pg->sem);
7872+ if (ret)
7873+ goto out_err;
7874+
7875+ dev_priv->pf_pd = psb_mmu_alloc_pd(dev_priv->mmu, 1, 0);
7876+ if (!dev_priv->pf_pd)
7877+ goto out_err;
7878+
7879+ /*
7880+ * Make all presumably unused requestors page-fault by making them
7881+ * use context 1 which does not have any valid mappings.
7882+ */
7883+
7884+ PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0);
7885+ PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1);
7886+ PSB_RSGX32(PSB_CR_BIF_BANK1);
7887+
7888+ psb_mmu_set_pd_context(psb_mmu_get_default_pd(dev_priv->mmu), 0);
7889+ psb_mmu_set_pd_context(dev_priv->pf_pd, 1);
7890+ psb_mmu_enable_requestor(dev_priv->mmu, _PSB_MMU_ER_MASK);
7891+
7892+ psb_init_2d(dev_priv);
7893+
7894+ ret = drm_bo_driver_init(dev);
7895+ if (ret)
7896+ goto out_err;
7897+
7898+ ret = drm_bo_init_mm(dev, DRM_PSB_MEM_KERNEL, 0x00000000,
7899+ (PSB_MEM_PDS_START - PSB_MEM_KERNEL_START)
7900+ >> PAGE_SHIFT);
7901+ if (ret)
7902+ goto out_err;
7903+ dev_priv->have_mem_kernel = 1;
7904+
7905+ ret = drm_bo_init_mm(dev, DRM_PSB_MEM_PDS, 0x00000000,
7906+ (PSB_MEM_RASTGEOM_START - PSB_MEM_PDS_START)
7907+ >> PAGE_SHIFT);
7908+ if (ret)
7909+ goto out_err;
7910+ dev_priv->have_mem_pds = 1;
7911+
7912+ ret = psb_do_init(dev);
7913+ if (ret)
7914+ return ret;
7915+
7916+ ret = psb_xhw_init(dev);
7917+ if (ret)
7918+ return ret;
7919+
7920+ PSB_WSGX32(PSB_MEM_PDS_START, PSB_CR_PDS_EXEC_BASE);
7921+ PSB_WSGX32(PSB_MEM_RASTGEOM_START, PSB_CR_BIF_3D_REQ_BASE);
7922+
7923+ intel_modeset_init(dev);
7924+
7925+ dev->mode_config.funcs = (void *)&psb_mode_funcs;
7926+
7927+ drm_helper_initial_config(dev, false);
7928+
7929+ return 0;
7930+ out_err:
7931+ psb_driver_unload(dev);
7932+ return ret;
7933+}
7934+
7935+int psb_driver_device_is_agp(struct drm_device *dev)
7936+{
7937+ return 0;
7938+}
7939+
7940+static int psb_prepare_msvdx_suspend(struct drm_device *dev)
7941+{
7942+ struct drm_psb_private *dev_priv =
7943+ (struct drm_psb_private *)dev->dev_private;
7944+ struct drm_fence_manager *fm = &dev->fm;
7945+ struct drm_fence_class_manager *fc = &fm->fence_class[PSB_ENGINE_VIDEO];
7946+ struct drm_fence_object *fence;
7947+ int ret = 0;
7948+ int signaled = 0;
7949+ int count = 0;
7950+ unsigned long _end = jiffies + 3 * DRM_HZ;
7951+
7952+ PSB_DEBUG_GENERAL("MSVDXACPI Entering psb_prepare_msvdx_suspend....\n");
7953+
7954+ /*set the msvdx-reset flag here.. */
7955+ dev_priv->msvdx_needs_reset = 1;
7956+
7957+ /*Ensure that all pending IRQs are serviced, */
7958+ list_for_each_entry(fence, &fc->ring, ring) {
7959+ count++;
7960+ do {
7961+ DRM_WAIT_ON(ret, fc->fence_queue, 3 * DRM_HZ,
7962+ (signaled =
7963+ drm_fence_object_signaled(fence,
7964+ DRM_FENCE_TYPE_EXE)));
7965+ if (signaled)
7966+ break;
7967+ if (time_after_eq(jiffies, _end))
7968+ PSB_DEBUG_GENERAL
7969+ ("MSVDXACPI: fence 0x%x didn't get signaled for 3 secs; we will suspend anyways\n",
7970+ (unsigned int)fence);
7971+ } while (ret == -EINTR);
7972+
7973+ }
7974+
7975+ /* Issue software reset */
7976+ PSB_WMSVDX32 (msvdx_sw_reset_all, MSVDX_CONTROL);
7977+
7978+ ret = psb_wait_for_register (dev_priv, MSVDX_CONTROL, 0,
7979+ MSVDX_CONTROL_CR_MSVDX_SOFT_RESET_MASK);
7980+
7981+ PSB_DEBUG_GENERAL("MSVDXACPI: All MSVDX IRQs (%d) serviced...\n",
7982+ count);
7983+ return 0;
7984+}
7985+
7986+static int psb_suspend(struct pci_dev *pdev, pm_message_t state)
7987+{
7988+ struct drm_device *dev = pci_get_drvdata(pdev);
7989+ struct drm_psb_private *dev_priv =
7990+ (struct drm_psb_private *)dev->dev_private;
7991+ struct drm_connector *output;
7992+
7993+ if (drm_psb_no_fb == 0)
7994+ psbfb_suspend(dev);
7995+ else {
7996+ if(num_registered_fb)
7997+ {
7998+ list_for_each_entry(output, &dev->mode_config.connector_list, head) {
7999+ //if(output->encoder->crtc != NULL)
8000+ // intel_crtc_mode_save(output->encoder->crtc);
8001+ //if(output->funcs->save)
8002+ // output->funcs->save(output);
8003+ }
8004+ }
8005+ }
8006+
8007+ dev_priv->saveCLOCKGATING = PSB_RSGX32(PSB_CR_CLKGATECTL);
8008+ (void)psb_idle_3d(dev);
8009+ (void)psb_idle_2d(dev);
8010+ flush_scheduled_work();
8011+
8012+ psb_takedown_use_base(dev_priv);
8013+
8014+ if (dev_priv->has_msvdx)
8015+ psb_prepare_msvdx_suspend(dev);
8016+
8017+ pci_save_state(pdev);
8018+ pci_disable_device(pdev);
8019+ pci_set_power_state(pdev, PCI_D3hot);
8020+
8021+ return 0;
8022+}
8023+
8024+static int psb_resume(struct pci_dev *pdev)
8025+{
8026+ struct drm_device *dev = pci_get_drvdata(pdev);
8027+ struct drm_psb_private *dev_priv =
8028+ (struct drm_psb_private *)dev->dev_private;
8029+ struct psb_gtt *pg = dev_priv->pg;
8030+ struct drm_connector *output;
8031+ int ret;
8032+
8033+ pci_set_power_state(pdev, PCI_D0);
8034+ pci_restore_state(pdev);
8035+ ret = pci_enable_device(pdev);
8036+ if (ret)
8037+ return ret;
8038+
8039+ INIT_LIST_HEAD(&dev_priv->resume_buf.head);
8040+ dev_priv->msvdx_needs_reset = 1;
8041+
8042+ PSB_WVDC32(pg->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL);
8043+ pci_write_config_word(pdev, PSB_GMCH_CTRL,
8044+ pg->gmch_ctrl | _PSB_GMCH_ENABLED);
8045+
8046+ /*
8047+ * The GTT page tables are probably not saved.
8048+ * However, TT and VRAM is empty at this point.
8049+ */
8050+
8051+ psb_gtt_init(dev_priv->pg, 1);
8052+
8053+ /*
8054+ * The SGX loses it's register contents.
8055+ * Restore BIF registers. The MMU page tables are
8056+ * "normal" pages, so their contents should be kept.
8057+ */
8058+
8059+ PSB_WSGX32(dev_priv->saveCLOCKGATING, PSB_CR_CLKGATECTL);
8060+ PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0);
8061+ PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1);
8062+ PSB_RSGX32(PSB_CR_BIF_BANK1);
8063+
8064+ psb_mmu_set_pd_context(psb_mmu_get_default_pd(dev_priv->mmu), 0);
8065+ psb_mmu_set_pd_context(dev_priv->pf_pd, 1);
8066+ psb_mmu_enable_requestor(dev_priv->mmu, _PSB_MMU_ER_MASK);
8067+
8068+ /*
8069+ * 2D Base registers..
8070+ */
8071+ psb_init_2d(dev_priv);
8072+
8073+ if (drm_psb_no_fb == 0) {
8074+ list_for_each_entry(output, &dev->mode_config.connector_list, head) {
8075+ if(output->encoder->crtc != NULL)
8076+ drm_crtc_helper_set_mode(output->encoder->crtc, &output->encoder->crtc->mode,
8077+ output->encoder->crtc->x, output->encoder->crtc->y, NULL);
8078+ }
8079+ }
8080+
8081+ /*
8082+ * Persistant 3D base registers and USSE base registers..
8083+ */
8084+
8085+ PSB_WSGX32(PSB_MEM_PDS_START, PSB_CR_PDS_EXEC_BASE);
8086+ PSB_WSGX32(PSB_MEM_RASTGEOM_START, PSB_CR_BIF_3D_REQ_BASE);
8087+ psb_init_use_base(dev_priv, 3, 13);
8088+
8089+ /*
8090+ * Now, re-initialize the 3D engine.
8091+ */
8092+
8093+ psb_xhw_resume(dev_priv, &dev_priv->resume_buf);
8094+
8095+ psb_scheduler_ta_mem_check(dev_priv);
8096+ if (dev_priv->ta_mem && !dev_priv->force_ta_mem_load) {
8097+ psb_xhw_ta_mem_load(dev_priv, &dev_priv->resume_buf,
8098+ PSB_TA_MEM_FLAG_TA |
8099+ PSB_TA_MEM_FLAG_RASTER |
8100+ PSB_TA_MEM_FLAG_HOSTA |
8101+ PSB_TA_MEM_FLAG_HOSTD |
8102+ PSB_TA_MEM_FLAG_INIT,
8103+ dev_priv->ta_mem->ta_memory->offset,
8104+ dev_priv->ta_mem->hw_data->offset,
8105+ dev_priv->ta_mem->hw_cookie);
8106+ }
8107+
8108+ if (drm_psb_no_fb == 0)
8109+ psbfb_resume(dev);
8110+
8111+ else {
8112+ if(num_registered_fb)
8113+ {
8114+ struct fb_info *fb_info=registered_fb[0];
8115+ list_for_each_entry(output, &dev->mode_config.connector_list, head) {
8116+ //if(output->encoder->crtc != NULL)
8117+ // intel_crtc_mode_restore(output->encoder->crtc);
8118+ }
8119+ if(fb_info)
8120+ {
8121+ fb_set_suspend(fb_info, 0);
8122+ printk("set the fb_set_suspend resume end\n");
8123+ }
8124+ }
8125+ }
8126+
8127+
8128+ return 0;
8129+}
8130+
8131+/* always available as we are SIGIO'd */
8132+static unsigned int psb_poll(struct file *filp, struct poll_table_struct *wait)
8133+{
8134+ return (POLLIN | POLLRDNORM);
8135+}
8136+
8137+static int psb_release(struct inode *inode, struct file *filp)
8138+{
8139+ struct drm_file *file_priv = (struct drm_file *)filp->private_data;
8140+ struct drm_device *dev = file_priv->minor->dev;
8141+ struct drm_psb_private *dev_priv =
8142+ (struct drm_psb_private *)dev->dev_private;
8143+
8144+ if (dev_priv && dev_priv->xhw_file) {
8145+ psb_xhw_init_takedown(dev_priv, file_priv, 1);
8146+ }
8147+ return drm_release(inode, filp);
8148+}
8149+
8150+extern struct drm_fence_driver psb_fence_driver;
8151+
8152+/*
8153+ * Use this memory type priority if no eviction is needed.
8154+ */
8155+static uint32_t psb_mem_prios[] = { DRM_BO_MEM_VRAM,
8156+ DRM_BO_MEM_TT,
8157+ DRM_PSB_MEM_KERNEL,
8158+ DRM_PSB_MEM_MMU,
8159+ DRM_PSB_MEM_RASTGEOM,
8160+ DRM_PSB_MEM_PDS,
8161+ DRM_PSB_MEM_APER,
8162+ DRM_BO_MEM_LOCAL
8163+};
8164+
8165+/*
8166+ * Use this memory type priority if need to evict.
8167+ */
8168+static uint32_t psb_busy_prios[] = { DRM_BO_MEM_TT,
8169+ DRM_BO_MEM_VRAM,
8170+ DRM_PSB_MEM_KERNEL,
8171+ DRM_PSB_MEM_MMU,
8172+ DRM_PSB_MEM_RASTGEOM,
8173+ DRM_PSB_MEM_PDS,
8174+ DRM_PSB_MEM_APER,
8175+ DRM_BO_MEM_LOCAL
8176+};
8177+
8178+static struct drm_bo_driver psb_bo_driver = {
8179+ .mem_type_prio = psb_mem_prios,
8180+ .mem_busy_prio = psb_busy_prios,
8181+ .num_mem_type_prio = ARRAY_SIZE(psb_mem_prios),
8182+ .num_mem_busy_prio = ARRAY_SIZE(psb_busy_prios),
8183+ .create_ttm_backend_entry = drm_psb_tbe_init,
8184+ .fence_type = psb_fence_types,
8185+ .invalidate_caches = psb_invalidate_caches,
8186+ .init_mem_type = psb_init_mem_type,
8187+ .evict_mask = psb_evict_mask,
8188+ .move = psb_move,
8189+ .backend_size = psb_tbe_size,
8190+ .command_stream_barrier = NULL,
8191+};
8192+
8193+static struct drm_driver driver = {
8194+ .driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
8195+ DRIVER_IRQ_VBL | DRIVER_IRQ_VBL2,
8196+ .load = psb_driver_load,
8197+ .unload = psb_driver_unload,
8198+ .dri_library_name = dri_library_name,
8199+ .get_reg_ofs = drm_core_get_reg_ofs,
8200+ .ioctls = psb_ioctls,
8201+ .device_is_agp = psb_driver_device_is_agp,
8202+ .get_vblank_counter = psb_get_vblank_counter,
8203+ .enable_vblank = psb_enable_vblank,
8204+ .disable_vblank = psb_disable_vblank,
8205+ .irq_preinstall = psb_irq_preinstall,
8206+ .irq_postinstall = psb_irq_postinstall,
8207+ .irq_uninstall = psb_irq_uninstall,
8208+ .irq_handler = psb_irq_handler,
8209+ .master_create = psb_master_create,
8210+ .master_destroy = psb_master_destroy,
8211+ .fb_probe = psbfb_probe,
8212+ .fb_remove = psbfb_remove,
8213+ .firstopen = NULL,
8214+ .lastclose = psb_lastclose,
8215+ .fops = {
8216+ .owner = THIS_MODULE,
8217+ .open = drm_open,
8218+ .release = psb_release,
8219+ .ioctl = drm_ioctl,
8220+ .mmap = drm_mmap,
8221+ .poll = psb_poll,
8222+ .fasync = drm_fasync,
8223+ },
8224+ .pci_driver = {
8225+ .name = DRIVER_NAME,
8226+ .id_table = pciidlist,
8227+ .probe = probe,
8228+ .remove = __devexit_p(drm_cleanup_pci),
8229+ .resume = psb_resume,
8230+ .suspend = psb_suspend,
8231+ },
8232+ .fence_driver = &psb_fence_driver,
8233+ .bo_driver = &psb_bo_driver,
8234+ .name = DRIVER_NAME,
8235+ .desc = DRIVER_DESC,
8236+ .date = PSB_DRM_DRIVER_DATE,
8237+ .major = PSB_DRM_DRIVER_MAJOR,
8238+ .minor = PSB_DRM_DRIVER_MINOR,
8239+ .patchlevel = PSB_DRM_DRIVER_PATCHLEVEL
8240+};
8241+
8242+static int probe(struct pci_dev *pdev, const struct pci_device_id *ent)
8243+{
8244+ return drm_get_dev(pdev, ent, &driver);
8245+}
8246+
8247+static int __init psb_init(void)
8248+{
8249+ driver.num_ioctls = psb_max_ioctl;
8250+
8251+ return drm_init(&driver);
8252+}
8253+
8254+static void __exit psb_exit(void)
8255+{
8256+ drm_exit(&driver);
8257+}
8258+
8259+module_init(psb_init);
8260+module_exit(psb_exit);
8261+
8262+MODULE_AUTHOR(DRIVER_AUTHOR);
8263+MODULE_DESCRIPTION(DRIVER_DESC);
8264+MODULE_LICENSE("GPL");
8265Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h
8266===================================================================
8267--- /dev/null 1970-01-01 00:00:00.000000000 +0000
8268+++ linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h 2009-02-20 12:23:06.000000000 +0000
8269@@ -0,0 +1,549 @@
8270+/**************************************************************************
8271+ * Copyright (c) 2007, Intel Corporation.
8272+ * All Rights Reserved.
8273+ *
8274+ * This program is free software; you can redistribute it and/or modify it
8275+ * under the terms and conditions of the GNU General Public License,
8276+ * version 2, as published by the Free Software Foundation.
8277+ *
8278+ * This program is distributed in the hope it will be useful, but WITHOUT
8279+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8280+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
8281+ * more details.
8282+ *
8283+ * You should have received a copy of the GNU General Public License along with
8284+ * this program; if not, write to the Free Software Foundation, Inc.,
8285+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
8286+ *
8287+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
8288+ * develop this driver.
8289+ *
8290+ **************************************************************************/
8291+/*
8292+ */
8293+#ifndef _PSB_DRV_H_
8294+#define _PSB_DRV_H_
8295+
8296+#include "drmP.h"
8297+#include "psb_drm.h"
8298+#include "psb_reg.h"
8299+#include "psb_schedule.h"
8300+#include "psb_priv.h"
8301+#include "../i915/intel_drv.h"
8302+
8303+
8304+enum {
8305+ CHIP_PSB_8108 = 0,
8306+ CHIP_PSB_8109 = 1
8307+};
8308+
8309+/*
8310+ * Hardware bugfixes
8311+ */
8312+
8313+#define FIX_TG_16
8314+#define FIX_TG_2D_CLOCKGATE
8315+
8316+#define DRIVER_NAME "psb"
8317+#define DRIVER_DESC "drm driver for the Intel GMA500"
8318+#define DRIVER_AUTHOR "Tungsten Graphics Inc."
8319+
8320+#define PSB_DRM_DRIVER_DATE "20080613"
8321+#define PSB_DRM_DRIVER_MAJOR 4
8322+#define PSB_DRM_DRIVER_MINOR 12
8323+#define PSB_DRM_DRIVER_PATCHLEVEL 0
8324+
8325+#define PSB_VDC_OFFSET 0x00000000
8326+#define PSB_VDC_SIZE 0x000080000
8327+#define PSB_SGX_SIZE 0x8000
8328+#define PSB_SGX_OFFSET 0x00040000
8329+#define PSB_MMIO_RESOURCE 0
8330+#define PSB_GATT_RESOURCE 2
8331+#define PSB_GTT_RESOURCE 3
8332+#define PSB_GMCH_CTRL 0x52
8333+#define PSB_BSM 0x5C
8334+#define _PSB_GMCH_ENABLED 0x4
8335+#define PSB_PGETBL_CTL 0x2020
8336+#define _PSB_PGETBL_ENABLED 0x00000001
8337+#define PSB_SGX_2D_SLAVE_PORT 0x4000
8338+#define PSB_TT_PRIV0_LIMIT (256*1024*1024)
8339+#define PSB_TT_PRIV0_PLIMIT (PSB_TT_PRIV0_LIMIT >> PAGE_SHIFT)
8340+#define PSB_NUM_VALIDATE_BUFFERS 1024
8341+#define PSB_MEM_KERNEL_START 0x10000000
8342+#define PSB_MEM_PDS_START 0x20000000
8343+#define PSB_MEM_MMU_START 0x40000000
8344+
8345+#define DRM_PSB_MEM_KERNEL DRM_BO_MEM_PRIV0
8346+#define DRM_PSB_FLAG_MEM_KERNEL DRM_BO_FLAG_MEM_PRIV0
8347+
8348+/*
8349+ * Flags for external memory type field.
8350+ */
8351+
8352+#define PSB_MSVDX_OFFSET 0x50000 /*MSVDX Base offset */
8353+#define PSB_MSVDX_SIZE 0x8000 /*MSVDX MMIO region is 0x50000 - 0x57fff ==> 32KB */
8354+
8355+#define PSB_MMU_CACHED_MEMORY 0x0001 /* Bind to MMU only */
8356+#define PSB_MMU_RO_MEMORY 0x0002 /* MMU RO memory */
8357+#define PSB_MMU_WO_MEMORY 0x0004 /* MMU WO memory */
8358+
8359+/*
8360+ * PTE's and PDE's
8361+ */
8362+
8363+#define PSB_PDE_MASK 0x003FFFFF
8364+#define PSB_PDE_SHIFT 22
8365+#define PSB_PTE_SHIFT 12
8366+
8367+#define PSB_PTE_VALID 0x0001 /* PTE / PDE valid */
8368+#define PSB_PTE_WO 0x0002 /* Write only */
8369+#define PSB_PTE_RO 0x0004 /* Read only */
8370+#define PSB_PTE_CACHED 0x0008 /* CPU cache coherent */
8371+
8372+/*
8373+ * VDC registers and bits
8374+ */
8375+#define PSB_HWSTAM 0x2098
8376+#define PSB_INSTPM 0x20C0
8377+#define PSB_INT_IDENTITY_R 0x20A4
8378+#define _PSB_VSYNC_PIPEB_FLAG (1<<5)
8379+#define _PSB_VSYNC_PIPEA_FLAG (1<<7)
8380+#define _PSB_IRQ_SGX_FLAG (1<<18)
8381+#define _PSB_IRQ_MSVDX_FLAG (1<<19)
8382+#define PSB_INT_MASK_R 0x20A8
8383+#define PSB_INT_ENABLE_R 0x20A0
8384+#define PSB_PIPEASTAT 0x70024
8385+#define _PSB_VBLANK_INTERRUPT_ENABLE (1 << 17)
8386+#define _PSB_VBLANK_CLEAR (1 << 1)
8387+#define PSB_PIPEBSTAT 0x71024
8388+
8389+#define _PSB_MMU_ER_MASK 0x0001FF00
8390+#define _PSB_MMU_ER_HOST (1 << 16)
8391+#define GPIOA 0x5010
8392+#define GPIOB 0x5014
8393+#define GPIOC 0x5018
8394+#define GPIOD 0x501c
8395+#define GPIOE 0x5020
8396+#define GPIOF 0x5024
8397+#define GPIOG 0x5028
8398+#define GPIOH 0x502c
8399+#define GPIO_CLOCK_DIR_MASK (1 << 0)
8400+#define GPIO_CLOCK_DIR_IN (0 << 1)
8401+#define GPIO_CLOCK_DIR_OUT (1 << 1)
8402+#define GPIO_CLOCK_VAL_MASK (1 << 2)
8403+#define GPIO_CLOCK_VAL_OUT (1 << 3)
8404+#define GPIO_CLOCK_VAL_IN (1 << 4)
8405+#define GPIO_CLOCK_PULLUP_DISABLE (1 << 5)
8406+#define GPIO_DATA_DIR_MASK (1 << 8)
8407+#define GPIO_DATA_DIR_IN (0 << 9)
8408+#define GPIO_DATA_DIR_OUT (1 << 9)
8409+#define GPIO_DATA_VAL_MASK (1 << 10)
8410+#define GPIO_DATA_VAL_OUT (1 << 11)
8411+#define GPIO_DATA_VAL_IN (1 << 12)
8412+#define GPIO_DATA_PULLUP_DISABLE (1 << 13)
8413+
8414+#define VCLK_DIVISOR_VGA0 0x6000
8415+#define VCLK_DIVISOR_VGA1 0x6004
8416+#define VCLK_POST_DIV 0x6010
8417+
8418+#define I915_READ(reg) readl(dev_priv->common.regs + (reg))
8419+#define I915_WRITE(reg, val) writel(val, dev_priv->common.regs + (reg))
8420+
8421+#define PSB_COMM_2D (PSB_ENGINE_2D << 4)
8422+#define PSB_COMM_3D (PSB_ENGINE_3D << 4)
8423+#define PSB_COMM_TA (PSB_ENGINE_TA << 4)
8424+#define PSB_COMM_HP (PSB_ENGINE_HP << 4)
8425+#define PSB_COMM_USER_IRQ (1024 >> 2)
8426+#define PSB_COMM_USER_IRQ_LOST (PSB_COMM_USER_IRQ + 1)
8427+#define PSB_COMM_FW (2048 >> 2)
8428+
8429+#define PSB_UIRQ_VISTEST 1
8430+#define PSB_UIRQ_OOM_REPLY 2
8431+#define PSB_UIRQ_FIRE_TA_REPLY 3
8432+#define PSB_UIRQ_FIRE_RASTER_REPLY 4
8433+
8434+#define PSB_2D_SIZE (256*1024*1024)
8435+#define PSB_MAX_RELOC_PAGES 1024
8436+
8437+#define PSB_LOW_REG_OFFS 0x0204
8438+#define PSB_HIGH_REG_OFFS 0x0600
8439+
8440+#define PSB_NUM_VBLANKS 2
8441+
8442+#define PSB_COMM_2D (PSB_ENGINE_2D << 4)
8443+#define PSB_COMM_3D (PSB_ENGINE_3D << 4)
8444+#define PSB_COMM_TA (PSB_ENGINE_TA << 4)
8445+#define PSB_COMM_HP (PSB_ENGINE_HP << 4)
8446+#define PSB_COMM_FW (2048 >> 2)
8447+
8448+#define PSB_2D_SIZE (256*1024*1024)
8449+#define PSB_MAX_RELOC_PAGES 1024
8450+
8451+#define PSB_LOW_REG_OFFS 0x0204
8452+#define PSB_HIGH_REG_OFFS 0x0600
8453+
8454+#define PSB_NUM_VBLANKS 2
8455+#define PSB_WATCHDOG_DELAY (DRM_HZ / 10)
8456+
8457+/*
8458+ * User options.
8459+ */
8460+
8461+
8462+struct psb_gtt {
8463+ struct drm_device *dev;
8464+ int initialized;
8465+ uint32_t gatt_start;
8466+ uint32_t gtt_start;
8467+ uint32_t gtt_phys_start;
8468+ unsigned gtt_pages;
8469+ unsigned gatt_pages;
8470+ uint32_t stolen_base;
8471+ uint32_t pge_ctl;
8472+ u16 gmch_ctrl;
8473+ unsigned long stolen_size;
8474+ uint32_t *gtt_map;
8475+ struct rw_semaphore sem;
8476+};
8477+
8478+struct psb_use_base {
8479+ struct list_head head;
8480+ struct drm_fence_object *fence;
8481+ unsigned int reg;
8482+ unsigned long offset;
8483+ unsigned int dm;
8484+};
8485+
8486+struct psb_buflist_item;
8487+
8488+struct psb_msvdx_cmd_queue {
8489+ struct list_head head;
8490+ void *cmd;
8491+ unsigned long cmd_size;
8492+ uint32_t sequence;
8493+};
8494+
8495+
8496+struct psb_mmu_driver;
8497+
8498+extern struct psb_mmu_driver *psb_mmu_driver_init(uint8_t __iomem * registers,
8499+ int trap_pagefaults,
8500+ int invalid_type,
8501+ atomic_t *msvdx_mmu_invaldc);
8502+extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver);
8503+extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver *driver);
8504+extern void psb_mmu_mirror_gtt(struct psb_mmu_pd *pd, uint32_t mmu_offset,
8505+ uint32_t gtt_start, uint32_t gtt_pages);
8506+extern void psb_mmu_test(struct psb_mmu_driver *driver, uint32_t offset);
8507+extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,
8508+ int trap_pagefaults,
8509+ int invalid_type);
8510+extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd);
8511+extern void psb_mmu_flush(struct psb_mmu_driver *driver);
8512+extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
8513+ unsigned long address,
8514+ uint32_t num_pages);
8515+extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd,
8516+ uint32_t start_pfn,
8517+ unsigned long address,
8518+ uint32_t num_pages, int type);
8519+extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,
8520+ unsigned long *pfn);
8521+
8522+/*
8523+ * Enable / disable MMU for different requestors.
8524+ */
8525+
8526+extern void psb_mmu_enable_requestor(struct psb_mmu_driver *driver,
8527+ uint32_t mask);
8528+extern void psb_mmu_disable_requestor(struct psb_mmu_driver *driver,
8529+ uint32_t mask);
8530+extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context);
8531+extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,
8532+ unsigned long address, uint32_t num_pages,
8533+ uint32_t desired_tile_stride,
8534+ uint32_t hw_tile_stride, int type);
8535+extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd, unsigned long address,
8536+ uint32_t num_pages,
8537+ uint32_t desired_tile_stride,
8538+ uint32_t hw_tile_stride);
8539+/*
8540+ * psb_sgx.c
8541+ */
8542+
8543+extern int psb_blit_sequence(struct drm_psb_private *dev_priv,
8544+ uint32_t sequence);
8545+extern void psb_init_2d(struct drm_psb_private *dev_priv);
8546+extern int psb_idle_2d(struct drm_device *dev);
8547+extern int psb_idle_3d(struct drm_device *dev);
8548+extern int psb_emit_2d_copy_blit(struct drm_device *dev,
8549+ uint32_t src_offset,
8550+ uint32_t dst_offset, uint32_t pages,
8551+ int direction);
8552+extern int psb_cmdbuf_ioctl(struct drm_device *dev, void *data,
8553+ struct drm_file *file_priv);
8554+extern int psb_reg_submit(struct drm_psb_private *dev_priv, uint32_t * regs,
8555+ unsigned int cmds);
8556+extern int psb_submit_copy_cmdbuf(struct drm_device *dev,
8557+ struct drm_buffer_object *cmd_buffer,
8558+ unsigned long cmd_offset,
8559+ unsigned long cmd_size, int engine,
8560+ uint32_t * copy_buffer);
8561+extern void psb_fence_or_sync(struct drm_file *priv,
8562+ int engine,
8563+ struct drm_psb_cmdbuf_arg *arg,
8564+ struct drm_fence_arg *fence_arg,
8565+ struct drm_fence_object **fence_p);
8566+extern void psb_init_disallowed(void);
8567+
8568+/*
8569+ * psb_irq.c
8570+ */
8571+
8572+extern u32 psb_get_vblank_counter(struct drm_device *dev, int pipe);
8573+extern int psb_enable_vblank(struct drm_device *dev, int crtc);
8574+extern void psb_disable_vblank(struct drm_device *dev, int crtc);
8575+extern irqreturn_t psb_irq_handler(DRM_IRQ_ARGS);
8576+extern void psb_irq_preinstall(struct drm_device *dev);
8577+extern int psb_irq_postinstall(struct drm_device *dev);
8578+extern void psb_irq_uninstall(struct drm_device *dev);
8579+
8580+/*
8581+ * psb_fence.c
8582+ */
8583+
8584+extern void psb_fence_handler(struct drm_device *dev, uint32_t class);
8585+extern void psb_2D_irq_off(struct drm_psb_private *dev_priv);
8586+extern void psb_2D_irq_on(struct drm_psb_private *dev_priv);
8587+extern uint32_t psb_fence_advance_sequence(struct drm_device *dev,
8588+ uint32_t class);
8589+extern int psb_fence_emit_sequence(struct drm_device *dev, uint32_t fence_class,
8590+ uint32_t flags, uint32_t * sequence,
8591+ uint32_t * native_type);
8592+extern void psb_fence_error(struct drm_device *dev,
8593+ uint32_t class,
8594+ uint32_t sequence, uint32_t type, int error);
8595+
8596+/*MSVDX stuff*/
8597+extern void psb_msvdx_irq_off(struct drm_psb_private *dev_priv);
8598+extern void psb_msvdx_irq_on(struct drm_psb_private *dev_priv);
8599+extern int psb_hw_info_ioctl(struct drm_device *dev, void *data,
8600+ struct drm_file *file_priv);
8601+
8602+/*
8603+ * psb_buffer.c
8604+ */
8605+extern struct drm_ttm_backend *drm_psb_tbe_init(struct drm_device *dev);
8606+extern int psb_fence_types(struct drm_buffer_object *bo, uint32_t * class,
8607+ uint32_t * type);
8608+extern uint32_t psb_evict_mask(struct drm_buffer_object *bo);
8609+extern int psb_invalidate_caches(struct drm_device *dev, uint64_t flags);
8610+extern int psb_init_mem_type(struct drm_device *dev, uint32_t type,
8611+ struct drm_mem_type_manager *man);
8612+extern int psb_move(struct drm_buffer_object *bo,
8613+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem);
8614+extern int psb_tbe_size(struct drm_device *dev, unsigned long num_pages);
8615+
8616+/*
8617+ * psb_gtt.c
8618+ */
8619+extern int psb_gtt_init(struct psb_gtt *pg, int resume);
8620+extern int psb_gtt_insert_pages(struct psb_gtt *pg, struct page **pages,
8621+ unsigned offset_pages, unsigned num_pages,
8622+ unsigned desired_tile_stride,
8623+ unsigned hw_tile_stride, int type);
8624+extern int psb_gtt_remove_pages(struct psb_gtt *pg, unsigned offset_pages,
8625+ unsigned num_pages,
8626+ unsigned desired_tile_stride,
8627+ unsigned hw_tile_stride);
8628+
8629+extern struct psb_gtt *psb_gtt_alloc(struct drm_device *dev);
8630+extern void psb_gtt_takedown(struct psb_gtt *pg, int free);
8631+
8632+/*
8633+ * psb_fb.c
8634+ */
8635+extern int psbfb_probe(struct drm_device *dev, struct drm_crtc *crtc);
8636+extern int psbfb_remove(struct drm_device *dev, struct drm_crtc *crtc);
8637+extern int psbfb_kms_off_ioctl(struct drm_device *dev, void *data,
8638+ struct drm_file *file_priv);
8639+extern int psbfb_kms_on_ioctl(struct drm_device *dev, void *data,
8640+ struct drm_file *file_priv);
8641+extern void psbfb_suspend(struct drm_device *dev);
8642+extern void psbfb_resume(struct drm_device *dev);
8643+
8644+/*
8645+ * psb_reset.c
8646+ */
8647+
8648+extern void psb_reset(struct drm_psb_private *dev_priv, int reset_2d);
8649+extern void psb_schedule_watchdog(struct drm_psb_private *dev_priv);
8650+extern void psb_watchdog_init(struct drm_psb_private *dev_priv);
8651+extern void psb_watchdog_takedown(struct drm_psb_private *dev_priv);
8652+extern void psb_print_pagefault(struct drm_psb_private *dev_priv);
8653+
8654+/*
8655+ * psb_regman.c
8656+ */
8657+
8658+extern void psb_takedown_use_base(struct drm_psb_private *dev_priv);
8659+extern int psb_grab_use_base(struct drm_psb_private *dev_priv,
8660+ unsigned long dev_virtual,
8661+ unsigned long size,
8662+ unsigned int data_master,
8663+ uint32_t fence_class,
8664+ uint32_t fence_type,
8665+ int no_wait,
8666+ int ignore_signals,
8667+ int *r_reg, uint32_t * r_offset);
8668+extern int psb_init_use_base(struct drm_psb_private *dev_priv,
8669+ unsigned int reg_start, unsigned int reg_num);
8670+
8671+/*
8672+ * psb_xhw.c
8673+ */
8674+
8675+extern int psb_xhw_ioctl(struct drm_device *dev, void *data,
8676+ struct drm_file *file_priv);
8677+extern int psb_xhw_init_ioctl(struct drm_device *dev, void *data,
8678+ struct drm_file *file_priv);
8679+extern int psb_xhw_init(struct drm_device *dev);
8680+extern void psb_xhw_takedown(struct drm_psb_private *dev_priv);
8681+extern void psb_xhw_init_takedown(struct drm_psb_private *dev_priv,
8682+ struct drm_file *file_priv, int closing);
8683+extern int psb_xhw_scene_bind_fire(struct drm_psb_private *dev_priv,
8684+ struct psb_xhw_buf *buf,
8685+ uint32_t fire_flags,
8686+ uint32_t hw_context,
8687+ uint32_t * cookie,
8688+ uint32_t * oom_cmds,
8689+ uint32_t num_oom_cmds,
8690+ uint32_t offset,
8691+ uint32_t engine, uint32_t flags);
8692+extern int psb_xhw_fire_raster(struct drm_psb_private *dev_priv,
8693+ struct psb_xhw_buf *buf, uint32_t fire_flags);
8694+extern int psb_xhw_scene_info(struct drm_psb_private *dev_priv,
8695+ struct psb_xhw_buf *buf,
8696+ uint32_t w,
8697+ uint32_t h,
8698+ uint32_t * hw_cookie,
8699+ uint32_t * bo_size,
8700+ uint32_t * clear_p_start,
8701+ uint32_t * clear_num_pages);
8702+
8703+extern int psb_xhw_reset_dpm(struct drm_psb_private *dev_priv,
8704+ struct psb_xhw_buf *buf);
8705+extern int psb_xhw_check_lockup(struct drm_psb_private *dev_priv,
8706+ struct psb_xhw_buf *buf, uint32_t * value);
8707+extern int psb_xhw_ta_mem_info(struct drm_psb_private *dev_priv,
8708+ struct psb_xhw_buf *buf,
8709+ uint32_t pages,
8710+ uint32_t * hw_cookie, uint32_t * size);
8711+extern int psb_xhw_ta_oom(struct drm_psb_private *dev_priv,
8712+ struct psb_xhw_buf *buf, uint32_t * cookie);
8713+extern void psb_xhw_ta_oom_reply(struct drm_psb_private *dev_priv,
8714+ struct psb_xhw_buf *buf,
8715+ uint32_t * cookie,
8716+ uint32_t * bca,
8717+ uint32_t * rca, uint32_t * flags);
8718+extern int psb_xhw_vistest(struct drm_psb_private *dev_priv,
8719+ struct psb_xhw_buf *buf);
8720+extern int psb_xhw_handler(struct drm_psb_private *dev_priv);
8721+extern int psb_xhw_resume(struct drm_psb_private *dev_priv,
8722+ struct psb_xhw_buf *buf);
8723+extern void psb_xhw_fire_reply(struct drm_psb_private *dev_priv,
8724+ struct psb_xhw_buf *buf, uint32_t * cookie);
8725+extern int psb_xhw_ta_mem_load(struct drm_psb_private *dev_priv,
8726+ struct psb_xhw_buf *buf,
8727+ uint32_t flags,
8728+ uint32_t param_offset,
8729+ uint32_t pt_offset, uint32_t * hw_cookie);
8730+extern void psb_xhw_clean_buf(struct drm_psb_private *dev_priv,
8731+ struct psb_xhw_buf *buf);
8732+
8733+extern void psb_i2c_init(struct drm_psb_private *dev_priv);
8734+
8735+/*
8736+ * psb_schedule.c: HW bug fixing.
8737+ */
8738+
8739+#ifdef FIX_TG_16
8740+
8741+extern void psb_2d_unlock(struct drm_psb_private *dev_priv);
8742+extern void psb_2d_lock(struct drm_psb_private *dev_priv);
8743+extern void psb_resume_ta_2d_idle(struct drm_psb_private *dev_priv);
8744+
8745+#else
8746+
8747+#define psb_2d_lock(_dev_priv) mutex_lock(&(_dev_priv)->mutex_2d)
8748+#define psb_2d_unlock(_dev_priv) mutex_unlock(&(_dev_priv)->mutex_2d)
8749+
8750+#endif
8751+
8752+/*
8753+ * Utilities
8754+ */
8755+
8756+#define PSB_WVDC32(_val, _offs) I915_WRITE(_offs, _val)
8757+#define PSB_RVDC32(_offs) I915_READ(_offs)
8758+
8759+#define PSB_ALIGN_TO(_val, _align) \
8760+ (((_val) + ((_align) - 1)) & ~((_align) - 1))
8761+#define PSB_WSGX32(_val, _offs) \
8762+ iowrite32(_val, dev_priv->sgx_reg + (_offs))
8763+#define PSB_RSGX32(_offs) \
8764+ ioread32(dev_priv->sgx_reg + (_offs))
8765+#define PSB_WMSVDX32(_val, _offs) \
8766+ iowrite32(_val, dev_priv->msvdx_reg + (_offs))
8767+#define PSB_RMSVDX32(_offs) \
8768+ ioread32(dev_priv->msvdx_reg + (_offs))
8769+
8770+#define PSB_ALPL(_val, _base) \
8771+ (((_val) >> (_base ## _ALIGNSHIFT)) << (_base ## _SHIFT))
8772+#define PSB_ALPLM(_val, _base) \
8773+ ((((_val) >> (_base ## _ALIGNSHIFT)) << (_base ## _SHIFT)) & (_base ## _MASK))
8774+
8775+#define PSB_D_RENDER (1 << 16)
8776+
8777+#define PSB_D_GENERAL (1 << 0)
8778+#define PSB_D_INIT (1 << 1)
8779+#define PSB_D_IRQ (1 << 2)
8780+#define PSB_D_FW (1 << 3)
8781+#define PSB_D_PERF (1 << 4)
8782+#define PSB_D_TMP (1 << 5)
8783+#define PSB_D_RELOC (1 << 6)
8784+
8785+extern int drm_psb_debug;
8786+extern int drm_psb_no_fb;
8787+extern int drm_psb_disable_vsync;
8788+
8789+#define PSB_DEBUG_FW(_fmt, _arg...) \
8790+ PSB_DEBUG(PSB_D_FW, _fmt, ##_arg)
8791+#define PSB_DEBUG_GENERAL(_fmt, _arg...) \
8792+ PSB_DEBUG(PSB_D_GENERAL, _fmt, ##_arg)
8793+#define PSB_DEBUG_INIT(_fmt, _arg...) \
8794+ PSB_DEBUG(PSB_D_INIT, _fmt, ##_arg)
8795+#define PSB_DEBUG_IRQ(_fmt, _arg...) \
8796+ PSB_DEBUG(PSB_D_IRQ, _fmt, ##_arg)
8797+#define PSB_DEBUG_RENDER(_fmt, _arg...) \
8798+ PSB_DEBUG(PSB_D_RENDER, _fmt, ##_arg)
8799+#define PSB_DEBUG_PERF(_fmt, _arg...) \
8800+ PSB_DEBUG(PSB_D_PERF, _fmt, ##_arg)
8801+#define PSB_DEBUG_TMP(_fmt, _arg...) \
8802+ PSB_DEBUG(PSB_D_TMP, _fmt, ##_arg)
8803+#define PSB_DEBUG_RELOC(_fmt, _arg...) \
8804+ PSB_DEBUG(PSB_D_RELOC, _fmt, ##_arg)
8805+
8806+#if DRM_DEBUG_CODE
8807+#define PSB_DEBUG(_flag, _fmt, _arg...) \
8808+ do { \
8809+ if (unlikely((_flag) & drm_psb_debug)) \
8810+ printk(KERN_DEBUG \
8811+ "[psb:0x%02x:%s] " _fmt , _flag, \
8812+ __FUNCTION__ , ##_arg); \
8813+ } while (0)
8814+#else
8815+#define PSB_DEBUG(_fmt, _arg...) do { } while (0)
8816+#endif
8817+
8818+#endif
8819Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c
8820===================================================================
8821--- /dev/null 1970-01-01 00:00:00.000000000 +0000
8822+++ linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c 2009-02-20 12:23:06.000000000 +0000
8823@@ -0,0 +1,1219 @@
8824+/**************************************************************************
8825+ * Copyright (c) 2007, Intel Corporation.
8826+ * All Rights Reserved.
8827+ *
8828+ * This program is free software; you can redistribute it and/or modify it
8829+ * under the terms and conditions of the GNU General Public License,
8830+ * version 2, as published by the Free Software Foundation.
8831+ *
8832+ * This program is distributed in the hope it will be useful, but WITHOUT
8833+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8834+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
8835+ * more details.
8836+ *
8837+ * You should have received a copy of the GNU General Public License along with
8838+ * this program; if not, write to the Free Software Foundation, Inc.,
8839+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
8840+ *
8841+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
8842+ * develop this driver.
8843+ *
8844+ **************************************************************************/
8845+
8846+#include <linux/module.h>
8847+#include <linux/kernel.h>
8848+#include <linux/errno.h>
8849+#include <linux/string.h>
8850+#include <linux/mm.h>
8851+#include <linux/tty.h>
8852+#include <linux/slab.h>
8853+#include <linux/delay.h>
8854+#include <linux/fb.h>
8855+#include <linux/init.h>
8856+#include <linux/console.h>
8857+
8858+#include "drmP.h"
8859+#include "drm.h"
8860+#include "drm_crtc.h"
8861+#include "psb_drv.h"
8862+
8863+struct psbfb_vm_info {
8864+ struct drm_buffer_object *bo;
8865+ struct address_space *f_mapping;
8866+ struct mutex vm_mutex;
8867+ atomic_t refcount;
8868+};
8869+
8870+struct psbfb_par {
8871+ struct drm_device *dev;
8872+ struct drm_crtc *crtc;
8873+ struct drm_connector *output;
8874+ struct psbfb_vm_info *vi;
8875+ int dpms_state;
8876+};
8877+
8878+static void psbfb_vm_info_deref(struct psbfb_vm_info **vi)
8879+{
8880+ struct psbfb_vm_info *tmp = *vi;
8881+ *vi = NULL;
8882+ if (atomic_dec_and_test(&tmp->refcount)) {
8883+ drm_bo_usage_deref_unlocked(&tmp->bo);
8884+ drm_free(tmp, sizeof(*tmp), DRM_MEM_MAPS);
8885+ }
8886+}
8887+
8888+static struct psbfb_vm_info *psbfb_vm_info_ref(struct psbfb_vm_info *vi)
8889+{
8890+ atomic_inc(&vi->refcount);
8891+ return vi;
8892+}
8893+
8894+static struct psbfb_vm_info *psbfb_vm_info_create(void)
8895+{
8896+ struct psbfb_vm_info *vi;
8897+
8898+ vi = drm_calloc(1, sizeof(*vi), DRM_MEM_MAPS);
8899+ if (!vi)
8900+ return NULL;
8901+
8902+ mutex_init(&vi->vm_mutex);
8903+ atomic_set(&vi->refcount, 1);
8904+ return vi;
8905+}
8906+
8907+#define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
8908+
8909+static int psbfb_setcolreg(unsigned regno, unsigned red, unsigned green,
8910+ unsigned blue, unsigned transp, struct fb_info *info)
8911+{
8912+ struct psbfb_par *par = info->par;
8913+ struct drm_crtc *crtc = par->crtc;
8914+ uint32_t v;
8915+
8916+ if (!crtc->fb)
8917+ return -ENOMEM;
8918+
8919+ if (regno > 255)
8920+ return 1;
8921+
8922+ if (crtc->fb->depth == 8) {
8923+ intel_crtc_fb_gamma_set(crtc, red, green, blue, regno);
8924+ return 0;
8925+ }
8926+
8927+ red = CMAP_TOHW(red, info->var.red.length);
8928+ blue = CMAP_TOHW(blue, info->var.blue.length);
8929+ green = CMAP_TOHW(green, info->var.green.length);
8930+ transp = CMAP_TOHW(transp, info->var.transp.length);
8931+
8932+ v = (red << info->var.red.offset) |
8933+ (green << info->var.green.offset) |
8934+ (blue << info->var.blue.offset) |
8935+ (transp << info->var.transp.offset);
8936+
8937+ switch (crtc->fb->bits_per_pixel) {
8938+ case 16:
8939+ ((uint32_t *) info->pseudo_palette)[regno] = v;
8940+ break;
8941+ case 24:
8942+ case 32:
8943+ ((uint32_t *) info->pseudo_palette)[regno] = v;
8944+ break;
8945+ }
8946+
8947+ return 0;
8948+}
8949+
8950+static int psbfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
8951+{
8952+ struct psbfb_par *par = info->par;
8953+ //struct drm_device *dev = par->dev;
8954+ struct drm_framebuffer *fb = par->crtc->fb;
8955+ //struct drm_display_mode *drm_mode;
8956+ //struct drm_connector *output;
8957+ int depth;
8958+ int pitch;
8959+ int bpp = var->bits_per_pixel;
8960+
8961+ if (!fb)
8962+ return -ENOMEM;
8963+
8964+ if (!var->pixclock)
8965+ return -EINVAL;
8966+
8967+ /* don't support virtuals for now */
8968+ if (var->xres_virtual > var->xres)
8969+ return -EINVAL;
8970+
8971+ if (var->yres_virtual > var->yres)
8972+ return -EINVAL;
8973+
8974+ switch (bpp) {
8975+ case 8:
8976+ depth = 8;
8977+ break;
8978+ case 16:
8979+ depth = (var->green.length == 6) ? 16 : 15;
8980+ break;
8981+ case 24: /* assume this is 32bpp / depth 24 */
8982+ bpp = 32;
8983+ /* fallthrough */
8984+ case 32:
8985+ depth = (var->transp.length > 0) ? 32 : 24;
8986+ break;
8987+ default:
8988+ return -EINVAL;
8989+ }
8990+
8991+ pitch = ((var->xres * ((bpp + 1) / 8)) + 0x3f) & ~0x3f;
8992+
8993+ /* Check that we can resize */
8994+ if ((pitch * var->yres) > (fb->bo->num_pages << PAGE_SHIFT)) {
8995+ /* Need to resize the fb object.
8996+ * But the generic fbdev code doesn't really understand
8997+ * that we can do this. So disable for now.
8998+ */
8999+ DRM_INFO("Can't support requested size, too big!\n");
9000+ return -EINVAL;
9001+ }
9002+
9003+ switch (depth) {
9004+ case 8:
9005+ var->red.offset = 0;
9006+ var->green.offset = 0;
9007+ var->blue.offset = 0;
9008+ var->red.length = 8;
9009+ var->green.length = 8;
9010+ var->blue.length = 8;
9011+ var->transp.length = 0;
9012+ var->transp.offset = 0;
9013+ break;
9014+ case 15:
9015+ var->red.offset = 10;
9016+ var->green.offset = 5;
9017+ var->blue.offset = 0;
9018+ var->red.length = 5;
9019+ var->green.length = 5;
9020+ var->blue.length = 5;
9021+ var->transp.length = 1;
9022+ var->transp.offset = 15;
9023+ break;
9024+ case 16:
9025+ var->red.offset = 11;
9026+ var->green.offset = 5;
9027+ var->blue.offset = 0;
9028+ var->red.length = 5;
9029+ var->green.length = 6;
9030+ var->blue.length = 5;
9031+ var->transp.length = 0;
9032+ var->transp.offset = 0;
9033+ break;
9034+ case 24:
9035+ var->red.offset = 16;
9036+ var->green.offset = 8;
9037+ var->blue.offset = 0;
9038+ var->red.length = 8;
9039+ var->green.length = 8;
9040+ var->blue.length = 8;
9041+ var->transp.length = 0;
9042+ var->transp.offset = 0;
9043+ break;
9044+ case 32:
9045+ var->red.offset = 16;
9046+ var->green.offset = 8;
9047+ var->blue.offset = 0;
9048+ var->red.length = 8;
9049+ var->green.length = 8;
9050+ var->blue.length = 8;
9051+ var->transp.length = 8;
9052+ var->transp.offset = 24;
9053+ break;
9054+ default:
9055+ return -EINVAL;
9056+ }
9057+
9058+ return 0;
9059+}
9060+
9061+static int psbfb_move_fb_bo(struct fb_info *info, struct drm_buffer_object *bo,
9062+ uint64_t mem_type_flags)
9063+{
9064+ struct psbfb_par *par;
9065+ loff_t holelen;
9066+ int ret;
9067+
9068+ /*
9069+ * Kill all user-space mappings of this device. They will be
9070+ * faulted back using nopfn when accessed.
9071+ */
9072+
9073+ par = info->par;
9074+ holelen = ((loff_t) bo->mem.num_pages) << PAGE_SHIFT;
9075+ mutex_lock(&par->vi->vm_mutex);
9076+ if (par->vi->f_mapping) {
9077+ unmap_mapping_range(par->vi->f_mapping, 0, holelen, 1);
9078+ }
9079+
9080+ ret = drm_bo_do_validate(bo,
9081+ mem_type_flags,
9082+ DRM_BO_MASK_MEM |
9083+ DRM_BO_FLAG_NO_EVICT,
9084+ DRM_BO_HINT_DONT_FENCE, 0, 1, NULL);
9085+
9086+ mutex_unlock(&par->vi->vm_mutex);
9087+ return ret;
9088+}
9089+
9090+/* this will let fbcon do the mode init */
9091+static int psbfb_set_par(struct fb_info *info)
9092+{
9093+ struct psbfb_par *par = info->par;
9094+ struct drm_framebuffer *fb = par->crtc->fb;
9095+ struct drm_device *dev = par->dev;
9096+ struct drm_display_mode *drm_mode;
9097+ struct fb_var_screeninfo *var = &info->var;
9098+ struct drm_psb_private *dev_priv = dev->dev_private;
9099+ //struct drm_connector *output;
9100+ int pitch;
9101+ int depth;
9102+ int bpp = var->bits_per_pixel;
9103+
9104+ if (!fb)
9105+ return -ENOMEM;
9106+
9107+ switch (bpp) {
9108+ case 8:
9109+ depth = 8;
9110+ break;
9111+ case 16:
9112+ depth = (var->green.length == 6) ? 16 : 15;
9113+ break;
9114+ case 24: /* assume this is 32bpp / depth 24 */
9115+ bpp = 32;
9116+ /* fallthrough */
9117+ case 32:
9118+ depth = (var->transp.length > 0) ? 32 : 24;
9119+ break;
9120+ default:
9121+ return -EINVAL;
9122+ }
9123+
9124+ pitch = ((var->xres * ((bpp + 1) / 8)) + 0x3f) & ~0x3f;
9125+
9126+ if ((pitch * var->yres) > (fb->bo->num_pages << PAGE_SHIFT)) {
9127+ /* Need to resize the fb object.
9128+ * But the generic fbdev code doesn't really understand
9129+ * that we can do this. So disable for now.
9130+ */
9131+ DRM_INFO("Can't support requested size, too big!\n");
9132+ return -EINVAL;
9133+ }
9134+
9135+ fb->offset = fb->bo->offset - dev_priv->pg->gatt_start;
9136+ fb->width = var->xres;
9137+ fb->height = var->yres;
9138+ fb->bits_per_pixel = bpp;
9139+ fb->pitch = pitch;
9140+ fb->depth = depth;
9141+
9142+ info->fix.line_length = fb->pitch;
9143+ info->fix.visual =
9144+ (fb->depth == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
9145+
9146+ /* some fbdev's apps don't want these to change */
9147+ info->fix.smem_start = dev->mode_config.fb_base + fb->offset;
9148+
9149+ /* we have to align the output base address because the fb->bo
9150+ may be moved in the previous drm_bo_do_validate().
9151+ Otherwise the output screens may go black when exit the X
9152+ window and re-enter the console */
9153+ info->screen_base = fb->kmap.virtual;
9154+
9155+ /* Should we walk the output's modelist or just create our own ???
9156+ * For now, we create and destroy a mode based on the incoming
9157+ * parameters. But there's commented out code below which scans
9158+ * the output list too.
9159+ */
9160+
9161+ drm_mode = drm_mode_create(dev);
9162+ drm_mode->hdisplay = var->xres;
9163+ drm_mode->hsync_start = drm_mode->hdisplay + var->right_margin;
9164+ drm_mode->hsync_end = drm_mode->hsync_start + var->hsync_len;
9165+ drm_mode->htotal = drm_mode->hsync_end + var->left_margin;
9166+ drm_mode->vdisplay = var->yres;
9167+ drm_mode->vsync_start = drm_mode->vdisplay + var->lower_margin;
9168+ drm_mode->vsync_end = drm_mode->vsync_start + var->vsync_len;
9169+ drm_mode->vtotal = drm_mode->vsync_end + var->upper_margin;
9170+ drm_mode->clock = PICOS2KHZ(var->pixclock);
9171+ drm_mode->vrefresh = drm_mode_vrefresh(drm_mode);
9172+ drm_mode_set_name(drm_mode);
9173+ drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V);
9174+
9175+
9176+ if (!drm_crtc_helper_set_mode(par->crtc, drm_mode, 0, 0, NULL))
9177+ return -EINVAL;
9178+
9179+ /* Have to destroy our created mode if we're not searching the mode
9180+ * list for it.
9181+ */
9182+ drm_mode_destroy(dev, drm_mode);
9183+
9184+ return 0;
9185+}
9186+
9187+extern int psb_2d_submit(struct drm_psb_private *, uint32_t *, uint32_t);;
9188+
9189+static int psb_accel_2d_fillrect(struct drm_psb_private *dev_priv,
9190+ uint32_t dst_offset, uint32_t dst_stride,
9191+ uint32_t dst_format, uint16_t dst_x,
9192+ uint16_t dst_y, uint16_t size_x,
9193+ uint16_t size_y, uint32_t fill)
9194+{
9195+ uint32_t buffer[10];
9196+ uint32_t *buf;
9197+ int ret;
9198+
9199+ buf = buffer;
9200+
9201+ *buf++ = PSB_2D_FENCE_BH;
9202+
9203+ *buf++ =
9204+ PSB_2D_DST_SURF_BH | dst_format | (dst_stride <<
9205+ PSB_2D_DST_STRIDE_SHIFT);
9206+ *buf++ = dst_offset;
9207+
9208+ *buf++ =
9209+ PSB_2D_BLIT_BH |
9210+ PSB_2D_ROT_NONE |
9211+ PSB_2D_COPYORDER_TL2BR |
9212+ PSB_2D_DSTCK_DISABLE |
9213+ PSB_2D_SRCCK_DISABLE | PSB_2D_USE_FILL | PSB_2D_ROP3_PATCOPY;
9214+
9215+ *buf++ = fill << PSB_2D_FILLCOLOUR_SHIFT;
9216+ *buf++ =
9217+ (dst_x << PSB_2D_DST_XSTART_SHIFT) | (dst_y <<
9218+ PSB_2D_DST_YSTART_SHIFT);
9219+ *buf++ =
9220+ (size_x << PSB_2D_DST_XSIZE_SHIFT) | (size_y <<
9221+ PSB_2D_DST_YSIZE_SHIFT);
9222+ *buf++ = PSB_2D_FLUSH_BH;
9223+
9224+ psb_2d_lock(dev_priv);
9225+ ret = psb_2d_submit(dev_priv, buffer, buf - buffer);
9226+ psb_2d_unlock(dev_priv);
9227+
9228+ return ret;
9229+}
9230+
9231+static void psbfb_fillrect_accel(struct fb_info *info,
9232+ const struct fb_fillrect *r)
9233+{
9234+ struct psbfb_par *par = info->par;
9235+ struct drm_framebuffer *fb = par->crtc->fb;
9236+ struct drm_psb_private *dev_priv = par->dev->dev_private;
9237+ uint32_t offset;
9238+ uint32_t stride;
9239+ uint32_t format;
9240+
9241+ if (!fb)
9242+ return;
9243+
9244+ offset = fb->offset;
9245+ stride = fb->pitch;
9246+
9247+ switch (fb->depth) {
9248+ case 8:
9249+ format = PSB_2D_DST_332RGB;
9250+ break;
9251+ case 15:
9252+ format = PSB_2D_DST_555RGB;
9253+ break;
9254+ case 16:
9255+ format = PSB_2D_DST_565RGB;
9256+ break;
9257+ case 24:
9258+ case 32:
9259+ /* this is wrong but since we don't do blending its okay */
9260+ format = PSB_2D_DST_8888ARGB;
9261+ break;
9262+ default:
9263+ /* software fallback */
9264+ cfb_fillrect(info, r);
9265+ return;
9266+ }
9267+
9268+ psb_accel_2d_fillrect(dev_priv,
9269+ offset, stride, format,
9270+ r->dx, r->dy, r->width, r->height, r->color);
9271+}
9272+
9273+static void psbfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
9274+{
9275+ if (info->state != FBINFO_STATE_RUNNING)
9276+ return;
9277+ if (info->flags & FBINFO_HWACCEL_DISABLED) {
9278+ cfb_fillrect(info, rect);
9279+ return;
9280+ }
9281+ if (in_interrupt() || in_atomic()) {
9282+ /*
9283+ * Catch case when we're shutting down.
9284+ */
9285+ cfb_fillrect(info, rect);
9286+ return;
9287+ }
9288+ psbfb_fillrect_accel(info, rect);
9289+}
9290+
9291+uint32_t psb_accel_2d_copy_direction(int xdir, int ydir)
9292+{
9293+ if (xdir < 0)
9294+ return ((ydir <
9295+ 0) ? PSB_2D_COPYORDER_BR2TL : PSB_2D_COPYORDER_TR2BL);
9296+ else
9297+ return ((ydir <
9298+ 0) ? PSB_2D_COPYORDER_BL2TR : PSB_2D_COPYORDER_TL2BR);
9299+}
9300+
9301+/*
9302+ * @srcOffset in bytes
9303+ * @srcStride in bytes
9304+ * @srcFormat psb 2D format defines
9305+ * @dstOffset in bytes
9306+ * @dstStride in bytes
9307+ * @dstFormat psb 2D format defines
9308+ * @srcX offset in pixels
9309+ * @srcY offset in pixels
9310+ * @dstX offset in pixels
9311+ * @dstY offset in pixels
9312+ * @sizeX of the copied area
9313+ * @sizeY of the copied area
9314+ */
9315+static int psb_accel_2d_copy(struct drm_psb_private *dev_priv,
9316+ uint32_t src_offset, uint32_t src_stride,
9317+ uint32_t src_format, uint32_t dst_offset,
9318+ uint32_t dst_stride, uint32_t dst_format,
9319+ uint16_t src_x, uint16_t src_y, uint16_t dst_x,
9320+ uint16_t dst_y, uint16_t size_x, uint16_t size_y)
9321+{
9322+ uint32_t blit_cmd;
9323+ uint32_t buffer[10];
9324+ uint32_t *buf;
9325+ uint32_t direction;
9326+ int ret;
9327+
9328+ buf = buffer;
9329+
9330+ direction = psb_accel_2d_copy_direction(src_x - dst_x, src_y - dst_y);
9331+
9332+ if (direction == PSB_2D_COPYORDER_BR2TL ||
9333+ direction == PSB_2D_COPYORDER_TR2BL) {
9334+ src_x += size_x - 1;
9335+ dst_x += size_x - 1;
9336+ }
9337+ if (direction == PSB_2D_COPYORDER_BR2TL ||
9338+ direction == PSB_2D_COPYORDER_BL2TR) {
9339+ src_y += size_y - 1;
9340+ dst_y += size_y - 1;
9341+ }
9342+
9343+ blit_cmd =
9344+ PSB_2D_BLIT_BH |
9345+ PSB_2D_ROT_NONE |
9346+ PSB_2D_DSTCK_DISABLE |
9347+ PSB_2D_SRCCK_DISABLE |
9348+ PSB_2D_USE_PAT | PSB_2D_ROP3_SRCCOPY | direction;
9349+
9350+ *buf++ = PSB_2D_FENCE_BH;
9351+ *buf++ =
9352+ PSB_2D_DST_SURF_BH | dst_format | (dst_stride <<
9353+ PSB_2D_DST_STRIDE_SHIFT);
9354+ *buf++ = dst_offset;
9355+ *buf++ =
9356+ PSB_2D_SRC_SURF_BH | src_format | (src_stride <<
9357+ PSB_2D_SRC_STRIDE_SHIFT);
9358+ *buf++ = src_offset;
9359+ *buf++ =
9360+ PSB_2D_SRC_OFF_BH | (src_x << PSB_2D_SRCOFF_XSTART_SHIFT) | (src_y
9361+ <<
9362+ PSB_2D_SRCOFF_YSTART_SHIFT);
9363+ *buf++ = blit_cmd;
9364+ *buf++ =
9365+ (dst_x << PSB_2D_DST_XSTART_SHIFT) | (dst_y <<
9366+ PSB_2D_DST_YSTART_SHIFT);
9367+ *buf++ =
9368+ (size_x << PSB_2D_DST_XSIZE_SHIFT) | (size_y <<
9369+ PSB_2D_DST_YSIZE_SHIFT);
9370+ *buf++ = PSB_2D_FLUSH_BH;
9371+
9372+ psb_2d_lock(dev_priv);
9373+ ret = psb_2d_submit(dev_priv, buffer, buf - buffer);
9374+ psb_2d_unlock(dev_priv);
9375+ return ret;
9376+}
9377+
9378+static void psbfb_copyarea_accel(struct fb_info *info,
9379+ const struct fb_copyarea *a)
9380+{
9381+ struct psbfb_par *par = info->par;
9382+ struct drm_framebuffer *fb = par->crtc->fb;
9383+ struct drm_psb_private *dev_priv = par->dev->dev_private;
9384+ uint32_t offset;
9385+ uint32_t stride;
9386+ uint32_t src_format;
9387+ uint32_t dst_format;
9388+
9389+ if (!fb)
9390+ return;
9391+
9392+ offset = fb->offset;
9393+ stride = fb->pitch;
9394+
9395+ if (a->width == 8 || a->height == 8) {
9396+ psb_2d_lock(dev_priv);
9397+ psb_idle_2d(par->dev);
9398+ psb_2d_unlock(dev_priv);
9399+ cfb_copyarea(info, a);
9400+ return;
9401+ }
9402+
9403+ switch (fb->depth) {
9404+ case 8:
9405+ src_format = PSB_2D_SRC_332RGB;
9406+ dst_format = PSB_2D_DST_332RGB;
9407+ break;
9408+ case 15:
9409+ src_format = PSB_2D_SRC_555RGB;
9410+ dst_format = PSB_2D_DST_555RGB;
9411+ break;
9412+ case 16:
9413+ src_format = PSB_2D_SRC_565RGB;
9414+ dst_format = PSB_2D_DST_565RGB;
9415+ break;
9416+ case 24:
9417+ case 32:
9418+ /* this is wrong but since we don't do blending its okay */
9419+ src_format = PSB_2D_SRC_8888ARGB;
9420+ dst_format = PSB_2D_DST_8888ARGB;
9421+ break;
9422+ default:
9423+ /* software fallback */
9424+ cfb_copyarea(info, a);
9425+ return;
9426+ }
9427+
9428+ psb_accel_2d_copy(dev_priv,
9429+ offset, stride, src_format,
9430+ offset, stride, dst_format,
9431+ a->sx, a->sy, a->dx, a->dy, a->width, a->height);
9432+}
9433+
9434+static void psbfb_copyarea(struct fb_info *info,
9435+ const struct fb_copyarea *region)
9436+{
9437+ if (info->state != FBINFO_STATE_RUNNING)
9438+ return;
9439+ if (info->flags & FBINFO_HWACCEL_DISABLED) {
9440+ cfb_copyarea(info, region);
9441+ return;
9442+ }
9443+ if (in_interrupt() || in_atomic()) {
9444+ /*
9445+ * Catch case when we're shutting down.
9446+ */
9447+ cfb_copyarea(info, region);
9448+ return;
9449+ }
9450+
9451+ psbfb_copyarea_accel(info, region);
9452+}
9453+
9454+void psbfb_imageblit(struct fb_info *info, const struct fb_image *image)
9455+{
9456+ if (info->state != FBINFO_STATE_RUNNING)
9457+ return;
9458+ if (info->flags & FBINFO_HWACCEL_DISABLED) {
9459+ cfb_imageblit(info, image);
9460+ return;
9461+ }
9462+ if (in_interrupt() || in_atomic()) {
9463+ cfb_imageblit(info, image);
9464+ return;
9465+ }
9466+
9467+ cfb_imageblit(info, image);
9468+}
9469+
9470+static int psbfb_blank(int blank_mode, struct fb_info *info)
9471+{
9472+ int dpms_mode;
9473+ struct psbfb_par *par = info->par;
9474+ struct drm_connector *output;
9475+ struct drm_crtc_helper_funcs *crtc_funcs;
9476+
9477+ par->dpms_state = blank_mode;
9478+
9479+ switch(blank_mode) {
9480+ case FB_BLANK_UNBLANK:
9481+ dpms_mode = DRM_MODE_DPMS_ON;
9482+ break;
9483+ case FB_BLANK_NORMAL:
9484+ if (!par->crtc)
9485+ return 0;
9486+ crtc_funcs = par->crtc->helper_private;
9487+
9488+ (*crtc_funcs->dpms)(par->crtc, DRM_MODE_DPMS_STANDBY);
9489+ return 0;
9490+ case FB_BLANK_HSYNC_SUSPEND:
9491+ default:
9492+ dpms_mode = DRM_MODE_DPMS_STANDBY;
9493+ break;
9494+ case FB_BLANK_VSYNC_SUSPEND:
9495+ dpms_mode = DRM_MODE_DPMS_SUSPEND;
9496+ break;
9497+ case FB_BLANK_POWERDOWN:
9498+ dpms_mode = DRM_MODE_DPMS_OFF;
9499+ break;
9500+ }
9501+
9502+ if (!par->crtc)
9503+ return 0;
9504+
9505+ crtc_funcs = par->crtc->helper_private;
9506+
9507+ list_for_each_entry(output, &par->dev->mode_config.connector_list, head) {
9508+ if (output->encoder->crtc == par->crtc)
9509+ (*output->funcs->dpms)(output, dpms_mode);
9510+ }
9511+
9512+ return 0;
9513+}
9514+
9515+
9516+static int psbfb_kms_off(struct drm_device *dev, int suspend)
9517+{
9518+ struct drm_framebuffer *fb = 0;
9519+ struct drm_buffer_object *bo = 0;
9520+ struct drm_psb_private *dev_priv = dev->dev_private;
9521+ int ret = 0;
9522+
9523+ DRM_DEBUG("psbfb_kms_off_ioctl\n");
9524+
9525+ mutex_lock(&dev->mode_config.mutex);
9526+ list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
9527+ struct fb_info *info = fb->fbdev;
9528+ struct psbfb_par *par = info->par;
9529+ int save_dpms_state;
9530+
9531+ if (suspend)
9532+ fb_set_suspend(info, 1);
9533+ else
9534+ info->state &= ~FBINFO_STATE_RUNNING;
9535+
9536+ info->screen_base = NULL;
9537+
9538+ bo = fb->bo;
9539+
9540+ if (!bo)
9541+ continue;
9542+
9543+ drm_bo_kunmap(&fb->kmap);
9544+
9545+ /*
9546+ * We don't take the 2D lock here as we assume that the
9547+ * 2D engine will eventually idle anyway.
9548+ */
9549+
9550+ if (!suspend) {
9551+ uint32_t dummy2 = 0;
9552+ (void) psb_fence_emit_sequence(dev, PSB_ENGINE_2D, 0,
9553+ &dummy2, &dummy2);
9554+ psb_2d_lock(dev_priv);
9555+ (void)psb_idle_2d(dev);
9556+ psb_2d_unlock(dev_priv);
9557+ } else
9558+ psb_idle_2d(dev);
9559+
9560+ save_dpms_state = par->dpms_state;
9561+ psbfb_blank(FB_BLANK_NORMAL, info);
9562+ par->dpms_state = save_dpms_state;
9563+
9564+ ret = psbfb_move_fb_bo(info, bo, DRM_BO_FLAG_MEM_LOCAL);
9565+
9566+ if (ret)
9567+ goto out_err;
9568+ }
9569+ out_err:
9570+ mutex_unlock(&dev->mode_config.mutex);
9571+
9572+ return ret;
9573+}
9574+
9575+int psbfb_kms_off_ioctl(struct drm_device *dev, void *data,
9576+ struct drm_file *file_priv)
9577+{
9578+ int ret;
9579+
9580+ acquire_console_sem();
9581+ ret = psbfb_kms_off(dev, 0);
9582+ release_console_sem();
9583+
9584+ return ret;
9585+}
9586+
9587+static int psbfb_kms_on(struct drm_device *dev, int resume)
9588+{
9589+ struct drm_framebuffer *fb = 0;
9590+ struct drm_buffer_object *bo = 0;
9591+ struct drm_psb_private *dev_priv = dev->dev_private;
9592+ int ret = 0;
9593+ int dummy;
9594+
9595+ DRM_DEBUG("psbfb_kms_on_ioctl\n");
9596+
9597+ if (!resume) {
9598+ uint32_t dummy2 = 0;
9599+ (void) psb_fence_emit_sequence(dev, PSB_ENGINE_2D, 0,
9600+ &dummy2, &dummy2);
9601+ psb_2d_lock(dev_priv);
9602+ (void)psb_idle_2d(dev);
9603+ psb_2d_unlock(dev_priv);
9604+ } else
9605+ psb_idle_2d(dev);
9606+
9607+ mutex_lock(&dev->mode_config.mutex);
9608+ list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
9609+ struct fb_info *info = fb->fbdev;
9610+ struct psbfb_par *par = info->par;
9611+
9612+ bo = fb->bo;
9613+ if (!bo)
9614+ continue;
9615+
9616+ ret = psbfb_move_fb_bo(info, bo,
9617+ DRM_BO_FLAG_MEM_TT |
9618+ DRM_BO_FLAG_MEM_VRAM |
9619+ DRM_BO_FLAG_NO_EVICT);
9620+ if (ret)
9621+ goto out_err;
9622+
9623+ ret = drm_bo_kmap(bo, 0, bo->num_pages, &fb->kmap);
9624+ if (ret)
9625+ goto out_err;
9626+
9627+ info->screen_base = drm_bmo_virtual(&fb->kmap, &dummy);
9628+ fb->offset = bo->offset - dev_priv->pg->gatt_start;
9629+
9630+ if (ret)
9631+ goto out_err;
9632+
9633+ if (resume)
9634+ fb_set_suspend(info, 0);
9635+ else
9636+ info->state |= FBINFO_STATE_RUNNING;
9637+
9638+ /*
9639+ * Re-run modesetting here, since the VDS scanout offset may
9640+ * have changed.
9641+ */
9642+
9643+ if (par->crtc->enabled) {
9644+ psbfb_set_par(info);
9645+ psbfb_blank(par->dpms_state, info);
9646+ }
9647+ }
9648+ out_err:
9649+ mutex_unlock(&dev->mode_config.mutex);
9650+
9651+ return ret;
9652+}
9653+
9654+int psbfb_kms_on_ioctl(struct drm_device *dev, void *data,
9655+ struct drm_file *file_priv)
9656+{
9657+ int ret;
9658+
9659+ acquire_console_sem();
9660+ ret = psbfb_kms_on(dev, 0);
9661+ release_console_sem();
9662+
9663+ drm_helper_disable_unused_functions(dev);
9664+
9665+ return ret;
9666+}
9667+
9668+void psbfb_suspend(struct drm_device *dev)
9669+{
9670+ acquire_console_sem();
9671+ psbfb_kms_off(dev, 1);
9672+ release_console_sem();
9673+}
9674+
9675+void psbfb_resume(struct drm_device *dev)
9676+{
9677+ acquire_console_sem();
9678+ psbfb_kms_on(dev, 1);
9679+ release_console_sem();
9680+
9681+ drm_helper_disable_unused_functions(dev);
9682+}
9683+
9684+/*
9685+ * FIXME: Before kernel inclusion, migrate nopfn to fault.
9686+ * Also, these should be the default vm ops for buffer object type fbs.
9687+ */
9688+
9689+extern unsigned long drm_bo_vm_fault(struct vm_area_struct *vma,
9690+ struct vm_fault *vmf);
9691+
9692+/*
9693+ * This wrapper is a bit ugly and is here because we need access to a mutex
9694+ * that we can lock both around nopfn and around unmap_mapping_range + move.
9695+ * Normally, this would've been done using the bo mutex, but unfortunately
9696+ * we cannot lock it around drm_bo_do_validate(), since that would imply
9697+ * recursive locking.
9698+ */
9699+
9700+static int psbfb_fault(struct vm_area_struct *vma,
9701+ struct vm_fault *vmf)
9702+{
9703+ struct psbfb_vm_info *vi = (struct psbfb_vm_info *)vma->vm_private_data;
9704+ struct vm_area_struct tmp_vma;
9705+ int ret;
9706+
9707+ mutex_lock(&vi->vm_mutex);
9708+ tmp_vma = *vma;
9709+ tmp_vma.vm_private_data = vi->bo;
9710+ ret = drm_bo_vm_fault(&tmp_vma, vmf);
9711+ mutex_unlock(&vi->vm_mutex);
9712+ return ret;
9713+}
9714+
9715+static void psbfb_vm_open(struct vm_area_struct *vma)
9716+{
9717+ struct psbfb_vm_info *vi = (struct psbfb_vm_info *)vma->vm_private_data;
9718+
9719+ atomic_inc(&vi->refcount);
9720+}
9721+
9722+static void psbfb_vm_close(struct vm_area_struct *vma)
9723+{
9724+ psbfb_vm_info_deref((struct psbfb_vm_info **)&vma->vm_private_data);
9725+}
9726+
9727+static struct vm_operations_struct psbfb_vm_ops = {
9728+ .fault = psbfb_fault,
9729+ .open = psbfb_vm_open,
9730+ .close = psbfb_vm_close,
9731+};
9732+
9733+static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
9734+{
9735+ struct psbfb_par *par = info->par;
9736+ struct drm_framebuffer *fb = par->crtc->fb;
9737+ struct drm_buffer_object *bo = fb->bo;
9738+ unsigned long size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
9739+ unsigned long offset = vma->vm_pgoff;
9740+
9741+ if (vma->vm_pgoff != 0)
9742+ return -EINVAL;
9743+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
9744+ return -EINVAL;
9745+ if (offset + size > bo->num_pages)
9746+ return -EINVAL;
9747+
9748+ mutex_lock(&par->vi->vm_mutex);
9749+ if (!par->vi->f_mapping)
9750+ par->vi->f_mapping = vma->vm_file->f_mapping;
9751+ mutex_unlock(&par->vi->vm_mutex);
9752+
9753+ vma->vm_private_data = psbfb_vm_info_ref(par->vi);
9754+
9755+ vma->vm_ops = &psbfb_vm_ops;
9756+ vma->vm_flags |= VM_PFNMAP;
9757+
9758+ return 0;
9759+}
9760+
9761+int psbfb_sync(struct fb_info *info)
9762+{
9763+ struct psbfb_par *par = info->par;
9764+ struct drm_psb_private *dev_priv = par->dev->dev_private;
9765+
9766+ psb_2d_lock(dev_priv);
9767+ psb_idle_2d(par->dev);
9768+ psb_2d_unlock(dev_priv);
9769+
9770+ return 0;
9771+}
9772+
9773+static struct fb_ops psbfb_ops = {
9774+ .owner = THIS_MODULE,
9775+ .fb_check_var = psbfb_check_var,
9776+ .fb_set_par = psbfb_set_par,
9777+ .fb_setcolreg = psbfb_setcolreg,
9778+ .fb_fillrect = psbfb_fillrect,
9779+ .fb_copyarea = psbfb_copyarea,
9780+ .fb_imageblit = psbfb_imageblit,
9781+ .fb_mmap = psbfb_mmap,
9782+ .fb_sync = psbfb_sync,
9783+ .fb_blank = psbfb_blank,
9784+};
9785+
9786+static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb)
9787+{
9788+ drm_framebuffer_cleanup(fb);
9789+ kfree(fb);
9790+}
9791+
9792+static const struct drm_framebuffer_funcs psb_fb_funcs = {
9793+ .destroy = psb_user_framebuffer_destroy,
9794+};
9795+
9796+int psbfb_probe(struct drm_device *dev, struct drm_crtc *crtc)
9797+{
9798+ struct fb_info *info;
9799+ struct psbfb_par *par;
9800+ struct device *device = &dev->pdev->dev;
9801+ struct drm_framebuffer *fb;
9802+ struct drm_display_mode *mode = crtc->desired_mode;
9803+ struct drm_psb_private *dev_priv =
9804+ (struct drm_psb_private *)dev->dev_private;
9805+ struct drm_buffer_object *fbo = NULL;
9806+ int ret;
9807+ int is_iomem;
9808+
9809+ if (drm_psb_no_fb) {
9810+ /* need to do this as the DRM will disable the output */
9811+ crtc->enabled = 1;
9812+ return 0;
9813+ }
9814+
9815+ fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
9816+ if (!fb)
9817+ return -ENOMEM;
9818+
9819+
9820+ ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
9821+ if (!fb) {
9822+ DRM_ERROR("failed to allocate fb.\n");
9823+ return -ENOMEM;
9824+ }
9825+ crtc->fb = fb;
9826+
9827+ fb->width = mode->hdisplay;
9828+ fb->height = mode->vdisplay;
9829+
9830+ fb->bits_per_pixel = 32;
9831+ fb->depth = 24;
9832+ fb->pitch =
9833+ ((fb->width * ((fb->bits_per_pixel + 1) / 8)) + 0x3f) & ~0x3f;
9834+
9835+ info = framebuffer_alloc(sizeof(struct psbfb_par), device);
9836+ if (!info) {
9837+ kfree(fb);
9838+ return -ENOMEM;
9839+ }
9840+
9841+ ret = drm_buffer_object_create(dev,
9842+ fb->pitch * fb->height,
9843+ drm_bo_type_kernel,
9844+ DRM_BO_FLAG_READ |
9845+ DRM_BO_FLAG_WRITE |
9846+ DRM_BO_FLAG_MEM_TT |
9847+ DRM_BO_FLAG_MEM_VRAM |
9848+ DRM_BO_FLAG_NO_EVICT,
9849+ DRM_BO_HINT_DONT_FENCE, 0, 0, &fbo);
9850+ if (ret || !fbo) {
9851+ DRM_ERROR("failed to allocate framebuffer\n");
9852+ goto out_err0;
9853+ }
9854+
9855+ fb->offset = fbo->offset - dev_priv->pg->gatt_start;
9856+ fb->bo = fbo;
9857+ DRM_DEBUG("allocated %dx%d fb: 0x%08lx, bo %p\n", fb->width,
9858+ fb->height, fb->offset, fbo);
9859+
9860+ fb->fbdev = info;
9861+
9862+ par = info->par;
9863+
9864+ par->dev = dev;
9865+ par->crtc = crtc;
9866+ par->vi = psbfb_vm_info_create();
9867+ if (!par->vi)
9868+ goto out_err1;
9869+
9870+ mutex_lock(&dev->struct_mutex);
9871+ par->vi->bo = fbo;
9872+ atomic_inc(&fbo->usage);
9873+ mutex_unlock(&dev->struct_mutex);
9874+
9875+ par->vi->f_mapping = NULL;
9876+ info->fbops = &psbfb_ops;
9877+
9878+ strcpy(info->fix.id, "psbfb");
9879+ info->fix.type = FB_TYPE_PACKED_PIXELS;
9880+ info->fix.visual = FB_VISUAL_DIRECTCOLOR;
9881+ info->fix.type_aux = 0;
9882+ info->fix.xpanstep = 1;
9883+ info->fix.ypanstep = 1;
9884+ info->fix.ywrapstep = 0;
9885+ info->fix.accel = FB_ACCEL_NONE; /* ??? */
9886+ info->fix.type_aux = 0;
9887+ info->fix.mmio_start = 0;
9888+ info->fix.mmio_len = 0;
9889+ info->fix.line_length = fb->pitch;
9890+ info->fix.smem_start = dev->mode_config.fb_base + fb->offset;
9891+ info->fix.smem_len = info->fix.line_length * fb->height;
9892+
9893+ info->flags = FBINFO_DEFAULT |
9894+ FBINFO_PARTIAL_PAN_OK /*| FBINFO_MISC_ALWAYS_SETPAR */ ;
9895+
9896+ ret = drm_bo_kmap(fb->bo, 0, fb->bo->num_pages, &fb->kmap);
9897+ if (ret) {
9898+ DRM_ERROR("error mapping fb: %d\n", ret);
9899+ goto out_err2;
9900+ }
9901+
9902+ info->screen_base = drm_bmo_virtual(&fb->kmap, &is_iomem);
9903+ memset(info->screen_base, 0x00, fb->pitch*fb->height);
9904+ info->screen_size = info->fix.smem_len; /* FIXME */
9905+ info->pseudo_palette = fb->pseudo_palette;
9906+ info->var.xres_virtual = fb->width;
9907+ info->var.yres_virtual = fb->height;
9908+ info->var.bits_per_pixel = fb->bits_per_pixel;
9909+ info->var.xoffset = 0;
9910+ info->var.yoffset = 0;
9911+ info->var.activate = FB_ACTIVATE_NOW;
9912+ info->var.height = -1;
9913+ info->var.width = -1;
9914+ info->var.vmode = FB_VMODE_NONINTERLACED;
9915+
9916+ info->var.xres = mode->hdisplay;
9917+ info->var.right_margin = mode->hsync_start - mode->hdisplay;
9918+ info->var.hsync_len = mode->hsync_end - mode->hsync_start;
9919+ info->var.left_margin = mode->htotal - mode->hsync_end;
9920+ info->var.yres = mode->vdisplay;
9921+ info->var.lower_margin = mode->vsync_start - mode->vdisplay;
9922+ info->var.vsync_len = mode->vsync_end - mode->vsync_start;
9923+ info->var.upper_margin = mode->vtotal - mode->vsync_end;
9924+ info->var.pixclock = 10000000 / mode->htotal * 1000 /
9925+ mode->vtotal * 100;
9926+ /* avoid overflow */
9927+ info->var.pixclock = info->var.pixclock * 1000 / mode->vrefresh;
9928+
9929+ info->pixmap.size = 64 * 1024;
9930+ info->pixmap.buf_align = 8;
9931+ info->pixmap.access_align = 32;
9932+ info->pixmap.flags = FB_PIXMAP_SYSTEM;
9933+ info->pixmap.scan_align = 1;
9934+
9935+ DRM_DEBUG("fb depth is %d\n", fb->depth);
9936+ DRM_DEBUG(" pitch is %d\n", fb->pitch);
9937+ switch (fb->depth) {
9938+ case 8:
9939+ info->var.red.offset = 0;
9940+ info->var.green.offset = 0;
9941+ info->var.blue.offset = 0;
9942+ info->var.red.length = 8; /* 8bit DAC */
9943+ info->var.green.length = 8;
9944+ info->var.blue.length = 8;
9945+ info->var.transp.offset = 0;
9946+ info->var.transp.length = 0;
9947+ break;
9948+ case 15:
9949+ info->var.red.offset = 10;
9950+ info->var.green.offset = 5;
9951+ info->var.blue.offset = 0;
9952+ info->var.red.length = info->var.green.length =
9953+ info->var.blue.length = 5;
9954+ info->var.transp.offset = 15;
9955+ info->var.transp.length = 1;
9956+ break;
9957+ case 16:
9958+ info->var.red.offset = 11;
9959+ info->var.green.offset = 5;
9960+ info->var.blue.offset = 0;
9961+ info->var.red.length = 5;
9962+ info->var.green.length = 6;
9963+ info->var.blue.length = 5;
9964+ info->var.transp.offset = 0;
9965+ break;
9966+ case 24:
9967+ info->var.red.offset = 16;
9968+ info->var.green.offset = 8;
9969+ info->var.blue.offset = 0;
9970+ info->var.red.length = info->var.green.length =
9971+ info->var.blue.length = 8;
9972+ info->var.transp.offset = 0;
9973+ info->var.transp.length = 0;
9974+ break;
9975+ case 32:
9976+ info->var.red.offset = 16;
9977+ info->var.green.offset = 8;
9978+ info->var.blue.offset = 0;
9979+ info->var.red.length = info->var.green.length =
9980+ info->var.blue.length = 8;
9981+ info->var.transp.offset = 24;
9982+ info->var.transp.length = 8;
9983+ break;
9984+ default:
9985+ break;
9986+ }
9987+
9988+ if (register_framebuffer(info) < 0)
9989+ goto out_err3;
9990+
9991+ if (psbfb_check_var(&info->var, info) < 0)
9992+ goto out_err4;
9993+
9994+ psbfb_set_par(info);
9995+
9996+ DRM_INFO("fb%d: %s frame buffer device\n", info->node, info->fix.id);
9997+
9998+ return 0;
9999+ out_err4:
10000+ unregister_framebuffer(info);
10001+ out_err3:
10002+ drm_bo_kunmap(&fb->kmap);
10003+ out_err2:
10004+ psbfb_vm_info_deref(&par->vi);
10005+ out_err1:
10006+ drm_bo_usage_deref_unlocked(&fb->bo);
10007+ out_err0:
10008+ drm_framebuffer_cleanup(fb);
10009+ framebuffer_release(info);
10010+ crtc->fb = NULL;
10011+ return -EINVAL;
10012+}
10013+
10014+EXPORT_SYMBOL(psbfb_probe);
10015+
10016+int psbfb_remove(struct drm_device *dev, struct drm_crtc *crtc)
10017+{
10018+ struct drm_framebuffer *fb;
10019+ struct fb_info *info;
10020+ struct psbfb_par *par;
10021+
10022+ if (drm_psb_no_fb)
10023+ return 0;
10024+
10025+ fb = crtc->fb;
10026+ info = fb->fbdev;
10027+
10028+ if (info) {
10029+ unregister_framebuffer(info);
10030+ drm_bo_kunmap(&fb->kmap);
10031+ par = info->par;
10032+ if (par)
10033+ psbfb_vm_info_deref(&par->vi);
10034+ drm_bo_usage_deref_unlocked(&fb->bo);
10035+ drm_framebuffer_cleanup(fb);
10036+ framebuffer_release(info);
10037+ }
10038+ return 0;
10039+}
10040+
10041+EXPORT_SYMBOL(psbfb_remove);
10042+
10043Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fence.c
10044===================================================================
10045--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10046+++ linux-2.6.28/drivers/gpu/drm/psb/psb_fence.c 2009-02-20 12:23:06.000000000 +0000
10047@@ -0,0 +1,285 @@
10048+/**************************************************************************
10049+ * Copyright (c) 2007, Intel Corporation.
10050+ * All Rights Reserved.
10051+ *
10052+ * This program is free software; you can redistribute it and/or modify it
10053+ * under the terms and conditions of the GNU General Public License,
10054+ * version 2, as published by the Free Software Foundation.
10055+ *
10056+ * This program is distributed in the hope it will be useful, but WITHOUT
10057+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10058+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
10059+ * more details.
10060+ *
10061+ * You should have received a copy of the GNU General Public License along with
10062+ * this program; if not, write to the Free Software Foundation, Inc.,
10063+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
10064+ *
10065+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
10066+ * develop this driver.
10067+ *
10068+ **************************************************************************/
10069+/*
10070+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
10071+ */
10072+
10073+#include "drmP.h"
10074+#include "psb_drv.h"
10075+
10076+static void psb_poll_ta(struct drm_device *dev, uint32_t waiting_types)
10077+{
10078+ struct drm_psb_private *dev_priv =
10079+ (struct drm_psb_private *)dev->dev_private;
10080+ struct drm_fence_driver *driver = dev->driver->fence_driver;
10081+ uint32_t cur_flag = 1;
10082+ uint32_t flags = 0;
10083+ uint32_t sequence = 0;
10084+ uint32_t remaining = 0xFFFFFFFF;
10085+ uint32_t diff;
10086+
10087+ struct psb_scheduler *scheduler;
10088+ struct psb_scheduler_seq *seq;
10089+ struct drm_fence_class_manager *fc =
10090+ &dev->fm.fence_class[PSB_ENGINE_TA];
10091+
10092+ if (unlikely(!dev_priv))
10093+ return;
10094+
10095+ scheduler = &dev_priv->scheduler;
10096+ seq = scheduler->seq;
10097+
10098+ while (likely(waiting_types & remaining)) {
10099+ if (!(waiting_types & cur_flag))
10100+ goto skip;
10101+ if (seq->reported)
10102+ goto skip;
10103+ if (flags == 0)
10104+ sequence = seq->sequence;
10105+ else if (sequence != seq->sequence) {
10106+ drm_fence_handler(dev, PSB_ENGINE_TA,
10107+ sequence, flags, 0);
10108+ sequence = seq->sequence;
10109+ flags = 0;
10110+ }
10111+ flags |= cur_flag;
10112+
10113+ /*
10114+ * Sequence may not have ended up on the ring yet.
10115+ * In that case, report it but don't mark it as
10116+ * reported. A subsequent poll will report it again.
10117+ */
10118+
10119+ diff = (fc->latest_queued_sequence - sequence) &
10120+ driver->sequence_mask;
10121+ if (diff < driver->wrap_diff)
10122+ seq->reported = 1;
10123+
10124+ skip:
10125+ cur_flag <<= 1;
10126+ remaining <<= 1;
10127+ seq++;
10128+ }
10129+
10130+ if (flags) {
10131+ drm_fence_handler(dev, PSB_ENGINE_TA, sequence, flags, 0);
10132+ }
10133+}
10134+
10135+static void psb_poll_other(struct drm_device *dev, uint32_t fence_class,
10136+ uint32_t waiting_types)
10137+{
10138+ struct drm_psb_private *dev_priv =
10139+ (struct drm_psb_private *)dev->dev_private;
10140+ struct drm_fence_manager *fm = &dev->fm;
10141+ struct drm_fence_class_manager *fc = &fm->fence_class[fence_class];
10142+ uint32_t sequence;
10143+
10144+ if (unlikely(!dev_priv))
10145+ return;
10146+
10147+ if (waiting_types) {
10148+ if (fence_class == PSB_ENGINE_VIDEO)
10149+ sequence = dev_priv->msvdx_current_sequence;
10150+ else
10151+ sequence = dev_priv->comm[fence_class << 4];
10152+
10153+ drm_fence_handler(dev, fence_class, sequence,
10154+ DRM_FENCE_TYPE_EXE, 0);
10155+
10156+ switch (fence_class) {
10157+ case PSB_ENGINE_2D:
10158+ if (dev_priv->fence0_irq_on && !fc->waiting_types) {
10159+ psb_2D_irq_off(dev_priv);
10160+ dev_priv->fence0_irq_on = 0;
10161+ } else if (!dev_priv->fence0_irq_on
10162+ && fc->waiting_types) {
10163+ psb_2D_irq_on(dev_priv);
10164+ dev_priv->fence0_irq_on = 1;
10165+ }
10166+ break;
10167+#if 0
10168+ /*
10169+ * FIXME: MSVDX irq switching
10170+ */
10171+
10172+ case PSB_ENGINE_VIDEO:
10173+ if (dev_priv->fence2_irq_on && !fc->waiting_types) {
10174+ psb_msvdx_irq_off(dev_priv);
10175+ dev_priv->fence2_irq_on = 0;
10176+ } else if (!dev_priv->fence2_irq_on
10177+ && fc->pending_exe_flush) {
10178+ psb_msvdx_irq_on(dev_priv);
10179+ dev_priv->fence2_irq_on = 1;
10180+ }
10181+ break;
10182+#endif
10183+ default:
10184+ return;
10185+ }
10186+ }
10187+}
10188+
10189+static void psb_fence_poll(struct drm_device *dev,
10190+ uint32_t fence_class, uint32_t waiting_types)
10191+{
10192+ switch (fence_class) {
10193+ case PSB_ENGINE_TA:
10194+ psb_poll_ta(dev, waiting_types);
10195+ break;
10196+ default:
10197+ psb_poll_other(dev, fence_class, waiting_types);
10198+ break;
10199+ }
10200+}
10201+
10202+void psb_fence_error(struct drm_device *dev,
10203+ uint32_t fence_class,
10204+ uint32_t sequence, uint32_t type, int error)
10205+{
10206+ struct drm_fence_manager *fm = &dev->fm;
10207+ unsigned long irq_flags;
10208+
10209+ BUG_ON(fence_class >= PSB_NUM_ENGINES);
10210+ write_lock_irqsave(&fm->lock, irq_flags);
10211+ drm_fence_handler(dev, fence_class, sequence, type, error);
10212+ write_unlock_irqrestore(&fm->lock, irq_flags);
10213+}
10214+
10215+int psb_fence_emit_sequence(struct drm_device *dev, uint32_t fence_class,
10216+ uint32_t flags, uint32_t * sequence,
10217+ uint32_t * native_type)
10218+{
10219+ struct drm_psb_private *dev_priv =
10220+ (struct drm_psb_private *)dev->dev_private;
10221+ uint32_t seq = 0;
10222+ int ret;
10223+
10224+ if (!dev_priv)
10225+ return -EINVAL;
10226+
10227+ if (fence_class >= PSB_NUM_ENGINES)
10228+ return -EINVAL;
10229+
10230+ switch (fence_class) {
10231+ case PSB_ENGINE_2D:
10232+ spin_lock(&dev_priv->sequence_lock);
10233+ seq = ++dev_priv->sequence[fence_class];
10234+ spin_unlock(&dev_priv->sequence_lock);
10235+ ret = psb_blit_sequence(dev_priv, seq);
10236+ if (ret)
10237+ return ret;
10238+ break;
10239+ case PSB_ENGINE_VIDEO:
10240+ spin_lock(&dev_priv->sequence_lock);
10241+ seq = ++dev_priv->sequence[fence_class];
10242+ spin_unlock(&dev_priv->sequence_lock);
10243+ break;
10244+ default:
10245+ spin_lock(&dev_priv->sequence_lock);
10246+ seq = dev_priv->sequence[fence_class];
10247+ spin_unlock(&dev_priv->sequence_lock);
10248+ }
10249+
10250+ *sequence = seq;
10251+ *native_type = DRM_FENCE_TYPE_EXE;
10252+
10253+ return 0;
10254+}
10255+
10256+uint32_t psb_fence_advance_sequence(struct drm_device * dev,
10257+ uint32_t fence_class)
10258+{
10259+ struct drm_psb_private *dev_priv =
10260+ (struct drm_psb_private *)dev->dev_private;
10261+ uint32_t sequence;
10262+
10263+ spin_lock(&dev_priv->sequence_lock);
10264+ sequence = ++dev_priv->sequence[fence_class];
10265+ spin_unlock(&dev_priv->sequence_lock);
10266+
10267+ return sequence;
10268+}
10269+
10270+void psb_fence_handler(struct drm_device *dev, uint32_t fence_class)
10271+{
10272+ struct drm_fence_manager *fm = &dev->fm;
10273+ struct drm_fence_class_manager *fc = &fm->fence_class[fence_class];
10274+
10275+#ifdef FIX_TG_16
10276+ if (fence_class == 0) {
10277+ struct drm_psb_private *dev_priv =
10278+ (struct drm_psb_private *)dev->dev_private;
10279+
10280+ if ((atomic_read(&dev_priv->ta_wait_2d_irq) == 1) &&
10281+ (PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) &&
10282+ ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) &
10283+ _PSB_C2B_STATUS_BUSY) == 0))
10284+ psb_resume_ta_2d_idle(dev_priv);
10285+ }
10286+#endif
10287+ write_lock(&fm->lock);
10288+ psb_fence_poll(dev, fence_class, fc->waiting_types);
10289+ write_unlock(&fm->lock);
10290+}
10291+
10292+static int psb_fence_wait(struct drm_fence_object *fence,
10293+ int lazy, int interruptible, uint32_t mask)
10294+{
10295+ struct drm_device *dev = fence->dev;
10296+ struct drm_fence_class_manager *fc =
10297+ &dev->fm.fence_class[fence->fence_class];
10298+ int ret = 0;
10299+ unsigned long timeout = DRM_HZ *
10300+ ((fence->fence_class == PSB_ENGINE_TA) ? 30 : 3);
10301+
10302+ drm_fence_object_flush(fence, mask);
10303+ if (interruptible)
10304+ ret = wait_event_interruptible_timeout
10305+ (fc->fence_queue, drm_fence_object_signaled(fence, mask),
10306+ timeout);
10307+ else
10308+ ret = wait_event_timeout
10309+ (fc->fence_queue, drm_fence_object_signaled(fence, mask),
10310+ timeout);
10311+
10312+ if (unlikely(ret == -ERESTARTSYS))
10313+ return -EAGAIN;
10314+
10315+ if (unlikely(ret == 0))
10316+ return -EBUSY;
10317+
10318+ return 0;
10319+}
10320+
10321+struct drm_fence_driver psb_fence_driver = {
10322+ .num_classes = PSB_NUM_ENGINES,
10323+ .wrap_diff = (1 << 30),
10324+ .flush_diff = (1 << 29),
10325+ .sequence_mask = 0xFFFFFFFFU,
10326+ .has_irq = NULL,
10327+ .emit = psb_fence_emit_sequence,
10328+ .flush = NULL,
10329+ .poll = psb_fence_poll,
10330+ .needed_flush = NULL,
10331+ .wait = psb_fence_wait
10332+};
10333Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c
10334===================================================================
10335--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10336+++ linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c 2009-02-20 12:23:06.000000000 +0000
10337@@ -0,0 +1,253 @@
10338+/**************************************************************************
10339+ * Copyright (c) 2007, Intel Corporation.
10340+ * All Rights Reserved.
10341+ *
10342+ * This program is free software; you can redistribute it and/or modify it
10343+ * under the terms and conditions of the GNU General Public License,
10344+ * version 2, as published by the Free Software Foundation.
10345+ *
10346+ * This program is distributed in the hope it will be useful, but WITHOUT
10347+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10348+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
10349+ * more details.
10350+ *
10351+ * You should have received a copy of the GNU General Public License along with
10352+ * this program; if not, write to the Free Software Foundation, Inc.,
10353+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
10354+ *
10355+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
10356+ * develop this driver.
10357+ *
10358+ **************************************************************************/
10359+/*
10360+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
10361+ */
10362+#include "drmP.h"
10363+#include "psb_drv.h"
10364+
10365+static inline uint32_t psb_gtt_mask_pte(uint32_t pfn, int type)
10366+{
10367+ uint32_t mask = PSB_PTE_VALID;
10368+
10369+ if (type & PSB_MMU_CACHED_MEMORY)
10370+ mask |= PSB_PTE_CACHED;
10371+ if (type & PSB_MMU_RO_MEMORY)
10372+ mask |= PSB_PTE_RO;
10373+ if (type & PSB_MMU_WO_MEMORY)
10374+ mask |= PSB_PTE_WO;
10375+
10376+ return (pfn << PAGE_SHIFT) | mask;
10377+}
10378+
10379+struct psb_gtt *psb_gtt_alloc(struct drm_device *dev)
10380+{
10381+ struct psb_gtt *tmp = drm_calloc(1, sizeof(*tmp), DRM_MEM_DRIVER);
10382+
10383+ if (!tmp)
10384+ return NULL;
10385+
10386+ init_rwsem(&tmp->sem);
10387+ tmp->dev = dev;
10388+
10389+ return tmp;
10390+}
10391+
10392+void psb_gtt_takedown(struct psb_gtt *pg, int free)
10393+{
10394+ struct drm_psb_private *dev_priv = pg->dev->dev_private;
10395+
10396+ if (!pg)
10397+ return;
10398+
10399+ if (pg->gtt_map) {
10400+ iounmap(pg->gtt_map);
10401+ pg->gtt_map = NULL;
10402+ }
10403+ if (pg->initialized) {
10404+ pci_write_config_word(pg->dev->pdev, PSB_GMCH_CTRL,
10405+ pg->gmch_ctrl);
10406+ PSB_WVDC32(pg->pge_ctl, PSB_PGETBL_CTL);
10407+ (void)PSB_RVDC32(PSB_PGETBL_CTL);
10408+ }
10409+ if (free)
10410+ drm_free(pg, sizeof(*pg), DRM_MEM_DRIVER);
10411+}
10412+
10413+int psb_gtt_init(struct psb_gtt *pg, int resume)
10414+{
10415+ struct drm_device *dev = pg->dev;
10416+ struct drm_psb_private *dev_priv = dev->dev_private;
10417+ unsigned gtt_pages;
10418+ unsigned long stolen_size;
10419+ unsigned i, num_pages;
10420+ unsigned pfn_base;
10421+
10422+ int ret = 0;
10423+ uint32_t pte;
10424+
10425+ printk(KERN_ERR "Bar A1\n");
10426+
10427+ pci_read_config_word(dev->pdev, PSB_GMCH_CTRL, &pg->gmch_ctrl);
10428+ pci_write_config_word(dev->pdev, PSB_GMCH_CTRL,
10429+ pg->gmch_ctrl | _PSB_GMCH_ENABLED);
10430+
10431+ printk(KERN_ERR "Bar A2\n");
10432+
10433+ pg->pge_ctl = PSB_RVDC32(PSB_PGETBL_CTL);
10434+ PSB_WVDC32(pg->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL);
10435+ (void)PSB_RVDC32(PSB_PGETBL_CTL);
10436+
10437+ printk(KERN_ERR "Bar A3\n");
10438+
10439+ pg->initialized = 1;
10440+
10441+ pg->gtt_phys_start = pg->pge_ctl & PAGE_MASK;
10442+ pg->gatt_start = pci_resource_start(dev->pdev, PSB_GATT_RESOURCE);
10443+ pg->gtt_start = pci_resource_start(dev->pdev, PSB_GTT_RESOURCE);
10444+ gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) >> PAGE_SHIFT;
10445+ pg->gatt_pages = pci_resource_len(dev->pdev, PSB_GATT_RESOURCE)
10446+ >> PAGE_SHIFT;
10447+
10448+ printk(KERN_ERR "Bar A4\n");
10449+ pci_read_config_dword(dev->pdev, PSB_BSM, &pg->stolen_base);
10450+ stolen_size = pg->gtt_phys_start - pg->stolen_base - PAGE_SIZE;
10451+
10452+ printk(KERN_ERR "Bar A5\n");
10453+
10454+ PSB_DEBUG_INIT("GTT phys start: 0x%08x.\n", pg->gtt_phys_start);
10455+ PSB_DEBUG_INIT("GTT start: 0x%08x.\n", pg->gtt_start);
10456+ PSB_DEBUG_INIT("GATT start: 0x%08x.\n", pg->gatt_start);
10457+ PSB_DEBUG_INIT("GTT pages: %u\n", gtt_pages);
10458+ PSB_DEBUG_INIT("Stolen size: %lu kiB\n", stolen_size / 1024);
10459+
10460+ if (resume && (gtt_pages != pg->gtt_pages) &&
10461+ (stolen_size != pg->stolen_size)) {
10462+ DRM_ERROR("GTT resume error.\n");
10463+ ret = -EINVAL;
10464+ goto out_err;
10465+ }
10466+
10467+ printk(KERN_ERR "Bar A6\n");
10468+
10469+ pg->gtt_pages = gtt_pages;
10470+ pg->stolen_size = stolen_size;
10471+ pg->gtt_map =
10472+ ioremap_nocache(pg->gtt_phys_start, gtt_pages << PAGE_SHIFT);
10473+ if (!pg->gtt_map) {
10474+ DRM_ERROR("Failure to map gtt.\n");
10475+ ret = -ENOMEM;
10476+ goto out_err;
10477+ }
10478+
10479+ printk(KERN_ERR "Bar A7\n");
10480+
10481+ /*
10482+ * insert stolen pages.
10483+ */
10484+
10485+ pfn_base = pg->stolen_base >> PAGE_SHIFT;
10486+ num_pages = stolen_size >> PAGE_SHIFT;
10487+ PSB_DEBUG_INIT("Set up %d stolen pages starting at 0x%08x\n",
10488+ num_pages, pfn_base);
10489+ for (i = 0; i < num_pages; ++i) {
10490+ pte = psb_gtt_mask_pte(pfn_base + i, 0);
10491+ iowrite32(pte, pg->gtt_map + i);
10492+ }
10493+
10494+ printk(KERN_ERR "Bar A8\n");
10495+
10496+ /*
10497+ * Init rest of gtt.
10498+ */
10499+
10500+ pfn_base = page_to_pfn(dev_priv->scratch_page);
10501+ pte = psb_gtt_mask_pte(pfn_base, 0);
10502+ PSB_DEBUG_INIT("Initializing the rest of a total "
10503+ "of %d gtt pages.\n", pg->gatt_pages);
10504+
10505+ printk(KERN_ERR "Bar A10\n");
10506+
10507+ for (; i < pg->gatt_pages; ++i)
10508+ iowrite32(pte, pg->gtt_map + i);
10509+ (void)ioread32(pg->gtt_map + i - 1);
10510+
10511+ printk(KERN_ERR "Bar A11\n");
10512+
10513+ return 0;
10514+
10515+ out_err:
10516+ psb_gtt_takedown(pg, 0);
10517+ return ret;
10518+}
10519+
10520+int psb_gtt_insert_pages(struct psb_gtt *pg, struct page **pages,
10521+ unsigned offset_pages, unsigned num_pages,
10522+ unsigned desired_tile_stride, unsigned hw_tile_stride,
10523+ int type)
10524+{
10525+ unsigned rows = 1;
10526+ unsigned add;
10527+ unsigned row_add;
10528+ unsigned i;
10529+ unsigned j;
10530+ uint32_t *cur_page = NULL;
10531+ uint32_t pte;
10532+
10533+ if (hw_tile_stride)
10534+ rows = num_pages / desired_tile_stride;
10535+ else
10536+ desired_tile_stride = num_pages;
10537+
10538+ add = desired_tile_stride;
10539+ row_add = hw_tile_stride;
10540+
10541+ down_read(&pg->sem);
10542+ for (i = 0; i < rows; ++i) {
10543+ cur_page = pg->gtt_map + offset_pages;
10544+ for (j = 0; j < desired_tile_stride; ++j) {
10545+ pte = psb_gtt_mask_pte(page_to_pfn(*pages++), type);
10546+ iowrite32(pte, cur_page++);
10547+ }
10548+ offset_pages += add;
10549+ }
10550+ (void)ioread32(cur_page - 1);
10551+ up_read(&pg->sem);
10552+
10553+ return 0;
10554+}
10555+
10556+int psb_gtt_remove_pages(struct psb_gtt *pg, unsigned offset_pages,
10557+ unsigned num_pages, unsigned desired_tile_stride,
10558+ unsigned hw_tile_stride)
10559+{
10560+ struct drm_psb_private *dev_priv = pg->dev->dev_private;
10561+ unsigned rows = 1;
10562+ unsigned add;
10563+ unsigned row_add;
10564+ unsigned i;
10565+ unsigned j;
10566+ uint32_t *cur_page = NULL;
10567+ unsigned pfn_base = page_to_pfn(dev_priv->scratch_page);
10568+ uint32_t pte = psb_gtt_mask_pte(pfn_base, 0);
10569+
10570+ if (hw_tile_stride)
10571+ rows = num_pages / desired_tile_stride;
10572+ else
10573+ desired_tile_stride = num_pages;
10574+
10575+ add = desired_tile_stride;
10576+ row_add = hw_tile_stride;
10577+
10578+ down_read(&pg->sem);
10579+ for (i = 0; i < rows; ++i) {
10580+ cur_page = pg->gtt_map + offset_pages;
10581+ for (j = 0; j < desired_tile_stride; ++j) {
10582+ iowrite32(pte, cur_page++);
10583+ }
10584+ offset_pages += add;
10585+ }
10586+ (void)ioread32(cur_page - 1);
10587+ up_read(&pg->sem);
10588+
10589+ return 0;
10590+}
10591Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c
10592===================================================================
10593--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10594+++ linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c 2009-02-20 12:23:06.000000000 +0000
10595@@ -0,0 +1,519 @@
10596+/**************************************************************************
10597+ * Copyright (c) 2007, Intel Corporation.
10598+ * All Rights Reserved.
10599+ *
10600+ * This program is free software; you can redistribute it and/or modify it
10601+ * under the terms and conditions of the GNU General Public License,
10602+ * version 2, as published by the Free Software Foundation.
10603+ *
10604+ * This program is distributed in the hope it will be useful, but WITHOUT
10605+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10606+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
10607+ * more details.
10608+ *
10609+ * You should have received a copy of the GNU General Public License along with
10610+ * this program; if not, write to the Free Software Foundation, Inc.,
10611+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
10612+ *
10613+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
10614+ * develop this driver.
10615+ *
10616+ **************************************************************************/
10617+/*
10618+ */
10619+
10620+#include "drmP.h"
10621+#include "psb_drv.h"
10622+#include "psb_reg.h"
10623+#include "psb_msvdx.h"
10624+#include "../i915/i915_reg.h"
10625+
10626+/*
10627+ * Video display controller interrupt.
10628+ */
10629+
10630+static inline u32
10631+psb_pipestat(int pipe)
10632+{
10633+ if (pipe == 0)
10634+ return PIPEASTAT;
10635+ if (pipe == 1)
10636+ return PIPEBSTAT;
10637+ BUG();
10638+}
10639+
10640+void
10641+psb_enable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask)
10642+{
10643+ //struct drm_i915_common_private *dev_priv_common = dev_priv;
10644+
10645+ if ((dev_priv->pipestat[pipe] & mask) != mask) {
10646+ u32 reg = psb_pipestat(pipe);
10647+
10648+ dev_priv->pipestat[pipe] |= mask;
10649+ /* Enable the interrupt, clear any pending status */
10650+ I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16));
10651+ (void) I915_READ(reg);
10652+ }
10653+}
10654+
10655+void
10656+psb_disable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask)
10657+{
10658+ //struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv;
10659+
10660+ if ((dev_priv->pipestat[pipe] & mask) != 0) {
10661+ u32 reg = psb_pipestat(pipe);
10662+
10663+ dev_priv->pipestat[pipe] &= ~mask;
10664+ I915_WRITE(reg, dev_priv->pipestat[pipe]);
10665+ (void) I915_READ(reg);
10666+ }
10667+}
10668+
10669+
10670+/**
10671+ * i915_pipe_enabled - check if a pipe is enabled
10672+ * @dev: DRM device
10673+ * @pipe: pipe to check
10674+ *
10675+ * Reading certain registers when the pipe is disabled can hang the chip.
10676+ * Use this routine to make sure the PLL is running and the pipe is active
10677+ * before reading such registers if unsure.
10678+ */
10679+static int
10680+i915_pipe_enabled(struct drm_device *dev, int pipe)
10681+{
10682+ struct drm_psb_private *dev_priv = dev->dev_private;
10683+ unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF;
10684+
10685+ if (I915_READ(pipeconf) & PIPEACONF_ENABLE)
10686+ return 1;
10687+
10688+ return 0;
10689+}
10690+
10691+/* Called from drm generic code, passed a 'crtc', which
10692+ * we use as a pipe index
10693+ */
10694+u32 psb_get_vblank_counter(struct drm_device *dev, int pipe)
10695+{
10696+ struct drm_psb_private *dev_priv = dev->dev_private;
10697+ unsigned long high_frame;
10698+ unsigned long low_frame;
10699+ u32 high1, high2, low, count;
10700+
10701+ high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH;
10702+ low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;
10703+
10704+ if (!i915_pipe_enabled(dev, pipe)) {
10705+ DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe);
10706+ return 0;
10707+ }
10708+
10709+ /*
10710+ * High & low register fields aren't synchronized, so make sure
10711+ * we get a low value that's stable across two reads of the high
10712+ * register.
10713+ */
10714+ do {
10715+ high1 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
10716+ PIPE_FRAME_HIGH_SHIFT);
10717+ low = ((I915_READ(low_frame) & PIPE_FRAME_LOW_MASK) >>
10718+ PIPE_FRAME_LOW_SHIFT);
10719+ high2 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
10720+ PIPE_FRAME_HIGH_SHIFT);
10721+ } while (high1 != high2);
10722+
10723+ count = (high1 << 8) | low;
10724+
10725+ return count;
10726+}
10727+
10728+/* Called from drm generic code, passed 'crtc' which
10729+ * we use as a pipe index
10730+ */
10731+int psb_enable_vblank(struct drm_device *dev, int pipe)
10732+{
10733+ struct drm_psb_private *dev_priv = dev->dev_private;
10734+ unsigned long irqflags;
10735+ int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
10736+ u32 pipeconf;
10737+
10738+ pipeconf = I915_READ(pipeconf_reg);
10739+ if (!(pipeconf & PIPEACONF_ENABLE))
10740+ return -EINVAL;
10741+
10742+ spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
10743+ psb_enable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_ENABLE);
10744+ spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
10745+ return 0;
10746+}
10747+
10748+/* Called from drm generic code, passed 'crtc' which
10749+ * we use as a pipe index
10750+ */
10751+void psb_disable_vblank(struct drm_device *dev, int pipe)
10752+{
10753+ struct drm_psb_private *dev_priv = dev->dev_private;
10754+ unsigned long irqflags;
10755+
10756+ spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
10757+ psb_disable_pipestat(dev_priv, pipe,
10758+ PIPE_VBLANK_INTERRUPT_ENABLE |
10759+ PIPE_START_VBLANK_INTERRUPT_ENABLE);
10760+ spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
10761+}
10762+
10763+
10764+
10765+static void psb_vdc_interrupt(struct drm_device *dev, uint32_t vdc_stat)
10766+{
10767+ struct drm_psb_private *dev_priv = dev->dev_private; uint32_t pipe_stats;
10768+ int wake = 0;
10769+
10770+ if (!drm_psb_disable_vsync && (vdc_stat & _PSB_VSYNC_PIPEA_FLAG)) {
10771+ pipe_stats = PSB_RVDC32(PSB_PIPEASTAT);
10772+ atomic_inc(&dev->_vblank_count[0]);
10773+ wake = 1;
10774+ PSB_WVDC32(pipe_stats | _PSB_VBLANK_INTERRUPT_ENABLE |
10775+ _PSB_VBLANK_CLEAR, PSB_PIPEASTAT);
10776+ }
10777+
10778+ if (!drm_psb_disable_vsync && (vdc_stat & _PSB_VSYNC_PIPEB_FLAG)) {
10779+ pipe_stats = PSB_RVDC32(PSB_PIPEBSTAT);
10780+ atomic_inc(&dev->_vblank_count[1]);
10781+ wake = 1;
10782+ PSB_WVDC32(pipe_stats | _PSB_VBLANK_INTERRUPT_ENABLE |
10783+ _PSB_VBLANK_CLEAR, PSB_PIPEBSTAT);
10784+ }
10785+
10786+ PSB_WVDC32(vdc_stat, PSB_INT_IDENTITY_R);
10787+ (void)PSB_RVDC32(PSB_INT_IDENTITY_R);
10788+ DRM_READMEMORYBARRIER();
10789+
10790+ if (wake) {
10791+ int i;
10792+ DRM_WAKEUP(dev->vbl_queue);
10793+
10794+ for (i = 0; i < 2; i++)
10795+ drm_vbl_send_signals(dev, i);
10796+ }
10797+}
10798+
10799+/*
10800+ * SGX interrupt source 1.
10801+ */
10802+
10803+static void psb_sgx_interrupt(struct drm_device *dev, uint32_t sgx_stat,
10804+ uint32_t sgx_stat2)
10805+{
10806+ struct drm_psb_private *dev_priv = dev->dev_private;
10807+
10808+ if (sgx_stat & _PSB_CE_TWOD_COMPLETE) {
10809+ DRM_WAKEUP(&dev_priv->event_2d_queue);
10810+ psb_fence_handler(dev, 0);
10811+ }
10812+
10813+ if (unlikely(sgx_stat2 & _PSB_CE2_BIF_REQUESTER_FAULT))
10814+ psb_print_pagefault(dev_priv);
10815+
10816+ psb_scheduler_handler(dev_priv, sgx_stat);
10817+}
10818+
10819+/*
10820+ * MSVDX interrupt.
10821+ */
10822+static void psb_msvdx_interrupt(struct drm_device *dev, uint32_t msvdx_stat)
10823+{
10824+ struct drm_psb_private *dev_priv =
10825+ (struct drm_psb_private *)dev->dev_private;
10826+
10827+ if (msvdx_stat & MSVDX_INTERRUPT_STATUS_CR_MMU_FAULT_IRQ_MASK) {
10828+ /*Ideally we should we should never get to this */
10829+ PSB_DEBUG_GENERAL
10830+ ("******MSVDX: msvdx_stat: 0x%x fence2_irq_on=%d ***** (MMU FAULT)\n",
10831+ msvdx_stat, dev_priv->fence2_irq_on);
10832+
10833+ /* Pause MMU */
10834+ PSB_WMSVDX32(MSVDX_MMU_CONTROL0_CR_MMU_PAUSE_MASK,
10835+ MSVDX_MMU_CONTROL0);
10836+ DRM_WRITEMEMORYBARRIER();
10837+
10838+ /* Clear this interupt bit only */
10839+ PSB_WMSVDX32(MSVDX_INTERRUPT_STATUS_CR_MMU_FAULT_IRQ_MASK,
10840+ MSVDX_INTERRUPT_CLEAR);
10841+ PSB_RMSVDX32(MSVDX_INTERRUPT_CLEAR);
10842+ DRM_READMEMORYBARRIER();
10843+
10844+ dev_priv->msvdx_needs_reset = 1;
10845+ } else if (msvdx_stat & MSVDX_INTERRUPT_STATUS_CR_MTX_IRQ_MASK) {
10846+ PSB_DEBUG_GENERAL
10847+ ("******MSVDX: msvdx_stat: 0x%x fence2_irq_on=%d ***** (MTX)\n",
10848+ msvdx_stat, dev_priv->fence2_irq_on);
10849+
10850+ /* Clear all interupt bits */
10851+ PSB_WMSVDX32(0xffff, MSVDX_INTERRUPT_CLEAR);
10852+ PSB_RMSVDX32(MSVDX_INTERRUPT_CLEAR);
10853+ DRM_READMEMORYBARRIER();
10854+
10855+ psb_msvdx_mtx_interrupt(dev);
10856+ }
10857+}
10858+
10859+irqreturn_t psb_irq_handler(DRM_IRQ_ARGS)
10860+{
10861+ struct drm_device *dev = (struct drm_device *)arg;
10862+ struct drm_psb_private *dev_priv =
10863+ (struct drm_psb_private *)dev->dev_private;
10864+
10865+ uint32_t vdc_stat;
10866+ uint32_t sgx_stat;
10867+ uint32_t sgx_stat2;
10868+ uint32_t msvdx_stat;
10869+ int handled = 0;
10870+
10871+ spin_lock(&dev_priv->irqmask_lock);
10872+
10873+ vdc_stat = PSB_RVDC32(PSB_INT_IDENTITY_R);
10874+ sgx_stat = PSB_RSGX32(PSB_CR_EVENT_STATUS);
10875+ sgx_stat2 = PSB_RSGX32(PSB_CR_EVENT_STATUS2);
10876+ msvdx_stat = PSB_RMSVDX32(MSVDX_INTERRUPT_STATUS);
10877+
10878+ sgx_stat2 &= dev_priv->sgx2_irq_mask;
10879+ sgx_stat &= dev_priv->sgx_irq_mask;
10880+ PSB_WSGX32(sgx_stat2, PSB_CR_EVENT_HOST_CLEAR2);
10881+ PSB_WSGX32(sgx_stat, PSB_CR_EVENT_HOST_CLEAR);
10882+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_CLEAR);
10883+
10884+ vdc_stat &= dev_priv->vdc_irq_mask;
10885+ spin_unlock(&dev_priv->irqmask_lock);
10886+
10887+ if (msvdx_stat) {
10888+ psb_msvdx_interrupt(dev, msvdx_stat);
10889+ handled = 1;
10890+ }
10891+
10892+ if (vdc_stat) {
10893+ /* MSVDX IRQ status is part of vdc_irq_mask */
10894+ psb_vdc_interrupt(dev, vdc_stat);
10895+ handled = 1;
10896+ }
10897+
10898+ if (sgx_stat || sgx_stat2) {
10899+ psb_sgx_interrupt(dev, sgx_stat, sgx_stat2);
10900+ handled = 1;
10901+ }
10902+
10903+ if (!handled) {
10904+ return IRQ_NONE;
10905+ }
10906+
10907+ return IRQ_HANDLED;
10908+}
10909+
10910+void psb_msvdx_irq_preinstall(struct drm_psb_private *dev_priv)
10911+{
10912+ unsigned long mtx_int = 0;
10913+ dev_priv->vdc_irq_mask |= _PSB_IRQ_MSVDX_FLAG;
10914+
10915+ /*Clear MTX interrupt */
10916+ REGIO_WRITE_FIELD_LITE(mtx_int, MSVDX_INTERRUPT_STATUS, CR_MTX_IRQ, 1);
10917+ PSB_WMSVDX32(mtx_int, MSVDX_INTERRUPT_CLEAR);
10918+}
10919+
10920+void psb_irq_preinstall(struct drm_device *dev)
10921+{
10922+ struct drm_psb_private *dev_priv =
10923+ (struct drm_psb_private *)dev->dev_private;
10924+ spin_lock(&dev_priv->irqmask_lock);
10925+ PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
10926+ PSB_WVDC32(0x00000000, PSB_INT_MASK_R);
10927+ PSB_WVDC32(0x00000000, PSB_INT_ENABLE_R);
10928+ PSB_WSGX32(0x00000000, PSB_CR_EVENT_HOST_ENABLE);
10929+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
10930+
10931+ dev_priv->sgx_irq_mask = _PSB_CE_PIXELBE_END_RENDER |
10932+ _PSB_CE_DPM_3D_MEM_FREE |
10933+ _PSB_CE_TA_FINISHED |
10934+ _PSB_CE_DPM_REACHED_MEM_THRESH |
10935+ _PSB_CE_DPM_OUT_OF_MEMORY_GBL |
10936+ _PSB_CE_DPM_OUT_OF_MEMORY_MT |
10937+ _PSB_CE_TA_TERMINATE | _PSB_CE_SW_EVENT;
10938+
10939+ dev_priv->sgx2_irq_mask = _PSB_CE2_BIF_REQUESTER_FAULT;
10940+
10941+ dev_priv->vdc_irq_mask = _PSB_IRQ_SGX_FLAG | _PSB_IRQ_MSVDX_FLAG;
10942+
10943+ if (!drm_psb_disable_vsync)
10944+ dev_priv->vdc_irq_mask |= _PSB_VSYNC_PIPEA_FLAG |
10945+ _PSB_VSYNC_PIPEB_FLAG;
10946+
10947+ /*Clear MTX interrupt */
10948+ {
10949+ unsigned long mtx_int = 0;
10950+ REGIO_WRITE_FIELD_LITE(mtx_int, MSVDX_INTERRUPT_STATUS,
10951+ CR_MTX_IRQ, 1);
10952+ PSB_WMSVDX32(mtx_int, MSVDX_INTERRUPT_CLEAR);
10953+ }
10954+ spin_unlock(&dev_priv->irqmask_lock);
10955+}
10956+
10957+void psb_msvdx_irq_postinstall(struct drm_psb_private *dev_priv)
10958+{
10959+ /* Enable Mtx Interupt to host */
10960+ unsigned long enables = 0;
10961+ PSB_DEBUG_GENERAL("Setting up MSVDX IRQs.....\n");
10962+ REGIO_WRITE_FIELD_LITE(enables, MSVDX_INTERRUPT_STATUS, CR_MTX_IRQ, 1);
10963+ PSB_WMSVDX32(enables, MSVDX_HOST_INTERRUPT_ENABLE);
10964+}
10965+
10966+int psb_irq_postinstall(struct drm_device *dev)
10967+{
10968+ struct drm_psb_private *dev_priv =
10969+ (struct drm_psb_private *)dev->dev_private;
10970+ unsigned long irqflags;
10971+
10972+ spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
10973+ PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
10974+ PSB_WSGX32(dev_priv->sgx2_irq_mask, PSB_CR_EVENT_HOST_ENABLE2);
10975+ PSB_WSGX32(dev_priv->sgx_irq_mask, PSB_CR_EVENT_HOST_ENABLE);
10976+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
10977+ /****MSVDX IRQ Setup...*****/
10978+ /* Enable Mtx Interupt to host */
10979+ {
10980+ unsigned long enables = 0;
10981+ PSB_DEBUG_GENERAL("Setting up MSVDX IRQs.....\n");
10982+ REGIO_WRITE_FIELD_LITE(enables, MSVDX_INTERRUPT_STATUS,
10983+ CR_MTX_IRQ, 1);
10984+ PSB_WMSVDX32(enables, MSVDX_HOST_INTERRUPT_ENABLE);
10985+ }
10986+ dev_priv->irq_enabled = 1;
10987+ spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
10988+ return 0;
10989+}
10990+
10991+void psb_irq_uninstall(struct drm_device *dev)
10992+{
10993+ struct drm_psb_private *dev_priv =
10994+ (struct drm_psb_private *)dev->dev_private;
10995+ unsigned long irqflags;
10996+
10997+ spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
10998+
10999+ dev_priv->sgx_irq_mask = 0x00000000;
11000+ dev_priv->sgx2_irq_mask = 0x00000000;
11001+ dev_priv->vdc_irq_mask = 0x00000000;
11002+
11003+ PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
11004+ PSB_WVDC32(0xFFFFFFFF, PSB_INT_MASK_R);
11005+ PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
11006+ PSB_WSGX32(dev_priv->sgx_irq_mask, PSB_CR_EVENT_HOST_ENABLE);
11007+ PSB_WSGX32(dev_priv->sgx2_irq_mask, PSB_CR_EVENT_HOST_ENABLE2);
11008+ wmb();
11009+ PSB_WVDC32(PSB_RVDC32(PSB_INT_IDENTITY_R), PSB_INT_IDENTITY_R);
11010+ PSB_WSGX32(PSB_RSGX32(PSB_CR_EVENT_STATUS), PSB_CR_EVENT_HOST_CLEAR);
11011+ PSB_WSGX32(PSB_RSGX32(PSB_CR_EVENT_STATUS2), PSB_CR_EVENT_HOST_CLEAR2);
11012+
11013+ /****MSVDX IRQ Setup...*****/
11014+ /* Clear interrupt enabled flag */
11015+ PSB_WMSVDX32(0, MSVDX_HOST_INTERRUPT_ENABLE);
11016+
11017+ dev_priv->irq_enabled = 0;
11018+ spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
11019+
11020+}
11021+
11022+void psb_2D_irq_off(struct drm_psb_private *dev_priv)
11023+{
11024+ unsigned long irqflags;
11025+ uint32_t old_mask;
11026+ uint32_t cleared_mask;
11027+
11028+ spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
11029+ --dev_priv->irqen_count_2d;
11030+ if (dev_priv->irq_enabled && dev_priv->irqen_count_2d == 0) {
11031+
11032+ old_mask = dev_priv->sgx_irq_mask;
11033+ dev_priv->sgx_irq_mask &= ~_PSB_CE_TWOD_COMPLETE;
11034+ PSB_WSGX32(dev_priv->sgx_irq_mask, PSB_CR_EVENT_HOST_ENABLE);
11035+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
11036+
11037+ cleared_mask = (old_mask ^ dev_priv->sgx_irq_mask) & old_mask;
11038+ PSB_WSGX32(cleared_mask, PSB_CR_EVENT_HOST_CLEAR);
11039+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_CLEAR);
11040+ }
11041+ spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
11042+}
11043+
11044+void psb_2D_irq_on(struct drm_psb_private *dev_priv)
11045+{
11046+ unsigned long irqflags;
11047+
11048+ spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
11049+ if (dev_priv->irq_enabled && dev_priv->irqen_count_2d == 0) {
11050+ dev_priv->sgx_irq_mask |= _PSB_CE_TWOD_COMPLETE;
11051+ PSB_WSGX32(dev_priv->sgx_irq_mask, PSB_CR_EVENT_HOST_ENABLE);
11052+ (void)PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
11053+ }
11054+ ++dev_priv->irqen_count_2d;
11055+ spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
11056+}
11057+#if 0
11058+static int psb_vblank_do_wait(struct drm_device *dev, unsigned int *sequence,
11059+ atomic_t * counter, int crtc)
11060+{
11061+ unsigned int cur_vblank;
11062+ int ret = 0;
11063+
11064+ DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ,
11065+ (((cur_vblank = atomic_read(counter))
11066+ - *sequence) <= (1 << 23)));
11067+
11068+ *sequence = cur_vblank;
11069+
11070+ return ret;
11071+}
11072+
11073+int psb_vblank_wait(struct drm_device *dev, unsigned int *sequence)
11074+{
11075+ int ret;
11076+
11077+ ret = psb_vblank_do_wait(dev, sequence, &dev->_vblank_count[0], 0);
11078+ return ret;
11079+}
11080+
11081+int psb_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
11082+{
11083+ int ret;
11084+
11085+ ret = psb_vblank_do_wait(dev, sequence, &dev->_vblank_count[1], 1);
11086+ return ret;
11087+}
11088+#endif
11089+
11090+void psb_msvdx_irq_off(struct drm_psb_private *dev_priv)
11091+{
11092+ unsigned long irqflags;
11093+
11094+ spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
11095+ if (dev_priv->irq_enabled) {
11096+ dev_priv->vdc_irq_mask &= ~_PSB_IRQ_MSVDX_FLAG;
11097+ PSB_WSGX32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
11098+ (void)PSB_RSGX32(PSB_INT_ENABLE_R);
11099+ }
11100+ spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
11101+}
11102+
11103+void psb_msvdx_irq_on(struct drm_psb_private *dev_priv)
11104+{
11105+ unsigned long irqflags;
11106+
11107+ spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
11108+ if (dev_priv->irq_enabled) {
11109+ dev_priv->vdc_irq_mask |= _PSB_IRQ_MSVDX_FLAG;
11110+ PSB_WSGX32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
11111+ (void)PSB_RSGX32(PSB_INT_ENABLE_R);
11112+ }
11113+ spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
11114+}
11115Index: linux-2.6.28/drivers/gpu/drm/psb/psb_mmu.c
11116===================================================================
11117--- /dev/null 1970-01-01 00:00:00.000000000 +0000
11118+++ linux-2.6.28/drivers/gpu/drm/psb/psb_mmu.c 2009-02-20 12:23:06.000000000 +0000
11119@@ -0,0 +1,1037 @@
11120+/**************************************************************************
11121+ * Copyright (c) 2007, Intel Corporation.
11122+ * All Rights Reserved.
11123+ *
11124+ * This program is free software; you can redistribute it and/or modify it
11125+ * under the terms and conditions of the GNU General Public License,
11126+ * version 2, as published by the Free Software Foundation.
11127+ *
11128+ * This program is distributed in the hope it will be useful, but WITHOUT
11129+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11130+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11131+ * more details.
11132+ *
11133+ * You should have received a copy of the GNU General Public License along with
11134+ * this program; if not, write to the Free Software Foundation, Inc.,
11135+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
11136+ *
11137+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
11138+ * develop this driver.
11139+ *
11140+ **************************************************************************/
11141+#include "drmP.h"
11142+#include "psb_drv.h"
11143+#include "psb_reg.h"
11144+
11145+/*
11146+ * Code for the SGX MMU:
11147+ */
11148+
11149+/*
11150+ * clflush on one processor only:
11151+ * clflush should apparently flush the cache line on all processors in an
11152+ * SMP system.
11153+ */
11154+
11155+/*
11156+ * kmap atomic:
11157+ * The usage of the slots must be completely encapsulated within a spinlock, and
11158+ * no other functions that may be using the locks for other purposed may be
11159+ * called from within the locked region.
11160+ * Since the slots are per processor, this will guarantee that we are the only
11161+ * user.
11162+ */
11163+
11164+/*
11165+ * TODO: Inserting ptes from an interrupt handler:
11166+ * This may be desirable for some SGX functionality where the GPU can fault in
11167+ * needed pages. For that, we need to make an atomic insert_pages function, that
11168+ * may fail.
11169+ * If it fails, the caller need to insert the page using a workqueue function,
11170+ * but on average it should be fast.
11171+ */
11172+
11173+struct psb_mmu_driver {
11174+ /* protects driver- and pd structures. Always take in read mode
11175+ * before taking the page table spinlock.
11176+ */
11177+ struct rw_semaphore sem;
11178+
11179+ /* protects page tables, directory tables and pt tables.
11180+ * and pt structures.
11181+ */
11182+ spinlock_t lock;
11183+
11184+ atomic_t needs_tlbflush;
11185+ atomic_t *msvdx_mmu_invaldc;
11186+ uint8_t __iomem *register_map;
11187+ struct psb_mmu_pd *default_pd;
11188+ uint32_t bif_ctrl;
11189+ int has_clflush;
11190+ int clflush_add;
11191+ unsigned long clflush_mask;
11192+};
11193+
11194+struct psb_mmu_pd;
11195+
11196+struct psb_mmu_pt {
11197+ struct psb_mmu_pd *pd;
11198+ uint32_t index;
11199+ uint32_t count;
11200+ struct page *p;
11201+ uint32_t *v;
11202+};
11203+
11204+struct psb_mmu_pd {
11205+ struct psb_mmu_driver *driver;
11206+ int hw_context;
11207+ struct psb_mmu_pt **tables;
11208+ struct page *p;
11209+ struct page *dummy_pt;
11210+ struct page *dummy_page;
11211+ uint32_t pd_mask;
11212+ uint32_t invalid_pde;
11213+ uint32_t invalid_pte;
11214+};
11215+
11216+static inline uint32_t psb_mmu_pt_index(uint32_t offset)
11217+{
11218+ return (offset >> PSB_PTE_SHIFT) & 0x3FF;
11219+}
11220+static inline uint32_t psb_mmu_pd_index(uint32_t offset)
11221+{
11222+ return (offset >> PSB_PDE_SHIFT);
11223+}
11224+
11225+#if defined(CONFIG_X86)
11226+static inline void psb_clflush(void *addr)
11227+{
11228+ __asm__ __volatile__("clflush (%0)\n"::"r"(addr):"memory");
11229+}
11230+
11231+static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
11232+{
11233+ if (!driver->has_clflush)
11234+ return;
11235+
11236+ mb();
11237+ psb_clflush(addr);
11238+ mb();
11239+}
11240+#else
11241+
11242+static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
11243+{;
11244+}
11245+
11246+#endif
11247+
11248+static inline void psb_iowrite32(const struct psb_mmu_driver *d,
11249+ uint32_t val, uint32_t offset)
11250+{
11251+ iowrite32(val, d->register_map + offset);
11252+}
11253+
11254+static inline uint32_t psb_ioread32(const struct psb_mmu_driver *d,
11255+ uint32_t offset)
11256+{
11257+ return ioread32(d->register_map + offset);
11258+}
11259+
11260+static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force)
11261+{
11262+ if (atomic_read(&driver->needs_tlbflush) || force) {
11263+ uint32_t val = psb_ioread32(driver, PSB_CR_BIF_CTRL);
11264+ psb_iowrite32(driver, val | _PSB_CB_CTRL_INVALDC,
11265+ PSB_CR_BIF_CTRL);
11266+ wmb();
11267+ psb_iowrite32(driver, val & ~_PSB_CB_CTRL_INVALDC,
11268+ PSB_CR_BIF_CTRL);
11269+ (void)psb_ioread32(driver, PSB_CR_BIF_CTRL);
11270+ if (driver->msvdx_mmu_invaldc)
11271+ atomic_set(driver->msvdx_mmu_invaldc, 1);
11272+ }
11273+ atomic_set(&driver->needs_tlbflush, 0);
11274+}
11275+
11276+static void psb_mmu_flush_pd(struct psb_mmu_driver *driver, int force)
11277+{
11278+ down_write(&driver->sem);
11279+ psb_mmu_flush_pd_locked(driver, force);
11280+ up_write(&driver->sem);
11281+}
11282+
11283+void psb_mmu_flush(struct psb_mmu_driver *driver)
11284+{
11285+ uint32_t val;
11286+
11287+ down_write(&driver->sem);
11288+ val = psb_ioread32(driver, PSB_CR_BIF_CTRL);
11289+ if (atomic_read(&driver->needs_tlbflush))
11290+ psb_iowrite32(driver, val | _PSB_CB_CTRL_INVALDC,
11291+ PSB_CR_BIF_CTRL);
11292+ else
11293+ psb_iowrite32(driver, val | _PSB_CB_CTRL_FLUSH,
11294+ PSB_CR_BIF_CTRL);
11295+ wmb();
11296+ psb_iowrite32(driver,
11297+ val & ~(_PSB_CB_CTRL_FLUSH | _PSB_CB_CTRL_INVALDC),
11298+ PSB_CR_BIF_CTRL);
11299+ (void)psb_ioread32(driver, PSB_CR_BIF_CTRL);
11300+ atomic_set(&driver->needs_tlbflush, 0);
11301+ if (driver->msvdx_mmu_invaldc)
11302+ atomic_set(driver->msvdx_mmu_invaldc, 1);
11303+ up_write(&driver->sem);
11304+}
11305+
11306+void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context)
11307+{
11308+ uint32_t offset = (hw_context == 0) ? PSB_CR_BIF_DIR_LIST_BASE0 :
11309+ PSB_CR_BIF_DIR_LIST_BASE1 + hw_context * 4;
11310+
11311+ drm_ttm_cache_flush();
11312+ down_write(&pd->driver->sem);
11313+ psb_iowrite32(pd->driver, (page_to_pfn(pd->p) << PAGE_SHIFT), offset);
11314+ wmb();
11315+ psb_mmu_flush_pd_locked(pd->driver, 1);
11316+ pd->hw_context = hw_context;
11317+ up_write(&pd->driver->sem);
11318+
11319+}
11320+
11321+static inline unsigned long psb_pd_addr_end(unsigned long addr,
11322+ unsigned long end)
11323+{
11324+
11325+ addr = (addr + PSB_PDE_MASK + 1) & ~PSB_PDE_MASK;
11326+ return (addr < end) ? addr : end;
11327+}
11328+
11329+static inline uint32_t psb_mmu_mask_pte(uint32_t pfn, int type)
11330+{
11331+ uint32_t mask = PSB_PTE_VALID;
11332+
11333+ if (type & PSB_MMU_CACHED_MEMORY)
11334+ mask |= PSB_PTE_CACHED;
11335+ if (type & PSB_MMU_RO_MEMORY)
11336+ mask |= PSB_PTE_RO;
11337+ if (type & PSB_MMU_WO_MEMORY)
11338+ mask |= PSB_PTE_WO;
11339+
11340+ return (pfn << PAGE_SHIFT) | mask;
11341+}
11342+
11343+struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,
11344+ int trap_pagefaults, int invalid_type)
11345+{
11346+ struct psb_mmu_pd *pd = kmalloc(sizeof(*pd), GFP_KERNEL);
11347+ uint32_t *v;
11348+ int i;
11349+
11350+ if (!pd)
11351+ return NULL;
11352+
11353+ pd->p = alloc_page(GFP_DMA32);
11354+ if (!pd->p)
11355+ goto out_err1;
11356+ pd->dummy_pt = alloc_page(GFP_DMA32);
11357+ if (!pd->dummy_pt)
11358+ goto out_err2;
11359+ pd->dummy_page = alloc_page(GFP_DMA32);
11360+ if (!pd->dummy_page)
11361+ goto out_err3;
11362+
11363+ if (!trap_pagefaults) {
11364+ pd->invalid_pde = psb_mmu_mask_pte(page_to_pfn(pd->dummy_pt),
11365+ invalid_type |
11366+ PSB_MMU_CACHED_MEMORY);
11367+ pd->invalid_pte = psb_mmu_mask_pte(page_to_pfn(pd->dummy_page),
11368+ invalid_type |
11369+ PSB_MMU_CACHED_MEMORY);
11370+ } else {
11371+ pd->invalid_pde = 0;
11372+ pd->invalid_pte = 0;
11373+ }
11374+
11375+ v = kmap(pd->dummy_pt);
11376+ for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i) {
11377+ v[i] = pd->invalid_pte;
11378+ }
11379+ kunmap(pd->dummy_pt);
11380+
11381+ v = kmap(pd->p);
11382+ for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i) {
11383+ v[i] = pd->invalid_pde;
11384+ }
11385+ kunmap(pd->p);
11386+
11387+ clear_page(kmap(pd->dummy_page));
11388+ kunmap(pd->dummy_page);
11389+
11390+ pd->tables = vmalloc_user(sizeof(struct psb_mmu_pt *) * 1024);
11391+ if (!pd->tables)
11392+ goto out_err4;
11393+
11394+ pd->hw_context = -1;
11395+ pd->pd_mask = PSB_PTE_VALID;
11396+ pd->driver = driver;
11397+
11398+ return pd;
11399+
11400+ out_err4:
11401+ __free_page(pd->dummy_page);
11402+ out_err3:
11403+ __free_page(pd->dummy_pt);
11404+ out_err2:
11405+ __free_page(pd->p);
11406+ out_err1:
11407+ kfree(pd);
11408+ return NULL;
11409+}
11410+
11411+void psb_mmu_free_pt(struct psb_mmu_pt *pt)
11412+{
11413+ __free_page(pt->p);
11414+ kfree(pt);
11415+}
11416+
11417+void psb_mmu_free_pagedir(struct psb_mmu_pd *pd)
11418+{
11419+ struct psb_mmu_driver *driver = pd->driver;
11420+ struct psb_mmu_pt *pt;
11421+ int i;
11422+
11423+ down_write(&driver->sem);
11424+ if (pd->hw_context != -1) {
11425+ psb_iowrite32(driver, 0,
11426+ PSB_CR_BIF_DIR_LIST_BASE0 + pd->hw_context * 4);
11427+ psb_mmu_flush_pd_locked(driver, 1);
11428+ }
11429+
11430+ /* Should take the spinlock here, but we don't need to do that
11431+ since we have the semaphore in write mode. */
11432+
11433+ for (i = 0; i < 1024; ++i) {
11434+ pt = pd->tables[i];
11435+ if (pt)
11436+ psb_mmu_free_pt(pt);
11437+ }
11438+
11439+ vfree(pd->tables);
11440+ __free_page(pd->dummy_page);
11441+ __free_page(pd->dummy_pt);
11442+ __free_page(pd->p);
11443+ kfree(pd);
11444+ up_write(&driver->sem);
11445+}
11446+
11447+static struct psb_mmu_pt *psb_mmu_alloc_pt(struct psb_mmu_pd *pd)
11448+{
11449+ struct psb_mmu_pt *pt = kmalloc(sizeof(*pt), GFP_KERNEL);
11450+ void *v;
11451+ uint32_t clflush_add = pd->driver->clflush_add >> PAGE_SHIFT;
11452+ uint32_t clflush_count = PAGE_SIZE / clflush_add;
11453+ spinlock_t *lock = &pd->driver->lock;
11454+ uint8_t *clf;
11455+ uint32_t *ptes;
11456+ int i;
11457+
11458+ if (!pt)
11459+ return NULL;
11460+
11461+ pt->p = alloc_page(GFP_DMA32);
11462+ if (!pt->p) {
11463+ kfree(pt);
11464+ return NULL;
11465+ }
11466+
11467+ spin_lock(lock);
11468+
11469+ v = kmap_atomic(pt->p, KM_USER0);
11470+ clf = (uint8_t *) v;
11471+ ptes = (uint32_t *) v;
11472+ for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i) {
11473+ *ptes++ = pd->invalid_pte;
11474+ }
11475+
11476+#if defined(CONFIG_X86)
11477+ if (pd->driver->has_clflush && pd->hw_context != -1) {
11478+ mb();
11479+ for (i = 0; i < clflush_count; ++i) {
11480+ psb_clflush(clf);
11481+ clf += clflush_add;
11482+ }
11483+ mb();
11484+ }
11485+#endif
11486+ kunmap_atomic(v, KM_USER0);
11487+ spin_unlock(lock);
11488+
11489+ pt->count = 0;
11490+ pt->pd = pd;
11491+ pt->index = 0;
11492+
11493+ return pt;
11494+}
11495+
11496+struct psb_mmu_pt *psb_mmu_pt_alloc_map_lock(struct psb_mmu_pd *pd,
11497+ unsigned long addr)
11498+{
11499+ uint32_t index = psb_mmu_pd_index(addr);
11500+ struct psb_mmu_pt *pt;
11501+ volatile uint32_t *v;
11502+ spinlock_t *lock = &pd->driver->lock;
11503+
11504+ spin_lock(lock);
11505+ pt = pd->tables[index];
11506+ while (!pt) {
11507+ spin_unlock(lock);
11508+ pt = psb_mmu_alloc_pt(pd);
11509+ if (!pt)
11510+ return NULL;
11511+ spin_lock(lock);
11512+
11513+ if (pd->tables[index]) {
11514+ spin_unlock(lock);
11515+ psb_mmu_free_pt(pt);
11516+ spin_lock(lock);
11517+ pt = pd->tables[index];
11518+ continue;
11519+ }
11520+
11521+ v = kmap_atomic(pd->p, KM_USER0);
11522+ pd->tables[index] = pt;
11523+ v[index] = (page_to_pfn(pt->p) << 12) | pd->pd_mask;
11524+ pt->index = index;
11525+ kunmap_atomic((void *)v, KM_USER0);
11526+
11527+ if (pd->hw_context != -1) {
11528+ psb_mmu_clflush(pd->driver, (void *)&v[index]);
11529+ atomic_set(&pd->driver->needs_tlbflush, 1);
11530+ }
11531+ }
11532+ pt->v = kmap_atomic(pt->p, KM_USER0);
11533+ return pt;
11534+}
11535+
11536+static struct psb_mmu_pt *psb_mmu_pt_map_lock(struct psb_mmu_pd *pd,
11537+ unsigned long addr)
11538+{
11539+ uint32_t index = psb_mmu_pd_index(addr);
11540+ struct psb_mmu_pt *pt;
11541+ spinlock_t *lock = &pd->driver->lock;
11542+
11543+ spin_lock(lock);
11544+ pt = pd->tables[index];
11545+ if (!pt) {
11546+ spin_unlock(lock);
11547+ return NULL;
11548+ }
11549+ pt->v = kmap_atomic(pt->p, KM_USER0);
11550+ return pt;
11551+}
11552+
11553+static void psb_mmu_pt_unmap_unlock(struct psb_mmu_pt *pt)
11554+{
11555+ struct psb_mmu_pd *pd = pt->pd;
11556+ volatile uint32_t *v;
11557+
11558+ kunmap_atomic(pt->v, KM_USER0);
11559+ if (pt->count == 0) {
11560+ v = kmap_atomic(pd->p, KM_USER0);
11561+ v[pt->index] = pd->invalid_pde;
11562+ pd->tables[pt->index] = NULL;
11563+
11564+ if (pd->hw_context != -1) {
11565+ psb_mmu_clflush(pd->driver, (void *)&v[pt->index]);
11566+ atomic_set(&pd->driver->needs_tlbflush, 1);
11567+ }
11568+ kunmap_atomic(pt->v, KM_USER0);
11569+ spin_unlock(&pd->driver->lock);
11570+ psb_mmu_free_pt(pt);
11571+ return;
11572+ }
11573+ spin_unlock(&pd->driver->lock);
11574+}
11575+
11576+static inline void psb_mmu_set_pte(struct psb_mmu_pt *pt, unsigned long addr,
11577+ uint32_t pte)
11578+{
11579+ pt->v[psb_mmu_pt_index(addr)] = pte;
11580+}
11581+
11582+static inline void psb_mmu_invalidate_pte(struct psb_mmu_pt *pt,
11583+ unsigned long addr)
11584+{
11585+ pt->v[psb_mmu_pt_index(addr)] = pt->pd->invalid_pte;
11586+}
11587+
11588+#if 0
11589+static uint32_t psb_mmu_check_pte_locked(struct psb_mmu_pd *pd,
11590+ uint32_t mmu_offset)
11591+{
11592+ uint32_t *v;
11593+ uint32_t pfn;
11594+
11595+ v = kmap_atomic(pd->p, KM_USER0);
11596+ if (!v) {
11597+ printk(KERN_INFO "Could not kmap pde page.\n");
11598+ return 0;
11599+ }
11600+ pfn = v[psb_mmu_pd_index(mmu_offset)];
11601+ // printk(KERN_INFO "pde is 0x%08x\n",pfn);
11602+ kunmap_atomic(v, KM_USER0);
11603+ if (((pfn & 0x0F) != PSB_PTE_VALID)) {
11604+ printk(KERN_INFO "Strange pde at 0x%08x: 0x%08x.\n",
11605+ mmu_offset, pfn);
11606+ }
11607+ v = ioremap(pfn & 0xFFFFF000, 4096);
11608+ if (!v) {
11609+ printk(KERN_INFO "Could not kmap pte page.\n");
11610+ return 0;
11611+ }
11612+ pfn = v[psb_mmu_pt_index(mmu_offset)];
11613+ // printk(KERN_INFO "pte is 0x%08x\n",pfn);
11614+ iounmap(v);
11615+ if (((pfn & 0x0F) != PSB_PTE_VALID)) {
11616+ printk(KERN_INFO "Strange pte at 0x%08x: 0x%08x.\n",
11617+ mmu_offset, pfn);
11618+ }
11619+ return pfn >> PAGE_SHIFT;
11620+}
11621+
11622+static void psb_mmu_check_mirrored_gtt(struct psb_mmu_pd *pd,
11623+ uint32_t mmu_offset, uint32_t gtt_pages)
11624+{
11625+ uint32_t start;
11626+ uint32_t next;
11627+
11628+ printk(KERN_INFO "Checking mirrored gtt 0x%08x %d\n",
11629+ mmu_offset, gtt_pages);
11630+ down_read(&pd->driver->sem);
11631+ start = psb_mmu_check_pte_locked(pd, mmu_offset);
11632+ mmu_offset += PAGE_SIZE;
11633+ gtt_pages -= 1;
11634+ while (gtt_pages--) {
11635+ next = psb_mmu_check_pte_locked(pd, mmu_offset);
11636+ if (next != start + 1) {
11637+ printk(KERN_INFO "Ptes out of order: 0x%08x, 0x%08x.\n",
11638+ start, next);
11639+ }
11640+ start = next;
11641+ mmu_offset += PAGE_SIZE;
11642+ }
11643+ up_read(&pd->driver->sem);
11644+}
11645+
11646+#endif
11647+
11648+void psb_mmu_mirror_gtt(struct psb_mmu_pd *pd,
11649+ uint32_t mmu_offset, uint32_t gtt_start,
11650+ uint32_t gtt_pages)
11651+{
11652+ uint32_t *v;
11653+ uint32_t start = psb_mmu_pd_index(mmu_offset);
11654+ struct psb_mmu_driver *driver = pd->driver;
11655+
11656+ down_read(&driver->sem);
11657+ spin_lock(&driver->lock);
11658+
11659+ v = kmap_atomic(pd->p, KM_USER0);
11660+ v += start;
11661+
11662+ while (gtt_pages--) {
11663+ *v++ = gtt_start | pd->pd_mask;
11664+ gtt_start += PAGE_SIZE;
11665+ }
11666+
11667+ drm_ttm_cache_flush();
11668+ kunmap_atomic(v, KM_USER0);
11669+ spin_unlock(&driver->lock);
11670+
11671+ if (pd->hw_context != -1)
11672+ atomic_set(&pd->driver->needs_tlbflush, 1);
11673+
11674+ up_read(&pd->driver->sem);
11675+ psb_mmu_flush_pd(pd->driver, 0);
11676+}
11677+
11678+struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver *driver)
11679+{
11680+ struct psb_mmu_pd *pd;
11681+
11682+ down_read(&driver->sem);
11683+ pd = driver->default_pd;
11684+ up_read(&driver->sem);
11685+
11686+ return pd;
11687+}
11688+
11689+/* Returns the physical address of the PD shared by sgx/msvdx */
11690+uint32_t psb_get_default_pd_addr(struct psb_mmu_driver * driver)
11691+{
11692+ struct psb_mmu_pd *pd;
11693+
11694+ pd = psb_mmu_get_default_pd(driver);
11695+ return ((page_to_pfn(pd->p) << PAGE_SHIFT));
11696+}
11697+
11698+void psb_mmu_driver_takedown(struct psb_mmu_driver *driver)
11699+{
11700+ psb_iowrite32(driver, driver->bif_ctrl, PSB_CR_BIF_CTRL);
11701+ psb_mmu_free_pagedir(driver->default_pd);
11702+ kfree(driver);
11703+}
11704+
11705+struct psb_mmu_driver *psb_mmu_driver_init(uint8_t __iomem * registers,
11706+ int trap_pagefaults,
11707+ int invalid_type,
11708+ atomic_t *msvdx_mmu_invaldc)
11709+{
11710+ struct psb_mmu_driver *driver;
11711+
11712+ driver = (struct psb_mmu_driver *)kmalloc(sizeof(*driver), GFP_KERNEL);
11713+
11714+ if (!driver)
11715+ return NULL;
11716+
11717+ driver->default_pd = psb_mmu_alloc_pd(driver, trap_pagefaults,
11718+ invalid_type);
11719+ if (!driver->default_pd)
11720+ goto out_err1;
11721+
11722+ spin_lock_init(&driver->lock);
11723+ init_rwsem(&driver->sem);
11724+ down_write(&driver->sem);
11725+ driver->register_map = registers;
11726+ atomic_set(&driver->needs_tlbflush, 1);
11727+ driver->msvdx_mmu_invaldc = msvdx_mmu_invaldc;
11728+
11729+ driver->bif_ctrl = psb_ioread32(driver, PSB_CR_BIF_CTRL);
11730+ psb_iowrite32(driver, driver->bif_ctrl | _PSB_CB_CTRL_CLEAR_FAULT,
11731+ PSB_CR_BIF_CTRL);
11732+ psb_iowrite32(driver, driver->bif_ctrl & ~_PSB_CB_CTRL_CLEAR_FAULT,
11733+ PSB_CR_BIF_CTRL);
11734+
11735+ driver->has_clflush = 0;
11736+
11737+#if defined(CONFIG_X86)
11738+ if (boot_cpu_has(X86_FEATURE_CLFLSH)) {
11739+ uint32_t tfms, misc, cap0, cap4, clflush_size;
11740+
11741+ /*
11742+ * clflush size is determined at kernel setup for x86_64 but not for
11743+ * i386. We have to do it here.
11744+ */
11745+
11746+ cpuid(0x00000001, &tfms, &misc, &cap0, &cap4);
11747+ clflush_size = ((misc >> 8) & 0xff) * 8;
11748+ driver->has_clflush = 1;
11749+ driver->clflush_add =
11750+ PAGE_SIZE * clflush_size / sizeof(uint32_t);
11751+ driver->clflush_mask = driver->clflush_add - 1;
11752+ driver->clflush_mask = ~driver->clflush_mask;
11753+ }
11754+#endif
11755+
11756+ up_write(&driver->sem);
11757+ return driver;
11758+
11759+ out_err1:
11760+ kfree(driver);
11761+ return NULL;
11762+}
11763+
11764+#if defined(CONFIG_X86)
11765+static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
11766+ uint32_t num_pages, uint32_t desired_tile_stride,
11767+ uint32_t hw_tile_stride)
11768+{
11769+ struct psb_mmu_pt *pt;
11770+ uint32_t rows = 1;
11771+ uint32_t i;
11772+ unsigned long addr;
11773+ unsigned long end;
11774+ unsigned long next;
11775+ unsigned long add;
11776+ unsigned long row_add;
11777+ unsigned long clflush_add = pd->driver->clflush_add;
11778+ unsigned long clflush_mask = pd->driver->clflush_mask;
11779+
11780+ if (!pd->driver->has_clflush) {
11781+ drm_ttm_cache_flush();
11782+ return;
11783+ }
11784+
11785+ if (hw_tile_stride)
11786+ rows = num_pages / desired_tile_stride;
11787+ else
11788+ desired_tile_stride = num_pages;
11789+
11790+ add = desired_tile_stride << PAGE_SHIFT;
11791+ row_add = hw_tile_stride << PAGE_SHIFT;
11792+ mb();
11793+ for (i = 0; i < rows; ++i) {
11794+
11795+ addr = address;
11796+ end = addr + add;
11797+
11798+ do {
11799+ next = psb_pd_addr_end(addr, end);
11800+ pt = psb_mmu_pt_map_lock(pd, addr);
11801+ if (!pt)
11802+ continue;
11803+ do {
11804+ psb_clflush(&pt->v[psb_mmu_pt_index(addr)]);
11805+ } while (addr += clflush_add,
11806+ (addr & clflush_mask) < next);
11807+
11808+ psb_mmu_pt_unmap_unlock(pt);
11809+ } while (addr = next, next != end);
11810+ address += row_add;
11811+ }
11812+ mb();
11813+}
11814+#else
11815+static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
11816+ uint32_t num_pages, uint32_t desired_tile_stride,
11817+ uint32_t hw_tile_stride)
11818+{
11819+ drm_ttm_cache_flush();
11820+}
11821+#endif
11822+
11823+void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
11824+ unsigned long address, uint32_t num_pages)
11825+{
11826+ struct psb_mmu_pt *pt;
11827+ unsigned long addr;
11828+ unsigned long end;
11829+ unsigned long next;
11830+ unsigned long f_address = address;
11831+
11832+ down_read(&pd->driver->sem);
11833+
11834+ addr = address;
11835+ end = addr + (num_pages << PAGE_SHIFT);
11836+
11837+ do {
11838+ next = psb_pd_addr_end(addr, end);
11839+ pt = psb_mmu_pt_alloc_map_lock(pd, addr);
11840+ if (!pt)
11841+ goto out;
11842+ do {
11843+ psb_mmu_invalidate_pte(pt, addr);
11844+ --pt->count;
11845+ } while (addr += PAGE_SIZE, addr < next);
11846+ psb_mmu_pt_unmap_unlock(pt);
11847+
11848+ } while (addr = next, next != end);
11849+
11850+ out:
11851+ if (pd->hw_context != -1)
11852+ psb_mmu_flush_ptes(pd, f_address, num_pages, 1, 1);
11853+
11854+ up_read(&pd->driver->sem);
11855+
11856+ if (pd->hw_context != -1)
11857+ psb_mmu_flush(pd->driver);
11858+
11859+ return;
11860+}
11861+
11862+void psb_mmu_remove_pages(struct psb_mmu_pd *pd, unsigned long address,
11863+ uint32_t num_pages, uint32_t desired_tile_stride,
11864+ uint32_t hw_tile_stride)
11865+{
11866+ struct psb_mmu_pt *pt;
11867+ uint32_t rows = 1;
11868+ uint32_t i;
11869+ unsigned long addr;
11870+ unsigned long end;
11871+ unsigned long next;
11872+ unsigned long add;
11873+ unsigned long row_add;
11874+ unsigned long f_address = address;
11875+
11876+ if (hw_tile_stride)
11877+ rows = num_pages / desired_tile_stride;
11878+ else
11879+ desired_tile_stride = num_pages;
11880+
11881+ add = desired_tile_stride << PAGE_SHIFT;
11882+ row_add = hw_tile_stride << PAGE_SHIFT;
11883+
11884+ down_read(&pd->driver->sem);
11885+
11886+ /* Make sure we only need to flush this processor's cache */
11887+
11888+ for (i = 0; i < rows; ++i) {
11889+
11890+ addr = address;
11891+ end = addr + add;
11892+
11893+ do {
11894+ next = psb_pd_addr_end(addr, end);
11895+ pt = psb_mmu_pt_map_lock(pd, addr);
11896+ if (!pt)
11897+ continue;
11898+ do {
11899+ psb_mmu_invalidate_pte(pt, addr);
11900+ --pt->count;
11901+
11902+ } while (addr += PAGE_SIZE, addr < next);
11903+ psb_mmu_pt_unmap_unlock(pt);
11904+
11905+ } while (addr = next, next != end);
11906+ address += row_add;
11907+ }
11908+ if (pd->hw_context != -1)
11909+ psb_mmu_flush_ptes(pd, f_address, num_pages,
11910+ desired_tile_stride, hw_tile_stride);
11911+
11912+ up_read(&pd->driver->sem);
11913+
11914+ if (pd->hw_context != -1)
11915+ psb_mmu_flush(pd->driver);
11916+}
11917+
11918+int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd, uint32_t start_pfn,
11919+ unsigned long address, uint32_t num_pages,
11920+ int type)
11921+{
11922+ struct psb_mmu_pt *pt;
11923+ uint32_t pte;
11924+ unsigned long addr;
11925+ unsigned long end;
11926+ unsigned long next;
11927+ unsigned long f_address = address;
11928+ int ret = -ENOMEM;
11929+
11930+ down_read(&pd->driver->sem);
11931+
11932+ addr = address;
11933+ end = addr + (num_pages << PAGE_SHIFT);
11934+
11935+ do {
11936+ next = psb_pd_addr_end(addr, end);
11937+ pt = psb_mmu_pt_alloc_map_lock(pd, addr);
11938+ if (!pt) {
11939+ ret = -ENOMEM;
11940+ goto out;
11941+ }
11942+ do {
11943+ pte = psb_mmu_mask_pte(start_pfn++, type);
11944+ psb_mmu_set_pte(pt, addr, pte);
11945+ pt->count++;
11946+ } while (addr += PAGE_SIZE, addr < next);
11947+ psb_mmu_pt_unmap_unlock(pt);
11948+
11949+ } while (addr = next, next != end);
11950+ ret = 0;
11951+
11952+ out:
11953+ if (pd->hw_context != -1)
11954+ psb_mmu_flush_ptes(pd, f_address, num_pages, 1, 1);
11955+
11956+ up_read(&pd->driver->sem);
11957+
11958+ if (pd->hw_context != -1)
11959+ psb_mmu_flush(pd->driver);
11960+
11961+ return 0;
11962+}
11963+
11964+int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,
11965+ unsigned long address, uint32_t num_pages,
11966+ uint32_t desired_tile_stride, uint32_t hw_tile_stride,
11967+ int type)
11968+{
11969+ struct psb_mmu_pt *pt;
11970+ uint32_t rows = 1;
11971+ uint32_t i;
11972+ uint32_t pte;
11973+ unsigned long addr;
11974+ unsigned long end;
11975+ unsigned long next;
11976+ unsigned long add;
11977+ unsigned long row_add;
11978+ unsigned long f_address = address;
11979+ int ret = -ENOMEM;
11980+
11981+ if (hw_tile_stride) {
11982+ if (num_pages % desired_tile_stride != 0)
11983+ return -EINVAL;
11984+ rows = num_pages / desired_tile_stride;
11985+ } else {
11986+ desired_tile_stride = num_pages;
11987+ }
11988+
11989+ add = desired_tile_stride << PAGE_SHIFT;
11990+ row_add = hw_tile_stride << PAGE_SHIFT;
11991+
11992+ down_read(&pd->driver->sem);
11993+
11994+ for (i = 0; i < rows; ++i) {
11995+
11996+ addr = address;
11997+ end = addr + add;
11998+
11999+ do {
12000+ next = psb_pd_addr_end(addr, end);
12001+ pt = psb_mmu_pt_alloc_map_lock(pd, addr);
12002+ if (!pt)
12003+ goto out;
12004+ do {
12005+ pte = psb_mmu_mask_pte(page_to_pfn(*pages++),
12006+ type);
12007+ psb_mmu_set_pte(pt, addr, pte);
12008+ pt->count++;
12009+ } while (addr += PAGE_SIZE, addr < next);
12010+ psb_mmu_pt_unmap_unlock(pt);
12011+
12012+ } while (addr = next, next != end);
12013+
12014+ address += row_add;
12015+ }
12016+ ret = 0;
12017+ out:
12018+ if (pd->hw_context != -1)
12019+ psb_mmu_flush_ptes(pd, f_address, num_pages,
12020+ desired_tile_stride, hw_tile_stride);
12021+
12022+ up_read(&pd->driver->sem);
12023+
12024+ if (pd->hw_context != -1)
12025+ psb_mmu_flush(pd->driver);
12026+
12027+ return 0;
12028+}
12029+
12030+void psb_mmu_enable_requestor(struct psb_mmu_driver *driver, uint32_t mask)
12031+{
12032+ mask &= _PSB_MMU_ER_MASK;
12033+ psb_iowrite32(driver, psb_ioread32(driver, PSB_CR_BIF_CTRL) & ~mask,
12034+ PSB_CR_BIF_CTRL);
12035+ (void)psb_ioread32(driver, PSB_CR_BIF_CTRL);
12036+}
12037+
12038+void psb_mmu_disable_requestor(struct psb_mmu_driver *driver, uint32_t mask)
12039+{
12040+ mask &= _PSB_MMU_ER_MASK;
12041+ psb_iowrite32(driver, psb_ioread32(driver, PSB_CR_BIF_CTRL) | mask,
12042+ PSB_CR_BIF_CTRL);
12043+ (void)psb_ioread32(driver, PSB_CR_BIF_CTRL);
12044+}
12045+
12046+int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,
12047+ unsigned long *pfn)
12048+{
12049+ int ret;
12050+ struct psb_mmu_pt *pt;
12051+ uint32_t tmp;
12052+ spinlock_t *lock = &pd->driver->lock;
12053+
12054+ down_read(&pd->driver->sem);
12055+ pt = psb_mmu_pt_map_lock(pd, virtual);
12056+ if (!pt) {
12057+ uint32_t *v;
12058+
12059+ spin_lock(lock);
12060+ v = kmap_atomic(pd->p, KM_USER0);
12061+ tmp = v[psb_mmu_pd_index(virtual)];
12062+ kunmap_atomic(v, KM_USER0);
12063+ spin_unlock(lock);
12064+
12065+ if (tmp != pd->invalid_pde || !(tmp & PSB_PTE_VALID) ||
12066+ !(pd->invalid_pte & PSB_PTE_VALID)) {
12067+ ret = -EINVAL;
12068+ goto out;
12069+ }
12070+ ret = 0;
12071+ *pfn = pd->invalid_pte >> PAGE_SHIFT;
12072+ goto out;
12073+ }
12074+ tmp = pt->v[psb_mmu_pt_index(virtual)];
12075+ if (!(tmp & PSB_PTE_VALID)) {
12076+ ret = -EINVAL;
12077+ } else {
12078+ ret = 0;
12079+ *pfn = tmp >> PAGE_SHIFT;
12080+ }
12081+ psb_mmu_pt_unmap_unlock(pt);
12082+ out:
12083+ up_read(&pd->driver->sem);
12084+ return ret;
12085+}
12086+
12087+void psb_mmu_test(struct psb_mmu_driver *driver, uint32_t offset)
12088+{
12089+ struct page *p;
12090+ unsigned long pfn;
12091+ int ret = 0;
12092+ struct psb_mmu_pd *pd;
12093+ uint32_t *v;
12094+ uint32_t *vmmu;
12095+
12096+ pd = driver->default_pd;
12097+ if (!pd) {
12098+ printk(KERN_WARNING "Could not get default pd\n");
12099+ }
12100+
12101+ p = alloc_page(GFP_DMA32);
12102+
12103+ if (!p) {
12104+ printk(KERN_WARNING "Failed allocating page\n");
12105+ return;
12106+ }
12107+
12108+ v = kmap(p);
12109+ memset(v, 0x67, PAGE_SIZE);
12110+
12111+ pfn = (offset >> PAGE_SHIFT);
12112+
12113+ ret = psb_mmu_insert_pages(pd, &p, pfn << PAGE_SHIFT, 1, 0, 0,
12114+ PSB_MMU_CACHED_MEMORY);
12115+ if (ret) {
12116+ printk(KERN_WARNING "Failed inserting mmu page\n");
12117+ goto out_err1;
12118+ }
12119+
12120+ /* Ioremap the page through the GART aperture */
12121+
12122+ vmmu = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE);
12123+ if (!vmmu) {
12124+ printk(KERN_WARNING "Failed ioremapping page\n");
12125+ goto out_err2;
12126+ }
12127+
12128+ /* Read from the page with mmu disabled. */
12129+ printk(KERN_INFO "Page first dword is 0x%08x\n", ioread32(vmmu));
12130+
12131+ /* Enable the mmu for host accesses and read again. */
12132+ psb_mmu_enable_requestor(driver, _PSB_MMU_ER_HOST);
12133+
12134+ printk(KERN_INFO "MMU Page first dword is (0x67676767) 0x%08x\n",
12135+ ioread32(vmmu));
12136+ *v = 0x15243705;
12137+ printk(KERN_INFO "MMU Page new dword is (0x15243705) 0x%08x\n",
12138+ ioread32(vmmu));
12139+ iowrite32(0x16243355, vmmu);
12140+ (void)ioread32(vmmu);
12141+ printk(KERN_INFO "Page new dword is (0x16243355) 0x%08x\n", *v);
12142+
12143+ printk(KERN_INFO "Int stat is 0x%08x\n",
12144+ psb_ioread32(driver, PSB_CR_BIF_INT_STAT));
12145+ printk(KERN_INFO "Fault is 0x%08x\n",
12146+ psb_ioread32(driver, PSB_CR_BIF_FAULT));
12147+
12148+ /* Disable MMU for host accesses and clear page fault register */
12149+ psb_mmu_disable_requestor(driver, _PSB_MMU_ER_HOST);
12150+ iounmap(vmmu);
12151+ out_err2:
12152+ psb_mmu_remove_pages(pd, pfn << PAGE_SHIFT, 1, 0, 0);
12153+ out_err1:
12154+ kunmap(p);
12155+ __free_page(p);
12156+}
12157Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c
12158===================================================================
12159--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12160+++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c 2009-02-20 12:47:58.000000000 +0000
12161@@ -0,0 +1,671 @@
12162+/**
12163+ * file psb_msvdx.c
12164+ * MSVDX I/O operations and IRQ handling
12165+ *
12166+ */
12167+
12168+/**************************************************************************
12169+ *
12170+ * Copyright (c) 2007 Intel Corporation, Hillsboro, OR, USA
12171+ * Copyright (c) Imagination Technologies Limited, UK
12172+ * All Rights Reserved.
12173+ *
12174+ * Permission is hereby granted, free of charge, to any person obtaining a
12175+ * copy of this software and associated documentation files (the
12176+ * "Software"), to deal in the Software without restriction, including
12177+ * without limitation the rights to use, copy, modify, merge, publish,
12178+ * distribute, sub license, and/or sell copies of the Software, and to
12179+ * permit persons to whom the Software is furnished to do so, subject to
12180+ * the following conditions:
12181+ *
12182+ * The above copyright notice and this permission notice (including the
12183+ * next paragraph) shall be included in all copies or substantial portions
12184+ * of the Software.
12185+ *
12186+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12187+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12188+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
12189+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
12190+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
12191+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
12192+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
12193+ *
12194+ **************************************************************************/
12195+
12196+#include "drmP.h"
12197+#include "drm_os_linux.h"
12198+#include "psb_drv.h"
12199+#include "psb_drm.h"
12200+#include "psb_msvdx.h"
12201+
12202+#include <asm/io.h>
12203+#include <linux/delay.h>
12204+
12205+#ifndef list_first_entry
12206+#define list_first_entry(ptr, type, member) \
12207+ list_entry((ptr)->next, type, member)
12208+#endif
12209+
12210+static int psb_msvdx_send (struct drm_device *dev, void *cmd,
12211+ unsigned long cmd_size);
12212+
12213+int
12214+psb_msvdx_dequeue_send (struct drm_device *dev)
12215+{
12216+ struct drm_psb_private *dev_priv = dev->dev_private;
12217+ struct psb_msvdx_cmd_queue *msvdx_cmd = NULL;
12218+ int ret = 0;
12219+
12220+ if (list_empty (&dev_priv->msvdx_queue))
12221+ {
12222+ PSB_DEBUG_GENERAL ("MSVDXQUE: msvdx list empty.\n");
12223+ dev_priv->msvdx_busy = 0;
12224+ return -EINVAL;
12225+ }
12226+ msvdx_cmd =
12227+ list_first_entry (&dev_priv->msvdx_queue, struct psb_msvdx_cmd_queue,
12228+ head);
12229+ PSB_DEBUG_GENERAL ("MSVDXQUE: Queue has id %08x\n", msvdx_cmd->sequence);
12230+ ret = psb_msvdx_send (dev, msvdx_cmd->cmd, msvdx_cmd->cmd_size);
12231+ if (ret)
12232+ {
12233+ PSB_DEBUG_GENERAL ("MSVDXQUE: psb_msvdx_send failed\n");
12234+ ret = -EINVAL;
12235+ }
12236+ list_del (&msvdx_cmd->head);
12237+ kfree (msvdx_cmd->cmd);
12238+ drm_free (msvdx_cmd, sizeof (struct psb_msvdx_cmd_queue), DRM_MEM_DRIVER);
12239+ return ret;
12240+}
12241+
12242+int
12243+psb_msvdx_map_command (struct drm_device *dev,
12244+ struct drm_buffer_object *cmd_buffer,
12245+ unsigned long cmd_offset, unsigned long cmd_size,
12246+ void **msvdx_cmd, uint32_t sequence, int copy_cmd)
12247+{
12248+ struct drm_psb_private *dev_priv = dev->dev_private;
12249+ int ret = 0;
12250+ unsigned long cmd_page_offset = cmd_offset & ~PAGE_MASK;
12251+ unsigned long cmd_size_remaining;
12252+ struct drm_bo_kmap_obj cmd_kmap;
12253+ void *cmd, *tmp, *cmd_start;
12254+ int is_iomem;
12255+
12256+ /* command buffers may not exceed page boundary */
12257+ if (cmd_size + cmd_page_offset > PAGE_SIZE)
12258+ return -EINVAL;
12259+
12260+ ret = drm_bo_kmap (cmd_buffer, cmd_offset >> PAGE_SHIFT, 2, &cmd_kmap);
12261+
12262+ if (ret)
12263+ {
12264+ PSB_DEBUG_GENERAL ("MSVDXQUE:ret:%d\n", ret);
12265+ return ret;
12266+ }
12267+
12268+ cmd_start =
12269+ (void *) drm_bmo_virtual (&cmd_kmap, &is_iomem) + cmd_page_offset;
12270+ cmd = cmd_start;
12271+ cmd_size_remaining = cmd_size;
12272+
12273+ while (cmd_size_remaining > 0)
12274+ {
12275+ uint32_t mmu_ptd;
12276+ uint32_t cur_cmd_size = MEMIO_READ_FIELD (cmd, FWRK_GENMSG_SIZE);
12277+ uint32_t cur_cmd_id = MEMIO_READ_FIELD (cmd, FWRK_GENMSG_ID);
12278+ PSB_DEBUG_GENERAL
12279+ ("cmd start at %08x cur_cmd_size = %d cur_cmd_id = %02x fence = %08x\n",
12280+ (uint32_t) cmd, cur_cmd_size, cur_cmd_id, sequence);
12281+ if ((cur_cmd_size % sizeof (uint32_t))
12282+ || (cur_cmd_size > cmd_size_remaining))
12283+ {
12284+ ret = -EINVAL;
12285+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12286+ goto out;
12287+ }
12288+
12289+ switch (cur_cmd_id)
12290+ {
12291+ case VA_MSGID_RENDER:
12292+ /* Fence ID */
12293+ MEMIO_WRITE_FIELD (cmd, FW_VA_RENDER_FENCE_VALUE, sequence);
12294+
12295+ mmu_ptd = psb_get_default_pd_addr (dev_priv->mmu);
12296+ if (atomic_cmpxchg(&dev_priv->msvdx_mmu_invaldc, 1, 0) == 1)
12297+ {
12298+ mmu_ptd |= 1;
12299+ PSB_DEBUG_GENERAL ("MSVDX: Setting MMU invalidate flag\n");
12300+ }
12301+ /* PTD */
12302+ MEMIO_WRITE_FIELD (cmd, FW_VA_RENDER_MMUPTD, mmu_ptd);
12303+ break;
12304+
12305+ default:
12306+ /* Msg not supported */
12307+ ret = -EINVAL;
12308+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12309+ goto out;
12310+ }
12311+
12312+ cmd += cur_cmd_size;
12313+ cmd_size_remaining -= cur_cmd_size;
12314+ }
12315+
12316+ if (copy_cmd)
12317+ {
12318+ PSB_DEBUG_GENERAL
12319+ ("MSVDXQUE: psb_msvdx_map_command copying command...\n");
12320+ tmp = drm_calloc (1, cmd_size, DRM_MEM_DRIVER);
12321+ if (tmp == NULL)
12322+ {
12323+ ret = -ENOMEM;
12324+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12325+ goto out;
12326+ }
12327+ memcpy (tmp, cmd_start, cmd_size);
12328+ *msvdx_cmd = tmp;
12329+ }
12330+ else
12331+ {
12332+ PSB_DEBUG_GENERAL
12333+ ("MSVDXQUE: psb_msvdx_map_command did NOT copy command...\n");
12334+ ret = psb_msvdx_send (dev, cmd_start, cmd_size);
12335+ if (ret)
12336+ {
12337+ PSB_DEBUG_GENERAL ("MSVDXQUE: psb_msvdx_send failed\n");
12338+ ret = -EINVAL;
12339+ }
12340+ }
12341+
12342+out:
12343+ drm_bo_kunmap (&cmd_kmap);
12344+
12345+ return ret;
12346+}
12347+
12348+int
12349+psb_submit_video_cmdbuf (struct drm_device *dev,
12350+ struct drm_buffer_object *cmd_buffer,
12351+ unsigned long cmd_offset, unsigned long cmd_size,
12352+ struct drm_fence_object *fence)
12353+{
12354+ struct drm_psb_private *dev_priv = dev->dev_private;
12355+ uint32_t sequence = fence->sequence;
12356+ unsigned long irq_flags;
12357+ int ret = 0;
12358+
12359+ mutex_lock (&dev_priv->msvdx_mutex);
12360+ psb_schedule_watchdog (dev_priv);
12361+
12362+ spin_lock_irqsave (&dev_priv->msvdx_lock, irq_flags);
12363+ if (dev_priv->msvdx_needs_reset)
12364+ {
12365+ spin_unlock_irqrestore (&dev_priv->msvdx_lock, irq_flags);
12366+ PSB_DEBUG_GENERAL ("MSVDX: Needs reset\n");
12367+ if (psb_msvdx_reset (dev_priv))
12368+ {
12369+ mutex_unlock (&dev_priv->msvdx_mutex);
12370+ ret = -EBUSY;
12371+ PSB_DEBUG_GENERAL ("MSVDX: Reset failed\n");
12372+ return ret;
12373+ }
12374+ PSB_DEBUG_GENERAL ("MSVDX: Reset ok\n");
12375+ dev_priv->msvdx_needs_reset = 0;
12376+ dev_priv->msvdx_busy = 0;
12377+ dev_priv->msvdx_start_idle = 0;
12378+
12379+ psb_msvdx_init (dev);
12380+ psb_msvdx_irq_preinstall (dev_priv);
12381+ psb_msvdx_irq_postinstall (dev_priv);
12382+ PSB_DEBUG_GENERAL ("MSVDX: Init ok\n");
12383+ spin_lock_irqsave (&dev_priv->msvdx_lock, irq_flags);
12384+ }
12385+
12386+ if (!dev_priv->msvdx_busy)
12387+ {
12388+ dev_priv->msvdx_busy = 1;
12389+ spin_unlock_irqrestore (&dev_priv->msvdx_lock, irq_flags);
12390+ PSB_DEBUG_GENERAL
12391+ ("MSVDXQUE: nothing in the queue sending sequence:%08x..\n",
12392+ sequence);
12393+ ret =
12394+ psb_msvdx_map_command (dev, cmd_buffer, cmd_offset, cmd_size,
12395+ NULL, sequence, 0);
12396+ if (ret)
12397+ {
12398+ mutex_unlock (&dev_priv->msvdx_mutex);
12399+ PSB_DEBUG_GENERAL ("MSVDXQUE: Failed to extract cmd...\n");
12400+ return ret;
12401+ }
12402+ }
12403+ else
12404+ {
12405+ struct psb_msvdx_cmd_queue *msvdx_cmd;
12406+ void *cmd = NULL;
12407+
12408+ spin_unlock_irqrestore (&dev_priv->msvdx_lock, irq_flags);
12409+ /*queue the command to be sent when the h/w is ready */
12410+ PSB_DEBUG_GENERAL ("MSVDXQUE: queueing sequence:%08x..\n", sequence);
12411+ msvdx_cmd =
12412+ drm_calloc (1, sizeof (struct psb_msvdx_cmd_queue), DRM_MEM_DRIVER);
12413+ if (msvdx_cmd == NULL)
12414+ {
12415+ mutex_unlock (&dev_priv->msvdx_mutex);
12416+ PSB_DEBUG_GENERAL ("MSVDXQUE: Out of memory...\n");
12417+ return -ENOMEM;
12418+ }
12419+
12420+ ret =
12421+ psb_msvdx_map_command (dev, cmd_buffer, cmd_offset, cmd_size,
12422+ &cmd, sequence, 1);
12423+ if (ret)
12424+ {
12425+ mutex_unlock (&dev_priv->msvdx_mutex);
12426+ PSB_DEBUG_GENERAL ("MSVDXQUE: Failed to extract cmd...\n");
12427+ drm_free (msvdx_cmd, sizeof (struct psb_msvdx_cmd_queue),
12428+ DRM_MEM_DRIVER);
12429+ return ret;
12430+ }
12431+ msvdx_cmd->cmd = cmd;
12432+ msvdx_cmd->cmd_size = cmd_size;
12433+ msvdx_cmd->sequence = sequence;
12434+ spin_lock_irqsave (&dev_priv->msvdx_lock, irq_flags);
12435+ list_add_tail (&msvdx_cmd->head, &dev_priv->msvdx_queue);
12436+ if (!dev_priv->msvdx_busy)
12437+ {
12438+ dev_priv->msvdx_busy = 1;
12439+ PSB_DEBUG_GENERAL ("MSVDXQUE: Need immediate dequeue\n");
12440+ psb_msvdx_dequeue_send (dev);
12441+ }
12442+ spin_unlock_irqrestore (&dev_priv->msvdx_lock, irq_flags);
12443+ }
12444+ mutex_unlock (&dev_priv->msvdx_mutex);
12445+ return ret;
12446+}
12447+
12448+int
12449+psb_msvdx_send (struct drm_device *dev, void *cmd, unsigned long cmd_size)
12450+{
12451+ int ret = 0;
12452+ struct drm_psb_private *dev_priv = dev->dev_private;
12453+
12454+ while (cmd_size > 0)
12455+ {
12456+ uint32_t cur_cmd_size = MEMIO_READ_FIELD (cmd, FWRK_GENMSG_SIZE);
12457+ if (cur_cmd_size > cmd_size)
12458+ {
12459+ ret = -EINVAL;
12460+ PSB_DEBUG_GENERAL
12461+ ("MSVDX: cmd_size = %d cur_cmd_size = %d\n",
12462+ (int) cmd_size, cur_cmd_size);
12463+ goto out;
12464+ }
12465+ /* Send the message to h/w */
12466+ ret = psb_mtx_send (dev_priv, cmd);
12467+ if (ret)
12468+ {
12469+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12470+ goto out;
12471+ }
12472+ cmd += cur_cmd_size;
12473+ cmd_size -= cur_cmd_size;
12474+ }
12475+
12476+out:
12477+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12478+ return ret;
12479+}
12480+
12481+int
12482+psb_mtx_send (struct drm_psb_private *dev_priv, const void *pvMsg)
12483+{
12484+
12485+ static uint32_t padMessage[FWRK_PADMSG_SIZE];
12486+
12487+ const uint32_t *pui32Msg = (uint32_t *) pvMsg;
12488+ uint32_t msgNumWords, wordsFree, readIndex, writeIndex;
12489+ int ret = 0;
12490+
12491+ PSB_DEBUG_GENERAL ("MSVDX: psb_mtx_send\n");
12492+
12493+ /* we need clocks enabled before we touch VEC local ram */
12494+ PSB_WMSVDX32 (clk_enable_all, MSVDX_MAN_CLK_ENABLE);
12495+
12496+ msgNumWords = (MEMIO_READ_FIELD (pvMsg, FWRK_GENMSG_SIZE) + 3) / 4;
12497+
12498+ if (msgNumWords > NUM_WORDS_MTX_BUF)
12499+ {
12500+ ret = -EINVAL;
12501+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12502+ goto out;
12503+ }
12504+
12505+ readIndex = PSB_RMSVDX32 (MSVDX_COMMS_TO_MTX_RD_INDEX);
12506+ writeIndex = PSB_RMSVDX32 (MSVDX_COMMS_TO_MTX_WRT_INDEX);
12507+
12508+ if (writeIndex + msgNumWords > NUM_WORDS_MTX_BUF)
12509+ { /* message would wrap, need to send a pad message */
12510+ BUG_ON (MEMIO_READ_FIELD (pvMsg, FWRK_GENMSG_ID) == FWRK_MSGID_PADDING); /* Shouldn't happen for a PAD message itself */
12511+ /* if the read pointer is at zero then we must wait for it to change otherwise the write
12512+ * pointer will equal the read pointer,which should only happen when the buffer is empty
12513+ *
12514+ * This will only happens if we try to overfill the queue, queue management should make
12515+ * sure this never happens in the first place.
12516+ */
12517+ BUG_ON (0 == readIndex);
12518+ if (0 == readIndex)
12519+ {
12520+ ret = -EINVAL;
12521+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12522+ goto out;
12523+ }
12524+ /* Send a pad message */
12525+ MEMIO_WRITE_FIELD (padMessage, FWRK_GENMSG_SIZE,
12526+ (NUM_WORDS_MTX_BUF - writeIndex) << 2);
12527+ MEMIO_WRITE_FIELD (padMessage, FWRK_GENMSG_ID, FWRK_MSGID_PADDING);
12528+ psb_mtx_send (dev_priv, padMessage);
12529+ writeIndex = PSB_RMSVDX32 (MSVDX_COMMS_TO_MTX_WRT_INDEX);
12530+ }
12531+
12532+ wordsFree =
12533+ (writeIndex >=
12534+ readIndex) ? NUM_WORDS_MTX_BUF - (writeIndex -
12535+ readIndex) : readIndex - writeIndex;
12536+
12537+ BUG_ON (msgNumWords > wordsFree);
12538+ if (msgNumWords > wordsFree)
12539+ {
12540+ ret = -EINVAL;
12541+ PSB_DEBUG_GENERAL ("MSVDX: ret:%d\n", ret);
12542+ goto out;
12543+ }
12544+
12545+ while (msgNumWords > 0)
12546+ {
12547+ PSB_WMSVDX32 (*pui32Msg++, MSVDX_COMMS_TO_MTX_BUF + (writeIndex << 2));
12548+ msgNumWords--;
12549+ writeIndex++;
12550+ if (NUM_WORDS_MTX_BUF == writeIndex)
12551+ {
12552+ writeIndex = 0;
12553+ }
12554+ }
12555+ PSB_WMSVDX32 (writeIndex, MSVDX_COMMS_TO_MTX_WRT_INDEX);
12556+
12557+ /* Make sure clocks are enabled before we kick */
12558+ PSB_WMSVDX32 (clk_enable_all, MSVDX_MAN_CLK_ENABLE);
12559+
12560+ /* signal an interrupt to let the mtx know there is a new message */
12561+ PSB_WMSVDX32 (1, MSVDX_MTX_KICKI);
12562+
12563+out:
12564+ return ret;
12565+}
12566+
12567+/*
12568+ * MSVDX MTX interrupt
12569+ */
12570+void
12571+psb_msvdx_mtx_interrupt (struct drm_device *dev)
12572+{
12573+ static uint32_t msgBuffer[128];
12574+ uint32_t readIndex, writeIndex;
12575+ uint32_t msgNumWords, msgWordOffset;
12576+ struct drm_psb_private *dev_priv =
12577+ (struct drm_psb_private *) dev->dev_private;
12578+
12579+ /* Are clocks enabled - If not enable before attempting to read from VLR */
12580+ if (PSB_RMSVDX32 (MSVDX_MAN_CLK_ENABLE) != (clk_enable_all))
12581+ {
12582+ PSB_DEBUG_GENERAL
12583+ ("MSVDX: Warning - Clocks disabled when Interupt set\n");
12584+ PSB_WMSVDX32 (clk_enable_all, MSVDX_MAN_CLK_ENABLE);
12585+ }
12586+
12587+ for (;;)
12588+ {
12589+ readIndex = PSB_RMSVDX32 (MSVDX_COMMS_TO_HOST_RD_INDEX);
12590+ writeIndex = PSB_RMSVDX32 (MSVDX_COMMS_TO_HOST_WRT_INDEX);
12591+
12592+ if (readIndex != writeIndex)
12593+ {
12594+ msgWordOffset = 0;
12595+
12596+ msgBuffer[msgWordOffset] =
12597+ PSB_RMSVDX32 (MSVDX_COMMS_TO_HOST_BUF + (readIndex << 2));
12598+
12599+ msgNumWords = (MEMIO_READ_FIELD (msgBuffer, FWRK_GENMSG_SIZE) + 3) / 4; /* round to nearest word */
12600+
12601+ /*ASSERT(msgNumWords <= sizeof(msgBuffer) / sizeof(uint32_t)); */
12602+
12603+ if (++readIndex >= NUM_WORDS_HOST_BUF)
12604+ readIndex = 0;
12605+
12606+ for (msgWordOffset++; msgWordOffset < msgNumWords; msgWordOffset++)
12607+ {
12608+ msgBuffer[msgWordOffset] =
12609+ PSB_RMSVDX32 (MSVDX_COMMS_TO_HOST_BUF + (readIndex << 2));
12610+
12611+ if (++readIndex >= NUM_WORDS_HOST_BUF)
12612+ {
12613+ readIndex = 0;
12614+ }
12615+ }
12616+
12617+ /* Update the Read index */
12618+ PSB_WMSVDX32 (readIndex, MSVDX_COMMS_TO_HOST_RD_INDEX);
12619+
12620+ if (!dev_priv->msvdx_needs_reset)
12621+ switch (MEMIO_READ_FIELD (msgBuffer, FWRK_GENMSG_ID))
12622+ {
12623+ case VA_MSGID_CMD_HW_PANIC:
12624+ case VA_MSGID_CMD_FAILED:
12625+ {
12626+ uint32_t ui32Fence = MEMIO_READ_FIELD (msgBuffer,
12627+ FW_VA_CMD_FAILED_FENCE_VALUE);
12628+ uint32_t ui32FaultStatus = MEMIO_READ_FIELD (msgBuffer,
12629+ FW_VA_CMD_FAILED_IRQSTATUS);
12630+
12631+ if(MEMIO_READ_FIELD (msgBuffer, FWRK_GENMSG_ID) == VA_MSGID_CMD_HW_PANIC )
12632+ PSB_DEBUG_GENERAL
12633+ ("MSVDX: VA_MSGID_CMD_HW_PANIC: Msvdx fault detected - Fence: %08x, Status: %08x - resetting and ignoring error\n",
12634+ ui32Fence, ui32FaultStatus);
12635+ else
12636+ PSB_DEBUG_GENERAL
12637+ ("MSVDX: VA_MSGID_CMD_FAILED: Msvdx fault detected - Fence: %08x, Status: %08x - resetting and ignoring error\n",
12638+ ui32Fence, ui32FaultStatus);
12639+
12640+ dev_priv->msvdx_needs_reset = 1;
12641+
12642+ if(MEMIO_READ_FIELD (msgBuffer, FWRK_GENMSG_ID) == VA_MSGID_CMD_HW_PANIC)
12643+ {
12644+ if (dev_priv->
12645+ msvdx_current_sequence
12646+ - dev_priv->sequence[PSB_ENGINE_VIDEO] > 0x0FFFFFFF)
12647+ dev_priv->msvdx_current_sequence++;
12648+ PSB_DEBUG_GENERAL
12649+ ("MSVDX: Fence ID missing, assuming %08x\n",
12650+ dev_priv->msvdx_current_sequence);
12651+ }
12652+ else
12653+ dev_priv->msvdx_current_sequence = ui32Fence;
12654+
12655+ psb_fence_error (dev,
12656+ PSB_ENGINE_VIDEO,
12657+ dev_priv->
12658+ msvdx_current_sequence,
12659+ DRM_FENCE_TYPE_EXE, DRM_CMD_FAILED);
12660+
12661+ /* Flush the command queue */
12662+ psb_msvdx_flush_cmd_queue (dev);
12663+
12664+ goto isrExit;
12665+ break;
12666+ }
12667+ case VA_MSGID_CMD_COMPLETED:
12668+ {
12669+ uint32_t ui32Fence = MEMIO_READ_FIELD (msgBuffer,
12670+ FW_VA_CMD_COMPLETED_FENCE_VALUE);
12671+ uint32_t ui32Flags =
12672+ MEMIO_READ_FIELD (msgBuffer, FW_VA_CMD_COMPLETED_FLAGS);
12673+
12674+ PSB_DEBUG_GENERAL
12675+ ("msvdx VA_MSGID_CMD_COMPLETED: FenceID: %08x, flags: 0x%x\n",
12676+ ui32Fence, ui32Flags);
12677+ dev_priv->msvdx_current_sequence = ui32Fence;
12678+
12679+ psb_fence_handler (dev, PSB_ENGINE_VIDEO);
12680+
12681+
12682+ if (ui32Flags & FW_VA_RENDER_HOST_INT)
12683+ {
12684+ /*Now send the next command from the msvdx cmd queue */
12685+ psb_msvdx_dequeue_send (dev);
12686+ goto isrExit;
12687+ }
12688+ break;
12689+ }
12690+ case VA_MSGID_ACK:
12691+ PSB_DEBUG_GENERAL ("msvdx VA_MSGID_ACK\n");
12692+ break;
12693+
12694+ case VA_MSGID_TEST1:
12695+ PSB_DEBUG_GENERAL ("msvdx VA_MSGID_TEST1\n");
12696+ break;
12697+
12698+ case VA_MSGID_TEST2:
12699+ PSB_DEBUG_GENERAL ("msvdx VA_MSGID_TEST2\n");
12700+ break;
12701+ /* Don't need to do anything with these messages */
12702+
12703+ case VA_MSGID_DEBLOCK_REQUIRED:
12704+ {
12705+ uint32_t ui32ContextId = MEMIO_READ_FIELD (msgBuffer,
12706+ FW_VA_DEBLOCK_REQUIRED_CONTEXT);
12707+
12708+ /* The BE we now be locked. */
12709+
12710+ /* Unblock rendec by reading the mtx2mtx end of slice */
12711+ (void) PSB_RMSVDX32 (MSVDX_RENDEC_READ_DATA);
12712+
12713+ PSB_DEBUG_GENERAL
12714+ ("msvdx VA_MSGID_DEBLOCK_REQUIRED Context=%08x\n",
12715+ ui32ContextId);
12716+ goto isrExit;
12717+ break;
12718+ }
12719+
12720+ default:
12721+ {
12722+ PSB_DEBUG_GENERAL
12723+ ("ERROR: msvdx Unknown message from MTX \n");
12724+ }
12725+ break;
12726+
12727+ }
12728+ }
12729+ else
12730+ {
12731+ /* Get out of here if nothing */
12732+ break;
12733+ }
12734+ }
12735+isrExit:
12736+
12737+#if 1
12738+ if (!dev_priv->msvdx_busy)
12739+ {
12740+ /* check that clocks are enabled before reading VLR */
12741+ if( PSB_RMSVDX32( MSVDX_MAN_CLK_ENABLE ) != (clk_enable_all) )
12742+ PSB_WMSVDX32 (clk_enable_all, MSVDX_MAN_CLK_ENABLE);
12743+
12744+ /* If the firmware says the hardware is idle and the CCB is empty then we can power down */
12745+ {
12746+ uint32_t ui32FWStatus = PSB_RMSVDX32( MSVDX_COMMS_FW_STATUS );
12747+ uint32_t ui32CCBRoff = PSB_RMSVDX32 ( MSVDX_COMMS_TO_MTX_RD_INDEX );
12748+ uint32_t ui32CCBWoff = PSB_RMSVDX32 ( MSVDX_COMMS_TO_MTX_WRT_INDEX );
12749+
12750+ if( (ui32FWStatus & MSVDX_FW_STATUS_HW_IDLE) && (ui32CCBRoff == ui32CCBWoff))
12751+ {
12752+ PSB_DEBUG_GENERAL("MSVDX_CLOCK: Setting clock to minimal...\n");
12753+ PSB_WMSVDX32 (clk_enable_minimal, MSVDX_MAN_CLK_ENABLE);
12754+ }
12755+ }
12756+ }
12757+#endif
12758+ DRM_MEMORYBARRIER ();
12759+}
12760+
12761+void
12762+psb_msvdx_lockup (struct drm_psb_private *dev_priv,
12763+ int *msvdx_lockup, int *msvdx_idle)
12764+{
12765+ unsigned long irq_flags;
12766+// struct psb_scheduler *scheduler = &dev_priv->scheduler;
12767+
12768+ spin_lock_irqsave (&dev_priv->msvdx_lock, irq_flags);
12769+ *msvdx_lockup = 0;
12770+ *msvdx_idle = 1;
12771+
12772+ if (!dev_priv->has_msvdx)
12773+ {
12774+ spin_unlock_irqrestore (&dev_priv->msvdx_lock, irq_flags);
12775+ return;
12776+ }
12777+#if 0
12778+ PSB_DEBUG_GENERAL ("MSVDXTimer: current_sequence:%d "
12779+ "last_sequence:%d and last_submitted_sequence :%d\n",
12780+ dev_priv->msvdx_current_sequence,
12781+ dev_priv->msvdx_last_sequence,
12782+ dev_priv->sequence[PSB_ENGINE_VIDEO]);
12783+#endif
12784+ if (dev_priv->msvdx_current_sequence -
12785+ dev_priv->sequence[PSB_ENGINE_VIDEO] > 0x0FFFFFFF)
12786+ {
12787+
12788+ if (dev_priv->msvdx_current_sequence == dev_priv->msvdx_last_sequence)
12789+ {
12790+ PSB_DEBUG_GENERAL
12791+ ("MSVDXTimer: msvdx locked-up for sequence:%d\n",
12792+ dev_priv->msvdx_current_sequence);
12793+ *msvdx_lockup = 1;
12794+ }
12795+ else
12796+ {
12797+ PSB_DEBUG_GENERAL ("MSVDXTimer: msvdx responded fine so far...\n");
12798+ dev_priv->msvdx_last_sequence = dev_priv->msvdx_current_sequence;
12799+ *msvdx_idle = 0;
12800+ }
12801+ if (dev_priv->msvdx_start_idle)
12802+ dev_priv->msvdx_start_idle = 0;
12803+ }
12804+ else
12805+ {
12806+ if (dev_priv->msvdx_needs_reset == 0)
12807+ {
12808+ if (dev_priv->msvdx_start_idle && (dev_priv->msvdx_finished_sequence == dev_priv->msvdx_current_sequence))
12809+ {
12810+ //if (dev_priv->msvdx_idle_start_jiffies + MSVDX_MAX_IDELTIME >= jiffies)
12811+ if (time_after_eq(jiffies, dev_priv->msvdx_idle_start_jiffies + MSVDX_MAX_IDELTIME))
12812+ {
12813+ printk("set the msvdx clock to 0 in the %s\n", __FUNCTION__);
12814+ PSB_WMSVDX32 (0, MSVDX_MAN_CLK_ENABLE);
12815+ dev_priv->msvdx_needs_reset = 1;
12816+ }
12817+ else
12818+ {
12819+ *msvdx_idle = 0;
12820+ }
12821+ }
12822+ else
12823+ {
12824+ dev_priv->msvdx_start_idle = 1;
12825+ dev_priv->msvdx_idle_start_jiffies = jiffies;
12826+ dev_priv->msvdx_finished_sequence = dev_priv->msvdx_current_sequence;
12827+ *msvdx_idle = 0;
12828+ }
12829+ }
12830+ }
12831+ spin_unlock_irqrestore (&dev_priv->msvdx_lock, irq_flags);
12832+}
12833Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.h
12834===================================================================
12835--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12836+++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.h 2009-02-20 12:23:06.000000000 +0000
12837@@ -0,0 +1,564 @@
12838+/**************************************************************************
12839+ *
12840+ * Copyright (c) 2007 Intel Corporation, Hillsboro, OR, USA
12841+ * Copyright (c) Imagination Technologies Limited, UK
12842+ * All Rights Reserved.
12843+ *
12844+ * Permission is hereby granted, free of charge, to any person obtaining a
12845+ * copy of this software and associated documentation files (the
12846+ * "Software"), to deal in the Software without restriction, including
12847+ * without limitation the rights to use, copy, modify, merge, publish,
12848+ * distribute, sub license, and/or sell copies of the Software, and to
12849+ * permit persons to whom the Software is furnished to do so, subject to
12850+ * the following conditions:
12851+ *
12852+ * The above copyright notice and this permission notice (including the
12853+ * next paragraph) shall be included in all copies or substantial portions
12854+ * of the Software.
12855+ *
12856+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12857+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12858+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
12859+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
12860+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
12861+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
12862+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
12863+ *
12864+ **************************************************************************/
12865+
12866+#ifndef _PSB_MSVDX_H_
12867+#define _PSB_MSVDX_H_
12868+
12869+#define assert(expr) \
12870+ if(unlikely(!(expr))) { \
12871+ printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
12872+ #expr,__FILE__,__FUNCTION__,__LINE__); \
12873+ }
12874+
12875+#define PSB_ASSERT(x) assert (x)
12876+#define IMG_ASSERT(x) assert (x)
12877+
12878+#include "psb_drv.h"
12879+int
12880+psb_wait_for_register (struct drm_psb_private *dev_priv,
12881+ uint32_t ui32Offset,
12882+ uint32_t ui32Value, uint32_t ui32Enable);
12883+
12884+void psb_msvdx_mtx_interrupt (struct drm_device *dev);
12885+int psb_msvdx_init (struct drm_device *dev);
12886+int psb_msvdx_uninit (struct drm_device *dev);
12887+int psb_msvdx_reset (struct drm_psb_private *dev_priv);
12888+uint32_t psb_get_default_pd_addr (struct psb_mmu_driver *driver);
12889+int psb_mtx_send (struct drm_psb_private *dev_priv, const void *pvMsg);
12890+void psb_msvdx_irq_preinstall (struct drm_psb_private *dev_priv);
12891+void psb_msvdx_irq_postinstall (struct drm_psb_private *dev_priv);
12892+void psb_msvdx_flush_cmd_queue (struct drm_device *dev);
12893+extern void psb_msvdx_lockup (struct drm_psb_private *dev_priv,
12894+ int *msvdx_lockup, int *msvdx_idle);
12895+#define MSVDX_DEVICE_NODE_FLAGS_MMU_NONOPT_INV 2 /* Non-Optimal Invalidation is not default */
12896+#define FW_VA_RENDER_HOST_INT 0x00004000
12897+#define MSVDX_DEVICE_NODE_FLAGS_MMU_HW_INVALIDATION 0x00000020
12898+
12899+#define MSVDX_DEVICE_NODE_FLAG_BRN23154_BLOCK_ON_FE 0x00000200
12900+
12901+#define MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D0 (MSVDX_DEVICE_NODE_FLAGS_MMU_NONOPT_INV | MSVDX_DEVICE_NODE_FLAGS_MMU_HW_INVALIDATION \
12902+ | MSVDX_DEVICE_NODE_FLAG_BRN23154_BLOCK_ON_FE)
12903+#define MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D1 (MSVDX_DEVICE_NODE_FLAGS_MMU_HW_INVALIDATION \
12904+ | MSVDX_DEVICE_NODE_FLAG_BRN23154_BLOCK_ON_FE)
12905+
12906+
12907+#define POULSBO_D0 0x5
12908+#define POULSBO_D1 0x6
12909+#define PSB_REVID_OFFSET 0x8
12910+
12911+#define MSVDX_FW_STATUS_HW_IDLE 0x00000001 /* There is no work currently underway on the hardware*/
12912+
12913+#define clk_enable_all MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_CORE_MAN_CLK_ENABLE_MASK | \
12914+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_PROCESS_MAN_CLK_ENABLE_MASK | \
12915+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_ACCESS_MAN_CLK_ENABLE_MASK | \
12916+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDMC_MAN_CLK_ENABLE_MASK | \
12917+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ENTDEC_MAN_CLK_ENABLE_MASK | \
12918+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ITRANS_MAN_CLK_ENABLE_MASK | \
12919+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_MTX_MAN_CLK_ENABLE_MASK
12920+
12921+#define clk_enable_minimal MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_CORE_MAN_CLK_ENABLE_MASK | \
12922+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_MTX_MAN_CLK_ENABLE_MASK
12923+
12924+#define clk_enable_auto MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_PROCESS_AUTO_CLK_ENABLE_MASK | \
12925+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_ACCESS_AUTO_CLK_ENABLE_MASK | \
12926+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDMC_AUTO_CLK_ENABLE_MASK | \
12927+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ENTDEC_AUTO_CLK_ENABLE_MASK | \
12928+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ITRANS_AUTO_CLK_ENABLE_MASK | \
12929+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_CORE_MAN_CLK_ENABLE_MASK | \
12930+ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_MTX_MAN_CLK_ENABLE_MASK
12931+
12932+#define msvdx_sw_reset_all MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_SOFT_RESET_MASK | \
12933+ MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_FE_SOFT_RESET_MASK | \
12934+ MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_BE_SOFT_RESET_MASK | \
12935+ MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_VEC_MEMIF_SOFT_RESET_MASK | \
12936+ MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_VEC_RENDEC_DEC_SOFT_RESET_MASK
12937+
12938+
12939+#define PCI_PORT5_REG80_FFUSE 0xD0058000
12940+#define MTX_CODE_BASE (0x80900000)
12941+#define MTX_DATA_BASE (0x82880000)
12942+#define PC_START_ADDRESS (0x80900000)
12943+
12944+#define MTX_CORE_CODE_MEM (0x10 )
12945+#define MTX_CORE_DATA_MEM (0x18 )
12946+
12947+#define MTX_INTERNAL_REG( R_SPECIFIER , U_SPECIFIER ) ( ((R_SPECIFIER)<<4) | (U_SPECIFIER) )
12948+#define MTX_PC MTX_INTERNAL_REG( 0 , 5 )
12949+
12950+#define RENDEC_A_SIZE ( 2 * 1024* 1024 )
12951+#define RENDEC_B_SIZE ( RENDEC_A_SIZE / 4 )
12952+
12953+#define MEMIO_READ_FIELD(vpMem, field) \
12954+ ((uint32_t)(((*((field##_TYPE *)(((uint32_t)vpMem) + field##_OFFSET))) & field##_MASK) >> field##_SHIFT))
12955+
12956+#define MEMIO_WRITE_FIELD(vpMem, field, ui32Value) \
12957+ (*((field##_TYPE *)(((uint32_t)vpMem) + field##_OFFSET))) = \
12958+ ((*((field##_TYPE *)(((uint32_t)vpMem) + field##_OFFSET))) & (field##_TYPE)~field##_MASK) | \
12959+ (field##_TYPE)(( (uint32_t) (ui32Value) << field##_SHIFT) & field##_MASK);
12960+
12961+#define MEMIO_WRITE_FIELD_LITE(vpMem, field, ui32Value) \
12962+ (*((field##_TYPE *)(((uint32_t)vpMem) + field##_OFFSET))) = \
12963+ ((*((field##_TYPE *)(((uint32_t)vpMem) + field##_OFFSET))) | \
12964+ (field##_TYPE) (( (uint32_t) (ui32Value) << field##_SHIFT)) );
12965+
12966+#define REGIO_READ_FIELD(ui32RegValue, reg, field) \
12967+ ((ui32RegValue & reg##_##field##_MASK) >> reg##_##field##_SHIFT)
12968+
12969+#define REGIO_WRITE_FIELD(ui32RegValue, reg, field, ui32Value) \
12970+ (ui32RegValue) = \
12971+ ((ui32RegValue) & ~(reg##_##field##_MASK)) | \
12972+ (((ui32Value) << (reg##_##field##_SHIFT)) & (reg##_##field##_MASK));
12973+
12974+#define REGIO_WRITE_FIELD_LITE(ui32RegValue, reg, field, ui32Value) \
12975+ (ui32RegValue) = \
12976+ ( (ui32RegValue) | ( (ui32Value) << (reg##_##field##_SHIFT) ) );
12977+
12978+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_CORE_MAN_CLK_ENABLE_MASK (0x00000001)
12979+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_PROCESS_MAN_CLK_ENABLE_MASK (0x00000002)
12980+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_ACCESS_MAN_CLK_ENABLE_MASK (0x00000004)
12981+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDMC_MAN_CLK_ENABLE_MASK (0x00000008)
12982+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ENTDEC_MAN_CLK_ENABLE_MASK (0x00000010)
12983+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ITRANS_MAN_CLK_ENABLE_MASK (0x00000020)
12984+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_MTX_MAN_CLK_ENABLE_MASK (0x00000040)
12985+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDEB_ACCESS_AUTO_CLK_ENABLE_MASK (0x00040000)
12986+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VDMC_AUTO_CLK_ENABLE_MASK (0x00080000)
12987+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ENTDEC_AUTO_CLK_ENABLE_MASK (0x00100000)
12988+#define MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_VEC_ITRANS_AUTO_CLK_ENABLE_MASK (0x00200000)
12989+#define MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_SOFT_RESET_MASK (0x00000100)
12990+#define MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_FE_SOFT_RESET_MASK (0x00010000)
12991+#define MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_BE_SOFT_RESET_MASK (0x00100000)
12992+#define MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_VEC_MEMIF_SOFT_RESET_MASK (0x01000000)
12993+#define MSVDX_CORE_CR_MSVDX_CONTROL_CR_MSVDX_VEC_RENDEC_DEC_SOFT_RESET_MASK (0x10000000)
12994+
12995+/* MTX registers */
12996+#define MSVDX_MTX_ENABLE (0x0000)
12997+#define MSVDX_MTX_KICKI (0x0088)
12998+#define MSVDX_MTX_REGISTER_READ_WRITE_REQUEST (0x00FC)
12999+#define MSVDX_MTX_REGISTER_READ_WRITE_DATA (0x00F8)
13000+#define MSVDX_MTX_RAM_ACCESS_DATA_TRANSFER (0x0104)
13001+#define MSVDX_MTX_RAM_ACCESS_CONTROL (0x0108)
13002+#define MSVDX_MTX_RAM_ACCESS_STATUS (0x010C)
13003+#define MSVDX_MTX_SOFT_RESET (0x0200)
13004+
13005+/* MSVDX registers */
13006+#define MSVDX_CONTROL (0x0600)
13007+#define MSVDX_INTERRUPT_CLEAR (0x060C)
13008+#define MSVDX_INTERRUPT_STATUS (0x0608)
13009+#define MSVDX_HOST_INTERRUPT_ENABLE (0x0610)
13010+#define MSVDX_MMU_CONTROL0 (0x0680)
13011+#define MSVDX_MTX_RAM_BANK (0x06F0)
13012+#define MSVDX_MAN_CLK_ENABLE (0x0620)
13013+
13014+/* RENDEC registers */
13015+#define MSVDX_RENDEC_CONTROL0 (0x0868)
13016+#define MSVDX_RENDEC_CONTROL1 (0x086C)
13017+#define MSVDX_RENDEC_BUFFER_SIZE (0x0870)
13018+#define MSVDX_RENDEC_BASE_ADDR0 (0x0874)
13019+#define MSVDX_RENDEC_BASE_ADDR1 (0x0878)
13020+#define MSVDX_RENDEC_READ_DATA (0x0898)
13021+#define MSVDX_RENDEC_CONTEXT0 (0x0950)
13022+#define MSVDX_RENDEC_CONTEXT1 (0x0954)
13023+#define MSVDX_RENDEC_CONTEXT2 (0x0958)
13024+#define MSVDX_RENDEC_CONTEXT3 (0x095C)
13025+#define MSVDX_RENDEC_CONTEXT4 (0x0960)
13026+#define MSVDX_RENDEC_CONTEXT5 (0x0964)
13027+
13028+/*
13029+ * This defines the MSVDX communication buffer
13030+ */
13031+#define MSVDX_COMMS_SIGNATURE_VALUE (0xA5A5A5A5) /*!< Signature value */
13032+#define NUM_WORDS_HOST_BUF (100) /*!< Host buffer size (in 32-bit words) */
13033+#define NUM_WORDS_MTX_BUF (100) /*!< MTX buffer size (in 32-bit words) */
13034+
13035+#define MSVDX_COMMS_AREA_ADDR (0x02cc0)
13036+
13037+#define MSVDX_COMMS_FW_STATUS (MSVDX_COMMS_AREA_ADDR - 0x10)
13038+#define MSVDX_COMMS_SCRATCH (MSVDX_COMMS_AREA_ADDR - 0x08)
13039+#define MSVDX_COMMS_MSG_COUNTER (MSVDX_COMMS_AREA_ADDR - 0x04)
13040+#define MSVDX_COMMS_SIGNATURE (MSVDX_COMMS_AREA_ADDR + 0x00)
13041+#define MSVDX_COMMS_TO_HOST_BUF_SIZE (MSVDX_COMMS_AREA_ADDR + 0x04)
13042+#define MSVDX_COMMS_TO_HOST_RD_INDEX (MSVDX_COMMS_AREA_ADDR + 0x08)
13043+#define MSVDX_COMMS_TO_HOST_WRT_INDEX (MSVDX_COMMS_AREA_ADDR + 0x0C)
13044+#define MSVDX_COMMS_TO_MTX_BUF_SIZE (MSVDX_COMMS_AREA_ADDR + 0x10)
13045+#define MSVDX_COMMS_TO_MTX_RD_INDEX (MSVDX_COMMS_AREA_ADDR + 0x14)
13046+#define MSVDX_COMMS_OFFSET_FLAGS (MSVDX_COMMS_AREA_ADDR + 0x18)
13047+#define MSVDX_COMMS_TO_MTX_WRT_INDEX (MSVDX_COMMS_AREA_ADDR + 0x1C)
13048+#define MSVDX_COMMS_TO_HOST_BUF (MSVDX_COMMS_AREA_ADDR + 0x20)
13049+#define MSVDX_COMMS_TO_MTX_BUF (MSVDX_COMMS_TO_HOST_BUF + (NUM_WORDS_HOST_BUF << 2))
13050+
13051+#define MSVDX_COMMS_AREA_END (MSVDX_COMMS_TO_MTX_BUF + (NUM_WORDS_HOST_BUF << 2))
13052+
13053+#if (MSVDX_COMMS_AREA_END != 0x03000)
13054+#error
13055+#endif
13056+
13057+#define MSVDX_MTX_REGISTER_READ_WRITE_REQUEST_MTX_DREADY_MASK (0x80000000)
13058+#define MSVDX_MTX_REGISTER_READ_WRITE_REQUEST_MTX_DREADY_SHIFT (31)
13059+
13060+#define MSVDX_MTX_REGISTER_READ_WRITE_REQUEST_MTX_RNW_MASK (0x00010000)
13061+#define MSVDX_MTX_REGISTER_READ_WRITE_REQUEST_MTX_RNW_SHIFT (16)
13062+
13063+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCMID_MASK (0x0FF00000)
13064+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCMID_SHIFT (20)
13065+
13066+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCM_ADDR_MASK (0x000FFFFC)
13067+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCM_ADDR_SHIFT (2)
13068+
13069+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCMAI_MASK (0x00000002)
13070+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCMAI_SHIFT (1)
13071+
13072+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCMR_MASK (0x00000001)
13073+#define MSVDX_MTX_RAM_ACCESS_CONTROL_MTX_MCMR_SHIFT (0)
13074+
13075+#define MSVDX_MTX_SOFT_RESET_MTX_RESET_MASK (0x00000001)
13076+#define MSVDX_MTX_SOFT_RESET_MTX_RESET_SHIFT (0)
13077+
13078+#define MSVDX_MTX_ENABLE_MTX_ENABLE_MASK (0x00000001)
13079+#define MSVDX_MTX_ENABLE_MTX_ENABLE_SHIFT (0)
13080+
13081+#define MSVDX_CONTROL_CR_MSVDX_SOFT_RESET_MASK (0x00000100)
13082+#define MSVDX_CONTROL_CR_MSVDX_SOFT_RESET_SHIFT (8)
13083+
13084+#define MSVDX_INTERRUPT_STATUS_CR_MMU_FAULT_IRQ_MASK (0x00000F00)
13085+#define MSVDX_INTERRUPT_STATUS_CR_MMU_FAULT_IRQ_SHIFT (8)
13086+
13087+#define MSVDX_INTERRUPT_STATUS_CR_MTX_IRQ_MASK (0x00004000)
13088+#define MSVDX_INTERRUPT_STATUS_CR_MTX_IRQ_SHIFT (14)
13089+
13090+#define MSVDX_MMU_CONTROL0_CR_MMU_PAUSE_MASK (0x00000002)
13091+#define MSVDX_MMU_CONTROL0_CR_MMU_PAUSE_SHIFT (1)
13092+
13093+#define MSVDX_MTX_RAM_BANK_CR_MTX_RAM_BANK_SIZE_MASK (0x000F0000)
13094+#define MSVDX_MTX_RAM_BANK_CR_MTX_RAM_BANK_SIZE_SHIFT (16)
13095+
13096+#define MSVDX_RENDEC_BUFFER_SIZE_RENDEC_BUFFER_SIZE0_MASK (0x0000FFFF)
13097+#define MSVDX_RENDEC_BUFFER_SIZE_RENDEC_BUFFER_SIZE0_SHIFT (0)
13098+
13099+#define MSVDX_RENDEC_BUFFER_SIZE_RENDEC_BUFFER_SIZE1_MASK (0xFFFF0000)
13100+#define MSVDX_RENDEC_BUFFER_SIZE_RENDEC_BUFFER_SIZE1_SHIFT (16)
13101+
13102+#define MSVDX_RENDEC_CONTROL1_RENDEC_DECODE_START_SIZE_MASK (0x000000FF)
13103+#define MSVDX_RENDEC_CONTROL1_RENDEC_DECODE_START_SIZE_SHIFT (0)
13104+
13105+#define MSVDX_RENDEC_CONTROL1_RENDEC_BURST_SIZE_W_MASK (0x000C0000)
13106+#define MSVDX_RENDEC_CONTROL1_RENDEC_BURST_SIZE_W_SHIFT (18)
13107+
13108+#define MSVDX_RENDEC_CONTROL1_RENDEC_BURST_SIZE_R_MASK (0x00030000)
13109+#define MSVDX_RENDEC_CONTROL1_RENDEC_BURST_SIZE_R_SHIFT (16)
13110+
13111+#define MSVDX_RENDEC_CONTROL1_RENDEC_EXTERNAL_MEMORY_MASK (0x01000000)
13112+#define MSVDX_RENDEC_CONTROL1_RENDEC_EXTERNAL_MEMORY_SHIFT (24)
13113+
13114+#define MSVDX_RENDEC_CONTROL0_RENDEC_INITIALISE_MASK (0x00000001)
13115+#define MSVDX_RENDEC_CONTROL0_RENDEC_INITIALISE_SHIFT (0)
13116+
13117+#define FWRK_MSGID_START_PSR_HOSTMTX_MSG (0x80) /*!< Start of parser specific Host->MTX messages. */
13118+#define FWRK_MSGID_START_PSR_MTXHOST_MSG (0xC0) /*!< Start of parser specific MTX->Host messages. */
13119+#define FWRK_MSGID_PADDING ( 0 )
13120+
13121+#define FWRK_GENMSG_SIZE_TYPE uint8_t
13122+#define FWRK_GENMSG_SIZE_MASK (0xFF)
13123+#define FWRK_GENMSG_SIZE_SHIFT (0)
13124+#define FWRK_GENMSG_SIZE_OFFSET (0x0000)
13125+#define FWRK_GENMSG_ID_TYPE uint8_t
13126+#define FWRK_GENMSG_ID_MASK (0xFF)
13127+#define FWRK_GENMSG_ID_SHIFT (0)
13128+#define FWRK_GENMSG_ID_OFFSET (0x0001)
13129+#define FWRK_PADMSG_SIZE (2)
13130+
13131+/*!
13132+******************************************************************************
13133+ This type defines the framework specified message ids
13134+******************************************************************************/
13135+enum
13136+{
13137+ /*! Sent by the DXVA driver on the host to the mtx firmware.
13138+ */
13139+ VA_MSGID_INIT = FWRK_MSGID_START_PSR_HOSTMTX_MSG,
13140+ VA_MSGID_RENDER,
13141+ VA_MSGID_DEBLOCK,
13142+ VA_MSGID_OOLD,
13143+
13144+ /* Test Messages */
13145+ VA_MSGID_TEST1,
13146+ VA_MSGID_TEST2,
13147+
13148+ /*! Sent by the mtx firmware to itself.
13149+ */
13150+ VA_MSGID_RENDER_MC_INTERRUPT,
13151+
13152+ /*! Sent by the DXVA firmware on the MTX to the host.
13153+ */
13154+ VA_MSGID_CMD_COMPLETED = FWRK_MSGID_START_PSR_MTXHOST_MSG,
13155+ VA_MSGID_CMD_COMPLETED_BATCH,
13156+ VA_MSGID_DEBLOCK_REQUIRED,
13157+ VA_MSGID_TEST_RESPONCE,
13158+ VA_MSGID_ACK,
13159+
13160+ VA_MSGID_CMD_FAILED,
13161+ VA_MSGID_CMD_UNSUPPORTED,
13162+ VA_MSGID_CMD_HW_PANIC,
13163+};
13164+
13165+/* MSVDX Firmware interface */
13166+
13167+#define FW_VA_RENDER_SIZE (32)
13168+
13169+// FW_VA_RENDER MSG_SIZE
13170+#define FW_VA_RENDER_MSG_SIZE_ALIGNMENT (1)
13171+#define FW_VA_RENDER_MSG_SIZE_TYPE uint8_t
13172+#define FW_VA_RENDER_MSG_SIZE_MASK (0xFF)
13173+#define FW_VA_RENDER_MSG_SIZE_LSBMASK (0xFF)
13174+#define FW_VA_RENDER_MSG_SIZE_OFFSET (0x0000)
13175+#define FW_VA_RENDER_MSG_SIZE_SHIFT (0)
13176+
13177+// FW_VA_RENDER ID
13178+#define FW_VA_RENDER_ID_ALIGNMENT (1)
13179+#define FW_VA_RENDER_ID_TYPE uint8_t
13180+#define FW_VA_RENDER_ID_MASK (0xFF)
13181+#define FW_VA_RENDER_ID_LSBMASK (0xFF)
13182+#define FW_VA_RENDER_ID_OFFSET (0x0001)
13183+#define FW_VA_RENDER_ID_SHIFT (0)
13184+
13185+// FW_VA_RENDER BUFFER_SIZE
13186+#define FW_VA_RENDER_BUFFER_SIZE_ALIGNMENT (2)
13187+#define FW_VA_RENDER_BUFFER_SIZE_TYPE uint16_t
13188+#define FW_VA_RENDER_BUFFER_SIZE_MASK (0x0FFF)
13189+#define FW_VA_RENDER_BUFFER_SIZE_LSBMASK (0x0FFF)
13190+#define FW_VA_RENDER_BUFFER_SIZE_OFFSET (0x0002)
13191+#define FW_VA_RENDER_BUFFER_SIZE_SHIFT (0)
13192+
13193+// FW_VA_RENDER MMUPTD
13194+#define FW_VA_RENDER_MMUPTD_ALIGNMENT (4)
13195+#define FW_VA_RENDER_MMUPTD_TYPE uint32_t
13196+#define FW_VA_RENDER_MMUPTD_MASK (0xFFFFFFFF)
13197+#define FW_VA_RENDER_MMUPTD_LSBMASK (0xFFFFFFFF)
13198+#define FW_VA_RENDER_MMUPTD_OFFSET (0x0004)
13199+#define FW_VA_RENDER_MMUPTD_SHIFT (0)
13200+
13201+// FW_VA_RENDER LLDMA_ADDRESS
13202+#define FW_VA_RENDER_LLDMA_ADDRESS_ALIGNMENT (4)
13203+#define FW_VA_RENDER_LLDMA_ADDRESS_TYPE uint32_t
13204+#define FW_VA_RENDER_LLDMA_ADDRESS_MASK (0xFFFFFFFF)
13205+#define FW_VA_RENDER_LLDMA_ADDRESS_LSBMASK (0xFFFFFFFF)
13206+#define FW_VA_RENDER_LLDMA_ADDRESS_OFFSET (0x0008)
13207+#define FW_VA_RENDER_LLDMA_ADDRESS_SHIFT (0)
13208+
13209+// FW_VA_RENDER CONTEXT
13210+#define FW_VA_RENDER_CONTEXT_ALIGNMENT (4)
13211+#define FW_VA_RENDER_CONTEXT_TYPE uint32_t
13212+#define FW_VA_RENDER_CONTEXT_MASK (0xFFFFFFFF)
13213+#define FW_VA_RENDER_CONTEXT_LSBMASK (0xFFFFFFFF)
13214+#define FW_VA_RENDER_CONTEXT_OFFSET (0x000C)
13215+#define FW_VA_RENDER_CONTEXT_SHIFT (0)
13216+
13217+// FW_VA_RENDER FENCE_VALUE
13218+#define FW_VA_RENDER_FENCE_VALUE_ALIGNMENT (4)
13219+#define FW_VA_RENDER_FENCE_VALUE_TYPE uint32_t
13220+#define FW_VA_RENDER_FENCE_VALUE_MASK (0xFFFFFFFF)
13221+#define FW_VA_RENDER_FENCE_VALUE_LSBMASK (0xFFFFFFFF)
13222+#define FW_VA_RENDER_FENCE_VALUE_OFFSET (0x0010)
13223+#define FW_VA_RENDER_FENCE_VALUE_SHIFT (0)
13224+
13225+// FW_VA_RENDER OPERATING_MODE
13226+#define FW_VA_RENDER_OPERATING_MODE_ALIGNMENT (4)
13227+#define FW_VA_RENDER_OPERATING_MODE_TYPE uint32_t
13228+#define FW_VA_RENDER_OPERATING_MODE_MASK (0xFFFFFFFF)
13229+#define FW_VA_RENDER_OPERATING_MODE_LSBMASK (0xFFFFFFFF)
13230+#define FW_VA_RENDER_OPERATING_MODE_OFFSET (0x0014)
13231+#define FW_VA_RENDER_OPERATING_MODE_SHIFT (0)
13232+
13233+// FW_VA_RENDER FIRST_MB_IN_SLICE
13234+#define FW_VA_RENDER_FIRST_MB_IN_SLICE_ALIGNMENT (2)
13235+#define FW_VA_RENDER_FIRST_MB_IN_SLICE_TYPE uint16_t
13236+#define FW_VA_RENDER_FIRST_MB_IN_SLICE_MASK (0xFFFF)
13237+#define FW_VA_RENDER_FIRST_MB_IN_SLICE_LSBMASK (0xFFFF)
13238+#define FW_VA_RENDER_FIRST_MB_IN_SLICE_OFFSET (0x0018)
13239+#define FW_VA_RENDER_FIRST_MB_IN_SLICE_SHIFT (0)
13240+
13241+// FW_VA_RENDER LAST_MB_IN_FRAME
13242+#define FW_VA_RENDER_LAST_MB_IN_FRAME_ALIGNMENT (2)
13243+#define FW_VA_RENDER_LAST_MB_IN_FRAME_TYPE uint16_t
13244+#define FW_VA_RENDER_LAST_MB_IN_FRAME_MASK (0xFFFF)
13245+#define FW_VA_RENDER_LAST_MB_IN_FRAME_LSBMASK (0xFFFF)
13246+#define FW_VA_RENDER_LAST_MB_IN_FRAME_OFFSET (0x001A)
13247+#define FW_VA_RENDER_LAST_MB_IN_FRAME_SHIFT (0)
13248+
13249+// FW_VA_RENDER FLAGS
13250+#define FW_VA_RENDER_FLAGS_ALIGNMENT (4)
13251+#define FW_VA_RENDER_FLAGS_TYPE uint32_t
13252+#define FW_VA_RENDER_FLAGS_MASK (0xFFFFFFFF)
13253+#define FW_VA_RENDER_FLAGS_LSBMASK (0xFFFFFFFF)
13254+#define FW_VA_RENDER_FLAGS_OFFSET (0x001C)
13255+#define FW_VA_RENDER_FLAGS_SHIFT (0)
13256+
13257+#define FW_VA_CMD_COMPLETED_SIZE (12)
13258+
13259+// FW_VA_CMD_COMPLETED MSG_SIZE
13260+#define FW_VA_CMD_COMPLETED_MSG_SIZE_ALIGNMENT (1)
13261+#define FW_VA_CMD_COMPLETED_MSG_SIZE_TYPE uint8_t
13262+#define FW_VA_CMD_COMPLETED_MSG_SIZE_MASK (0xFF)
13263+#define FW_VA_CMD_COMPLETED_MSG_SIZE_LSBMASK (0xFF)
13264+#define FW_VA_CMD_COMPLETED_MSG_SIZE_OFFSET (0x0000)
13265+#define FW_VA_CMD_COMPLETED_MSG_SIZE_SHIFT (0)
13266+
13267+// FW_VA_CMD_COMPLETED ID
13268+#define FW_VA_CMD_COMPLETED_ID_ALIGNMENT (1)
13269+#define FW_VA_CMD_COMPLETED_ID_TYPE uint8_t
13270+#define FW_VA_CMD_COMPLETED_ID_MASK (0xFF)
13271+#define FW_VA_CMD_COMPLETED_ID_LSBMASK (0xFF)
13272+#define FW_VA_CMD_COMPLETED_ID_OFFSET (0x0001)
13273+#define FW_VA_CMD_COMPLETED_ID_SHIFT (0)
13274+
13275+// FW_VA_CMD_COMPLETED FENCE_VALUE
13276+#define FW_VA_CMD_COMPLETED_FENCE_VALUE_ALIGNMENT (4)
13277+#define FW_VA_CMD_COMPLETED_FENCE_VALUE_TYPE uint32_t
13278+#define FW_VA_CMD_COMPLETED_FENCE_VALUE_MASK (0xFFFFFFFF)
13279+#define FW_VA_CMD_COMPLETED_FENCE_VALUE_LSBMASK (0xFFFFFFFF)
13280+#define FW_VA_CMD_COMPLETED_FENCE_VALUE_OFFSET (0x0004)
13281+#define FW_VA_CMD_COMPLETED_FENCE_VALUE_SHIFT (0)
13282+
13283+// FW_VA_CMD_COMPLETED FLAGS
13284+#define FW_VA_CMD_COMPLETED_FLAGS_ALIGNMENT (4)
13285+#define FW_VA_CMD_COMPLETED_FLAGS_TYPE uint32_t
13286+#define FW_VA_CMD_COMPLETED_FLAGS_MASK (0xFFFFFFFF)
13287+#define FW_VA_CMD_COMPLETED_FLAGS_LSBMASK (0xFFFFFFFF)
13288+#define FW_VA_CMD_COMPLETED_FLAGS_OFFSET (0x0008)
13289+#define FW_VA_CMD_COMPLETED_FLAGS_SHIFT (0)
13290+
13291+#define FW_VA_CMD_FAILED_SIZE (12)
13292+
13293+// FW_VA_CMD_FAILED MSG_SIZE
13294+#define FW_VA_CMD_FAILED_MSG_SIZE_ALIGNMENT (1)
13295+#define FW_VA_CMD_FAILED_MSG_SIZE_TYPE uint8_t
13296+#define FW_VA_CMD_FAILED_MSG_SIZE_MASK (0xFF)
13297+#define FW_VA_CMD_FAILED_MSG_SIZE_LSBMASK (0xFF)
13298+#define FW_VA_CMD_FAILED_MSG_SIZE_OFFSET (0x0000)
13299+#define FW_VA_CMD_FAILED_MSG_SIZE_SHIFT (0)
13300+
13301+// FW_VA_CMD_FAILED ID
13302+#define FW_VA_CMD_FAILED_ID_ALIGNMENT (1)
13303+#define FW_VA_CMD_FAILED_ID_TYPE uint8_t
13304+#define FW_VA_CMD_FAILED_ID_MASK (0xFF)
13305+#define FW_VA_CMD_FAILED_ID_LSBMASK (0xFF)
13306+#define FW_VA_CMD_FAILED_ID_OFFSET (0x0001)
13307+#define FW_VA_CMD_FAILED_ID_SHIFT (0)
13308+
13309+// FW_VA_CMD_FAILED FLAGS
13310+#define FW_VA_CMD_FAILED_FLAGS_ALIGNMENT (2)
13311+#define FW_VA_CMD_FAILED_FLAGS_TYPE uint16_t
13312+#define FW_VA_CMD_FAILED_FLAGS_MASK (0xFFFF)
13313+#define FW_VA_CMD_FAILED_FLAGS_LSBMASK (0xFFFF)
13314+#define FW_VA_CMD_FAILED_FLAGS_OFFSET (0x0002)
13315+#define FW_VA_CMD_FAILED_FLAGS_SHIFT (0)
13316+
13317+// FW_VA_CMD_FAILED FENCE_VALUE
13318+#define FW_VA_CMD_FAILED_FENCE_VALUE_ALIGNMENT (4)
13319+#define FW_VA_CMD_FAILED_FENCE_VALUE_TYPE uint32_t
13320+#define FW_VA_CMD_FAILED_FENCE_VALUE_MASK (0xFFFFFFFF)
13321+#define FW_VA_CMD_FAILED_FENCE_VALUE_LSBMASK (0xFFFFFFFF)
13322+#define FW_VA_CMD_FAILED_FENCE_VALUE_OFFSET (0x0004)
13323+#define FW_VA_CMD_FAILED_FENCE_VALUE_SHIFT (0)
13324+
13325+// FW_VA_CMD_FAILED IRQSTATUS
13326+#define FW_VA_CMD_FAILED_IRQSTATUS_ALIGNMENT (4)
13327+#define FW_VA_CMD_FAILED_IRQSTATUS_TYPE uint32_t
13328+#define FW_VA_CMD_FAILED_IRQSTATUS_MASK (0xFFFFFFFF)
13329+#define FW_VA_CMD_FAILED_IRQSTATUS_LSBMASK (0xFFFFFFFF)
13330+#define FW_VA_CMD_FAILED_IRQSTATUS_OFFSET (0x0008)
13331+#define FW_VA_CMD_FAILED_IRQSTATUS_SHIFT (0)
13332+
13333+#define FW_VA_DEBLOCK_REQUIRED_SIZE (8)
13334+
13335+// FW_VA_DEBLOCK_REQUIRED MSG_SIZE
13336+#define FW_VA_DEBLOCK_REQUIRED_MSG_SIZE_ALIGNMENT (1)
13337+#define FW_VA_DEBLOCK_REQUIRED_MSG_SIZE_TYPE uint8_t
13338+#define FW_VA_DEBLOCK_REQUIRED_MSG_SIZE_MASK (0xFF)
13339+#define FW_VA_DEBLOCK_REQUIRED_MSG_SIZE_LSBMASK (0xFF)
13340+#define FW_VA_DEBLOCK_REQUIRED_MSG_SIZE_OFFSET (0x0000)
13341+#define FW_VA_DEBLOCK_REQUIRED_MSG_SIZE_SHIFT (0)
13342+
13343+// FW_VA_DEBLOCK_REQUIRED ID
13344+#define FW_VA_DEBLOCK_REQUIRED_ID_ALIGNMENT (1)
13345+#define FW_VA_DEBLOCK_REQUIRED_ID_TYPE uint8_t
13346+#define FW_VA_DEBLOCK_REQUIRED_ID_MASK (0xFF)
13347+#define FW_VA_DEBLOCK_REQUIRED_ID_LSBMASK (0xFF)
13348+#define FW_VA_DEBLOCK_REQUIRED_ID_OFFSET (0x0001)
13349+#define FW_VA_DEBLOCK_REQUIRED_ID_SHIFT (0)
13350+
13351+// FW_VA_DEBLOCK_REQUIRED CONTEXT
13352+#define FW_VA_DEBLOCK_REQUIRED_CONTEXT_ALIGNMENT (4)
13353+#define FW_VA_DEBLOCK_REQUIRED_CONTEXT_TYPE uint32_t
13354+#define FW_VA_DEBLOCK_REQUIRED_CONTEXT_MASK (0xFFFFFFFF)
13355+#define FW_VA_DEBLOCK_REQUIRED_CONTEXT_LSBMASK (0xFFFFFFFF)
13356+#define FW_VA_DEBLOCK_REQUIRED_CONTEXT_OFFSET (0x0004)
13357+#define FW_VA_DEBLOCK_REQUIRED_CONTEXT_SHIFT (0)
13358+
13359+#define FW_VA_HW_PANIC_SIZE (12)
13360+
13361+// FW_VA_HW_PANIC FLAGS
13362+#define FW_VA_HW_PANIC_FLAGS_ALIGNMENT (2)
13363+#define FW_VA_HW_PANIC_FLAGS_TYPE uint16_t
13364+#define FW_VA_HW_PANIC_FLAGS_MASK (0xFFFF)
13365+#define FW_VA_HW_PANIC_FLAGS_LSBMASK (0xFFFF)
13366+#define FW_VA_HW_PANIC_FLAGS_OFFSET (0x0002)
13367+#define FW_VA_HW_PANIC_FLAGS_SHIFT (0)
13368+
13369+// FW_VA_HW_PANIC MSG_SIZE
13370+#define FW_VA_HW_PANIC_MSG_SIZE_ALIGNMENT (1)
13371+#define FW_VA_HW_PANIC_MSG_SIZE_TYPE uint8_t
13372+#define FW_VA_HW_PANIC_MSG_SIZE_MASK (0xFF)
13373+#define FW_VA_HW_PANIC_MSG_SIZE_LSBMASK (0xFF)
13374+#define FW_VA_HW_PANIC_MSG_SIZE_OFFSET (0x0000)
13375+#define FW_VA_HW_PANIC_MSG_SIZE_SHIFT (0)
13376+
13377+// FW_VA_HW_PANIC ID
13378+#define FW_VA_HW_PANIC_ID_ALIGNMENT (1)
13379+#define FW_VA_HW_PANIC_ID_TYPE uint8_t
13380+#define FW_VA_HW_PANIC_ID_MASK (0xFF)
13381+#define FW_VA_HW_PANIC_ID_LSBMASK (0xFF)
13382+#define FW_VA_HW_PANIC_ID_OFFSET (0x0001)
13383+#define FW_VA_HW_PANIC_ID_SHIFT (0)
13384+
13385+// FW_VA_HW_PANIC FENCE_VALUE
13386+#define FW_VA_HW_PANIC_FENCE_VALUE_ALIGNMENT (4)
13387+#define FW_VA_HW_PANIC_FENCE_VALUE_TYPE uint32_t
13388+#define FW_VA_HW_PANIC_FENCE_VALUE_MASK (0xFFFFFFFF)
13389+#define FW_VA_HW_PANIC_FENCE_VALUE_LSBMASK (0xFFFFFFFF)
13390+#define FW_VA_HW_PANIC_FENCE_VALUE_OFFSET (0x0004)
13391+#define FW_VA_HW_PANIC_FENCE_VALUE_SHIFT (0)
13392+
13393+// FW_VA_HW_PANIC IRQSTATUS
13394+#define FW_VA_HW_PANIC_IRQSTATUS_ALIGNMENT (4)
13395+#define FW_VA_HW_PANIC_IRQSTATUS_TYPE uint32_t
13396+#define FW_VA_HW_PANIC_IRQSTATUS_MASK (0xFFFFFFFF)
13397+#define FW_VA_HW_PANIC_IRQSTATUS_LSBMASK (0xFFFFFFFF)
13398+#define FW_VA_HW_PANIC_IRQSTATUS_OFFSET (0x0008)
13399+#define FW_VA_HW_PANIC_IRQSTATUS_SHIFT (0)
13400+
13401+#endif
13402Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdxinit.c
13403===================================================================
13404--- /dev/null 1970-01-01 00:00:00.000000000 +0000
13405+++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdxinit.c 2009-02-20 12:23:06.000000000 +0000
13406@@ -0,0 +1,625 @@
13407+/**
13408+ * file psb_msvdxinit.c
13409+ * MSVDX initialization and mtx-firmware upload
13410+ *
13411+ */
13412+
13413+/**************************************************************************
13414+ *
13415+ * Copyright (c) 2007 Intel Corporation, Hillsboro, OR, USA
13416+ * Copyright (c) Imagination Technologies Limited, UK
13417+ * All Rights Reserved.
13418+ *
13419+ * Permission is hereby granted, free of charge, to any person obtaining a
13420+ * copy of this software and associated documentation files (the
13421+ * "Software"), to deal in the Software without restriction, including
13422+ * without limitation the rights to use, copy, modify, merge, publish,
13423+ * distribute, sub license, and/or sell copies of the Software, and to
13424+ * permit persons to whom the Software is furnished to do so, subject to
13425+ * the following conditions:
13426+ *
13427+ * The above copyright notice and this permission notice (including the
13428+ * next paragraph) shall be included in all copies or substantial portions
13429+ * of the Software.
13430+ *
13431+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13432+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13433+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
13434+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
13435+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
13436+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
13437+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
13438+ *
13439+ **************************************************************************/
13440+
13441+#include "drmP.h"
13442+#include "drm.h"
13443+#include "psb_drv.h"
13444+#include "psb_msvdx.h"
13445+#include <linux/firmware.h>
13446+
13447+/*MSVDX FW header*/
13448+struct msvdx_fw
13449+{
13450+ uint32_t ver;
13451+ uint32_t text_size;
13452+ uint32_t data_size;
13453+ uint32_t data_location;
13454+};
13455+
13456+int
13457+psb_wait_for_register (struct drm_psb_private *dev_priv,
13458+ uint32_t ui32Offset,
13459+ uint32_t ui32Value, uint32_t ui32Enable)
13460+{
13461+ uint32_t ui32Temp;
13462+ uint32_t ui32PollCount = 1000;
13463+ while (ui32PollCount)
13464+ {
13465+ ui32Temp = PSB_RMSVDX32 (ui32Offset);
13466+ if (ui32Value == (ui32Temp & ui32Enable)) /* All the bits are reset */
13467+ return 0; /* So exit */
13468+
13469+ /* Wait a bit */
13470+ DRM_UDELAY (100);
13471+ ui32PollCount--;
13472+ }
13473+ PSB_DEBUG_GENERAL
13474+ ("MSVDX: Timeout while waiting for register %08x: expecting %08x (mask %08x), got %08x\n",
13475+ ui32Offset, ui32Value, ui32Enable, ui32Temp);
13476+ return 1;
13477+}
13478+
13479+int
13480+psb_poll_mtx_irq (struct drm_psb_private *dev_priv)
13481+{
13482+ int ret = 0;
13483+ uint32_t MtxInt = 0;
13484+ REGIO_WRITE_FIELD_LITE (MtxInt, MSVDX_INTERRUPT_STATUS, CR_MTX_IRQ, 1);
13485+
13486+ ret = psb_wait_for_register (dev_priv, MSVDX_INTERRUPT_STATUS, MtxInt, /* Required value */
13487+ MtxInt /* Enabled bits */ );
13488+ if (ret)
13489+ {
13490+ PSB_DEBUG_GENERAL
13491+ ("MSVDX: Error Mtx did not return int within a resonable time\n");
13492+
13493+ return ret;
13494+ }
13495+
13496+ PSB_DEBUG_GENERAL ("MSVDX: Got MTX Int\n");
13497+
13498+ /* Got it so clear the bit */
13499+ PSB_WMSVDX32 (MtxInt, MSVDX_INTERRUPT_CLEAR);
13500+
13501+ return ret;
13502+}
13503+
13504+void
13505+psb_write_mtx_core_reg (struct drm_psb_private *dev_priv,
13506+ const uint32_t ui32CoreRegister,
13507+ const uint32_t ui32Val)
13508+{
13509+ uint32_t ui32Reg = 0;
13510+
13511+ /* Put data in MTX_RW_DATA */
13512+ PSB_WMSVDX32 (ui32Val, MSVDX_MTX_REGISTER_READ_WRITE_DATA);
13513+
13514+ /* DREADY is set to 0 and request a write */
13515+ ui32Reg = ui32CoreRegister;
13516+ REGIO_WRITE_FIELD_LITE (ui32Reg, MSVDX_MTX_REGISTER_READ_WRITE_REQUEST,
13517+ MTX_RNW, 0);
13518+ REGIO_WRITE_FIELD_LITE (ui32Reg, MSVDX_MTX_REGISTER_READ_WRITE_REQUEST,
13519+ MTX_DREADY, 0);
13520+ PSB_WMSVDX32 (ui32Reg, MSVDX_MTX_REGISTER_READ_WRITE_REQUEST);
13521+
13522+ psb_wait_for_register (dev_priv, MSVDX_MTX_REGISTER_READ_WRITE_REQUEST, MSVDX_MTX_REGISTER_READ_WRITE_REQUEST_MTX_DREADY_MASK, /* Required Value */
13523+ MSVDX_MTX_REGISTER_READ_WRITE_REQUEST_MTX_DREADY_MASK);
13524+}
13525+
13526+void
13527+psb_upload_fw (struct drm_psb_private *dev_priv, const uint32_t ui32DataMem,
13528+ uint32_t ui32RamBankSize, uint32_t ui32Address,
13529+ const unsigned int uiWords, const uint32_t * const pui32Data)
13530+{
13531+ uint32_t ui32Loop, ui32Ctrl, ui32RamId, ui32Addr, ui32CurrBank =
13532+ (uint32_t) ~ 0;
13533+ uint32_t ui32AccessControl;
13534+
13535+ /* Save the access control register... */
13536+ ui32AccessControl = PSB_RMSVDX32 (MSVDX_MTX_RAM_ACCESS_CONTROL);
13537+
13538+ /* Wait for MCMSTAT to become be idle 1 */
13539+ psb_wait_for_register (dev_priv, MSVDX_MTX_RAM_ACCESS_STATUS, 1, /* Required Value */
13540+ 0xffffffff /* Enables */ );
13541+
13542+ for (ui32Loop = 0; ui32Loop < uiWords; ui32Loop++)
13543+ {
13544+ ui32RamId = ui32DataMem + (ui32Address / ui32RamBankSize);
13545+
13546+ if (ui32RamId != ui32CurrBank)
13547+ {
13548+ ui32Addr = ui32Address >> 2;
13549+
13550+ ui32Ctrl = 0;
13551+
13552+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13553+ MSVDX_MTX_RAM_ACCESS_CONTROL,
13554+ MTX_MCMID, ui32RamId);
13555+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13556+ MSVDX_MTX_RAM_ACCESS_CONTROL,
13557+ MTX_MCM_ADDR, ui32Addr);
13558+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13559+ MSVDX_MTX_RAM_ACCESS_CONTROL, MTX_MCMAI, 1);
13560+
13561+ PSB_WMSVDX32 (ui32Ctrl, MSVDX_MTX_RAM_ACCESS_CONTROL);
13562+
13563+ ui32CurrBank = ui32RamId;
13564+ }
13565+ ui32Address += 4;
13566+
13567+ PSB_WMSVDX32 (pui32Data[ui32Loop], MSVDX_MTX_RAM_ACCESS_DATA_TRANSFER);
13568+
13569+ /* Wait for MCMSTAT to become be idle 1 */
13570+ psb_wait_for_register (dev_priv, MSVDX_MTX_RAM_ACCESS_STATUS, 1, /* Required Value */
13571+ 0xffffffff /* Enables */ );
13572+ }
13573+ PSB_DEBUG_GENERAL ("MSVDX: Upload done\n");
13574+
13575+ /* Restore the access control register... */
13576+ PSB_WMSVDX32 (ui32AccessControl, MSVDX_MTX_RAM_ACCESS_CONTROL);
13577+}
13578+
13579+static int
13580+psb_verify_fw (struct drm_psb_private *dev_priv,
13581+ const uint32_t ui32RamBankSize,
13582+ const uint32_t ui32DataMem, uint32_t ui32Address,
13583+ const uint32_t uiWords, const uint32_t * const pui32Data)
13584+{
13585+ uint32_t ui32Loop, ui32Ctrl, ui32RamId, ui32Addr, ui32CurrBank =
13586+ (uint32_t) ~ 0;
13587+ uint32_t ui32AccessControl;
13588+ int ret = 0;
13589+
13590+ /* Save the access control register... */
13591+ ui32AccessControl = PSB_RMSVDX32 (MSVDX_MTX_RAM_ACCESS_CONTROL);
13592+
13593+ /* Wait for MCMSTAT to become be idle 1 */
13594+ psb_wait_for_register (dev_priv, MSVDX_MTX_RAM_ACCESS_STATUS, 1, /* Required Value */
13595+ 0xffffffff /* Enables */ );
13596+
13597+ for (ui32Loop = 0; ui32Loop < uiWords; ui32Loop++)
13598+ {
13599+ uint32_t ui32ReadBackVal;
13600+ ui32RamId = ui32DataMem + (ui32Address / ui32RamBankSize);
13601+
13602+ if (ui32RamId != ui32CurrBank)
13603+ {
13604+ ui32Addr = ui32Address >> 2;
13605+ ui32Ctrl = 0;
13606+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13607+ MSVDX_MTX_RAM_ACCESS_CONTROL,
13608+ MTX_MCMID, ui32RamId);
13609+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13610+ MSVDX_MTX_RAM_ACCESS_CONTROL,
13611+ MTX_MCM_ADDR, ui32Addr);
13612+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13613+ MSVDX_MTX_RAM_ACCESS_CONTROL, MTX_MCMAI, 1);
13614+ REGIO_WRITE_FIELD_LITE (ui32Ctrl,
13615+ MSVDX_MTX_RAM_ACCESS_CONTROL, MTX_MCMR, 1);
13616+
13617+ PSB_WMSVDX32 (ui32Ctrl, MSVDX_MTX_RAM_ACCESS_CONTROL);
13618+
13619+ ui32CurrBank = ui32RamId;
13620+ }
13621+ ui32Address += 4;
13622+
13623+ /* Wait for MCMSTAT to become be idle 1 */
13624+ psb_wait_for_register (dev_priv, MSVDX_MTX_RAM_ACCESS_STATUS, 1, /* Required Value */
13625+ 0xffffffff /* Enables */ );
13626+
13627+ ui32ReadBackVal = PSB_RMSVDX32 (MSVDX_MTX_RAM_ACCESS_DATA_TRANSFER);
13628+ if (pui32Data[ui32Loop] != ui32ReadBackVal)
13629+ {
13630+ DRM_ERROR
13631+ ("psb: Firmware validation fails at index=%08x\n", ui32Loop);
13632+ ret = 1;
13633+ break;
13634+ }
13635+ }
13636+
13637+ /* Restore the access control register... */
13638+ PSB_WMSVDX32 (ui32AccessControl, MSVDX_MTX_RAM_ACCESS_CONTROL);
13639+
13640+ return ret;
13641+}
13642+
13643+static uint32_t *
13644+msvdx_get_fw (struct drm_device *dev,
13645+ const struct firmware **raw, uint8_t * name)
13646+{
13647+ int rc;
13648+ int *ptr = NULL;
13649+
13650+ rc = request_firmware (raw, name, &dev->pdev->dev);
13651+ if (rc < 0)
13652+ {
13653+ DRM_ERROR ("MSVDX: %s request_firmware failed: Reason %d\n", name, rc);
13654+ return NULL;
13655+ }
13656+
13657+ if ((*raw)->size < sizeof (struct msvdx_fw))
13658+ {
13659+ PSB_DEBUG_GENERAL ("MSVDX: %s is is not correct size(%zd)\n",
13660+ name, (*raw)->size);
13661+ return NULL;
13662+ }
13663+
13664+ ptr = (int *) ((*raw))->data;
13665+
13666+ if (!ptr)
13667+ {
13668+ PSB_DEBUG_GENERAL ("MSVDX: Failed to load %s\n", name);
13669+ return NULL;
13670+ }
13671+ /*another sanity check... */
13672+ if ((*raw)->size !=
13673+ (sizeof (struct msvdx_fw) +
13674+ sizeof (uint32_t) * ((struct msvdx_fw *) ptr)->text_size +
13675+ sizeof (uint32_t) * ((struct msvdx_fw *) ptr)->data_size))
13676+ {
13677+ PSB_DEBUG_GENERAL ("MSVDX: %s is is not correct size(%zd)\n",
13678+ name, (*raw)->size);
13679+ return NULL;
13680+ }
13681+ return ptr;
13682+}
13683+
13684+static int
13685+psb_setup_fw (struct drm_device *dev)
13686+{
13687+ struct drm_psb_private *dev_priv = dev->dev_private;
13688+ int ret = 0;
13689+
13690+ uint32_t ram_bank_size;
13691+ struct msvdx_fw *fw;
13692+ uint32_t *fw_ptr = NULL;
13693+ uint32_t *text_ptr = NULL;
13694+ uint32_t *data_ptr = NULL;
13695+ const struct firmware *raw = NULL;
13696+ /* todo : Assert the clock is on - if not turn it on to upload code */
13697+
13698+ PSB_DEBUG_GENERAL ("MSVDX: psb_setup_fw\n");
13699+
13700+ /* Reset MTX */
13701+ PSB_WMSVDX32 (MSVDX_MTX_SOFT_RESET_MTX_RESET_MASK, MSVDX_MTX_SOFT_RESET);
13702+
13703+ /* Initialses Communication controll area to 0 */
13704+ if(dev_priv->psb_rev_id >= POULSBO_D1)
13705+ {
13706+ PSB_DEBUG_GENERAL("MSVDX: Detected Poulsbo D1 or later revision.\n");
13707+ PSB_WMSVDX32 (MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D1, MSVDX_COMMS_OFFSET_FLAGS);
13708+ }
13709+ else
13710+ {
13711+ PSB_DEBUG_GENERAL("MSVDX: Detected Poulsbo D0 or earlier revision.\n");
13712+ PSB_WMSVDX32 (MSVDX_DEVICE_NODE_FLAGS_DEFAULT_D0, MSVDX_COMMS_OFFSET_FLAGS);
13713+ }
13714+
13715+ PSB_WMSVDX32 (0, MSVDX_COMMS_MSG_COUNTER);
13716+ PSB_WMSVDX32 (0, MSVDX_COMMS_SIGNATURE);
13717+ PSB_WMSVDX32 (0, MSVDX_COMMS_TO_HOST_RD_INDEX);
13718+ PSB_WMSVDX32 (0, MSVDX_COMMS_TO_HOST_WRT_INDEX);
13719+ PSB_WMSVDX32 (0, MSVDX_COMMS_TO_MTX_RD_INDEX);
13720+ PSB_WMSVDX32 (0, MSVDX_COMMS_TO_MTX_WRT_INDEX);
13721+ PSB_WMSVDX32 (0, MSVDX_COMMS_FW_STATUS);
13722+
13723+ /* read register bank size */
13724+ {
13725+ uint32_t ui32BankSize, ui32Reg;
13726+ ui32Reg = PSB_RMSVDX32 (MSVDX_MTX_RAM_BANK);
13727+ ui32BankSize =
13728+ REGIO_READ_FIELD (ui32Reg, MSVDX_MTX_RAM_BANK, CR_MTX_RAM_BANK_SIZE);
13729+ ram_bank_size = (uint32_t) (1 << (ui32BankSize + 2));
13730+ }
13731+
13732+ PSB_DEBUG_GENERAL ("MSVDX: RAM bank size = %d bytes\n", ram_bank_size);
13733+
13734+ fw_ptr = msvdx_get_fw (dev, &raw, "msvdx_fw.bin");
13735+
13736+ if (!fw_ptr)
13737+ {
13738+ DRM_ERROR ("psb: No valid msvdx_fw.bin firmware found.\n");
13739+ ret = 1;
13740+ goto out;
13741+ }
13742+
13743+ fw = (struct msvdx_fw *) fw_ptr;
13744+ if (fw->ver != 0x02)
13745+ {
13746+ DRM_ERROR
13747+ ("psb: msvdx_fw.bin firmware version mismatch, got version=%02x expected version=%02x\n",
13748+ fw->ver, 0x02);
13749+ ret = 1;
13750+ goto out;
13751+ }
13752+
13753+ text_ptr = (uint32_t *) ((uint8_t *) fw_ptr + sizeof (struct msvdx_fw));
13754+ data_ptr = text_ptr + fw->text_size;
13755+
13756+ PSB_DEBUG_GENERAL ("MSVDX: Retrieved pointers for firmware\n");
13757+ PSB_DEBUG_GENERAL ("MSVDX: text_size: %d\n", fw->text_size);
13758+ PSB_DEBUG_GENERAL ("MSVDX: data_size: %d\n", fw->data_size);
13759+ PSB_DEBUG_GENERAL ("MSVDX: data_location: 0x%x\n", fw->data_location);
13760+ PSB_DEBUG_GENERAL ("MSVDX: First 4 bytes of text: 0x%x\n", *text_ptr);
13761+ PSB_DEBUG_GENERAL ("MSVDX: First 4 bytes of data: 0x%x\n", *data_ptr);
13762+
13763+ PSB_DEBUG_GENERAL ("MSVDX: Uploading firmware\n");
13764+ psb_upload_fw (dev_priv, MTX_CORE_CODE_MEM, ram_bank_size,
13765+ PC_START_ADDRESS - MTX_CODE_BASE, fw->text_size, text_ptr);
13766+ psb_upload_fw (dev_priv, MTX_CORE_DATA_MEM, ram_bank_size,
13767+ fw->data_location - MTX_DATA_BASE, fw->data_size, data_ptr);
13768+
13769+ /*todo : Verify code upload possibly only in debug */
13770+ if (psb_verify_fw
13771+ (dev_priv, ram_bank_size, MTX_CORE_CODE_MEM,
13772+ PC_START_ADDRESS - MTX_CODE_BASE, fw->text_size, text_ptr))
13773+ {
13774+ /* Firmware code upload failed */
13775+ ret = 1;
13776+ goto out;
13777+ }
13778+ if (psb_verify_fw
13779+ (dev_priv, ram_bank_size, MTX_CORE_DATA_MEM,
13780+ fw->data_location - MTX_DATA_BASE, fw->data_size, data_ptr))
13781+ {
13782+ /* Firmware data upload failed */
13783+ ret = 1;
13784+ goto out;
13785+ }
13786+
13787+ /* -- Set starting PC address */
13788+ psb_write_mtx_core_reg (dev_priv, MTX_PC, PC_START_ADDRESS);
13789+
13790+ /* -- Turn on the thread */
13791+ PSB_WMSVDX32 (MSVDX_MTX_ENABLE_MTX_ENABLE_MASK, MSVDX_MTX_ENABLE);
13792+
13793+ /* Wait for the signature value to be written back */
13794+ ret = psb_wait_for_register (dev_priv, MSVDX_COMMS_SIGNATURE, MSVDX_COMMS_SIGNATURE_VALUE, /* Required value */
13795+ 0xffffffff /* Enabled bits */ );
13796+ if (ret)
13797+ {
13798+ DRM_ERROR ("psb: MSVDX firmware fails to initialize.\n");
13799+ goto out;
13800+ }
13801+
13802+ PSB_DEBUG_GENERAL ("MSVDX: MTX Initial indications OK\n");
13803+ PSB_DEBUG_GENERAL ("MSVDX: MSVDX_COMMS_AREA_ADDR = %08x\n",
13804+ MSVDX_COMMS_AREA_ADDR);
13805+out:
13806+ if (raw)
13807+ {
13808+ PSB_DEBUG_GENERAL ("MSVDX releasing firmware resouces....\n");
13809+ release_firmware (raw);
13810+ }
13811+ return ret;
13812+}
13813+
13814+static void
13815+psb_free_ccb (struct drm_buffer_object **ccb)
13816+{
13817+ drm_bo_usage_deref_unlocked (ccb);
13818+ *ccb = NULL;
13819+}
13820+
13821+/*******************************************************************************
13822+
13823+ @Function psb_msvdx_reset
13824+
13825+ @Description
13826+
13827+ Reset chip and disable interrupts.
13828+
13829+ @Input psDeviceNode - device info. structure
13830+
13831+ @Return 0 - Success
13832+ 1 - Failure
13833+
13834+******************************************************************************/
13835+int
13836+psb_msvdx_reset (struct drm_psb_private *dev_priv)
13837+{
13838+ int ret = 0;
13839+
13840+ /* Issue software reset */
13841+ PSB_WMSVDX32 (msvdx_sw_reset_all, MSVDX_CONTROL);
13842+
13843+ ret = psb_wait_for_register (dev_priv, MSVDX_CONTROL, 0, /* Required value */
13844+ MSVDX_CONTROL_CR_MSVDX_SOFT_RESET_MASK
13845+ /* Enabled bits */ );
13846+
13847+ if (!ret)
13848+ {
13849+ /* Clear interrupt enabled flag */
13850+ PSB_WMSVDX32 (0, MSVDX_HOST_INTERRUPT_ENABLE);
13851+
13852+ /* Clear any pending interrupt flags */
13853+ PSB_WMSVDX32 (0xFFFFFFFF, MSVDX_INTERRUPT_CLEAR);
13854+ }
13855+
13856+ mutex_destroy (&dev_priv->msvdx_mutex);
13857+
13858+ return ret;
13859+}
13860+
13861+static int
13862+psb_allocate_ccb (struct drm_device *dev,
13863+ struct drm_buffer_object **ccb,
13864+ uint32_t * base_addr, int size)
13865+{
13866+ int ret;
13867+ struct drm_bo_kmap_obj tmp_kmap;
13868+ int is_iomem;
13869+
13870+ ret = drm_buffer_object_create (dev, size,
13871+ drm_bo_type_kernel,
13872+ DRM_BO_FLAG_READ |
13873+ DRM_PSB_FLAG_MEM_KERNEL |
13874+ DRM_BO_FLAG_NO_EVICT,
13875+ DRM_BO_HINT_DONT_FENCE, 0, 0, ccb);
13876+ if (ret)
13877+ {
13878+ PSB_DEBUG_GENERAL ("Failed to allocate CCB.\n");
13879+ *ccb = NULL;
13880+ return 1;
13881+ }
13882+
13883+ ret = drm_bo_kmap (*ccb, 0, (*ccb)->num_pages, &tmp_kmap);
13884+ if (ret)
13885+ {
13886+ PSB_DEBUG_GENERAL ("drm_bo_kmap failed ret: %d\n", ret);
13887+ drm_bo_usage_deref_unlocked (ccb);
13888+ *ccb = NULL;
13889+ return 1;
13890+ }
13891+
13892+ memset (drm_bmo_virtual (&tmp_kmap, &is_iomem), 0, size);
13893+ drm_bo_kunmap (&tmp_kmap);
13894+
13895+ *base_addr = (*ccb)->offset;
13896+ return 0;
13897+}
13898+
13899+int
13900+psb_msvdx_init (struct drm_device *dev)
13901+{
13902+ struct drm_psb_private *dev_priv = dev->dev_private;
13903+ uint32_t ui32Cmd;
13904+ int ret;
13905+
13906+ PSB_DEBUG_GENERAL ("MSVDX: psb_msvdx_init\n");
13907+
13908+ /*Initialize command msvdx queueing */
13909+ INIT_LIST_HEAD (&dev_priv->msvdx_queue);
13910+ mutex_init (&dev_priv->msvdx_mutex);
13911+ spin_lock_init (&dev_priv->msvdx_lock);
13912+ dev_priv->msvdx_busy = 0;
13913+
13914+ /*figure out the stepping*/
13915+ pci_read_config_byte(dev->pdev, PSB_REVID_OFFSET, &dev_priv->psb_rev_id );
13916+
13917+ /* Enable Clocks */
13918+ PSB_DEBUG_GENERAL ("Enabling clocks\n");
13919+ PSB_WMSVDX32 (clk_enable_all, MSVDX_MAN_CLK_ENABLE);
13920+
13921+ /* Enable MMU by removing all bypass bits */
13922+ PSB_WMSVDX32 (0, MSVDX_MMU_CONTROL0);
13923+
13924+ PSB_DEBUG_GENERAL ("MSVDX: Setting up RENDEC\n");
13925+ /* Allocate device virtual memory as required by rendec.... */
13926+ if (!dev_priv->ccb0)
13927+ {
13928+ ret =
13929+ psb_allocate_ccb (dev, &dev_priv->ccb0,
13930+ &dev_priv->base_addr0, RENDEC_A_SIZE);
13931+ if (ret)
13932+ goto err_exit;
13933+ }
13934+
13935+ if (!dev_priv->ccb1)
13936+ {
13937+ ret =
13938+ psb_allocate_ccb (dev, &dev_priv->ccb1,
13939+ &dev_priv->base_addr1, RENDEC_B_SIZE);
13940+ if (ret)
13941+ goto err_exit;
13942+ }
13943+
13944+ PSB_DEBUG_GENERAL ("MSVDX: RENDEC A: %08x RENDEC B: %08x\n",
13945+ dev_priv->base_addr0, dev_priv->base_addr1);
13946+
13947+ PSB_WMSVDX32 (dev_priv->base_addr0, MSVDX_RENDEC_BASE_ADDR0);
13948+ PSB_WMSVDX32 (dev_priv->base_addr1, MSVDX_RENDEC_BASE_ADDR1);
13949+
13950+ ui32Cmd = 0;
13951+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_BUFFER_SIZE,
13952+ RENDEC_BUFFER_SIZE0, RENDEC_A_SIZE / 4096);
13953+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_BUFFER_SIZE,
13954+ RENDEC_BUFFER_SIZE1, RENDEC_B_SIZE / 4096);
13955+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_BUFFER_SIZE);
13956+
13957+ ui32Cmd = 0;
13958+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_CONTROL1,
13959+ RENDEC_DECODE_START_SIZE, 0);
13960+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_CONTROL1, RENDEC_BURST_SIZE_W, 1);
13961+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_CONTROL1, RENDEC_BURST_SIZE_R, 1);
13962+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_CONTROL1,
13963+ RENDEC_EXTERNAL_MEMORY, 1);
13964+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTROL1);
13965+
13966+ ui32Cmd = 0x00101010;
13967+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTEXT0);
13968+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTEXT1);
13969+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTEXT2);
13970+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTEXT3);
13971+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTEXT4);
13972+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTEXT5);
13973+
13974+ ui32Cmd = 0;
13975+ REGIO_WRITE_FIELD (ui32Cmd, MSVDX_RENDEC_CONTROL0, RENDEC_INITIALISE, 1);
13976+ PSB_WMSVDX32 (ui32Cmd, MSVDX_RENDEC_CONTROL0);
13977+
13978+ ret = psb_setup_fw (dev);
13979+ if (ret)
13980+ goto err_exit;
13981+
13982+ PSB_WMSVDX32 (clk_enable_minimal, MSVDX_MAN_CLK_ENABLE);
13983+
13984+ return 0;
13985+
13986+err_exit:
13987+ if (dev_priv->ccb0)
13988+ psb_free_ccb (&dev_priv->ccb0);
13989+ if (dev_priv->ccb1)
13990+ psb_free_ccb (&dev_priv->ccb1);
13991+
13992+ return 1;
13993+}
13994+
13995+int
13996+psb_msvdx_uninit (struct drm_device *dev)
13997+{
13998+ struct drm_psb_private *dev_priv = dev->dev_private;
13999+
14000+ /*Reset MSVDX chip */
14001+ psb_msvdx_reset (dev_priv);
14002+
14003+// PSB_WMSVDX32 (clk_enable_minimal, MSVDX_MAN_CLK_ENABLE);
14004+ printk("set the msvdx clock to 0 in the %s\n", __FUNCTION__);
14005+ PSB_WMSVDX32 (0, MSVDX_MAN_CLK_ENABLE);
14006+
14007+ /*Clean up resources...*/
14008+ if (dev_priv->ccb0)
14009+ psb_free_ccb (&dev_priv->ccb0);
14010+ if (dev_priv->ccb1)
14011+ psb_free_ccb (&dev_priv->ccb1);
14012+
14013+ return 0;
14014+}
14015+
14016+int psb_hw_info_ioctl(struct drm_device *dev, void *data,
14017+ struct drm_file *file_priv)
14018+{
14019+ struct drm_psb_private *dev_priv = dev->dev_private;
14020+ struct drm_psb_hw_info *hw_info = data;
14021+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);
14022+
14023+ hw_info->rev_id = dev_priv->psb_rev_id;
14024+
14025+ /*read the fuse info to determine the caps*/
14026+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE);
14027+ pci_read_config_dword(pci_root, 0xD4, &hw_info->caps);
14028+
14029+ PSB_DEBUG_GENERAL("MSVDX: PSB caps: 0x%x\n", hw_info->caps);
14030+ return 0;
14031+}
14032Index: linux-2.6.28/drivers/gpu/drm/psb/psb_reg.h
14033===================================================================
14034--- /dev/null 1970-01-01 00:00:00.000000000 +0000
14035+++ linux-2.6.28/drivers/gpu/drm/psb/psb_reg.h 2009-02-20 12:23:06.000000000 +0000
14036@@ -0,0 +1,562 @@
14037+/**************************************************************************
14038+ *
14039+ * Copyright (c) (2005-2007) Imagination Technologies Limited.
14040+ * Copyright (c) 2007, Intel Corporation.
14041+ * All Rights Reserved.
14042+ *
14043+ * This program is free software; you can redistribute it and/or modify it
14044+ * under the terms and conditions of the GNU General Public License,
14045+ * version 2, as published by the Free Software Foundation.
14046+ *
14047+ * This program is distributed in the hope it will be useful, but WITHOUT
14048+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14049+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14050+ * more details.
14051+ *
14052+ * You should have received a copy of the GNU General Public License along with
14053+ * this program; if not, write to the Free Software Foundation, Inc.,
14054+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
14055+ *
14056+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
14057+ * develop this driver.
14058+ *
14059+ **************************************************************************/
14060+/*
14061+ */
14062+#ifndef _PSB_REG_H_
14063+#define _PSB_REG_H_
14064+
14065+#define PSB_CR_CLKGATECTL 0x0000
14066+#define _PSB_C_CLKGATECTL_AUTO_MAN_REG (1 << 24)
14067+#define _PSB_C_CLKGATECTL_USE_CLKG_SHIFT (20)
14068+#define _PSB_C_CLKGATECTL_USE_CLKG_MASK (0x3 << 20)
14069+#define _PSB_C_CLKGATECTL_DPM_CLKG_SHIFT (16)
14070+#define _PSB_C_CLKGATECTL_DPM_CLKG_MASK (0x3 << 16)
14071+#define _PSB_C_CLKGATECTL_TA_CLKG_SHIFT (12)
14072+#define _PSB_C_CLKGATECTL_TA_CLKG_MASK (0x3 << 12)
14073+#define _PSB_C_CLKGATECTL_TSP_CLKG_SHIFT (8)
14074+#define _PSB_C_CLKGATECTL_TSP_CLKG_MASK (0x3 << 8)
14075+#define _PSB_C_CLKGATECTL_ISP_CLKG_SHIFT (4)
14076+#define _PSB_C_CLKGATECTL_ISP_CLKG_MASK (0x3 << 4)
14077+#define _PSB_C_CLKGATECTL_2D_CLKG_SHIFT (0)
14078+#define _PSB_C_CLKGATECTL_2D_CLKG_MASK (0x3 << 0)
14079+#define _PSB_C_CLKGATECTL_CLKG_ENABLED (0)
14080+#define _PSB_C_CLKGATECTL_CLKG_DISABLED (1)
14081+#define _PSB_C_CLKGATECTL_CLKG_AUTO (2)
14082+
14083+#define PSB_CR_CORE_ID 0x0010
14084+#define _PSB_CC_ID_ID_SHIFT (16)
14085+#define _PSB_CC_ID_ID_MASK (0xFFFF << 16)
14086+#define _PSB_CC_ID_CONFIG_SHIFT (0)
14087+#define _PSB_CC_ID_CONFIG_MASK (0xFFFF << 0)
14088+
14089+#define PSB_CR_CORE_REVISION 0x0014
14090+#define _PSB_CC_REVISION_DESIGNER_SHIFT (24)
14091+#define _PSB_CC_REVISION_DESIGNER_MASK (0xFF << 24)
14092+#define _PSB_CC_REVISION_MAJOR_SHIFT (16)
14093+#define _PSB_CC_REVISION_MAJOR_MASK (0xFF << 16)
14094+#define _PSB_CC_REVISION_MINOR_SHIFT (8)
14095+#define _PSB_CC_REVISION_MINOR_MASK (0xFF << 8)
14096+#define _PSB_CC_REVISION_MAINTENANCE_SHIFT (0)
14097+#define _PSB_CC_REVISION_MAINTENANCE_MASK (0xFF << 0)
14098+
14099+#define PSB_CR_DESIGNER_REV_FIELD1 0x0018
14100+
14101+#define PSB_CR_SOFT_RESET 0x0080
14102+#define _PSB_CS_RESET_TSP_RESET (1 << 6)
14103+#define _PSB_CS_RESET_ISP_RESET (1 << 5)
14104+#define _PSB_CS_RESET_USE_RESET (1 << 4)
14105+#define _PSB_CS_RESET_TA_RESET (1 << 3)
14106+#define _PSB_CS_RESET_DPM_RESET (1 << 2)
14107+#define _PSB_CS_RESET_TWOD_RESET (1 << 1)
14108+#define _PSB_CS_RESET_BIF_RESET (1 << 0)
14109+
14110+#define PSB_CR_DESIGNER_REV_FIELD2 0x001C
14111+
14112+#define PSB_CR_EVENT_HOST_ENABLE2 0x0110
14113+
14114+#define PSB_CR_EVENT_STATUS2 0x0118
14115+
14116+#define PSB_CR_EVENT_HOST_CLEAR2 0x0114
14117+#define _PSB_CE2_BIF_REQUESTER_FAULT (1 << 4)
14118+
14119+#define PSB_CR_EVENT_STATUS 0x012C
14120+
14121+#define PSB_CR_EVENT_HOST_ENABLE 0x0130
14122+
14123+#define PSB_CR_EVENT_HOST_CLEAR 0x0134
14124+#define _PSB_CE_MASTER_INTERRUPT (1 << 31)
14125+#define _PSB_CE_TA_DPM_FAULT (1 << 28)
14126+#define _PSB_CE_TWOD_COMPLETE (1 << 27)
14127+#define _PSB_CE_DPM_OUT_OF_MEMORY_ZLS (1 << 25)
14128+#define _PSB_CE_DPM_TA_MEM_FREE (1 << 24)
14129+#define _PSB_CE_PIXELBE_END_RENDER (1 << 18)
14130+#define _PSB_CE_SW_EVENT (1 << 14)
14131+#define _PSB_CE_TA_FINISHED (1 << 13)
14132+#define _PSB_CE_TA_TERMINATE (1 << 12)
14133+#define _PSB_CE_DPM_REACHED_MEM_THRESH (1 << 3)
14134+#define _PSB_CE_DPM_OUT_OF_MEMORY_GBL (1 << 2)
14135+#define _PSB_CE_DPM_OUT_OF_MEMORY_MT (1 << 1)
14136+#define _PSB_CE_DPM_3D_MEM_FREE (1 << 0)
14137+
14138+
14139+#define PSB_USE_OFFSET_MASK 0x0007FFFF
14140+#define PSB_USE_OFFSET_SIZE (PSB_USE_OFFSET_MASK + 1)
14141+#define PSB_CR_USE_CODE_BASE0 0x0A0C
14142+#define PSB_CR_USE_CODE_BASE1 0x0A10
14143+#define PSB_CR_USE_CODE_BASE2 0x0A14
14144+#define PSB_CR_USE_CODE_BASE3 0x0A18
14145+#define PSB_CR_USE_CODE_BASE4 0x0A1C
14146+#define PSB_CR_USE_CODE_BASE5 0x0A20
14147+#define PSB_CR_USE_CODE_BASE6 0x0A24
14148+#define PSB_CR_USE_CODE_BASE7 0x0A28
14149+#define PSB_CR_USE_CODE_BASE8 0x0A2C
14150+#define PSB_CR_USE_CODE_BASE9 0x0A30
14151+#define PSB_CR_USE_CODE_BASE10 0x0A34
14152+#define PSB_CR_USE_CODE_BASE11 0x0A38
14153+#define PSB_CR_USE_CODE_BASE12 0x0A3C
14154+#define PSB_CR_USE_CODE_BASE13 0x0A40
14155+#define PSB_CR_USE_CODE_BASE14 0x0A44
14156+#define PSB_CR_USE_CODE_BASE15 0x0A48
14157+#define PSB_CR_USE_CODE_BASE(_i) (0x0A0C + ((_i) << 2))
14158+#define _PSB_CUC_BASE_DM_SHIFT (25)
14159+#define _PSB_CUC_BASE_DM_MASK (0x3 << 25)
14160+#define _PSB_CUC_BASE_ADDR_SHIFT (0) // 1024-bit aligned address?
14161+#define _PSB_CUC_BASE_ADDR_ALIGNSHIFT (7)
14162+#define _PSB_CUC_BASE_ADDR_MASK (0x1FFFFFF << 0)
14163+#define _PSB_CUC_DM_VERTEX (0)
14164+#define _PSB_CUC_DM_PIXEL (1)
14165+#define _PSB_CUC_DM_RESERVED (2)
14166+#define _PSB_CUC_DM_EDM (3)
14167+
14168+#define PSB_CR_PDS_EXEC_BASE 0x0AB8
14169+#define _PSB_CR_PDS_EXEC_BASE_ADDR_SHIFT (20) // 1MB aligned address
14170+#define _PSB_CR_PDS_EXEC_BASE_ADDR_ALIGNSHIFT (20)
14171+
14172+#define PSB_CR_EVENT_KICKER 0x0AC4
14173+#define _PSB_CE_KICKER_ADDRESS_SHIFT (4) // 128-bit aligned address
14174+
14175+#define PSB_CR_EVENT_KICK 0x0AC8
14176+#define _PSB_CE_KICK_NOW (1 << 0)
14177+
14178+
14179+#define PSB_CR_BIF_DIR_LIST_BASE1 0x0C38
14180+
14181+#define PSB_CR_BIF_CTRL 0x0C00
14182+#define _PSB_CB_CTRL_CLEAR_FAULT (1 << 4)
14183+#define _PSB_CB_CTRL_INVALDC (1 << 3)
14184+#define _PSB_CB_CTRL_FLUSH (1 << 2)
14185+
14186+#define PSB_CR_BIF_INT_STAT 0x0C04
14187+
14188+#define PSB_CR_BIF_FAULT 0x0C08
14189+#define _PSB_CBI_STAT_PF_N_RW (1 << 14)
14190+#define _PSB_CBI_STAT_FAULT_SHIFT (0)
14191+#define _PSB_CBI_STAT_FAULT_MASK (0x3FFF << 0)
14192+#define _PSB_CBI_STAT_FAULT_CACHE (1 << 1)
14193+#define _PSB_CBI_STAT_FAULT_TA (1 << 2)
14194+#define _PSB_CBI_STAT_FAULT_VDM (1 << 3)
14195+#define _PSB_CBI_STAT_FAULT_2D (1 << 4)
14196+#define _PSB_CBI_STAT_FAULT_PBE (1 << 5)
14197+#define _PSB_CBI_STAT_FAULT_TSP (1 << 6)
14198+#define _PSB_CBI_STAT_FAULT_ISP (1 << 7)
14199+#define _PSB_CBI_STAT_FAULT_USSEPDS (1 << 8)
14200+#define _PSB_CBI_STAT_FAULT_HOST (1 << 9)
14201+
14202+#define PSB_CR_BIF_BANK0 0x0C78
14203+
14204+#define PSB_CR_BIF_BANK1 0x0C7C
14205+
14206+#define PSB_CR_BIF_DIR_LIST_BASE0 0x0C84
14207+
14208+#define PSB_CR_BIF_TWOD_REQ_BASE 0x0C88
14209+#define PSB_CR_BIF_3D_REQ_BASE 0x0CAC
14210+
14211+#define PSB_CR_2D_SOCIF 0x0E18
14212+#define _PSB_C2_SOCIF_FREESPACE_SHIFT (0)
14213+#define _PSB_C2_SOCIF_FREESPACE_MASK (0xFF << 0)
14214+#define _PSB_C2_SOCIF_EMPTY (0x80 << 0)
14215+
14216+#define PSB_CR_2D_BLIT_STATUS 0x0E04
14217+#define _PSB_C2B_STATUS_BUSY (1 << 24)
14218+#define _PSB_C2B_STATUS_COMPLETE_SHIFT (0)
14219+#define _PSB_C2B_STATUS_COMPLETE_MASK (0xFFFFFF << 0)
14220+
14221+/*
14222+ * 2D defs.
14223+ */
14224+
14225+/*
14226+ * 2D Slave Port Data : Block Header's Object Type
14227+ */
14228+
14229+#define PSB_2D_CLIP_BH (0x00000000)
14230+#define PSB_2D_PAT_BH (0x10000000)
14231+#define PSB_2D_CTRL_BH (0x20000000)
14232+#define PSB_2D_SRC_OFF_BH (0x30000000)
14233+#define PSB_2D_MASK_OFF_BH (0x40000000)
14234+#define PSB_2D_RESERVED1_BH (0x50000000)
14235+#define PSB_2D_RESERVED2_BH (0x60000000)
14236+#define PSB_2D_FENCE_BH (0x70000000)
14237+#define PSB_2D_BLIT_BH (0x80000000)
14238+#define PSB_2D_SRC_SURF_BH (0x90000000)
14239+#define PSB_2D_DST_SURF_BH (0xA0000000)
14240+#define PSB_2D_PAT_SURF_BH (0xB0000000)
14241+#define PSB_2D_SRC_PAL_BH (0xC0000000)
14242+#define PSB_2D_PAT_PAL_BH (0xD0000000)
14243+#define PSB_2D_MASK_SURF_BH (0xE0000000)
14244+#define PSB_2D_FLUSH_BH (0xF0000000)
14245+
14246+/*
14247+ * Clip Definition block (PSB_2D_CLIP_BH)
14248+ */
14249+#define PSB_2D_CLIPCOUNT_MAX (1)
14250+#define PSB_2D_CLIPCOUNT_MASK (0x00000000)
14251+#define PSB_2D_CLIPCOUNT_CLRMASK (0xFFFFFFFF)
14252+#define PSB_2D_CLIPCOUNT_SHIFT (0)
14253+// clip rectangle min & max
14254+#define PSB_2D_CLIP_XMAX_MASK (0x00FFF000)
14255+#define PSB_2D_CLIP_XMAX_CLRMASK (0xFF000FFF)
14256+#define PSB_2D_CLIP_XMAX_SHIFT (12)
14257+#define PSB_2D_CLIP_XMIN_MASK (0x00000FFF)
14258+#define PSB_2D_CLIP_XMIN_CLRMASK (0x00FFF000)
14259+#define PSB_2D_CLIP_XMIN_SHIFT (0)
14260+// clip rectangle offset
14261+#define PSB_2D_CLIP_YMAX_MASK (0x00FFF000)
14262+#define PSB_2D_CLIP_YMAX_CLRMASK (0xFF000FFF)
14263+#define PSB_2D_CLIP_YMAX_SHIFT (12)
14264+#define PSB_2D_CLIP_YMIN_MASK (0x00000FFF)
14265+#define PSB_2D_CLIP_YMIN_CLRMASK (0x00FFF000)
14266+#define PSB_2D_CLIP_YMIN_SHIFT (0)
14267+
14268+/*
14269+ * Pattern Control (PSB_2D_PAT_BH)
14270+ */
14271+#define PSB_2D_PAT_HEIGHT_MASK (0x0000001F)
14272+#define PSB_2D_PAT_HEIGHT_SHIFT (0)
14273+#define PSB_2D_PAT_WIDTH_MASK (0x000003E0)
14274+#define PSB_2D_PAT_WIDTH_SHIFT (5)
14275+#define PSB_2D_PAT_YSTART_MASK (0x00007C00)
14276+#define PSB_2D_PAT_YSTART_SHIFT (10)
14277+#define PSB_2D_PAT_XSTART_MASK (0x000F8000)
14278+#define PSB_2D_PAT_XSTART_SHIFT (15)
14279+
14280+/*
14281+ * 2D Control block (PSB_2D_CTRL_BH)
14282+ */
14283+// Present Flags
14284+#define PSB_2D_SRCCK_CTRL (0x00000001)
14285+#define PSB_2D_DSTCK_CTRL (0x00000002)
14286+#define PSB_2D_ALPHA_CTRL (0x00000004)
14287+// Colour Key Colour (SRC/DST)
14288+#define PSB_2D_CK_COL_MASK (0xFFFFFFFF)
14289+#define PSB_2D_CK_COL_CLRMASK (0x00000000)
14290+#define PSB_2D_CK_COL_SHIFT (0)
14291+// Colour Key Mask (SRC/DST)
14292+#define PSB_2D_CK_MASK_MASK (0xFFFFFFFF)
14293+#define PSB_2D_CK_MASK_CLRMASK (0x00000000)
14294+#define PSB_2D_CK_MASK_SHIFT (0)
14295+// Alpha Control (Alpha/RGB)
14296+#define PSB_2D_GBLALPHA_MASK (0x000FF000)
14297+#define PSB_2D_GBLALPHA_CLRMASK (0xFFF00FFF)
14298+#define PSB_2D_GBLALPHA_SHIFT (12)
14299+#define PSB_2D_SRCALPHA_OP_MASK (0x00700000)
14300+#define PSB_2D_SRCALPHA_OP_CLRMASK (0xFF8FFFFF)
14301+#define PSB_2D_SRCALPHA_OP_SHIFT (20)
14302+#define PSB_2D_SRCALPHA_OP_ONE (0x00000000)
14303+#define PSB_2D_SRCALPHA_OP_SRC (0x00100000)
14304+#define PSB_2D_SRCALPHA_OP_DST (0x00200000)
14305+#define PSB_2D_SRCALPHA_OP_SG (0x00300000)
14306+#define PSB_2D_SRCALPHA_OP_DG (0x00400000)
14307+#define PSB_2D_SRCALPHA_OP_GBL (0x00500000)
14308+#define PSB_2D_SRCALPHA_OP_ZERO (0x00600000)
14309+#define PSB_2D_SRCALPHA_INVERT (0x00800000)
14310+#define PSB_2D_SRCALPHA_INVERT_CLR (0xFF7FFFFF)
14311+#define PSB_2D_DSTALPHA_OP_MASK (0x07000000)
14312+#define PSB_2D_DSTALPHA_OP_CLRMASK (0xF8FFFFFF)
14313+#define PSB_2D_DSTALPHA_OP_SHIFT (24)
14314+#define PSB_2D_DSTALPHA_OP_ONE (0x00000000)
14315+#define PSB_2D_DSTALPHA_OP_SRC (0x01000000)
14316+#define PSB_2D_DSTALPHA_OP_DST (0x02000000)
14317+#define PSB_2D_DSTALPHA_OP_SG (0x03000000)
14318+#define PSB_2D_DSTALPHA_OP_DG (0x04000000)
14319+#define PSB_2D_DSTALPHA_OP_GBL (0x05000000)
14320+#define PSB_2D_DSTALPHA_OP_ZERO (0x06000000)
14321+#define PSB_2D_DSTALPHA_INVERT (0x08000000)
14322+#define PSB_2D_DSTALPHA_INVERT_CLR (0xF7FFFFFF)
14323+
14324+#define PSB_2D_PRE_MULTIPLICATION_ENABLE (0x10000000)
14325+#define PSB_2D_PRE_MULTIPLICATION_CLRMASK (0xEFFFFFFF)
14326+#define PSB_2D_ZERO_SOURCE_ALPHA_ENABLE (0x20000000)
14327+#define PSB_2D_ZERO_SOURCE_ALPHA_CLRMASK (0xDFFFFFFF)
14328+
14329+/*
14330+ *Source Offset (PSB_2D_SRC_OFF_BH)
14331+ */
14332+#define PSB_2D_SRCOFF_XSTART_MASK ((0x00000FFF) << 12)
14333+#define PSB_2D_SRCOFF_XSTART_SHIFT (12)
14334+#define PSB_2D_SRCOFF_YSTART_MASK (0x00000FFF)
14335+#define PSB_2D_SRCOFF_YSTART_SHIFT (0)
14336+
14337+/*
14338+ * Mask Offset (PSB_2D_MASK_OFF_BH)
14339+ */
14340+#define PSB_2D_MASKOFF_XSTART_MASK ((0x00000FFF) << 12)
14341+#define PSB_2D_MASKOFF_XSTART_SHIFT (12)
14342+#define PSB_2D_MASKOFF_YSTART_MASK (0x00000FFF)
14343+#define PSB_2D_MASKOFF_YSTART_SHIFT (0)
14344+
14345+/*
14346+ * 2D Fence (see PSB_2D_FENCE_BH): bits 0:27 are ignored
14347+ */
14348+
14349+/*
14350+ *Blit Rectangle (PSB_2D_BLIT_BH)
14351+ */
14352+
14353+#define PSB_2D_ROT_MASK (3<<25)
14354+#define PSB_2D_ROT_CLRMASK (~PSB_2D_ROT_MASK)
14355+#define PSB_2D_ROT_NONE (0<<25)
14356+#define PSB_2D_ROT_90DEGS (1<<25)
14357+#define PSB_2D_ROT_180DEGS (2<<25)
14358+#define PSB_2D_ROT_270DEGS (3<<25)
14359+
14360+#define PSB_2D_COPYORDER_MASK (3<<23)
14361+#define PSB_2D_COPYORDER_CLRMASK (~PSB_2D_COPYORDER_MASK)
14362+#define PSB_2D_COPYORDER_TL2BR (0<<23)
14363+#define PSB_2D_COPYORDER_BR2TL (1<<23)
14364+#define PSB_2D_COPYORDER_TR2BL (2<<23)
14365+#define PSB_2D_COPYORDER_BL2TR (3<<23)
14366+
14367+#define PSB_2D_DSTCK_CLRMASK (0xFF9FFFFF)
14368+#define PSB_2D_DSTCK_DISABLE (0x00000000)
14369+#define PSB_2D_DSTCK_PASS (0x00200000)
14370+#define PSB_2D_DSTCK_REJECT (0x00400000)
14371+
14372+#define PSB_2D_SRCCK_CLRMASK (0xFFE7FFFF)
14373+#define PSB_2D_SRCCK_DISABLE (0x00000000)
14374+#define PSB_2D_SRCCK_PASS (0x00080000)
14375+#define PSB_2D_SRCCK_REJECT (0x00100000)
14376+
14377+#define PSB_2D_CLIP_ENABLE (0x00040000)
14378+
14379+#define PSB_2D_ALPHA_ENABLE (0x00020000)
14380+
14381+#define PSB_2D_PAT_CLRMASK (0xFFFEFFFF)
14382+#define PSB_2D_PAT_MASK (0x00010000)
14383+#define PSB_2D_USE_PAT (0x00010000)
14384+#define PSB_2D_USE_FILL (0x00000000)
14385+/*
14386+ * Tungsten Graphics note on rop codes: If rop A and rop B are
14387+ * identical, the mask surface will not be read and need not be
14388+ * set up.
14389+ */
14390+
14391+#define PSB_2D_ROP3B_MASK (0x0000FF00)
14392+#define PSB_2D_ROP3B_CLRMASK (0xFFFF00FF)
14393+#define PSB_2D_ROP3B_SHIFT (8)
14394+// rop code A
14395+#define PSB_2D_ROP3A_MASK (0x000000FF)
14396+#define PSB_2D_ROP3A_CLRMASK (0xFFFFFF00)
14397+#define PSB_2D_ROP3A_SHIFT (0)
14398+
14399+#define PSB_2D_ROP4_MASK (0x0000FFFF)
14400+/*
14401+ * DWORD0: (Only pass if Pattern control == Use Fill Colour)
14402+ * Fill Colour RGBA8888
14403+ */
14404+#define PSB_2D_FILLCOLOUR_MASK (0xFFFFFFFF)
14405+#define PSB_2D_FILLCOLOUR_SHIFT (0)
14406+/*
14407+ * DWORD1: (Always Present)
14408+ * X Start (Dest)
14409+ * Y Start (Dest)
14410+ */
14411+#define PSB_2D_DST_XSTART_MASK (0x00FFF000)
14412+#define PSB_2D_DST_XSTART_CLRMASK (0xFF000FFF)
14413+#define PSB_2D_DST_XSTART_SHIFT (12)
14414+#define PSB_2D_DST_YSTART_MASK (0x00000FFF)
14415+#define PSB_2D_DST_YSTART_CLRMASK (0xFFFFF000)
14416+#define PSB_2D_DST_YSTART_SHIFT (0)
14417+/*
14418+ * DWORD2: (Always Present)
14419+ * X Size (Dest)
14420+ * Y Size (Dest)
14421+ */
14422+#define PSB_2D_DST_XSIZE_MASK (0x00FFF000)
14423+#define PSB_2D_DST_XSIZE_CLRMASK (0xFF000FFF)
14424+#define PSB_2D_DST_XSIZE_SHIFT (12)
14425+#define PSB_2D_DST_YSIZE_MASK (0x00000FFF)
14426+#define PSB_2D_DST_YSIZE_CLRMASK (0xFFFFF000)
14427+#define PSB_2D_DST_YSIZE_SHIFT (0)
14428+
14429+/*
14430+ * Source Surface (PSB_2D_SRC_SURF_BH)
14431+ */
14432+/*
14433+ * WORD 0
14434+ */
14435+
14436+#define PSB_2D_SRC_FORMAT_MASK (0x00078000)
14437+#define PSB_2D_SRC_1_PAL (0x00000000)
14438+#define PSB_2D_SRC_2_PAL (0x00008000)
14439+#define PSB_2D_SRC_4_PAL (0x00010000)
14440+#define PSB_2D_SRC_8_PAL (0x00018000)
14441+#define PSB_2D_SRC_8_ALPHA (0x00020000)
14442+#define PSB_2D_SRC_4_ALPHA (0x00028000)
14443+#define PSB_2D_SRC_332RGB (0x00030000)
14444+#define PSB_2D_SRC_4444ARGB (0x00038000)
14445+#define PSB_2D_SRC_555RGB (0x00040000)
14446+#define PSB_2D_SRC_1555ARGB (0x00048000)
14447+#define PSB_2D_SRC_565RGB (0x00050000)
14448+#define PSB_2D_SRC_0888ARGB (0x00058000)
14449+#define PSB_2D_SRC_8888ARGB (0x00060000)
14450+#define PSB_2D_SRC_8888UYVY (0x00068000)
14451+#define PSB_2D_SRC_RESERVED (0x00070000)
14452+#define PSB_2D_SRC_1555ARGB_LOOKUP (0x00078000)
14453+
14454+
14455+#define PSB_2D_SRC_STRIDE_MASK (0x00007FFF)
14456+#define PSB_2D_SRC_STRIDE_CLRMASK (0xFFFF8000)
14457+#define PSB_2D_SRC_STRIDE_SHIFT (0)
14458+/*
14459+ * WORD 1 - Base Address
14460+ */
14461+#define PSB_2D_SRC_ADDR_MASK (0x0FFFFFFC)
14462+#define PSB_2D_SRC_ADDR_CLRMASK (0x00000003)
14463+#define PSB_2D_SRC_ADDR_SHIFT (2)
14464+#define PSB_2D_SRC_ADDR_ALIGNSHIFT (2)
14465+
14466+/*
14467+ * Pattern Surface (PSB_2D_PAT_SURF_BH)
14468+ */
14469+/*
14470+ * WORD 0
14471+ */
14472+
14473+#define PSB_2D_PAT_FORMAT_MASK (0x00078000)
14474+#define PSB_2D_PAT_1_PAL (0x00000000)
14475+#define PSB_2D_PAT_2_PAL (0x00008000)
14476+#define PSB_2D_PAT_4_PAL (0x00010000)
14477+#define PSB_2D_PAT_8_PAL (0x00018000)
14478+#define PSB_2D_PAT_8_ALPHA (0x00020000)
14479+#define PSB_2D_PAT_4_ALPHA (0x00028000)
14480+#define PSB_2D_PAT_332RGB (0x00030000)
14481+#define PSB_2D_PAT_4444ARGB (0x00038000)
14482+#define PSB_2D_PAT_555RGB (0x00040000)
14483+#define PSB_2D_PAT_1555ARGB (0x00048000)
14484+#define PSB_2D_PAT_565RGB (0x00050000)
14485+#define PSB_2D_PAT_0888ARGB (0x00058000)
14486+#define PSB_2D_PAT_8888ARGB (0x00060000)
14487+
14488+#define PSB_2D_PAT_STRIDE_MASK (0x00007FFF)
14489+#define PSB_2D_PAT_STRIDE_CLRMASK (0xFFFF8000)
14490+#define PSB_2D_PAT_STRIDE_SHIFT (0)
14491+/*
14492+ * WORD 1 - Base Address
14493+ */
14494+#define PSB_2D_PAT_ADDR_MASK (0x0FFFFFFC)
14495+#define PSB_2D_PAT_ADDR_CLRMASK (0x00000003)
14496+#define PSB_2D_PAT_ADDR_SHIFT (2)
14497+#define PSB_2D_PAT_ADDR_ALIGNSHIFT (2)
14498+
14499+/*
14500+ * Destination Surface (PSB_2D_DST_SURF_BH)
14501+ */
14502+/*
14503+ * WORD 0
14504+ */
14505+
14506+#define PSB_2D_DST_FORMAT_MASK (0x00078000)
14507+#define PSB_2D_DST_332RGB (0x00030000)
14508+#define PSB_2D_DST_4444ARGB (0x00038000)
14509+#define PSB_2D_DST_555RGB (0x00040000)
14510+#define PSB_2D_DST_1555ARGB (0x00048000)
14511+#define PSB_2D_DST_565RGB (0x00050000)
14512+#define PSB_2D_DST_0888ARGB (0x00058000)
14513+#define PSB_2D_DST_8888ARGB (0x00060000)
14514+#define PSB_2D_DST_8888AYUV (0x00070000)
14515+
14516+#define PSB_2D_DST_STRIDE_MASK (0x00007FFF)
14517+#define PSB_2D_DST_STRIDE_CLRMASK (0xFFFF8000)
14518+#define PSB_2D_DST_STRIDE_SHIFT (0)
14519+/*
14520+ * WORD 1 - Base Address
14521+ */
14522+#define PSB_2D_DST_ADDR_MASK (0x0FFFFFFC)
14523+#define PSB_2D_DST_ADDR_CLRMASK (0x00000003)
14524+#define PSB_2D_DST_ADDR_SHIFT (2)
14525+#define PSB_2D_DST_ADDR_ALIGNSHIFT (2)
14526+
14527+/*
14528+ * Mask Surface (PSB_2D_MASK_SURF_BH)
14529+ */
14530+/*
14531+ * WORD 0
14532+ */
14533+#define PSB_2D_MASK_STRIDE_MASK (0x00007FFF)
14534+#define PSB_2D_MASK_STRIDE_CLRMASK (0xFFFF8000)
14535+#define PSB_2D_MASK_STRIDE_SHIFT (0)
14536+/*
14537+ * WORD 1 - Base Address
14538+ */
14539+#define PSB_2D_MASK_ADDR_MASK (0x0FFFFFFC)
14540+#define PSB_2D_MASK_ADDR_CLRMASK (0x00000003)
14541+#define PSB_2D_MASK_ADDR_SHIFT (2)
14542+#define PSB_2D_MASK_ADDR_ALIGNSHIFT (2)
14543+
14544+/*
14545+ * Source Palette (PSB_2D_SRC_PAL_BH)
14546+ */
14547+
14548+#define PSB_2D_SRCPAL_ADDR_SHIFT (0)
14549+#define PSB_2D_SRCPAL_ADDR_CLRMASK (0xF0000007)
14550+#define PSB_2D_SRCPAL_ADDR_MASK (0x0FFFFFF8)
14551+#define PSB_2D_SRCPAL_BYTEALIGN (1024)
14552+
14553+/*
14554+ * Pattern Palette (PSB_2D_PAT_PAL_BH)
14555+ */
14556+
14557+#define PSB_2D_PATPAL_ADDR_SHIFT (0)
14558+#define PSB_2D_PATPAL_ADDR_CLRMASK (0xF0000007)
14559+#define PSB_2D_PATPAL_ADDR_MASK (0x0FFFFFF8)
14560+#define PSB_2D_PATPAL_BYTEALIGN (1024)
14561+
14562+/*
14563+ * Rop3 Codes (2 LS bytes)
14564+ */
14565+
14566+#define PSB_2D_ROP3_SRCCOPY (0xCCCC)
14567+#define PSB_2D_ROP3_PATCOPY (0xF0F0)
14568+#define PSB_2D_ROP3_WHITENESS (0xFFFF)
14569+#define PSB_2D_ROP3_BLACKNESS (0x0000)
14570+#define PSB_2D_ROP3_SRC (0xCC)
14571+#define PSB_2D_ROP3_PAT (0xF0)
14572+#define PSB_2D_ROP3_DST (0xAA)
14573+
14574+
14575+/*
14576+ * Sizes.
14577+ */
14578+
14579+#define PSB_SCENE_HW_COOKIE_SIZE 16
14580+#define PSB_TA_MEM_HW_COOKIE_SIZE 16
14581+
14582+/*
14583+ * Scene stuff.
14584+ */
14585+
14586+#define PSB_NUM_HW_SCENES 2
14587+
14588+/*
14589+ * Scheduler completion actions.
14590+ */
14591+
14592+#define PSB_RASTER_BLOCK 0
14593+#define PSB_RASTER 1
14594+#define PSB_RETURN 2
14595+#define PSB_TA 3
14596+
14597+
14598+#endif
14599Index: linux-2.6.28/drivers/gpu/drm/psb/psb_regman.c
14600===================================================================
14601--- /dev/null 1970-01-01 00:00:00.000000000 +0000
14602+++ linux-2.6.28/drivers/gpu/drm/psb/psb_regman.c 2009-02-20 12:23:06.000000000 +0000
14603@@ -0,0 +1,175 @@
14604+/**************************************************************************
14605+ * Copyright (c) 2007, Intel Corporation.
14606+ * All Rights Reserved.
14607+ *
14608+ * This program is free software; you can redistribute it and/or modify it
14609+ * under the terms and conditions of the GNU General Public License,
14610+ * version 2, as published by the Free Software Foundation.
14611+ *
14612+ * This program is distributed in the hope it will be useful, but WITHOUT
14613+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14614+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14615+ * more details.
14616+ *
14617+ * You should have received a copy of the GNU General Public License along with
14618+ * this program; if not, write to the Free Software Foundation, Inc.,
14619+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
14620+ *
14621+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
14622+ * develop this driver.
14623+ *
14624+ **************************************************************************/
14625+/*
14626+ */
14627+
14628+#include "drmP.h"
14629+#include "psb_drv.h"
14630+
14631+struct psb_use_reg {
14632+ struct drm_reg reg;
14633+ struct drm_psb_private *dev_priv;
14634+ uint32_t reg_seq;
14635+ uint32_t base;
14636+ uint32_t data_master;
14637+};
14638+
14639+struct psb_use_reg_data {
14640+ uint32_t base;
14641+ uint32_t size;
14642+ uint32_t data_master;
14643+};
14644+
14645+static int psb_use_reg_reusable(const struct drm_reg *reg, const void *data)
14646+{
14647+ struct psb_use_reg *use_reg =
14648+ container_of(reg, struct psb_use_reg, reg);
14649+ struct psb_use_reg_data *use_data = (struct psb_use_reg_data *)data;
14650+
14651+ return ((use_reg->base <= use_data->base) &&
14652+ (use_reg->base + PSB_USE_OFFSET_SIZE >
14653+ use_data->base + use_data->size) &&
14654+ use_reg->data_master == use_data->data_master);
14655+}
14656+
14657+static int psb_use_reg_set(struct psb_use_reg *use_reg,
14658+ const struct psb_use_reg_data *use_data)
14659+{
14660+ struct drm_psb_private *dev_priv = use_reg->dev_priv;
14661+
14662+ if (use_reg->reg.fence == NULL)
14663+ use_reg->data_master = use_data->data_master;
14664+
14665+ if (use_reg->reg.fence == NULL &&
14666+ !psb_use_reg_reusable(&use_reg->reg, (const void *)use_data)) {
14667+
14668+ use_reg->base = use_data->base & ~PSB_USE_OFFSET_MASK;
14669+ use_reg->data_master = use_data->data_master;
14670+
14671+ if (!psb_use_reg_reusable(&use_reg->reg,
14672+ (const void *)use_data)) {
14673+ DRM_ERROR("USE base mechanism didn't support "
14674+ "buffer size or alignment\n");
14675+ return -EINVAL;
14676+ }
14677+
14678+ PSB_WSGX32(PSB_ALPL(use_reg->base, _PSB_CUC_BASE_ADDR) |
14679+ (use_reg->data_master << _PSB_CUC_BASE_DM_SHIFT),
14680+ PSB_CR_USE_CODE_BASE(use_reg->reg_seq));
14681+ }
14682+ return 0;
14683+
14684+}
14685+
14686+int psb_grab_use_base(struct drm_psb_private *dev_priv,
14687+ unsigned long base,
14688+ unsigned long size,
14689+ unsigned int data_master,
14690+ uint32_t fence_class,
14691+ uint32_t fence_type,
14692+ int no_wait,
14693+ int interruptible, int *r_reg, uint32_t * r_offset)
14694+{
14695+ struct psb_use_reg_data use_data = {
14696+ .base = base,
14697+ .size = size,
14698+ .data_master = data_master
14699+ };
14700+ int ret;
14701+
14702+ struct drm_reg *reg;
14703+ struct psb_use_reg *use_reg;
14704+
14705+ ret = drm_regs_alloc(&dev_priv->use_manager,
14706+ (const void *)&use_data,
14707+ fence_class,
14708+ fence_type, interruptible, no_wait, &reg);
14709+ if (ret)
14710+ return ret;
14711+
14712+ use_reg = container_of(reg, struct psb_use_reg, reg);
14713+ ret = psb_use_reg_set(use_reg, &use_data);
14714+
14715+ if (ret)
14716+ return ret;
14717+
14718+ *r_reg = use_reg->reg_seq;
14719+ *r_offset = base - use_reg->base;
14720+
14721+ return 0;
14722+};
14723+
14724+static void psb_use_reg_destroy(struct drm_reg *reg)
14725+{
14726+ struct psb_use_reg *use_reg =
14727+ container_of(reg, struct psb_use_reg, reg);
14728+ struct drm_psb_private *dev_priv = use_reg->dev_priv;
14729+
14730+ PSB_WSGX32(PSB_ALPL(0, _PSB_CUC_BASE_ADDR),
14731+ PSB_CR_USE_CODE_BASE(use_reg->reg_seq));
14732+
14733+ drm_free(use_reg, sizeof(*use_reg), DRM_MEM_DRIVER);
14734+}
14735+
14736+int psb_init_use_base(struct drm_psb_private *dev_priv,
14737+ unsigned int reg_start, unsigned int reg_num)
14738+{
14739+ struct psb_use_reg *use_reg;
14740+ int i;
14741+ int ret = 0;
14742+
14743+ mutex_lock(&dev_priv->cmdbuf_mutex);
14744+
14745+ drm_regs_init(&dev_priv->use_manager,
14746+ &psb_use_reg_reusable, &psb_use_reg_destroy);
14747+
14748+ for (i = reg_start; i < reg_start + reg_num; ++i) {
14749+ use_reg = drm_calloc(1, sizeof(*use_reg), DRM_MEM_DRIVER);
14750+ if (!use_reg) {
14751+ ret = -ENOMEM;
14752+ goto out;
14753+ }
14754+
14755+ use_reg->dev_priv = dev_priv;
14756+ use_reg->reg_seq = i;
14757+ use_reg->base = 0;
14758+ use_reg->data_master = _PSB_CUC_DM_PIXEL;
14759+
14760+ PSB_WSGX32(PSB_ALPL(use_reg->base, _PSB_CUC_BASE_ADDR) |
14761+ (use_reg->data_master << _PSB_CUC_BASE_DM_SHIFT),
14762+ PSB_CR_USE_CODE_BASE(use_reg->reg_seq));
14763+
14764+ drm_regs_add(&dev_priv->use_manager, &use_reg->reg);
14765+ }
14766+ out:
14767+ mutex_unlock(&dev_priv->cmdbuf_mutex);
14768+
14769+ return ret;
14770+
14771+}
14772+
14773+void psb_takedown_use_base(struct drm_psb_private *dev_priv)
14774+{
14775+ mutex_lock(&dev_priv->cmdbuf_mutex);
14776+ drm_regs_free(&dev_priv->use_manager);
14777+ mutex_unlock(&dev_priv->cmdbuf_mutex);
14778+}
14779Index: linux-2.6.28/drivers/gpu/drm/psb/psb_reset.c
14780===================================================================
14781--- /dev/null 1970-01-01 00:00:00.000000000 +0000
14782+++ linux-2.6.28/drivers/gpu/drm/psb/psb_reset.c 2009-02-20 12:23:06.000000000 +0000
14783@@ -0,0 +1,374 @@
14784+/**************************************************************************
14785+ * Copyright (c) 2007, Intel Corporation.
14786+ * All Rights Reserved.
14787+ *
14788+ * This program is free software; you can redistribute it and/or modify it
14789+ * under the terms and conditions of the GNU General Public License,
14790+ * version 2, as published by the Free Software Foundation.
14791+ *
14792+ * This program is distributed in the hope it will be useful, but WITHOUT
14793+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14794+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14795+ * more details.
14796+ *
14797+ * You should have received a copy of the GNU General Public License along with
14798+ * this program; if not, write to the Free Software Foundation, Inc.,
14799+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
14800+ *
14801+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
14802+ * develop this driver.
14803+ *
14804+ **************************************************************************/
14805+/*
14806+ * Authors:
14807+ * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
14808+ */
14809+
14810+#include "drmP.h"
14811+#include "psb_drv.h"
14812+#include "psb_reg.h"
14813+#include "psb_scene.h"
14814+#include "psb_msvdx.h"
14815+
14816+#define PSB_2D_TIMEOUT_MSEC 100
14817+
14818+void psb_reset(struct drm_psb_private *dev_priv, int reset_2d)
14819+{
14820+ uint32_t val;
14821+
14822+ val = _PSB_CS_RESET_BIF_RESET |
14823+ _PSB_CS_RESET_DPM_RESET |
14824+ _PSB_CS_RESET_TA_RESET |
14825+ _PSB_CS_RESET_USE_RESET |
14826+ _PSB_CS_RESET_ISP_RESET | _PSB_CS_RESET_TSP_RESET;
14827+
14828+ if (reset_2d)
14829+ val |= _PSB_CS_RESET_TWOD_RESET;
14830+
14831+ PSB_WSGX32(val, PSB_CR_SOFT_RESET);
14832+ (void)PSB_RSGX32(PSB_CR_SOFT_RESET);
14833+
14834+ msleep(1);
14835+
14836+ PSB_WSGX32(0, PSB_CR_SOFT_RESET);
14837+ wmb();
14838+ PSB_WSGX32(PSB_RSGX32(PSB_CR_BIF_CTRL) | _PSB_CB_CTRL_CLEAR_FAULT,
14839+ PSB_CR_BIF_CTRL);
14840+ wmb();
14841+ (void)PSB_RSGX32(PSB_CR_BIF_CTRL);
14842+
14843+ msleep(1);
14844+ PSB_WSGX32(PSB_RSGX32(PSB_CR_BIF_CTRL) & ~_PSB_CB_CTRL_CLEAR_FAULT,
14845+ PSB_CR_BIF_CTRL);
14846+ (void)PSB_RSGX32(PSB_CR_BIF_CTRL);
14847+}
14848+
14849+void psb_print_pagefault(struct drm_psb_private *dev_priv)
14850+{
14851+ uint32_t val;
14852+ uint32_t addr;
14853+
14854+ val = PSB_RSGX32(PSB_CR_BIF_INT_STAT);
14855+ addr = PSB_RSGX32(PSB_CR_BIF_FAULT);
14856+
14857+ if (val) {
14858+ if (val & _PSB_CBI_STAT_PF_N_RW)
14859+ DRM_ERROR("Poulsbo MMU page fault:\n");
14860+ else
14861+ DRM_ERROR("Poulsbo MMU read / write "
14862+ "protection fault:\n");
14863+
14864+ if (val & _PSB_CBI_STAT_FAULT_CACHE)
14865+ DRM_ERROR("\tCache requestor.\n");
14866+ if (val & _PSB_CBI_STAT_FAULT_TA)
14867+ DRM_ERROR("\tTA requestor.\n");
14868+ if (val & _PSB_CBI_STAT_FAULT_VDM)
14869+ DRM_ERROR("\tVDM requestor.\n");
14870+ if (val & _PSB_CBI_STAT_FAULT_2D)
14871+ DRM_ERROR("\t2D requestor.\n");
14872+ if (val & _PSB_CBI_STAT_FAULT_PBE)
14873+ DRM_ERROR("\tPBE requestor.\n");
14874+ if (val & _PSB_CBI_STAT_FAULT_TSP)
14875+ DRM_ERROR("\tTSP requestor.\n");
14876+ if (val & _PSB_CBI_STAT_FAULT_ISP)
14877+ DRM_ERROR("\tISP requestor.\n");
14878+ if (val & _PSB_CBI_STAT_FAULT_USSEPDS)
14879+ DRM_ERROR("\tUSSEPDS requestor.\n");
14880+ if (val & _PSB_CBI_STAT_FAULT_HOST)
14881+ DRM_ERROR("\tHost requestor.\n");
14882+
14883+ DRM_ERROR("\tMMU failing address is 0x%08x.\n", (unsigned)addr);
14884+ }
14885+}
14886+
14887+void psb_schedule_watchdog(struct drm_psb_private *dev_priv)
14888+{
14889+ struct timer_list *wt = &dev_priv->watchdog_timer;
14890+ unsigned long irq_flags;
14891+
14892+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
14893+ if (dev_priv->timer_available && !timer_pending(wt)) {
14894+ wt->expires = jiffies + PSB_WATCHDOG_DELAY;
14895+ add_timer(wt);
14896+ }
14897+ spin_unlock_irqrestore(&dev_priv->watchdog_lock, irq_flags);
14898+}
14899+
14900+#if 0
14901+static void psb_seq_lockup_idle(struct drm_psb_private *dev_priv,
14902+ unsigned int engine, int *lockup, int *idle)
14903+{
14904+ uint32_t received_seq;
14905+
14906+ received_seq = dev_priv->comm[engine << 4];
14907+ spin_lock(&dev_priv->sequence_lock);
14908+ *idle = (received_seq == dev_priv->sequence[engine]);
14909+ spin_unlock(&dev_priv->sequence_lock);
14910+
14911+ if (*idle) {
14912+ dev_priv->idle[engine] = 1;
14913+ *lockup = 0;
14914+ return;
14915+ }
14916+
14917+ if (dev_priv->idle[engine]) {
14918+ dev_priv->idle[engine] = 0;
14919+ dev_priv->last_sequence[engine] = received_seq;
14920+ *lockup = 0;
14921+ return;
14922+ }
14923+
14924+ *lockup = (dev_priv->last_sequence[engine] == received_seq);
14925+}
14926+
14927+#endif
14928+static void psb_watchdog_func(unsigned long data)
14929+{
14930+ struct drm_psb_private *dev_priv = (struct drm_psb_private *)data;
14931+ int lockup;
14932+ int msvdx_lockup;
14933+ int msvdx_idle;
14934+ int lockup_2d;
14935+ int idle_2d;
14936+ int idle;
14937+ unsigned long irq_flags;
14938+
14939+ psb_scheduler_lockup(dev_priv, &lockup, &idle);
14940+ psb_msvdx_lockup(dev_priv, &msvdx_lockup, &msvdx_idle);
14941+#if 0
14942+ psb_seq_lockup_idle(dev_priv, PSB_ENGINE_2D, &lockup_2d, &idle_2d);
14943+#else
14944+ lockup_2d = 0;
14945+ idle_2d = 1;
14946+#endif
14947+ if (lockup || msvdx_lockup || lockup_2d) {
14948+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
14949+ dev_priv->timer_available = 0;
14950+ spin_unlock_irqrestore(&dev_priv->watchdog_lock, irq_flags);
14951+ if (lockup) {
14952+ psb_print_pagefault(dev_priv);
14953+ schedule_work(&dev_priv->watchdog_wq);
14954+ }
14955+ if (msvdx_lockup)
14956+ schedule_work(&dev_priv->msvdx_watchdog_wq);
14957+ }
14958+ if (!idle || !msvdx_idle || !idle_2d)
14959+ psb_schedule_watchdog(dev_priv);
14960+}
14961+
14962+void psb_msvdx_flush_cmd_queue(struct drm_device *dev)
14963+{
14964+ struct drm_psb_private *dev_priv = dev->dev_private;
14965+ struct psb_msvdx_cmd_queue *msvdx_cmd;
14966+ struct list_head *list, *next;
14967+ /*Flush the msvdx cmd queue and signal all fences in the queue */
14968+ list_for_each_safe(list, next, &dev_priv->msvdx_queue) {
14969+ msvdx_cmd = list_entry(list, struct psb_msvdx_cmd_queue, head);
14970+ PSB_DEBUG_GENERAL("MSVDXQUE: flushing sequence:%d\n",
14971+ msvdx_cmd->sequence);
14972+ dev_priv->msvdx_current_sequence = msvdx_cmd->sequence;
14973+ psb_fence_error(dev, PSB_ENGINE_VIDEO,
14974+ dev_priv->msvdx_current_sequence,
14975+ DRM_FENCE_TYPE_EXE, DRM_CMD_HANG);
14976+ list_del(list);
14977+ kfree(msvdx_cmd->cmd);
14978+ drm_free(msvdx_cmd, sizeof(struct psb_msvdx_cmd_queue),
14979+ DRM_MEM_DRIVER);
14980+ }
14981+}
14982+
14983+static void psb_msvdx_reset_wq(struct work_struct *work)
14984+{
14985+ struct drm_psb_private *dev_priv =
14986+ container_of(work, struct drm_psb_private, msvdx_watchdog_wq);
14987+
14988+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
14989+ unsigned long irq_flags;
14990+
14991+ mutex_lock(&dev_priv->msvdx_mutex);
14992+ dev_priv->msvdx_needs_reset = 1;
14993+ dev_priv->msvdx_current_sequence++;
14994+ PSB_DEBUG_GENERAL
14995+ ("MSVDXFENCE: incremented msvdx_current_sequence to :%d\n",
14996+ dev_priv->msvdx_current_sequence);
14997+
14998+ psb_fence_error(scheduler->dev, PSB_ENGINE_VIDEO,
14999+ dev_priv->msvdx_current_sequence, DRM_FENCE_TYPE_EXE,
15000+ DRM_CMD_HANG);
15001+
15002+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
15003+ dev_priv->timer_available = 1;
15004+ spin_unlock_irqrestore(&dev_priv->watchdog_lock, irq_flags);
15005+
15006+ spin_lock_irqsave(&dev_priv->msvdx_lock, irq_flags);
15007+ psb_msvdx_flush_cmd_queue(scheduler->dev);
15008+ spin_unlock_irqrestore(&dev_priv->msvdx_lock, irq_flags);
15009+
15010+ psb_schedule_watchdog(dev_priv);
15011+ mutex_unlock(&dev_priv->msvdx_mutex);
15012+}
15013+
15014+static int psb_xhw_mmu_reset(struct drm_psb_private *dev_priv)
15015+{
15016+ struct psb_xhw_buf buf;
15017+ uint32_t bif_ctrl;
15018+
15019+ INIT_LIST_HEAD(&buf.head);
15020+ psb_mmu_set_pd_context(psb_mmu_get_default_pd(dev_priv->mmu), 0);
15021+ bif_ctrl = PSB_RSGX32(PSB_CR_BIF_CTRL);
15022+ PSB_WSGX32(bif_ctrl |
15023+ _PSB_CB_CTRL_CLEAR_FAULT |
15024+ _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
15025+ (void)PSB_RSGX32(PSB_CR_BIF_CTRL);
15026+ msleep(1);
15027+ PSB_WSGX32(bif_ctrl, PSB_CR_BIF_CTRL);
15028+ (void)PSB_RSGX32(PSB_CR_BIF_CTRL);
15029+ return psb_xhw_reset_dpm(dev_priv, &buf);
15030+}
15031+
15032+/*
15033+ * Block command submission and reset hardware and schedulers.
15034+ */
15035+
15036+static void psb_reset_wq(struct work_struct *work)
15037+{
15038+ struct drm_psb_private *dev_priv =
15039+ container_of(work, struct drm_psb_private, watchdog_wq);
15040+ int lockup_2d;
15041+ int idle_2d;
15042+ unsigned long irq_flags;
15043+ int ret;
15044+ int reset_count = 0;
15045+ struct psb_xhw_buf buf;
15046+ uint32_t xhw_lockup;
15047+
15048+ /*
15049+ * Block command submission.
15050+ */
15051+
15052+ mutex_lock(&dev_priv->reset_mutex);
15053+
15054+ INIT_LIST_HEAD(&buf.head);
15055+ if (psb_xhw_check_lockup(dev_priv, &buf, &xhw_lockup) == 0) {
15056+ if (xhw_lockup == 0 && psb_extend_raster_timeout(dev_priv) == 0) {
15057+ /*
15058+ * no lockup, just re-schedule
15059+ */
15060+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
15061+ dev_priv->timer_available = 1;
15062+ spin_unlock_irqrestore(&dev_priv->watchdog_lock,
15063+ irq_flags);
15064+ psb_schedule_watchdog(dev_priv);
15065+ mutex_unlock(&dev_priv->reset_mutex);
15066+ return;
15067+ }
15068+ }
15069+#if 0
15070+ msleep(PSB_2D_TIMEOUT_MSEC);
15071+
15072+ psb_seq_lockup_idle(dev_priv, PSB_ENGINE_2D, &lockup_2d, &idle_2d);
15073+
15074+ if (lockup_2d) {
15075+ uint32_t seq_2d;
15076+ spin_lock(&dev_priv->sequence_lock);
15077+ seq_2d = dev_priv->sequence[PSB_ENGINE_2D];
15078+ spin_unlock(&dev_priv->sequence_lock);
15079+ psb_fence_error(dev_priv->scheduler.dev,
15080+ PSB_ENGINE_2D,
15081+ seq_2d, DRM_FENCE_TYPE_EXE, -EBUSY);
15082+ DRM_INFO("Resetting 2D engine.\n");
15083+ }
15084+
15085+ psb_reset(dev_priv, lockup_2d);
15086+#else
15087+ (void)lockup_2d;
15088+ (void)idle_2d;
15089+ psb_reset(dev_priv, 0);
15090+#endif
15091+ (void)psb_xhw_mmu_reset(dev_priv);
15092+ DRM_INFO("Resetting scheduler.\n");
15093+ psb_scheduler_pause(dev_priv);
15094+ psb_scheduler_reset(dev_priv, -EBUSY);
15095+ psb_scheduler_ta_mem_check(dev_priv);
15096+
15097+ while (dev_priv->ta_mem &&
15098+ !dev_priv->force_ta_mem_load && ++reset_count < 10) {
15099+
15100+ /*
15101+ * TA memory is currently fenced so offsets
15102+ * are valid. Reload offsets into the dpm now.
15103+ */
15104+
15105+ struct psb_xhw_buf buf;
15106+ INIT_LIST_HEAD(&buf.head);
15107+
15108+ msleep(100);
15109+ DRM_INFO("Trying to reload TA memory.\n");
15110+ ret = psb_xhw_ta_mem_load(dev_priv, &buf,
15111+ PSB_TA_MEM_FLAG_TA |
15112+ PSB_TA_MEM_FLAG_RASTER |
15113+ PSB_TA_MEM_FLAG_HOSTA |
15114+ PSB_TA_MEM_FLAG_HOSTD |
15115+ PSB_TA_MEM_FLAG_INIT,
15116+ dev_priv->ta_mem->ta_memory->offset,
15117+ dev_priv->ta_mem->hw_data->offset,
15118+ dev_priv->ta_mem->hw_cookie);
15119+ if (!ret)
15120+ break;
15121+
15122+ psb_reset(dev_priv, 0);
15123+ (void)psb_xhw_mmu_reset(dev_priv);
15124+ }
15125+
15126+ psb_scheduler_restart(dev_priv);
15127+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
15128+ dev_priv->timer_available = 1;
15129+ spin_unlock_irqrestore(&dev_priv->watchdog_lock, irq_flags);
15130+ mutex_unlock(&dev_priv->reset_mutex);
15131+}
15132+
15133+void psb_watchdog_init(struct drm_psb_private *dev_priv)
15134+{
15135+ struct timer_list *wt = &dev_priv->watchdog_timer;
15136+ unsigned long irq_flags;
15137+
15138+ dev_priv->watchdog_lock = SPIN_LOCK_UNLOCKED;
15139+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
15140+ init_timer(wt);
15141+ INIT_WORK(&dev_priv->watchdog_wq, &psb_reset_wq);
15142+ INIT_WORK(&dev_priv->msvdx_watchdog_wq, &psb_msvdx_reset_wq);
15143+ wt->data = (unsigned long)dev_priv;
15144+ wt->function = &psb_watchdog_func;
15145+ dev_priv->timer_available = 1;
15146+ spin_unlock_irqrestore(&dev_priv->watchdog_lock, irq_flags);
15147+}
15148+
15149+void psb_watchdog_takedown(struct drm_psb_private *dev_priv)
15150+{
15151+ unsigned long irq_flags;
15152+
15153+ spin_lock_irqsave(&dev_priv->watchdog_lock, irq_flags);
15154+ dev_priv->timer_available = 0;
15155+ spin_unlock_irqrestore(&dev_priv->watchdog_lock, irq_flags);
15156+ (void)del_timer_sync(&dev_priv->watchdog_timer);
15157+}
15158Index: linux-2.6.28/drivers/gpu/drm/psb/psb_scene.c
15159===================================================================
15160--- /dev/null 1970-01-01 00:00:00.000000000 +0000
15161+++ linux-2.6.28/drivers/gpu/drm/psb/psb_scene.c 2009-02-20 12:23:06.000000000 +0000
15162@@ -0,0 +1,531 @@
15163+/**************************************************************************
15164+ * Copyright (c) 2007, Intel Corporation.
15165+ * All Rights Reserved.
15166+ *
15167+ * This program is free software; you can redistribute it and/or modify it
15168+ * under the terms and conditions of the GNU General Public License,
15169+ * version 2, as published by the Free Software Foundation.
15170+ *
15171+ * This program is distributed in the hope it will be useful, but WITHOUT
15172+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15173+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15174+ * more details.
15175+ *
15176+ * You should have received a copy of the GNU General Public License along with
15177+ * this program; if not, write to the Free Software Foundation, Inc.,
15178+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
15179+ *
15180+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
15181+ * develop this driver.
15182+ *
15183+ **************************************************************************/
15184+/*
15185+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
15186+ */
15187+
15188+#include "drmP.h"
15189+#include "psb_drv.h"
15190+#include "psb_scene.h"
15191+
15192+void psb_clear_scene_atomic(struct psb_scene *scene)
15193+{
15194+ int i;
15195+ struct page *page;
15196+ void *v;
15197+
15198+ for (i = 0; i < scene->clear_num_pages; ++i) {
15199+ page = drm_ttm_get_page(scene->hw_data->ttm,
15200+ scene->clear_p_start + i);
15201+ if (in_irq())
15202+ v = kmap_atomic(page, KM_IRQ0);
15203+ else
15204+ v = kmap_atomic(page, KM_USER0);
15205+
15206+ memset(v, 0, PAGE_SIZE);
15207+
15208+ if (in_irq())
15209+ kunmap_atomic(v, KM_IRQ0);
15210+ else
15211+ kunmap_atomic(v, KM_USER0);
15212+ }
15213+}
15214+
15215+int psb_clear_scene(struct psb_scene *scene)
15216+{
15217+ struct drm_bo_kmap_obj bmo;
15218+ int is_iomem;
15219+ void *addr;
15220+
15221+ int ret = drm_bo_kmap(scene->hw_data, scene->clear_p_start,
15222+ scene->clear_num_pages, &bmo);
15223+
15224+ PSB_DEBUG_RENDER("Scene clear\n");
15225+ if (ret)
15226+ return ret;
15227+
15228+ addr = drm_bmo_virtual(&bmo, &is_iomem);
15229+ BUG_ON(is_iomem);
15230+ memset(addr, 0, scene->clear_num_pages << PAGE_SHIFT);
15231+ drm_bo_kunmap(&bmo);
15232+
15233+ return 0;
15234+}
15235+
15236+static void psb_destroy_scene_devlocked(struct psb_scene *scene)
15237+{
15238+ if (!scene)
15239+ return;
15240+
15241+ PSB_DEBUG_RENDER("Scene destroy\n");
15242+ drm_bo_usage_deref_locked(&scene->hw_data);
15243+ drm_free(scene, sizeof(*scene), DRM_MEM_DRIVER);
15244+}
15245+
15246+void psb_scene_unref_devlocked(struct psb_scene **scene)
15247+{
15248+ struct psb_scene *tmp_scene = *scene;
15249+
15250+ PSB_DEBUG_RENDER("Scene unref\n");
15251+ *scene = NULL;
15252+ if (atomic_dec_and_test(&tmp_scene->ref_count)) {
15253+ psb_scheduler_remove_scene_refs(tmp_scene);
15254+ psb_destroy_scene_devlocked(tmp_scene);
15255+ }
15256+}
15257+
15258+struct psb_scene *psb_scene_ref(struct psb_scene *src)
15259+{
15260+ PSB_DEBUG_RENDER("Scene ref\n");
15261+ atomic_inc(&src->ref_count);
15262+ return src;
15263+}
15264+
15265+static struct psb_scene *psb_alloc_scene(struct drm_device *dev,
15266+ uint32_t w, uint32_t h)
15267+{
15268+ struct drm_psb_private *dev_priv =
15269+ (struct drm_psb_private *)dev->dev_private;
15270+ int ret = -EINVAL;
15271+ struct psb_scene *scene;
15272+ uint32_t bo_size;
15273+ struct psb_xhw_buf buf;
15274+
15275+ PSB_DEBUG_RENDER("Alloc scene w %u h %u\n", w, h);
15276+
15277+ scene = drm_calloc(1, sizeof(*scene), DRM_MEM_DRIVER);
15278+
15279+ if (!scene) {
15280+ DRM_ERROR("Out of memory allocating scene object.\n");
15281+ return NULL;
15282+ }
15283+
15284+ scene->dev = dev;
15285+ scene->w = w;
15286+ scene->h = h;
15287+ scene->hw_scene = NULL;
15288+ atomic_set(&scene->ref_count, 1);
15289+
15290+ INIT_LIST_HEAD(&buf.head);
15291+ ret = psb_xhw_scene_info(dev_priv, &buf, scene->w, scene->h,
15292+ scene->hw_cookie, &bo_size,
15293+ &scene->clear_p_start,
15294+ &scene->clear_num_pages);
15295+ if (ret)
15296+ goto out_err;
15297+
15298+ ret = drm_buffer_object_create(dev, bo_size, drm_bo_type_kernel,
15299+ DRM_PSB_FLAG_MEM_MMU |
15300+ DRM_BO_FLAG_READ |
15301+ DRM_BO_FLAG_CACHED |
15302+ PSB_BO_FLAG_SCENE |
15303+ DRM_BO_FLAG_WRITE,
15304+ DRM_BO_HINT_DONT_FENCE,
15305+ 0, 0, &scene->hw_data);
15306+ if (ret)
15307+ goto out_err;
15308+
15309+ return scene;
15310+ out_err:
15311+ drm_free(scene, sizeof(*scene), DRM_MEM_DRIVER);
15312+ return NULL;
15313+}
15314+
15315+int psb_validate_scene_pool(struct psb_scene_pool *pool, uint64_t flags,
15316+ uint64_t mask,
15317+ uint32_t hint,
15318+ uint32_t w,
15319+ uint32_t h,
15320+ int final_pass, struct psb_scene **scene_p)
15321+{
15322+ struct drm_device *dev = pool->dev;
15323+ struct drm_psb_private *dev_priv =
15324+ (struct drm_psb_private *)dev->dev_private;
15325+ struct psb_scene *scene = pool->scenes[pool->cur_scene];
15326+ int ret;
15327+ unsigned long irq_flags;
15328+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
15329+ uint32_t bin_pt_offset;
15330+ uint32_t bin_param_offset;
15331+
15332+ PSB_DEBUG_RENDER("Validate scene pool. Scene %u\n", pool->cur_scene);
15333+
15334+ if (unlikely(!dev_priv->ta_mem)) {
15335+ dev_priv->ta_mem =
15336+ psb_alloc_ta_mem(dev, dev_priv->ta_mem_pages);
15337+ if (!dev_priv->ta_mem)
15338+ return -ENOMEM;
15339+
15340+ bin_pt_offset = ~0;
15341+ bin_param_offset = ~0;
15342+ } else {
15343+ bin_pt_offset = dev_priv->ta_mem->hw_data->offset;
15344+ bin_param_offset = dev_priv->ta_mem->ta_memory->offset;
15345+ }
15346+
15347+ pool->w = w;
15348+ pool->h = h;
15349+ if (scene && (scene->w != pool->w || scene->h != pool->h)) {
15350+ spin_lock_irqsave(&scheduler->lock, irq_flags);
15351+ if (scene->flags & PSB_SCENE_FLAG_DIRTY) {
15352+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
15353+ DRM_ERROR("Trying to resize a dirty scene.\n");
15354+ return -EINVAL;
15355+ }
15356+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
15357+ mutex_lock(&dev->struct_mutex);
15358+ psb_scene_unref_devlocked(&pool->scenes[pool->cur_scene]);
15359+ mutex_unlock(&dev->struct_mutex);
15360+ scene = NULL;
15361+ }
15362+
15363+ if (!scene) {
15364+ pool->scenes[pool->cur_scene] = scene =
15365+ psb_alloc_scene(pool->dev, pool->w, pool->h);
15366+
15367+ if (!scene)
15368+ return -ENOMEM;
15369+
15370+ scene->flags = PSB_SCENE_FLAG_CLEARED;
15371+ }
15372+
15373+ /*
15374+ * FIXME: We need atomic bit manipulation here for the
15375+ * scheduler. For now use the spinlock.
15376+ */
15377+
15378+ spin_lock_irqsave(&scheduler->lock, irq_flags);
15379+ if (!(scene->flags & PSB_SCENE_FLAG_CLEARED)) {
15380+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
15381+ PSB_DEBUG_RENDER("Waiting to clear scene memory.\n");
15382+ mutex_lock(&scene->hw_data->mutex);
15383+ ret = drm_bo_wait(scene->hw_data, 0, 0, 0);
15384+ mutex_unlock(&scene->hw_data->mutex);
15385+ if (ret)
15386+ return ret;
15387+
15388+ ret = psb_clear_scene(scene);
15389+
15390+ if (ret)
15391+ return ret;
15392+ spin_lock_irqsave(&scheduler->lock, irq_flags);
15393+ scene->flags |= PSB_SCENE_FLAG_CLEARED;
15394+ }
15395+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
15396+
15397+ ret = drm_bo_do_validate(scene->hw_data, flags, mask, hint,
15398+ PSB_ENGINE_TA, 0, NULL);
15399+ if (ret)
15400+ return ret;
15401+ ret = drm_bo_do_validate(dev_priv->ta_mem->hw_data, 0, 0, 0,
15402+ PSB_ENGINE_TA, 0, NULL);
15403+ if (ret)
15404+ return ret;
15405+ ret = drm_bo_do_validate(dev_priv->ta_mem->ta_memory, 0, 0, 0,
15406+ PSB_ENGINE_TA, 0, NULL);
15407+ if (ret)
15408+ return ret;
15409+
15410+ if (unlikely(bin_param_offset !=
15411+ dev_priv->ta_mem->ta_memory->offset ||
15412+ bin_pt_offset !=
15413+ dev_priv->ta_mem->hw_data->offset ||
15414+ dev_priv->force_ta_mem_load)) {
15415+
15416+ struct psb_xhw_buf buf;
15417+
15418+ INIT_LIST_HEAD(&buf.head);
15419+ ret = psb_xhw_ta_mem_load(dev_priv, &buf,
15420+ PSB_TA_MEM_FLAG_TA |
15421+ PSB_TA_MEM_FLAG_RASTER |
15422+ PSB_TA_MEM_FLAG_HOSTA |
15423+ PSB_TA_MEM_FLAG_HOSTD |
15424+ PSB_TA_MEM_FLAG_INIT,
15425+ dev_priv->ta_mem->ta_memory->offset,
15426+ dev_priv->ta_mem->hw_data->offset,
15427+ dev_priv->ta_mem->hw_cookie);
15428+ if (ret)
15429+ return ret;
15430+
15431+ dev_priv->force_ta_mem_load = 0;
15432+ }
15433+
15434+ if (final_pass) {
15435+
15436+ /*
15437+ * Clear the scene on next use. Advance the scene counter.
15438+ */
15439+
15440+ spin_lock_irqsave(&scheduler->lock, irq_flags);
15441+ scene->flags &= ~PSB_SCENE_FLAG_CLEARED;
15442+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
15443+ pool->cur_scene = (pool->cur_scene + 1) % pool->num_scenes;
15444+ }
15445+
15446+ *scene_p = psb_scene_ref(scene);
15447+ return 0;
15448+}
15449+
15450+static void psb_scene_pool_destroy_devlocked(struct psb_scene_pool *pool)
15451+{
15452+ int i;
15453+
15454+ if (!pool)
15455+ return;
15456+
15457+ PSB_DEBUG_RENDER("Scene pool destroy.\n");
15458+ for (i = 0; i < pool->num_scenes; ++i) {
15459+ PSB_DEBUG_RENDER("scenes %d is 0x%08lx\n", i,
15460+ (unsigned long)pool->scenes[i]);
15461+ if (pool->scenes[i])
15462+ psb_scene_unref_devlocked(&pool->scenes[i]);
15463+ }
15464+ drm_free(pool, sizeof(*pool), DRM_MEM_DRIVER);
15465+}
15466+
15467+void psb_scene_pool_unref_devlocked(struct psb_scene_pool **pool)
15468+{
15469+ struct psb_scene_pool *tmp_pool = *pool;
15470+ struct drm_device *dev = tmp_pool->dev;
15471+
15472+ PSB_DEBUG_RENDER("Scene pool unref\n");
15473+ (void)dev;
15474+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
15475+ *pool = NULL;
15476+ if (--tmp_pool->ref_count == 0)
15477+ psb_scene_pool_destroy_devlocked(tmp_pool);
15478+}
15479+
15480+struct psb_scene_pool *psb_scene_pool_ref_devlocked(struct psb_scene_pool *src)
15481+{
15482+ ++src->ref_count;
15483+ return src;
15484+}
15485+
15486+/*
15487+ * Callback for user object manager.
15488+ */
15489+
15490+static void psb_scene_pool_destroy(struct drm_file *priv,
15491+ struct drm_user_object *base)
15492+{
15493+ struct psb_scene_pool *pool =
15494+ drm_user_object_entry(base, struct psb_scene_pool, user);
15495+
15496+ psb_scene_pool_unref_devlocked(&pool);
15497+}
15498+
15499+struct psb_scene_pool *psb_scene_pool_lookup_devlocked(struct drm_file *priv,
15500+ uint32_t handle,
15501+ int check_owner)
15502+{
15503+ struct drm_user_object *uo;
15504+ struct psb_scene_pool *pool;
15505+
15506+ uo = drm_lookup_user_object(priv, handle);
15507+ if (!uo || (uo->type != PSB_USER_OBJECT_SCENE_POOL)) {
15508+ DRM_ERROR("Could not find scene pool object 0x%08x\n", handle);
15509+ return NULL;
15510+ }
15511+
15512+ if (check_owner && priv != uo->owner) {
15513+ if (!drm_lookup_ref_object(priv, uo, _DRM_REF_USE))
15514+ return NULL;
15515+ }
15516+
15517+ pool = drm_user_object_entry(uo, struct psb_scene_pool, user);
15518+ return psb_scene_pool_ref_devlocked(pool);
15519+}
15520+
15521+struct psb_scene_pool *psb_scene_pool_alloc(struct drm_file *priv,
15522+ int shareable,
15523+ uint32_t num_scenes,
15524+ uint32_t w, uint32_t h)
15525+{
15526+ struct drm_device *dev = priv->minor->dev;
15527+ struct psb_scene_pool *pool;
15528+ int ret;
15529+
15530+ PSB_DEBUG_RENDER("Scene pool alloc\n");
15531+ pool = drm_calloc(1, sizeof(*pool), DRM_MEM_DRIVER);
15532+ if (!pool) {
15533+ DRM_ERROR("Out of memory allocating scene pool object.\n");
15534+ return NULL;
15535+ }
15536+ pool->w = w;
15537+ pool->h = h;
15538+ pool->dev = dev;
15539+ pool->num_scenes = num_scenes;
15540+
15541+ mutex_lock(&dev->struct_mutex);
15542+ ret = drm_add_user_object(priv, &pool->user, shareable);
15543+ if (ret)
15544+ goto out_err;
15545+
15546+ pool->user.type = PSB_USER_OBJECT_SCENE_POOL;
15547+ pool->user.remove = &psb_scene_pool_destroy;
15548+ pool->ref_count = 2;
15549+ mutex_unlock(&dev->struct_mutex);
15550+ return pool;
15551+ out_err:
15552+ drm_free(pool, sizeof(*pool), DRM_MEM_DRIVER);
15553+ return NULL;
15554+}
15555+
15556+/*
15557+ * Code to support multiple ta memory buffers.
15558+ */
15559+
15560+static void psb_destroy_ta_mem_devlocked(struct psb_ta_mem *ta_mem)
15561+{
15562+ if (!ta_mem)
15563+ return;
15564+
15565+ drm_bo_usage_deref_locked(&ta_mem->hw_data);
15566+ drm_bo_usage_deref_locked(&ta_mem->ta_memory);
15567+ drm_free(ta_mem, sizeof(*ta_mem), DRM_MEM_DRIVER);
15568+}
15569+
15570+void psb_ta_mem_unref_devlocked(struct psb_ta_mem **ta_mem)
15571+{
15572+ struct psb_ta_mem *tmp_ta_mem = *ta_mem;
15573+ struct drm_device *dev = tmp_ta_mem->dev;
15574+
15575+ (void)dev;
15576+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
15577+ *ta_mem = NULL;
15578+ if (--tmp_ta_mem->ref_count == 0)
15579+ psb_destroy_ta_mem_devlocked(tmp_ta_mem);
15580+}
15581+
15582+void psb_ta_mem_ref_devlocked(struct psb_ta_mem **dst, struct psb_ta_mem *src)
15583+{
15584+ struct drm_device *dev = src->dev;
15585+
15586+ (void)dev;
15587+ DRM_ASSERT_LOCKED(&dev->struct_mutex);
15588+ *dst = src;
15589+ ++src->ref_count;
15590+}
15591+
15592+struct psb_ta_mem *psb_alloc_ta_mem(struct drm_device *dev, uint32_t pages)
15593+{
15594+ struct drm_psb_private *dev_priv =
15595+ (struct drm_psb_private *)dev->dev_private;
15596+ int ret = -EINVAL;
15597+ struct psb_ta_mem *ta_mem;
15598+ uint32_t bo_size;
15599+ struct psb_xhw_buf buf;
15600+
15601+ INIT_LIST_HEAD(&buf.head);
15602+
15603+ ta_mem = drm_calloc(1, sizeof(*ta_mem), DRM_MEM_DRIVER);
15604+
15605+ if (!ta_mem) {
15606+ DRM_ERROR("Out of memory allocating parameter memory.\n");
15607+ return NULL;
15608+ }
15609+
15610+ ret = psb_xhw_ta_mem_info(dev_priv, &buf, pages,
15611+ ta_mem->hw_cookie, &bo_size);
15612+ if (ret == -ENOMEM) {
15613+ DRM_ERROR("Parameter memory size is too small.\n");
15614+ DRM_INFO("Attempted to use %u kiB of parameter memory.\n",
15615+ (unsigned int)(pages * (PAGE_SIZE / 1024)));
15616+ DRM_INFO("The Xpsb driver thinks this is too small and\n");
15617+ DRM_INFO("suggests %u kiB. Check the psb DRM\n",
15618+ (unsigned int)(bo_size / 1024));
15619+ DRM_INFO("\"ta_mem_size\" parameter!\n");
15620+ }
15621+ if (ret)
15622+ goto out_err0;
15623+
15624+ bo_size = pages * PAGE_SIZE;
15625+ ta_mem->dev = dev;
15626+ ret = drm_buffer_object_create(dev, bo_size, drm_bo_type_kernel,
15627+ DRM_PSB_FLAG_MEM_MMU | DRM_BO_FLAG_READ |
15628+ DRM_BO_FLAG_WRITE |
15629+ PSB_BO_FLAG_SCENE,
15630+ DRM_BO_HINT_DONT_FENCE, 0, 0,
15631+ &ta_mem->hw_data);
15632+ if (ret)
15633+ goto out_err0;
15634+
15635+ ret =
15636+ drm_buffer_object_create(dev, pages << PAGE_SHIFT,
15637+ drm_bo_type_kernel,
15638+ DRM_PSB_FLAG_MEM_RASTGEOM |
15639+ DRM_BO_FLAG_READ |
15640+ DRM_BO_FLAG_WRITE |
15641+ PSB_BO_FLAG_SCENE,
15642+ DRM_BO_HINT_DONT_FENCE, 0,
15643+ 1024 * 1024 >> PAGE_SHIFT,
15644+ &ta_mem->ta_memory);
15645+ if (ret)
15646+ goto out_err1;
15647+
15648+ ta_mem->ref_count = 1;
15649+ return ta_mem;
15650+ out_err1:
15651+ drm_bo_usage_deref_unlocked(&ta_mem->hw_data);
15652+ out_err0:
15653+ drm_free(ta_mem, sizeof(*ta_mem), DRM_MEM_DRIVER);
15654+ return NULL;
15655+}
15656+
15657+int drm_psb_scene_unref_ioctl(struct drm_device *dev,
15658+ void *data, struct drm_file *file_priv)
15659+{
15660+ struct drm_psb_scene *scene = (struct drm_psb_scene *)data;
15661+ struct drm_user_object *uo;
15662+ struct drm_ref_object *ro;
15663+ int ret = 0;
15664+
15665+ mutex_lock(&dev->struct_mutex);
15666+ if (!scene->handle_valid)
15667+ goto out_unlock;
15668+
15669+ uo = drm_lookup_user_object(file_priv, scene->handle);
15670+ if (!uo) {
15671+ ret = -EINVAL;
15672+ goto out_unlock;
15673+ }
15674+ if (uo->type != PSB_USER_OBJECT_SCENE_POOL) {
15675+ DRM_ERROR("Not a scene pool object.\n");
15676+ ret = -EINVAL;
15677+ goto out_unlock;
15678+ }
15679+ if (uo->owner != file_priv) {
15680+ DRM_ERROR("Not owner of scene pool object.\n");
15681+ ret = -EPERM;
15682+ goto out_unlock;
15683+ }
15684+
15685+ scene->handle_valid = 0;
15686+ ro = drm_lookup_ref_object(file_priv, uo, _DRM_REF_USE);
15687+ BUG_ON(!ro);
15688+ drm_remove_ref_object(file_priv, ro);
15689+
15690+ out_unlock:
15691+ mutex_unlock(&dev->struct_mutex);
15692+ return ret;
15693+}
15694Index: linux-2.6.28/drivers/gpu/drm/psb/psb_scene.h
15695===================================================================
15696--- /dev/null 1970-01-01 00:00:00.000000000 +0000
15697+++ linux-2.6.28/drivers/gpu/drm/psb/psb_scene.h 2009-02-20 12:23:06.000000000 +0000
15698@@ -0,0 +1,112 @@
15699+/**************************************************************************
15700+ * Copyright (c) 2007, Intel Corporation.
15701+ * All Rights Reserved.
15702+ *
15703+ * This program is free software; you can redistribute it and/or modify it
15704+ * under the terms and conditions of the GNU General Public License,
15705+ * version 2, as published by the Free Software Foundation.
15706+ *
15707+ * This program is distributed in the hope it will be useful, but WITHOUT
15708+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15709+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15710+ * more details.
15711+ *
15712+ * You should have received a copy of the GNU General Public License along with
15713+ * this program; if not, write to the Free Software Foundation, Inc.,
15714+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
15715+ *
15716+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
15717+ * develop this driver.
15718+ *
15719+ **************************************************************************/
15720+/*
15721+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
15722+ */
15723+
15724+#ifndef _PSB_SCENE_H_
15725+#define _PSB_SCENE_H_
15726+
15727+#define PSB_USER_OBJECT_SCENE_POOL drm_driver_type0
15728+#define PSB_USER_OBJECT_TA_MEM drm_driver_type1
15729+#define PSB_MAX_NUM_SCENES 8
15730+
15731+struct psb_hw_scene;
15732+struct psb_hw_ta_mem;
15733+
15734+struct psb_scene_pool {
15735+ struct drm_device *dev;
15736+ struct drm_user_object user;
15737+ uint32_t ref_count;
15738+ uint32_t w;
15739+ uint32_t h;
15740+ uint32_t cur_scene;
15741+ struct psb_scene *scenes[PSB_MAX_NUM_SCENES];
15742+ uint32_t num_scenes;
15743+};
15744+
15745+struct psb_scene {
15746+ struct drm_device *dev;
15747+ atomic_t ref_count;
15748+ uint32_t hw_cookie[PSB_SCENE_HW_COOKIE_SIZE];
15749+ uint32_t bo_size;
15750+ uint32_t w;
15751+ uint32_t h;
15752+ struct psb_ta_mem *ta_mem;
15753+ struct psb_hw_scene *hw_scene;
15754+ struct drm_buffer_object *hw_data;
15755+ uint32_t flags;
15756+ uint32_t clear_p_start;
15757+ uint32_t clear_num_pages;
15758+};
15759+
15760+struct psb_scene_entry {
15761+ struct list_head head;
15762+ struct psb_scene *scene;
15763+};
15764+
15765+struct psb_user_scene {
15766+ struct drm_device *dev;
15767+ struct drm_user_object user;
15768+};
15769+
15770+struct psb_ta_mem {
15771+ struct drm_device *dev;
15772+ struct drm_user_object user;
15773+ uint32_t ref_count;
15774+ uint32_t hw_cookie[PSB_TA_MEM_HW_COOKIE_SIZE];
15775+ uint32_t bo_size;
15776+ struct drm_buffer_object *ta_memory;
15777+ struct drm_buffer_object *hw_data;
15778+ int is_deallocating;
15779+ int deallocating_scheduled;
15780+};
15781+
15782+extern struct psb_scene_pool *psb_scene_pool_alloc(struct drm_file *priv,
15783+ int shareable,
15784+ uint32_t num_scenes,
15785+ uint32_t w, uint32_t h);
15786+extern void psb_scene_pool_unref_devlocked(struct psb_scene_pool **pool);
15787+extern struct psb_scene_pool *psb_scene_pool_lookup_devlocked(struct drm_file
15788+ *priv,
15789+ uint32_t handle,
15790+ int check_owner);
15791+extern int psb_validate_scene_pool(struct psb_scene_pool *pool, uint64_t flags,
15792+ uint64_t mask, uint32_t hint, uint32_t w,
15793+ uint32_t h, int final_pass,
15794+ struct psb_scene **scene_p);
15795+extern void psb_scene_unref_devlocked(struct psb_scene **scene);
15796+extern struct psb_scene *psb_scene_ref(struct psb_scene *src);
15797+extern int drm_psb_scene_unref_ioctl(struct drm_device *dev,
15798+ void *data, struct drm_file *file_priv);
15799+
15800+static inline uint32_t psb_scene_pool_handle(struct psb_scene_pool *pool)
15801+{
15802+ return pool->user.hash.key;
15803+}
15804+extern struct psb_ta_mem *psb_alloc_ta_mem(struct drm_device *dev,
15805+ uint32_t pages);
15806+extern void psb_ta_mem_ref_devlocked(struct psb_ta_mem **dst,
15807+ struct psb_ta_mem *src);
15808+extern void psb_ta_mem_unref_devlocked(struct psb_ta_mem **ta_mem);
15809+
15810+#endif
15811Index: linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.c
15812===================================================================
15813--- /dev/null 1970-01-01 00:00:00.000000000 +0000
15814+++ linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.c 2009-02-20 12:23:06.000000000 +0000
15815@@ -0,0 +1,1445 @@
15816+/**************************************************************************
15817+ * Copyright (c) 2007, Intel Corporation.
15818+ * All Rights Reserved.
15819+ *
15820+ * This program is free software; you can redistribute it and/or modify it
15821+ * under the terms and conditions of the GNU General Public License,
15822+ * version 2, as published by the Free Software Foundation.
15823+ *
15824+ * This program is distributed in the hope it will be useful, but WITHOUT
15825+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15826+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15827+ * more details.
15828+ *
15829+ * You should have received a copy of the GNU General Public License along with
15830+ * this program; if not, write to the Free Software Foundation, Inc.,
15831+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
15832+ *
15833+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
15834+ * develop this driver.
15835+ *
15836+ **************************************************************************/
15837+/*
15838+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
15839+ */
15840+
15841+#include "drmP.h"
15842+#include "psb_drm.h"
15843+#include "psb_drv.h"
15844+#include "psb_reg.h"
15845+#include "psb_scene.h"
15846+
15847+#define PSB_ALLOWED_RASTER_RUNTIME (DRM_HZ * 20)
15848+#define PSB_RASTER_TIMEOUT (DRM_HZ / 2)
15849+#define PSB_TA_TIMEOUT (DRM_HZ / 5)
15850+
15851+#undef PSB_SOFTWARE_WORKAHEAD
15852+
15853+#ifdef PSB_STABLE_SETTING
15854+
15855+/*
15856+ * Software blocks completely while the engines are working so there can be no
15857+ * overlap.
15858+ */
15859+
15860+#define PSB_WAIT_FOR_RASTER_COMPLETION
15861+#define PSB_WAIT_FOR_TA_COMPLETION
15862+
15863+#elif defined(PSB_PARANOID_SETTING)
15864+/*
15865+ * Software blocks "almost" while the engines are working so there can be no
15866+ * overlap.
15867+ */
15868+
15869+#define PSB_WAIT_FOR_RASTER_COMPLETION
15870+#define PSB_WAIT_FOR_TA_COMPLETION
15871+#define PSB_BE_PARANOID
15872+
15873+#elif defined(PSB_SOME_OVERLAP_BUT_LOCKUP)
15874+/*
15875+ * Software leaps ahead while the rasterizer is running and prepares
15876+ * a new ta job that can be scheduled before the rasterizer has
15877+ * finished.
15878+ */
15879+
15880+#define PSB_WAIT_FOR_TA_COMPLETION
15881+
15882+#elif defined(PSB_SOFTWARE_WORKAHEAD)
15883+/*
15884+ * Don't sync, but allow software to work ahead. and queue a number of jobs.
15885+ * But block overlapping in the scheduler.
15886+ */
15887+
15888+#define PSB_BLOCK_OVERLAP
15889+#define ONLY_ONE_JOB_IN_RASTER_QUEUE
15890+
15891+#endif
15892+
15893+/*
15894+ * Avoid pixelbe pagefaults on C0.
15895+ */
15896+#if 0
15897+#define PSB_BLOCK_OVERLAP
15898+#endif
15899+
15900+static void psb_dispatch_ta(struct drm_psb_private *dev_priv,
15901+ struct psb_scheduler *scheduler,
15902+ uint32_t reply_flag);
15903+static void psb_dispatch_raster(struct drm_psb_private *dev_priv,
15904+ struct psb_scheduler *scheduler,
15905+ uint32_t reply_flag);
15906+
15907+#ifdef FIX_TG_16
15908+
15909+static void psb_2d_atomic_unlock(struct drm_psb_private *dev_priv);
15910+static int psb_2d_trylock(struct drm_psb_private *dev_priv);
15911+static int psb_check_2d_idle(struct drm_psb_private *dev_priv);
15912+
15913+#endif
15914+
15915+void psb_scheduler_lockup(struct drm_psb_private *dev_priv,
15916+ int *lockup, int *idle)
15917+{
15918+ unsigned long irq_flags;
15919+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
15920+
15921+ *lockup = 0;
15922+ *idle = 1;
15923+
15924+ spin_lock_irqsave(&scheduler->lock, irq_flags);
15925+
15926+ if (scheduler->current_task[PSB_SCENE_ENGINE_TA] != NULL &&
15927+ time_after_eq(jiffies, scheduler->ta_end_jiffies)) {
15928+ *lockup = 1;
15929+ }
15930+ if (!*lockup
15931+ && (scheduler->current_task[PSB_SCENE_ENGINE_RASTER] != NULL)
15932+ && time_after_eq(jiffies, scheduler->raster_end_jiffies)) {
15933+ *lockup = 1;
15934+ }
15935+ if (!*lockup)
15936+ *idle = scheduler->idle;
15937+
15938+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
15939+}
15940+
15941+static inline void psb_set_idle(struct psb_scheduler *scheduler)
15942+{
15943+ scheduler->idle =
15944+ (scheduler->current_task[PSB_SCENE_ENGINE_RASTER] == NULL) &&
15945+ (scheduler->current_task[PSB_SCENE_ENGINE_TA] == NULL);
15946+ if (scheduler->idle)
15947+ wake_up(&scheduler->idle_queue);
15948+}
15949+
15950+/*
15951+ * Call with the scheduler spinlock held.
15952+ * Assigns a scene context to either the ta or the rasterizer,
15953+ * flushing out other scenes to memory if necessary.
15954+ */
15955+
15956+static int psb_set_scene_fire(struct psb_scheduler *scheduler,
15957+ struct psb_scene *scene,
15958+ int engine, struct psb_task *task)
15959+{
15960+ uint32_t flags = 0;
15961+ struct psb_hw_scene *hw_scene;
15962+ struct drm_device *dev = scene->dev;
15963+ struct drm_psb_private *dev_priv =
15964+ (struct drm_psb_private *)dev->dev_private;
15965+
15966+ hw_scene = scene->hw_scene;
15967+ if (hw_scene && hw_scene->last_scene == scene) {
15968+
15969+ /*
15970+ * Reuse the last hw scene context and delete it from the
15971+ * free list.
15972+ */
15973+
15974+ PSB_DEBUG_RENDER("Reusing hw scene %d.\n",
15975+ hw_scene->context_number);
15976+ if (scene->flags & PSB_SCENE_FLAG_DIRTY) {
15977+
15978+ /*
15979+ * No hw context initialization to be done.
15980+ */
15981+
15982+ flags |= PSB_SCENE_FLAG_SETUP_ONLY;
15983+ }
15984+
15985+ list_del_init(&hw_scene->head);
15986+
15987+ } else {
15988+ struct list_head *list;
15989+ hw_scene = NULL;
15990+
15991+ /*
15992+ * Grab a new hw scene context.
15993+ */
15994+
15995+ list_for_each(list, &scheduler->hw_scenes) {
15996+ hw_scene = list_entry(list, struct psb_hw_scene, head);
15997+ break;
15998+ }
15999+ BUG_ON(!hw_scene);
16000+ PSB_DEBUG_RENDER("New hw scene %d.\n",
16001+ hw_scene->context_number);
16002+
16003+ list_del_init(list);
16004+ }
16005+ scene->hw_scene = hw_scene;
16006+ hw_scene->last_scene = scene;
16007+
16008+ flags |= PSB_SCENE_FLAG_SETUP;
16009+
16010+ /*
16011+ * Switch context and setup the engine.
16012+ */
16013+
16014+ return psb_xhw_scene_bind_fire(dev_priv,
16015+ &task->buf,
16016+ task->flags,
16017+ hw_scene->context_number,
16018+ scene->hw_cookie,
16019+ task->oom_cmds,
16020+ task->oom_cmd_size,
16021+ scene->hw_data->offset,
16022+ engine, flags | scene->flags);
16023+}
16024+
16025+static inline void psb_report_fence(struct psb_scheduler *scheduler,
16026+ uint32_t class,
16027+ uint32_t sequence,
16028+ uint32_t type, int call_handler)
16029+{
16030+ struct psb_scheduler_seq *seq = &scheduler->seq[type];
16031+
16032+ seq->sequence = sequence;
16033+ seq->reported = 0;
16034+ if (call_handler)
16035+ psb_fence_handler(scheduler->dev, class);
16036+}
16037+
16038+static void psb_schedule_raster(struct drm_psb_private *dev_priv,
16039+ struct psb_scheduler *scheduler);
16040+
16041+static void psb_schedule_ta(struct drm_psb_private *dev_priv,
16042+ struct psb_scheduler *scheduler)
16043+{
16044+ struct psb_task *task = NULL;
16045+ struct list_head *list, *next;
16046+ int pushed_raster_task = 0;
16047+
16048+ PSB_DEBUG_RENDER("schedule ta\n");
16049+
16050+ if (scheduler->idle_count != 0)
16051+ return;
16052+
16053+ if (scheduler->current_task[PSB_SCENE_ENGINE_TA] != NULL)
16054+ return;
16055+
16056+ if (scheduler->ta_state)
16057+ return;
16058+
16059+ /*
16060+ * Skip the ta stage for rasterization-only
16061+ * tasks. They arrive here to make sure we're rasterizing
16062+ * tasks in the correct order.
16063+ */
16064+
16065+ list_for_each_safe(list, next, &scheduler->ta_queue) {
16066+ task = list_entry(list, struct psb_task, head);
16067+ if (task->task_type != psb_raster_task)
16068+ break;
16069+
16070+ list_del_init(list);
16071+ list_add_tail(list, &scheduler->raster_queue);
16072+ psb_report_fence(scheduler, task->engine, task->sequence,
16073+ _PSB_FENCE_TA_DONE_SHIFT, 1);
16074+ task = NULL;
16075+ pushed_raster_task = 1;
16076+ }
16077+
16078+ if (pushed_raster_task)
16079+ psb_schedule_raster(dev_priv, scheduler);
16080+
16081+ if (!task)
16082+ return;
16083+
16084+ /*
16085+ * Still waiting for a vistest?
16086+ */
16087+
16088+ if (scheduler->feedback_task == task)
16089+ return;
16090+
16091+#ifdef ONLY_ONE_JOB_IN_RASTER_QUEUE
16092+
16093+ /*
16094+ * Block ta from trying to use both hardware contexts
16095+ * without the rasterizer starting to render from one of them.
16096+ */
16097+
16098+ if (!list_empty(&scheduler->raster_queue)) {
16099+ return;
16100+ }
16101+#endif
16102+
16103+#ifdef PSB_BLOCK_OVERLAP
16104+ /*
16105+ * Make sure rasterizer isn't doing anything.
16106+ */
16107+ if (scheduler->current_task[PSB_SCENE_ENGINE_RASTER] != NULL)
16108+ return;
16109+#endif
16110+ if (list_empty(&scheduler->hw_scenes))
16111+ return;
16112+
16113+#ifdef FIX_TG_16
16114+ if (psb_check_2d_idle(dev_priv))
16115+ return;
16116+#endif
16117+
16118+ list_del_init(&task->head);
16119+ if (task->flags & PSB_FIRE_FLAG_XHW_OOM)
16120+ scheduler->ta_state = 1;
16121+
16122+ scheduler->current_task[PSB_SCENE_ENGINE_TA] = task;
16123+ scheduler->idle = 0;
16124+ scheduler->ta_end_jiffies = jiffies + PSB_TA_TIMEOUT;
16125+
16126+ task->reply_flags = (task->flags & PSB_FIRE_FLAG_XHW_OOM) ?
16127+ 0x00000000 : PSB_RF_FIRE_TA;
16128+
16129+ (void)psb_reg_submit(dev_priv, task->ta_cmds, task->ta_cmd_size);
16130+ psb_set_scene_fire(scheduler, task->scene, PSB_SCENE_ENGINE_TA, task);
16131+ psb_schedule_watchdog(dev_priv);
16132+}
16133+
16134+static int psb_fire_raster(struct psb_scheduler *scheduler,
16135+ struct psb_task *task)
16136+{
16137+ struct drm_device *dev = scheduler->dev;
16138+ struct drm_psb_private *dev_priv = (struct drm_psb_private *)
16139+ dev->dev_private;
16140+
16141+ PSB_DEBUG_RENDER("Fire raster %d\n", task->sequence);
16142+
16143+ return psb_xhw_fire_raster(dev_priv, &task->buf, task->flags);
16144+}
16145+
16146+/*
16147+ * Take the first rasterization task from the hp raster queue or from the
16148+ * raster queue and fire the rasterizer.
16149+ */
16150+
16151+static void psb_schedule_raster(struct drm_psb_private *dev_priv,
16152+ struct psb_scheduler *scheduler)
16153+{
16154+ struct psb_task *task;
16155+ struct list_head *list;
16156+
16157+ if (scheduler->idle_count != 0)
16158+ return;
16159+
16160+ if (scheduler->current_task[PSB_SCENE_ENGINE_RASTER] != NULL) {
16161+ PSB_DEBUG_RENDER("Raster busy.\n");
16162+ return;
16163+ }
16164+#ifdef PSB_BLOCK_OVERLAP
16165+ if (scheduler->current_task[PSB_SCENE_ENGINE_TA] != NULL) {
16166+ PSB_DEBUG_RENDER("TA busy.\n");
16167+ return;
16168+ }
16169+#endif
16170+
16171+ if (!list_empty(&scheduler->hp_raster_queue))
16172+ list = scheduler->hp_raster_queue.next;
16173+ else if (!list_empty(&scheduler->raster_queue))
16174+ list = scheduler->raster_queue.next;
16175+ else {
16176+ PSB_DEBUG_RENDER("Nothing in list\n");
16177+ return;
16178+ }
16179+
16180+ task = list_entry(list, struct psb_task, head);
16181+
16182+ /*
16183+ * Sometimes changing ZLS format requires an ISP reset.
16184+ * Doesn't seem to consume too much time.
16185+ */
16186+
16187+ if (task->scene)
16188+ PSB_WSGX32(_PSB_CS_RESET_ISP_RESET, PSB_CR_SOFT_RESET);
16189+
16190+ scheduler->current_task[PSB_SCENE_ENGINE_RASTER] = task;
16191+
16192+ list_del_init(list);
16193+ scheduler->idle = 0;
16194+ scheduler->raster_end_jiffies = jiffies + PSB_RASTER_TIMEOUT;
16195+ scheduler->total_raster_jiffies = 0;
16196+
16197+ if (task->scene)
16198+ PSB_WSGX32(0, PSB_CR_SOFT_RESET);
16199+
16200+ (void)psb_reg_submit(dev_priv, task->raster_cmds,
16201+ task->raster_cmd_size);
16202+
16203+ if (task->scene) {
16204+ task->reply_flags = (task->flags & PSB_FIRE_FLAG_XHW_OOM) ?
16205+ 0x00000000 : PSB_RF_FIRE_RASTER;
16206+ psb_set_scene_fire(scheduler,
16207+ task->scene, PSB_SCENE_ENGINE_RASTER, task);
16208+ } else {
16209+ task->reply_flags = PSB_RF_DEALLOC | PSB_RF_FIRE_RASTER;
16210+ psb_fire_raster(scheduler, task);
16211+ }
16212+ psb_schedule_watchdog(dev_priv);
16213+}
16214+
16215+int psb_extend_raster_timeout(struct drm_psb_private *dev_priv)
16216+{
16217+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16218+ unsigned long irq_flags;
16219+ int ret;
16220+
16221+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16222+ scheduler->total_raster_jiffies +=
16223+ jiffies - scheduler->raster_end_jiffies + PSB_RASTER_TIMEOUT;
16224+ scheduler->raster_end_jiffies = jiffies + PSB_RASTER_TIMEOUT;
16225+ ret = (scheduler->total_raster_jiffies > PSB_ALLOWED_RASTER_RUNTIME) ?
16226+ -EBUSY : 0;
16227+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16228+ return ret;
16229+}
16230+
16231+/*
16232+ * TA done handler.
16233+ */
16234+
16235+static void psb_ta_done(struct drm_psb_private *dev_priv,
16236+ struct psb_scheduler *scheduler)
16237+{
16238+ struct psb_task *task = scheduler->current_task[PSB_SCENE_ENGINE_TA];
16239+ struct psb_scene *scene = task->scene;
16240+
16241+ PSB_DEBUG_RENDER("TA done %u\n", task->sequence);
16242+
16243+ switch (task->ta_complete_action) {
16244+ case PSB_RASTER_BLOCK:
16245+ scheduler->ta_state = 1;
16246+ scene->flags |=
16247+ (PSB_SCENE_FLAG_DIRTY | PSB_SCENE_FLAG_COMPLETE);
16248+ list_add_tail(&task->head, &scheduler->raster_queue);
16249+ break;
16250+ case PSB_RASTER:
16251+ scene->flags |=
16252+ (PSB_SCENE_FLAG_DIRTY | PSB_SCENE_FLAG_COMPLETE);
16253+ list_add_tail(&task->head, &scheduler->raster_queue);
16254+ break;
16255+ case PSB_RETURN:
16256+ scheduler->ta_state = 0;
16257+ scene->flags |= PSB_SCENE_FLAG_DIRTY;
16258+ list_add_tail(&scene->hw_scene->head, &scheduler->hw_scenes);
16259+
16260+ break;
16261+ }
16262+
16263+ scheduler->current_task[PSB_SCENE_ENGINE_TA] = NULL;
16264+
16265+#ifdef FIX_TG_16
16266+ psb_2d_atomic_unlock(dev_priv);
16267+#endif
16268+
16269+ if (task->ta_complete_action != PSB_RASTER_BLOCK)
16270+ psb_report_fence(scheduler, task->engine, task->sequence,
16271+ _PSB_FENCE_TA_DONE_SHIFT, 1);
16272+
16273+ psb_schedule_raster(dev_priv, scheduler);
16274+ psb_schedule_ta(dev_priv, scheduler);
16275+ psb_set_idle(scheduler);
16276+
16277+ if (task->ta_complete_action != PSB_RETURN)
16278+ return;
16279+
16280+ list_add_tail(&task->head, &scheduler->task_done_queue);
16281+ schedule_delayed_work(&scheduler->wq, 1);
16282+}
16283+
16284+/*
16285+ * Rasterizer done handler.
16286+ */
16287+
16288+static void psb_raster_done(struct drm_psb_private *dev_priv,
16289+ struct psb_scheduler *scheduler)
16290+{
16291+ struct psb_task *task =
16292+ scheduler->current_task[PSB_SCENE_ENGINE_RASTER];
16293+ struct psb_scene *scene = task->scene;
16294+ uint32_t complete_action = task->raster_complete_action;
16295+
16296+ PSB_DEBUG_RENDER("Raster done %u\n", task->sequence);
16297+
16298+ scheduler->current_task[PSB_SCENE_ENGINE_RASTER] = NULL;
16299+
16300+ if (complete_action != PSB_RASTER)
16301+ psb_schedule_raster(dev_priv, scheduler);
16302+
16303+ if (scene) {
16304+ if (task->feedback.page) {
16305+ if (unlikely(scheduler->feedback_task)) {
16306+ /*
16307+ * This should never happen, since the previous
16308+ * feedback query will return before the next
16309+ * raster task is fired.
16310+ */
16311+ DRM_ERROR("Feedback task busy.\n");
16312+ }
16313+ scheduler->feedback_task = task;
16314+ psb_xhw_vistest(dev_priv, &task->buf);
16315+ }
16316+ switch (complete_action) {
16317+ case PSB_RETURN:
16318+ scene->flags &=
16319+ ~(PSB_SCENE_FLAG_DIRTY | PSB_SCENE_FLAG_COMPLETE);
16320+ list_add_tail(&scene->hw_scene->head,
16321+ &scheduler->hw_scenes);
16322+ psb_report_fence(scheduler, task->engine,
16323+ task->sequence,
16324+ _PSB_FENCE_SCENE_DONE_SHIFT, 1);
16325+ if (task->flags & PSB_FIRE_FLAG_XHW_OOM) {
16326+ scheduler->ta_state = 0;
16327+ }
16328+ break;
16329+ case PSB_RASTER:
16330+ list_add(&task->head, &scheduler->raster_queue);
16331+ task->raster_complete_action = PSB_RETURN;
16332+ psb_schedule_raster(dev_priv, scheduler);
16333+ break;
16334+ case PSB_TA:
16335+ list_add(&task->head, &scheduler->ta_queue);
16336+ scheduler->ta_state = 0;
16337+ task->raster_complete_action = PSB_RETURN;
16338+ task->ta_complete_action = PSB_RASTER;
16339+ break;
16340+
16341+ }
16342+ }
16343+ psb_schedule_ta(dev_priv, scheduler);
16344+ psb_set_idle(scheduler);
16345+
16346+ if (complete_action == PSB_RETURN) {
16347+ if (task->scene == NULL) {
16348+ psb_report_fence(scheduler, task->engine,
16349+ task->sequence,
16350+ _PSB_FENCE_RASTER_DONE_SHIFT, 1);
16351+ }
16352+ if (!task->feedback.page) {
16353+ list_add_tail(&task->head, &scheduler->task_done_queue);
16354+ schedule_delayed_work(&scheduler->wq, 1);
16355+ }
16356+ }
16357+}
16358+
16359+void psb_scheduler_pause(struct drm_psb_private *dev_priv)
16360+{
16361+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16362+ unsigned long irq_flags;
16363+
16364+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16365+ scheduler->idle_count++;
16366+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16367+}
16368+
16369+void psb_scheduler_restart(struct drm_psb_private *dev_priv)
16370+{
16371+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16372+ unsigned long irq_flags;
16373+
16374+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16375+ if (--scheduler->idle_count == 0) {
16376+ psb_schedule_ta(dev_priv, scheduler);
16377+ psb_schedule_raster(dev_priv, scheduler);
16378+ }
16379+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16380+}
16381+
16382+int psb_scheduler_idle(struct drm_psb_private *dev_priv)
16383+{
16384+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16385+ unsigned long irq_flags;
16386+ int ret;
16387+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16388+ ret = scheduler->idle_count != 0 && scheduler->idle;
16389+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16390+ return ret;
16391+}
16392+
16393+int psb_scheduler_finished(struct drm_psb_private *dev_priv)
16394+{
16395+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16396+ unsigned long irq_flags;
16397+ int ret;
16398+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16399+ ret = (scheduler->idle &&
16400+ list_empty(&scheduler->raster_queue) &&
16401+ list_empty(&scheduler->ta_queue) &&
16402+ list_empty(&scheduler->hp_raster_queue));
16403+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16404+ return ret;
16405+}
16406+
16407+static void psb_ta_oom(struct drm_psb_private *dev_priv,
16408+ struct psb_scheduler *scheduler)
16409+{
16410+
16411+ struct psb_task *task = scheduler->current_task[PSB_SCENE_ENGINE_TA];
16412+ if (!task)
16413+ return;
16414+
16415+ if (task->aborting)
16416+ return;
16417+ task->aborting = 1;
16418+
16419+ DRM_INFO("Info: TA out of parameter memory.\n");
16420+
16421+ (void)psb_xhw_ta_oom(dev_priv, &task->buf, task->scene->hw_cookie);
16422+}
16423+
16424+static void psb_ta_oom_reply(struct drm_psb_private *dev_priv,
16425+ struct psb_scheduler *scheduler)
16426+{
16427+
16428+ struct psb_task *task = scheduler->current_task[PSB_SCENE_ENGINE_TA];
16429+ uint32_t flags;
16430+ if (!task)
16431+ return;
16432+
16433+ psb_xhw_ta_oom_reply(dev_priv, &task->buf,
16434+ task->scene->hw_cookie,
16435+ &task->ta_complete_action,
16436+ &task->raster_complete_action, &flags);
16437+ task->flags |= flags;
16438+ task->aborting = 0;
16439+ psb_dispatch_ta(dev_priv, scheduler, PSB_RF_OOM_REPLY);
16440+}
16441+
16442+static void psb_ta_hw_scene_freed(struct drm_psb_private *dev_priv,
16443+ struct psb_scheduler *scheduler)
16444+{
16445+ DRM_ERROR("TA hw scene freed.\n");
16446+}
16447+
16448+static void psb_vistest_reply(struct drm_psb_private *dev_priv,
16449+ struct psb_scheduler *scheduler)
16450+{
16451+ struct psb_task *task = scheduler->feedback_task;
16452+ uint8_t *feedback_map;
16453+ uint32_t add;
16454+ uint32_t cur;
16455+ struct drm_psb_vistest *vistest;
16456+ int i;
16457+
16458+ scheduler->feedback_task = NULL;
16459+ if (!task) {
16460+ DRM_ERROR("No Poulsbo feedback task.\n");
16461+ return;
16462+ }
16463+ if (!task->feedback.page) {
16464+ DRM_ERROR("No Poulsbo feedback page.\n");
16465+ goto out;
16466+ }
16467+
16468+ if (in_irq())
16469+ feedback_map = kmap_atomic(task->feedback.page, KM_IRQ0);
16470+ else
16471+ feedback_map = kmap_atomic(task->feedback.page, KM_USER0);
16472+
16473+ /*
16474+ * Loop over all requested vistest components here.
16475+ * Only one (vistest) currently.
16476+ */
16477+
16478+ vistest = (struct drm_psb_vistest *)
16479+ (feedback_map + task->feedback.offset);
16480+
16481+ for (i = 0; i < PSB_HW_FEEDBACK_SIZE; ++i) {
16482+ add = task->buf.arg.arg.feedback[i];
16483+ cur = vistest->vt[i];
16484+
16485+ /*
16486+ * Vistest saturates.
16487+ */
16488+
16489+ vistest->vt[i] = (cur + add < cur) ? ~0 : cur + add;
16490+ }
16491+ if (in_irq())
16492+ kunmap_atomic(feedback_map, KM_IRQ0);
16493+ else
16494+ kunmap_atomic(feedback_map, KM_USER0);
16495+ out:
16496+ psb_report_fence(scheduler, task->engine, task->sequence,
16497+ _PSB_FENCE_FEEDBACK_SHIFT, 1);
16498+
16499+ if (list_empty(&task->head)) {
16500+ list_add_tail(&task->head, &scheduler->task_done_queue);
16501+ schedule_delayed_work(&scheduler->wq, 1);
16502+ } else
16503+ psb_schedule_ta(dev_priv, scheduler);
16504+}
16505+
16506+static void psb_ta_fire_reply(struct drm_psb_private *dev_priv,
16507+ struct psb_scheduler *scheduler)
16508+{
16509+ struct psb_task *task = scheduler->current_task[PSB_SCENE_ENGINE_TA];
16510+
16511+ psb_xhw_fire_reply(dev_priv, &task->buf, task->scene->hw_cookie);
16512+
16513+ psb_dispatch_ta(dev_priv, scheduler, PSB_RF_FIRE_TA);
16514+}
16515+
16516+static void psb_raster_fire_reply(struct drm_psb_private *dev_priv,
16517+ struct psb_scheduler *scheduler)
16518+{
16519+ struct psb_task *task =
16520+ scheduler->current_task[PSB_SCENE_ENGINE_RASTER];
16521+ uint32_t reply_flags;
16522+
16523+ if (!task) {
16524+ DRM_ERROR("Null task.\n");
16525+ return;
16526+ }
16527+
16528+ task->raster_complete_action = task->buf.arg.arg.sb.rca;
16529+ psb_xhw_fire_reply(dev_priv, &task->buf, task->scene->hw_cookie);
16530+
16531+ reply_flags = PSB_RF_FIRE_RASTER;
16532+ if (task->raster_complete_action == PSB_RASTER)
16533+ reply_flags |= PSB_RF_DEALLOC;
16534+
16535+ psb_dispatch_raster(dev_priv, scheduler, reply_flags);
16536+}
16537+
16538+static int psb_user_interrupt(struct drm_psb_private *dev_priv,
16539+ struct psb_scheduler *scheduler)
16540+{
16541+ uint32_t type;
16542+ int ret;
16543+ unsigned long irq_flags;
16544+
16545+ /*
16546+ * Xhw cannot write directly to the comm page, so
16547+ * do it here. Firmware would have written directly.
16548+ */
16549+
16550+ ret = psb_xhw_handler(dev_priv);
16551+ if (unlikely(ret))
16552+ return ret;
16553+
16554+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
16555+ type = dev_priv->comm[PSB_COMM_USER_IRQ];
16556+ dev_priv->comm[PSB_COMM_USER_IRQ] = 0;
16557+ if (dev_priv->comm[PSB_COMM_USER_IRQ_LOST]) {
16558+ dev_priv->comm[PSB_COMM_USER_IRQ_LOST] = 0;
16559+ DRM_ERROR("Lost Poulsbo hardware event.\n");
16560+ }
16561+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
16562+
16563+ if (type == 0)
16564+ return 0;
16565+
16566+ switch (type) {
16567+ case PSB_UIRQ_VISTEST:
16568+ psb_vistest_reply(dev_priv, scheduler);
16569+ break;
16570+ case PSB_UIRQ_OOM_REPLY:
16571+ psb_ta_oom_reply(dev_priv, scheduler);
16572+ break;
16573+ case PSB_UIRQ_FIRE_TA_REPLY:
16574+ psb_ta_fire_reply(dev_priv, scheduler);
16575+ break;
16576+ case PSB_UIRQ_FIRE_RASTER_REPLY:
16577+ psb_raster_fire_reply(dev_priv, scheduler);
16578+ break;
16579+ default:
16580+ DRM_ERROR("Unknown Poulsbo hardware event. %d\n", type);
16581+ }
16582+ return 0;
16583+}
16584+
16585+int psb_forced_user_interrupt(struct drm_psb_private *dev_priv)
16586+{
16587+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16588+ unsigned long irq_flags;
16589+ int ret;
16590+
16591+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16592+ ret = psb_user_interrupt(dev_priv, scheduler);
16593+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16594+ return ret;
16595+}
16596+
16597+static void psb_dispatch_ta(struct drm_psb_private *dev_priv,
16598+ struct psb_scheduler *scheduler,
16599+ uint32_t reply_flag)
16600+{
16601+ struct psb_task *task = scheduler->current_task[PSB_SCENE_ENGINE_TA];
16602+ uint32_t flags;
16603+ uint32_t mask;
16604+
16605+ task->reply_flags |= reply_flag;
16606+ flags = task->reply_flags;
16607+ mask = PSB_RF_FIRE_TA;
16608+
16609+ if (!(flags & mask))
16610+ return;
16611+
16612+ mask = PSB_RF_TA_DONE;
16613+ if ((flags & mask) == mask) {
16614+ task->reply_flags &= ~mask;
16615+ psb_ta_done(dev_priv, scheduler);
16616+ }
16617+
16618+ mask = PSB_RF_OOM;
16619+ if ((flags & mask) == mask) {
16620+ task->reply_flags &= ~mask;
16621+ psb_ta_oom(dev_priv, scheduler);
16622+ }
16623+
16624+ mask = (PSB_RF_OOM_REPLY | PSB_RF_TERMINATE);
16625+ if ((flags & mask) == mask) {
16626+ task->reply_flags &= ~mask;
16627+ psb_ta_done(dev_priv, scheduler);
16628+ }
16629+}
16630+
16631+static void psb_dispatch_raster(struct drm_psb_private *dev_priv,
16632+ struct psb_scheduler *scheduler,
16633+ uint32_t reply_flag)
16634+{
16635+ struct psb_task *task =
16636+ scheduler->current_task[PSB_SCENE_ENGINE_RASTER];
16637+ uint32_t flags;
16638+ uint32_t mask;
16639+
16640+ task->reply_flags |= reply_flag;
16641+ flags = task->reply_flags;
16642+ mask = PSB_RF_FIRE_RASTER;
16643+
16644+ if (!(flags & mask))
16645+ return;
16646+
16647+ /*
16648+ * For rasterizer-only tasks, don't report fence done here,
16649+ * as this is time consuming and the rasterizer wants a new
16650+ * task immediately. For other tasks, the hardware is probably
16651+ * still busy deallocating TA memory, so we can report
16652+ * fence done in parallel.
16653+ */
16654+
16655+ if (task->raster_complete_action == PSB_RETURN &&
16656+ (reply_flag & PSB_RF_RASTER_DONE) && task->scene != NULL) {
16657+ psb_report_fence(scheduler, task->engine, task->sequence,
16658+ _PSB_FENCE_RASTER_DONE_SHIFT, 1);
16659+ }
16660+
16661+ mask = PSB_RF_RASTER_DONE | PSB_RF_DEALLOC;
16662+ if ((flags & mask) == mask) {
16663+ task->reply_flags &= ~mask;
16664+ psb_raster_done(dev_priv, scheduler);
16665+ }
16666+}
16667+
16668+void psb_scheduler_handler(struct drm_psb_private *dev_priv, uint32_t status)
16669+{
16670+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16671+
16672+ spin_lock(&scheduler->lock);
16673+
16674+ if (status & _PSB_CE_PIXELBE_END_RENDER) {
16675+ psb_dispatch_raster(dev_priv, scheduler, PSB_RF_RASTER_DONE);
16676+ }
16677+ if (status & _PSB_CE_DPM_3D_MEM_FREE) {
16678+ psb_dispatch_raster(dev_priv, scheduler, PSB_RF_DEALLOC);
16679+ }
16680+ if (status & _PSB_CE_TA_FINISHED) {
16681+ psb_dispatch_ta(dev_priv, scheduler, PSB_RF_TA_DONE);
16682+ }
16683+ if (status & _PSB_CE_TA_TERMINATE) {
16684+ psb_dispatch_ta(dev_priv, scheduler, PSB_RF_TERMINATE);
16685+ }
16686+ if (status & (_PSB_CE_DPM_REACHED_MEM_THRESH |
16687+ _PSB_CE_DPM_OUT_OF_MEMORY_GBL |
16688+ _PSB_CE_DPM_OUT_OF_MEMORY_MT)) {
16689+ psb_dispatch_ta(dev_priv, scheduler, PSB_RF_OOM);
16690+ }
16691+ if (status & _PSB_CE_DPM_TA_MEM_FREE) {
16692+ psb_ta_hw_scene_freed(dev_priv, scheduler);
16693+ }
16694+ if (status & _PSB_CE_SW_EVENT) {
16695+ psb_user_interrupt(dev_priv, scheduler);
16696+ }
16697+ spin_unlock(&scheduler->lock);
16698+}
16699+
16700+static void psb_free_task_wq(struct work_struct *work)
16701+{
16702+ struct psb_scheduler *scheduler =
16703+ container_of(work, struct psb_scheduler, wq.work);
16704+
16705+ struct drm_device *dev = scheduler->dev;
16706+ struct list_head *list, *next;
16707+ unsigned long irq_flags;
16708+ struct psb_task *task;
16709+
16710+ if (!mutex_trylock(&scheduler->task_wq_mutex))
16711+ return;
16712+
16713+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16714+ list_for_each_safe(list, next, &scheduler->task_done_queue) {
16715+ task = list_entry(list, struct psb_task, head);
16716+ list_del_init(list);
16717+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16718+
16719+ PSB_DEBUG_RENDER("Checking Task %d: Scene 0x%08lx, "
16720+ "Feedback bo 0x%08lx, done %d\n",
16721+ task->sequence, (unsigned long)task->scene,
16722+ (unsigned long)task->feedback.bo,
16723+ atomic_read(&task->buf.done));
16724+
16725+ if (task->scene) {
16726+ mutex_lock(&dev->struct_mutex);
16727+ PSB_DEBUG_RENDER("Unref scene %d\n", task->sequence);
16728+ psb_scene_unref_devlocked(&task->scene);
16729+ if (task->feedback.bo) {
16730+ PSB_DEBUG_RENDER("Unref feedback bo %d\n",
16731+ task->sequence);
16732+ drm_bo_usage_deref_locked(&task->feedback.bo);
16733+ }
16734+ mutex_unlock(&dev->struct_mutex);
16735+ }
16736+
16737+ if (atomic_read(&task->buf.done)) {
16738+ PSB_DEBUG_RENDER("Deleting task %d\n", task->sequence);
16739+ drm_free(task, sizeof(*task), DRM_MEM_DRIVER);
16740+ task = NULL;
16741+ }
16742+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16743+ if (task != NULL)
16744+ list_add(list, &scheduler->task_done_queue);
16745+ }
16746+ if (!list_empty(&scheduler->task_done_queue)) {
16747+ PSB_DEBUG_RENDER("Rescheduling wq\n");
16748+ schedule_delayed_work(&scheduler->wq, 1);
16749+ }
16750+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16751+
16752+ mutex_unlock(&scheduler->task_wq_mutex);
16753+}
16754+
16755+/*
16756+ * Check if any of the tasks in the queues is using a scene.
16757+ * In that case we know the TA memory buffer objects are
16758+ * fenced and will not be evicted until that fence is signaled.
16759+ */
16760+
16761+void psb_scheduler_ta_mem_check(struct drm_psb_private *dev_priv)
16762+{
16763+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16764+ unsigned long irq_flags;
16765+ struct psb_task *task;
16766+ struct psb_task *next_task;
16767+
16768+ dev_priv->force_ta_mem_load = 1;
16769+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16770+ list_for_each_entry_safe(task, next_task, &scheduler->ta_queue, head) {
16771+ if (task->scene) {
16772+ dev_priv->force_ta_mem_load = 0;
16773+ break;
16774+ }
16775+ }
16776+ list_for_each_entry_safe(task, next_task, &scheduler->raster_queue,
16777+ head) {
16778+ if (task->scene) {
16779+ dev_priv->force_ta_mem_load = 0;
16780+ break;
16781+ }
16782+ }
16783+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16784+}
16785+
16786+void psb_scheduler_reset(struct drm_psb_private *dev_priv, int error_condition)
16787+{
16788+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16789+ unsigned long wait_jiffies;
16790+ unsigned long cur_jiffies;
16791+ struct psb_task *task;
16792+ struct psb_task *next_task;
16793+ unsigned long irq_flags;
16794+
16795+ psb_scheduler_pause(dev_priv);
16796+ if (!psb_scheduler_idle(dev_priv)) {
16797+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16798+
16799+ cur_jiffies = jiffies;
16800+ wait_jiffies = cur_jiffies;
16801+ if (scheduler->current_task[PSB_SCENE_ENGINE_TA] &&
16802+ time_after_eq(scheduler->ta_end_jiffies, wait_jiffies))
16803+ wait_jiffies = scheduler->ta_end_jiffies;
16804+ if (scheduler->current_task[PSB_SCENE_ENGINE_RASTER] &&
16805+ time_after_eq(scheduler->raster_end_jiffies, wait_jiffies))
16806+ wait_jiffies = scheduler->raster_end_jiffies;
16807+
16808+ wait_jiffies -= cur_jiffies;
16809+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16810+
16811+ (void)wait_event_timeout(scheduler->idle_queue,
16812+ psb_scheduler_idle(dev_priv),
16813+ wait_jiffies);
16814+ }
16815+
16816+ if (!psb_scheduler_idle(dev_priv)) {
16817+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16818+ task = scheduler->current_task[PSB_SCENE_ENGINE_RASTER];
16819+ if (task) {
16820+ DRM_ERROR("Detected Poulsbo rasterizer lockup.\n");
16821+ if (task->engine == PSB_ENGINE_HPRAST) {
16822+ psb_fence_error(scheduler->dev,
16823+ PSB_ENGINE_HPRAST,
16824+ task->sequence,
16825+ _PSB_FENCE_TYPE_RASTER_DONE,
16826+ error_condition);
16827+
16828+ list_del(&task->head);
16829+ psb_xhw_clean_buf(dev_priv, &task->buf);
16830+ list_add_tail(&task->head,
16831+ &scheduler->task_done_queue);
16832+ } else {
16833+ list_add(&task->head, &scheduler->raster_queue);
16834+ }
16835+ }
16836+ scheduler->current_task[PSB_SCENE_ENGINE_RASTER] = NULL;
16837+ task = scheduler->current_task[PSB_SCENE_ENGINE_TA];
16838+ if (task) {
16839+ DRM_ERROR("Detected Poulsbo ta lockup.\n");
16840+ list_add_tail(&task->head, &scheduler->raster_queue);
16841+#ifdef FIX_TG_16
16842+ psb_2d_atomic_unlock(dev_priv);
16843+#endif
16844+ }
16845+ scheduler->current_task[PSB_SCENE_ENGINE_TA] = NULL;
16846+ scheduler->ta_state = 0;
16847+
16848+#ifdef FIX_TG_16
16849+ atomic_set(&dev_priv->ta_wait_2d, 0);
16850+ atomic_set(&dev_priv->ta_wait_2d_irq, 0);
16851+ wake_up(&dev_priv->queue_2d);
16852+#endif
16853+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16854+ }
16855+
16856+ /*
16857+ * Empty raster queue.
16858+ */
16859+
16860+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16861+ list_for_each_entry_safe(task, next_task, &scheduler->raster_queue,
16862+ head) {
16863+ struct psb_scene *scene = task->scene;
16864+
16865+ psb_fence_error(scheduler->dev,
16866+ task->engine,
16867+ task->sequence,
16868+ _PSB_FENCE_TYPE_TA_DONE |
16869+ _PSB_FENCE_TYPE_RASTER_DONE |
16870+ _PSB_FENCE_TYPE_SCENE_DONE |
16871+ _PSB_FENCE_TYPE_FEEDBACK, error_condition);
16872+ if (scene) {
16873+ scene->flags = 0;
16874+ if (scene->hw_scene) {
16875+ list_add_tail(&scene->hw_scene->head,
16876+ &scheduler->hw_scenes);
16877+ scene->hw_scene = NULL;
16878+ }
16879+ }
16880+
16881+ psb_xhw_clean_buf(dev_priv, &task->buf);
16882+ list_del(&task->head);
16883+ list_add_tail(&task->head, &scheduler->task_done_queue);
16884+ }
16885+
16886+ schedule_delayed_work(&scheduler->wq, 1);
16887+ scheduler->idle = 1;
16888+ wake_up(&scheduler->idle_queue);
16889+
16890+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16891+ psb_scheduler_restart(dev_priv);
16892+
16893+}
16894+
16895+int psb_scheduler_init(struct drm_device *dev, struct psb_scheduler *scheduler)
16896+{
16897+ struct psb_hw_scene *hw_scene;
16898+ int i;
16899+
16900+ memset(scheduler, 0, sizeof(*scheduler));
16901+ scheduler->dev = dev;
16902+ mutex_init(&scheduler->task_wq_mutex);
16903+ scheduler->lock = SPIN_LOCK_UNLOCKED;
16904+ scheduler->idle = 1;
16905+
16906+ INIT_LIST_HEAD(&scheduler->ta_queue);
16907+ INIT_LIST_HEAD(&scheduler->raster_queue);
16908+ INIT_LIST_HEAD(&scheduler->hp_raster_queue);
16909+ INIT_LIST_HEAD(&scheduler->hw_scenes);
16910+ INIT_LIST_HEAD(&scheduler->task_done_queue);
16911+ INIT_DELAYED_WORK(&scheduler->wq, &psb_free_task_wq);
16912+ init_waitqueue_head(&scheduler->idle_queue);
16913+
16914+ for (i = 0; i < PSB_NUM_HW_SCENES; ++i) {
16915+ hw_scene = &scheduler->hs[i];
16916+ hw_scene->context_number = i;
16917+ list_add_tail(&hw_scene->head, &scheduler->hw_scenes);
16918+ }
16919+
16920+ for (i = 0; i < _PSB_ENGINE_TA_FENCE_TYPES; ++i) {
16921+ scheduler->seq[i].reported = 0;
16922+ }
16923+
16924+ return 0;
16925+}
16926+
16927+/*
16928+ * Scene references maintained by the scheduler are not refcounted.
16929+ * Remove all references to a particular scene here.
16930+ */
16931+
16932+void psb_scheduler_remove_scene_refs(struct psb_scene *scene)
16933+{
16934+ struct drm_psb_private *dev_priv =
16935+ (struct drm_psb_private *)scene->dev->dev_private;
16936+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
16937+ struct psb_hw_scene *hw_scene;
16938+ unsigned long irq_flags;
16939+ unsigned int i;
16940+
16941+ spin_lock_irqsave(&scheduler->lock, irq_flags);
16942+ for (i = 0; i < PSB_NUM_HW_SCENES; ++i) {
16943+ hw_scene = &scheduler->hs[i];
16944+ if (hw_scene->last_scene == scene) {
16945+ BUG_ON(list_empty(&hw_scene->head));
16946+ hw_scene->last_scene = NULL;
16947+ }
16948+ }
16949+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
16950+}
16951+
16952+void psb_scheduler_takedown(struct psb_scheduler *scheduler)
16953+{
16954+ flush_scheduled_work();
16955+}
16956+
16957+static int psb_setup_task_devlocked(struct drm_device *dev,
16958+ struct drm_psb_cmdbuf_arg *arg,
16959+ struct drm_buffer_object *raster_cmd_buffer,
16960+ struct drm_buffer_object *ta_cmd_buffer,
16961+ struct drm_buffer_object *oom_cmd_buffer,
16962+ struct psb_scene *scene,
16963+ enum psb_task_type task_type,
16964+ uint32_t engine,
16965+ uint32_t flags, struct psb_task **task_p)
16966+{
16967+ struct psb_task *task;
16968+ int ret;
16969+
16970+ if (ta_cmd_buffer && arg->ta_size > PSB_MAX_TA_CMDS) {
16971+ DRM_ERROR("Too many ta cmds %d.\n", arg->ta_size);
16972+ return -EINVAL;
16973+ }
16974+ if (raster_cmd_buffer && arg->cmdbuf_size > PSB_MAX_RASTER_CMDS) {
16975+ DRM_ERROR("Too many raster cmds %d.\n", arg->cmdbuf_size);
16976+ return -EINVAL;
16977+ }
16978+ if (oom_cmd_buffer && arg->oom_size > PSB_MAX_OOM_CMDS) {
16979+ DRM_ERROR("Too many raster cmds %d.\n", arg->oom_size);
16980+ return -EINVAL;
16981+ }
16982+
16983+ task = drm_calloc(1, sizeof(*task), DRM_MEM_DRIVER);
16984+ if (!task)
16985+ return -ENOMEM;
16986+
16987+ atomic_set(&task->buf.done, 1);
16988+ task->engine = engine;
16989+ INIT_LIST_HEAD(&task->head);
16990+ INIT_LIST_HEAD(&task->buf.head);
16991+ if (ta_cmd_buffer && arg->ta_size != 0) {
16992+ task->ta_cmd_size = arg->ta_size;
16993+ ret = psb_submit_copy_cmdbuf(dev, ta_cmd_buffer,
16994+ arg->ta_offset,
16995+ arg->ta_size,
16996+ PSB_ENGINE_TA, task->ta_cmds);
16997+ if (ret)
16998+ goto out_err;
16999+ }
17000+ if (raster_cmd_buffer) {
17001+ task->raster_cmd_size = arg->cmdbuf_size;
17002+ ret = psb_submit_copy_cmdbuf(dev, raster_cmd_buffer,
17003+ arg->cmdbuf_offset,
17004+ arg->cmdbuf_size,
17005+ PSB_ENGINE_TA, task->raster_cmds);
17006+ if (ret)
17007+ goto out_err;
17008+ }
17009+ if (oom_cmd_buffer && arg->oom_size != 0) {
17010+ task->oom_cmd_size = arg->oom_size;
17011+ ret = psb_submit_copy_cmdbuf(dev, oom_cmd_buffer,
17012+ arg->oom_offset,
17013+ arg->oom_size,
17014+ PSB_ENGINE_TA, task->oom_cmds);
17015+ if (ret)
17016+ goto out_err;
17017+ }
17018+ task->task_type = task_type;
17019+ task->flags = flags;
17020+ if (scene)
17021+ task->scene = psb_scene_ref(scene);
17022+
17023+ *task_p = task;
17024+ return 0;
17025+ out_err:
17026+ drm_free(task, sizeof(*task), DRM_MEM_DRIVER);
17027+ *task_p = NULL;
17028+ return ret;
17029+}
17030+
17031+int psb_cmdbuf_ta(struct drm_file *priv,
17032+ struct drm_psb_cmdbuf_arg *arg,
17033+ struct drm_buffer_object *cmd_buffer,
17034+ struct drm_buffer_object *ta_buffer,
17035+ struct drm_buffer_object *oom_buffer,
17036+ struct psb_scene *scene,
17037+ struct psb_feedback_info *feedback,
17038+ struct drm_fence_arg *fence_arg)
17039+{
17040+ struct drm_device *dev = priv->minor->dev;
17041+ struct drm_psb_private *dev_priv = dev->dev_private;
17042+ struct drm_fence_object *fence = NULL;
17043+ struct psb_task *task = NULL;
17044+ int ret;
17045+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
17046+ unsigned long irq_flags;
17047+
17048+ PSB_DEBUG_RENDER("Cmdbuf ta\n");
17049+
17050+ ret = mutex_lock_interruptible(&dev_priv->reset_mutex);
17051+ if (ret)
17052+ return -EAGAIN;
17053+
17054+ mutex_lock(&dev->struct_mutex);
17055+ ret = psb_setup_task_devlocked(dev, arg, cmd_buffer, ta_buffer,
17056+ oom_buffer, scene,
17057+ psb_ta_task, PSB_ENGINE_TA,
17058+ PSB_FIRE_FLAG_RASTER_DEALLOC, &task);
17059+ mutex_unlock(&dev->struct_mutex);
17060+
17061+ if (ret)
17062+ goto out_err;
17063+
17064+ task->feedback = *feedback;
17065+
17066+ /*
17067+ * Hand the task over to the scheduler.
17068+ */
17069+
17070+ spin_lock_irqsave(&scheduler->lock, irq_flags);
17071+ task->sequence = psb_fence_advance_sequence(dev, PSB_ENGINE_TA);
17072+
17073+ psb_report_fence(scheduler, PSB_ENGINE_TA, task->sequence, 0, 1);
17074+
17075+ task->ta_complete_action = PSB_RASTER;
17076+ task->raster_complete_action = PSB_RETURN;
17077+
17078+ list_add_tail(&task->head, &scheduler->ta_queue);
17079+ PSB_DEBUG_RENDER("queued ta %u\n", task->sequence);
17080+
17081+ psb_schedule_ta(dev_priv, scheduler);
17082+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
17083+
17084+ psb_fence_or_sync(priv, PSB_ENGINE_TA, arg, fence_arg, &fence);
17085+ drm_regs_fence(&dev_priv->use_manager, fence);
17086+ if (fence)
17087+ fence_arg->signaled |= 0x1;
17088+
17089+ out_err:
17090+ if (ret && ret != -EAGAIN)
17091+ DRM_ERROR("TA task queue job failed.\n");
17092+
17093+ if (fence) {
17094+#ifdef PSB_WAIT_FOR_TA_COMPLETION
17095+ drm_fence_object_wait(fence, 1, 1, DRM_FENCE_TYPE_EXE |
17096+ _PSB_FENCE_TYPE_TA_DONE);
17097+#ifdef PSB_BE_PARANOID
17098+ drm_fence_object_wait(fence, 1, 1, DRM_FENCE_TYPE_EXE |
17099+ _PSB_FENCE_TYPE_SCENE_DONE);
17100+#endif
17101+#endif
17102+ drm_fence_usage_deref_unlocked(&fence);
17103+ }
17104+ mutex_unlock(&dev_priv->reset_mutex);
17105+
17106+ return ret;
17107+}
17108+
17109+int psb_cmdbuf_raster(struct drm_file *priv,
17110+ struct drm_psb_cmdbuf_arg *arg,
17111+ struct drm_buffer_object *cmd_buffer,
17112+ struct drm_fence_arg *fence_arg)
17113+{
17114+ struct drm_device *dev = priv->minor->dev;
17115+ struct drm_psb_private *dev_priv = dev->dev_private;
17116+ struct drm_fence_object *fence = NULL;
17117+ struct psb_task *task = NULL;
17118+ int ret;
17119+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
17120+ unsigned long irq_flags;
17121+
17122+ PSB_DEBUG_RENDER("Cmdbuf Raster\n");
17123+
17124+ ret = mutex_lock_interruptible(&dev_priv->reset_mutex);
17125+ if (ret)
17126+ return -EAGAIN;
17127+
17128+ mutex_lock(&dev->struct_mutex);
17129+ ret = psb_setup_task_devlocked(dev, arg, cmd_buffer, NULL, NULL,
17130+ NULL, psb_raster_task,
17131+ PSB_ENGINE_TA, 0, &task);
17132+ mutex_unlock(&dev->struct_mutex);
17133+
17134+ if (ret)
17135+ goto out_err;
17136+
17137+ /*
17138+ * Hand the task over to the scheduler.
17139+ */
17140+
17141+ spin_lock_irqsave(&scheduler->lock, irq_flags);
17142+ task->sequence = psb_fence_advance_sequence(dev, PSB_ENGINE_TA);
17143+ psb_report_fence(scheduler, PSB_ENGINE_TA, task->sequence, 0, 1);
17144+ task->ta_complete_action = PSB_RASTER;
17145+ task->raster_complete_action = PSB_RETURN;
17146+
17147+ list_add_tail(&task->head, &scheduler->ta_queue);
17148+ PSB_DEBUG_RENDER("queued raster %u\n", task->sequence);
17149+ psb_schedule_ta(dev_priv, scheduler);
17150+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
17151+
17152+ psb_fence_or_sync(priv, PSB_ENGINE_TA, arg, fence_arg, &fence);
17153+ drm_regs_fence(&dev_priv->use_manager, fence);
17154+ if (fence)
17155+ fence_arg->signaled |= 0x1;
17156+ out_err:
17157+ if (ret && ret != -EAGAIN)
17158+ DRM_ERROR("Raster task queue job failed.\n");
17159+
17160+ if (fence) {
17161+#ifdef PSB_WAIT_FOR_RASTER_COMPLETION
17162+ drm_fence_object_wait(fence, 1, 1, fence->type);
17163+#endif
17164+ drm_fence_usage_deref_unlocked(&fence);
17165+ }
17166+
17167+ mutex_unlock(&dev_priv->reset_mutex);
17168+
17169+ return ret;
17170+}
17171+
17172+#ifdef FIX_TG_16
17173+
17174+static int psb_check_2d_idle(struct drm_psb_private *dev_priv)
17175+{
17176+ if (psb_2d_trylock(dev_priv)) {
17177+ if ((PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) &&
17178+ !((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) &
17179+ _PSB_C2B_STATUS_BUSY))) {
17180+ return 0;
17181+ }
17182+ if (atomic_cmpxchg(&dev_priv->ta_wait_2d_irq, 0, 1) == 0)
17183+ psb_2D_irq_on(dev_priv);
17184+
17185+ PSB_WSGX32(PSB_2D_FENCE_BH, PSB_SGX_2D_SLAVE_PORT);
17186+ PSB_WSGX32(PSB_2D_FLUSH_BH, PSB_SGX_2D_SLAVE_PORT);
17187+ (void)PSB_RSGX32(PSB_SGX_2D_SLAVE_PORT);
17188+
17189+ psb_2d_atomic_unlock(dev_priv);
17190+ }
17191+
17192+ atomic_set(&dev_priv->ta_wait_2d, 1);
17193+ return -EBUSY;
17194+}
17195+
17196+static void psb_atomic_resume_ta_2d_idle(struct drm_psb_private *dev_priv)
17197+{
17198+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
17199+
17200+ if (atomic_cmpxchg(&dev_priv->ta_wait_2d, 1, 0) == 1) {
17201+ psb_schedule_ta(dev_priv, scheduler);
17202+ if (atomic_read(&dev_priv->waiters_2d) != 0)
17203+ wake_up(&dev_priv->queue_2d);
17204+ }
17205+}
17206+
17207+void psb_resume_ta_2d_idle(struct drm_psb_private *dev_priv)
17208+{
17209+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
17210+ unsigned long irq_flags;
17211+
17212+ spin_lock_irqsave(&scheduler->lock, irq_flags);
17213+ if (atomic_cmpxchg(&dev_priv->ta_wait_2d_irq, 1, 0) == 1) {
17214+ atomic_set(&dev_priv->ta_wait_2d, 0);
17215+ psb_2D_irq_off(dev_priv);
17216+ psb_schedule_ta(dev_priv, scheduler);
17217+ if (atomic_read(&dev_priv->waiters_2d) != 0)
17218+ wake_up(&dev_priv->queue_2d);
17219+ }
17220+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
17221+}
17222+
17223+/*
17224+ * 2D locking functions. Can't use a mutex since the trylock() and
17225+ * unlock() methods need to be accessible from interrupt context.
17226+ */
17227+
17228+static int psb_2d_trylock(struct drm_psb_private *dev_priv)
17229+{
17230+ return (atomic_cmpxchg(&dev_priv->lock_2d, 0, 1) == 0);
17231+}
17232+
17233+static void psb_2d_atomic_unlock(struct drm_psb_private *dev_priv)
17234+{
17235+ atomic_set(&dev_priv->lock_2d, 0);
17236+ if (atomic_read(&dev_priv->waiters_2d) != 0)
17237+ wake_up(&dev_priv->queue_2d);
17238+}
17239+
17240+void psb_2d_unlock(struct drm_psb_private *dev_priv)
17241+{
17242+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
17243+ unsigned long irq_flags;
17244+
17245+ spin_lock_irqsave(&scheduler->lock, irq_flags);
17246+ psb_2d_atomic_unlock(dev_priv);
17247+ if (atomic_read(&dev_priv->ta_wait_2d) != 0)
17248+ psb_atomic_resume_ta_2d_idle(dev_priv);
17249+ spin_unlock_irqrestore(&scheduler->lock, irq_flags);
17250+}
17251+
17252+void psb_2d_lock(struct drm_psb_private *dev_priv)
17253+{
17254+ atomic_inc(&dev_priv->waiters_2d);
17255+ wait_event(dev_priv->queue_2d, atomic_read(&dev_priv->ta_wait_2d) == 0);
17256+ wait_event(dev_priv->queue_2d, psb_2d_trylock(dev_priv));
17257+ atomic_dec(&dev_priv->waiters_2d);
17258+}
17259+
17260+#endif
17261Index: linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.h
17262===================================================================
17263--- /dev/null 1970-01-01 00:00:00.000000000 +0000
17264+++ linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.h 2009-02-20 12:23:06.000000000 +0000
17265@@ -0,0 +1,170 @@
17266+/**************************************************************************
17267+ * Copyright (c) 2007, Intel Corporation.
17268+ * All Rights Reserved.
17269+ *
17270+ * This program is free software; you can redistribute it and/or modify it
17271+ * under the terms and conditions of the GNU General Public License,
17272+ * version 2, as published by the Free Software Foundation.
17273+ *
17274+ * This program is distributed in the hope it will be useful, but WITHOUT
17275+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17276+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17277+ * more details.
17278+ *
17279+ * You should have received a copy of the GNU General Public License along with
17280+ * this program; if not, write to the Free Software Foundation, Inc.,
17281+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17282+ *
17283+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
17284+ * develop this driver.
17285+ *
17286+ **************************************************************************/
17287+/*
17288+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
17289+ */
17290+
17291+#ifndef _PSB_SCHEDULE_H_
17292+#define _PSB_SCHEDULE_H_
17293+
17294+#include "drmP.h"
17295+
17296+enum psb_task_type {
17297+ psb_ta_midscene_task,
17298+ psb_ta_task,
17299+ psb_raster_task,
17300+ psb_freescene_task
17301+};
17302+
17303+#define PSB_MAX_TA_CMDS 60
17304+#define PSB_MAX_RASTER_CMDS 60
17305+#define PSB_MAX_OOM_CMDS 6
17306+
17307+struct psb_xhw_buf {
17308+ struct list_head head;
17309+ int copy_back;
17310+ atomic_t done;
17311+ struct drm_psb_xhw_arg arg;
17312+
17313+};
17314+
17315+struct psb_feedback_info {
17316+ struct drm_buffer_object *bo;
17317+ struct page *page;
17318+ uint32_t offset;
17319+};
17320+
17321+struct psb_task {
17322+ struct list_head head;
17323+ struct psb_scene *scene;
17324+ struct psb_feedback_info feedback;
17325+ enum psb_task_type task_type;
17326+ uint32_t engine;
17327+ uint32_t sequence;
17328+ uint32_t ta_cmds[PSB_MAX_TA_CMDS];
17329+ uint32_t raster_cmds[PSB_MAX_RASTER_CMDS];
17330+ uint32_t oom_cmds[PSB_MAX_OOM_CMDS];
17331+ uint32_t ta_cmd_size;
17332+ uint32_t raster_cmd_size;
17333+ uint32_t oom_cmd_size;
17334+ uint32_t feedback_offset;
17335+ uint32_t ta_complete_action;
17336+ uint32_t raster_complete_action;
17337+ uint32_t hw_cookie;
17338+ uint32_t flags;
17339+ uint32_t reply_flags;
17340+ uint32_t aborting;
17341+ struct psb_xhw_buf buf;
17342+};
17343+
17344+struct psb_hw_scene {
17345+ struct list_head head;
17346+ uint32_t context_number;
17347+
17348+ /*
17349+ * This pointer does not refcount the last_scene_buffer,
17350+ * so we must make sure it is set to NULL before destroying
17351+ * the corresponding task.
17352+ */
17353+
17354+ struct psb_scene *last_scene;
17355+};
17356+
17357+struct psb_scene;
17358+struct drm_psb_private;
17359+
17360+struct psb_scheduler_seq {
17361+ uint32_t sequence;
17362+ int reported;
17363+};
17364+
17365+struct psb_scheduler {
17366+ struct drm_device *dev;
17367+ struct psb_scheduler_seq seq[_PSB_ENGINE_TA_FENCE_TYPES];
17368+ struct psb_hw_scene hs[PSB_NUM_HW_SCENES];
17369+ struct mutex task_wq_mutex;
17370+ spinlock_t lock;
17371+ struct list_head hw_scenes;
17372+ struct list_head ta_queue;
17373+ struct list_head raster_queue;
17374+ struct list_head hp_raster_queue;
17375+ struct list_head task_done_queue;
17376+ struct psb_task *current_task[PSB_SCENE_NUM_ENGINES];
17377+ struct psb_task *feedback_task;
17378+ int ta_state;
17379+ struct psb_hw_scene *pending_hw_scene;
17380+ uint32_t pending_hw_scene_seq;
17381+ struct delayed_work wq;
17382+ struct psb_scene_pool *pool;
17383+ uint32_t idle_count;
17384+ int idle;
17385+ wait_queue_head_t idle_queue;
17386+ unsigned long ta_end_jiffies;
17387+ unsigned long raster_end_jiffies;
17388+ unsigned long total_raster_jiffies;
17389+};
17390+
17391+#define PSB_RF_FIRE_TA (1 << 0)
17392+#define PSB_RF_OOM (1 << 1)
17393+#define PSB_RF_OOM_REPLY (1 << 2)
17394+#define PSB_RF_TERMINATE (1 << 3)
17395+#define PSB_RF_TA_DONE (1 << 4)
17396+#define PSB_RF_FIRE_RASTER (1 << 5)
17397+#define PSB_RF_RASTER_DONE (1 << 6)
17398+#define PSB_RF_DEALLOC (1 << 7)
17399+
17400+extern struct psb_scene_pool *psb_alloc_scene_pool(struct drm_file *priv,
17401+ int shareable, uint32_t w,
17402+ uint32_t h);
17403+extern uint32_t psb_scene_handle(struct psb_scene *scene);
17404+extern int psb_scheduler_init(struct drm_device *dev,
17405+ struct psb_scheduler *scheduler);
17406+extern void psb_scheduler_takedown(struct psb_scheduler *scheduler);
17407+extern int psb_cmdbuf_ta(struct drm_file *priv,
17408+ struct drm_psb_cmdbuf_arg *arg,
17409+ struct drm_buffer_object *cmd_buffer,
17410+ struct drm_buffer_object *ta_buffer,
17411+ struct drm_buffer_object *oom_buffer,
17412+ struct psb_scene *scene,
17413+ struct psb_feedback_info *feedback,
17414+ struct drm_fence_arg *fence_arg);
17415+extern int psb_cmdbuf_raster(struct drm_file *priv,
17416+ struct drm_psb_cmdbuf_arg *arg,
17417+ struct drm_buffer_object *cmd_buffer,
17418+ struct drm_fence_arg *fence_arg);
17419+extern void psb_scheduler_handler(struct drm_psb_private *dev_priv,
17420+ uint32_t status);
17421+extern void psb_scheduler_pause(struct drm_psb_private *dev_priv);
17422+extern void psb_scheduler_restart(struct drm_psb_private *dev_priv);
17423+extern int psb_scheduler_idle(struct drm_psb_private *dev_priv);
17424+extern int psb_scheduler_finished(struct drm_psb_private *dev_priv);
17425+
17426+extern void psb_scheduler_lockup(struct drm_psb_private *dev_priv,
17427+ int *lockup, int *idle);
17428+extern void psb_scheduler_reset(struct drm_psb_private *dev_priv,
17429+ int error_condition);
17430+extern int psb_forced_user_interrupt(struct drm_psb_private *dev_priv);
17431+extern void psb_scheduler_remove_scene_refs(struct psb_scene *scene);
17432+extern void psb_scheduler_ta_mem_check(struct drm_psb_private *dev_priv);
17433+extern int psb_extend_raster_timeout(struct drm_psb_private *dev_priv);
17434+
17435+#endif
17436Index: linux-2.6.28/drivers/gpu/drm/psb/psb_sgx.c
17437===================================================================
17438--- /dev/null 1970-01-01 00:00:00.000000000 +0000
17439+++ linux-2.6.28/drivers/gpu/drm/psb/psb_sgx.c 2009-02-20 12:23:06.000000000 +0000
17440@@ -0,0 +1,1422 @@
17441+/**************************************************************************
17442+ * Copyright (c) 2007, Intel Corporation.
17443+ * All Rights Reserved.
17444+ *
17445+ * This program is free software; you can redistribute it and/or modify it
17446+ * under the terms and conditions of the GNU General Public License,
17447+ * version 2, as published by the Free Software Foundation.
17448+ *
17449+ * This program is distributed in the hope it will be useful, but WITHOUT
17450+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17451+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17452+ * more details.
17453+ *
17454+ * You should have received a copy of the GNU General Public License along with
17455+ * this program; if not, write to the Free Software Foundation, Inc.,
17456+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17457+ *
17458+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
17459+ * develop this driver.
17460+ *
17461+ **************************************************************************/
17462+/*
17463+ */
17464+
17465+#include "drmP.h"
17466+#include "psb_drv.h"
17467+#include "psb_drm.h"
17468+#include "psb_reg.h"
17469+#include "psb_scene.h"
17470+
17471+#include "psb_msvdx.h"
17472+
17473+int psb_submit_video_cmdbuf(struct drm_device *dev,
17474+ struct drm_buffer_object *cmd_buffer,
17475+ unsigned long cmd_offset, unsigned long cmd_size,
17476+ struct drm_fence_object *fence);
17477+
17478+struct psb_dstbuf_cache {
17479+ unsigned int dst;
17480+ uint32_t *use_page;
17481+ unsigned int use_index;
17482+ uint32_t use_background;
17483+ struct drm_buffer_object *dst_buf;
17484+ unsigned long dst_offset;
17485+ uint32_t *dst_page;
17486+ unsigned int dst_page_offset;
17487+ struct drm_bo_kmap_obj dst_kmap;
17488+ int dst_is_iomem;
17489+};
17490+
17491+struct psb_buflist_item {
17492+ struct drm_buffer_object *bo;
17493+ void __user *data;
17494+ int ret;
17495+ int presumed_offset_correct;
17496+};
17497+
17498+
17499+#define PSB_REG_GRAN_SHIFT 2
17500+#define PSB_REG_GRANULARITY (1 << PSB_REG_GRAN_SHIFT)
17501+#define PSB_MAX_REG 0x1000
17502+
17503+static const uint32_t disallowed_ranges[][2] = {
17504+ {0x0000, 0x0200},
17505+ {0x0208, 0x0214},
17506+ {0x021C, 0x0224},
17507+ {0x0230, 0x0234},
17508+ {0x0248, 0x024C},
17509+ {0x0254, 0x0358},
17510+ {0x0428, 0x0428},
17511+ {0x0430, 0x043C},
17512+ {0x0498, 0x04B4},
17513+ {0x04CC, 0x04D8},
17514+ {0x04E0, 0x07FC},
17515+ {0x0804, 0x0A58},
17516+ {0x0A68, 0x0A80},
17517+ {0x0AA0, 0x0B1C},
17518+ {0x0B2C, 0x0CAC},
17519+ {0x0CB4, PSB_MAX_REG - PSB_REG_GRANULARITY}
17520+};
17521+
17522+static uint32_t psb_disallowed_regs[PSB_MAX_REG /
17523+ (PSB_REG_GRANULARITY *
17524+ (sizeof(uint32_t) << 3))];
17525+
17526+static inline int psb_disallowed(uint32_t reg)
17527+{
17528+ reg >>= PSB_REG_GRAN_SHIFT;
17529+ return ((psb_disallowed_regs[reg >> 5] & (1 << (reg & 31))) != 0);
17530+}
17531+
17532+void psb_init_disallowed(void)
17533+{
17534+ int i;
17535+ uint32_t reg, tmp;
17536+ static int initialized = 0;
17537+
17538+ if (initialized)
17539+ return;
17540+
17541+ initialized = 1;
17542+ memset(psb_disallowed_regs, 0, sizeof(psb_disallowed_regs));
17543+
17544+ for (i = 0; i < (sizeof(disallowed_ranges) / (2 * sizeof(uint32_t)));
17545+ ++i) {
17546+ for (reg = disallowed_ranges[i][0];
17547+ reg <= disallowed_ranges[i][1]; reg += 4) {
17548+ tmp = reg >> 2;
17549+ psb_disallowed_regs[tmp >> 5] |= (1 << (tmp & 31));
17550+ }
17551+ }
17552+}
17553+
17554+static int psb_memcpy_check(uint32_t * dst, const uint32_t * src, uint32_t size)
17555+{
17556+ size >>= 3;
17557+ while (size--) {
17558+ if (unlikely((*src >= 0x1000) || psb_disallowed(*src))) {
17559+ DRM_ERROR("Forbidden SGX register access: "
17560+ "0x%04x.\n", *src);
17561+ return -EPERM;
17562+ }
17563+ *dst++ = *src++;
17564+ *dst++ = *src++;
17565+ }
17566+ return 0;
17567+}
17568+
17569+static int psb_2d_wait_available(struct drm_psb_private *dev_priv,
17570+ unsigned size)
17571+{
17572+ uint32_t avail = PSB_RSGX32(PSB_CR_2D_SOCIF);
17573+ int ret = 0;
17574+
17575+ retry:
17576+ if (avail < size) {
17577+#if 0
17578+ /* We'd ideally
17579+ * like to have an IRQ-driven event here.
17580+ */
17581+
17582+ psb_2D_irq_on(dev_priv);
17583+ DRM_WAIT_ON(ret, dev_priv->event_2d_queue, DRM_HZ,
17584+ ((avail = PSB_RSGX32(PSB_CR_2D_SOCIF)) >= size));
17585+ psb_2D_irq_off(dev_priv);
17586+ if (ret == 0)
17587+ return 0;
17588+ if (ret == -EINTR) {
17589+ ret = 0;
17590+ goto retry;
17591+ }
17592+#else
17593+ avail = PSB_RSGX32(PSB_CR_2D_SOCIF);
17594+ goto retry;
17595+#endif
17596+ }
17597+ return ret;
17598+}
17599+
17600+int psb_2d_submit(struct drm_psb_private *dev_priv, uint32_t * cmdbuf,
17601+ unsigned size)
17602+{
17603+ int ret = 0;
17604+ int i;
17605+ unsigned submit_size;
17606+
17607+ while (size > 0) {
17608+ submit_size = (size < 0x60) ? size : 0x60;
17609+ size -= submit_size;
17610+ ret = psb_2d_wait_available(dev_priv, submit_size);
17611+ if (ret)
17612+ return ret;
17613+
17614+ submit_size <<= 2;
17615+
17616+ for (i = 0; i < submit_size; i += 4) {
17617+ PSB_WSGX32(*cmdbuf++, PSB_SGX_2D_SLAVE_PORT + i);
17618+ }
17619+ (void)PSB_RSGX32(PSB_SGX_2D_SLAVE_PORT + i - 4);
17620+ }
17621+ return 0;
17622+}
17623+
17624+int psb_blit_sequence(struct drm_psb_private *dev_priv, uint32_t sequence)
17625+{
17626+ uint32_t buffer[8];
17627+ uint32_t *bufp = buffer;
17628+ int ret;
17629+
17630+ *bufp++ = PSB_2D_FENCE_BH;
17631+
17632+ *bufp++ = PSB_2D_DST_SURF_BH |
17633+ PSB_2D_DST_8888ARGB | (4 << PSB_2D_DST_STRIDE_SHIFT);
17634+ *bufp++ = dev_priv->comm_mmu_offset - dev_priv->mmu_2d_offset;
17635+
17636+ *bufp++ = PSB_2D_BLIT_BH |
17637+ PSB_2D_ROT_NONE |
17638+ PSB_2D_COPYORDER_TL2BR |
17639+ PSB_2D_DSTCK_DISABLE |
17640+ PSB_2D_SRCCK_DISABLE | PSB_2D_USE_FILL | PSB_2D_ROP3_PATCOPY;
17641+
17642+ *bufp++ = sequence << PSB_2D_FILLCOLOUR_SHIFT;
17643+ *bufp++ = (0 << PSB_2D_DST_XSTART_SHIFT) |
17644+ (0 << PSB_2D_DST_YSTART_SHIFT);
17645+ *bufp++ = (1 << PSB_2D_DST_XSIZE_SHIFT) | (1 << PSB_2D_DST_YSIZE_SHIFT);
17646+
17647+ *bufp++ = PSB_2D_FLUSH_BH;
17648+
17649+ psb_2d_lock(dev_priv);
17650+ ret = psb_2d_submit(dev_priv, buffer, bufp - buffer);
17651+ psb_2d_unlock(dev_priv);
17652+
17653+ if (!ret)
17654+ psb_schedule_watchdog(dev_priv);
17655+ return ret;
17656+}
17657+
17658+int psb_emit_2d_copy_blit(struct drm_device *dev,
17659+ uint32_t src_offset,
17660+ uint32_t dst_offset, uint32_t pages, int direction)
17661+{
17662+ uint32_t cur_pages;
17663+ struct drm_psb_private *dev_priv = dev->dev_private;
17664+ uint32_t buf[10];
17665+ uint32_t *bufp;
17666+ uint32_t xstart;
17667+ uint32_t ystart;
17668+ uint32_t blit_cmd;
17669+ uint32_t pg_add;
17670+ int ret = 0;
17671+
17672+ if (!dev_priv)
17673+ return 0;
17674+
17675+ if (direction) {
17676+ pg_add = (pages - 1) << PAGE_SHIFT;
17677+ src_offset += pg_add;
17678+ dst_offset += pg_add;
17679+ }
17680+
17681+ blit_cmd = PSB_2D_BLIT_BH |
17682+ PSB_2D_ROT_NONE |
17683+ PSB_2D_DSTCK_DISABLE |
17684+ PSB_2D_SRCCK_DISABLE |
17685+ PSB_2D_USE_PAT |
17686+ PSB_2D_ROP3_SRCCOPY |
17687+ (direction ? PSB_2D_COPYORDER_BR2TL : PSB_2D_COPYORDER_TL2BR);
17688+ xstart = (direction) ? ((PAGE_SIZE - 1) >> 2) : 0;
17689+
17690+ psb_2d_lock(dev_priv);
17691+ while (pages > 0) {
17692+ cur_pages = pages;
17693+ if (cur_pages > 2048)
17694+ cur_pages = 2048;
17695+ pages -= cur_pages;
17696+ ystart = (direction) ? cur_pages - 1 : 0;
17697+
17698+ bufp = buf;
17699+ *bufp++ = PSB_2D_FENCE_BH;
17700+
17701+ *bufp++ = PSB_2D_DST_SURF_BH | PSB_2D_DST_8888ARGB |
17702+ (PAGE_SIZE << PSB_2D_DST_STRIDE_SHIFT);
17703+ *bufp++ = dst_offset;
17704+ *bufp++ = PSB_2D_SRC_SURF_BH | PSB_2D_SRC_8888ARGB |
17705+ (PAGE_SIZE << PSB_2D_SRC_STRIDE_SHIFT);
17706+ *bufp++ = src_offset;
17707+ *bufp++ =
17708+ PSB_2D_SRC_OFF_BH | (xstart << PSB_2D_SRCOFF_XSTART_SHIFT) |
17709+ (ystart << PSB_2D_SRCOFF_YSTART_SHIFT);
17710+ *bufp++ = blit_cmd;
17711+ *bufp++ = (xstart << PSB_2D_DST_XSTART_SHIFT) |
17712+ (ystart << PSB_2D_DST_YSTART_SHIFT);
17713+ *bufp++ = ((PAGE_SIZE >> 2) << PSB_2D_DST_XSIZE_SHIFT) |
17714+ (cur_pages << PSB_2D_DST_YSIZE_SHIFT);
17715+
17716+ ret = psb_2d_submit(dev_priv, buf, bufp - buf);
17717+ if (ret)
17718+ goto out;
17719+ pg_add = (cur_pages << PAGE_SHIFT) * ((direction) ? -1 : 1);
17720+ src_offset += pg_add;
17721+ dst_offset += pg_add;
17722+ }
17723+ out:
17724+ psb_2d_unlock(dev_priv);
17725+ return ret;
17726+}
17727+
17728+void psb_init_2d(struct drm_psb_private *dev_priv)
17729+{
17730+ dev_priv->sequence_lock = SPIN_LOCK_UNLOCKED;
17731+ psb_reset(dev_priv, 1);
17732+ dev_priv->mmu_2d_offset = dev_priv->pg->gatt_start;
17733+ PSB_WSGX32(dev_priv->mmu_2d_offset, PSB_CR_BIF_TWOD_REQ_BASE);
17734+ (void)PSB_RSGX32(PSB_CR_BIF_TWOD_REQ_BASE);
17735+}
17736+
17737+int psb_idle_2d(struct drm_device *dev)
17738+{
17739+ struct drm_psb_private *dev_priv = dev->dev_private;
17740+ unsigned long _end = jiffies + DRM_HZ;
17741+ int busy = 0;
17742+
17743+ /*
17744+ * First idle the 2D engine.
17745+ */
17746+
17747+ if (dev_priv->engine_lockup_2d)
17748+ return -EBUSY;
17749+
17750+ if ((PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) &&
17751+ ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY) == 0))
17752+ goto out;
17753+
17754+ do {
17755+ busy = (PSB_RSGX32(PSB_CR_2D_SOCIF) != _PSB_C2_SOCIF_EMPTY);
17756+ } while (busy && !time_after_eq(jiffies, _end));
17757+
17758+ if (busy)
17759+ busy = (PSB_RSGX32(PSB_CR_2D_SOCIF) != _PSB_C2_SOCIF_EMPTY);
17760+ if (busy)
17761+ goto out;
17762+
17763+ do {
17764+ busy =
17765+ ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY)
17766+ != 0);
17767+ } while (busy && !time_after_eq(jiffies, _end));
17768+ if (busy)
17769+ busy =
17770+ ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY)
17771+ != 0);
17772+
17773+ out:
17774+ if (busy)
17775+ dev_priv->engine_lockup_2d = 1;
17776+
17777+ return (busy) ? -EBUSY : 0;
17778+}
17779+
17780+int psb_idle_3d(struct drm_device *dev)
17781+{
17782+ struct drm_psb_private *dev_priv = dev->dev_private;
17783+ struct psb_scheduler *scheduler = &dev_priv->scheduler;
17784+ int ret;
17785+
17786+ ret = wait_event_timeout(scheduler->idle_queue,
17787+ psb_scheduler_finished(dev_priv), DRM_HZ * 10);
17788+
17789+ return (ret < 1) ? -EBUSY : 0;
17790+}
17791+
17792+static void psb_dereference_buffers_locked(struct psb_buflist_item *buffers,
17793+ unsigned num_buffers)
17794+{
17795+ while (num_buffers--)
17796+ drm_bo_usage_deref_locked(&((buffers++)->bo));
17797+
17798+}
17799+
17800+static int psb_check_presumed(struct drm_bo_op_arg *arg,
17801+ struct drm_buffer_object *bo,
17802+ uint32_t __user * data, int *presumed_ok)
17803+{
17804+ struct drm_bo_op_req *req = &arg->d.req;
17805+ uint32_t hint_offset;
17806+ uint32_t hint = req->bo_req.hint;
17807+
17808+ *presumed_ok = 0;
17809+
17810+ if (!(hint & DRM_BO_HINT_PRESUMED_OFFSET))
17811+ return 0;
17812+ if (bo->mem.mem_type == DRM_BO_MEM_LOCAL) {
17813+ *presumed_ok = 1;
17814+ return 0;
17815+ }
17816+ if (bo->offset == req->bo_req.presumed_offset) {
17817+ *presumed_ok = 1;
17818+ return 0;
17819+ }
17820+
17821+ /*
17822+ * We need to turn off the HINT_PRESUMED_OFFSET for this buffer in
17823+ * the user-space IOCTL argument list, since the buffer has moved,
17824+ * we're about to apply relocations and we might subsequently
17825+ * hit an -EAGAIN. In that case the argument list will be reused by
17826+ * user-space, but the presumed offset is no longer valid.
17827+ *
17828+ * Needless to say, this is a bit ugly.
17829+ */
17830+
17831+ hint_offset = (uint32_t *) & req->bo_req.hint - (uint32_t *) arg;
17832+ hint &= ~DRM_BO_HINT_PRESUMED_OFFSET;
17833+ return __put_user(hint, data + hint_offset);
17834+}
17835+
17836+static int psb_validate_buffer_list(struct drm_file *file_priv,
17837+ unsigned fence_class,
17838+ unsigned long data,
17839+ struct psb_buflist_item *buffers,
17840+ unsigned *num_buffers)
17841+{
17842+ struct drm_bo_op_arg arg;
17843+ struct drm_bo_op_req *req = &arg.d.req;
17844+ int ret = 0;
17845+ unsigned buf_count = 0;
17846+ struct psb_buflist_item *item = buffers;
17847+
17848+ do {
17849+ if (buf_count >= *num_buffers) {
17850+ DRM_ERROR("Buffer count exceeded %d\n.", *num_buffers);
17851+ ret = -EINVAL;
17852+ goto out_err;
17853+ }
17854+ item = buffers + buf_count;
17855+ item->bo = NULL;
17856+
17857+ if (copy_from_user(&arg, (void __user *)data, sizeof(arg))) {
17858+ ret = -EFAULT;
17859+ DRM_ERROR("Error copying validate list.\n"
17860+ "\tbuffer %d, user addr 0x%08lx %d\n",
17861+ buf_count, (unsigned long)data, sizeof(arg));
17862+ goto out_err;
17863+ }
17864+
17865+ ret = 0;
17866+ if (req->op != drm_bo_validate) {
17867+ DRM_ERROR
17868+ ("Buffer object operation wasn't \"validate\".\n");
17869+ ret = -EINVAL;
17870+ goto out_err;
17871+ }
17872+
17873+ item->ret = 0;
17874+ item->data = (void *)__user data;
17875+ ret = drm_bo_handle_validate(file_priv,
17876+ req->bo_req.handle,
17877+ fence_class,
17878+ req->bo_req.flags,
17879+ req->bo_req.mask,
17880+ req->bo_req.hint,
17881+ 0, NULL, &item->bo);
17882+ if (ret)
17883+ goto out_err;
17884+
17885+ PSB_DEBUG_GENERAL("Validated buffer at 0x%08lx\n",
17886+ buffers[buf_count].bo->offset);
17887+
17888+ buf_count++;
17889+
17890+
17891+ ret = psb_check_presumed(&arg, item->bo,
17892+ (uint32_t __user *)
17893+ (unsigned long) data,
17894+ &item->presumed_offset_correct);
17895+
17896+ if (ret)
17897+ goto out_err;
17898+
17899+ data = arg.next;
17900+ } while (data);
17901+
17902+ *num_buffers = buf_count;
17903+
17904+ return 0;
17905+ out_err:
17906+
17907+ *num_buffers = buf_count;
17908+ item->ret = (ret != -EAGAIN) ? ret : 0;
17909+ return ret;
17910+}
17911+
17912+int
17913+psb_reg_submit(struct drm_psb_private *dev_priv, uint32_t * regs,
17914+ unsigned int cmds)
17915+{
17916+ int i;
17917+
17918+ /*
17919+ * cmds is 32-bit words.
17920+ */
17921+
17922+ cmds >>= 1;
17923+ for (i = 0; i < cmds; ++i) {
17924+ PSB_WSGX32(regs[1], regs[0]);
17925+ regs += 2;
17926+ }
17927+ wmb();
17928+ return 0;
17929+}
17930+
17931+/*
17932+ * Security: Block user-space writing to MMU mapping registers.
17933+ * This is important for security and brings Poulsbo DRM
17934+ * up to par with the other DRM drivers. Using this,
17935+ * user-space should not be able to map arbitrary memory
17936+ * pages to graphics memory, but all user-space processes
17937+ * basically have access to all buffer objects mapped to
17938+ * graphics memory.
17939+ */
17940+
17941+int
17942+psb_submit_copy_cmdbuf(struct drm_device *dev,
17943+ struct drm_buffer_object *cmd_buffer,
17944+ unsigned long cmd_offset,
17945+ unsigned long cmd_size,
17946+ int engine, uint32_t * copy_buffer)
17947+{
17948+ unsigned long cmd_end = cmd_offset + (cmd_size << 2);
17949+ struct drm_psb_private *dev_priv = dev->dev_private;
17950+ unsigned long cmd_page_offset = cmd_offset - (cmd_offset & PAGE_MASK);
17951+ unsigned long cmd_next;
17952+ struct drm_bo_kmap_obj cmd_kmap;
17953+ uint32_t *cmd_page;
17954+ unsigned cmds;
17955+ int is_iomem;
17956+ int ret = 0;
17957+
17958+ if (cmd_size == 0)
17959+ return 0;
17960+
17961+ if (engine == PSB_ENGINE_2D)
17962+ psb_2d_lock(dev_priv);
17963+
17964+ do {
17965+ cmd_next = drm_bo_offset_end(cmd_offset, cmd_end);
17966+ ret = drm_bo_kmap(cmd_buffer, cmd_offset >> PAGE_SHIFT,
17967+ 1, &cmd_kmap);
17968+
17969+ if (ret)
17970+ return ret;
17971+ cmd_page = drm_bmo_virtual(&cmd_kmap, &is_iomem);
17972+ cmd_page_offset = (cmd_offset & ~PAGE_MASK) >> 2;
17973+ cmds = (cmd_next - cmd_offset) >> 2;
17974+
17975+ switch (engine) {
17976+ case PSB_ENGINE_2D:
17977+ ret =
17978+ psb_2d_submit(dev_priv, cmd_page + cmd_page_offset,
17979+ cmds);
17980+ break;
17981+ case PSB_ENGINE_RASTERIZER:
17982+ case PSB_ENGINE_TA:
17983+ case PSB_ENGINE_HPRAST:
17984+ PSB_DEBUG_GENERAL("Reg copy.\n");
17985+ ret = psb_memcpy_check(copy_buffer,
17986+ cmd_page + cmd_page_offset,
17987+ cmds * sizeof(uint32_t));
17988+ copy_buffer += cmds;
17989+ break;
17990+ default:
17991+ ret = -EINVAL;
17992+ }
17993+ drm_bo_kunmap(&cmd_kmap);
17994+ if (ret)
17995+ break;
17996+ } while (cmd_offset = cmd_next, cmd_offset != cmd_end);
17997+
17998+ if (engine == PSB_ENGINE_2D)
17999+ psb_2d_unlock(dev_priv);
18000+
18001+ return ret;
18002+}
18003+
18004+static void psb_clear_dstbuf_cache(struct psb_dstbuf_cache *dst_cache)
18005+{
18006+ if (dst_cache->dst_page) {
18007+ drm_bo_kunmap(&dst_cache->dst_kmap);
18008+ dst_cache->dst_page = NULL;
18009+ }
18010+ dst_cache->dst_buf = NULL;
18011+ dst_cache->dst = ~0;
18012+ dst_cache->use_page = NULL;
18013+}
18014+
18015+static int psb_update_dstbuf_cache(struct psb_dstbuf_cache *dst_cache,
18016+ struct psb_buflist_item *buffers,
18017+ unsigned int dst, unsigned long dst_offset)
18018+{
18019+ int ret;
18020+
18021+ PSB_DEBUG_RELOC("Destination buffer is %d.\n", dst);
18022+
18023+ if (unlikely(dst != dst_cache->dst || NULL == dst_cache->dst_buf)) {
18024+ psb_clear_dstbuf_cache(dst_cache);
18025+ dst_cache->dst = dst;
18026+ dst_cache->dst_buf = buffers[dst].bo;
18027+ }
18028+
18029+ if (unlikely(dst_offset > dst_cache->dst_buf->num_pages * PAGE_SIZE)) {
18030+ DRM_ERROR("Relocation destination out of bounds.\n");
18031+ return -EINVAL;
18032+ }
18033+
18034+ if (!drm_bo_same_page(dst_cache->dst_offset, dst_offset) ||
18035+ NULL == dst_cache->dst_page) {
18036+ if (NULL != dst_cache->dst_page) {
18037+ drm_bo_kunmap(&dst_cache->dst_kmap);
18038+ dst_cache->dst_page = NULL;
18039+ }
18040+
18041+ ret = drm_bo_kmap(dst_cache->dst_buf, dst_offset >> PAGE_SHIFT,
18042+ 1, &dst_cache->dst_kmap);
18043+ if (ret) {
18044+ DRM_ERROR("Could not map destination buffer for "
18045+ "relocation.\n");
18046+ return ret;
18047+ }
18048+
18049+ dst_cache->dst_page = drm_bmo_virtual(&dst_cache->dst_kmap,
18050+ &dst_cache->dst_is_iomem);
18051+ dst_cache->dst_offset = dst_offset & PAGE_MASK;
18052+ dst_cache->dst_page_offset = dst_cache->dst_offset >> 2;
18053+ }
18054+ return 0;
18055+}
18056+
18057+static int psb_apply_reloc(struct drm_psb_private *dev_priv,
18058+ uint32_t fence_class,
18059+ const struct drm_psb_reloc *reloc,
18060+ struct psb_buflist_item *buffers,
18061+ int num_buffers,
18062+ struct psb_dstbuf_cache *dst_cache,
18063+ int no_wait, int interruptible)
18064+{
18065+ int reg;
18066+ uint32_t val;
18067+ uint32_t background;
18068+ unsigned int index;
18069+ int ret;
18070+ unsigned int shift;
18071+ unsigned int align_shift;
18072+ uint32_t fence_type;
18073+ struct drm_buffer_object *reloc_bo;
18074+
18075+ PSB_DEBUG_RELOC("Reloc type %d\n"
18076+ "\t where 0x%04x\n"
18077+ "\t buffer 0x%04x\n"
18078+ "\t mask 0x%08x\n"
18079+ "\t shift 0x%08x\n"
18080+ "\t pre_add 0x%08x\n"
18081+ "\t background 0x%08x\n"
18082+ "\t dst_buffer 0x%08x\n"
18083+ "\t arg0 0x%08x\n"
18084+ "\t arg1 0x%08x\n",
18085+ reloc->reloc_op,
18086+ reloc->where,
18087+ reloc->buffer,
18088+ reloc->mask,
18089+ reloc->shift,
18090+ reloc->pre_add,
18091+ reloc->background,
18092+ reloc->dst_buffer, reloc->arg0, reloc->arg1);
18093+
18094+ if (unlikely(reloc->buffer >= num_buffers)) {
18095+ DRM_ERROR("Illegal relocation buffer %d.\n", reloc->buffer);
18096+ return -EINVAL;
18097+ }
18098+
18099+ if (buffers[reloc->buffer].presumed_offset_correct)
18100+ return 0;
18101+
18102+ if (unlikely(reloc->dst_buffer >= num_buffers)) {
18103+ DRM_ERROR("Illegal destination buffer for relocation %d.\n",
18104+ reloc->dst_buffer);
18105+ return -EINVAL;
18106+ }
18107+
18108+ ret = psb_update_dstbuf_cache(dst_cache, buffers, reloc->dst_buffer,
18109+ reloc->where << 2);
18110+ if (ret)
18111+ return ret;
18112+
18113+ reloc_bo = buffers[reloc->buffer].bo;
18114+
18115+ if (unlikely(reloc->pre_add > (reloc_bo->num_pages << PAGE_SHIFT))) {
18116+ DRM_ERROR("Illegal relocation offset add.\n");
18117+ return -EINVAL;
18118+ }
18119+
18120+ switch (reloc->reloc_op) {
18121+ case PSB_RELOC_OP_OFFSET:
18122+ val = reloc_bo->offset + reloc->pre_add;
18123+ break;
18124+ case PSB_RELOC_OP_2D_OFFSET:
18125+ val = reloc_bo->offset + reloc->pre_add -
18126+ dev_priv->mmu_2d_offset;
18127+ if (unlikely(val >= PSB_2D_SIZE)) {
18128+ DRM_ERROR("2D relocation out of bounds\n");
18129+ return -EINVAL;
18130+ }
18131+ break;
18132+ case PSB_RELOC_OP_PDS_OFFSET:
18133+ val = reloc_bo->offset + reloc->pre_add - PSB_MEM_PDS_START;
18134+ if (unlikely(val >= (PSB_MEM_MMU_START - PSB_MEM_PDS_START))) {
18135+ DRM_ERROR("PDS relocation out of bounds\n");
18136+ return -EINVAL;
18137+ }
18138+ break;
18139+ case PSB_RELOC_OP_USE_OFFSET:
18140+ case PSB_RELOC_OP_USE_REG:
18141+
18142+ /*
18143+ * Security:
18144+ * Only allow VERTEX or PIXEL data masters, as
18145+ * shaders run under other data masters may in theory
18146+ * alter MMU mappings.
18147+ */
18148+
18149+ if (unlikely(reloc->arg1 != _PSB_CUC_DM_PIXEL &&
18150+ reloc->arg1 != _PSB_CUC_DM_VERTEX)) {
18151+ DRM_ERROR("Invalid data master in relocation. %d\n",
18152+ reloc->arg1);
18153+ return -EPERM;
18154+ }
18155+
18156+ fence_type = reloc_bo->fence_type;
18157+ ret = psb_grab_use_base(dev_priv,
18158+ reloc_bo->offset +
18159+ reloc->pre_add, reloc->arg0,
18160+ reloc->arg1, fence_class,
18161+ fence_type, no_wait,
18162+ interruptible, &reg, &val);
18163+ if (ret)
18164+ return ret;
18165+
18166+ val = (reloc->reloc_op == PSB_RELOC_OP_USE_REG) ? reg : val;
18167+ break;
18168+ default:
18169+ DRM_ERROR("Unimplemented relocation.\n");
18170+ return -EINVAL;
18171+ }
18172+
18173+ shift = (reloc->shift & PSB_RELOC_SHIFT_MASK) >> PSB_RELOC_SHIFT_SHIFT;
18174+ align_shift = (reloc->shift & PSB_RELOC_ALSHIFT_MASK) >>
18175+ PSB_RELOC_ALSHIFT_SHIFT;
18176+
18177+ val = ((val >> align_shift) << shift);
18178+ index = reloc->where - dst_cache->dst_page_offset;
18179+
18180+ background = reloc->background;
18181+
18182+ if (reloc->reloc_op == PSB_RELOC_OP_USE_OFFSET) {
18183+ if (dst_cache->use_page == dst_cache->dst_page &&
18184+ dst_cache->use_index == index)
18185+ background = dst_cache->use_background;
18186+ else
18187+ background = dst_cache->dst_page[index];
18188+ }
18189+#if 0
18190+ if (dst_cache->dst_page[index] != PSB_RELOC_MAGIC &&
18191+ reloc->reloc_op != PSB_RELOC_OP_USE_OFFSET)
18192+ DRM_ERROR("Inconsistent relocation 0x%08lx.\n",
18193+ (unsigned long)dst_cache->dst_page[index]);
18194+#endif
18195+
18196+ val = (background & ~reloc->mask) | (val & reloc->mask);
18197+ dst_cache->dst_page[index] = val;
18198+
18199+ if (reloc->reloc_op == PSB_RELOC_OP_USE_OFFSET ||
18200+ reloc->reloc_op == PSB_RELOC_OP_USE_REG) {
18201+ dst_cache->use_page = dst_cache->dst_page;
18202+ dst_cache->use_index = index;
18203+ dst_cache->use_background = val;
18204+ }
18205+
18206+ PSB_DEBUG_RELOC("Reloc buffer %d index 0x%08x, value 0x%08x\n",
18207+ reloc->dst_buffer, index, dst_cache->dst_page[index]);
18208+
18209+ return 0;
18210+}
18211+
18212+static int psb_ok_to_map_reloc(struct drm_psb_private *dev_priv,
18213+ unsigned int num_pages)
18214+{
18215+ int ret = 0;
18216+
18217+ spin_lock(&dev_priv->reloc_lock);
18218+ if (dev_priv->rel_mapped_pages + num_pages <= PSB_MAX_RELOC_PAGES) {
18219+ dev_priv->rel_mapped_pages += num_pages;
18220+ ret = 1;
18221+ }
18222+ spin_unlock(&dev_priv->reloc_lock);
18223+ return ret;
18224+}
18225+
18226+static int psb_fixup_relocs(struct drm_file *file_priv,
18227+ uint32_t fence_class,
18228+ unsigned int num_relocs,
18229+ unsigned int reloc_offset,
18230+ uint32_t reloc_handle,
18231+ struct psb_buflist_item *buffers,
18232+ unsigned int num_buffers,
18233+ int no_wait, int interruptible)
18234+{
18235+ struct drm_device *dev = file_priv->minor->dev;
18236+ struct drm_psb_private *dev_priv =
18237+ (struct drm_psb_private *)dev->dev_private;
18238+ struct drm_buffer_object *reloc_buffer = NULL;
18239+ unsigned int reloc_num_pages;
18240+ unsigned int reloc_first_page;
18241+ unsigned int reloc_last_page;
18242+ struct psb_dstbuf_cache dst_cache;
18243+ struct drm_psb_reloc *reloc;
18244+ struct drm_bo_kmap_obj reloc_kmap;
18245+ int reloc_is_iomem;
18246+ int count;
18247+ int ret = 0;
18248+ int registered = 0;
18249+ int short_circuit = 1;
18250+ int i;
18251+
18252+ if (num_relocs == 0)
18253+ return 0;
18254+
18255+ for (i=0; i<num_buffers; ++i) {
18256+ if (!buffers[i].presumed_offset_correct) {
18257+ short_circuit = 0;
18258+ break;
18259+ }
18260+ }
18261+
18262+ if (short_circuit)
18263+ return 0;
18264+
18265+ memset(&dst_cache, 0, sizeof(dst_cache));
18266+ memset(&reloc_kmap, 0, sizeof(reloc_kmap));
18267+
18268+ mutex_lock(&dev->struct_mutex);
18269+ reloc_buffer = drm_lookup_buffer_object(file_priv, reloc_handle, 1);
18270+ mutex_unlock(&dev->struct_mutex);
18271+ if (!reloc_buffer)
18272+ goto out;
18273+
18274+ reloc_first_page = reloc_offset >> PAGE_SHIFT;
18275+ reloc_last_page =
18276+ (reloc_offset +
18277+ num_relocs * sizeof(struct drm_psb_reloc)) >> PAGE_SHIFT;
18278+ reloc_num_pages = reloc_last_page - reloc_first_page + 1;
18279+ reloc_offset &= ~PAGE_MASK;
18280+
18281+ if (reloc_num_pages > PSB_MAX_RELOC_PAGES) {
18282+ DRM_ERROR("Relocation buffer is too large\n");
18283+ ret = -EINVAL;
18284+ goto out;
18285+ }
18286+
18287+ DRM_WAIT_ON(ret, dev_priv->rel_mapped_queue, 3 * DRM_HZ,
18288+ (registered =
18289+ psb_ok_to_map_reloc(dev_priv, reloc_num_pages)));
18290+
18291+ if (ret == -EINTR) {
18292+ ret = -EAGAIN;
18293+ goto out;
18294+ }
18295+ if (ret) {
18296+ DRM_ERROR("Error waiting for space to map "
18297+ "relocation buffer.\n");
18298+ goto out;
18299+ }
18300+
18301+ ret = drm_bo_kmap(reloc_buffer, reloc_first_page,
18302+ reloc_num_pages, &reloc_kmap);
18303+
18304+ if (ret) {
18305+ DRM_ERROR("Could not map relocation buffer.\n"
18306+ "\tReloc buffer id 0x%08x.\n"
18307+ "\tReloc first page %d.\n"
18308+ "\tReloc num pages %d.\n",
18309+ reloc_handle, reloc_first_page, reloc_num_pages);
18310+ goto out;
18311+ }
18312+
18313+ reloc = (struct drm_psb_reloc *)
18314+ ((unsigned long)drm_bmo_virtual(&reloc_kmap, &reloc_is_iomem) +
18315+ reloc_offset);
18316+
18317+ for (count = 0; count < num_relocs; ++count) {
18318+ ret = psb_apply_reloc(dev_priv, fence_class,
18319+ reloc, buffers,
18320+ num_buffers, &dst_cache,
18321+ no_wait, interruptible);
18322+ if (ret)
18323+ goto out1;
18324+ reloc++;
18325+ }
18326+
18327+ out1:
18328+ drm_bo_kunmap(&reloc_kmap);
18329+ out:
18330+ if (registered) {
18331+ spin_lock(&dev_priv->reloc_lock);
18332+ dev_priv->rel_mapped_pages -= reloc_num_pages;
18333+ spin_unlock(&dev_priv->reloc_lock);
18334+ DRM_WAKEUP(&dev_priv->rel_mapped_queue);
18335+ }
18336+
18337+ psb_clear_dstbuf_cache(&dst_cache);
18338+ if (reloc_buffer)
18339+ drm_bo_usage_deref_unlocked(&reloc_buffer);
18340+ return ret;
18341+}
18342+
18343+static int psb_cmdbuf_2d(struct drm_file *priv,
18344+ struct drm_psb_cmdbuf_arg *arg,
18345+ struct drm_buffer_object *cmd_buffer,
18346+ struct drm_fence_arg *fence_arg)
18347+{
18348+ struct drm_device *dev = priv->minor->dev;
18349+ struct drm_psb_private *dev_priv =
18350+ (struct drm_psb_private *)dev->dev_private;
18351+ int ret;
18352+
18353+ ret = mutex_lock_interruptible(&dev_priv->reset_mutex);
18354+ if (ret)
18355+ return -EAGAIN;
18356+
18357+ ret = psb_submit_copy_cmdbuf(dev, cmd_buffer, arg->cmdbuf_offset,
18358+ arg->cmdbuf_size, PSB_ENGINE_2D, NULL);
18359+ if (ret)
18360+ goto out_unlock;
18361+
18362+ psb_fence_or_sync(priv, PSB_ENGINE_2D, arg, fence_arg, NULL);
18363+
18364+ mutex_lock(&cmd_buffer->mutex);
18365+ if (cmd_buffer->fence != NULL)
18366+ drm_fence_usage_deref_unlocked(&cmd_buffer->fence);
18367+ mutex_unlock(&cmd_buffer->mutex);
18368+ out_unlock:
18369+ mutex_unlock(&dev_priv->reset_mutex);
18370+ return ret;
18371+}
18372+
18373+#if 0
18374+static int psb_dump_page(struct drm_buffer_object *bo,
18375+ unsigned int page_offset, unsigned int num)
18376+{
18377+ struct drm_bo_kmap_obj kmobj;
18378+ int is_iomem;
18379+ uint32_t *p;
18380+ int ret;
18381+ unsigned int i;
18382+
18383+ ret = drm_bo_kmap(bo, page_offset, 1, &kmobj);
18384+ if (ret)
18385+ return ret;
18386+
18387+ p = drm_bmo_virtual(&kmobj, &is_iomem);
18388+ for (i = 0; i < num; ++i)
18389+ PSB_DEBUG_GENERAL("0x%04x: 0x%08x\n", i, *p++);
18390+
18391+ drm_bo_kunmap(&kmobj);
18392+ return 0;
18393+}
18394+#endif
18395+
18396+static void psb_idle_engine(struct drm_device *dev, int engine)
18397+{
18398+ struct drm_psb_private *dev_priv =
18399+ (struct drm_psb_private *)dev->dev_private;
18400+ uint32_t dummy;
18401+
18402+ switch (engine) {
18403+ case PSB_ENGINE_2D:
18404+
18405+ /*
18406+ * Make sure we flush 2D properly using a dummy
18407+ * fence sequence emit.
18408+ */
18409+
18410+ (void)psb_fence_emit_sequence(dev, PSB_ENGINE_2D, 0,
18411+ &dummy, &dummy);
18412+ psb_2d_lock(dev_priv);
18413+ (void)psb_idle_2d(dev);
18414+ psb_2d_unlock(dev_priv);
18415+ break;
18416+ case PSB_ENGINE_TA:
18417+ case PSB_ENGINE_RASTERIZER:
18418+ case PSB_ENGINE_HPRAST:
18419+ (void)psb_idle_3d(dev);
18420+ break;
18421+ default:
18422+
18423+ /*
18424+ * FIXME: Insert video engine idle command here.
18425+ */
18426+
18427+ break;
18428+ }
18429+}
18430+
18431+void psb_fence_or_sync(struct drm_file *priv,
18432+ int engine,
18433+ struct drm_psb_cmdbuf_arg *arg,
18434+ struct drm_fence_arg *fence_arg,
18435+ struct drm_fence_object **fence_p)
18436+{
18437+ struct drm_device *dev = priv->minor->dev;
18438+ int ret;
18439+ struct drm_fence_object *fence;
18440+
18441+ ret = drm_fence_buffer_objects(dev, NULL, arg->fence_flags,
18442+ NULL, &fence);
18443+
18444+ if (ret) {
18445+
18446+ /*
18447+ * Fence creation failed.
18448+ * Fall back to synchronous operation and idle the engine.
18449+ */
18450+
18451+ psb_idle_engine(dev, engine);
18452+ if (!(arg->fence_flags & DRM_FENCE_FLAG_NO_USER)) {
18453+
18454+ /*
18455+ * Communicate to user-space that
18456+ * fence creation has failed and that
18457+ * the engine is idle.
18458+ */
18459+
18460+ fence_arg->handle = ~0;
18461+ fence_arg->error = ret;
18462+ }
18463+
18464+ drm_putback_buffer_objects(dev);
18465+ if (fence_p)
18466+ *fence_p = NULL;
18467+ return;
18468+ }
18469+
18470+ if (!(arg->fence_flags & DRM_FENCE_FLAG_NO_USER)) {
18471+
18472+ ret = drm_fence_add_user_object(priv, fence,
18473+ arg->fence_flags &
18474+ DRM_FENCE_FLAG_SHAREABLE);
18475+ if (!ret)
18476+ drm_fence_fill_arg(fence, fence_arg);
18477+ else {
18478+ /*
18479+ * Fence user object creation failed.
18480+ * We must idle the engine here as well, as user-
18481+ * space expects a fence object to wait on. Since we
18482+ * have a fence object we wait for it to signal
18483+ * to indicate engine "sufficiently" idle.
18484+ */
18485+
18486+ (void)drm_fence_object_wait(fence, 0, 1, fence->type);
18487+ drm_fence_usage_deref_unlocked(&fence);
18488+ fence_arg->handle = ~0;
18489+ fence_arg->error = ret;
18490+ }
18491+ }
18492+
18493+ if (fence_p)
18494+ *fence_p = fence;
18495+ else if (fence)
18496+ drm_fence_usage_deref_unlocked(&fence);
18497+}
18498+
18499+int psb_handle_copyback(struct drm_device *dev,
18500+ struct psb_buflist_item *buffers,
18501+ unsigned int num_buffers, int ret, void *data)
18502+{
18503+ struct drm_psb_private *dev_priv =
18504+ (struct drm_psb_private *)dev->dev_private;
18505+ struct drm_bo_op_arg arg;
18506+ struct psb_buflist_item *item = buffers;
18507+ struct drm_buffer_object *bo;
18508+ int err = ret;
18509+ int i;
18510+
18511+ /*
18512+ * Clear the unfenced use base register lists and buffer lists.
18513+ */
18514+
18515+ if (ret) {
18516+ drm_regs_fence(&dev_priv->use_manager, NULL);
18517+ drm_putback_buffer_objects(dev);
18518+ }
18519+
18520+ if (ret != -EAGAIN) {
18521+ for (i = 0; i < num_buffers; ++i) {
18522+ arg.handled = 1;
18523+ arg.d.rep.ret = item->ret;
18524+ bo = item->bo;
18525+ mutex_lock(&bo->mutex);
18526+ drm_bo_fill_rep_arg(bo, &arg.d.rep.bo_info);
18527+ mutex_unlock(&bo->mutex);
18528+ if (copy_to_user(item->data, &arg, sizeof(arg)))
18529+ err = -EFAULT;
18530+ ++item;
18531+ }
18532+ }
18533+
18534+ return err;
18535+}
18536+
18537+static int psb_cmdbuf_video(struct drm_file *priv,
18538+ struct drm_psb_cmdbuf_arg *arg,
18539+ unsigned int num_buffers,
18540+ struct drm_buffer_object *cmd_buffer,
18541+ struct drm_fence_arg *fence_arg)
18542+{
18543+ struct drm_device *dev = priv->minor->dev;
18544+ struct drm_fence_object *fence;
18545+ int ret;
18546+
18547+ /*
18548+ * Check this. Doesn't seem right. Have fencing done AFTER command
18549+ * submission and make sure drm_psb_idle idles the MSVDX completely.
18550+ */
18551+
18552+ psb_fence_or_sync(priv, PSB_ENGINE_VIDEO, arg, fence_arg, &fence);
18553+ ret = psb_submit_video_cmdbuf(dev, cmd_buffer, arg->cmdbuf_offset,
18554+ arg->cmdbuf_size, fence);
18555+
18556+ if (ret)
18557+ return ret;
18558+
18559+ drm_fence_usage_deref_unlocked(&fence);
18560+ mutex_lock(&cmd_buffer->mutex);
18561+ if (cmd_buffer->fence != NULL)
18562+ drm_fence_usage_deref_unlocked(&cmd_buffer->fence);
18563+ mutex_unlock(&cmd_buffer->mutex);
18564+ return 0;
18565+}
18566+
18567+int psb_feedback_buf(struct drm_file *file_priv,
18568+ uint32_t feedback_ops,
18569+ uint32_t handle,
18570+ uint32_t offset,
18571+ uint32_t feedback_breakpoints,
18572+ uint32_t feedback_size, struct psb_feedback_info *feedback)
18573+{
18574+ struct drm_buffer_object *bo;
18575+ struct page *page;
18576+ uint32_t page_no;
18577+ uint32_t page_offset;
18578+ int ret;
18579+
18580+ if (feedback_ops & ~PSB_FEEDBACK_OP_VISTEST) {
18581+ DRM_ERROR("Illegal feedback op.\n");
18582+ return -EINVAL;
18583+ }
18584+
18585+ if (feedback_breakpoints != 0) {
18586+ DRM_ERROR("Feedback breakpoints not implemented yet.\n");
18587+ return -EINVAL;
18588+ }
18589+
18590+ if (feedback_size < PSB_HW_FEEDBACK_SIZE * sizeof(uint32_t)) {
18591+ DRM_ERROR("Feedback buffer size too small.\n");
18592+ return -EINVAL;
18593+ }
18594+
18595+ page_offset = offset & ~PAGE_MASK;
18596+ if ((PAGE_SIZE - PSB_HW_FEEDBACK_SIZE * sizeof(uint32_t))
18597+ < page_offset) {
18598+ DRM_ERROR("Illegal feedback buffer alignment.\n");
18599+ return -EINVAL;
18600+ }
18601+
18602+ ret = drm_bo_handle_validate(file_priv,
18603+ handle,
18604+ PSB_ENGINE_TA,
18605+ DRM_BO_FLAG_MEM_LOCAL |
18606+ DRM_BO_FLAG_CACHED |
18607+ DRM_BO_FLAG_WRITE |
18608+ PSB_BO_FLAG_FEEDBACK,
18609+ DRM_BO_MASK_MEM |
18610+ DRM_BO_FLAG_CACHED |
18611+ DRM_BO_FLAG_WRITE |
18612+ PSB_BO_FLAG_FEEDBACK, 0, 0, NULL, &bo);
18613+ if (ret)
18614+ return ret;
18615+
18616+ page_no = offset >> PAGE_SHIFT;
18617+ if (page_no >= bo->num_pages) {
18618+ ret = -EINVAL;
18619+ DRM_ERROR("Illegal feedback buffer offset.\n");
18620+ goto out_unref;
18621+ }
18622+
18623+ if (bo->ttm == NULL) {
18624+ ret = -EINVAL;
18625+ DRM_ERROR("Vistest buffer without TTM.\n");
18626+ goto out_unref;
18627+ }
18628+
18629+ page = drm_ttm_get_page(bo->ttm, page_no);
18630+ if (!page) {
18631+ ret = -ENOMEM;
18632+ goto out_unref;
18633+ }
18634+
18635+ feedback->page = page;
18636+ feedback->bo = bo;
18637+ feedback->offset = page_offset;
18638+ return 0;
18639+
18640+ out_unref:
18641+ drm_bo_usage_deref_unlocked(&bo);
18642+ return ret;
18643+}
18644+
18645+int psb_cmdbuf_ioctl(struct drm_device *dev, void *data,
18646+ struct drm_file *file_priv)
18647+{
18648+ drm_psb_cmdbuf_arg_t *arg = data;
18649+ int ret = 0;
18650+ unsigned num_buffers;
18651+ struct drm_buffer_object *cmd_buffer = NULL;
18652+ struct drm_buffer_object *ta_buffer = NULL;
18653+ struct drm_buffer_object *oom_buffer = NULL;
18654+ struct drm_fence_arg fence_arg;
18655+ struct drm_psb_scene user_scene;
18656+ struct psb_scene_pool *pool = NULL;
18657+ struct psb_scene *scene = NULL;
18658+ struct drm_psb_private *dev_priv =
18659+ (struct drm_psb_private *)file_priv->minor->dev->dev_private;
18660+ int engine;
18661+ struct psb_feedback_info feedback;
18662+
18663+ if (!dev_priv)
18664+ return -EINVAL;
18665+
18666+ ret = drm_bo_read_lock(&dev->bm.bm_lock);
18667+ if (ret)
18668+ return ret;
18669+
18670+ num_buffers = PSB_NUM_VALIDATE_BUFFERS;
18671+
18672+ ret = mutex_lock_interruptible(&dev_priv->cmdbuf_mutex);
18673+ if (ret) {
18674+ drm_bo_read_unlock(&dev->bm.bm_lock);
18675+ return -EAGAIN;
18676+ }
18677+ if (unlikely(dev_priv->buffers == NULL)) {
18678+ dev_priv->buffers = vmalloc(PSB_NUM_VALIDATE_BUFFERS *
18679+ sizeof(*dev_priv->buffers));
18680+ if (dev_priv->buffers == NULL) {
18681+ drm_bo_read_unlock(&dev->bm.bm_lock);
18682+ return -ENOMEM;
18683+ }
18684+ }
18685+
18686+
18687+ engine = (arg->engine == PSB_ENGINE_RASTERIZER) ?
18688+ PSB_ENGINE_TA : arg->engine;
18689+
18690+ ret =
18691+ psb_validate_buffer_list(file_priv, engine,
18692+ (unsigned long)arg->buffer_list,
18693+ dev_priv->buffers, &num_buffers);
18694+ if (ret)
18695+ goto out_err0;
18696+
18697+ ret = psb_fixup_relocs(file_priv, engine, arg->num_relocs,
18698+ arg->reloc_offset, arg->reloc_handle,
18699+ dev_priv->buffers, num_buffers, 0, 1);
18700+ if (ret)
18701+ goto out_err0;
18702+
18703+ mutex_lock(&dev->struct_mutex);
18704+ cmd_buffer = drm_lookup_buffer_object(file_priv, arg->cmdbuf_handle, 1);
18705+ mutex_unlock(&dev->struct_mutex);
18706+ if (!cmd_buffer) {
18707+ ret = -EINVAL;
18708+ goto out_err0;
18709+ }
18710+
18711+ switch (arg->engine) {
18712+ case PSB_ENGINE_2D:
18713+ ret = psb_cmdbuf_2d(file_priv, arg, cmd_buffer, &fence_arg);
18714+ if (ret)
18715+ goto out_err0;
18716+ break;
18717+ case PSB_ENGINE_VIDEO:
18718+ ret =
18719+ psb_cmdbuf_video(file_priv, arg, num_buffers, cmd_buffer,
18720+ &fence_arg);
18721+ if (ret)
18722+ goto out_err0;
18723+ break;
18724+ case PSB_ENGINE_RASTERIZER:
18725+ ret = psb_cmdbuf_raster(file_priv, arg, cmd_buffer, &fence_arg);
18726+ if (ret)
18727+ goto out_err0;
18728+ break;
18729+ case PSB_ENGINE_TA:
18730+ if (arg->ta_handle == arg->cmdbuf_handle) {
18731+ mutex_lock(&dev->struct_mutex);
18732+ atomic_inc(&cmd_buffer->usage);
18733+ ta_buffer = cmd_buffer;
18734+ mutex_unlock(&dev->struct_mutex);
18735+ } else {
18736+ mutex_lock(&dev->struct_mutex);
18737+ ta_buffer =
18738+ drm_lookup_buffer_object(file_priv,
18739+ arg->ta_handle, 1);
18740+ mutex_unlock(&dev->struct_mutex);
18741+ if (!ta_buffer) {
18742+ ret = -EINVAL;
18743+ goto out_err0;
18744+ }
18745+ }
18746+ if (arg->oom_size != 0) {
18747+ if (arg->oom_handle == arg->cmdbuf_handle) {
18748+ mutex_lock(&dev->struct_mutex);
18749+ atomic_inc(&cmd_buffer->usage);
18750+ oom_buffer = cmd_buffer;
18751+ mutex_unlock(&dev->struct_mutex);
18752+ } else {
18753+ mutex_lock(&dev->struct_mutex);
18754+ oom_buffer =
18755+ drm_lookup_buffer_object(file_priv,
18756+ arg->oom_handle,
18757+ 1);
18758+ mutex_unlock(&dev->struct_mutex);
18759+ if (!oom_buffer) {
18760+ ret = -EINVAL;
18761+ goto out_err0;
18762+ }
18763+ }
18764+ }
18765+
18766+ ret = copy_from_user(&user_scene, (void __user *)
18767+ ((unsigned long)arg->scene_arg),
18768+ sizeof(user_scene));
18769+ if (ret)
18770+ goto out_err0;
18771+
18772+ if (!user_scene.handle_valid) {
18773+ pool = psb_scene_pool_alloc(file_priv, 0,
18774+ user_scene.num_buffers,
18775+ user_scene.w, user_scene.h);
18776+ if (!pool) {
18777+ ret = -ENOMEM;
18778+ goto out_err0;
18779+ }
18780+
18781+ user_scene.handle = psb_scene_pool_handle(pool);
18782+ user_scene.handle_valid = 1;
18783+ ret = copy_to_user((void __user *)
18784+ ((unsigned long)arg->scene_arg),
18785+ &user_scene, sizeof(user_scene));
18786+
18787+ if (ret)
18788+ goto out_err0;
18789+ } else {
18790+ mutex_lock(&dev->struct_mutex);
18791+ pool = psb_scene_pool_lookup_devlocked(file_priv,
18792+ user_scene.
18793+ handle, 1);
18794+ mutex_unlock(&dev->struct_mutex);
18795+ if (!pool) {
18796+ ret = -EINVAL;
18797+ goto out_err0;
18798+ }
18799+ }
18800+
18801+ mutex_lock(&dev_priv->reset_mutex);
18802+ ret = psb_validate_scene_pool(pool, 0, 0, 0,
18803+ user_scene.w,
18804+ user_scene.h,
18805+ arg->ta_flags &
18806+ PSB_TA_FLAG_LASTPASS, &scene);
18807+ mutex_unlock(&dev_priv->reset_mutex);
18808+
18809+ if (ret)
18810+ goto out_err0;
18811+
18812+ memset(&feedback, 0, sizeof(feedback));
18813+ if (arg->feedback_ops) {
18814+ ret = psb_feedback_buf(file_priv,
18815+ arg->feedback_ops,
18816+ arg->feedback_handle,
18817+ arg->feedback_offset,
18818+ arg->feedback_breakpoints,
18819+ arg->feedback_size, &feedback);
18820+ if (ret)
18821+ goto out_err0;
18822+ }
18823+ ret = psb_cmdbuf_ta(file_priv, arg, cmd_buffer, ta_buffer,
18824+ oom_buffer, scene, &feedback, &fence_arg);
18825+ if (ret)
18826+ goto out_err0;
18827+ break;
18828+ default:
18829+ DRM_ERROR("Unimplemented command submission mechanism (%x).\n",
18830+ arg->engine);
18831+ ret = -EINVAL;
18832+ goto out_err0;
18833+ }
18834+
18835+ if (!(arg->fence_flags & DRM_FENCE_FLAG_NO_USER)) {
18836+ ret = copy_to_user((void __user *)
18837+ ((unsigned long)arg->fence_arg),
18838+ &fence_arg, sizeof(fence_arg));
18839+ }
18840+
18841+ out_err0:
18842+ ret =
18843+ psb_handle_copyback(dev, dev_priv->buffers, num_buffers, ret, data);
18844+ mutex_lock(&dev->struct_mutex);
18845+ if (scene)
18846+ psb_scene_unref_devlocked(&scene);
18847+ if (pool)
18848+ psb_scene_pool_unref_devlocked(&pool);
18849+ if (cmd_buffer)
18850+ drm_bo_usage_deref_locked(&cmd_buffer);
18851+ if (ta_buffer)
18852+ drm_bo_usage_deref_locked(&ta_buffer);
18853+ if (oom_buffer)
18854+ drm_bo_usage_deref_locked(&oom_buffer);
18855+
18856+ psb_dereference_buffers_locked(dev_priv->buffers, num_buffers);
18857+ mutex_unlock(&dev->struct_mutex);
18858+ mutex_unlock(&dev_priv->cmdbuf_mutex);
18859+
18860+ drm_bo_read_unlock(&dev->bm.bm_lock);
18861+ return ret;
18862+}
18863Index: linux-2.6.28/drivers/gpu/drm/psb/psb_xhw.c
18864===================================================================
18865--- /dev/null 1970-01-01 00:00:00.000000000 +0000
18866+++ linux-2.6.28/drivers/gpu/drm/psb/psb_xhw.c 2009-02-20 12:23:06.000000000 +0000
18867@@ -0,0 +1,614 @@
18868+/**************************************************************************
18869+ * Copyright (c) 2007, Intel Corporation.
18870+ * All Rights Reserved.
18871+ *
18872+ * This program is free software; you can redistribute it and/or modify it
18873+ * under the terms and conditions of the GNU General Public License,
18874+ * version 2, as published by the Free Software Foundation.
18875+ *
18876+ * This program is distributed in the hope it will be useful, but WITHOUT
18877+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18878+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18879+ * more details.
18880+ *
18881+ * You should have received a copy of the GNU General Public License along with
18882+ * this program; if not, write to the Free Software Foundation, Inc.,
18883+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18884+ *
18885+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
18886+ * develop this driver.
18887+ *
18888+ **************************************************************************/
18889+/*
18890+ * Make calls into closed source X server code.
18891+ */
18892+
18893+#include "drmP.h"
18894+#include "psb_drv.h"
18895+
18896+void
18897+psb_xhw_clean_buf(struct drm_psb_private *dev_priv, struct psb_xhw_buf *buf)
18898+{
18899+ unsigned long irq_flags;
18900+
18901+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
18902+ list_del_init(&buf->head);
18903+ if (dev_priv->xhw_cur_buf == buf)
18904+ dev_priv->xhw_cur_buf = NULL;
18905+ atomic_set(&buf->done, 1);
18906+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
18907+}
18908+
18909+static inline int psb_xhw_add(struct drm_psb_private *dev_priv,
18910+ struct psb_xhw_buf *buf)
18911+{
18912+ unsigned long irq_flags;
18913+
18914+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
18915+ atomic_set(&buf->done, 0);
18916+ if (unlikely(!dev_priv->xhw_submit_ok)) {
18917+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
18918+ DRM_ERROR("No Xpsb 3D extension available.\n");
18919+ return -EINVAL;
18920+ }
18921+ if (!list_empty(&buf->head)) {
18922+ DRM_ERROR("Recursive list adding.\n");
18923+ goto out;
18924+ }
18925+ list_add_tail(&buf->head, &dev_priv->xhw_in);
18926+ wake_up_interruptible(&dev_priv->xhw_queue);
18927+ out:
18928+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
18929+ return 0;
18930+}
18931+
18932+int psb_xhw_scene_info(struct drm_psb_private *dev_priv,
18933+ struct psb_xhw_buf *buf,
18934+ uint32_t w,
18935+ uint32_t h,
18936+ uint32_t * hw_cookie,
18937+ uint32_t * bo_size,
18938+ uint32_t * clear_p_start, uint32_t * clear_num_pages)
18939+{
18940+ struct drm_psb_xhw_arg *xa = &buf->arg;
18941+ int ret;
18942+
18943+ buf->copy_back = 1;
18944+ xa->op = PSB_XHW_SCENE_INFO;
18945+ xa->irq_op = 0;
18946+ xa->issue_irq = 0;
18947+ xa->arg.si.w = w;
18948+ xa->arg.si.h = h;
18949+
18950+ ret = psb_xhw_add(dev_priv, buf);
18951+ if (ret)
18952+ return ret;
18953+
18954+ (void)wait_event_timeout(dev_priv->xhw_caller_queue,
18955+ atomic_read(&buf->done), DRM_HZ);
18956+
18957+ if (!atomic_read(&buf->done)) {
18958+ psb_xhw_clean_buf(dev_priv, buf);
18959+ return -EBUSY;
18960+ }
18961+
18962+ if (!xa->ret) {
18963+ memcpy(hw_cookie, xa->cookie, sizeof(xa->cookie));
18964+ *bo_size = xa->arg.si.size;
18965+ *clear_p_start = xa->arg.si.clear_p_start;
18966+ *clear_num_pages = xa->arg.si.clear_num_pages;
18967+ }
18968+ return xa->ret;
18969+}
18970+
18971+int psb_xhw_fire_raster(struct drm_psb_private *dev_priv,
18972+ struct psb_xhw_buf *buf, uint32_t fire_flags)
18973+{
18974+ struct drm_psb_xhw_arg *xa = &buf->arg;
18975+
18976+ buf->copy_back = 0;
18977+ xa->op = PSB_XHW_FIRE_RASTER;
18978+ xa->issue_irq = 0;
18979+ xa->arg.sb.fire_flags = 0;
18980+
18981+ return psb_xhw_add(dev_priv, buf);
18982+}
18983+
18984+int psb_xhw_vistest(struct drm_psb_private *dev_priv, struct psb_xhw_buf *buf)
18985+{
18986+ struct drm_psb_xhw_arg *xa = &buf->arg;
18987+
18988+ buf->copy_back = 1;
18989+ xa->op = PSB_XHW_VISTEST;
18990+ /*
18991+ * Could perhaps decrease latency somewhat by
18992+ * issuing an irq in this case.
18993+ */
18994+ xa->issue_irq = 0;
18995+ xa->irq_op = PSB_UIRQ_VISTEST;
18996+ return psb_xhw_add(dev_priv, buf);
18997+}
18998+
18999+int psb_xhw_scene_bind_fire(struct drm_psb_private *dev_priv,
19000+ struct psb_xhw_buf *buf,
19001+ uint32_t fire_flags,
19002+ uint32_t hw_context,
19003+ uint32_t * cookie,
19004+ uint32_t * oom_cmds,
19005+ uint32_t num_oom_cmds,
19006+ uint32_t offset, uint32_t engine, uint32_t flags)
19007+{
19008+ struct drm_psb_xhw_arg *xa = &buf->arg;
19009+
19010+ buf->copy_back = (fire_flags & PSB_FIRE_FLAG_XHW_OOM);
19011+ xa->op = PSB_XHW_SCENE_BIND_FIRE;
19012+ xa->issue_irq = (buf->copy_back) ? 1 : 0;
19013+ if (unlikely(buf->copy_back))
19014+ xa->irq_op = (engine == PSB_SCENE_ENGINE_TA) ?
19015+ PSB_UIRQ_FIRE_TA_REPLY : PSB_UIRQ_FIRE_RASTER_REPLY;
19016+ else
19017+ xa->irq_op = 0;
19018+ xa->arg.sb.fire_flags = fire_flags;
19019+ xa->arg.sb.hw_context = hw_context;
19020+ xa->arg.sb.offset = offset;
19021+ xa->arg.sb.engine = engine;
19022+ xa->arg.sb.flags = flags;
19023+ xa->arg.sb.num_oom_cmds = num_oom_cmds;
19024+ memcpy(xa->cookie, cookie, sizeof(xa->cookie));
19025+ if (num_oom_cmds)
19026+ memcpy(xa->arg.sb.oom_cmds, oom_cmds,
19027+ sizeof(uint32_t) * num_oom_cmds);
19028+ return psb_xhw_add(dev_priv, buf);
19029+}
19030+
19031+int psb_xhw_reset_dpm(struct drm_psb_private *dev_priv, struct psb_xhw_buf *buf)
19032+{
19033+ struct drm_psb_xhw_arg *xa = &buf->arg;
19034+ int ret;
19035+
19036+ buf->copy_back = 1;
19037+ xa->op = PSB_XHW_RESET_DPM;
19038+ xa->issue_irq = 0;
19039+ xa->irq_op = 0;
19040+
19041+ ret = psb_xhw_add(dev_priv, buf);
19042+ if (ret)
19043+ return ret;
19044+
19045+ (void)wait_event_timeout(dev_priv->xhw_caller_queue,
19046+ atomic_read(&buf->done), 3 * DRM_HZ);
19047+
19048+ if (!atomic_read(&buf->done)) {
19049+ psb_xhw_clean_buf(dev_priv, buf);
19050+ return -EBUSY;
19051+ }
19052+
19053+ return xa->ret;
19054+}
19055+
19056+int psb_xhw_check_lockup(struct drm_psb_private *dev_priv,
19057+ struct psb_xhw_buf *buf, uint32_t * value)
19058+{
19059+ struct drm_psb_xhw_arg *xa = &buf->arg;
19060+ int ret;
19061+
19062+ *value = 0;
19063+
19064+ buf->copy_back = 1;
19065+ xa->op = PSB_XHW_CHECK_LOCKUP;
19066+ xa->issue_irq = 0;
19067+ xa->irq_op = 0;
19068+
19069+ ret = psb_xhw_add(dev_priv, buf);
19070+ if (ret)
19071+ return ret;
19072+
19073+ (void)wait_event_timeout(dev_priv->xhw_caller_queue,
19074+ atomic_read(&buf->done), DRM_HZ * 3);
19075+
19076+ if (!atomic_read(&buf->done)) {
19077+ psb_xhw_clean_buf(dev_priv, buf);
19078+ return -EBUSY;
19079+ }
19080+
19081+ if (!xa->ret)
19082+ *value = xa->arg.cl.value;
19083+
19084+ return xa->ret;
19085+}
19086+
19087+static int psb_xhw_terminate(struct drm_psb_private *dev_priv,
19088+ struct psb_xhw_buf *buf)
19089+{
19090+ struct drm_psb_xhw_arg *xa = &buf->arg;
19091+ unsigned long irq_flags;
19092+
19093+ buf->copy_back = 0;
19094+ xa->op = PSB_XHW_TERMINATE;
19095+ xa->issue_irq = 0;
19096+
19097+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19098+ dev_priv->xhw_submit_ok = 0;
19099+ atomic_set(&buf->done, 0);
19100+ if (!list_empty(&buf->head)) {
19101+ DRM_ERROR("Recursive list adding.\n");
19102+ goto out;
19103+ }
19104+ list_add_tail(&buf->head, &dev_priv->xhw_in);
19105+ out:
19106+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19107+ wake_up_interruptible(&dev_priv->xhw_queue);
19108+
19109+ (void)wait_event_timeout(dev_priv->xhw_caller_queue,
19110+ atomic_read(&buf->done), DRM_HZ / 10);
19111+
19112+ if (!atomic_read(&buf->done)) {
19113+ DRM_ERROR("Xpsb terminate timeout.\n");
19114+ psb_xhw_clean_buf(dev_priv, buf);
19115+ return -EBUSY;
19116+ }
19117+
19118+ return 0;
19119+}
19120+
19121+int psb_xhw_ta_mem_info(struct drm_psb_private *dev_priv,
19122+ struct psb_xhw_buf *buf,
19123+ uint32_t pages, uint32_t * hw_cookie, uint32_t * size)
19124+{
19125+ struct drm_psb_xhw_arg *xa = &buf->arg;
19126+ int ret;
19127+
19128+ buf->copy_back = 1;
19129+ xa->op = PSB_XHW_TA_MEM_INFO;
19130+ xa->issue_irq = 0;
19131+ xa->irq_op = 0;
19132+ xa->arg.bi.pages = pages;
19133+
19134+ ret = psb_xhw_add(dev_priv, buf);
19135+ if (ret)
19136+ return ret;
19137+
19138+ (void)wait_event_timeout(dev_priv->xhw_caller_queue,
19139+ atomic_read(&buf->done), DRM_HZ);
19140+
19141+ if (!atomic_read(&buf->done)) {
19142+ psb_xhw_clean_buf(dev_priv, buf);
19143+ return -EBUSY;
19144+ }
19145+
19146+ if (!xa->ret)
19147+ memcpy(hw_cookie, xa->cookie, sizeof(xa->cookie));
19148+
19149+ *size = xa->arg.bi.size;
19150+ return xa->ret;
19151+}
19152+
19153+int psb_xhw_ta_mem_load(struct drm_psb_private *dev_priv,
19154+ struct psb_xhw_buf *buf,
19155+ uint32_t flags,
19156+ uint32_t param_offset,
19157+ uint32_t pt_offset, uint32_t * hw_cookie)
19158+{
19159+ struct drm_psb_xhw_arg *xa = &buf->arg;
19160+ int ret;
19161+
19162+ buf->copy_back = 1;
19163+ xa->op = PSB_XHW_TA_MEM_LOAD;
19164+ xa->issue_irq = 0;
19165+ xa->irq_op = 0;
19166+ xa->arg.bl.flags = flags;
19167+ xa->arg.bl.param_offset = param_offset;
19168+ xa->arg.bl.pt_offset = pt_offset;
19169+ memcpy(xa->cookie, hw_cookie, sizeof(xa->cookie));
19170+
19171+ ret = psb_xhw_add(dev_priv, buf);
19172+ if (ret)
19173+ return ret;
19174+
19175+ (void)wait_event_timeout(dev_priv->xhw_caller_queue,
19176+ atomic_read(&buf->done), 3 * DRM_HZ);
19177+
19178+ if (!atomic_read(&buf->done)) {
19179+ psb_xhw_clean_buf(dev_priv, buf);
19180+ return -EBUSY;
19181+ }
19182+
19183+ if (!xa->ret)
19184+ memcpy(hw_cookie, xa->cookie, sizeof(xa->cookie));
19185+
19186+ return xa->ret;
19187+}
19188+
19189+int psb_xhw_ta_oom(struct drm_psb_private *dev_priv,
19190+ struct psb_xhw_buf *buf, uint32_t * cookie)
19191+{
19192+ struct drm_psb_xhw_arg *xa = &buf->arg;
19193+
19194+ /*
19195+ * This calls the extensive closed source
19196+ * OOM handler, which resolves the condition and
19197+ * sends a reply telling the scheduler what to do
19198+ * with the task.
19199+ */
19200+
19201+ buf->copy_back = 1;
19202+ xa->op = PSB_XHW_OOM;
19203+ xa->issue_irq = 1;
19204+ xa->irq_op = PSB_UIRQ_OOM_REPLY;
19205+ memcpy(xa->cookie, cookie, sizeof(xa->cookie));
19206+
19207+ return psb_xhw_add(dev_priv, buf);
19208+}
19209+
19210+void psb_xhw_ta_oom_reply(struct drm_psb_private *dev_priv,
19211+ struct psb_xhw_buf *buf,
19212+ uint32_t * cookie,
19213+ uint32_t * bca, uint32_t * rca, uint32_t * flags)
19214+{
19215+ struct drm_psb_xhw_arg *xa = &buf->arg;
19216+
19217+ /*
19218+ * Get info about how to schedule an OOM task.
19219+ */
19220+
19221+ memcpy(cookie, xa->cookie, sizeof(xa->cookie));
19222+ *bca = xa->arg.oom.bca;
19223+ *rca = xa->arg.oom.rca;
19224+ *flags = xa->arg.oom.flags;
19225+}
19226+
19227+void psb_xhw_fire_reply(struct drm_psb_private *dev_priv,
19228+ struct psb_xhw_buf *buf, uint32_t * cookie)
19229+{
19230+ struct drm_psb_xhw_arg *xa = &buf->arg;
19231+
19232+ memcpy(cookie, xa->cookie, sizeof(xa->cookie));
19233+}
19234+
19235+int psb_xhw_resume(struct drm_psb_private *dev_priv, struct psb_xhw_buf *buf)
19236+{
19237+ struct drm_psb_xhw_arg *xa = &buf->arg;
19238+
19239+ buf->copy_back = 0;
19240+ xa->op = PSB_XHW_RESUME;
19241+ xa->issue_irq = 0;
19242+ xa->irq_op = 0;
19243+ return psb_xhw_add(dev_priv, buf);
19244+}
19245+
19246+void psb_xhw_takedown(struct drm_psb_private *dev_priv)
19247+{
19248+}
19249+
19250+int psb_xhw_init(struct drm_device *dev)
19251+{
19252+ struct drm_psb_private *dev_priv =
19253+ (struct drm_psb_private *)dev->dev_private;
19254+ unsigned long irq_flags;
19255+
19256+ INIT_LIST_HEAD(&dev_priv->xhw_in);
19257+ dev_priv->xhw_lock = SPIN_LOCK_UNLOCKED;
19258+ atomic_set(&dev_priv->xhw_client, 0);
19259+ init_waitqueue_head(&dev_priv->xhw_queue);
19260+ init_waitqueue_head(&dev_priv->xhw_caller_queue);
19261+ mutex_init(&dev_priv->xhw_mutex);
19262+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19263+ dev_priv->xhw_on = 0;
19264+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19265+
19266+ return 0;
19267+}
19268+
19269+static int psb_xhw_init_init(struct drm_device *dev,
19270+ struct drm_file *file_priv,
19271+ struct drm_psb_xhw_init_arg *arg)
19272+{
19273+ struct drm_psb_private *dev_priv =
19274+ (struct drm_psb_private *)dev->dev_private;
19275+ int ret;
19276+ int is_iomem;
19277+
19278+ if (atomic_add_unless(&dev_priv->xhw_client, 1, 1)) {
19279+ unsigned long irq_flags;
19280+
19281+ mutex_lock(&dev->struct_mutex);
19282+ dev_priv->xhw_bo =
19283+ drm_lookup_buffer_object(file_priv, arg->buffer_handle, 1);
19284+ mutex_unlock(&dev->struct_mutex);
19285+ if (!dev_priv->xhw_bo) {
19286+ ret = -EINVAL;
19287+ goto out_err;
19288+ }
19289+ ret = drm_bo_kmap(dev_priv->xhw_bo, 0,
19290+ dev_priv->xhw_bo->num_pages,
19291+ &dev_priv->xhw_kmap);
19292+ if (ret) {
19293+ DRM_ERROR("Failed mapping X server "
19294+ "communications buffer.\n");
19295+ goto out_err0;
19296+ }
19297+ dev_priv->xhw = drm_bmo_virtual(&dev_priv->xhw_kmap, &is_iomem);
19298+ if (is_iomem) {
19299+ DRM_ERROR("X server communications buffer"
19300+ "is in device memory.\n");
19301+ ret = -EINVAL;
19302+ goto out_err1;
19303+ }
19304+ dev_priv->xhw_file = file_priv;
19305+
19306+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19307+ dev_priv->xhw_on = 1;
19308+ dev_priv->xhw_submit_ok = 1;
19309+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19310+ return 0;
19311+ } else {
19312+ DRM_ERROR("Xhw is already initialized.\n");
19313+ return -EBUSY;
19314+ }
19315+ out_err1:
19316+ dev_priv->xhw = NULL;
19317+ drm_bo_kunmap(&dev_priv->xhw_kmap);
19318+ out_err0:
19319+ drm_bo_usage_deref_unlocked(&dev_priv->xhw_bo);
19320+ out_err:
19321+ atomic_dec(&dev_priv->xhw_client);
19322+ return ret;
19323+}
19324+
19325+static void psb_xhw_queue_empty(struct drm_psb_private *dev_priv)
19326+{
19327+ struct psb_xhw_buf *cur_buf, *next;
19328+ unsigned long irq_flags;
19329+
19330+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19331+ dev_priv->xhw_submit_ok = 0;
19332+
19333+ list_for_each_entry_safe(cur_buf, next, &dev_priv->xhw_in, head) {
19334+ list_del_init(&cur_buf->head);
19335+ if (cur_buf->copy_back) {
19336+ cur_buf->arg.ret = -EINVAL;
19337+ }
19338+ atomic_set(&cur_buf->done, 1);
19339+ }
19340+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19341+ wake_up(&dev_priv->xhw_caller_queue);
19342+}
19343+
19344+void psb_xhw_init_takedown(struct drm_psb_private *dev_priv,
19345+ struct drm_file *file_priv, int closing)
19346+{
19347+
19348+ if (dev_priv->xhw_file == file_priv &&
19349+ atomic_add_unless(&dev_priv->xhw_client, -1, 0)) {
19350+
19351+ if (closing)
19352+ psb_xhw_queue_empty(dev_priv);
19353+ else {
19354+ struct psb_xhw_buf buf;
19355+ INIT_LIST_HEAD(&buf.head);
19356+
19357+ psb_xhw_terminate(dev_priv, &buf);
19358+ psb_xhw_queue_empty(dev_priv);
19359+ }
19360+
19361+ dev_priv->xhw = NULL;
19362+ drm_bo_kunmap(&dev_priv->xhw_kmap);
19363+ drm_bo_usage_deref_unlocked(&dev_priv->xhw_bo);
19364+ dev_priv->xhw_file = NULL;
19365+ }
19366+}
19367+
19368+int psb_xhw_init_ioctl(struct drm_device *dev, void *data,
19369+ struct drm_file *file_priv)
19370+{
19371+ struct drm_psb_xhw_init_arg *arg = (struct drm_psb_xhw_init_arg *)data;
19372+ struct drm_psb_private *dev_priv =
19373+ (struct drm_psb_private *)dev->dev_private;
19374+
19375+ switch (arg->operation) {
19376+ case PSB_XHW_INIT:
19377+ return psb_xhw_init_init(dev, file_priv, arg);
19378+ case PSB_XHW_TAKEDOWN:
19379+ psb_xhw_init_takedown(dev_priv, file_priv, 0);
19380+ }
19381+ return 0;
19382+}
19383+
19384+static int psb_xhw_in_empty(struct drm_psb_private *dev_priv)
19385+{
19386+ int empty;
19387+ unsigned long irq_flags;
19388+
19389+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19390+ empty = list_empty(&dev_priv->xhw_in);
19391+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19392+ return empty;
19393+}
19394+
19395+int psb_xhw_handler(struct drm_psb_private *dev_priv)
19396+{
19397+ unsigned long irq_flags;
19398+ struct drm_psb_xhw_arg *xa;
19399+ struct psb_xhw_buf *buf;
19400+
19401+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19402+
19403+ if (!dev_priv->xhw_on) {
19404+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19405+ return -EINVAL;
19406+ }
19407+
19408+ buf = dev_priv->xhw_cur_buf;
19409+ if (buf && buf->copy_back) {
19410+ xa = &buf->arg;
19411+ memcpy(xa, dev_priv->xhw, sizeof(*xa));
19412+ dev_priv->comm[PSB_COMM_USER_IRQ] = xa->irq_op;
19413+ atomic_set(&buf->done, 1);
19414+ wake_up(&dev_priv->xhw_caller_queue);
19415+ } else
19416+ dev_priv->comm[PSB_COMM_USER_IRQ] = 0;
19417+
19418+ dev_priv->xhw_cur_buf = 0;
19419+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19420+ return 0;
19421+}
19422+
19423+int psb_xhw_ioctl(struct drm_device *dev, void *data,
19424+ struct drm_file *file_priv)
19425+{
19426+ struct drm_psb_private *dev_priv =
19427+ (struct drm_psb_private *)dev->dev_private;
19428+ unsigned long irq_flags;
19429+ struct drm_psb_xhw_arg *xa;
19430+ int ret;
19431+ struct list_head *list;
19432+ struct psb_xhw_buf *buf;
19433+
19434+ if (!dev_priv)
19435+ return -EINVAL;
19436+
19437+ if (mutex_lock_interruptible(&dev_priv->xhw_mutex))
19438+ return -EAGAIN;
19439+
19440+ if (psb_forced_user_interrupt(dev_priv)) {
19441+ mutex_unlock(&dev_priv->xhw_mutex);
19442+ return -EINVAL;
19443+ }
19444+
19445+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19446+ while (list_empty(&dev_priv->xhw_in)) {
19447+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19448+ ret = wait_event_interruptible_timeout(dev_priv->xhw_queue,
19449+ !psb_xhw_in_empty
19450+ (dev_priv), DRM_HZ);
19451+ if (ret == -ERESTARTSYS || ret == 0) {
19452+ mutex_unlock(&dev_priv->xhw_mutex);
19453+ return -EAGAIN;
19454+ }
19455+ spin_lock_irqsave(&dev_priv->xhw_lock, irq_flags);
19456+ }
19457+
19458+ list = dev_priv->xhw_in.next;
19459+ list_del_init(list);
19460+
19461+ buf = list_entry(list, struct psb_xhw_buf, head);
19462+ xa = &buf->arg;
19463+ memcpy(dev_priv->xhw, xa, sizeof(*xa));
19464+
19465+ if (unlikely(buf->copy_back))
19466+ dev_priv->xhw_cur_buf = buf;
19467+ else {
19468+ atomic_set(&buf->done, 1);
19469+ dev_priv->xhw_cur_buf = NULL;
19470+ }
19471+
19472+ if (xa->op == PSB_XHW_TERMINATE) {
19473+ dev_priv->xhw_on = 0;
19474+ wake_up(&dev_priv->xhw_caller_queue);
19475+ }
19476+ spin_unlock_irqrestore(&dev_priv->xhw_lock, irq_flags);
19477+
19478+ mutex_unlock(&dev_priv->xhw_mutex);
19479+
19480+ return 0;
19481+}
19482Index: linux-2.6.28/drivers/gpu/drm/Kconfig
19483===================================================================
19484--- linux-2.6.28.orig/drivers/gpu/drm/Kconfig 2009-02-20 12:22:54.000000000 +0000
19485+++ linux-2.6.28/drivers/gpu/drm/Kconfig 2009-02-20 12:23:06.000000000 +0000
19486@@ -129,3 +129,10 @@
19487 help
19488 Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister
19489 chipset. If M is selected the module will be called savage.
19490+
19491+config DRM_PSB
19492+ tristate "Intel Poulsbo"
19493+ depends on DRM && PCI && I2C_ALGOBIT
19494+ select DRM_INTEL_COMMON
19495+ help
19496+ Choose this option if you have an Intel Poulsbo chipset.
19497Index: linux-2.6.28/include/drm/drm_objects.h
19498===================================================================
19499--- /dev/null 1970-01-01 00:00:00.000000000 +0000
19500+++ linux-2.6.28/include/drm/drm_objects.h 2009-02-20 12:23:06.000000000 +0000
19501@@ -0,0 +1,717 @@
19502+/**************************************************************************
19503+ *
19504+ * Copyright (c) 2006-2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
19505+ * All Rights Reserved.
19506+ *
19507+ * Permission is hereby granted, free of charge, to any person obtaining a
19508+ * copy of this software and associated documentation files (the
19509+ * "Software"), to deal in the Software without restriction, including
19510+ * without limitation the rights to use, copy, modify, merge, publish,
19511+ * distribute, sub license, and/or sell copies of the Software, and to
19512+ * permit persons to whom the Software is furnished to do so, subject to
19513+ * the following conditions:
19514+ *
19515+ * The above copyright notice and this permission notice (including the
19516+ * next paragraph) shall be included in all copies or substantial portions
19517+ * of the Software.
19518+ *
19519+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19520+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19521+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19522+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
19523+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19524+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19525+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
19526+ *
19527+ **************************************************************************/
19528+/*
19529+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
19530+ */
19531+
19532+#ifndef _DRM_OBJECTS_H
19533+#define _DRM_OBJECTS_H
19534+
19535+struct drm_device;
19536+struct drm_bo_mem_reg;
19537+
19538+/***************************************************
19539+ * User space objects. (drm_object.c)
19540+ */
19541+
19542+#define drm_user_object_entry(_ptr, _type, _member) container_of(_ptr, _type, _member)
19543+
19544+enum drm_object_type {
19545+ drm_fence_type,
19546+ drm_buffer_type,
19547+ drm_lock_type,
19548+ /*
19549+ * Add other user space object types here.
19550+ */
19551+ drm_driver_type0 = 256,
19552+ drm_driver_type1,
19553+ drm_driver_type2,
19554+ drm_driver_type3,
19555+ drm_driver_type4
19556+};
19557+
19558+/*
19559+ * A user object is a structure that helps the drm give out user handles
19560+ * to kernel internal objects and to keep track of these objects so that
19561+ * they can be destroyed, for example when the user space process exits.
19562+ * Designed to be accessible using a user space 32-bit handle.
19563+ */
19564+
19565+struct drm_user_object {
19566+ struct drm_hash_item hash;
19567+ struct list_head list;
19568+ enum drm_object_type type;
19569+ atomic_t refcount;
19570+ int shareable;
19571+ struct drm_file *owner;
19572+ void (*ref_struct_locked) (struct drm_file *priv,
19573+ struct drm_user_object *obj,
19574+ enum drm_ref_type ref_action);
19575+ void (*unref) (struct drm_file *priv, struct drm_user_object *obj,
19576+ enum drm_ref_type unref_action);
19577+ void (*remove) (struct drm_file *priv, struct drm_user_object *obj);
19578+};
19579+
19580+/*
19581+ * A ref object is a structure which is used to
19582+ * keep track of references to user objects and to keep track of these
19583+ * references so that they can be destroyed for example when the user space
19584+ * process exits. Designed to be accessible using a pointer to the _user_ object.
19585+ */
19586+
19587+struct drm_ref_object {
19588+ struct drm_hash_item hash;
19589+ struct list_head list;
19590+ atomic_t refcount;
19591+ enum drm_ref_type unref_action;
19592+};
19593+
19594+/**
19595+ * Must be called with the struct_mutex held.
19596+ */
19597+
19598+extern int drm_add_user_object(struct drm_file *priv, struct drm_user_object *item,
19599+ int shareable);
19600+/**
19601+ * Must be called with the struct_mutex held.
19602+ */
19603+
19604+extern struct drm_user_object *drm_lookup_user_object(struct drm_file *priv,
19605+ uint32_t key);
19606+
19607+/*
19608+ * Must be called with the struct_mutex held. May temporarily release it.
19609+ */
19610+
19611+extern int drm_add_ref_object(struct drm_file *priv,
19612+ struct drm_user_object *referenced_object,
19613+ enum drm_ref_type ref_action);
19614+
19615+/*
19616+ * Must be called with the struct_mutex held.
19617+ */
19618+
19619+struct drm_ref_object *drm_lookup_ref_object(struct drm_file *priv,
19620+ struct drm_user_object *referenced_object,
19621+ enum drm_ref_type ref_action);
19622+/*
19623+ * Must be called with the struct_mutex held.
19624+ * If "item" has been obtained by a call to drm_lookup_ref_object. You may not
19625+ * release the struct_mutex before calling drm_remove_ref_object.
19626+ * This function may temporarily release the struct_mutex.
19627+ */
19628+
19629+extern void drm_remove_ref_object(struct drm_file *priv, struct drm_ref_object *item);
19630+extern int drm_user_object_ref(struct drm_file *priv, uint32_t user_token,
19631+ enum drm_object_type type,
19632+ struct drm_user_object **object);
19633+extern int drm_user_object_unref(struct drm_file *priv, uint32_t user_token,
19634+ enum drm_object_type type);
19635+
19636+/***************************************************
19637+ * Fence objects. (drm_fence.c)
19638+ */
19639+
19640+struct drm_fence_object {
19641+ struct drm_user_object base;
19642+ struct drm_device *dev;
19643+ atomic_t usage;
19644+
19645+ /*
19646+ * The below three fields are protected by the fence manager spinlock.
19647+ */
19648+
19649+ struct list_head ring;
19650+ int fence_class;
19651+ uint32_t native_types;
19652+ uint32_t type;
19653+ uint32_t signaled_types;
19654+ uint32_t sequence;
19655+ uint32_t waiting_types;
19656+ uint32_t error;
19657+};
19658+
19659+#define _DRM_FENCE_CLASSES 8
19660+
19661+struct drm_fence_class_manager {
19662+ struct list_head ring;
19663+ uint32_t pending_flush;
19664+ uint32_t waiting_types;
19665+ wait_queue_head_t fence_queue;
19666+ uint32_t highest_waiting_sequence;
19667+ uint32_t latest_queued_sequence;
19668+};
19669+
19670+struct drm_fence_manager {
19671+ int initialized;
19672+ rwlock_t lock;
19673+ struct drm_fence_class_manager fence_class[_DRM_FENCE_CLASSES];
19674+ uint32_t num_classes;
19675+ atomic_t count;
19676+};
19677+
19678+struct drm_fence_driver {
19679+ unsigned long *waiting_jiffies;
19680+ uint32_t num_classes;
19681+ uint32_t wrap_diff;
19682+ uint32_t flush_diff;
19683+ uint32_t sequence_mask;
19684+
19685+ /*
19686+ * Driver implemented functions:
19687+ * has_irq() : 1 if the hardware can update the indicated type_flags using an
19688+ * irq handler. 0 if polling is required.
19689+ *
19690+ * emit() : Emit a sequence number to the command stream.
19691+ * Return the sequence number.
19692+ *
19693+ * flush() : Make sure the flags indicated in fc->pending_flush will eventually
19694+ * signal for fc->highest_received_sequence and all preceding sequences.
19695+ * Acknowledge by clearing the flags fc->pending_flush.
19696+ *
19697+ * poll() : Call drm_fence_handler with any new information.
19698+ *
19699+ * needed_flush() : Given the current state of the fence->type flags and previusly
19700+ * executed or queued flushes, return the type_flags that need flushing.
19701+ *
19702+ * wait(): Wait for the "mask" flags to signal on a given fence, performing
19703+ * whatever's necessary to make this happen.
19704+ */
19705+
19706+ int (*has_irq) (struct drm_device *dev, uint32_t fence_class,
19707+ uint32_t flags);
19708+ int (*emit) (struct drm_device *dev, uint32_t fence_class,
19709+ uint32_t flags, uint32_t *breadcrumb,
19710+ uint32_t *native_type);
19711+ void (*flush) (struct drm_device *dev, uint32_t fence_class);
19712+ void (*poll) (struct drm_device *dev, uint32_t fence_class,
19713+ uint32_t types);
19714+ uint32_t (*needed_flush) (struct drm_fence_object *fence);
19715+ int (*wait) (struct drm_fence_object *fence, int lazy,
19716+ int interruptible, uint32_t mask);
19717+};
19718+
19719+extern int drm_fence_wait_polling(struct drm_fence_object *fence, int lazy,
19720+ int interruptible, uint32_t mask,
19721+ unsigned long end_jiffies);
19722+extern void drm_fence_handler(struct drm_device *dev, uint32_t fence_class,
19723+ uint32_t sequence, uint32_t type,
19724+ uint32_t error);
19725+extern void drm_fence_manager_init(struct drm_device *dev);
19726+extern void drm_fence_manager_takedown(struct drm_device *dev);
19727+extern void drm_fence_flush_old(struct drm_device *dev, uint32_t fence_class,
19728+ uint32_t sequence);
19729+extern int drm_fence_object_flush(struct drm_fence_object *fence,
19730+ uint32_t type);
19731+extern int drm_fence_object_signaled(struct drm_fence_object *fence,
19732+ uint32_t type);
19733+extern void drm_fence_usage_deref_locked(struct drm_fence_object **fence);
19734+extern void drm_fence_usage_deref_unlocked(struct drm_fence_object **fence);
19735+extern struct drm_fence_object *drm_fence_reference_locked(struct drm_fence_object *src);
19736+extern void drm_fence_reference_unlocked(struct drm_fence_object **dst,
19737+ struct drm_fence_object *src);
19738+extern int drm_fence_object_wait(struct drm_fence_object *fence,
19739+ int lazy, int ignore_signals, uint32_t mask);
19740+extern int drm_fence_object_create(struct drm_device *dev, uint32_t type,
19741+ uint32_t fence_flags, uint32_t fence_class,
19742+ struct drm_fence_object **c_fence);
19743+extern int drm_fence_object_emit(struct drm_fence_object *fence,
19744+ uint32_t fence_flags, uint32_t class,
19745+ uint32_t type);
19746+extern void drm_fence_fill_arg(struct drm_fence_object *fence,
19747+ struct drm_fence_arg *arg);
19748+
19749+extern int drm_fence_add_user_object(struct drm_file *priv,
19750+ struct drm_fence_object *fence,
19751+ int shareable);
19752+
19753+extern int drm_fence_create_ioctl(struct drm_device *dev, void *data,
19754+ struct drm_file *file_priv);
19755+extern int drm_fence_destroy_ioctl(struct drm_device *dev, void *data,
19756+ struct drm_file *file_priv);
19757+extern int drm_fence_reference_ioctl(struct drm_device *dev, void *data,
19758+ struct drm_file *file_priv);
19759+extern int drm_fence_unreference_ioctl(struct drm_device *dev, void *data,
19760+ struct drm_file *file_priv);
19761+extern int drm_fence_signaled_ioctl(struct drm_device *dev, void *data,
19762+ struct drm_file *file_priv);
19763+extern int drm_fence_flush_ioctl(struct drm_device *dev, void *data,
19764+ struct drm_file *file_priv);
19765+extern int drm_fence_wait_ioctl(struct drm_device *dev, void *data,
19766+ struct drm_file *file_priv);
19767+extern int drm_fence_emit_ioctl(struct drm_device *dev, void *data,
19768+ struct drm_file *file_priv);
19769+extern int drm_fence_buffers_ioctl(struct drm_device *dev, void *data,
19770+ struct drm_file *file_priv);
19771+/**************************************************
19772+ *TTMs
19773+ */
19774+
19775+/*
19776+ * The ttm backend GTT interface. (In our case AGP).
19777+ * Any similar type of device (PCIE?)
19778+ * needs only to implement these functions to be usable with the TTM interface.
19779+ * The AGP backend implementation lives in drm_agpsupport.c
19780+ * basically maps these calls to available functions in agpgart.
19781+ * Each drm device driver gets an
19782+ * additional function pointer that creates these types,
19783+ * so that the device can choose the correct aperture.
19784+ * (Multiple AGP apertures, etc.)
19785+ * Most device drivers will let this point to the standard AGP implementation.
19786+ */
19787+
19788+#define DRM_BE_FLAG_NEEDS_FREE 0x00000001
19789+#define DRM_BE_FLAG_BOUND_CACHED 0x00000002
19790+
19791+struct drm_ttm_backend;
19792+struct drm_ttm_backend_func {
19793+ int (*needs_ub_cache_adjust) (struct drm_ttm_backend *backend);
19794+ int (*populate) (struct drm_ttm_backend *backend,
19795+ unsigned long num_pages, struct page **pages);
19796+ void (*clear) (struct drm_ttm_backend *backend);
19797+ int (*bind) (struct drm_ttm_backend *backend,
19798+ struct drm_bo_mem_reg *bo_mem);
19799+ int (*unbind) (struct drm_ttm_backend *backend);
19800+ void (*destroy) (struct drm_ttm_backend *backend);
19801+};
19802+
19803+
19804+struct drm_ttm_backend {
19805+ struct drm_device *dev;
19806+ uint32_t flags;
19807+ struct drm_ttm_backend_func *func;
19808+};
19809+
19810+struct drm_ttm {
19811+ struct page *dummy_read_page;
19812+ struct page **pages;
19813+ uint32_t page_flags;
19814+ unsigned long num_pages;
19815+ atomic_t vma_count;
19816+ struct drm_device *dev;
19817+ int destroy;
19818+ uint32_t mapping_offset;
19819+ struct drm_ttm_backend *be;
19820+ enum {
19821+ ttm_bound,
19822+ ttm_evicted,
19823+ ttm_unbound,
19824+ ttm_unpopulated,
19825+ } state;
19826+
19827+};
19828+
19829+extern struct drm_ttm *drm_ttm_init(struct drm_device *dev, unsigned long size);
19830+extern int drm_bind_ttm(struct drm_ttm *ttm, struct drm_bo_mem_reg *bo_mem);
19831+extern void drm_ttm_unbind(struct drm_ttm *ttm);
19832+extern void drm_ttm_evict(struct drm_ttm *ttm);
19833+extern void drm_ttm_fixup_caching(struct drm_ttm *ttm);
19834+extern struct page *drm_ttm_get_page(struct drm_ttm *ttm, int index);
19835+extern void drm_ttm_cache_flush(void);
19836+extern int drm_ttm_populate(struct drm_ttm *ttm);
19837+extern int drm_ttm_set_user(struct drm_ttm *ttm,
19838+ struct task_struct *tsk,
19839+ int write,
19840+ unsigned long start,
19841+ unsigned long num_pages,
19842+ struct page *dummy_read_page);
19843+unsigned long drm_ttm_size(struct drm_device *dev,
19844+ unsigned long num_pages,
19845+ int user_bo);
19846+
19847+
19848+/*
19849+ * Destroy a ttm. The user normally calls drmRmMap or a similar IOCTL to do
19850+ * this which calls this function iff there are no vmas referencing it anymore.
19851+ * Otherwise it is called when the last vma exits.
19852+ */
19853+
19854+extern int drm_destroy_ttm(struct drm_ttm *ttm);
19855+
19856+#define DRM_FLAG_MASKED(_old, _new, _mask) {\
19857+(_old) ^= (((_old) ^ (_new)) & (_mask)); \
19858+}
19859+
19860+#define DRM_TTM_MASK_FLAGS ((1 << PAGE_SHIFT) - 1)
19861+#define DRM_TTM_MASK_PFN (0xFFFFFFFFU - DRM_TTM_MASK_FLAGS)
19862+
19863+/*
19864+ * Page flags.
19865+ */
19866+
19867+#define DRM_TTM_PAGE_UNCACHED (1 << 0)
19868+#define DRM_TTM_PAGE_USED (1 << 1)
19869+#define DRM_TTM_PAGE_BOUND (1 << 2)
19870+#define DRM_TTM_PAGE_PRESENT (1 << 3)
19871+#define DRM_TTM_PAGE_VMALLOC (1 << 4)
19872+#define DRM_TTM_PAGE_USER (1 << 5)
19873+#define DRM_TTM_PAGE_USER_WRITE (1 << 6)
19874+#define DRM_TTM_PAGE_USER_DIRTY (1 << 7)
19875+#define DRM_TTM_PAGE_USER_DMA (1 << 8)
19876+
19877+/***************************************************
19878+ * Buffer objects. (drm_bo.c, drm_bo_move.c)
19879+ */
19880+
19881+struct drm_bo_mem_reg {
19882+ struct drm_mm_node *mm_node;
19883+ unsigned long size;
19884+ unsigned long num_pages;
19885+ uint32_t page_alignment;
19886+ uint32_t mem_type;
19887+ uint64_t flags;
19888+ uint64_t mask;
19889+ uint32_t desired_tile_stride;
19890+ uint32_t hw_tile_stride;
19891+};
19892+
19893+enum drm_bo_type {
19894+ drm_bo_type_dc,
19895+ drm_bo_type_user,
19896+ drm_bo_type_kernel, /* for initial kernel allocations */
19897+};
19898+
19899+struct drm_buffer_object {
19900+ struct drm_device *dev;
19901+ struct drm_user_object base;
19902+
19903+ /*
19904+ * If there is a possibility that the usage variable is zero,
19905+ * then dev->struct_mutext should be locked before incrementing it.
19906+ */
19907+
19908+ atomic_t usage;
19909+ unsigned long buffer_start;
19910+ enum drm_bo_type type;
19911+ unsigned long offset;
19912+ atomic_t mapped;
19913+ struct drm_bo_mem_reg mem;
19914+
19915+ struct list_head lru;
19916+ struct list_head ddestroy;
19917+
19918+ uint32_t fence_type;
19919+ uint32_t fence_class;
19920+ uint32_t new_fence_type;
19921+ uint32_t new_fence_class;
19922+ struct drm_fence_object *fence;
19923+ uint32_t priv_flags;
19924+ wait_queue_head_t event_queue;
19925+ struct mutex mutex;
19926+ unsigned long num_pages;
19927+ unsigned long reserved_size;
19928+
19929+ /* For pinned buffers */
19930+ struct drm_mm_node *pinned_node;
19931+ uint32_t pinned_mem_type;
19932+ struct list_head pinned_lru;
19933+
19934+ /* For vm */
19935+ struct drm_ttm *ttm;
19936+ struct drm_map_list map_list;
19937+ uint32_t memory_type;
19938+ unsigned long bus_offset;
19939+ uint32_t vm_flags;
19940+ void *iomap;
19941+
19942+#ifdef DRM_ODD_MM_COMPAT
19943+ /* dev->struct_mutex only protected. */
19944+ struct list_head vma_list;
19945+ struct list_head p_mm_list;
19946+#endif
19947+
19948+};
19949+
19950+#define _DRM_BO_FLAG_UNFENCED 0x00000001
19951+#define _DRM_BO_FLAG_EVICTED 0x00000002
19952+
19953+struct drm_mem_type_manager {
19954+ int has_type;
19955+ int use_type;
19956+ struct drm_mm manager;
19957+ struct list_head lru;
19958+ struct list_head pinned;
19959+ uint32_t flags;
19960+ uint32_t drm_bus_maptype;
19961+ unsigned long gpu_offset;
19962+ unsigned long io_offset;
19963+ unsigned long io_size;
19964+ void *io_addr;
19965+};
19966+
19967+struct drm_bo_lock {
19968+ struct drm_user_object base;
19969+ wait_queue_head_t queue;
19970+ atomic_t write_lock_pending;
19971+ atomic_t readers;
19972+};
19973+
19974+#define _DRM_FLAG_MEMTYPE_FIXED 0x00000001 /* Fixed (on-card) PCI memory */
19975+#define _DRM_FLAG_MEMTYPE_MAPPABLE 0x00000002 /* Memory mappable */
19976+#define _DRM_FLAG_MEMTYPE_CACHED 0x00000004 /* Cached binding */
19977+#define _DRM_FLAG_NEEDS_IOREMAP 0x00000008 /* Fixed memory needs ioremap
19978+ before kernel access. */
19979+#define _DRM_FLAG_MEMTYPE_CMA 0x00000010 /* Can't map aperture */
19980+#define _DRM_FLAG_MEMTYPE_CSELECT 0x00000020 /* Select caching */
19981+
19982+struct drm_buffer_manager {
19983+ struct drm_bo_lock bm_lock;
19984+ struct mutex evict_mutex;
19985+ int nice_mode;
19986+ int initialized;
19987+ struct drm_file *last_to_validate;
19988+ struct drm_mem_type_manager man[DRM_BO_MEM_TYPES];
19989+ struct list_head unfenced;
19990+ struct list_head ddestroy;
19991+ struct delayed_work wq;
19992+ uint32_t fence_type;
19993+ unsigned long cur_pages;
19994+ atomic_t count;
19995+ struct page *dummy_read_page;
19996+};
19997+
19998+struct drm_bo_driver {
19999+ const uint32_t *mem_type_prio;
20000+ const uint32_t *mem_busy_prio;
20001+ uint32_t num_mem_type_prio;
20002+ uint32_t num_mem_busy_prio;
20003+ struct drm_ttm_backend *(*create_ttm_backend_entry)
20004+ (struct drm_device *dev);
20005+ int (*backend_size) (struct drm_device *dev,
20006+ unsigned long num_pages);
20007+ int (*fence_type) (struct drm_buffer_object *bo, uint32_t *fclass,
20008+ uint32_t *type);
20009+ int (*invalidate_caches) (struct drm_device *dev, uint64_t flags);
20010+ int (*init_mem_type) (struct drm_device *dev, uint32_t type,
20011+ struct drm_mem_type_manager *man);
20012+ uint32_t(*evict_mask) (struct drm_buffer_object *bo);
20013+ int (*move) (struct drm_buffer_object *bo,
20014+ int evict, int no_wait, struct drm_bo_mem_reg *new_mem);
20015+ void (*ttm_cache_flush)(struct drm_ttm *ttm);
20016+
20017+ /*
20018+ * command_stream_barrier
20019+ *
20020+ * @dev: The drm device.
20021+ *
20022+ * @bo: The buffer object to validate.
20023+ *
20024+ * @new_fence_class: The new fence class for the buffer object.
20025+ *
20026+ * @new_fence_type: The new fence type for the buffer object.
20027+ *
20028+ * @no_wait: whether this should give up and return -EBUSY
20029+ * if this operation would require sleeping
20030+ *
20031+ * Insert a command stream barrier that makes sure that the
20032+ * buffer is idle once the commands associated with the
20033+ * current validation are starting to execute. If an error
20034+ * condition is returned, or the function pointer is NULL,
20035+ * the drm core will force buffer idle
20036+ * during validation.
20037+ */
20038+
20039+ int (*command_stream_barrier) (struct drm_buffer_object *bo,
20040+ uint32_t new_fence_class,
20041+ uint32_t new_fence_type,
20042+ int no_wait);
20043+};
20044+
20045+/*
20046+ * buffer objects (drm_bo.c)
20047+ */
20048+extern int drm_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20049+extern int drm_bo_destroy_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20050+extern int drm_bo_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20051+extern int drm_bo_unmap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20052+extern int drm_bo_reference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20053+extern int drm_bo_set_pin(struct drm_device *dev, struct drm_buffer_object *bo, int pin);
20054+extern int drm_bo_unreference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20055+extern int drm_bo_wait_idle_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20056+extern int drm_bo_info_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20057+extern int drm_bo_setstatus_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20058+extern int drm_mm_init_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20059+extern int drm_mm_takedown_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20060+extern int drm_mm_lock_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20061+extern int drm_mm_unlock_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20062+extern int drm_bo_version_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
20063+extern int drm_bo_driver_finish(struct drm_device *dev);
20064+extern int drm_bo_driver_init(struct drm_device *dev);
20065+extern int drm_bo_pci_offset(struct drm_device *dev,
20066+ struct drm_bo_mem_reg *mem,
20067+ unsigned long *bus_base,
20068+ unsigned long *bus_offset,
20069+ unsigned long *bus_size);
20070+extern int drm_mem_reg_is_pci(struct drm_device *dev, struct drm_bo_mem_reg *mem);
20071+
20072+extern void drm_bo_usage_deref_locked(struct drm_buffer_object **bo);
20073+extern void drm_bo_usage_deref_unlocked(struct drm_buffer_object **bo);
20074+extern void drm_putback_buffer_objects(struct drm_device *dev);
20075+extern int drm_fence_buffer_objects(struct drm_device *dev,
20076+ struct list_head *list,
20077+ uint32_t fence_flags,
20078+ struct drm_fence_object *fence,
20079+ struct drm_fence_object **used_fence);
20080+extern void drm_bo_add_to_lru(struct drm_buffer_object *bo);
20081+extern int drm_buffer_object_create(struct drm_device *dev, unsigned long size,
20082+ enum drm_bo_type type, uint64_t mask,
20083+ uint32_t hint, uint32_t page_alignment,
20084+ unsigned long buffer_start,
20085+ struct drm_buffer_object **bo);
20086+extern int drm_bo_wait(struct drm_buffer_object *bo, int lazy, int ignore_signals,
20087+ int no_wait);
20088+extern int drm_bo_mem_space(struct drm_buffer_object *bo,
20089+ struct drm_bo_mem_reg *mem, int no_wait);
20090+extern int drm_bo_move_buffer(struct drm_buffer_object *bo,
20091+ uint64_t new_mem_flags,
20092+ int no_wait, int move_unfenced);
20093+extern int drm_bo_clean_mm(struct drm_device *dev, unsigned mem_type);
20094+extern int drm_bo_init_mm(struct drm_device *dev, unsigned type,
20095+ unsigned long p_offset, unsigned long p_size);
20096+extern int drm_bo_handle_validate(struct drm_file *file_priv, uint32_t handle,
20097+ uint32_t fence_class, uint64_t flags,
20098+ uint64_t mask, uint32_t hint,
20099+ int use_old_fence_class,
20100+ struct drm_bo_info_rep *rep,
20101+ struct drm_buffer_object **bo_rep);
20102+extern struct drm_buffer_object *drm_lookup_buffer_object(struct drm_file *file_priv,
20103+ uint32_t handle,
20104+ int check_owner);
20105+extern int drm_bo_do_validate(struct drm_buffer_object *bo,
20106+ uint64_t flags, uint64_t mask, uint32_t hint,
20107+ uint32_t fence_class,
20108+ int no_wait,
20109+ struct drm_bo_info_rep *rep);
20110+extern void drm_bo_fill_rep_arg(struct drm_buffer_object *bo,
20111+ struct drm_bo_info_rep *rep);
20112+/*
20113+ * Buffer object memory move- and map helpers.
20114+ * drm_bo_move.c
20115+ */
20116+
20117+extern int drm_bo_move_ttm(struct drm_buffer_object *bo,
20118+ int evict, int no_wait,
20119+ struct drm_bo_mem_reg *new_mem);
20120+extern int drm_bo_move_memcpy(struct drm_buffer_object *bo,
20121+ int evict,
20122+ int no_wait, struct drm_bo_mem_reg *new_mem);
20123+extern int drm_bo_move_accel_cleanup(struct drm_buffer_object *bo,
20124+ int evict, int no_wait,
20125+ uint32_t fence_class, uint32_t fence_type,
20126+ uint32_t fence_flags,
20127+ struct drm_bo_mem_reg *new_mem);
20128+extern int drm_bo_same_page(unsigned long offset, unsigned long offset2);
20129+extern unsigned long drm_bo_offset_end(unsigned long offset,
20130+ unsigned long end);
20131+
20132+struct drm_bo_kmap_obj {
20133+ void *virtual;
20134+ struct page *page;
20135+ enum {
20136+ bo_map_iomap,
20137+ bo_map_vmap,
20138+ bo_map_kmap,
20139+ bo_map_premapped,
20140+ } bo_kmap_type;
20141+};
20142+
20143+static inline void *drm_bmo_virtual(struct drm_bo_kmap_obj *map, int *is_iomem)
20144+{
20145+ *is_iomem = (map->bo_kmap_type == bo_map_iomap ||
20146+ map->bo_kmap_type == bo_map_premapped);
20147+ return map->virtual;
20148+}
20149+extern void drm_bo_kunmap(struct drm_bo_kmap_obj *map);
20150+extern int drm_bo_kmap(struct drm_buffer_object *bo, unsigned long start_page,
20151+ unsigned long num_pages, struct drm_bo_kmap_obj *map);
20152+
20153+
20154+/*
20155+ * drm_regman.c
20156+ */
20157+
20158+struct drm_reg {
20159+ struct list_head head;
20160+ struct drm_fence_object *fence;
20161+ uint32_t fence_type;
20162+ uint32_t new_fence_type;
20163+};
20164+
20165+struct drm_reg_manager {
20166+ struct list_head free;
20167+ struct list_head lru;
20168+ struct list_head unfenced;
20169+
20170+ int (*reg_reusable)(const struct drm_reg *reg, const void *data);
20171+ void (*reg_destroy)(struct drm_reg *reg);
20172+};
20173+
20174+extern int drm_regs_alloc(struct drm_reg_manager *manager,
20175+ const void *data,
20176+ uint32_t fence_class,
20177+ uint32_t fence_type,
20178+ int interruptible,
20179+ int no_wait,
20180+ struct drm_reg **reg);
20181+
20182+extern void drm_regs_fence(struct drm_reg_manager *regs,
20183+ struct drm_fence_object *fence);
20184+
20185+extern void drm_regs_free(struct drm_reg_manager *manager);
20186+extern void drm_regs_add(struct drm_reg_manager *manager, struct drm_reg *reg);
20187+extern void drm_regs_init(struct drm_reg_manager *manager,
20188+ int (*reg_reusable)(const struct drm_reg *,
20189+ const void *),
20190+ void (*reg_destroy)(struct drm_reg *));
20191+
20192+extern int drm_mem_reg_ioremap(struct drm_device *dev, struct drm_bo_mem_reg * mem,
20193+ void **virtual);
20194+extern void drm_mem_reg_iounmap(struct drm_device *dev, struct drm_bo_mem_reg * mem,
20195+ void *virtual);
20196+/*
20197+ * drm_bo_lock.c
20198+ * Simple replacement for the hardware lock on buffer manager init and clean.
20199+ */
20200+
20201+
20202+extern void drm_bo_init_lock(struct drm_bo_lock *lock);
20203+extern void drm_bo_read_unlock(struct drm_bo_lock *lock);
20204+extern int drm_bo_read_lock(struct drm_bo_lock *lock);
20205+extern int drm_bo_write_lock(struct drm_bo_lock *lock,
20206+ struct drm_file *file_priv);
20207+
20208+extern int drm_bo_write_unlock(struct drm_bo_lock *lock,
20209+ struct drm_file *file_priv);
20210+
20211+#ifdef CONFIG_DEBUG_MUTEXES
20212+#define DRM_ASSERT_LOCKED(_mutex) \
20213+ BUG_ON(!mutex_is_locked(_mutex) || \
20214+ ((_mutex)->owner != current_thread_info()))
20215+#else
20216+#define DRM_ASSERT_LOCKED(_mutex)
20217+#endif
20218+#endif
20219Index: linux-2.6.28/drivers/gpu/drm/drm_crtc.c
20220===================================================================
20221--- linux-2.6.28.orig/drivers/gpu/drm/drm_crtc.c 2009-02-20 12:22:54.000000000 +0000
20222+++ linux-2.6.28/drivers/gpu/drm/drm_crtc.c 2009-02-20 12:23:06.000000000 +0000
20223@@ -807,6 +807,53 @@
20224 }
20225 EXPORT_SYMBOL(drm_mode_config_init);
20226
20227+/**
20228+ * drm_get_buffer_object - find the buffer object for a given handle
20229+ * @dev: DRM device
20230+ * @bo: pointer to caller's buffer_object pointer
20231+ * @handle: handle to lookup
20232+ *
20233+ * LOCKING:
20234+ * Must take @dev's struct_mutex to protect buffer object lookup.
20235+ *
20236+ * Given @handle, lookup the buffer object in @dev and put it in the caller's
20237+ * @bo pointer.
20238+ *
20239+ * RETURNS:
20240+ * Zero on success, -EINVAL if the handle couldn't be found.
20241+ */
20242+static int drm_get_buffer_object(struct drm_device *dev, struct drm_buffer_object **bo, unsigned long handle)
20243+{
20244+ struct drm_user_object *uo;
20245+ struct drm_hash_item *hash;
20246+ int ret;
20247+
20248+ *bo = NULL;
20249+
20250+ mutex_lock(&dev->struct_mutex);
20251+ ret = drm_ht_find_item(&dev->object_hash, handle, &hash);
20252+ if (ret) {
20253+ DRM_ERROR("Couldn't find handle.\n");
20254+ ret = -EINVAL;
20255+ goto out_err;
20256+ }
20257+
20258+ uo = drm_hash_entry(hash, struct drm_user_object, hash);
20259+ if (uo->type != drm_buffer_type) {
20260+ ret = -EINVAL;
20261+ goto out_err;
20262+ }
20263+
20264+ *bo = drm_user_object_entry(uo, struct drm_buffer_object, base);
20265+ ret = 0;
20266+out_err:
20267+ mutex_unlock(&dev->struct_mutex);
20268+ return ret;
20269+}
20270+
20271+char drm_init_mode[32];
20272+EXPORT_SYMBOL(drm_init_mode);
20273+
20274 int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group)
20275 {
20276 uint32_t total_objects = 0;
20277@@ -1588,6 +1635,8 @@
20278 struct drm_mode_fb_cmd *r = data;
20279 struct drm_mode_config *config = &dev->mode_config;
20280 struct drm_framebuffer *fb;
20281+ struct drm_buffer_object *bo;
20282+ struct drm_crtc *crtc;
20283 int ret = 0;
20284
20285 if ((config->min_width > r->width) || (r->width > config->max_width)) {
20286@@ -1600,20 +1649,46 @@
20287 }
20288
20289 mutex_lock(&dev->mode_config.mutex);
20290+ /* TODO check limits are okay */
20291+ ret = drm_get_buffer_object(dev, &bo, r->handle);
20292+ if (ret || !bo) {
20293+ ret = -EINVAL;
20294+ goto out;
20295+ }
20296
20297 /* TODO check buffer is sufficently large */
20298 /* TODO setup destructor callback */
20299
20300- fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
20301+ fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
20302+ if (!fb) {
20303+ ret = -ENOMEM;
20304+ goto out;
20305+ }
20306+
20307+ drm_framebuffer_init(dev, fb, NULL);
20308 if (!fb) {
20309 DRM_ERROR("could not create framebuffer\n");
20310 ret = -EINVAL;
20311 goto out;
20312 }
20313
20314+ fb->width = r->width;
20315+ fb->height = r->height;
20316+ fb->pitch = r->pitch;
20317+ fb->bits_per_pixel = r->bpp;
20318+ fb->depth = r->depth;
20319+ fb->offset = bo->offset;
20320+ fb->bo = bo;
20321+
20322 r->fb_id = fb->base.id;
20323 list_add(&fb->filp_head, &file_priv->fbs);
20324
20325+ /* FIXME: bind the fb to the right crtc */
20326+ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
20327+ crtc->fb = fb;
20328+ dev->driver->fb_probe(dev, crtc);
20329+ }
20330+
20331 out:
20332 mutex_unlock(&dev->mode_config.mutex);
20333 return ret;
20334@@ -1669,8 +1744,10 @@
20335 /* TODO release all crtc connected to the framebuffer */
20336 /* TODO unhock the destructor from the buffer object */
20337
20338- list_del(&fb->filp_head);
20339- fb->funcs->destroy(fb);
20340+ if (fb->bo->type != drm_bo_type_kernel)
20341+ drm_framebuffer_cleanup(fb);
20342+ else
20343+ dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb));
20344
20345 out:
20346 mutex_unlock(&dev->mode_config.mutex);
20347@@ -1716,7 +1793,7 @@
20348 r->depth = fb->depth;
20349 r->bpp = fb->bits_per_pixel;
20350 r->pitch = fb->pitch;
20351- fb->funcs->create_handle(fb, file_priv, &r->handle);
20352+ r->handle = fb->bo->base.hash.key;
20353
20354 out:
20355 mutex_unlock(&dev->mode_config.mutex);
20356@@ -1746,7 +1823,10 @@
20357 mutex_lock(&dev->mode_config.mutex);
20358 list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) {
20359 list_del(&fb->filp_head);
20360- fb->funcs->destroy(fb);
20361+ if (fb->bo->type != drm_bo_type_kernel)
20362+ drm_framebuffer_cleanup(fb);
20363+ else
20364+ dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb));
20365 }
20366 mutex_unlock(&dev->mode_config.mutex);
20367 }
20368Index: linux-2.6.28/include/drm/drm_crtc.h
20369===================================================================
20370--- linux-2.6.28.orig/include/drm/drm_crtc.h 2009-02-20 12:22:53.000000000 +0000
20371+++ linux-2.6.28/include/drm/drm_crtc.h 2009-02-20 12:23:06.000000000 +0000
20372@@ -50,6 +50,8 @@
20373 uint32_t type;
20374 };
20375
20376+#include <drm/drm_objects.h>
20377+
20378 /*
20379 * Note on terminology: here, for brevity and convenience, we refer to connector
20380 * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS,
20381@@ -258,6 +260,9 @@
20382 int flags;
20383 void *fbdev;
20384 u32 pseudo_palette[17];
20385+ unsigned long offset;
20386+ struct drm_buffer_object *bo;
20387+ struct drm_bo_kmap_obj kmap;
20388 struct list_head filp_head;
20389 };
20390
20391Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c
20392===================================================================
20393--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_lvds.c 2009-02-20 12:22:54.000000000 +0000
20394+++ linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c 2009-02-20 12:23:06.000000000 +0000
20395@@ -36,6 +36,259 @@
20396 #include "i915_drm.h"
20397 #include "i915_drv.h"
20398
20399+#include <acpi/acpi_drivers.h>
20400+
20401+#define BLC_I2C_TYPE 0x01
20402+#define BLC_PWM_TYPE 0x02
20403+#define BRIGHTNESS_MASK 0xff
20404+#define BRIGHTNESS_MAX_LEVEL 100
20405+#define BLC_POLARITY_NORMAL 0
20406+#define BLC_POLARITY_INVERSE 1
20407+#define BACKLIGHT_PWM_POLARITY_BIT_CLEAR (0xfffe)
20408+#define BACKLIGHT_PWM_CTL_SHIFT (16)
20409+#define BLC_MAX_PWM_REG_FREQ 0xfffe
20410+#define BLC_MIN_PWM_REG_FREQ 0x2
20411+#define BLC_PWM_LEGACY_MODE_ENABLE 0x0001
20412+#define BLC_PWM_PRECISION_FACTOR 10//10000000
20413+#define BLC_PWM_FREQ_CALC_CONSTANT 32
20414+#define MHz 1000000
20415+#define OFFSET_OPREGION_VBT 0x400
20416+
20417+typedef struct OpRegion_Header
20418+{
20419+ char sign[16];
20420+ u32 size;
20421+ u32 over;
20422+ char sver[32];
20423+ char vver[16];
20424+ char gver[16];
20425+ u32 mbox;
20426+ char rhd1[164];
20427+} OpRegionRec, *OpRegionPtr;
20428+
20429+struct vbt_header2
20430+{
20431+ char signature[20]; /**< Always starts with 'VBT$' */
20432+ u16 version; /**< decimal */
20433+ u16 header_size; /**< in bytes */
20434+ u16 vbt_size; /**< in bytes */
20435+ u8 vbt_checksum;
20436+ u8 reserved0;
20437+ u32 bdb_offset; /**< from beginning of VBT */
20438+ u32 aim1_offset; /**< from beginning of VBT */
20439+ u32 aim2_offset; /**< from beginning of VBT */
20440+ u32 aim3_offset; /**< from beginning of VBT */
20441+ u32 aim4_offset; /**< from beginning of VBT */
20442+} __attribute__ ((packed));
20443+
20444+struct bdb_header2
20445+{
20446+ char signature[16]; /**< Always 'BIOS_DATA_BLOCK' */
20447+ u16 version; /**< decimal */
20448+ u16 header_size; /**< in bytes */
20449+ u16 bdb_size; /**< in bytes */
20450+} __attribute__ ((packed));
20451+
20452+#define LVDS_CAP_EDID (1 << 6)
20453+#define LVDS_CAP_DITHER (1 << 5)
20454+#define LVDS_CAP_PFIT_AUTO_RATIO (1 << 4)
20455+#define LVDS_CAP_PFIT_GRAPHICS_MODE (1 << 3)
20456+#define LVDS_CAP_PFIT_TEXT_MODE (1 << 2)
20457+#define LVDS_CAP_PFIT_GRAPHICS (1 << 1)
20458+#define LVDS_CAP_PFIT_TEXT (1 << 0)
20459+struct lvds_bdb_1
20460+{
20461+ u8 id; /**< 40 */
20462+ u16 size;
20463+ u8 panel_type;
20464+ u8 reserved0;
20465+ u16 caps;
20466+} __attribute__ ((packed));
20467+
20468+struct lvds_bdb_2_fp_params
20469+{
20470+ u16 x_res;
20471+ u16 y_res;
20472+ u32 lvds_reg;
20473+ u32 lvds_reg_val;
20474+ u32 pp_on_reg;
20475+ u32 pp_on_reg_val;
20476+ u32 pp_off_reg;
20477+ u32 pp_off_reg_val;
20478+ u32 pp_cycle_reg;
20479+ u32 pp_cycle_reg_val;
20480+ u32 pfit_reg;
20481+ u32 pfit_reg_val;
20482+ u16 terminator;
20483+} __attribute__ ((packed));
20484+
20485+struct lvds_bdb_2_fp_edid_dtd
20486+{
20487+ u16 dclk; /**< In 10khz */
20488+ u8 hactive;
20489+ u8 hblank;
20490+ u8 high_h; /**< 7:4 = hactive 11:8, 3:0 = hblank 11:8 */
20491+ u8 vactive;
20492+ u8 vblank;
20493+ u8 high_v; /**< 7:4 = vactive 11:8, 3:0 = vblank 11:8 */
20494+ u8 hsync_off;
20495+ u8 hsync_pulse_width;
20496+ u8 vsync_off;
20497+ u8 high_hsync_off; /**< 7:6 = hsync off 9:8 */
20498+ u8 h_image;
20499+ u8 v_image;
20500+ u8 max_hv;
20501+ u8 h_border;
20502+ u8 v_border;
20503+ u8 flags;
20504+#define FP_EDID_FLAG_VSYNC_POSITIVE (1 << 2)
20505+#define FP_EDID_FLAG_HSYNC_POSITIVE (1 << 1)
20506+} __attribute__ ((packed));
20507+
20508+struct lvds_bdb_2_entry
20509+{
20510+ u16 fp_params_offset; /**< From beginning of BDB */
20511+ u8 fp_params_size;
20512+ u16 fp_edid_dtd_offset;
20513+ u8 fp_edid_dtd_size;
20514+ u16 fp_edid_pid_offset;
20515+ u8 fp_edid_pid_size;
20516+} __attribute__ ((packed));
20517+
20518+struct lvds_bdb_2
20519+{
20520+ u8 id; /**< 41 */
20521+ u16 size;
20522+ u8 table_size; /* not sure on this one */
20523+ struct lvds_bdb_2_entry panels[16];
20524+} __attribute__ ((packed));
20525+
20526+
20527+struct lvds_bdb_blc
20528+{
20529+ u8 id; /**< 43 */
20530+ u16 size;
20531+ u8 table_size;
20532+} __attribute__ ((packed));
20533+
20534+struct lvds_blc
20535+{
20536+ u8 type:2;
20537+ u8 pol:1;
20538+ u8 gpio:3;
20539+ u8 gmbus:2;
20540+ u16 freq;
20541+ u8 minbrightness;
20542+ u8 i2caddr;
20543+ u8 brightnesscmd;
20544+ /* more... */
20545+} __attribute__ ((packed));
20546+
20547+int drm_intel_ignore_acpi = 0;
20548+MODULE_PARM_DESC(ignore_acpi, "Ignore ACPI");
20549+module_param_named(ignore_acpi, drm_intel_ignore_acpi, int, 0600);
20550+
20551+uint8_t blc_type;
20552+uint8_t blc_pol;
20553+uint8_t blc_freq;
20554+uint8_t blc_minbrightness;
20555+uint8_t blc_i2caddr;
20556+uint8_t blc_brightnesscmd;
20557+int lvds_backlight; /* restore backlight to this value */
20558+
20559+struct intel_i2c_chan *lvds_i2c_bus;
20560+u32 CoreClock;
20561+u32 PWMControlRegFreq;
20562+
20563+unsigned char * dev_OpRegion = NULL;
20564+unsigned int dev_OpRegionSize;
20565+
20566+#define PCI_PORT5_REG80_FFUSE 0xD0058000
20567+#define PCI_PORT5_REG80_MAXRES_INT_EN 0x0040
20568+#define MAX_HDISPLAY 800
20569+#define MAX_VDISPLAY 480
20570+bool sku_bMaxResEnableInt = false;
20571+
20572+/** Set BLC through I2C*/
20573+static int
20574+LVDSI2CSetBacklight(struct drm_device *dev, unsigned char ch)
20575+{
20576+ u8 out_buf[2];
20577+ struct i2c_msg msgs[] = {
20578+ {
20579+ .addr = lvds_i2c_bus->slave_addr,
20580+ .flags = 0,
20581+ .len = 2,
20582+ .buf = out_buf,
20583+ }
20584+ };
20585+
20586+ DRM_INFO("LVDSI2CSetBacklight: the slave_addr is 0x%x, the backlight value is %d\n", lvds_i2c_bus->slave_addr, ch);
20587+
20588+ out_buf[0] = blc_brightnesscmd;
20589+ out_buf[1] = ch;
20590+
20591+ if (i2c_transfer(&lvds_i2c_bus->adapter, msgs, 1) == 1)
20592+ {
20593+ DRM_INFO("LVDSI2CSetBacklight: i2c_transfer done\n");
20594+ return true;
20595+ }
20596+
20597+ DRM_ERROR("msg: i2c_transfer error\n");
20598+ return false;
20599+}
20600+
20601+/**
20602+ * Calculate PWM control register value.
20603+ */
20604+static int
20605+LVDSCalculatePWMCtrlRegFreq(struct drm_device *dev)
20606+{
20607+ unsigned long value = 0;
20608+
20609+ DRM_INFO("Enter LVDSCalculatePWMCtrlRegFreq.\n");
20610+ if (blc_freq == 0) {
20611+ DRM_ERROR("LVDSCalculatePWMCtrlRegFreq: Frequency Requested is 0.\n");
20612+ return FALSE;
20613+ }
20614+ value = (CoreClock * MHz);
20615+ value = (value / BLC_PWM_FREQ_CALC_CONSTANT);
20616+ value = (value * BLC_PWM_PRECISION_FACTOR);
20617+ value = (value / blc_freq);
20618+ value = (value / BLC_PWM_PRECISION_FACTOR);
20619+
20620+ if (value > (unsigned long)BLC_MAX_PWM_REG_FREQ ||
20621+ value < (unsigned long)BLC_MIN_PWM_REG_FREQ) {
20622+ return FALSE;
20623+ } else {
20624+ PWMControlRegFreq = ((u32)value & ~BLC_PWM_LEGACY_MODE_ENABLE);
20625+ return TRUE;
20626+ }
20627+}
20628+
20629+/**
20630+ * Returns the maximum level of the backlight duty cycle field.
20631+ */
20632+static u32
20633+LVDSGetPWMMaxBacklight(struct drm_device *dev)
20634+{
20635+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20636+ u32 max_pwm_blc = 0;
20637+
20638+ max_pwm_blc = ((I915_READ(BLC_PWM_CTL) & BACKLIGHT_MODULATION_FREQ_MASK) >> \
20639+ BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
20640+
20641+ if (!(max_pwm_blc & BLC_MAX_PWM_REG_FREQ)) {
20642+ if (LVDSCalculatePWMCtrlRegFreq(dev)) {
20643+ max_pwm_blc = PWMControlRegFreq;
20644+ }
20645+ }
20646+
20647+ DRM_INFO("LVDSGetPWMMaxBacklight: the max_pwm_blc is %d.\n", max_pwm_blc);
20648+ return max_pwm_blc;
20649+}
20650+
20651+
20652 /**
20653 * Sets the backlight level.
20654 *
20655@@ -43,12 +296,48 @@
20656 */
20657 static void intel_lvds_set_backlight(struct drm_device *dev, int level)
20658 {
20659- struct drm_i915_private *dev_priv = dev->dev_private;
20660+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20661+ /*
20662 u32 blc_pwm_ctl;
20663
20664 blc_pwm_ctl = I915_READ(BLC_PWM_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
20665 I915_WRITE(BLC_PWM_CTL, (blc_pwm_ctl |
20666 (level << BACKLIGHT_DUTY_CYCLE_SHIFT)));
20667+ */
20668+ u32 newbacklight = 0;
20669+
20670+ DRM_INFO("intel_lvds_set_backlight: the level is %d\n", level);
20671+
20672+ if(blc_type == BLC_I2C_TYPE){
20673+ newbacklight = BRIGHTNESS_MASK & ((unsigned long)level * \
20674+ BRIGHTNESS_MASK /BRIGHTNESS_MAX_LEVEL);
20675+
20676+ if (blc_pol == BLC_POLARITY_INVERSE) {
20677+ newbacklight = BRIGHTNESS_MASK - newbacklight;
20678+ }
20679+
20680+ LVDSI2CSetBacklight(dev, newbacklight);
20681+
20682+ } else if (blc_type == BLC_PWM_TYPE) {
20683+ u32 max_pwm_blc = LVDSGetPWMMaxBacklight(dev);
20684+
20685+ u32 blc_pwm_duty_cycle;
20686+
20687+ /* Provent LVDS going to total black */
20688+ if ( level < 20) {
20689+ level = 20;
20690+ }
20691+ blc_pwm_duty_cycle = level * max_pwm_blc/BRIGHTNESS_MAX_LEVEL;
20692+
20693+ if (blc_pol == BLC_POLARITY_INVERSE) {
20694+ blc_pwm_duty_cycle = max_pwm_blc - blc_pwm_duty_cycle;
20695+ }
20696+
20697+ blc_pwm_duty_cycle &= BACKLIGHT_PWM_POLARITY_BIT_CLEAR;
20698+
20699+ I915_WRITE(BLC_PWM_CTL,
20700+ (max_pwm_blc << BACKLIGHT_PWM_CTL_SHIFT)| (blc_pwm_duty_cycle));
20701+ }
20702 }
20703
20704 /**
20705@@ -56,10 +345,13 @@
20706 */
20707 static u32 intel_lvds_get_max_backlight(struct drm_device *dev)
20708 {
20709- struct drm_i915_private *dev_priv = dev->dev_private;
20710+ return BRIGHTNESS_MAX_LEVEL;
20711+ /*
20712+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20713
20714 return ((I915_READ(BLC_PWM_CTL) & BACKLIGHT_MODULATION_FREQ_MASK) >>
20715 BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
20716+ */
20717 }
20718
20719 /**
20720@@ -77,7 +369,7 @@
20721 pp_status = I915_READ(PP_STATUS);
20722 } while ((pp_status & PP_ON) == 0);
20723
20724- intel_lvds_set_backlight(dev, dev_priv->backlight_duty_cycle);
20725+ intel_lvds_set_backlight(dev, lvds_backlight);
20726 } else {
20727 intel_lvds_set_backlight(dev, 0);
20728
20729@@ -93,6 +385,7 @@
20730 {
20731 struct drm_device *dev = encoder->dev;
20732
20733+ DRM_INFO("intel_lvds_dpms: the mode is %d\n", mode);
20734 if (mode == DRM_MODE_DPMS_ON)
20735 intel_lvds_set_power(dev, true);
20736 else
20737@@ -152,6 +445,13 @@
20738 return MODE_PANEL;
20739 }
20740
20741+ if (IS_POULSBO(dev) && sku_bMaxResEnableInt) {
20742+ if (mode->hdisplay > MAX_HDISPLAY)
20743+ return MODE_PANEL;
20744+ if (mode->vdisplay > MAX_VDISPLAY)
20745+ return MODE_PANEL;
20746+ }
20747+
20748 return MODE_OK;
20749 }
20750
20751@@ -185,20 +485,20 @@
20752 * with the panel scaling set up to source from the H/VDisplay
20753 * of the original mode.
20754 */
20755- if (dev_priv->panel_fixed_mode != NULL) {
20756- adjusted_mode->hdisplay = dev_priv->panel_fixed_mode->hdisplay;
20757+ if (dev_priv_common->panel_fixed_mode != NULL) {
20758+ adjusted_mode->hdisplay = dev_priv_common->panel_fixed_mode->hdisplay;
20759 adjusted_mode->hsync_start =
20760- dev_priv->panel_fixed_mode->hsync_start;
20761+ dev_priv_common->panel_fixed_mode->hsync_start;
20762 adjusted_mode->hsync_end =
20763- dev_priv->panel_fixed_mode->hsync_end;
20764- adjusted_mode->htotal = dev_priv->panel_fixed_mode->htotal;
20765- adjusted_mode->vdisplay = dev_priv->panel_fixed_mode->vdisplay;
20766+ dev_priv_common->panel_fixed_mode->hsync_end;
20767+ adjusted_mode->htotal = dev_priv_common->panel_fixed_mode->htotal;
20768+ adjusted_mode->vdisplay = dev_priv_common->panel_fixed_mode->vdisplay;
20769 adjusted_mode->vsync_start =
20770- dev_priv->panel_fixed_mode->vsync_start;
20771+ dev_priv_common->panel_fixed_mode->vsync_start;
20772 adjusted_mode->vsync_end =
20773- dev_priv->panel_fixed_mode->vsync_end;
20774- adjusted_mode->vtotal = dev_priv->panel_fixed_mode->vtotal;
20775- adjusted_mode->clock = dev_priv->panel_fixed_mode->clock;
20776+ dev_priv_common->panel_fixed_mode->vsync_end;
20777+ adjusted_mode->vtotal = dev_priv_common->panel_fixed_mode->vtotal;
20778+ adjusted_mode->clock = dev_priv_common->panel_fixed_mode->clock;
20779 drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
20780 }
20781
20782@@ -214,10 +514,10 @@
20783 static void intel_lvds_prepare(struct drm_encoder *encoder)
20784 {
20785 struct drm_device *dev = encoder->dev;
20786- struct drm_i915_private *dev_priv = dev->dev_private;
20787+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20788
20789- dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);
20790- dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL &
20791+ dev_priv_common->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);
20792+ dev_priv_common->backlight_duty_cycle = (dev_priv_common->saveBLC_PWM_CTL &
20793 BACKLIGHT_DUTY_CYCLE_MASK);
20794
20795 intel_lvds_set_power(dev, false);
20796@@ -226,10 +526,11 @@
20797 static void intel_lvds_commit( struct drm_encoder *encoder)
20798 {
20799 struct drm_device *dev = encoder->dev;
20800- struct drm_i915_private *dev_priv = dev->dev_private;
20801+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20802
20803- if (dev_priv->backlight_duty_cycle == 0)
20804- dev_priv->backlight_duty_cycle =
20805+ if (dev_priv_common->backlight_duty_cycle == 0)
20806+ //dev_priv_common->backlight_duty_cycle =
20807+ lvds_backlight =
20808 intel_lvds_get_max_backlight(dev);
20809
20810 intel_lvds_set_power(dev, true);
20811@@ -291,10 +592,12 @@
20812 {
20813 struct drm_device *dev = connector->dev;
20814 struct intel_output *intel_output = to_intel_output(connector);
20815- struct drm_i915_private *dev_priv = dev->dev_private;
20816+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20817 int ret = 0;
20818
20819+ mutex_lock(&dev->mode_config.mutex);
20820 ret = intel_ddc_get_modes(intel_output);
20821+ mutex_unlock(&dev->mode_config.mutex);
20822
20823 if (ret)
20824 return ret;
20825@@ -308,11 +611,11 @@
20826 connector->display_info.min_hfreq = 0;
20827 connector->display_info.max_hfreq = 200;
20828
20829- if (dev_priv->panel_fixed_mode != NULL) {
20830+ if (dev_priv_common->panel_fixed_mode != NULL) {
20831 struct drm_display_mode *mode;
20832
20833 mutex_unlock(&dev->mode_config.mutex);
20834- mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
20835+ mode = drm_mode_duplicate(dev, dev_priv_common->panel_fixed_mode);
20836 drm_mode_probed_add(connector, mode);
20837 mutex_unlock(&dev->mode_config.mutex);
20838
20839@@ -333,8 +636,11 @@
20840 {
20841 struct intel_output *intel_output = to_intel_output(connector);
20842
20843+ if(dev_OpRegion != NULL)
20844+ iounmap(dev_OpRegion);
20845 if (intel_output->ddc_bus)
20846 intel_i2c_destroy(intel_output->ddc_bus);
20847+ intel_i2c_destroy(lvds_i2c_bus);
20848 drm_sysfs_connector_remove(connector);
20849 drm_connector_cleanup(connector);
20850 kfree(connector);
20851@@ -373,7 +679,45 @@
20852 };
20853
20854
20855-
20856+int intel_get_acpi_dod(char *method)
20857+{
20858+ int status;
20859+ int found = 0;
20860+ int i;
20861+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
20862+ union acpi_object *dod = NULL;
20863+ union acpi_object *obj;
20864+
20865+ status = acpi_evaluate_object(NULL, method, NULL, &buffer);
20866+ if (ACPI_FAILURE(status))
20867+ return -ENODEV;
20868+
20869+ dod = buffer.pointer;
20870+ if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
20871+ status = -EFAULT;
20872+ goto out;
20873+ }
20874+
20875+ DRM_DEBUG("Found %d video heads in _DOD\n", dod->package.count);
20876+
20877+ for (i = 0; i < dod->package.count; i++) {
20878+ obj = &dod->package.elements[i];
20879+
20880+ if (obj->type != ACPI_TYPE_INTEGER) {
20881+ DRM_DEBUG("Invalid _DOD data\n");
20882+ } else {
20883+ DRM_DEBUG("dod element[%d] = 0x%x\n", i,
20884+ (int)obj->integer.value);
20885+
20886+ /* look for an LVDS type */
20887+ if (obj->integer.value & 0x00000400)
20888+ found = 1;
20889+ }
20890+ }
20891+ out:
20892+ kfree(buffer.pointer);
20893+ return found;
20894+}
20895 /**
20896 * intel_lvds_init - setup LVDS connectors on this device
20897 * @dev: drm device
20898@@ -383,7 +727,7 @@
20899 */
20900 void intel_lvds_init(struct drm_device *dev)
20901 {
20902- struct drm_i915_private *dev_priv = dev->dev_private;
20903+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
20904 struct intel_output *intel_output;
20905 struct drm_connector *connector;
20906 struct drm_encoder *encoder;
20907@@ -391,12 +735,38 @@
20908 struct drm_crtc *crtc;
20909 u32 lvds;
20910 int pipe;
20911+ u32 OpRegion_Phys;
20912+ unsigned int OpRegion_Size = 0x100;
20913+ OpRegionPtr OpRegion;
20914+ char *OpRegion_String = "IntelGraphicsMem";
20915+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);
20916+ u32 clock;
20917+ u32 sku_value = 0;
20918+ unsigned int CoreClocks[] = {
20919+ 100,
20920+ 133,
20921+ 150,
20922+ 178,
20923+ 200,
20924+ 266,
20925+ 266,
20926+ 266
20927+ };
20928+ struct vbt_header *vbt;
20929+ struct bdb_header *bdb;
20930+ int vbt_off, bdb_off, bdb_block_off, block_size;
20931+ int panel_type = -1;
20932+ unsigned char *bios;
20933+ unsigned char *vbt_buf;
20934
20935 intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
20936 if (!intel_output) {
20937 return;
20938 }
20939
20940+ //if (!drm_intel_ignore_acpi && !intel_get_acpi_dod(ACPI_DOD))
20941+ // return;
20942+
20943 connector = &intel_output->base;
20944 encoder = &intel_output->enc;
20945 drm_connector_init(dev, &intel_output->base, &intel_lvds_connector_funcs,
20946@@ -414,16 +784,139 @@
20947 connector->interlace_allowed = false;
20948 connector->doublescan_allowed = false;
20949
20950+ //initialize the I2C bus and BLC data
20951+ lvds_i2c_bus = intel_i2c_create(dev, GPIOB, "LVDSBLC_B");
20952+ if (!lvds_i2c_bus) {
20953+ dev_printk(KERN_ERR, &dev->pdev->dev, "i2c bus registration "
20954+ "failed.\n");
20955+ return;
20956+ }
20957+ lvds_i2c_bus->slave_addr = 0x2c;//0x58;
20958+ lvds_backlight = BRIGHTNESS_MAX_LEVEL;
20959+ blc_type = 0;
20960+ blc_pol = 0;
20961
20962- /*
20963- * LVDS discovery:
20964- * 1) check for EDID on DDC
20965- * 2) check for VBT data
20966- * 3) check to see if LVDS is already on
20967- * if none of the above, no panel
20968- * 4) make sure lid is open
20969- * if closed, act like it's not there for now
20970- */
20971+ //get the BLC init data from VBT
20972+
20973+
20974+
20975+
20976+ pci_read_config_dword(dev->pdev, 0xFC, &OpRegion_Phys);
20977+
20978+ dev_OpRegion = ioremap(OpRegion_Phys, OpRegion_Size);
20979+ dev_OpRegionSize = OpRegion_Size;
20980+
20981+ OpRegion = (OpRegionPtr) dev_OpRegion;
20982+
20983+ if (!memcmp(OpRegion->sign, OpRegion_String, 16)) {
20984+ unsigned int OpRegion_NewSize;
20985+
20986+ OpRegion_NewSize = OpRegion->size * 1024;
20987+
20988+ dev_OpRegionSize = OpRegion_NewSize;
20989+
20990+ iounmap(dev_OpRegion);
20991+ dev_OpRegion = ioremap(OpRegion_Phys, OpRegion_NewSize);
20992+ } else {
20993+ iounmap(dev_OpRegion);
20994+ dev_OpRegion = NULL;
20995+ }
20996+
20997+ if((dev_OpRegion != NULL)&&(dev_OpRegionSize >= OFFSET_OPREGION_VBT)) {
20998+ DRM_INFO("intel_lvds_init: OpRegion has the VBT address\n");
20999+ vbt_buf = dev_OpRegion + OFFSET_OPREGION_VBT;
21000+ vbt = (struct vbt_header *)(dev_OpRegion + OFFSET_OPREGION_VBT);
21001+ } else {
21002+ DRM_INFO("intel_lvds_init: No OpRegion, use the bios at fixed address 0xc0000\n");
21003+ bios = phys_to_virt(0xC0000);
21004+ if(*((u16 *)bios) != 0xAA55){
21005+ bios = NULL;
21006+ DRM_ERROR("the bios is incorrect\n");
21007+ goto blc_out;
21008+ }
21009+ vbt_off = bios[0x1a] | (bios[0x1a + 1] << 8);
21010+ DRM_INFO("intel_lvds_init: the vbt off is %x\n", vbt_off);
21011+ vbt_buf = bios + vbt_off;
21012+ vbt = (struct vbt_header *)(bios + vbt_off);
21013+ }
21014+
21015+ bdb_off = vbt->bdb_offset;
21016+ bdb = (struct bdb_header *)(vbt_buf + bdb_off);
21017+
21018+ DRM_INFO("intel_lvds_init: The bdb->signature is %s, the bdb_off is %d\n",bdb->signature, bdb_off);
21019+
21020+ if (memcmp(bdb->signature, "BIOS_DATA_BLOCK ", 16) != 0) {
21021+ DRM_ERROR("the vbt is error\n");
21022+ goto blc_out;
21023+ }
21024+
21025+ for (bdb_block_off = bdb->header_size; bdb_block_off < bdb->bdb_size;
21026+ bdb_block_off += block_size) {
21027+ int start = bdb_off + bdb_block_off;
21028+ int id, num_entries;
21029+ struct lvds_bdb_1 *lvds1;
21030+ struct lvds_blc *lvdsblc;
21031+ struct lvds_bdb_blc *bdbblc;
21032+
21033+ id = vbt_buf[start];
21034+ block_size = (vbt_buf[start + 1] | (vbt_buf[start + 2] << 8)) + 3;
21035+ switch (id) {
21036+ case 40:
21037+ lvds1 = (struct lvds_bdb_1 *)(vbt_buf+ start);
21038+ panel_type = lvds1->panel_type;
21039+ //if (lvds1->caps & LVDS_CAP_DITHER)
21040+ // *panelWantsDither = TRUE;
21041+ break;
21042+
21043+ case 43:
21044+ bdbblc = (struct lvds_bdb_blc *)(vbt_buf + start);
21045+ num_entries = bdbblc->table_size? (bdbblc->size - \
21046+ sizeof(bdbblc->table_size))/bdbblc->table_size : 0;
21047+ if (num_entries << 16 && bdbblc->table_size == sizeof(struct lvds_blc)) {
21048+ lvdsblc = (struct lvds_blc *)(vbt_buf + start + sizeof(struct lvds_bdb_blc));
21049+ lvdsblc += panel_type;
21050+ blc_type = lvdsblc->type;
21051+ blc_pol = lvdsblc->pol;
21052+ blc_freq = lvdsblc->freq;
21053+ blc_minbrightness = lvdsblc->minbrightness;
21054+ blc_i2caddr = lvdsblc->i2caddr;
21055+ blc_brightnesscmd = lvdsblc->brightnesscmd;
21056+ DRM_INFO("intel_lvds_init: BLC Data in BIOS VBT tables: datasize=%d paneltype=%d \
21057+ type=0x%02x pol=0x%02x freq=0x%04x minlevel=0x%02x \
21058+ i2caddr=0x%02x cmd=0x%02x \n",
21059+ 0,
21060+ panel_type,
21061+ lvdsblc->type,
21062+ lvdsblc->pol,
21063+ lvdsblc->freq,
21064+ lvdsblc->minbrightness,
21065+ lvdsblc->i2caddr,
21066+ lvdsblc->brightnesscmd);
21067+ }
21068+ break;
21069+ }
21070+ }
21071+
21072+ //get the Core Clock for calculating MAX PWM value
21073+ //check whether the MaxResEnableInt is
21074+
21075+ if(pci_root)
21076+ {
21077+ pci_write_config_dword(pci_root, 0xD0, 0xD0050300);
21078+ pci_read_config_dword(pci_root, 0xD4, &clock);
21079+ CoreClock = CoreClocks[clock & 0x07];
21080+ DRM_INFO("intel_lvds_init: the CoreClock is %d\n", CoreClock);
21081+
21082+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE);
21083+ pci_read_config_dword(pci_root, 0xD4, &sku_value);
21084+ sku_bMaxResEnableInt = (sku_value & PCI_PORT5_REG80_MAXRES_INT_EN)? true : false;
21085+ DRM_INFO("intel_lvds_init: sku_value is 0x%08x\n", sku_value);
21086+ DRM_INFO("intel_lvds_init: sku_bMaxResEnableInt is %d\n", sku_bMaxResEnableInt);
21087+ }
21088+
21089+
21090+
21091+blc_out:
21092
21093 /* Set up the DDC bus. */
21094 intel_output->ddc_bus = intel_i2c_create(dev, GPIOC, "LVDSDDC_C");
21095@@ -437,12 +930,14 @@
21096 * Attempt to get the fixed panel mode from DDC. Assume that the
21097 * preferred mode is the right one.
21098 */
21099+ mutex_lock(&dev->mode_config.mutex);
21100 intel_ddc_get_modes(intel_output);
21101+ mutex_unlock(&dev->mode_config.mutex);
21102
21103 list_for_each_entry(scan, &connector->probed_modes, head) {
21104 mutex_lock(&dev->mode_config.mutex);
21105 if (scan->type & DRM_MODE_TYPE_PREFERRED) {
21106- dev_priv->panel_fixed_mode =
21107+ dev_priv_common->panel_fixed_mode =
21108 drm_mode_duplicate(dev, scan);
21109 mutex_unlock(&dev->mode_config.mutex);
21110 goto out; /* FIXME: check for quirks */
21111@@ -450,21 +945,6 @@
21112 mutex_unlock(&dev->mode_config.mutex);
21113 }
21114
21115- /* Failed to get EDID, what about VBT? */
21116- if (dev_priv->vbt_mode) {
21117- mutex_lock(&dev->mode_config.mutex);
21118- dev_priv->panel_fixed_mode =
21119- drm_mode_duplicate(dev, dev_priv->vbt_mode);
21120- mutex_unlock(&dev->mode_config.mutex);
21121- if (dev_priv->panel_fixed_mode) {
21122- dev_priv->panel_fixed_mode->type |=
21123- DRM_MODE_TYPE_PREFERRED;
21124- drm_mode_probed_add(connector,
21125- dev_priv->panel_fixed_mode);
21126- goto out;
21127- }
21128- }
21129-
21130 /*
21131 * If we didn't get EDID, try checking if the panel is already turned
21132 * on. If so, assume that whatever is currently programmed is the
21133Index: linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c
21134===================================================================
21135--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_sdvo.c 2009-02-20 12:22:54.000000000 +0000
21136+++ linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c 2009-02-20 12:23:06.000000000 +0000
21137@@ -37,6 +37,9 @@
21138
21139 #undef SDVO_DEBUG
21140
21141+#define PCI_PORT5_REG80_FFUSE 0xD0058000
21142+#define PCI_PORT5_REG80_SDVO_DISABLE 0x0020
21143+
21144 struct intel_sdvo_priv {
21145 struct intel_i2c_chan *i2c_bus;
21146 int slaveaddr;
21147@@ -989,6 +992,21 @@
21148 int i;
21149 int encoder_type, output_id;
21150
21151+ if (IS_POULSBO(dev)) {
21152+ struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);
21153+ u32 sku_value = 0;
21154+ bool sku_bSDVOEnable = true;
21155+ if(pci_root) {
21156+ pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE);
21157+ pci_read_config_dword(pci_root, 0xD4, &sku_value);
21158+ sku_bSDVOEnable = (sku_value & PCI_PORT5_REG80_SDVO_DISABLE)?false : true;
21159+ DRM_INFO("intel_sdvo_init: sku_value is 0x%08x\n", sku_value);
21160+ DRM_INFO("intel_sdvo_init: sku_bSDVOEnable is %d\n", sku_bSDVOEnable);
21161+ if (sku_bSDVOEnable == false)
21162+ return false;
21163+ }
21164+ }
21165+
21166 intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL);
21167 if (!intel_output) {
21168 return false;
21169Index: linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h
21170===================================================================
21171--- /dev/null 1970-01-01 00:00:00.000000000 +0000
21172+++ linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h 2009-02-20 12:23:06.000000000 +0000
21173@@ -0,0 +1,181 @@
21174+#include "psb_drm.h"
21175+#include "psb_reg.h"
21176+#include "psb_schedule.h"
21177+#include "../i915/i915_common.h"
21178+
21179+#define DRM_DRIVER_PRIVATE_T struct drm_i915_common_private
21180+
21181+struct drm_psb_uopt {
21182+ int clock_gating;
21183+};
21184+
21185+struct drm_psb_private {
21186+ /* common is assumed to be the first item in this structure */
21187+ struct drm_i915_common_private common;
21188+
21189+ unsigned long chipset;
21190+ uint8_t psb_rev_id;
21191+
21192+ struct psb_xhw_buf resume_buf;
21193+ struct drm_psb_dev_info_arg dev_info;
21194+ struct drm_psb_uopt uopt;
21195+
21196+ struct psb_gtt *pg;
21197+
21198+ struct page *scratch_page;
21199+ struct page *comm_page;
21200+
21201+ volatile uint32_t *comm;
21202+ uint32_t comm_mmu_offset;
21203+ uint32_t mmu_2d_offset;
21204+ uint32_t sequence[PSB_NUM_ENGINES];
21205+ uint32_t last_sequence[PSB_NUM_ENGINES];
21206+ int idle[PSB_NUM_ENGINES];
21207+ uint32_t last_submitted_seq[PSB_NUM_ENGINES];
21208+ int engine_lockup_2d;
21209+
21210+ /** Protects user_irq_refcount and irq_mask_reg */
21211+ spinlock_t user_irq_lock;
21212+ u32 pipestat[2];
21213+
21214+ struct psb_mmu_driver *mmu;
21215+ struct psb_mmu_pd *pf_pd;
21216+
21217+ uint8_t *sgx_reg;
21218+ //uint8_t *vdc_reg;
21219+ uint8_t *msvdx_reg;
21220+
21221+ /*
21222+ * MSVDX
21223+ */
21224+ int msvdx_needs_reset;
21225+ int has_msvdx;
21226+ uint32_t gatt_free_offset;
21227+ atomic_t msvdx_mmu_invaldc;
21228+
21229+ /*
21230+ * Fencing / irq.
21231+ */
21232+
21233+ uint32_t sgx_irq_mask;
21234+ uint32_t sgx2_irq_mask;
21235+ uint32_t vdc_irq_mask;
21236+
21237+ spinlock_t irqmask_lock;
21238+ spinlock_t sequence_lock;
21239+ int fence0_irq_on;
21240+ int irq_enabled;
21241+ unsigned int irqen_count_2d;
21242+ wait_queue_head_t event_2d_queue;
21243+
21244+ wait_queue_head_t queue_2d;
21245+ atomic_t lock_2d;
21246+ atomic_t ta_wait_2d;
21247+ atomic_t ta_wait_2d_irq;
21248+ atomic_t waiters_2d;
21249+
21250+ uint32_t msvdx_current_sequence;
21251+ uint32_t msvdx_last_sequence;
21252+#define MSVDX_MAX_IDELTIME HZ*30
21253+ uint32_t msvdx_finished_sequence;
21254+ uint32_t msvdx_start_idle;
21255+ unsigned long msvdx_idle_start_jiffies;
21256+
21257+ int fence2_irq_on;
21258+
21259+ /*
21260+ * MSVDX Rendec Memory
21261+ */
21262+ struct drm_buffer_object *ccb0;
21263+ uint32_t base_addr0;
21264+ struct drm_buffer_object *ccb1;
21265+ uint32_t base_addr1;
21266+
21267+ /*
21268+ * Memory managers
21269+ */
21270+
21271+ int have_vram;
21272+ int have_tt;
21273+ int have_mem_mmu;
21274+ int have_mem_aper;
21275+ int have_mem_kernel;
21276+ int have_mem_pds;
21277+ int have_mem_rastgeom;
21278+ struct mutex temp_mem;
21279+
21280+ /*
21281+ * Relocation buffer mapping.
21282+ */
21283+
21284+ spinlock_t reloc_lock;
21285+ unsigned int rel_mapped_pages;
21286+ wait_queue_head_t rel_mapped_queue;
21287+
21288+ /*
21289+ * Register state
21290+ */
21291+ uint32_t saveCLOCKGATING;
21292+
21293+ /*
21294+ * USE code base register management.
21295+ */
21296+
21297+ struct drm_reg_manager use_manager;
21298+
21299+ /*
21300+ * Xhw
21301+ */
21302+
21303+ uint32_t *xhw;
21304+ struct drm_buffer_object *xhw_bo;
21305+ struct drm_bo_kmap_obj xhw_kmap;
21306+ struct list_head xhw_in;
21307+ spinlock_t xhw_lock;
21308+ atomic_t xhw_client;
21309+ struct drm_file *xhw_file;
21310+ wait_queue_head_t xhw_queue;
21311+ wait_queue_head_t xhw_caller_queue;
21312+ struct mutex xhw_mutex;
21313+ struct psb_xhw_buf *xhw_cur_buf;
21314+ int xhw_submit_ok;
21315+ int xhw_on;
21316+
21317+ /*
21318+ * Scheduling.
21319+ */
21320+
21321+ struct mutex reset_mutex;
21322+ struct mutex cmdbuf_mutex;
21323+ struct psb_scheduler scheduler;
21324+ struct psb_buflist_item *buffers;
21325+ uint32_t ta_mem_pages;
21326+ struct psb_ta_mem *ta_mem;
21327+ int force_ta_mem_load;
21328+
21329+ /*
21330+ * Watchdog
21331+ */
21332+
21333+ spinlock_t watchdog_lock;
21334+ struct timer_list watchdog_timer;
21335+ struct work_struct watchdog_wq;
21336+ struct work_struct msvdx_watchdog_wq;
21337+ int timer_available;
21338+
21339+ /*
21340+ * msvdx command queue
21341+ */
21342+ spinlock_t msvdx_lock;
21343+ struct mutex msvdx_mutex;
21344+ struct list_head msvdx_queue;
21345+ int msvdx_busy;
21346+
21347+};
21348+
21349+
21350+extern void intel_modeset_init(struct drm_device *dev);
21351+extern void intel_modeset_cleanup(struct drm_device *dev);
21352+
21353+extern void intel_crtc_mode_restore(struct drm_crtc *crtc);
21354+extern void intel_crtc_mode_save(struct drm_crtc *crtc);
21355Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c
21356===================================================================
21357--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_display.c 2009-02-20 12:22:54.000000000 +0000
21358+++ linux-2.6.28/drivers/gpu/drm/i915/intel_display.c 2009-02-20 12:23:06.000000000 +0000
21359@@ -342,60 +342,25 @@
21360 /* Wait for 20ms, i.e. one cycle at 50hz. */
21361 udelay(20000);
21362 }
21363+EXPORT_SYMBOL(intel_wait_for_vblank);
21364
21365 static void
21366 intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
21367 struct drm_framebuffer *old_fb)
21368 {
21369 struct drm_device *dev = crtc->dev;
21370- struct drm_i915_private *dev_priv = dev->dev_private;
21371 struct drm_i915_master_private *master_priv;
21372+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
21373 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
21374- struct intel_framebuffer *intel_fb;
21375- struct drm_i915_gem_object *obj_priv;
21376- struct drm_gem_object *obj;
21377 int pipe = intel_crtc->pipe;
21378 unsigned long Start, Offset;
21379 int dspbase = (pipe == 0 ? DSPAADDR : DSPBADDR);
21380 int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF);
21381 int dspstride = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE;
21382 int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR;
21383- u32 dspcntr, alignment;
21384-
21385- /* no fb bound */
21386- if (!crtc->fb) {
21387- DRM_DEBUG("No FB bound\n");
21388- return;
21389- }
21390-
21391- intel_fb = to_intel_framebuffer(crtc->fb);
21392- obj = intel_fb->obj;
21393- obj_priv = obj->driver_private;
21394-
21395- switch (obj_priv->tiling_mode) {
21396- case I915_TILING_NONE:
21397- alignment = 64 * 1024;
21398- break;
21399- case I915_TILING_X:
21400- if (IS_I9XX(dev))
21401- alignment = 1024 * 1024;
21402- else
21403- alignment = 512 * 1024;
21404- break;
21405- case I915_TILING_Y:
21406- /* FIXME: Is this true? */
21407- DRM_ERROR("Y tiled not allowed for scan out buffers\n");
21408- return;
21409- default:
21410- BUG();
21411- }
21412+ u32 dspcntr;
21413
21414- if (i915_gem_object_pin(intel_fb->obj, alignment))
21415- return;
21416-
21417- i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1);
21418-
21419- Start = obj_priv->gtt_offset;
21420+ Start = crtc->fb->offset;
21421 Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
21422
21423 I915_WRITE(dspstride, crtc->fb->pitch);
21424@@ -434,13 +399,6 @@
21425 I915_READ(dspbase);
21426 }
21427
21428- intel_wait_for_vblank(dev);
21429-
21430- if (old_fb) {
21431- intel_fb = to_intel_framebuffer(old_fb);
21432- i915_gem_object_unpin(intel_fb->obj);
21433- }
21434-
21435 if (!dev->primary->master)
21436 return;
21437
21438@@ -642,7 +600,7 @@
21439 return 400000;
21440 else if (IS_I915G(dev))
21441 return 333000;
21442- else if (IS_I945GM(dev) || IS_845G(dev))
21443+ else if (IS_I945GM(dev) || IS_POULSBO(dev) || IS_845G(dev))
21444 return 200000;
21445 else if (IS_I915GM(dev)) {
21446 u16 gcfgc = 0;
21447@@ -786,13 +744,15 @@
21448
21449 dpll = DPLL_VGA_MODE_DIS;
21450 if (IS_I9XX(dev)) {
21451- if (is_lvds)
21452+ if (is_lvds) {
21453 dpll |= DPLLB_MODE_LVDS;
21454- else
21455+ if (IS_POULSBO(dev))
21456+ dpll |= DPLL_DVO_HIGH_SPEED;
21457+ } else
21458 dpll |= DPLLB_MODE_DAC_SERIAL;
21459 if (is_sdvo) {
21460 dpll |= DPLL_DVO_HIGH_SPEED;
21461- if (IS_I945G(dev) || IS_I945GM(dev)) {
21462+ if (IS_I945G(dev) || IS_I945GM(dev) || IS_POULSBO(dev)) {
21463 int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
21464 dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES;
21465 }
21466@@ -959,7 +919,7 @@
21467 void intel_crtc_load_lut(struct drm_crtc *crtc)
21468 {
21469 struct drm_device *dev = crtc->dev;
21470- struct drm_i915_private *dev_priv = dev->dev_private;
21471+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
21472 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
21473 int palreg = (intel_crtc->pipe == 0) ? PALETTE_A : PALETTE_B;
21474 int i;
21475@@ -1021,7 +981,7 @@
21476 ret = -ENOMEM;
21477 goto fail;
21478 }
21479-
21480+#if 0
21481 /* we only need to pin inside GTT if cursor is non-phy */
21482 if (!dev_priv->cursor_needs_physical) {
21483 ret = i915_gem_object_pin(bo, PAGE_SIZE);
21484@@ -1038,7 +998,7 @@
21485 }
21486 addr = obj_priv->phys_obj->handle->busaddr;
21487 }
21488-
21489+#endif
21490 temp = 0;
21491 /* set the pipe for the cursor */
21492 temp |= (pipe << 28);
21493@@ -1049,6 +1009,7 @@
21494 I915_WRITE(base, addr);
21495
21496 if (intel_crtc->cursor_bo) {
21497+#if 0
21498 if (dev_priv->cursor_needs_physical) {
21499 if (intel_crtc->cursor_bo != bo)
21500 i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo);
21501@@ -1057,6 +1018,7 @@
21502 mutex_lock(&dev->struct_mutex);
21503 drm_gem_object_unreference(intel_crtc->cursor_bo);
21504 mutex_unlock(&dev->struct_mutex);
21505+#endif
21506 }
21507
21508 intel_crtc->cursor_addr = addr;
21509@@ -1456,7 +1418,8 @@
21510 {
21511 struct drm_connector *connector;
21512
21513- intel_crt_init(dev);
21514+ if (!IS_POULSBO(dev))
21515+ intel_crt_init(dev);
21516
21517 /* Set up integrated LVDS */
21518 if (IS_MOBILE(dev) && !IS_I830(dev))
21519@@ -1472,12 +1435,9 @@
21520 found = intel_sdvo_init(dev, SDVOC);
21521 if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
21522 intel_hdmi_init(dev, SDVOC);
21523- } else
21524+ } else
21525 intel_dvo_init(dev);
21526
21527- if (IS_I9XX(dev) && IS_MOBILE(dev))
21528- intel_tv_init(dev);
21529-
21530 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
21531 struct intel_output *intel_output = to_intel_output(connector);
21532 struct drm_encoder *encoder = &intel_output->enc;
21533@@ -1525,8 +1485,8 @@
21534 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
21535 struct drm_device *dev = fb->dev;
21536
21537- if (fb->fbdev)
21538- intelfb_remove(dev, fb);
21539+ //if (fb->fbdev)
21540+ // intelfb_remove(dev, fb);
21541
21542 drm_framebuffer_cleanup(fb);
21543 mutex_lock(&dev->struct_mutex);
21544@@ -1603,7 +1563,7 @@
21545
21546 static const struct drm_mode_config_funcs intel_mode_funcs = {
21547 .fb_create = intel_user_framebuffer_create,
21548- .fb_changed = intelfb_probe,
21549+// .fb_changed = intelfb_probe,
21550 };
21551
21552 void intel_modeset_init(struct drm_device *dev)
21553Index: linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c
21554===================================================================
21555--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_irq.c 2009-02-20 12:22:54.000000000 +0000
21556+++ linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c 2009-02-20 12:23:06.000000000 +0000
21557@@ -536,6 +536,7 @@
21558
21559 int i915_driver_irq_postinstall(struct drm_device *dev)
21560 {
21561+ struct drm_i915_common_private *dev_priv_common = dev->dev_private;
21562 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
21563
21564 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
diff --git a/meta-moblin/packages/linux/linux-moblin_2.6.27.bb b/meta-moblin/packages/linux/linux-moblin_2.6.27.bb
index 0033f651b3..82f7b435e6 100644
--- a/meta-moblin/packages/linux/linux-moblin_2.6.27.bb
+++ b/meta-moblin/packages/linux/linux-moblin_2.6.27.bb
@@ -1,6 +1,6 @@
1require linux-moblin.inc 1require linux-moblin.inc
2 2
3PR = "r7" 3PR = "r8"
4PE = "1" 4PE = "1"
5 5
6DEFAULT_PREFERENCE = "-1" 6DEFAULT_PREFERENCE = "-1"
diff --git a/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb b/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb
new file mode 100644
index 0000000000..bb807b3652
--- /dev/null
+++ b/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb
@@ -0,0 +1,24 @@
1require linux-moblin.inc
2
3PR = "r2"
4PE = "1"
5
6DEFAULT_PREFERENCE = "-1"
7DEFAULT_PREFERENCE_netbook = "1"
8DEFAULT_PREFERENCE_menlow = "1"
9
10SRC_URI = "${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2 \
11 ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.29-rc2.bz2;patch=1 \
12 file://0001-fastboot-retry-mounting-the-root-fs-if-we-can-t-fin.patch;patch=1 \
13 file://0002-fastboot-remove-wait-for-all-devices-before-mounti.patch;patch=1 \
14 file://0003-fastboot-remove-duplicate-unpack_to_rootfs.patch;patch=1 \
15 file://0004-superreadahead-patch.patch;patch=1 \
16 file://0005-fastboot-async-enable-default.patch;patch=1 \
17 file://0006-Revert-drm-i915-GEM-on-PAE-has-problems-disable.patch;patch=1 \
18 file://0007-acer-error-msg.patch;patch=1 \
19 file://defconfig-menlow \
20 file://defconfig-netbook"
21
22SRC_URI_append_menlow = " file://i915_split.patch;patch=1 file://psb-driver.patch;patch=1"
23
24S = "${WORKDIR}/linux-2.6.28"
diff --git a/meta-moblin/packages/moblin-menus/moblin-menus/configurefix.patch b/meta-moblin/packages/moblin-menus/moblin-menus/configurefix.patch
new file mode 100644
index 0000000000..288746aa66
--- /dev/null
+++ b/meta-moblin/packages/moblin-menus/moblin-menus/configurefix.patch
@@ -0,0 +1,13 @@
1Index: git/configure.in
2===================================================================
3--- git.orig/configure.in 2009-01-17 18:57:24.000000000 +0000
4+++ git/configure.in 2009-01-17 18:57:29.000000000 +0000
5@@ -11,8 +11,6 @@
6
7 AM_MAINTAINER_MODE
8
9-AM_DISABLE_STATIC
10-
11 changequote(,)dnl
12 if test "x$GCC" = "xyes"; then
13 case " $CFLAGS " in
diff --git a/meta-moblin/packages/moblin-menus/moblin-menus_git.bb b/meta-moblin/packages/moblin-menus/moblin-menus_git.bb
new file mode 100644
index 0000000000..ae60573649
--- /dev/null
+++ b/meta-moblin/packages/moblin-menus/moblin-menus_git.bb
@@ -0,0 +1,11 @@
1
2SRC_URI = "git://git.moblin.org/${PN}.git;protocol=git \
3 file://configurefix.patch;patch=1"
4PV = "0.0+git${SRCREV}"
5PR = "r1"
6
7S = "${WORKDIR}/git"
8
9FILES_${PN} += "${datadir}/desktop-directories/*"
10
11inherit autotools_stage
diff --git a/meta-moblin/packages/mojito/mojito_git.bb b/meta-moblin/packages/mojito/mojito_git.bb
new file mode 100644
index 0000000000..d8ac5c3fbe
--- /dev/null
+++ b/meta-moblin/packages/mojito/mojito_git.bb
@@ -0,0 +1,26 @@
1
2SRC_URI = "git://git.moblin.org/${PN}.git;protocol=git"
3PV = "0.0+git${SRCREV}"
4PR = "r1"
5
6DEPENDS = "libsoup-2.4 gconf-dbus librest glib-2.0 twitter-glib sqlite3"
7
8S = "${WORKDIR}/git"
9
10inherit autotools_stage
11
12FILES_${PN}-dbg += "${libdir}/mojito/sources/.debug/*"
13
14pkg_postinst_${PN} () {
15#!/bin/sh -e
16if [ "x$D" != "x" ]; then
17 exit 1
18fi
19
20. ${sysconfdir}/init.d/functions
21
22gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --direct --type string -s /apps/mojito/sources/flickr/user 34402200@N07
23gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.default --direct --type string -s /apps/mojito/sources/twitter/user ross@linux.intel.com
24gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --direct --type string -s /apps/mojito/sources/twitter/password password
25
26}
diff --git a/meta-moblin/packages/twitter-glib/twitter-glib_git.bb b/meta-moblin/packages/twitter-glib/twitter-glib_git.bb
new file mode 100644
index 0000000000..4364b2ef63
--- /dev/null
+++ b/meta-moblin/packages/twitter-glib/twitter-glib_git.bb
@@ -0,0 +1,14 @@
1HOMEPAGE = "http://live.gnome.org/TwitterGlib"
2SRC_URI = "git://github.com/ebassi/${PN}.git;protocol=git"
3PV = "0.0+git${SRCREV}"
4PR = "r0"
5
6DEPENDS = "glib-2.0 gtk+ json-glib"
7
8S = "${WORKDIR}/git"
9
10inherit autotools_stage
11
12do_configure_prepend () {
13 echo "EXTRA_DIST=" > ${S}/gtk-doc.make
14} \ No newline at end of file