f2a8acbfe3
2.6.32.16 update. (#620955) - Revert upstream DRM stable fix we already have: drm-i915-give-up-on-8xx-lid-status.patch
1093 lines
36 KiB
Diff
1093 lines
36 KiB
Diff
commit 9b86cec953ee8ae21be2183f34b8c8d2fcf14ecb
|
|
Author: Alex Deucher <alexdeucher@gmail.com>
|
|
Date: Thu Feb 11 10:47:52 2010 -0500
|
|
|
|
drm/radeon/kms: remove HDP flushes from fence emit (v2)
|
|
|
|
r600_ioctl_wait_idle() now handles this.
|
|
|
|
v2: update blit fence counts
|
|
|
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 817dbb17e5e8fcdfb7bb3d18f3ceb15078dd6050
|
|
Author: Dave Airlie <airlied@redhat.com>
|
|
Date: Wed Mar 3 13:22:20 2010 +1000
|
|
|
|
drm/radeon: Add asic hook for dma copy to r200 cards.
|
|
|
|
r200 cards have dma engine which can be used to tranfer data
|
|
between vram and system memory.
|
|
|
|
r300 dma engine registers match r200 dma engine. Enabling
|
|
dma copy for r200 is simple as hooking r200 asic to already
|
|
existing function r300_copy_dma.
|
|
|
|
Rename r300_dma_copy to r200_dma_copyto reflect that supports
|
|
starts from r200 cards.
|
|
|
|
v2: Created a new asic object for r200 cards.
|
|
|
|
Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
Conflicts:
|
|
|
|
drivers/gpu/drm/radeon/r300.c
|
|
drivers/gpu/drm/radeon/radeon_asic.h
|
|
|
|
commit 30988e41d355e2011d1a340d6b889deeceeb447d
|
|
Author: Pauli Nieminen <suokkos@gmail.com>
|
|
Date: Thu Feb 11 17:55:35 2010 +0000
|
|
|
|
drm/radeon/kms: Create asic structure for r300 pcie cards.
|
|
|
|
Setting global asic structure to point to different function
|
|
would cause problem in system where is multiple r300 cards
|
|
with different bus type.
|
|
|
|
r300_asic_pcie is just copy from r300_asic with gart tlb
|
|
functions replaced with pcie versions.
|
|
|
|
Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 0faed138b285ef54c27a6c17016d8ff718c40113
|
|
Author: Jesse Barnes <jbarnes@virtuousgeek.org>
|
|
Date: Fri Feb 12 09:30:00 2010 -0800
|
|
|
|
drm/i915: give up on 8xx lid status
|
|
|
|
These old machines more often than not lie about their lid state. So
|
|
don't use it to detect LVDS presence, but leave the event handler to
|
|
deal with lid open/close, when we might need to reset the mode.
|
|
|
|
Fixes kernel bug #15248
|
|
|
|
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
|
Cc: stable@kernel.org
|
|
Signed-off-by: Eric Anholt <eric@anholt.net>
|
|
|
|
commit 19d2051901dc28cf96d2b29e5f5c5f6725e90105
|
|
Author: Jerome Glisse <jglisse@redhat.com>
|
|
Date: Fri Feb 26 19:14:12 2010 +0000
|
|
|
|
drm/radeon/kms: initialize set_surface_reg reg for rs600 asic
|
|
|
|
rs600 asic was missing set_surface_reg callback leading to
|
|
oops.
|
|
|
|
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 884d6cda747259e5ba56c00cdc8a5406a45209c9
|
|
Author: Dave Airlie <airlied@redhat.com>
|
|
Date: Thu Feb 11 14:28:58 2010 +1000
|
|
|
|
drm/kms: fix fb_changed = true else statement
|
|
|
|
a patch from Roel was wrong, fix this properly, really
|
|
if the fb ptrs are different fb changed shuold be true.
|
|
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit b6428034e4bc7c9d57d1a7394a4d77fc80737cf4
|
|
Author: Alex Deucher <alexdeucher@gmail.com>
|
|
Date: Tue Feb 23 21:56:12 2010 -0500
|
|
|
|
drm/radeon/kms/atom: fix shr/shl ops
|
|
|
|
The whole attribute table is valid for
|
|
shr/shl ops.
|
|
|
|
Fixes fdo bug 26668
|
|
|
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
|
Cc: stable@kernel.org
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 93e49a04b1118c8036ccba855c1b8b095fd6b51b
|
|
Author: Maarten Maathuis <madman2003@gmail.com>
|
|
Date: Sat Feb 20 03:22:21 2010 +0100
|
|
|
|
drm/ttm: handle OOM in ttm_tt_swapout
|
|
|
|
- Without this change I get a general protection fault.
|
|
- Also use PTR_ERR where applicable.
|
|
|
|
Signed-off-by: Maarten Maathuis <madman2003@gmail.com>
|
|
Reviewed-by: Dave Airlie <airlied@redhat.com>
|
|
Acked-by: Thomas Hellstrom <thellstrom@vmware.com>
|
|
Cc: stable@kernel.org
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 36e437d37c849da2ad35d4ba3c0662d8a06f9f9f
|
|
Author: Zhang Rui <rui.zhang@intel.com>
|
|
Date: Tue Feb 16 04:16:55 2010 -0500
|
|
|
|
ACPI, i915: blacklist Clevo M5x0N bad_lid state
|
|
|
|
Wrong Lid state reported.
|
|
Need to blacklist this machine for LVDS detection.
|
|
|
|
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
|
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
|
|
|
commit 5bf1252153707877ae62bef73fe00731972ef18b
|
|
Author: Adam Jackson <ajax@redhat.com>
|
|
Date: Mon Feb 15 22:15:39 2010 +0000
|
|
|
|
drm/edid: Fix interlaced detailed timings to be frame size, not field.
|
|
|
|
cf. https://bugzilla.redhat.com/show_bug.cgi?id=533561
|
|
|
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 268d51cd56bcf861bd668163c1b618c96d8b3701
|
|
Author: Rafael J. Wysocki <rjw@sisk.pl>
|
|
Date: Thu Feb 18 23:06:27 2010 +0100
|
|
|
|
i915 / PM: Fix hibernate regression caused by suspend/resume splitting
|
|
|
|
Commit 84b79f8d2882b0a84330c04839ed4d3cefd2ff77 (drm/i915: Fix crash
|
|
while aborting hibernation) attempted to fix a regression introduced
|
|
by commit cbda12d77ea590082edb6d30bd342a67ebc459e0 (drm/i915:
|
|
implement new pm ops for i915), but it went too far trying to split
|
|
the freeze/suspend and resume/thaw parts of the code. As a result,
|
|
it introduced another regression, which only is visible on some systems.
|
|
|
|
Fix the problem by merging i915_drm_suspend() with
|
|
i915_drm_freeze() and moving some code from i915_resume()
|
|
into i915_drm_thaw(), so that intel_opregion_free() and
|
|
intel_opregion_init() are also executed in the freeze and thaw code
|
|
paths, respectively.
|
|
|
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
|
Reported-and-tested-by: Pedro Ribeiro <pedrib@gmail.com>
|
|
Tested-by: Tino Keitel <tino.keitel@tikei.de>
|
|
Acked-by: Eric Anholt <eric@anholt.net>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
|
|
commit 8d205562d42d397086d829ba4b8f3911c3dca682
|
|
Author: Francisco Jerez <currojerez@riseup.net>
|
|
Date: Sat Feb 20 07:30:15 2010 +1000
|
|
|
|
drm/ttm: fix caching problem on non-PAT systems.
|
|
|
|
http://bugzilla.kernel.org/show_bug.cgi?id=15328
|
|
|
|
This fixes a serious regression on AGP/non-PAT systems, where
|
|
pages were ending up in the wrong state and slowing down the
|
|
whole system.
|
|
|
|
[airlied: taken this from the bug as the other option is to revert
|
|
the change which caused it].
|
|
|
|
Tested-by: John W. Linville (in bug).
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 7a2bb26f41ceb9b17805dcae93311004e03bd1d0
|
|
Author: Dave Airlie <airlied@redhat.com>
|
|
Date: Sat Feb 20 09:17:18 2010 +1000
|
|
|
|
drm/radeon: bump the UMS driver version number to indicate rv740 fix
|
|
|
|
This lets UMS userspace know the rv740 fix is in. For KMS we can
|
|
consider the kernel release to be the v2.0.0 release so we don't need the
|
|
bump there.
|
|
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 211dc7044003e3ed8c7a2e2b646bf6937b921960
|
|
Author: Jerome Glisse <jglisse@redhat.com>
|
|
Date: Thu Feb 18 13:13:29 2010 +0000
|
|
|
|
drm/radeon/kms: free fence IB if it wasn't emited at IB free time
|
|
|
|
If at IB free time fence wasn't emited that means the IB wasn't
|
|
scheduled because an error occured somewhere, thus we can free
|
|
then fence and mark the IB as free.
|
|
|
|
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit b2449d6d4de19459d616011fbed87aaa485f5e71
|
|
Author: Alex Deucher <alexdeucher@gmail.com>
|
|
Date: Fri Feb 19 16:07:02 2010 -0500
|
|
|
|
drm/radeon/rv740: fix backend setup
|
|
|
|
This patch fixes occlusion queries and rendering errors
|
|
on rv740 boards. Hardcoding the backend map is not an optimal
|
|
solution, but a better fix is being worked on.
|
|
|
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit 79b5531abdad5c266e87a5c35975e5a92f4aba20
|
|
Author: Alex Deucher <alexdeucher@gmail.com>
|
|
Date: Fri Feb 19 02:13:56 2010 -0500
|
|
|
|
drm/radeon/kms: fix shared ddc detection
|
|
|
|
Just compare the i2c id since the i2c structs
|
|
may be slighly different.
|
|
|
|
Fixes fdo bug 26616.
|
|
|
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
|
|
commit d2ffb93351a506acdfede450778964eb862e63b7
|
|
Author: Alex Deucher <alexdeucher@gmail.com>
|
|
Date: Thu Feb 18 14:14:58 2010 -0500
|
|
|
|
drm/radeon/kms/rs600: add connector quirk
|
|
|
|
rs600 board lists DVI port as HDMI.
|
|
|
|
Fixes fdo bug 26605
|
|
|
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
|
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
|
|
index 7d0f00a..f2aaf39 100644
|
|
--- a/drivers/gpu/drm/drm_crtc_helper.c
|
|
+++ b/drivers/gpu/drm/drm_crtc_helper.c
|
|
@@ -836,11 +836,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
|
mode_changed = true;
|
|
} else if (set->fb == NULL) {
|
|
mode_changed = true;
|
|
- } else if ((set->fb->bits_per_pixel !=
|
|
- set->crtc->fb->bits_per_pixel) ||
|
|
- set->fb->depth != set->crtc->fb->depth)
|
|
- fb_changed = true;
|
|
- else
|
|
+ } else
|
|
fb_changed = true;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index f41e91c..f97e7c4 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -598,6 +598,50 @@ struct drm_display_mode *drm_mode_std(struct drm_device *dev,
|
|
return mode;
|
|
}
|
|
|
|
+/*
|
|
+ * EDID is delightfully ambiguous about how interlaced modes are to be
|
|
+ * encoded. Our internal representation is of frame height, but some
|
|
+ * HDTV detailed timings are encoded as field height.
|
|
+ *
|
|
+ * The format list here is from CEA, in frame size. Technically we
|
|
+ * should be checking refresh rate too. Whatever.
|
|
+ */
|
|
+static void
|
|
+drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
|
|
+ struct detailed_pixel_timing *pt)
|
|
+{
|
|
+ int i;
|
|
+ static const struct {
|
|
+ int w, h;
|
|
+ } cea_interlaced[] = {
|
|
+ { 1920, 1080 },
|
|
+ { 720, 480 },
|
|
+ { 1440, 480 },
|
|
+ { 2880, 480 },
|
|
+ { 720, 576 },
|
|
+ { 1440, 576 },
|
|
+ { 2880, 576 },
|
|
+ };
|
|
+ static const int n_sizes =
|
|
+ sizeof(cea_interlaced)/sizeof(cea_interlaced[0]);
|
|
+
|
|
+ if (!(pt->misc & DRM_EDID_PT_INTERLACED))
|
|
+ return;
|
|
+
|
|
+ for (i = 0; i < n_sizes; i++) {
|
|
+ if ((mode->hdisplay == cea_interlaced[i].w) &&
|
|
+ (mode->vdisplay == cea_interlaced[i].h / 2)) {
|
|
+ mode->vdisplay *= 2;
|
|
+ mode->vsync_start *= 2;
|
|
+ mode->vsync_end *= 2;
|
|
+ mode->vtotal *= 2;
|
|
+ mode->vtotal |= 1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ mode->flags |= DRM_MODE_FLAG_INTERLACE;
|
|
+}
|
|
+
|
|
/**
|
|
* drm_mode_detailed - create a new mode from an EDID detailed timing section
|
|
* @dev: DRM device (needed to create new mode)
|
|
@@ -680,8 +724,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
|
|
|
|
drm_mode_set_name(mode);
|
|
|
|
- if (pt->misc & DRM_EDID_PT_INTERLACED)
|
|
- mode->flags |= DRM_MODE_FLAG_INTERLACE;
|
|
+ drm_mode_do_interlace_quirk(mode, pt);
|
|
|
|
if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
|
|
pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE;
|
|
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
|
|
index 79beffc..cf4cb3e 100644
|
|
--- a/drivers/gpu/drm/i915/i915_drv.c
|
|
+++ b/drivers/gpu/drm/i915/i915_drv.c
|
|
@@ -176,6 +176,8 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
|
|
|
|
static int i915_drm_freeze(struct drm_device *dev)
|
|
{
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
+
|
|
pci_save_state(dev->pdev);
|
|
|
|
/* If KMS is active, we do the leavevt stuff here */
|
|
@@ -191,17 +193,12 @@ static int i915_drm_freeze(struct drm_device *dev)
|
|
|
|
i915_save_state(dev);
|
|
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void i915_drm_suspend(struct drm_device *dev)
|
|
-{
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
-
|
|
intel_opregion_free(dev, 1);
|
|
|
|
/* Modeset on resume, not lid events */
|
|
dev_priv->modeset_on_lid = 0;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int i915_suspend(struct drm_device *dev, pm_message_t state)
|
|
@@ -221,8 +218,6 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)
|
|
if (error)
|
|
return error;
|
|
|
|
- i915_drm_suspend(dev);
|
|
-
|
|
if (state.event == PM_EVENT_SUSPEND) {
|
|
/* Shut down the device */
|
|
pci_disable_device(dev->pdev);
|
|
@@ -237,6 +232,10 @@ static int i915_drm_thaw(struct drm_device *dev)
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
int error = 0;
|
|
|
|
+ i915_restore_state(dev);
|
|
+
|
|
+ intel_opregion_init(dev, 1);
|
|
+
|
|
/* KMS EnterVT equivalent */
|
|
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
|
mutex_lock(&dev->struct_mutex);
|
|
@@ -263,10 +262,6 @@ static int i915_resume(struct drm_device *dev)
|
|
|
|
pci_set_master(dev->pdev);
|
|
|
|
- i915_restore_state(dev);
|
|
-
|
|
- intel_opregion_init(dev, 1);
|
|
-
|
|
return i915_drm_thaw(dev);
|
|
}
|
|
|
|
@@ -423,8 +418,6 @@ static int i915_pm_suspend(struct device *dev)
|
|
if (error)
|
|
return error;
|
|
|
|
- i915_drm_suspend(drm_dev);
|
|
-
|
|
pci_disable_device(pdev);
|
|
pci_set_power_state(pdev, PCI_D3hot);
|
|
|
|
@@ -464,13 +457,8 @@ static int i915_pm_poweroff(struct device *dev)
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
|
- int error;
|
|
-
|
|
- error = i915_drm_freeze(drm_dev);
|
|
- if (!error)
|
|
- i915_drm_suspend(drm_dev);
|
|
|
|
- return error;
|
|
+ return i915_drm_freeze(drm_dev);
|
|
}
|
|
|
|
const struct dev_pm_ops i915_pm_ops = {
|
|
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
|
index b1d0acb..93031a7 100644
|
|
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
@@ -636,6 +636,13 @@ static const struct dmi_system_id bad_lid_status[] = {
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "PC-81005"),
|
|
},
|
|
},
|
|
+ {
|
|
+ .ident = "Clevo M5x0N",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
|
|
+ DMI_MATCH(DMI_BOARD_NAME, "M5x0N"),
|
|
+ },
|
|
+ },
|
|
{ }
|
|
};
|
|
|
|
@@ -648,8 +655,15 @@ static const struct dmi_system_id bad_lid_status[] = {
|
|
*/
|
|
static enum drm_connector_status intel_lvds_detect(struct drm_connector *connector)
|
|
{
|
|
+ struct drm_device *dev = connector->dev;
|
|
enum drm_connector_status status = connector_status_connected;
|
|
|
|
+ /* ACPI lid methods were generally unreliable in this generation, so
|
|
+ * don't even bother.
|
|
+ */
|
|
+ if (IS_I8XX(dev))
|
|
+ return connector_status_connected;
|
|
+
|
|
if (!dmi_check_system(bad_lid_status) && !acpi_lid_open())
|
|
status = connector_status_disconnected;
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
|
|
index 592ce91..4362f82 100644
|
|
--- a/drivers/gpu/drm/radeon/atom.c
|
|
+++ b/drivers/gpu/drm/radeon/atom.c
|
|
@@ -882,8 +882,6 @@ static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg)
|
|
uint8_t attr = U8((*ptr)++), shift;
|
|
uint32_t saved, dst;
|
|
int dptr = *ptr;
|
|
- attr &= 0x38;
|
|
- attr |= atom_def_dst[attr >> 3] << 6;
|
|
SDEBUG(" dst: ");
|
|
dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
|
|
shift = atom_get_src(ctx, attr, ptr);
|
|
@@ -898,8 +896,6 @@ static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg)
|
|
uint8_t attr = U8((*ptr)++), shift;
|
|
uint32_t saved, dst;
|
|
int dptr = *ptr;
|
|
- attr &= 0x38;
|
|
- attr |= atom_def_dst[attr >> 3] << 6;
|
|
SDEBUG(" dst: ");
|
|
dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
|
|
shift = atom_get_src(ctx, attr, ptr);
|
|
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
|
|
index ff1e0cd..1146c99 100644
|
|
--- a/drivers/gpu/drm/radeon/r200.c
|
|
+++ b/drivers/gpu/drm/radeon/r200.c
|
|
@@ -31,6 +31,7 @@
|
|
#include "radeon_reg.h"
|
|
#include "radeon.h"
|
|
|
|
+#include "r100d.h"
|
|
#include "r200_reg_safe.h"
|
|
|
|
#include "r100_track.h"
|
|
@@ -79,6 +80,51 @@ static int r200_get_vtx_size_0(uint32_t vtx_fmt_0)
|
|
return vtx_size;
|
|
}
|
|
|
|
+int r200_copy_dma(struct radeon_device *rdev,
|
|
+ uint64_t src_offset,
|
|
+ uint64_t dst_offset,
|
|
+ unsigned num_pages,
|
|
+ struct radeon_fence *fence)
|
|
+{
|
|
+ uint32_t size;
|
|
+ uint32_t cur_size;
|
|
+ int i, num_loops;
|
|
+ int r = 0;
|
|
+
|
|
+ /* radeon pitch is /64 */
|
|
+ size = num_pages << PAGE_SHIFT;
|
|
+ num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
|
|
+ r = radeon_ring_lock(rdev, num_loops * 4 + 64);
|
|
+ if (r) {
|
|
+ DRM_ERROR("radeon: moving bo (%d).\n", r);
|
|
+ return r;
|
|
+ }
|
|
+ /* Must wait for 2D idle & clean before DMA or hangs might happen */
|
|
+ radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
|
|
+ radeon_ring_write(rdev, (1 << 16));
|
|
+ for (i = 0; i < num_loops; i++) {
|
|
+ cur_size = size;
|
|
+ if (cur_size > 0x1FFFFF) {
|
|
+ cur_size = 0x1FFFFF;
|
|
+ }
|
|
+ size -= cur_size;
|
|
+ radeon_ring_write(rdev, PACKET0(0x720, 2));
|
|
+ radeon_ring_write(rdev, src_offset);
|
|
+ radeon_ring_write(rdev, dst_offset);
|
|
+ radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30));
|
|
+ src_offset += cur_size;
|
|
+ dst_offset += cur_size;
|
|
+ }
|
|
+ radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
|
|
+ radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE);
|
|
+ if (fence) {
|
|
+ r = radeon_fence_emit(rdev, fence);
|
|
+ }
|
|
+ radeon_ring_unlock_commit(rdev);
|
|
+ return r;
|
|
+}
|
|
+
|
|
+
|
|
static int r200_get_vtx_size_1(uint32_t vtx_fmt_1)
|
|
{
|
|
int vtx_size, i, tex_size;
|
|
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
|
|
index 43b55a0..6516cd6 100644
|
|
--- a/drivers/gpu/drm/radeon/r300.c
|
|
+++ b/drivers/gpu/drm/radeon/r300.c
|
|
@@ -198,50 +198,6 @@ void r300_fence_ring_emit(struct radeon_device *rdev,
|
|
radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
|
|
}
|
|
|
|
-int r300_copy_dma(struct radeon_device *rdev,
|
|
- uint64_t src_offset,
|
|
- uint64_t dst_offset,
|
|
- unsigned num_pages,
|
|
- struct radeon_fence *fence)
|
|
-{
|
|
- uint32_t size;
|
|
- uint32_t cur_size;
|
|
- int i, num_loops;
|
|
- int r = 0;
|
|
-
|
|
- /* radeon pitch is /64 */
|
|
- size = num_pages << PAGE_SHIFT;
|
|
- num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
|
|
- r = radeon_ring_lock(rdev, num_loops * 4 + 64);
|
|
- if (r) {
|
|
- DRM_ERROR("radeon: moving bo (%d).\n", r);
|
|
- return r;
|
|
- }
|
|
- /* Must wait for 2D idle & clean before DMA or hangs might happen */
|
|
- radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 ));
|
|
- radeon_ring_write(rdev, (1 << 16));
|
|
- for (i = 0; i < num_loops; i++) {
|
|
- cur_size = size;
|
|
- if (cur_size > 0x1FFFFF) {
|
|
- cur_size = 0x1FFFFF;
|
|
- }
|
|
- size -= cur_size;
|
|
- radeon_ring_write(rdev, PACKET0(0x720, 2));
|
|
- radeon_ring_write(rdev, src_offset);
|
|
- radeon_ring_write(rdev, dst_offset);
|
|
- radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30));
|
|
- src_offset += cur_size;
|
|
- dst_offset += cur_size;
|
|
- }
|
|
- radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
|
|
- radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE);
|
|
- if (fence) {
|
|
- r = radeon_fence_emit(rdev, fence);
|
|
- }
|
|
- radeon_ring_unlock_commit(rdev);
|
|
- return r;
|
|
-}
|
|
-
|
|
void r300_ring_start(struct radeon_device *rdev)
|
|
{
|
|
unsigned gb_tile_config;
|
|
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
|
|
index 91f5af9..526b3ec 100644
|
|
--- a/drivers/gpu/drm/radeon/r600.c
|
|
+++ b/drivers/gpu/drm/radeon/r600.c
|
|
@@ -1797,8 +1797,6 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
|
|
radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
|
|
radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
|
|
radeon_ring_write(rdev, fence->seq);
|
|
- radeon_ring_write(rdev, PACKET0(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
|
|
- radeon_ring_write(rdev, 1);
|
|
/* CP_INTERRUPT packet 3 no longer exists, use packet 0 */
|
|
radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0));
|
|
radeon_ring_write(rdev, RB_INT_STAT);
|
|
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
|
|
index ec49dad..de8bbbc 100644
|
|
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
|
|
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
|
|
@@ -576,9 +576,9 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, int size_bytes)
|
|
ring_size = num_loops * dwords_per_loop;
|
|
/* set default + shaders */
|
|
ring_size += 40; /* shaders + def state */
|
|
- ring_size += 12; /* fence emit for VB IB */
|
|
+ ring_size += 10; /* fence emit for VB IB */
|
|
ring_size += 5; /* done copy */
|
|
- ring_size += 12; /* fence emit for done copy */
|
|
+ ring_size += 10; /* fence emit for done copy */
|
|
r = radeon_ring_lock(rdev, ring_size);
|
|
if (r)
|
|
return r;
|
|
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
|
|
index 6d5a711..75bcf35 100644
|
|
--- a/drivers/gpu/drm/radeon/r600_cp.c
|
|
+++ b/drivers/gpu/drm/radeon/r600_cp.c
|
|
@@ -1428,9 +1428,12 @@ static void r700_gfx_init(struct drm_device *dev,
|
|
|
|
gb_tiling_config |= R600_BANK_SWAPS(1);
|
|
|
|
- backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
|
|
- dev_priv->r600_max_backends,
|
|
- (0xff << dev_priv->r600_max_backends) & 0xff);
|
|
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV740)
|
|
+ backend_map = 0x28;
|
|
+ else
|
|
+ backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
|
|
+ dev_priv->r600_max_backends,
|
|
+ (0xff << dev_priv->r600_max_backends) & 0xff);
|
|
gb_tiling_config |= R600_BACKEND_MAP(backend_map);
|
|
|
|
cc_gc_shader_pipe_config =
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
|
|
index 05ee1ae..afb3ddb 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_asic.h
|
|
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
|
|
@@ -43,7 +43,7 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev, uint32_t mem_clock
|
|
void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
|
|
|
|
/*
|
|
- * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
|
|
+ * r100,rv100,rs100,rv200,rs200
|
|
*/
|
|
extern int r100_init(struct radeon_device *rdev);
|
|
extern void r100_fini(struct radeon_device *rdev);
|
|
@@ -120,6 +120,51 @@ static struct radeon_asic r100_asic = {
|
|
.ioctl_wait_idle = NULL,
|
|
};
|
|
|
|
+/*
|
|
+ * r200,rv250,rs300,rv280
|
|
+ */
|
|
+extern int r200_copy_dma(struct radeon_device *rdev,
|
|
+ uint64_t src_offset,
|
|
+ uint64_t dst_offset,
|
|
+ unsigned num_pages,
|
|
+ struct radeon_fence *fence);
|
|
+static struct radeon_asic r200_asic = {
|
|
+ .init = &r100_init,
|
|
+ .fini = &r100_fini,
|
|
+ .suspend = &r100_suspend,
|
|
+ .resume = &r100_resume,
|
|
+ .vga_set_state = &r100_vga_set_state,
|
|
+ .gpu_reset = &r100_gpu_reset,
|
|
+ .gart_tlb_flush = &r100_pci_gart_tlb_flush,
|
|
+ .gart_set_page = &r100_pci_gart_set_page,
|
|
+ .cp_commit = &r100_cp_commit,
|
|
+ .ring_start = &r100_ring_start,
|
|
+ .ring_test = &r100_ring_test,
|
|
+ .ring_ib_execute = &r100_ring_ib_execute,
|
|
+ .irq_set = &r100_irq_set,
|
|
+ .irq_process = &r100_irq_process,
|
|
+ .get_vblank_counter = &r100_get_vblank_counter,
|
|
+ .fence_ring_emit = &r100_fence_ring_emit,
|
|
+ .cs_parse = &r100_cs_parse,
|
|
+ .copy_blit = &r100_copy_blit,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
+ .copy = &r100_copy_blit,
|
|
+ .get_engine_clock = &radeon_legacy_get_engine_clock,
|
|
+ .set_engine_clock = &radeon_legacy_set_engine_clock,
|
|
+ .get_memory_clock = &radeon_legacy_get_memory_clock,
|
|
+ .set_memory_clock = NULL,
|
|
+ .set_pcie_lanes = NULL,
|
|
+ .set_clock_gating = &radeon_legacy_set_clock_gating,
|
|
+ .set_surface_reg = r100_set_surface_reg,
|
|
+ .clear_surface_reg = r100_clear_surface_reg,
|
|
+ .bandwidth_update = &r100_bandwidth_update,
|
|
+ .hpd_init = &r100_hpd_init,
|
|
+ .hpd_fini = &r100_hpd_fini,
|
|
+ .hpd_sense = &r100_hpd_sense,
|
|
+ .hpd_set_polarity = &r100_hpd_set_polarity,
|
|
+ .ioctl_wait_idle = NULL,
|
|
+};
|
|
+
|
|
|
|
/*
|
|
* r300,r350,rv350,rv380
|
|
@@ -138,11 +183,6 @@ extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t
|
|
extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg);
|
|
extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
|
extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
|
|
-extern int r300_copy_dma(struct radeon_device *rdev,
|
|
- uint64_t src_offset,
|
|
- uint64_t dst_offset,
|
|
- unsigned num_pages,
|
|
- struct radeon_fence *fence);
|
|
static struct radeon_asic r300_asic = {
|
|
.init = &r300_init,
|
|
.fini = &r300_fini,
|
|
@@ -162,7 +202,45 @@ static struct radeon_asic r300_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
+ .copy = &r100_copy_blit,
|
|
+ .get_engine_clock = &radeon_legacy_get_engine_clock,
|
|
+ .set_engine_clock = &radeon_legacy_set_engine_clock,
|
|
+ .get_memory_clock = &radeon_legacy_get_memory_clock,
|
|
+ .set_memory_clock = NULL,
|
|
+ .set_pcie_lanes = &rv370_set_pcie_lanes,
|
|
+ .set_clock_gating = &radeon_legacy_set_clock_gating,
|
|
+ .set_surface_reg = r100_set_surface_reg,
|
|
+ .clear_surface_reg = r100_clear_surface_reg,
|
|
+ .bandwidth_update = &r100_bandwidth_update,
|
|
+ .hpd_init = &r100_hpd_init,
|
|
+ .hpd_fini = &r100_hpd_fini,
|
|
+ .hpd_sense = &r100_hpd_sense,
|
|
+ .hpd_set_polarity = &r100_hpd_set_polarity,
|
|
+ .ioctl_wait_idle = NULL,
|
|
+};
|
|
+
|
|
+
|
|
+static struct radeon_asic r300_asic_pcie = {
|
|
+ .init = &r300_init,
|
|
+ .fini = &r300_fini,
|
|
+ .suspend = &r300_suspend,
|
|
+ .resume = &r300_resume,
|
|
+ .vga_set_state = &r100_vga_set_state,
|
|
+ .gpu_reset = &r300_gpu_reset,
|
|
+ .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
|
|
+ .gart_set_page = &rv370_pcie_gart_set_page,
|
|
+ .cp_commit = &r100_cp_commit,
|
|
+ .ring_start = &r300_ring_start,
|
|
+ .ring_test = &r100_ring_test,
|
|
+ .ring_ib_execute = &r100_ring_ib_execute,
|
|
+ .irq_set = &r100_irq_set,
|
|
+ .irq_process = &r100_irq_process,
|
|
+ .get_vblank_counter = &r100_get_vblank_counter,
|
|
+ .fence_ring_emit = &r300_fence_ring_emit,
|
|
+ .cs_parse = &r300_cs_parse,
|
|
+ .copy_blit = &r100_copy_blit,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
.copy = &r100_copy_blit,
|
|
.get_engine_clock = &radeon_legacy_get_engine_clock,
|
|
.set_engine_clock = &radeon_legacy_set_engine_clock,
|
|
@@ -206,7 +284,7 @@ static struct radeon_asic r420_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
.copy = &r100_copy_blit,
|
|
.get_engine_clock = &radeon_atom_get_engine_clock,
|
|
.set_engine_clock = &radeon_atom_set_engine_clock,
|
|
@@ -255,7 +333,7 @@ static struct radeon_asic rs400_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
.copy = &r100_copy_blit,
|
|
.get_engine_clock = &radeon_legacy_get_engine_clock,
|
|
.set_engine_clock = &radeon_legacy_set_engine_clock,
|
|
@@ -314,7 +392,7 @@ static struct radeon_asic rs600_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
.copy = &r100_copy_blit,
|
|
.get_engine_clock = &radeon_atom_get_engine_clock,
|
|
.set_engine_clock = &radeon_atom_set_engine_clock,
|
|
@@ -322,6 +400,8 @@ static struct radeon_asic rs600_asic = {
|
|
.set_memory_clock = &radeon_atom_set_memory_clock,
|
|
.set_pcie_lanes = NULL,
|
|
.set_clock_gating = &radeon_atom_set_clock_gating,
|
|
+ .set_surface_reg = r100_set_surface_reg,
|
|
+ .clear_surface_reg = r100_clear_surface_reg,
|
|
.bandwidth_update = &rs600_bandwidth_update,
|
|
.hpd_init = &rs600_hpd_init,
|
|
.hpd_fini = &rs600_hpd_fini,
|
|
@@ -360,8 +440,8 @@ static struct radeon_asic rs690_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
- .copy = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
+ .copy = &r200_copy_dma,
|
|
.get_engine_clock = &radeon_atom_get_engine_clock,
|
|
.set_engine_clock = &radeon_atom_set_engine_clock,
|
|
.get_memory_clock = &radeon_atom_get_memory_clock,
|
|
@@ -412,7 +492,7 @@ static struct radeon_asic rv515_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
.copy = &r100_copy_blit,
|
|
.get_engine_clock = &radeon_atom_get_engine_clock,
|
|
.set_engine_clock = &radeon_atom_set_engine_clock,
|
|
@@ -455,7 +535,7 @@ static struct radeon_asic r520_asic = {
|
|
.fence_ring_emit = &r300_fence_ring_emit,
|
|
.cs_parse = &r300_cs_parse,
|
|
.copy_blit = &r100_copy_blit,
|
|
- .copy_dma = &r300_copy_dma,
|
|
+ .copy_dma = &r200_copy_dma,
|
|
.copy = &r100_copy_blit,
|
|
.get_engine_clock = &radeon_atom_get_engine_clock,
|
|
.set_engine_clock = &radeon_atom_set_engine_clock,
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
|
|
index 2dcda61..4d88315 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
|
|
@@ -206,6 +206,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
|
*connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
}
|
|
|
|
+ /* Asrock RS600 board lists the DVI port as HDMI */
|
|
+ if ((dev->pdev->device == 0x7941) &&
|
|
+ (dev->pdev->subsystem_vendor == 0x1849) &&
|
|
+ (dev->pdev->subsystem_device == 0x7941)) {
|
|
+ if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
|
|
+ (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
|
|
+ *connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
+ }
|
|
+
|
|
/* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
|
|
if ((dev->pdev->device == 0x7941) &&
|
|
(dev->pdev->subsystem_vendor == 0x147b) &&
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
|
|
index 2381885..65f8194 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
|
@@ -780,7 +780,7 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
|
|
* connected and the DVI port disconnected. If the edid doesn't
|
|
* say HDMI, vice versa.
|
|
*/
|
|
- if (radeon_connector->shared_ddc && connector_status_connected) {
|
|
+ if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_connector *list_connector;
|
|
struct radeon_connector *list_radeon_connector;
|
|
@@ -1060,8 +1060,7 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|
return;
|
|
}
|
|
if (radeon_connector->ddc_bus && i2c_bus->valid) {
|
|
- if (memcmp(&radeon_connector->ddc_bus->rec, i2c_bus,
|
|
- sizeof(struct radeon_i2c_bus_rec)) == 0) {
|
|
+ if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
|
|
radeon_connector->shared_ddc = true;
|
|
shared_ddc = true;
|
|
}
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
|
|
index 768b150..767aed8 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_device.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_device.c
|
|
@@ -329,21 +329,22 @@ int radeon_asic_init(struct radeon_device *rdev)
|
|
case CHIP_RS100:
|
|
case CHIP_RV200:
|
|
case CHIP_RS200:
|
|
+ rdev->asic = &r100_asic;
|
|
+ break;
|
|
case CHIP_R200:
|
|
case CHIP_RV250:
|
|
case CHIP_RS300:
|
|
case CHIP_RV280:
|
|
- rdev->asic = &r100_asic;
|
|
+ rdev->asic = &r200_asic;
|
|
break;
|
|
case CHIP_R300:
|
|
case CHIP_R350:
|
|
case CHIP_RV350:
|
|
case CHIP_RV380:
|
|
- rdev->asic = &r300_asic;
|
|
- if (rdev->flags & RADEON_IS_PCIE) {
|
|
- rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
|
|
- rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
|
|
- }
|
|
+ if (rdev->flags & RADEON_IS_PCIE)
|
|
+ rdev->asic = &r300_asic_pcie;
|
|
+ else
|
|
+ rdev->asic = &r300_asic;
|
|
break;
|
|
case CHIP_R420:
|
|
case CHIP_R423:
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h
|
|
index e137852..c57ad60 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_drv.h
|
|
+++ b/drivers/gpu/drm/radeon/radeon_drv.h
|
|
@@ -106,9 +106,10 @@
|
|
* 1.29- R500 3D cmd buffer support
|
|
* 1.30- Add support for occlusion queries
|
|
* 1.31- Add support for num Z pipes from GET_PARAM
|
|
+ * 1.32- fixes for rv740 setup
|
|
*/
|
|
#define DRIVER_MAJOR 1
|
|
-#define DRIVER_MINOR 31
|
|
+#define DRIVER_MINOR 32
|
|
#define DRIVER_PATCHLEVEL 0
|
|
|
|
enum radeon_cp_microcode_version {
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
|
|
index 694799f..6579eb4 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_ring.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
|
|
@@ -100,6 +100,8 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib)
|
|
if (tmp == NULL) {
|
|
return;
|
|
}
|
|
+ if (!tmp->fence->emited)
|
|
+ radeon_fence_unref(&tmp->fence);
|
|
mutex_lock(&rdev->ib_pool.mutex);
|
|
tmp->free = true;
|
|
mutex_unlock(&rdev->ib_pool.mutex);
|
|
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
|
|
index 5943d56..0302167 100644
|
|
--- a/drivers/gpu/drm/radeon/rv770.c
|
|
+++ b/drivers/gpu/drm/radeon/rv770.c
|
|
@@ -549,9 +549,12 @@ static void rv770_gpu_init(struct radeon_device *rdev)
|
|
|
|
gb_tiling_config |= BANK_SWAPS(1);
|
|
|
|
- backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
|
|
- rdev->config.rv770.max_backends,
|
|
- (0xff << rdev->config.rv770.max_backends) & 0xff);
|
|
+ if (rdev->family == CHIP_RV740)
|
|
+ backend_map = 0x28;
|
|
+ else
|
|
+ backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
|
|
+ rdev->config.rv770.max_backends,
|
|
+ (0xff << rdev->config.rv770.max_backends) & 0xff);
|
|
gb_tiling_config |= BACKEND_MAP(backend_map);
|
|
|
|
cc_gc_shader_pipe_config =
|
|
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
|
|
index e2123af..a759170 100644
|
|
--- a/drivers/gpu/drm/ttm/ttm_tt.c
|
|
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
|
|
@@ -196,14 +196,15 @@ EXPORT_SYMBOL(ttm_tt_populate);
|
|
|
|
#ifdef CONFIG_X86
|
|
static inline int ttm_tt_set_page_caching(struct page *p,
|
|
- enum ttm_caching_state c_state)
|
|
+ enum ttm_caching_state c_old,
|
|
+ enum ttm_caching_state c_new)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (PageHighMem(p))
|
|
return 0;
|
|
|
|
- if (get_page_memtype(p) != -1) {
|
|
+ if (c_old != tt_cached) {
|
|
/* p isn't in the default caching state, set it to
|
|
* writeback first to free its current memtype. */
|
|
|
|
@@ -212,16 +213,17 @@ static inline int ttm_tt_set_page_caching(struct page *p,
|
|
return ret;
|
|
}
|
|
|
|
- if (c_state == tt_wc)
|
|
+ if (c_new == tt_wc)
|
|
ret = set_memory_wc((unsigned long) page_address(p), 1);
|
|
- else if (c_state == tt_uncached)
|
|
+ else if (c_new == tt_uncached)
|
|
ret = set_pages_uc(p, 1);
|
|
|
|
return ret;
|
|
}
|
|
#else /* CONFIG_X86 */
|
|
static inline int ttm_tt_set_page_caching(struct page *p,
|
|
- enum ttm_caching_state c_state)
|
|
+ enum ttm_caching_state c_old,
|
|
+ enum ttm_caching_state c_new)
|
|
{
|
|
return 0;
|
|
}
|
|
@@ -254,7 +256,9 @@ static int ttm_tt_set_caching(struct ttm_tt *ttm,
|
|
for (i = 0; i < ttm->num_pages; ++i) {
|
|
cur_page = ttm->pages[i];
|
|
if (likely(cur_page != NULL)) {
|
|
- ret = ttm_tt_set_page_caching(cur_page, c_state);
|
|
+ ret = ttm_tt_set_page_caching(cur_page,
|
|
+ ttm->caching_state,
|
|
+ c_state);
|
|
if (unlikely(ret != 0))
|
|
goto out_err;
|
|
}
|
|
@@ -268,7 +272,7 @@ out_err:
|
|
for (j = 0; j < i; ++j) {
|
|
cur_page = ttm->pages[j];
|
|
if (likely(cur_page != NULL)) {
|
|
- (void)ttm_tt_set_page_caching(cur_page,
|
|
+ (void)ttm_tt_set_page_caching(cur_page, c_state,
|
|
ttm->caching_state);
|
|
}
|
|
}
|
|
@@ -476,7 +480,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
void *from_virtual;
|
|
void *to_virtual;
|
|
int i;
|
|
- int ret;
|
|
+ int ret = -ENOMEM;
|
|
|
|
if (ttm->page_flags & TTM_PAGE_FLAG_USER) {
|
|
ret = ttm_tt_set_user(ttm, ttm->tsk, ttm->start,
|
|
@@ -495,8 +499,10 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
|
|
for (i = 0; i < ttm->num_pages; ++i) {
|
|
from_page = read_mapping_page(swap_space, i, NULL);
|
|
- if (IS_ERR(from_page))
|
|
+ if (IS_ERR(from_page)) {
|
|
+ ret = PTR_ERR(from_page);
|
|
goto out_err;
|
|
+ }
|
|
to_page = __ttm_tt_get_page(ttm, i);
|
|
if (unlikely(to_page == NULL))
|
|
goto out_err;
|
|
@@ -519,7 +525,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
return 0;
|
|
out_err:
|
|
ttm_tt_free_alloced_pages(ttm);
|
|
- return -ENOMEM;
|
|
+ return ret;
|
|
}
|
|
|
|
int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|
@@ -531,6 +537,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|
void *from_virtual;
|
|
void *to_virtual;
|
|
int i;
|
|
+ int ret = -ENOMEM;
|
|
|
|
BUG_ON(ttm->state != tt_unbound && ttm->state != tt_unpopulated);
|
|
BUG_ON(ttm->caching_state != tt_cached);
|
|
@@ -553,7 +560,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|
0);
|
|
if (unlikely(IS_ERR(swap_storage))) {
|
|
printk(KERN_ERR "Failed allocating swap storage.\n");
|
|
- return -ENOMEM;
|
|
+ return PTR_ERR(swap_storage);
|
|
}
|
|
} else
|
|
swap_storage = persistant_swap_storage;
|
|
@@ -565,9 +572,10 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
|
if (unlikely(from_page == NULL))
|
|
continue;
|
|
to_page = read_mapping_page(swap_space, i, NULL);
|
|
- if (unlikely(to_page == NULL))
|
|
+ if (unlikely(IS_ERR(to_page))) {
|
|
+ ret = PTR_ERR(to_page);
|
|
goto out_err;
|
|
-
|
|
+ }
|
|
preempt_disable();
|
|
from_virtual = kmap_atomic(from_page, KM_USER0);
|
|
to_virtual = kmap_atomic(to_page, KM_USER1);
|
|
@@ -591,5 +599,5 @@ out_err:
|
|
if (!persistant_swap_storage)
|
|
fput(swap_storage);
|
|
|
|
- return -ENOMEM;
|
|
+ return ret;
|
|
}
|