summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--freed-ora/current/f19/config-armv7-generic2
-rw-r--r--freed-ora/current/f19/config-armv7-lpae3
-rw-r--r--freed-ora/current/f19/drm-hotspot-cursor-backport.patch164
-rw-r--r--freed-ora/current/f19/drm-qxl-3.10-rc7-diff.patch593
-rw-r--r--freed-ora/current/f19/drm-qxl-access-fix.patch30
-rw-r--r--freed-ora/current/f19/drm-qxl-backport-fixes.patch154
-rw-r--r--freed-ora/current/f19/drm-qxl-post-3.10-feature-fixes.patch517
-rw-r--r--freed-ora/current/f19/iwl3945-better-skb-management-in-rx-path.patch97
-rw-r--r--freed-ora/current/f19/iwl4965-better-skb-management-in-rx-path.patch65
-rw-r--r--freed-ora/current/f19/kernel.spec50
-rw-r--r--freed-ora/current/f19/patch-3.9-gnu-3.9.8-gnu.xz.sign7
-rw-r--r--freed-ora/current/f19/patch-3.9-gnu-3.9.9-gnu.xz.sign7
-rw-r--r--freed-ora/current/f19/rt2800-fix-RT5390-RT3290-TX-power-settings-regression.patch71
-rw-r--r--freed-ora/current/f19/sources2
14 files changed, 1518 insertions, 244 deletions
diff --git a/freed-ora/current/f19/config-armv7-generic b/freed-ora/current/f19/config-armv7-generic
index 58c581629..d1e984fce 100644
--- a/freed-ora/current/f19/config-armv7-generic
+++ b/freed-ora/current/f19/config-armv7-generic
@@ -70,7 +70,7 @@ CONFIG_ARM_ERRATA_775420=y
CONFIG_PL310_ERRATA_753970=y
CONFIG_PL310_ERRATA_769419=y
# Cortex-A15
-CONFIG_ARM_ERRATA_798181=y
+# CONFIG_ARM_ERRATA_798181 is not set
# generic that deviates from or should be merged into config-generic
CONFIG_SMP=y
diff --git a/freed-ora/current/f19/config-armv7-lpae b/freed-ora/current/f19/config-armv7-lpae
index 7e34dedb9..57d7d860e 100644
--- a/freed-ora/current/f19/config-armv7-lpae
+++ b/freed-ora/current/f19/config-armv7-lpae
@@ -11,6 +11,9 @@ CONFIG_VIRTIO_CONSOLE=m
CONFIG_ARM_VIRT_EXT=y
CONFIG_VIRTUALIZATION=y
+# Cortex-A15
+CONFIG_ARM_ERRATA_798181=y
+
CONFIG_KVM=y
CONFIG_KVM_ARM_HOST=y
CONFIG_KVM_ARM_MAX_VCPUS=8
diff --git a/freed-ora/current/f19/drm-hotspot-cursor-backport.patch b/freed-ora/current/f19/drm-hotspot-cursor-backport.patch
new file mode 100644
index 000000000..f3dc82042
--- /dev/null
+++ b/freed-ora/current/f19/drm-hotspot-cursor-backport.patch
@@ -0,0 +1,164 @@
+From f2a2b3496b6024a5df546f0aedd60705b896a464 Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied@redhat.com>
+Date: Thu, 20 Jun 2013 11:48:52 +1000
+Subject: [PATCH 2/5] drm: add hotspot support for cursors.
+
+So it looks like for virtual hw cursors on QXL we need to inform
+the "hw" device what the cursor hotspot parameters are. This
+makes sense if you think the host has to draw the cursor and interpret
+clicks from it. However the current modesetting interface doesn't support
+passing the hotspot information from userspace.
+
+This implements a new cursor ioctl, that takes the hotspot info as well,
+userspace can try calling the new interface and if it gets -ENOSYS it means
+its on an older kernel and can just fallback.
+
+Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+---
+ drivers/gpu/drm/drm_crtc.c | 35 +++++++++++++++++++++++++++++------
+ drivers/gpu/drm/drm_drv.c | 1 +
+ include/drm/drm_crtc.h | 5 +++++
+ include/uapi/drm/drm.h | 1 +
+ include/uapi/drm/drm_mode.h | 13 +++++++++++++
+ 5 files changed, 49 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
+index dd64a06..21e71a8 100644
+--- a/drivers/gpu/drm/drm_crtc.c
++++ b/drivers/gpu/drm/drm_crtc.c
+@@ -2202,10 +2202,10 @@ out:
+ return ret;
+ }
+
+-int drm_mode_cursor_ioctl(struct drm_device *dev,
+- void *data, struct drm_file *file_priv)
++static int drm_mode_cursor_common(struct drm_device *dev,
++ struct drm_mode_cursor2 *req,
++ struct drm_file *file_priv)
+ {
+- struct drm_mode_cursor *req = data;
+ struct drm_mode_object *obj;
+ struct drm_crtc *crtc;
+ int ret = 0;
+@@ -2225,13 +2225,17 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
+
+ mutex_lock(&crtc->mutex);
+ if (req->flags & DRM_MODE_CURSOR_BO) {
+- if (!crtc->funcs->cursor_set) {
++ if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) {
+ ret = -ENXIO;
+ goto out;
+ }
+ /* Turns off the cursor if handle is 0 */
+- ret = crtc->funcs->cursor_set(crtc, file_priv, req->handle,
+- req->width, req->height);
++ if (crtc->funcs->cursor_set2)
++ ret = crtc->funcs->cursor_set2(crtc, file_priv, req->handle,
++ req->width, req->height, req->hot_x, req->hot_y);
++ else
++ ret = crtc->funcs->cursor_set(crtc, file_priv, req->handle,
++ req->width, req->height);
+ }
+
+ if (req->flags & DRM_MODE_CURSOR_MOVE) {
+@@ -2246,6 +2250,25 @@ out:
+ mutex_unlock(&crtc->mutex);
+
+ return ret;
++
++}
++int drm_mode_cursor_ioctl(struct drm_device *dev,
++ void *data, struct drm_file *file_priv)
++{
++ struct drm_mode_cursor *req = data;
++ struct drm_mode_cursor2 new_req;
++
++ memcpy(&new_req, req, sizeof(struct drm_mode_cursor));
++ new_req.hot_x = new_req.hot_y = 0;
++
++ return drm_mode_cursor_common(dev, &new_req, file_priv);
++}
++
++int drm_mode_cursor2_ioctl(struct drm_device *dev,
++ void *data, struct drm_file *file_priv)
++{
++ struct drm_mode_cursor2 *req = data;
++ return drm_mode_cursor_common(dev, req, file_priv);
+ }
+
+ /* Original addfb only supported RGB formats, so figure out which one */
+diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
+index 25f91cd..cb4470b 100644
+--- a/drivers/gpu/drm/drm_drv.c
++++ b/drivers/gpu/drm/drm_drv.c
+@@ -166,6 +166,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
+ DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+ DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+ DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
++ DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+ };
+
+ #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
+diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
+index e3e0d65..eba931b 100644
+--- a/include/drm/drm_crtc.h
++++ b/include/drm/drm_crtc.h
+@@ -339,6 +339,9 @@ struct drm_crtc_funcs {
+ /* cursor controls */
+ int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
+ uint32_t handle, uint32_t width, uint32_t height);
++ int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
++ uint32_t handle, uint32_t width, uint32_t height,
++ int32_t hot_x, int32_t hot_y);
+ int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
+
+ /* Set gamma on the CRTC */
+@@ -1025,6 +1028,8 @@ extern int drm_mode_setplane(struct drm_device *dev,
+ void *data, struct drm_file *file_priv);
+ extern int drm_mode_cursor_ioctl(struct drm_device *dev,
+ void *data, struct drm_file *file_priv);
++extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
++ void *data, struct drm_file *file_priv);
+ extern int drm_mode_addfb(struct drm_device *dev,
+ void *data, struct drm_file *file_priv);
+ extern int drm_mode_addfb2(struct drm_device *dev,
+diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
+index 8d1e2bb..5182a2d 100644
+--- a/include/uapi/drm/drm.h
++++ b/include/uapi/drm/drm.h
+@@ -732,6 +732,7 @@ struct drm_prime_handle {
+ #define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
+ #define DRM_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
+ #define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
++#define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2)
+
+ /**
+ * Device specific ioctls should only be in their respective headers
+diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
+index 3d6301b..ecde539 100644
+--- a/include/uapi/drm/drm_mode.h
++++ b/include/uapi/drm/drm_mode.h
+@@ -388,6 +388,19 @@ struct drm_mode_cursor {
+ __u32 handle;
+ };
+
++struct drm_mode_cursor2 {
++ __u32 flags;
++ __u32 crtc_id;
++ __s32 x;
++ __s32 y;
++ __u32 width;
++ __u32 height;
++ /* driver specific handle */
++ __u32 handle;
++ __s32 hot_x;
++ __s32 hot_y;
++};
++
+ struct drm_mode_crtc_lut {
+ __u32 crtc_id;
+ __u32 gamma_size;
+--
+1.8.3.1
+
diff --git a/freed-ora/current/f19/drm-qxl-3.10-rc7-diff.patch b/freed-ora/current/f19/drm-qxl-3.10-rc7-diff.patch
new file mode 100644
index 000000000..3aa53f60d
--- /dev/null
+++ b/freed-ora/current/f19/drm-qxl-3.10-rc7-diff.patch
@@ -0,0 +1,593 @@
+From be71369a5b4297776fb9988e6274595136294588 Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied@redhat.com>
+Date: Tue, 16 Apr 2013 13:24:25 +1000
+Subject: [PATCH 4/5] drm/qxl 3.10-rc7 diff
+
+drm/qxl: make lots of things static.
+drm/qxl: fix smatch warnings
+drm/qxl: fix build with debugfs turned off.
+drivers, drm: fix qxl build error when debugfs is disabled
+drm/qxl: fix ioport interactions for kernel submitted commands.
+qxl: drop unused variable.
+drm/qxl: drop active_user_framebuffer as its unneeded
+qxl: fix bug with object eviction and update area
+qxl: fix Kconfig deps - select FB_DEFERRED_IO
+drm/qxl: fix build warnings on 32-bit
+
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+---
+ drivers/gpu/drm/qxl/Kconfig | 1 +
+ drivers/gpu/drm/qxl/qxl_cmd.c | 52 +++++++++++++++++----------------------
+ drivers/gpu/drm/qxl/qxl_debugfs.c | 6 +++++
+ drivers/gpu/drm/qxl/qxl_display.c | 36 +++++++++++----------------
+ drivers/gpu/drm/qxl/qxl_drv.c | 2 +-
+ drivers/gpu/drm/qxl/qxl_drv.h | 7 ------
+ drivers/gpu/drm/qxl/qxl_fb.c | 2 +-
+ drivers/gpu/drm/qxl/qxl_gem.c | 29 ----------------------
+ drivers/gpu/drm/qxl/qxl_ioctl.c | 29 +++++++++++-----------
+ drivers/gpu/drm/qxl/qxl_kms.c | 11 +++++----
+ drivers/gpu/drm/qxl/qxl_object.c | 6 ++---
+ drivers/gpu/drm/qxl/qxl_release.c | 4 +--
+ drivers/gpu/drm/qxl/qxl_ttm.c | 10 +++++---
+ 13 files changed, 78 insertions(+), 117 deletions(-)
+
+diff --git a/drivers/gpu/drm/qxl/Kconfig b/drivers/gpu/drm/qxl/Kconfig
+index 2f1a57e..d6c1279 100644
+--- a/drivers/gpu/drm/qxl/Kconfig
++++ b/drivers/gpu/drm/qxl/Kconfig
+@@ -4,6 +4,7 @@ config DRM_QXL
+ select FB_SYS_FILLRECT
+ select FB_SYS_COPYAREA
+ select FB_SYS_IMAGEBLIT
++ select FB_DEFERRED_IO
+ select DRM_KMS_HELPER
+ select DRM_TTM
+ help
+diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
+index 804b411..02befd9 100644
+--- a/drivers/gpu/drm/qxl/qxl_cmd.c
++++ b/drivers/gpu/drm/qxl/qxl_cmd.c
+@@ -144,8 +144,8 @@ int qxl_ring_push(struct qxl_ring *ring,
+ return 0;
+ }
+
+-bool qxl_ring_pop(struct qxl_ring *ring,
+- void *element)
++static bool qxl_ring_pop(struct qxl_ring *ring,
++ void *element)
+ {
+ volatile struct qxl_ring_header *header = &(ring->ring->header);
+ volatile uint8_t *ring_elt;
+@@ -169,23 +169,6 @@ bool qxl_ring_pop(struct qxl_ring *ring,
+ return true;
+ }
+
+-void qxl_ring_wait_idle(struct qxl_ring *ring)
+-{
+- struct qxl_ring_header *header = &(ring->ring->header);
+- unsigned long flags;
+-
+- spin_lock_irqsave(&ring->lock, flags);
+- if (ring->ring->header.cons < ring->ring->header.prod) {
+- header->notify_on_cons = header->prod;
+- mb();
+- spin_unlock_irqrestore(&ring->lock, flags);
+- wait_event_interruptible(*ring->push_event,
+- qxl_check_idle(ring));
+- spin_lock_irqsave(&ring->lock, flags);
+- }
+- spin_unlock_irqrestore(&ring->lock, flags);
+-}
+-
+ int
+ qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release,
+ uint32_t type, bool interruptible)
+@@ -294,7 +277,7 @@ out_unref:
+ return 0;
+ }
+
+-static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port)
++static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, bool intr)
+ {
+ int irq_num;
+ long addr = qdev->io_base + port;
+@@ -302,20 +285,29 @@ static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port)
+
+ mutex_lock(&qdev->async_io_mutex);
+ irq_num = atomic_read(&qdev->irq_received_io_cmd);
+-
+-
+ if (qdev->last_sent_io_cmd > irq_num) {
+- ret = wait_event_interruptible(qdev->io_cmd_event,
+- atomic_read(&qdev->irq_received_io_cmd) > irq_num);
+- if (ret)
++ if (intr)
++ ret = wait_event_interruptible_timeout(qdev->io_cmd_event,
++ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
++ else
++ ret = wait_event_timeout(qdev->io_cmd_event,
++ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
++ /* 0 is timeout, just bail the "hw" has gone away */
++ if (ret <= 0)
+ goto out;
+ irq_num = atomic_read(&qdev->irq_received_io_cmd);
+ }
+ outb(val, addr);
+ qdev->last_sent_io_cmd = irq_num + 1;
+- ret = wait_event_interruptible(qdev->io_cmd_event,
+- atomic_read(&qdev->irq_received_io_cmd) > irq_num);
++ if (intr)
++ ret = wait_event_interruptible_timeout(qdev->io_cmd_event,
++ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
++ else
++ ret = wait_event_timeout(qdev->io_cmd_event,
++ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
+ out:
++ if (ret > 0)
++ ret = 0;
+ mutex_unlock(&qdev->async_io_mutex);
+ return ret;
+ }
+@@ -325,7 +317,7 @@ static void wait_for_io_cmd(struct qxl_device *qdev, uint8_t val, long port)
+ int ret;
+
+ restart:
+- ret = wait_for_io_cmd_user(qdev, val, port);
++ ret = wait_for_io_cmd_user(qdev, val, port, false);
+ if (ret == -ERESTARTSYS)
+ goto restart;
+ }
+@@ -357,7 +349,7 @@ int qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf,
+ mutex_lock(&qdev->update_area_mutex);
+ qdev->ram_header->update_area = *area;
+ qdev->ram_header->update_surface = surface_id;
+- ret = wait_for_io_cmd_user(qdev, 0, QXL_IO_UPDATE_AREA_ASYNC);
++ ret = wait_for_io_cmd_user(qdev, 0, QXL_IO_UPDATE_AREA_ASYNC, true);
+ mutex_unlock(&qdev->update_area_mutex);
+ return ret;
+ }
+@@ -609,7 +601,7 @@ retry:
+ return ret;
+ }
+
+-void qxl_surface_evict_locked(struct qxl_device *qdev, struct qxl_bo *surf, bool do_update_area)
++static void qxl_surface_evict_locked(struct qxl_device *qdev, struct qxl_bo *surf, bool do_update_area)
+ {
+ /* no need to update area if we are just freeing the surface normally */
+ if (do_update_area)
+diff --git a/drivers/gpu/drm/qxl/qxl_debugfs.c b/drivers/gpu/drm/qxl/qxl_debugfs.c
+index c630152..c3c2bbd 100644
+--- a/drivers/gpu/drm/qxl/qxl_debugfs.c
++++ b/drivers/gpu/drm/qxl/qxl_debugfs.c
+@@ -35,6 +35,7 @@
+ #include "qxl_object.h"
+
+
++#if defined(CONFIG_DEBUG_FS)
+ static int
+ qxl_debugfs_irq_received(struct seq_file *m, void *data)
+ {
+@@ -69,20 +70,25 @@ static struct drm_info_list qxl_debugfs_list[] = {
+ { "qxl_buffers", qxl_debugfs_buffers_info, 0, NULL },
+ };
+ #define QXL_DEBUGFS_ENTRIES ARRAY_SIZE(qxl_debugfs_list)
++#endif
+
+ int
+ qxl_debugfs_init(struct drm_minor *minor)
+ {
++#if defined(CONFIG_DEBUG_FS)
+ drm_debugfs_create_files(qxl_debugfs_list, QXL_DEBUGFS_ENTRIES,
+ minor->debugfs_root, minor);
++#endif
+ return 0;
+ }
+
+ void
+ qxl_debugfs_takedown(struct drm_minor *minor)
+ {
++#if defined(CONFIG_DEBUG_FS)
+ drm_debugfs_remove_files(qxl_debugfs_list, QXL_DEBUGFS_ENTRIES,
+ minor);
++#endif
+ }
+
+ int qxl_debugfs_add_files(struct qxl_device *qdev,
+diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
+index c80ddfe..823d29e 100644
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -84,6 +84,7 @@ void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)
+ if (qdev->client_monitors_config &&
+ count > qdev->client_monitors_config->count) {
+ kfree(qdev->client_monitors_config);
++ qdev->client_monitors_config = NULL;
+ }
+ if (!qdev->client_monitors_config) {
+ qdev->client_monitors_config = kzalloc(
+@@ -413,11 +414,11 @@ static void qxl_user_framebuffer_destroy(struct drm_framebuffer *fb)
+ kfree(qxl_fb);
+ }
+
+-int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
+- struct drm_file *file_priv,
+- unsigned flags, unsigned color,
+- struct drm_clip_rect *clips,
+- unsigned num_clips)
++static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
++ struct drm_file *file_priv,
++ unsigned flags, unsigned color,
++ struct drm_clip_rect *clips,
++ unsigned num_clips)
+ {
+ /* TODO: vmwgfx where this was cribbed from had locking. Why? */
+ struct qxl_framebuffer *qxl_fb = to_qxl_framebuffer(fb);
+@@ -427,10 +428,10 @@ int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
+ int inc = 1;
+
+ qobj = gem_to_qxl_bo(qxl_fb->obj);
+- if (qxl_fb != qdev->active_user_framebuffer) {
+- DRM_INFO("%s: qxl_fb 0x%p != qdev->active_user_framebuffer 0x%p\n",
+- __func__, qxl_fb, qdev->active_user_framebuffer);
+- }
++ /* if we aren't primary surface ignore this */
++ if (!qobj->is_primary)
++ return 0;
++
+ if (!num_clips) {
+ num_clips = 1;
+ clips = &norect;
+@@ -603,7 +604,6 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
+ mode->hdisplay,
+ mode->vdisplay);
+ }
+- qdev->mode_set = true;
+ return 0;
+ }
+
+@@ -619,7 +619,7 @@ static void qxl_crtc_commit(struct drm_crtc *crtc)
+ DRM_DEBUG("\n");
+ }
+
+-void qxl_crtc_load_lut(struct drm_crtc *crtc)
++static void qxl_crtc_load_lut(struct drm_crtc *crtc)
+ {
+ DRM_DEBUG("\n");
+ }
+@@ -633,7 +633,7 @@ static const struct drm_crtc_helper_funcs qxl_crtc_helper_funcs = {
+ .load_lut = qxl_crtc_load_lut,
+ };
+
+-int qdev_crtc_init(struct drm_device *dev, int num_crtc)
++static int qdev_crtc_init(struct drm_device *dev, int num_crtc)
+ {
+ struct qxl_crtc *qxl_crtc;
+
+@@ -764,7 +764,7 @@ static int qxl_conn_mode_valid(struct drm_connector *connector,
+ return MODE_OK;
+ }
+
+-struct drm_encoder *qxl_best_encoder(struct drm_connector *connector)
++static struct drm_encoder *qxl_best_encoder(struct drm_connector *connector)
+ {
+ struct qxl_output *qxl_output =
+ drm_connector_to_qxl_output(connector);
+@@ -855,7 +855,7 @@ static const struct drm_encoder_funcs qxl_enc_funcs = {
+ .destroy = qxl_enc_destroy,
+ };
+
+-int qdev_output_init(struct drm_device *dev, int num_output)
++static int qdev_output_init(struct drm_device *dev, int num_output)
+ {
+ struct qxl_output *qxl_output;
+ struct drm_connector *connector;
+@@ -892,7 +892,6 @@ qxl_user_framebuffer_create(struct drm_device *dev,
+ {
+ struct drm_gem_object *obj;
+ struct qxl_framebuffer *qxl_fb;
+- struct qxl_device *qdev = dev->dev_private;
+ int ret;
+
+ obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
+@@ -908,13 +907,6 @@ qxl_user_framebuffer_create(struct drm_device *dev,
+ return NULL;
+ }
+
+- if (qdev->active_user_framebuffer) {
+- DRM_INFO("%s: active_user_framebuffer %p -> %p\n",
+- __func__,
+- qdev->active_user_framebuffer, qxl_fb);
+- }
+- qdev->active_user_framebuffer = qxl_fb;
+-
+ return &qxl_fb->base;
+ }
+
+diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
+index d337da0..aa291d8 100644
+--- a/drivers/gpu/drm/qxl/qxl_drv.c
++++ b/drivers/gpu/drm/qxl/qxl_drv.c
+@@ -46,7 +46,7 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
+ };
+ MODULE_DEVICE_TABLE(pci, pciidlist);
+
+-int qxl_modeset = -1;
++static int qxl_modeset = -1;
+
+ MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
+ module_param_named(modeset, qxl_modeset, int, 0400);
+diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
+index 52b582c..43d06ab 100644
+--- a/drivers/gpu/drm/qxl/qxl_drv.h
++++ b/drivers/gpu/drm/qxl/qxl_drv.h
+@@ -255,12 +255,6 @@ struct qxl_device {
+ struct qxl_gem gem;
+ struct qxl_mode_info mode_info;
+
+- /*
+- * last created framebuffer with fb_create
+- * only used by debugfs dumbppm
+- */
+- struct qxl_framebuffer *active_user_framebuffer;
+-
+ struct fb_info *fbdev_info;
+ struct qxl_framebuffer *fbdev_qfb;
+ void *ram_physical;
+@@ -270,7 +264,6 @@ struct qxl_device {
+ struct qxl_ring *cursor_ring;
+
+ struct qxl_ram_header *ram_header;
+- bool mode_set;
+
+ bool primary_created;
+
+diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
+index 232b52b..b3c5127 100644
+--- a/drivers/gpu/drm/qxl/qxl_fb.c
++++ b/drivers/gpu/drm/qxl/qxl_fb.c
+@@ -159,7 +159,7 @@ static void qxl_deferred_io(struct fb_info *info,
+ };
+
+
+-struct fb_deferred_io qxl_defio = {
++static struct fb_deferred_io qxl_defio = {
+ .delay = QXL_DIRTY_DELAY,
+ .deferred_io = qxl_deferred_io,
+ };
+diff --git a/drivers/gpu/drm/qxl/qxl_gem.c b/drivers/gpu/drm/qxl/qxl_gem.c
+index adc1ee2..a235693 100644
+--- a/drivers/gpu/drm/qxl/qxl_gem.c
++++ b/drivers/gpu/drm/qxl/qxl_gem.c
+@@ -127,35 +127,6 @@ void qxl_gem_object_unpin(struct drm_gem_object *obj)
+ }
+ }
+
+-int qxl_gem_set_domain(struct drm_gem_object *gobj,
+- uint32_t rdomain, uint32_t wdomain)
+-{
+- struct qxl_bo *qobj;
+- uint32_t domain;
+- int r;
+-
+- /* FIXME: reeimplement */
+- qobj = gobj->driver_private;
+- /* work out where to validate the buffer to */
+- domain = wdomain;
+- if (!domain)
+- domain = rdomain;
+- if (!domain) {
+- /* Do nothings */
+- pr_warn("Set domain withou domain !\n");
+- return 0;
+- }
+- if (domain == QXL_GEM_DOMAIN_CPU) {
+- /* Asking for cpu access wait for object idle */
+- r = qxl_bo_wait(qobj, NULL, false);
+- if (r) {
+- pr_err("Failed to wait for object !\n");
+- return r;
+- }
+- }
+- return 0;
+-}
+-
+ int qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv)
+ {
+ return 0;
+diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
+index 83ca4f7..a4b71b2 100644
+--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
++++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
+@@ -30,8 +30,8 @@
+ * TODO: allocating a new gem(in qxl_bo) for each request.
+ * This is wasteful since bo's are page aligned.
+ */
+-int qxl_alloc_ioctl(struct drm_device *dev, void *data,
+- struct drm_file *file_priv)
++static int qxl_alloc_ioctl(struct drm_device *dev, void *data,
++ struct drm_file *file_priv)
+ {
+ struct qxl_device *qdev = dev->dev_private;
+ struct drm_qxl_alloc *qxl_alloc = data;
+@@ -58,8 +58,8 @@ int qxl_alloc_ioctl(struct drm_device *dev, void *data,
+ return 0;
+ }
+
+-int qxl_map_ioctl(struct drm_device *dev, void *data,
+- struct drm_file *file_priv)
++static int qxl_map_ioctl(struct drm_device *dev, void *data,
++ struct drm_file *file_priv)
+ {
+ struct qxl_device *qdev = dev->dev_private;
+ struct drm_qxl_map *qxl_map = data;
+@@ -101,9 +101,9 @@ apply_surf_reloc(struct qxl_device *qdev, struct qxl_bo *dst, uint64_t dst_off,
+ }
+
+ /* return holding the reference to this object */
+-struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev,
+- struct drm_file *file_priv, uint64_t handle,
+- struct qxl_reloc_list *reloc_list)
++static struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev,
++ struct drm_file *file_priv, uint64_t handle,
++ struct qxl_reloc_list *reloc_list)
+ {
+ struct drm_gem_object *gobj;
+ struct qxl_bo *qobj;
+@@ -129,8 +129,8 @@ struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev,
+ * However, the command as passed from user space must *not* contain the initial
+ * QXLReleaseInfo struct (first XXX bytes)
+ */
+-int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
+- struct drm_file *file_priv)
++static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
++ struct drm_file *file_priv)
+ {
+ struct qxl_device *qdev = dev->dev_private;
+ struct drm_qxl_execbuffer *execbuffer = data;
+@@ -151,7 +151,7 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
+ struct qxl_bo *cmd_bo;
+ int release_type;
+ struct drm_qxl_command *commands =
+- (struct drm_qxl_command *)execbuffer->commands;
++ (struct drm_qxl_command *)(uintptr_t)execbuffer->commands;
+
+ if (DRM_COPY_FROM_USER(&user_cmd, &commands[cmd_num],
+ sizeof(user_cmd)))
+@@ -193,7 +193,7 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
+
+ for (i = 0 ; i < user_cmd.relocs_num; ++i) {
+ if (DRM_COPY_FROM_USER(&reloc,
+- &((struct drm_qxl_reloc *)user_cmd.relocs)[i],
++ &((struct drm_qxl_reloc *)(uintptr_t)user_cmd.relocs)[i],
+ sizeof(reloc))) {
+ qxl_bo_list_unreserve(&reloc_list, true);
+ qxl_release_unreserve(qdev, release);
+@@ -266,8 +266,8 @@ int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
+ return 0;
+ }
+
+-int qxl_update_area_ioctl(struct drm_device *dev, void *data,
+- struct drm_file *file)
++static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
++ struct drm_file *file)
+ {
+ struct qxl_device *qdev = dev->dev_private;
+ struct drm_qxl_update_area *update_area = data;
+@@ -294,6 +294,7 @@ int qxl_update_area_ioctl(struct drm_device *dev, void *data,
+ goto out;
+
+ if (!qobj->pin_count) {
++ qxl_ttm_placement_from_domain(qobj, qobj->type);
+ ret = ttm_bo_validate(&qobj->tbo, &qobj->placement,
+ true, false);
+ if (unlikely(ret))
+@@ -347,7 +348,7 @@ static int qxl_clientcap_ioctl(struct drm_device *dev, void *data,
+ if (qdev->pdev->revision < 4)
+ return -ENOSYS;
+
+- if (byte > 58)
++ if (byte >= 58)
+ return -ENOSYS;
+
+ if (qdev->rom->client_capabilities[byte] & (1 << idx))
+diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c
+index 036e0de..e27ce2a 100644
+--- a/drivers/gpu/drm/qxl/qxl_kms.c
++++ b/drivers/gpu/drm/qxl/qxl_kms.c
+@@ -128,12 +128,13 @@ int qxl_device_init(struct qxl_device *qdev,
+
+ qdev->vram_mapping = io_mapping_create_wc(qdev->vram_base, pci_resource_len(pdev, 0));
+ qdev->surface_mapping = io_mapping_create_wc(qdev->surfaceram_base, qdev->surfaceram_size);
+- DRM_DEBUG_KMS("qxl: vram %p-%p(%dM %dk), surface %p-%p(%dM %dk)\n",
+- (void *)qdev->vram_base, (void *)pci_resource_end(pdev, 0),
++ DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk)\n",
++ (unsigned long long)qdev->vram_base,
++ (unsigned long long)pci_resource_end(pdev, 0),
+ (int)pci_resource_len(pdev, 0) / 1024 / 1024,
+ (int)pci_resource_len(pdev, 0) / 1024,
+- (void *)qdev->surfaceram_base,
+- (void *)pci_resource_end(pdev, 1),
++ (unsigned long long)qdev->surfaceram_base,
++ (unsigned long long)pci_resource_end(pdev, 1),
+ (int)qdev->surfaceram_size / 1024 / 1024,
+ (int)qdev->surfaceram_size / 1024);
+
+@@ -230,7 +231,7 @@ int qxl_device_init(struct qxl_device *qdev,
+ return 0;
+ }
+
+-void qxl_device_fini(struct qxl_device *qdev)
++static void qxl_device_fini(struct qxl_device *qdev)
+ {
+ if (qdev->current_release_bo[0])
+ qxl_bo_unref(&qdev->current_release_bo[0]);
+diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
+index 51efb94..d9b12e7 100644
+--- a/drivers/gpu/drm/qxl/qxl_object.c
++++ b/drivers/gpu/drm/qxl/qxl_object.c
+@@ -59,11 +59,11 @@ void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain)
+ qbo->placement.lpfn = 0;
+ qbo->placement.placement = qbo->placements;
+ qbo->placement.busy_placement = qbo->placements;
+- if (domain & QXL_GEM_DOMAIN_VRAM)
++ if (domain == QXL_GEM_DOMAIN_VRAM)
+ qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM;
+- if (domain & QXL_GEM_DOMAIN_SURFACE)
++ if (domain == QXL_GEM_DOMAIN_SURFACE)
+ qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0;
+- if (domain & QXL_GEM_DOMAIN_CPU)
++ if (domain == QXL_GEM_DOMAIN_CPU)
+ qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ if (!c)
+ qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
+index 1600781..c4267c7 100644
+--- a/drivers/gpu/drm/qxl/qxl_release.c
++++ b/drivers/gpu/drm/qxl/qxl_release.c
+@@ -117,8 +117,8 @@ qxl_release_add_res(struct qxl_device *qdev, struct qxl_release *release,
+ release->bos[release->bo_count++] = qxl_bo_ref(bo);
+ }
+
+-int qxl_release_bo_alloc(struct qxl_device *qdev,
+- struct qxl_bo **bo)
++static int qxl_release_bo_alloc(struct qxl_device *qdev,
++ struct qxl_bo **bo)
+ {
+ int ret;
+ ret = qxl_bo_create(qdev, PAGE_SIZE, false, QXL_GEM_DOMAIN_VRAM, NULL,
+diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
+index aa9fb9a..489cb8c 100644
+--- a/drivers/gpu/drm/qxl/qxl_ttm.c
++++ b/drivers/gpu/drm/qxl/qxl_ttm.c
+@@ -315,9 +315,9 @@ static void qxl_ttm_tt_unpopulate(struct ttm_tt *ttm)
+ ttm_pool_unpopulate(ttm);
+ }
+
+-struct ttm_tt *qxl_ttm_tt_create(struct ttm_bo_device *bdev,
+- unsigned long size, uint32_t page_flags,
+- struct page *dummy_read_page)
++static struct ttm_tt *qxl_ttm_tt_create(struct ttm_bo_device *bdev,
++ unsigned long size, uint32_t page_flags,
++ struct page *dummy_read_page)
+ {
+ struct qxl_device *qdev;
+ struct qxl_ttm_tt *gtt;
+@@ -555,6 +555,7 @@ static int qxl_mm_dump_table(struct seq_file *m, void *data)
+
+ static int qxl_ttm_debugfs_init(struct qxl_device *qdev)
+ {
++#if defined(CONFIG_DEBUG_FS)
+ static struct drm_info_list qxl_mem_types_list[QXL_DEBUGFS_MEM_TYPES];
+ static char qxl_mem_types_names[QXL_DEBUGFS_MEM_TYPES][32];
+ unsigned i;
+@@ -574,4 +575,7 @@ static int qxl_ttm_debugfs_init(struct qxl_device *qdev)
+
+ }
+ return qxl_debugfs_add_files(qdev, qxl_mem_types_list, i);
++#else
++ return 0;
++#endif
+ }
+--
+1.8.3.1
+
diff --git a/freed-ora/current/f19/drm-qxl-access-fix.patch b/freed-ora/current/f19/drm-qxl-access-fix.patch
new file mode 100644
index 000000000..e40a14d1b
--- /dev/null
+++ b/freed-ora/current/f19/drm-qxl-access-fix.patch
@@ -0,0 +1,30 @@
+From 18097b91aaff215e843f04b84ec2c686270bb55f Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied@redhat.com>
+Date: Fri, 28 Jun 2013 13:27:40 +1000
+Subject: [PATCH] drm/qxl: add missing access check for execbuffer ioctl
+
+Reported-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+---
+ drivers/gpu/drm/qxl/qxl_ioctl.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
+index a4b71b2..a30f294 100644
+--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
++++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
+@@ -171,6 +171,11 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
+ if (user_cmd.command_size > PAGE_SIZE - sizeof(union qxl_release_info))
+ return -EINVAL;
+
++ if (!access_ok(VERIFY_READ,
++ (void *)(unsigned long)user_cmd.command,
++ user_cmd.command_size))
++ return -EFAULT;
++
+ ret = qxl_alloc_release_reserved(qdev,
+ sizeof(union qxl_release_info) +
+ user_cmd.command_size,
+--
+1.8.1.2
+
diff --git a/freed-ora/current/f19/drm-qxl-backport-fixes.patch b/freed-ora/current/f19/drm-qxl-backport-fixes.patch
deleted file mode 100644
index 0979f2509..000000000
--- a/freed-ora/current/f19/drm-qxl-backport-fixes.patch
+++ /dev/null
@@ -1,154 +0,0 @@
-diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
-index 08b0823..f867714 100644
---- a/drivers/gpu/drm/qxl/qxl_cmd.c
-+++ b/drivers/gpu/drm/qxl/qxl_cmd.c
-@@ -277,7 +277,7 @@ out_unref:
- return 0;
- }
-
--static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port)
-+static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, bool intr)
- {
- int irq_num;
- long addr = qdev->io_base + port;
-@@ -285,20 +285,29 @@ static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port)
-
- mutex_lock(&qdev->async_io_mutex);
- irq_num = atomic_read(&qdev->irq_received_io_cmd);
--
--
- if (qdev->last_sent_io_cmd > irq_num) {
-- ret = wait_event_interruptible(qdev->io_cmd_event,
-- atomic_read(&qdev->irq_received_io_cmd) > irq_num);
-- if (ret)
-+ if (intr)
-+ ret = wait_event_interruptible_timeout(qdev->io_cmd_event,
-+ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
-+ else
-+ ret = wait_event_timeout(qdev->io_cmd_event,
-+ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
-+ /* 0 is timeout, just bail the "hw" has gone away */
-+ if (ret <= 0)
- goto out;
- irq_num = atomic_read(&qdev->irq_received_io_cmd);
- }
- outb(val, addr);
- qdev->last_sent_io_cmd = irq_num + 1;
-- ret = wait_event_interruptible(qdev->io_cmd_event,
-- atomic_read(&qdev->irq_received_io_cmd) > irq_num);
-+ if (intr)
-+ ret = wait_event_interruptible_timeout(qdev->io_cmd_event,
-+ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
-+ else
-+ ret = wait_event_timeout(qdev->io_cmd_event,
-+ atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ);
- out:
-+ if (ret > 0)
-+ ret = 0;
- mutex_unlock(&qdev->async_io_mutex);
- return ret;
- }
-@@ -308,7 +317,7 @@ static void wait_for_io_cmd(struct qxl_device *qdev, uint8_t val, long port)
- int ret;
-
- restart:
-- ret = wait_for_io_cmd_user(qdev, val, port);
-+ ret = wait_for_io_cmd_user(qdev, val, port, false);
- if (ret == -ERESTARTSYS)
- goto restart;
- }
-@@ -340,7 +349,7 @@ int qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf,
- mutex_lock(&qdev->update_area_mutex);
- qdev->ram_header->update_area = *area;
- qdev->ram_header->update_surface = surface_id;
-- ret = wait_for_io_cmd_user(qdev, 0, QXL_IO_UPDATE_AREA_ASYNC);
-+ ret = wait_for_io_cmd_user(qdev, 0, QXL_IO_UPDATE_AREA_ASYNC, true);
- mutex_unlock(&qdev->update_area_mutex);
- return ret;
- }
-diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
-index fcfd443..823d29e 100644
---- a/drivers/gpu/drm/qxl/qxl_display.c
-+++ b/drivers/gpu/drm/qxl/qxl_display.c
-@@ -428,10 +428,10 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
- int inc = 1;
-
- qobj = gem_to_qxl_bo(qxl_fb->obj);
-- if (qxl_fb != qdev->active_user_framebuffer) {
-- DRM_INFO("%s: qxl_fb 0x%p != qdev->active_user_framebuffer 0x%p\n",
-- __func__, qxl_fb, qdev->active_user_framebuffer);
-- }
-+ /* if we aren't primary surface ignore this */
-+ if (!qobj->is_primary)
-+ return 0;
-+
- if (!num_clips) {
- num_clips = 1;
- clips = &norect;
-@@ -604,7 +604,6 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
- mode->hdisplay,
- mode->vdisplay);
- }
-- qdev->mode_set = true;
- return 0;
- }
-
-@@ -893,7 +892,6 @@ qxl_user_framebuffer_create(struct drm_device *dev,
- {
- struct drm_gem_object *obj;
- struct qxl_framebuffer *qxl_fb;
-- struct qxl_device *qdev = dev->dev_private;
- int ret;
-
- obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
-@@ -909,13 +907,6 @@ qxl_user_framebuffer_create(struct drm_device *dev,
- return NULL;
- }
-
-- if (qdev->active_user_framebuffer) {
-- DRM_INFO("%s: active_user_framebuffer %p -> %p\n",
-- __func__,
-- qdev->active_user_framebuffer, qxl_fb);
-- }
-- qdev->active_user_framebuffer = qxl_fb;
--
- return &qxl_fb->base;
- }
-
-diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
-index 52b582c..43d06ab 100644
---- a/drivers/gpu/drm/qxl/qxl_drv.h
-+++ b/drivers/gpu/drm/qxl/qxl_drv.h
-@@ -255,12 +255,6 @@ struct qxl_device {
- struct qxl_gem gem;
- struct qxl_mode_info mode_info;
-
-- /*
-- * last created framebuffer with fb_create
-- * only used by debugfs dumbppm
-- */
-- struct qxl_framebuffer *active_user_framebuffer;
--
- struct fb_info *fbdev_info;
- struct qxl_framebuffer *fbdev_qfb;
- void *ram_physical;
-@@ -270,7 +264,6 @@ struct qxl_device {
- struct qxl_ring *cursor_ring;
-
- struct qxl_ram_header *ram_header;
-- bool mode_set;
-
- bool primary_created;
-
-diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
-index 04b64f9..6db7370 100644
---- a/drivers/gpu/drm/qxl/qxl_ioctl.c
-+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
-@@ -294,6 +294,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
- goto out;
-
- if (!qobj->pin_count) {
-+ qxl_ttm_placement_from_domain(qobj, qobj->type);
- ret = ttm_bo_validate(&qobj->tbo, &qobj->placement,
- true, false);
- if (unlikely(ret))
diff --git a/freed-ora/current/f19/drm-qxl-post-3.10-feature-fixes.patch b/freed-ora/current/f19/drm-qxl-post-3.10-feature-fixes.patch
new file mode 100644
index 000000000..cf747c4b2
--- /dev/null
+++ b/freed-ora/current/f19/drm-qxl-post-3.10-feature-fixes.patch
@@ -0,0 +1,517 @@
+From cd402bae4566410f38780e1ce94248b92c3403c0 Mon Sep 17 00:00:00 2001
+From: Dave Airlie <airlied@redhat.com>
+Date: Mon, 1 Jul 2013 14:14:38 +1000
+Subject: [PATCH 5/5] drm/qxl: post 3.10 feature fixes
+
+drm/qxl: make dynamic resizing work properly.
+drm/qxl: add support for cursor hotspot.
+drm/qxl: add support for > 1 output
+drm/qxl: set time on drawables from userspace
+---
+ drivers/gpu/drm/qxl/qxl_cmd.c | 8 +-
+ drivers/gpu/drm/qxl/qxl_display.c | 187 ++++++++++++++++----------------------
+ drivers/gpu/drm/qxl/qxl_drv.c | 4 +
+ drivers/gpu/drm/qxl/qxl_drv.h | 8 +-
+ drivers/gpu/drm/qxl/qxl_fb.c | 2 +-
+ drivers/gpu/drm/qxl/qxl_ioctl.c | 6 ++
+ 6 files changed, 98 insertions(+), 117 deletions(-)
+
+diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
+index 02befd9..0ec55e7 100644
+--- a/drivers/gpu/drm/qxl/qxl_cmd.c
++++ b/drivers/gpu/drm/qxl/qxl_cmd.c
+@@ -375,8 +375,8 @@ void qxl_io_destroy_primary(struct qxl_device *qdev)
+ wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC);
+ }
+
+-void qxl_io_create_primary(struct qxl_device *qdev, unsigned width,
+- unsigned height, unsigned offset, struct qxl_bo *bo)
++void qxl_io_create_primary(struct qxl_device *qdev,
++ unsigned offset, struct qxl_bo *bo)
+ {
+ struct qxl_surface_create *create;
+
+@@ -384,8 +384,8 @@ void qxl_io_create_primary(struct qxl_device *qdev, unsigned width,
+ qdev->ram_header);
+ create = &qdev->ram_header->create_surface;
+ create->format = bo->surf.format;
+- create->width = width;
+- create->height = height;
++ create->width = bo->surf.width;
++ create->height = bo->surf.height;
+ create->stride = bo->surf.stride;
+ create->mem = qxl_bo_physical_address(qdev, bo, offset);
+
+diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
+index 823d29e..a127a97 100644
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -30,53 +30,9 @@
+ #include "qxl_object.h"
+ #include "drm_crtc_helper.h"
+
+-static void qxl_crtc_set_to_mode(struct qxl_device *qdev,
+- struct drm_connector *connector,
+- struct qxl_head *head)
++static bool qxl_head_enabled(struct qxl_head *head)
+ {
+- struct drm_device *dev = connector->dev;
+- struct drm_display_mode *mode, *t;
+- int width = head->width;
+- int height = head->height;
+-
+- if (width < 320 || height < 240) {
+- qxl_io_log(qdev, "%s: bad head: %dx%d", width, height);
+- width = 1024;
+- height = 768;
+- }
+- if (width * height * 4 > 16*1024*1024) {
+- width = 1024;
+- height = 768;
+- }
+- /* TODO: go over regular modes and removed preferred? */
+- list_for_each_entry_safe(mode, t, &connector->probed_modes, head)
+- drm_mode_remove(connector, mode);
+- mode = drm_cvt_mode(dev, width, height, 60, false, false, false);
+- mode->type |= DRM_MODE_TYPE_PREFERRED;
+- mode->status = MODE_OK;
+- drm_mode_probed_add(connector, mode);
+- qxl_io_log(qdev, "%s: %d x %d\n", __func__, width, height);
+-}
+-
+-void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev)
+-{
+- struct drm_connector *connector;
+- int i;
+- struct drm_device *dev = qdev->ddev;
+-
+- i = 0;
+- qxl_io_log(qdev, "%s: %d, %d\n", __func__,
+- dev->mode_config.num_connector,
+- qdev->monitors_config->count);
+- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+- if (i > qdev->monitors_config->count) {
+- /* crtc will be reported as disabled */
+- continue;
+- }
+- qxl_crtc_set_to_mode(qdev, connector,
+- &qdev->monitors_config->heads[i]);
+- ++i;
+- }
++ return head->width && head->height;
+ }
+
+ void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)
+@@ -106,7 +62,6 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
+ int num_monitors;
+ uint32_t crc;
+
+- BUG_ON(!qdev->monitors_config);
+ num_monitors = qdev->rom->client_monitors_config.count;
+ crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config,
+ sizeof(qdev->rom->client_monitors_config));
+@@ -117,8 +72,8 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
+ return 1;
+ }
+ if (num_monitors > qdev->monitors_config->max_allowed) {
+- DRM_INFO("client monitors list will be truncated: %d < %d\n",
+- qdev->monitors_config->max_allowed, num_monitors);
++ DRM_DEBUG_KMS("client monitors list will be truncated: %d < %d\n",
++ qdev->monitors_config->max_allowed, num_monitors);
+ num_monitors = qdev->monitors_config->max_allowed;
+ } else {
+ num_monitors = qdev->rom->client_monitors_config.count;
+@@ -132,18 +87,15 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
+ &qdev->rom->client_monitors_config.heads[i];
+ struct qxl_head *client_head =
+ &qdev->client_monitors_config->heads[i];
+- struct qxl_head *head = &qdev->monitors_config->heads[i];
+- client_head->x = head->x = c_rect->left;
+- client_head->y = head->y = c_rect->top;
+- client_head->width = head->width =
+- c_rect->right - c_rect->left;
+- client_head->height = head->height =
+- c_rect->bottom - c_rect->top;
+- client_head->surface_id = head->surface_id = 0;
+- client_head->id = head->id = i;
+- client_head->flags = head->flags = 0;
+- QXL_DEBUG(qdev, "read %dx%d+%d+%d\n", head->width, head->height,
+- head->x, head->y);
++ client_head->x = c_rect->left;
++ client_head->y = c_rect->top;
++ client_head->width = c_rect->right - c_rect->left;
++ client_head->height = c_rect->bottom - c_rect->top;
++ client_head->surface_id = 0;
++ client_head->id = i;
++ client_head->flags = 0;
++ DRM_DEBUG_KMS("read %dx%d+%d+%d\n", client_head->width, client_head->height,
++ client_head->x, client_head->y);
+ }
+ return 0;
+ }
+@@ -155,9 +107,6 @@ void qxl_display_read_client_monitors_config(struct qxl_device *qdev)
+ qxl_io_log(qdev, "failed crc check for client_monitors_config,"
+ " retrying\n");
+ }
+- qxl_crtc_set_from_monitors_config(qdev);
+- /* fire off a uevent and let userspace tell us what to do */
+- qxl_io_log(qdev, "calling drm_sysfs_hotplug_event\n");
+ drm_sysfs_hotplug_event(qdev->ddev);
+ }
+
+@@ -170,9 +119,9 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector)
+ struct drm_display_mode *mode = NULL;
+ struct qxl_head *head;
+
+- if (!qdev->monitors_config)
++ if (!qdev->client_monitors_config)
+ return 0;
+- head = &qdev->monitors_config->heads[h];
++ head = &qdev->client_monitors_config->heads[h];
+
+ mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false,
+ false);
+@@ -255,11 +204,11 @@ qxl_hide_cursor(struct qxl_device *qdev)
+ qxl_release_unreserve(qdev, release);
+ }
+
+-static int qxl_crtc_cursor_set(struct drm_crtc *crtc,
+- struct drm_file *file_priv,
+- uint32_t handle,
+- uint32_t width,
+- uint32_t height)
++static int qxl_crtc_cursor_set2(struct drm_crtc *crtc,
++ struct drm_file *file_priv,
++ uint32_t handle,
++ uint32_t width,
++ uint32_t height, int32_t hot_x, int32_t hot_y)
+ {
+ struct drm_device *dev = crtc->dev;
+ struct qxl_device *qdev = dev->dev_private;
+@@ -315,8 +264,8 @@ static int qxl_crtc_cursor_set(struct drm_crtc *crtc,
+ cursor->header.type = SPICE_CURSOR_TYPE_ALPHA;
+ cursor->header.width = 64;
+ cursor->header.height = 64;
+- cursor->header.hot_spot_x = 0;
+- cursor->header.hot_spot_y = 0;
++ cursor->header.hot_spot_x = hot_x;
++ cursor->header.hot_spot_y = hot_y;
+ cursor->data_size = size;
+ cursor->chunk.next_chunk = 0;
+ cursor->chunk.prev_chunk = 0;
+@@ -397,7 +346,7 @@ static int qxl_crtc_cursor_move(struct drm_crtc *crtc,
+
+
+ static const struct drm_crtc_funcs qxl_crtc_funcs = {
+- .cursor_set = qxl_crtc_cursor_set,
++ .cursor_set2 = qxl_crtc_cursor_set2,
+ .cursor_move = qxl_crtc_cursor_move,
+ .gamma_set = qxl_crtc_gamma_set,
+ .set_config = drm_crtc_helper_set_config,
+@@ -506,7 +455,7 @@ qxl_send_monitors_config(struct qxl_device *qdev)
+ for (i = 0 ; i < qdev->monitors_config->count ; ++i) {
+ struct qxl_head *head = &qdev->monitors_config->heads[i];
+
+- if (head->y > 8192 || head->y < head->x ||
++ if (head->y > 8192 || head->x > 8192 ||
+ head->width > 8192 || head->height > 8192) {
+ DRM_ERROR("head %d wrong: %dx%d+%d+%d\n",
+ i, head->width, head->height,
+@@ -517,16 +466,19 @@ qxl_send_monitors_config(struct qxl_device *qdev)
+ qxl_io_monitors_config(qdev);
+ }
+
+-static void qxl_monitors_config_set_single(struct qxl_device *qdev,
+- unsigned x, unsigned y,
+- unsigned width, unsigned height)
++static void qxl_monitors_config_set(struct qxl_device *qdev,
++ int index,
++ unsigned x, unsigned y,
++ unsigned width, unsigned height,
++ unsigned surf_id)
+ {
+- DRM_DEBUG("%dx%d+%d+%d\n", width, height, x, y);
+- qdev->monitors_config->count = 1;
+- qdev->monitors_config->heads[0].x = x;
+- qdev->monitors_config->heads[0].y = y;
+- qdev->monitors_config->heads[0].width = width;
+- qdev->monitors_config->heads[0].height = height;
++ DRM_DEBUG_KMS("%d:%dx%d+%d+%d\n", index, width, height, x, y);
++ qdev->monitors_config->heads[index].x = x;
++ qdev->monitors_config->heads[index].y = y;
++ qdev->monitors_config->heads[index].width = width;
++ qdev->monitors_config->heads[index].height = height;
++ qdev->monitors_config->heads[index].surface_id = surf_id;
++
+ }
+
+ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
+@@ -540,10 +492,11 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
+ struct qxl_mode *m = (void *)mode->private;
+ struct qxl_framebuffer *qfb;
+ struct qxl_bo *bo, *old_bo = NULL;
++ struct qxl_crtc *qcrtc = to_qxl_crtc(crtc);
+ uint32_t width, height, base_offset;
+ bool recreate_primary = false;
+ int ret;
+-
++ int surf_id;
+ if (!crtc->fb) {
+ DRM_DEBUG_KMS("No FB bound\n");
+ return 0;
+@@ -567,7 +520,8 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
+ adjusted_mode->hdisplay,
+ adjusted_mode->vdisplay);
+
+- recreate_primary = true;
++ if (qcrtc->index == 0)
++ recreate_primary = true;
+
+ width = mode->hdisplay;
+ height = mode->vdisplay;
+@@ -588,8 +542,11 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
+ "recreate primary: %dx%d (was %dx%d,%d,%d)\n",
+ width, height, bo->surf.width,
+ bo->surf.height, bo->surf.stride, bo->surf.format);
+- qxl_io_create_primary(qdev, width, height, base_offset, bo);
++ qxl_io_create_primary(qdev, base_offset, bo);
+ bo->is_primary = true;
++ surf_id = 0;
++ } else {
++ surf_id = bo->surface_id;
+ }
+
+ if (old_bo && old_bo != bo) {
+@@ -599,11 +556,9 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,
+ qxl_bo_unreserve(old_bo);
+ }
+
+- if (qdev->monitors_config->count == 0) {
+- qxl_monitors_config_set_single(qdev, x, y,
+- mode->hdisplay,
+- mode->vdisplay);
+- }
++ qxl_monitors_config_set(qdev, qcrtc->index, x, y,
++ mode->hdisplay,
++ mode->vdisplay, surf_id);
+ return 0;
+ }
+
+@@ -619,6 +574,26 @@ static void qxl_crtc_commit(struct drm_crtc *crtc)
+ DRM_DEBUG("\n");
+ }
+
++static void qxl_crtc_disable(struct drm_crtc *crtc)
++{
++ struct qxl_crtc *qcrtc = to_qxl_crtc(crtc);
++ struct drm_device *dev = crtc->dev;
++ struct qxl_device *qdev = dev->dev_private;
++ if (crtc->fb) {
++ struct qxl_framebuffer *qfb = to_qxl_framebuffer(crtc->fb);
++ struct qxl_bo *bo = gem_to_qxl_bo(qfb->obj);
++ int ret;
++ ret = qxl_bo_reserve(bo, false);
++ qxl_bo_unpin(bo);
++ qxl_bo_unreserve(bo);
++ crtc->fb = NULL;
++ }
++
++ qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, 0, 0, 0);
++
++ qxl_send_monitors_config(qdev);
++}
++
+ static void qxl_crtc_load_lut(struct drm_crtc *crtc)
+ {
+ DRM_DEBUG("\n");
+@@ -626,6 +601,7 @@ static void qxl_crtc_load_lut(struct drm_crtc *crtc)
+
+ static const struct drm_crtc_helper_funcs qxl_crtc_helper_funcs = {
+ .dpms = qxl_crtc_dpms,
++ .disable = qxl_crtc_disable,
+ .mode_fixup = qxl_crtc_mode_fixup,
+ .mode_set = qxl_crtc_mode_set,
+ .prepare = qxl_crtc_prepare,
+@@ -633,7 +609,7 @@ static const struct drm_crtc_helper_funcs qxl_crtc_helper_funcs = {
+ .load_lut = qxl_crtc_load_lut,
+ };
+
+-static int qdev_crtc_init(struct drm_device *dev, int num_crtc)
++static int qdev_crtc_init(struct drm_device *dev, int crtc_id)
+ {
+ struct qxl_crtc *qxl_crtc;
+
+@@ -642,7 +618,7 @@ static int qdev_crtc_init(struct drm_device *dev, int num_crtc)
+ return -ENOMEM;
+
+ drm_crtc_init(dev, &qxl_crtc->base, &qxl_crtc_funcs);
+-
++ qxl_crtc->index = crtc_id;
+ drm_mode_crtc_set_gamma_size(&qxl_crtc->base, 256);
+ drm_crtc_helper_add(&qxl_crtc->base, &qxl_crtc_helper_funcs);
+ return 0;
+@@ -670,18 +646,13 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev,
+ struct drm_encoder *encoder)
+ {
+ int i;
++ struct qxl_output *output = drm_encoder_to_qxl_output(encoder);
+ struct qxl_head *head;
+ struct drm_display_mode *mode;
+
+ BUG_ON(!encoder);
+ /* TODO: ugly, do better */
+- for (i = 0 ; (encoder->possible_crtcs != (1 << i)) && i < 32; ++i)
+- ;
+- if (encoder->possible_crtcs != (1 << i)) {
+- DRM_ERROR("encoder has wrong possible_crtcs: %x\n",
+- encoder->possible_crtcs);
+- return;
+- }
++ i = output->index;
+ if (!qdev->monitors_config ||
+ qdev->monitors_config->max_allowed <= i) {
+ DRM_ERROR(
+@@ -699,7 +670,6 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev,
+ DRM_DEBUG("missing for multiple monitors: no head holes\n");
+ head = &qdev->monitors_config->heads[i];
+ head->id = i;
+- head->surface_id = 0;
+ if (encoder->crtc->enabled) {
+ mode = &encoder->crtc->mode;
+ head->width = mode->hdisplay;
+@@ -714,8 +684,8 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev,
+ head->x = 0;
+ head->y = 0;
+ }
+- DRM_DEBUG("setting head %d to +%d+%d %dx%d\n",
+- i, head->x, head->y, head->width, head->height);
++ DRM_DEBUG_KMS("setting head %d to +%d+%d %dx%d out of %d\n",
++ i, head->x, head->y, head->width, head->height, qdev->monitors_config->count);
+ head->flags = 0;
+ /* TODO - somewhere else to call this for multiple monitors
+ * (config_commit?) */
+@@ -810,8 +780,9 @@ static enum drm_connector_status qxl_conn_detect(
+
+ /* The first monitor is always connected */
+ connected = (output->index == 0) ||
+- (qdev->monitors_config &&
+- qdev->monitors_config->count > output->index);
++ (qdev->client_monitors_config &&
++ qdev->client_monitors_config->count > output->index &&
++ qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]));
+
+ DRM_DEBUG("\n");
+ return connected ? connector_status_connected
+@@ -919,7 +890,7 @@ int qxl_modeset_init(struct qxl_device *qdev)
+ int i;
+ int ret;
+ struct drm_gem_object *gobj;
+- int max_allowed = QXL_NUM_OUTPUTS;
++ int max_allowed = qxl_num_crtc;
+ int monitors_config_size = sizeof(struct qxl_monitors_config) +
+ max_allowed * sizeof(struct qxl_head);
+
+@@ -949,7 +920,7 @@ int qxl_modeset_init(struct qxl_device *qdev)
+ qdev->ddev->mode_config.max_height = 8192;
+
+ qdev->ddev->mode_config.fb_base = qdev->vram_base;
+- for (i = 0 ; i < QXL_NUM_OUTPUTS; ++i) {
++ for (i = 0 ; i < qxl_num_crtc; ++i) {
+ qdev_crtc_init(qdev->ddev, i);
+ qdev_output_init(qdev->ddev, i);
+ }
+diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
+index aa291d8..00e57b76 100644
+--- a/drivers/gpu/drm/qxl/qxl_drv.c
++++ b/drivers/gpu/drm/qxl/qxl_drv.c
+@@ -47,10 +47,14 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
+ MODULE_DEVICE_TABLE(pci, pciidlist);
+
+ static int qxl_modeset = -1;
++int qxl_num_crtc = 4;
+
+ MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
+ module_param_named(modeset, qxl_modeset, int, 0400);
+
++MODULE_PARM_DESC(num_heads, "Number of virtual crtcs to expose (default 4)");
++module_param_named(num_heads, qxl_num_crtc, int, 0400);
++
+ static struct drm_driver qxl_driver;
+ static struct pci_driver qxl_pci_driver;
+
+diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
+index 43d06ab..42ef0e2 100644
+--- a/drivers/gpu/drm/qxl/qxl_drv.h
++++ b/drivers/gpu/drm/qxl/qxl_drv.h
+@@ -55,11 +55,10 @@
+ #define DRIVER_MINOR 1
+ #define DRIVER_PATCHLEVEL 0
+
+-#define QXL_NUM_OUTPUTS 1
+-
+ #define QXL_DEBUGFS_MAX_COMPONENTS 32
+
+ extern int qxl_log_level;
++extern int qxl_num_crtc;
+
+ enum {
+ QXL_INFO_LEVEL = 1,
+@@ -139,6 +138,7 @@ struct qxl_reloc_list {
+
+ struct qxl_crtc {
+ struct drm_crtc base;
++ int index;
+ int cur_x;
+ int cur_y;
+ };
+@@ -156,7 +156,7 @@ struct qxl_framebuffer {
+
+ #define to_qxl_crtc(x) container_of(x, struct qxl_crtc, base)
+ #define drm_connector_to_qxl_output(x) container_of(x, struct qxl_output, base)
+-#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, base)
++#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc)
+ #define to_qxl_framebuffer(x) container_of(x, struct qxl_framebuffer, base)
+
+ struct qxl_mman {
+@@ -435,7 +435,7 @@ void qxl_update_screen(struct qxl_device *qxl);
+ /* qxl io operations (qxl_cmd.c) */
+
+ void qxl_io_create_primary(struct qxl_device *qdev,
+- unsigned width, unsigned height, unsigned offset,
++ unsigned offset,
+ struct qxl_bo *bo);
+ void qxl_io_destroy_primary(struct qxl_device *qdev);
+ void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id);
+diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
+index b3c5127..11ef7cb 100644
+--- a/drivers/gpu/drm/qxl/qxl_fb.c
++++ b/drivers/gpu/drm/qxl/qxl_fb.c
+@@ -542,7 +542,7 @@ int qxl_fbdev_init(struct qxl_device *qdev)
+ qfbdev->helper.funcs = &qxl_fb_helper_funcs;
+
+ ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper,
+- 1 /* num_crtc - QXL supports just 1 */,
++ qxl_num_crtc /* num_crtc - QXL supports just 1 */,
+ QXLFB_CONN_LIMIT);
+ if (ret) {
+ kfree(qfbdev);
+diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
+index a4b71b2..6ba49d9 100644
+--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
++++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
+@@ -183,6 +183,12 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
+ /* TODO copy slow path code from i915 */
+ fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_SIZE));
+ unwritten = __copy_from_user_inatomic_nocache(fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), (void *)(unsigned long)user_cmd.command, user_cmd.command_size);
++
++ {
++ struct qxl_drawable *draw = fb_cmd;
++
++ draw->mm_time = qdev->rom->mm_clock;
++ }
+ qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd);
+ if (unwritten) {
+ DRM_ERROR("got unwritten %d\n", unwritten);
+--
+1.8.3.1
+
diff --git a/freed-ora/current/f19/iwl3945-better-skb-management-in-rx-path.patch b/freed-ora/current/f19/iwl3945-better-skb-management-in-rx-path.patch
new file mode 100644
index 000000000..5d85af7d4
--- /dev/null
+++ b/freed-ora/current/f19/iwl3945-better-skb-management-in-rx-path.patch
@@ -0,0 +1,97 @@
+From: Eric Dumazet <edumazet@google.com>
+
+Steinar reported reallocations of skb->head with IPv6, leading to
+a warning in skb_try_coalesce()
+
+It turns out iwl3945 has several problems :
+
+1) skb->truesize is underestimated.
+ We really consume PAGE_SIZE bytes for a fragment,
+ not the frame length.
+2) 128 bytes of initial headroom is a bit low and forces reallocations.
+3) We can avoid consuming a full page for small enough frames.
+
+Reported-by: Steinar H. Gunderson <sesse@google.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Cc: Paul Stewart <pstew@google.com>
+---
+v3: use regular memcpy(skb_put(...),...)
+v2: SMALL_PACKET_SIZE define
+
+ drivers/net/wireless/iwlegacy/3945.c | 31 +++++++++++++++----------
+ 1 file changed, 19 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/net/wireless/iwlegacy/3945.c b/drivers/net/wireless/iwlegacy/3945.c
+index c092033..f09e257 100644
+--- a/drivers/net/wireless/iwlegacy/3945.c
++++ b/drivers/net/wireless/iwlegacy/3945.c
+@@ -475,6 +475,8 @@ il3945_is_network_packet(struct il_priv *il, struct ieee80211_hdr *header)
+ }
+ }
+
++#define SMALL_PACKET_SIZE 256
++
+ static void
+ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb,
+ struct ieee80211_rx_status *stats)
+@@ -483,14 +485,13 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb,
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)IL_RX_DATA(pkt);
+ struct il3945_rx_frame_hdr *rx_hdr = IL_RX_HDR(pkt);
+ struct il3945_rx_frame_end *rx_end = IL_RX_END(pkt);
+- u16 len = le16_to_cpu(rx_hdr->len);
++ u32 len = le16_to_cpu(rx_hdr->len);
+ struct sk_buff *skb;
+ __le16 fc = hdr->frame_control;
++ u32 fraglen = PAGE_SIZE << il->hw_params.rx_page_order;
+
+ /* We received data from the HW, so stop the watchdog */
+- if (unlikely
+- (len + IL39_RX_FRAME_SIZE >
+- PAGE_SIZE << il->hw_params.rx_page_order)) {
++ if (unlikely(len + IL39_RX_FRAME_SIZE > fraglen)) {
+ D_DROP("Corruption detected!\n");
+ return;
+ }
+@@ -506,26 +507,32 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb,
+ D_INFO("Woke queues - frame received on passive channel\n");
+ }
+
+- skb = dev_alloc_skb(128);
++ skb = dev_alloc_skb(SMALL_PACKET_SIZE);
+ if (!skb) {
+ IL_ERR("dev_alloc_skb failed\n");
+ return;
+ }
+
+ if (!il3945_mod_params.sw_crypto)
+- il_set_decrypted_flag(il, (struct ieee80211_hdr *)rxb_addr(rxb),
++ il_set_decrypted_flag(il, (struct ieee80211_hdr *)pkt,
+ le32_to_cpu(rx_end->status), stats);
+
+- skb_add_rx_frag(skb, 0, rxb->page,
+- (void *)rx_hdr->payload - (void *)pkt, len,
+- len);
+-
++ /* If frame is small enough to fit into skb->head, copy it
++ * and do not consume a full page
++ */
++ if (len <= SMALL_PACKET_SIZE) {
++ memcpy(skb_put(skb, len), rx_hdr->payload, len);
++ } else {
++ skb_add_rx_frag(skb, 0, rxb->page,
++ (void *)rx_hdr->payload - (void *)pkt, len,
++ fraglen);
++ il->alloc_rxb_page--;
++ rxb->page = NULL;
++ }
+ il_update_stats(il, false, fc, len);
+ memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
+
+ ieee80211_rx(il->hw, skb);
+- il->alloc_rxb_page--;
+- rxb->page = NULL;
+ }
+
+ #define IL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
+
+
diff --git a/freed-ora/current/f19/iwl4965-better-skb-management-in-rx-path.patch b/freed-ora/current/f19/iwl4965-better-skb-management-in-rx-path.patch
new file mode 100644
index 000000000..904ff04f6
--- /dev/null
+++ b/freed-ora/current/f19/iwl4965-better-skb-management-in-rx-path.patch
@@ -0,0 +1,65 @@
+4965 version of Eric patch "iwl3945: better skb management in rx path".
+It fixes several problems :
+
+1) skb->truesize is underestimated.
+ We really consume PAGE_SIZE bytes for a fragment,
+ not the frame length.
+2) 128 bytes of initial headroom is a bit low and forces reallocations.
+3) We can avoid consuming a full page for small enough frames.
+
+Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+---
+ drivers/net/wireless/iwlegacy/4965-mac.c | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
+index d287fd2..4e5d408 100644
+--- a/drivers/net/wireless/iwlegacy/4965-mac.c
++++ b/drivers/net/wireless/iwlegacy/4965-mac.c
+@@ -574,9 +574,11 @@ il4965_translate_rx_status(struct il_priv *il, u32 decrypt_in)
+ return decrypt_out;
+ }
+
++#define SMALL_PACKET_SIZE 256
++
+ static void
+ il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr,
+- u16 len, u32 ampdu_status, struct il_rx_buf *rxb,
++ u32 len, u32 ampdu_status, struct il_rx_buf *rxb,
+ struct ieee80211_rx_status *stats)
+ {
+ struct sk_buff *skb;
+@@ -598,21 +600,25 @@ il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr,
+ il_set_decrypted_flag(il, hdr, ampdu_status, stats))
+ return;
+
+- skb = dev_alloc_skb(128);
++ skb = dev_alloc_skb(SMALL_PACKET_SIZE);
+ if (!skb) {
+ IL_ERR("dev_alloc_skb failed\n");
+ return;
+ }
+
+- skb_add_rx_frag(skb, 0, rxb->page, (void *)hdr - rxb_addr(rxb), len,
+- len);
++ if (len <= SMALL_PACKET_SIZE) {
++ memcpy(skb_put(skb, len), hdr, len);
++ } else {
++ skb_add_rx_frag(skb, 0, rxb->page, (void *)hdr - rxb_addr(rxb),
++ len, PAGE_SIZE << il->hw_params.rx_page_order);
++ il->alloc_rxb_page--;
++ rxb->page = NULL;
++ }
+
+ il_update_stats(il, false, fc, len);
+ memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
+
+ ieee80211_rx(il->hw, skb);
+- il->alloc_rxb_page--;
+- rxb->page = NULL;
+ }
+
+ /* Called for N_RX (legacy ABG frames), or
+--
+1.7.11.7
+
diff --git a/freed-ora/current/f19/kernel.spec b/freed-ora/current/f19/kernel.spec
index 3f848abc2..c1c8543d6 100644
--- a/freed-ora/current/f19/kernel.spec
+++ b/freed-ora/current/f19/kernel.spec
@@ -112,7 +112,7 @@ Summary: The Linux kernel
%if 0%{?released_kernel}
# Do we have a -stable update to apply?
-%define stable_update 8
+%define stable_update 9
# Is it a -stable RC?
%define stable_rc 0
# Set rpm version accordingly
@@ -731,8 +731,11 @@ Patch1000: devel-pekey-secure-boot-20130306.patch
#atch1700: drm-edid-try-harder-to-fix-up-broken-headers.patch
#Patch1800: drm-vgem.patch
Patch1700: drm-ttm-exports-for-qxl.patch
-Patch1701: drm-qxl-driver.patch
-Patch1702: drm-qxl-backport-fixes.patch
+Patch1701: drm-hotspot-cursor-backport.patch
+Patch1702: drm-qxl-driver.patch
+Patch1703: drm-qxl-3.10-rc7-diff.patch
+Patch1704: drm-qxl-access-fix.patch
+Patch1705: drm-qxl-post-3.10-feature-fixes.patch
# nouveau + drm fixes
# intel drm is all merged upstream
Patch1824: drm-intel-next.patch
@@ -838,9 +841,6 @@ Patch25038: cdrom-use-kzalloc-for-failing-hardware.patch
Patch25043: vfio-Set-container-device-mode.patch
Patch25044: vfio-fix-crash-on-rmmod.patch
-#rhbz 950735
-Patch25045: rt2800-fix-RT5390-RT3290-TX-power-settings-regression.patch
-
#rhbz 969644
Patch25046: KVM-x86-handle-idiv-overflow-at-kvm_write_tsc.patch
@@ -862,6 +862,10 @@ Patch25054: bridge-send-query-as-soon-as-leave-is-received.patch
#rhbz 977558
Patch25055: ath3k-dont-use-stack-memory-for-DMA.patch
+#rhbz 977040
+Patch25056: iwl3945-better-skb-management-in-rx-path.patch
+Patch25057: iwl4965-better-skb-management-in-rx-path.patch
+
# END OF PATCH DEFINITIONS
%endif
@@ -1564,8 +1568,11 @@ ApplyPatch devel-pekey-secure-boot-20130306.patch
# DRM core
ApplyPatch drm-ttm-exports-for-qxl.patch
+ApplyPatch drm-hotspot-cursor-backport.patch
ApplyPatch drm-qxl-driver.patch
-ApplyPatch drm-qxl-backport-fixes.patch
+ApplyPatch drm-qxl-3.10-rc7-diff.patch
+ApplyPatch drm-qxl-access-fix.patch
+ApplyPatch drm-qxl-post-3.10-feature-fixes.patch
#ApplyPatch drm-edid-try-harder-to-fix-up-broken-headers.patch
#ApplyPatch drm-vgem.patch
@@ -1656,9 +1663,6 @@ ApplyPatch cdrom-use-kzalloc-for-failing-hardware.patch
ApplyPatch vfio-Set-container-device-mode.patch
ApplyPatch vfio-fix-crash-on-rmmod.patch
-#rhbz 950735
-ApplyPatch rt2800-fix-RT5390-RT3290-TX-power-settings-regression.patch
-
#rhbz 969644
ApplyPatch KVM-x86-handle-idiv-overflow-at-kvm_write_tsc.patch
@@ -1680,6 +1684,10 @@ ApplyPatch bridge-send-query-as-soon-as-leave-is-received.patch
#rhbz 977558
ApplyPatch ath3k-dont-use-stack-memory-for-DMA.patch
+#rhbz 977040
+ApplyPatch iwl3945-better-skb-management-in-rx-path.patch
+ApplyPatch iwl4965-better-skb-management-in-rx-path.patch
+
# END OF PATCH APPLICATIONS
%endif
@@ -2507,6 +2515,28 @@ fi
# and build.
%changelog
+* Sun Jul 7 2013 Alexandre Oliva <lxoliva@fsfla.org> -libre
+- GNU Linux-libre 3.9.9-gnu.
+
+* Wed Jul 03 2013 Justin M. Forbes <jforbes@redhat.com> 3.9.9-300
+- Linux v3.9.9
+
+* Wed Jul 03 2013 Josh Boyer <jwboyer@redhat.com>
+- Add patches to fix iwl skb managment (rhbz 977040)
+
+* Wed Jul 03 2013 Dave Airlie <airlied@redhat.com>
+- fixup QXL driver patches to make it easier to rebase
+- add qxl driver dynamic resize + multiple heads support
+
+* Mon Jul 01 2013 Dave Airlie <airlied@redhat.com>
+- kernel portion of qxl cursor and dynamic resize fixes.
+
+* Fri Jun 28 2013 Peter Robinson <pbrobinson@fedoraproject.org>
+- Only enable ARM A15 errata on the LPAE kernel as it breaks A8
+
+* Fri Jun 28 2013 Dave Airlie <airlied@redhat.com>
+- add qxl fix for missing access ok macro.
+
* Fri Jun 28 2013 Alexandre Oliva <lxoliva@fsfla.org> -libre
- GNU Linux-libre 3.9.8-gnu.
diff --git a/freed-ora/current/f19/patch-3.9-gnu-3.9.8-gnu.xz.sign b/freed-ora/current/f19/patch-3.9-gnu-3.9.8-gnu.xz.sign
deleted file mode 100644
index b85172723..000000000
--- a/freed-ora/current/f19/patch-3.9-gnu-3.9.8-gnu.xz.sign
+++ /dev/null
@@ -1,7 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v2.0.19 (GNU/Linux)
-
-iEYEABECAAYFAlHMsw8ACgkQvLfPh359R6d5DACeMzKKqKcj07T9pw+anQIE70bE
-n/oAn2iZLRxkWag5FtJlfxZqQ0sgV0qh
-=miKX
------END PGP SIGNATURE-----
diff --git a/freed-ora/current/f19/patch-3.9-gnu-3.9.9-gnu.xz.sign b/freed-ora/current/f19/patch-3.9-gnu-3.9.9-gnu.xz.sign
new file mode 100644
index 000000000..44bf22e97
--- /dev/null
+++ b/freed-ora/current/f19/patch-3.9-gnu-3.9.9-gnu.xz.sign
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.19 (GNU/Linux)
+
+iEYEABECAAYFAlHWNawACgkQvLfPh359R6ecywCgolrCHDKIP0XXRIdqbgJ9eSMW
+lbUAn1PTs9cmfcQBlStJn7qWVmpNX8u3
+=8pW9
+-----END PGP SIGNATURE-----
diff --git a/freed-ora/current/f19/rt2800-fix-RT5390-RT3290-TX-power-settings-regression.patch b/freed-ora/current/f19/rt2800-fix-RT5390-RT3290-TX-power-settings-regression.patch
deleted file mode 100644
index 354873950..000000000
--- a/freed-ora/current/f19/rt2800-fix-RT5390-RT3290-TX-power-settings-regression.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-My change:
-
-commit cee2c7315f60beeff6137ee59e99acc77d636eeb
-Author: Stanislaw Gruszka <sgruszka@redhat.com>
-Date: Fri Oct 5 13:44:09 2012 +0200
-
- rt2800: use BBP_R1 for setting tx power
-
-unfortunately does not work well with RT5390 and RT3290 chips as they
-require different temperature compensation TX power settings (TSSI
-tuning). Since that commit make wireless connection very unstable on
-those chips, restore previous behavior to fix regression. Once we
-implement proper TSSI tuning on 5390/3290 we can restore back setting
-TX power by BBP_R1 register for those chips.
-
-Reported-and-tested-by: Mike Romberg <mike-romberg@comcast.net>
-Cc: stable@vger.kernel.org
-Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
----
- drivers/net/wireless/rt2x00/rt2800lib.c | 29 ++++++++++++++++++-----------
- 1 file changed, 18 insertions(+), 11 deletions(-)
-
-diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
-index 92849e5..8b679df 100644
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2634,19 +2634,26 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
- * TODO: we do not use +6 dBm option to do not increase power beyond
- * regulatory limit, however this could be utilized for devices with
- * CAPABILITY_POWER_LIMIT.
-+ *
-+ * TODO: add different temperature compensation code for RT3290 & RT5390
-+ * to allow to use BBP_R1 for those chips.
- */
-- rt2800_bbp_read(rt2x00dev, 1, &r1);
-- if (delta <= -12) {
-- power_ctrl = 2;
-- delta += 12;
-- } else if (delta <= -6) {
-- power_ctrl = 1;
-- delta += 6;
-- } else {
-- power_ctrl = 0;
-+ if (!rt2x00_rt(rt2x00dev, RT3290) &&
-+ !rt2x00_rt(rt2x00dev, RT5390)) {
-+ rt2800_bbp_read(rt2x00dev, 1, &r1);
-+ if (delta <= -12) {
-+ power_ctrl = 2;
-+ delta += 12;
-+ } else if (delta <= -6) {
-+ power_ctrl = 1;
-+ delta += 6;
-+ } else {
-+ power_ctrl = 0;
-+ }
-+ rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl);
-+ rt2800_bbp_write(rt2x00dev, 1, r1);
- }
-- rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl);
-- rt2800_bbp_write(rt2x00dev, 1, r1);
-+
- offset = TX_PWR_CFG_0;
-
- for (i = 0; i < EEPROM_TXPOWER_BYRATE_SIZE; i += 2) {
---
-1.7.11.7
-
---
-To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
-the body of a message to majordomo@vger.kernel.org
-More majordomo info at http://vger.kernel.org/majordomo-info.html \ No newline at end of file
diff --git a/freed-ora/current/f19/sources b/freed-ora/current/f19/sources
index ee88a4837..65152aeeb 100644
--- a/freed-ora/current/f19/sources
+++ b/freed-ora/current/f19/sources
@@ -1,2 +1,2 @@
120df29f88622dabf7015a22c7cc8e25 linux-libre-3.9-gnu.tar.xz
-b628d7ff09667dc5546993bb83461d45 patch-3.9-gnu-3.9.8-gnu.xz
+e143fc381f4d2fdfc18686b867a5e6a5 patch-3.9-gnu-3.9.9-gnu.xz
OpenPOWER on IntegriCloud