Commit fd98a5d7 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
  drm/radeon/kms: add pci id to acer travelmate quirk for 5730
  drm/radeon: fix order of doing things in radeon_crtc_cursor_set
  drm: mm: fix debug output
  drm/radeon/kms: ATPX switcheroo fixes
  drm/nouveau: Fix a crash at card takedown for NV40 and older cards
parents 7f4238a0 4f87af46
...@@ -431,7 +431,7 @@ EXPORT_SYMBOL(drm_mm_search_free_in_range); ...@@ -431,7 +431,7 @@ EXPORT_SYMBOL(drm_mm_search_free_in_range);
void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new) void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new)
{ {
list_replace(&old->node_list, &new->node_list); list_replace(&old->node_list, &new->node_list);
list_replace(&old->node_list, &new->hole_stack); list_replace(&old->hole_stack, &new->hole_stack);
new->hole_follows = old->hole_follows; new->hole_follows = old->hole_follows;
new->mm = old->mm; new->mm = old->mm;
new->start = old->start; new->start = old->start;
...@@ -699,8 +699,8 @@ int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm) ...@@ -699,8 +699,8 @@ int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm)
entry->size); entry->size);
total_used += entry->size; total_used += entry->size;
if (entry->hole_follows) { if (entry->hole_follows) {
hole_start = drm_mm_hole_node_start(&mm->head_node); hole_start = drm_mm_hole_node_start(entry);
hole_end = drm_mm_hole_node_end(&mm->head_node); hole_end = drm_mm_hole_node_end(entry);
hole_size = hole_end - hole_start; hole_size = hole_end - hole_start;
seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n", seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n",
hole_start, hole_end, hole_size); hole_start, hole_end, hole_size);
......
...@@ -152,8 +152,6 @@ nouveau_mem_vram_fini(struct drm_device *dev) ...@@ -152,8 +152,6 @@ nouveau_mem_vram_fini(struct drm_device *dev)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
nouveau_bo_ref(NULL, &dev_priv->vga_ram);
ttm_bo_device_release(&dev_priv->ttm.bdev); ttm_bo_device_release(&dev_priv->ttm.bdev);
nouveau_ttm_global_release(dev_priv); nouveau_ttm_global_release(dev_priv);
......
...@@ -768,6 +768,11 @@ static void nouveau_card_takedown(struct drm_device *dev) ...@@ -768,6 +768,11 @@ static void nouveau_card_takedown(struct drm_device *dev)
engine->mc.takedown(dev); engine->mc.takedown(dev);
engine->display.late_takedown(dev); engine->display.late_takedown(dev);
if (dev_priv->vga_ram) {
nouveau_bo_unpin(dev_priv->vga_ram);
nouveau_bo_ref(NULL, &dev_priv->vga_ram);
}
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM); ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM);
ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT); ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT);
......
...@@ -431,7 +431,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, ...@@ -431,7 +431,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
} }
} }
/* Acer laptop (Acer TravelMate 5730G) has an HDMI port /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port
* on the laptop and a DVI port on the docking station and * on the laptop and a DVI port on the docking station and
* both share the same encoder, hpd pin, and ddc line. * both share the same encoder, hpd pin, and ddc line.
* So while the bios table is technically correct, * So while the bios table is technically correct,
...@@ -440,7 +440,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, ...@@ -440,7 +440,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
* with different crtcs which isn't possible on the hardware * with different crtcs which isn't possible on the hardware
* side and leaves no crtcs for LVDS or VGA. * side and leaves no crtcs for LVDS or VGA.
*/ */
if ((dev->pdev->device == 0x95c4) && if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) &&
(dev->pdev->subsystem_vendor == 0x1025) && (dev->pdev->subsystem_vendor == 0x1025) &&
(dev->pdev->subsystem_device == 0x013c)) { (dev->pdev->subsystem_device == 0x013c)) {
if ((*connector_type == DRM_MODE_CONNECTOR_DVII) && if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
......
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
#define ATPX_VERSION 0 #define ATPX_VERSION 0
#define ATPX_GPU_PWR 2 #define ATPX_GPU_PWR 2
#define ATPX_MUX_SELECT 3 #define ATPX_MUX_SELECT 3
#define ATPX_I2C_MUX_SELECT 4
#define ATPX_SWITCH_START 5
#define ATPX_SWITCH_END 6
#define ATPX_INTEGRATED 0 #define ATPX_INTEGRATED 0
#define ATPX_DISCRETE 1 #define ATPX_DISCRETE 1
...@@ -149,13 +152,35 @@ static int radeon_atpx_switch_mux(acpi_handle handle, int mux_id) ...@@ -149,13 +152,35 @@ static int radeon_atpx_switch_mux(acpi_handle handle, int mux_id)
return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id); return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id);
} }
static int radeon_atpx_switch_i2c_mux(acpi_handle handle, int mux_id)
{
return radeon_atpx_execute(handle, ATPX_I2C_MUX_SELECT, mux_id);
}
static int radeon_atpx_switch_start(acpi_handle handle, int gpu_id)
{
return radeon_atpx_execute(handle, ATPX_SWITCH_START, gpu_id);
}
static int radeon_atpx_switch_end(acpi_handle handle, int gpu_id)
{
return radeon_atpx_execute(handle, ATPX_SWITCH_END, gpu_id);
}
static int radeon_atpx_switchto(enum vga_switcheroo_client_id id) static int radeon_atpx_switchto(enum vga_switcheroo_client_id id)
{ {
int gpu_id;
if (id == VGA_SWITCHEROO_IGD) if (id == VGA_SWITCHEROO_IGD)
radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 0); gpu_id = ATPX_INTEGRATED;
else else
radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 1); gpu_id = ATPX_DISCRETE;
radeon_atpx_switch_start(radeon_atpx_priv.atpx_handle, gpu_id);
radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, gpu_id);
radeon_atpx_switch_i2c_mux(radeon_atpx_priv.atpx_handle, gpu_id);
radeon_atpx_switch_end(radeon_atpx_priv.atpx_handle, gpu_id);
return 0; return 0;
} }
......
...@@ -167,9 +167,6 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, ...@@ -167,9 +167,6 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,
return -EINVAL; return -EINVAL;
} }
radeon_crtc->cursor_width = width;
radeon_crtc->cursor_height = height;
obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
if (!obj) { if (!obj) {
DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id); DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id);
...@@ -180,6 +177,9 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, ...@@ -180,6 +177,9 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,
if (ret) if (ret)
goto fail; goto fail;
radeon_crtc->cursor_width = width;
radeon_crtc->cursor_height = height;
radeon_lock_cursor(crtc, true); radeon_lock_cursor(crtc, true);
/* XXX only 27 bit offset for legacy cursor */ /* XXX only 27 bit offset for legacy cursor */
radeon_set_cursor(crtc, obj, gpu_addr); radeon_set_cursor(crtc, obj, gpu_addr);
......
...@@ -86,7 +86,7 @@ static inline bool drm_mm_initialized(struct drm_mm *mm) ...@@ -86,7 +86,7 @@ static inline bool drm_mm_initialized(struct drm_mm *mm)
} }
#define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \
&(mm)->head_node.node_list, \ &(mm)->head_node.node_list, \
node_list); node_list)
#define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ #define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \
for (entry = (mm)->prev_scanned_node, \ for (entry = (mm)->prev_scanned_node, \
next = entry ? list_entry(entry->node_list.next, \ next = entry ? list_entry(entry->node_list.next, \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment