xserver-xorg-video-ati: Changes to 'upstream-experimental'
man/radeon.man | 10
src/AtomBios/includes/ObjectID.h | 36 +
src/AtomBios/includes/atombios.h | 803 ++++++++++++++++++++++++++++++++-------
src/Makefile.am | 2
src/atombios_crtc.c | 2
src/atombios_output.c | 203 ++++-----
src/legacy_crtc.c | 5
src/radeon.h | 16
src/radeon_atombios.c | 168 +++++++-
src/radeon_atombios.h | 6
src/radeon_bios.c | 29 -
src/radeon_crtc.c | 8
src/radeon_cursor.c | 2
src/radeon_driver.c | 28 -
src/radeon_drm.h | 5
src/radeon_legacy_memory.c | 117 +++++
src/radeon_memory.c | 118 -----
src/radeon_output.c | 24 -
src/radeon_probe.h | 6
src/radeon_textured_video.c | 14
src/radeon_video.c | 61 +-
21 files changed, 1189 insertions(+), 474 deletions(-)
New commits:
commit c0e6cb6d0eeef8f2ea60d840e1cd668fa92cd7f9
Author: Alex Deucher <alexdeucher@gmail.com>
Date: Fri Oct 10 11:09:27 2008 -0400
Fix grey level dithering setup
diff --git a/src/atombios_output.c b/src/atombios_output.c
index a770177..148a1da 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -346,7 +346,7 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m
disp_data2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN;
if (radeon_output->lvds_misc & (1 << 1))
disp_data2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH;
- if (((radeon_output->lvds_misc >> 2) & 0x3) == 4)
+ if (((radeon_output->lvds_misc >> 2) & 0x3) == 2)
disp_data2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4;
}
} else {
commit 9eb2b6cd28224f0cbbabf3df451696ae1a845b9c
Author: Dave Airlie <airlied@redhat.com>
Date: Fri Oct 10 16:18:05 2008 +1000
radeon: hopefully fix plls for 30" monitors.
Only do the HIGH trick on the DCE3 cards. Tested on rv610/630/770.
diff --git a/src/atombios_crtc.c b/src/atombios_crtc.c
index 3f2e113..4e2395f 100644
--- a/src/atombios_crtc.c
+++ b/src/atombios_crtc.c
@@ -224,7 +224,7 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode, int pll_flags)
if (IS_AVIVO_VARIANT) {
uint32_t temp;
- if (mode->Clock > 200000) /* range limits??? */
+ if (IS_DCE3_VARIANT && mode->Clock > 200000) /* range limits??? */
pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
else
pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
commit 0975e007ec7933acf9cd8ad2f281313ef8d32ac9
Author: Dave Airlie <airlied@redhat.com>
Date: Thu Oct 9 17:16:28 2008 +1100
radeon: rename radeon_memory to radeon_legacy_memory.
This is a setup patch for the kms/memory management code.
diff --git a/src/Makefile.am b/src/Makefile.am
index c79b635..d65a3e4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -88,7 +88,7 @@ radeon_drv_la_LTLIBRARIES = radeon_drv.la
radeon_drv_la_LDFLAGS = -module -avoid-version
radeon_drv_ladir = @moduledir@/drivers
radeon_drv_la_SOURCES = \
- radeon_accel.c radeon_cursor.c radeon_dga.c radeon_memory.c \
+ radeon_accel.c radeon_cursor.c radeon_dga.c radeon_legacy_memory.c \
radeon_driver.c radeon_video.c radeon_bios.c radeon_mm_i2c.c \
radeon_vip.c radeon_misc.c radeon_probe.c \
legacy_crtc.c legacy_output.c \
diff --git a/src/radeon.h b/src/radeon.h
index aec8a25..f7ae1a8 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -1068,15 +1068,15 @@ extern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode);
extern void RADEONInitVideo(ScreenPtr pScreen);
extern void RADEONResetVideo(ScrnInfoPtr pScrn);
-/* radeon_memory.c */
+/* radeon_legacy_memory.c */
extern uint32_t
-radeon_allocate_memory(ScrnInfoPtr pScrn,
- void **mem_struct,
- int size,
- int align);
+radeon_legacy_allocate_memory(ScrnInfoPtr pScrn,
+ void **mem_struct,
+ int size,
+ int align);
extern void
-radeon_free_memory(ScrnInfoPtr pScrn,
- void *mem_struct);
+radeon_legacy_free_memory(ScrnInfoPtr pScrn,
+ void *mem_struct);
#ifdef XF86DRI
# ifdef USE_XAA
diff --git a/src/radeon_crtc.c b/src/radeon_crtc.c
index 99992fc..9040bae 100644
--- a/src/radeon_crtc.c
+++ b/src/radeon_crtc.c
@@ -418,7 +418,7 @@ radeon_crtc_shadow_allocate (xf86CrtcPtr crtc, int width, int height)
* setter for offscreen area locking in EXA currently. So, we just
* allocate offscreen memory and fake up a pixmap header for it.
*/
- rotate_offset = radeon_allocate_memory(pScrn, &radeon_crtc->crtc_rotate_mem, size, align);
+ rotate_offset = radeon_legacy_allocate_memory(pScrn, &radeon_crtc->crtc_rotate_mem, size, align);
if (rotate_offset == 0)
return NULL;
@@ -466,7 +466,7 @@ radeon_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data
FreeScratchPixmapHeader(rotate_pixmap);
if (data) {
- radeon_free_memory(pScrn, radeon_crtc->crtc_rotate_mem);
+ radeon_legacy_free_memory(pScrn, radeon_crtc->crtc_rotate_mem);
radeon_crtc->crtc_rotate_mem = NULL;
}
diff --git a/src/radeon_cursor.c b/src/radeon_cursor.c
index 22a33d6..08bfddf 100644
--- a/src/radeon_cursor.c
+++ b/src/radeon_cursor.c
@@ -341,7 +341,7 @@ Bool RADEONCursorInit(ScreenPtr pScreen)
RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
radeon_crtc->cursor_offset =
- radeon_allocate_memory(pScrn, &radeon_crtc->cursor_mem, size_bytes, align);
+ radeon_legacy_allocate_memory(pScrn, &radeon_crtc->cursor_mem, size_bytes, align);
if (radeon_crtc->cursor_offset == 0)
return FALSE;
diff --git a/src/radeon_legacy_memory.c b/src/radeon_legacy_memory.c
new file mode 100644
index 0000000..2a9ee94
--- /dev/null
+++ b/src/radeon_legacy_memory.c
@@ -0,0 +1,117 @@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Driver data structures */
+#include "radeon.h"
+
+/* Allocates memory, either by resizing the allocation pointed to by mem_struct,
+ * or by freeing mem_struct (if non-NULL) and allocating a new space. The size
+ * is measured in bytes, and the offset from the beginning of card space is
+ * returned.
+ */
+uint32_t
+radeon_legacy_allocate_memory(ScrnInfoPtr pScrn,
+ void **mem_struct,
+ int size,
+ int align)
+{
+ ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ uint32_t offset = 0;
+
+#ifdef USE_EXA
+ if (info->useEXA) {
+ ExaOffscreenArea *area = *mem_struct;
+
+ if (area != NULL) {
+ if (area->size >= size)
+ return area->offset;
+
+ exaOffscreenFree(pScreen, area);
+ }
+
+ area = exaOffscreenAlloc(pScreen, size, align, TRUE,
+ NULL, NULL);
+
+ *mem_struct = area;
+ if (area == NULL)
+ return 0;
+ offset = area->offset;
+ }
+#endif /* USE_EXA */
+#ifdef USE_XAA
+ if (!info->useEXA) {
+ FBLinearPtr linear = *mem_struct;
+ int cpp = info->CurrentLayout.bitsPerPixel / 8;
+
+ /* XAA allocates in units of pixels at the screen bpp, so adjust size
+ * appropriately.
+ */
+ size = (size + cpp - 1) / cpp;
+ align = (align + cpp - 1) / cpp;
+
+ if (linear) {
+ if(linear->size >= size)
+ return linear->offset * cpp;
+
+ if(xf86ResizeOffscreenLinear(linear, size))
+ return linear->offset * cpp;
+
+ xf86FreeOffscreenLinear(linear);
+ }
+
+ linear = xf86AllocateOffscreenLinear(pScreen, size, align,
+ NULL, NULL, NULL);
+ *mem_struct = linear;
+
+ if (!linear) {
+ int max_size;
+
+ xf86QueryLargestOffscreenLinear(pScreen, &max_size, align,
+ PRIORITY_EXTREME);
+
+ if (max_size < size)
+ return 0;
+
+ xf86PurgeUnlockedOffscreenAreas(pScreen);
+ linear = xf86AllocateOffscreenLinear(pScreen, size, align,
+ NULL, NULL, NULL);
+ *mem_struct = linear;
+ if (!linear)
+ return 0;
+ }
+ offset = linear->offset * cpp;
+ }
+#endif /* USE_XAA */
+
+ return offset;
+}
+
+void
+radeon_legacy_free_memory(ScrnInfoPtr pScrn,
+ void *mem_struct)
+{
+ ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+
+#ifdef USE_EXA
+ if (info->useEXA) {
+ ExaOffscreenArea *area = mem_struct;
+
+ if (area != NULL)
+ exaOffscreenFree(pScreen, area);
+ area = NULL;
+ }
+#endif /* USE_EXA */
+#ifdef USE_XAA
+ if (!info->useEXA) {
+ FBLinearPtr linear = mem_struct;
+
+ if (linear != NULL)
+ xf86FreeOffscreenLinear(linear);
+ linear = NULL;
+ }
+#endif /* USE_XAA */
+}
diff --git a/src/radeon_memory.c b/src/radeon_memory.c
deleted file mode 100644
index f965cb4..0000000
--- a/src/radeon_memory.c
+++ /dev/null
@@ -1,117 +0,0 @@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Driver data structures */
-#include "radeon.h"
-
-/* Allocates memory, either by resizing the allocation pointed to by mem_struct,
- * or by freeing mem_struct (if non-NULL) and allocating a new space. The size
- * is measured in bytes, and the offset from the beginning of card space is
- * returned.
- */
-uint32_t
-radeon_allocate_memory(ScrnInfoPtr pScrn,
- void **mem_struct,
- int size,
- int align)
-{
- ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
- RADEONInfoPtr info = RADEONPTR(pScrn);
- uint32_t offset = 0;
-
-#ifdef USE_EXA
- if (info->useEXA) {
- ExaOffscreenArea *area = *mem_struct;
-
- if (area != NULL) {
- if (area->size >= size)
- return area->offset;
-
- exaOffscreenFree(pScreen, area);
- }
-
- area = exaOffscreenAlloc(pScreen, size, align, TRUE,
- NULL, NULL);
-
- *mem_struct = area;
- if (area == NULL)
- return 0;
- offset = area->offset;
- }
-#endif /* USE_EXA */
-#ifdef USE_XAA
- if (!info->useEXA) {
- FBLinearPtr linear = *mem_struct;
- int cpp = info->CurrentLayout.bitsPerPixel / 8;
-
- /* XAA allocates in units of pixels at the screen bpp, so adjust size
- * appropriately.
- */
- size = (size + cpp - 1) / cpp;
- align = (align + cpp - 1) / cpp;
-
- if (linear) {
- if(linear->size >= size)
- return linear->offset * cpp;
-
- if(xf86ResizeOffscreenLinear(linear, size))
- return linear->offset * cpp;
-
- xf86FreeOffscreenLinear(linear);
- }
-
- linear = xf86AllocateOffscreenLinear(pScreen, size, align,
- NULL, NULL, NULL);
- *mem_struct = linear;
-
- if (!linear) {
- int max_size;
-
- xf86QueryLargestOffscreenLinear(pScreen, &max_size, align,
- PRIORITY_EXTREME);
-
- if (max_size < size)
- return 0;
-
- xf86PurgeUnlockedOffscreenAreas(pScreen);
- linear = xf86AllocateOffscreenLinear(pScreen, size, align,
- NULL, NULL, NULL);
- *mem_struct = linear;
- if (!linear)
- return 0;
- }
- offset = linear->offset * cpp;
- }
-#endif /* USE_XAA */
-
- return offset;
-}
-
-void
-radeon_free_memory(ScrnInfoPtr pScrn,
- void *mem_struct)
-{
- ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
- RADEONInfoPtr info = RADEONPTR(pScrn);
-
-#ifdef USE_EXA
- if (info->useEXA) {
- ExaOffscreenArea *area = mem_struct;
-
- if (area != NULL)
- exaOffscreenFree(pScreen, area);
- area = NULL;
- }
-#endif /* USE_EXA */
-#ifdef USE_XAA
- if (!info->useEXA) {
- FBLinearPtr linear = mem_struct;
-
- if (linear != NULL)
- xf86FreeOffscreenLinear(linear);
- linear = NULL;
- }
-#endif /* USE_XAA */
-}
diff --git a/src/radeon_textured_video.c b/src/radeon_textured_video.c
index 4005df9..c185b46 100644
--- a/src/radeon_textured_video.c
+++ b/src/radeon_textured_video.c
@@ -197,14 +197,14 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn,
dstPitch = (dstPitch + 15) & ~15;
if (pPriv->video_memory != NULL && size != pPriv->size) {
- radeon_free_memory(pScrn, pPriv->video_memory);
+ radeon_legacy_free_memory(pScrn, pPriv->video_memory);
pPriv->video_memory = NULL;
}
if (pPriv->video_memory == NULL) {
- pPriv->video_offset = radeon_allocate_memory(pScrn,
- &pPriv->video_memory,
- size * 2, 64);
+ pPriv->video_offset = radeon_legacy_allocate_memory(pScrn,
+ &pPriv->video_memory,
+ size * 2, 64);
if (pPriv->video_offset == 0)
return BadAlloc;
}
@@ -213,9 +213,9 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn,
if (!IS_R500_3D)
pPriv->bicubic_enabled = FALSE;
if (pPriv->bicubic_memory == NULL && pPriv->bicubic_enabled) {
- pPriv->bicubic_offset = radeon_allocate_memory(pScrn,
- &pPriv->bicubic_memory,
- sizeof(bicubic_tex_512), 64);
+ pPriv->bicubic_offset = radeon_legacy_allocate_memory(pScrn,
+ &pPriv->bicubic_memory,
+ sizeof(bicubic_tex_512), 64);
pPriv->bicubic_src_offset = pPriv->bicubic_offset + info->fbLocation + pScrn->fbOffset;
if (pPriv->bicubic_offset == 0)
pPriv->bicubic_enabled = FALSE;
diff --git a/src/radeon_video.c b/src/radeon_video.c
index 47b0497..6249cea 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -1638,11 +1638,11 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
if (pPriv->textured) {
if (cleanup) {
if (pPriv->bicubic_memory != NULL) {
- radeon_free_memory(pScrn, pPriv->bicubic_memory);
+ radeon_legacy_free_memory(pScrn, pPriv->bicubic_memory);
pPriv->bicubic_memory = NULL;
}
if (pPriv->video_memory != NULL) {
- radeon_free_memory(pScrn, pPriv->video_memory);
+ radeon_legacy_free_memory(pScrn, pPriv->video_memory);
pPriv->video_memory = NULL;
}
}
@@ -1667,7 +1667,7 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv);
}
if (pPriv->video_memory != NULL) {
- radeon_free_memory(pScrn, pPriv->video_memory);
+ radeon_legacy_free_memory(pScrn, pPriv->video_memory);
pPriv->video_memory = NULL;
}
pPriv->videoStatus = 0;
@@ -2937,9 +2937,9 @@ RADEONPutImage(
if (idconv == FOURCC_YV12 || id == FOURCC_I420) {
new_size += (dstPitch >> 1) * ((height + 1) & ~1);
}
- pPriv->video_offset = radeon_allocate_memory(pScrn, &pPriv->video_memory,
- (pPriv->doubleBuffer ?
- (new_size * 2) : new_size), 64);
+ pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, &pPriv->video_memory,
+ (pPriv->doubleBuffer ?
+ (new_size * 2) : new_size), 64);
if (pPriv->video_offset == 0)
return BadAlloc;
@@ -3133,7 +3133,7 @@ RADEONVideoTimerCallback(ScrnInfoPtr pScrn, Time now)
} else { /* FREE_TIMER */
if(pPriv->freeTime < now) {
if (pPriv->video_memory != NULL) {
- radeon_free_memory(pScrn, pPriv->video_memory);
+ radeon_legacy_free_memory(pScrn, pPriv->video_memory);
pPriv->video_memory = NULL;
}
pPriv->videoStatus = 0;
@@ -3168,7 +3168,7 @@ RADEONAllocateSurface(
pitch = ((w << 1) + 15) & ~15;
size = pitch * h;
- offset = radeon_allocate_memory(pScrn, &surface_memory, size, 64);
+ offset = radeon_legacy_allocate_memory(pScrn, &surface_memory, size, 64);
if (offset == 0)
return BadAlloc;
@@ -3176,18 +3176,18 @@ RADEONAllocateSurface(
surface->height = h;
if(!(surface->pitches = xalloc(sizeof(int)))) {
- radeon_free_memory(pScrn, surface_memory);
+ radeon_legacy_free_memory(pScrn, surface_memory);
return BadAlloc;
}
if(!(surface->offsets = xalloc(sizeof(int)))) {
xfree(surface->pitches);
- radeon_free_memory(pScrn, surface_memory);
+ radeon_legacy_free_memory(pScrn, surface_memory);
return BadAlloc;
}
if(!(pPriv = xalloc(sizeof(OffscreenPrivRec)))) {
xfree(surface->pitches);
xfree(surface->offsets);
- radeon_free_memory(pScrn, surface_memory);
+ radeon_legacy_free_memory(pScrn, surface_memory);
return BadAlloc;
}
@@ -3228,7 +3228,7 @@ RADEONFreeSurface(
if(pPriv->isOn)
RADEONStopSurface(surface);
- radeon_free_memory(pScrn, pPriv->surface_memory);
+ radeon_legacy_free_memory(pScrn, pPriv->surface_memory);
pPriv->surface_memory = NULL;
xfree(surface->pitches);
xfree(surface->offsets);
@@ -3504,9 +3504,9 @@ RADEONPutVideo(
if (pPriv->capture_vbi_data)
alloc_size += 2 * 2 * vbi_line_width * 21;
- pPriv->video_offset = radeon_allocate_memory(pScrn, &pPriv->video_memory,
- (pPriv->doubleBuffer ?
- (new_size * 2) : new_size), 64);
+ pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, &pPriv->video_memory,
+ (pPriv->doubleBuffer ?
+ (new_size * 2) : new_size), 64);
if (pPriv->video_offset == 0)
return BadAlloc;
commit d744dc013cf5ca3141c0fdf55e36d713fe9f53ba
Author: Adam Jackson <ajax@redhat.com>
Date: Wed Oct 8 15:50:25 2008 -0400
Fix connector table mapping for lvtma/kaleidoscope/uniphy.
Fixes DPMS on LVDS.
diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c
index 13eb1fc..851014b 100644
--- a/src/radeon_atombios.c
+++ b/src/radeon_atombios.c
@@ -1594,15 +1594,23 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn)
break;
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP1_INDEX);
- info->BiosConnector[i].TMDSType = TMDS_INT;
+ if (info->BiosConnector[i].ConnectorType == CONNECTOR_LVDS)
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_LCD1_INDEX);
+ else {
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP1_INDEX);
+ info->BiosConnector[i].TMDSType = TMDS_INT;
+ }
break;
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
- if (num == 1)
- info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP1_INDEX);
- else
- info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP2_INDEX);
- info->BiosConnector[i].TMDSType = TMDS_UNIPHY;
+ if (info->BiosConnector[i].ConnectorType == CONNECTOR_LVDS)
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_LCD1_INDEX);
+ else {
+ if (num == 1)
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP1_INDEX);
+ else
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP2_INDEX);
+ info->BiosConnector[i].TMDSType = TMDS_UNIPHY;
+ }
break;
case ENCODER_OBJECT_ID_INTERNAL_TMDS2:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
@@ -1611,8 +1619,12 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn)
break;
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
- info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP3_INDEX);
- info->BiosConnector[i].TMDSType = TMDS_LVTMA;
+ if (info->BiosConnector[i].ConnectorType == CONNECTOR_LVDS)
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_LCD1_INDEX);
+ else {
+ info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_DFP3_INDEX);
+ info->BiosConnector[i].TMDSType = TMDS_LVTMA;
+ }
break;
case ENCODER_OBJECT_ID_INTERNAL_DAC1:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
commit dc795ba66a8c0eb2c3fdb86bd42dfc17e0aa3b6e
Author: Alex Deucher <alexdeucher@gmail.com>
Date: Tue Oct 7 12:32:47 2008 -0400
Fixups from last DFP/LCD refactor
- fix DFP1 -> LCD1
- use _INDEX rather than _SUPPORT defs
diff --git a/src/atombios_output.c b/src/atombios_output.c
index fad5a10..a770177 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -278,13 +278,13 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m
int major, minor;
switch (device) {
- case ATOM_DEVICE_DFP1_SUPPORT:
+ case ATOM_DEVICE_DFP1_INDEX:
index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
break;
- case ATOM_DEVICE_LCD1_SUPPORT:
+ case ATOM_DEVICE_LCD1_INDEX:
index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
break;
- case ATOM_DEVICE_DFP3_SUPPORT:
+ case ATOM_DEVICE_DFP3_INDEX:
index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
break;
default:
@@ -305,7 +305,7 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m
if (radeon_output->type == OUTPUT_HDMI)
disp_data.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
- if (device == ATOM_DEVICE_DFP1_SUPPORT) {
+ if (device == ATOM_DEVICE_LCD1_INDEX) {
if (radeon_output->lvds_misc & (1 << 0))
disp_data.ucMisc |= PANEL_ENCODER_MISC_DUAL;
if (radeon_output->lvds_misc & (1 << 1))
@@ -334,7 +334,7 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m
disp_data2.ucSpatial = 0;
disp_data2.ucTemporal = 0;
disp_data2.ucFRC = 0;
- if (device == ATOM_DEVICE_DFP1_SUPPORT) {
+ if (device == ATOM_DEVICE_LCD1_INDEX) {
if (radeon_output->lvds_misc & (1 << 0))
disp_data2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
if (radeon_output->lvds_misc & (1 << 5)) {
@@ -919,7 +919,7 @@ atombios_output_mode_set(xf86OutputPtr output,
atombios_output_dig1_setup(output, adjusted_mode);
atombios_output_dig1_transmitter_setup(output, adjusted_mode);
} else
- atombios_output_digital_setup(output, ATOM_DEVICE_DFP1_SUPPORT, adjusted_mode);
+ atombios_output_digital_setup(output, ATOM_DEVICE_DFP1_INDEX, adjusted_mode);
} else if (radeon_output->devices & ATOM_DEVICE_DFP2_SUPPORT) {
if (IS_DCE3_VARIANT) {
// fix me
@@ -936,7 +936,7 @@ atombios_output_mode_set(xf86OutputPtr output,
atombios_output_dig2_setup(output, adjusted_mode);
atombios_output_dig2_transmitter_setup(output, adjusted_mode);
} else
- atombios_output_digital_setup(output, ATOM_DEVICE_DFP3_SUPPORT, adjusted_mode);
+ atombios_output_digital_setup(output, ATOM_DEVICE_DFP3_INDEX, adjusted_mode);
}
} else if (radeon_output->MonType == MT_LCD) {
if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT) {
@@ -944,7 +944,7 @@ atombios_output_mode_set(xf86OutputPtr output,
atombios_output_dig2_setup(output, adjusted_mode);
atombios_output_dig2_transmitter_setup(output, adjusted_mode);
} else
- atombios_output_digital_setup(output, ATOM_DEVICE_LCD1_SUPPORT, adjusted_mode);
+ atombios_output_digital_setup(output, ATOM_DEVICE_LCD1_INDEX, adjusted_mode);
}
} else if ((radeon_output->MonType == MT_CTV) ||
(radeon_output->MonType == MT_STV) ||
commit 4a9e8d9fe24278b56aef51677fd35289d01584a7
Author: Alex Deucher <alexdeucher@gmail.com>
Date: Mon Oct 6 18:00:08 2008 -0400
set grey levels correctly for temporal dithering
diff --git a/src/atombios_output.c b/src/atombios_output.c
index 50e3681..fad5a10 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -346,6 +346,8 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m
disp_data2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN;
if (radeon_output->lvds_misc & (1 << 1))
disp_data2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH;
+ if (((radeon_output->lvds_misc >> 2) & 0x3) == 4)
+ disp_data2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4;
}
} else {
if (mode->Clock > 165000)
commit 5708624d1151877dd66a462d4a75fed6774604a7
Author: Alex Deucher <alexdeucher@gmail.com>
Date: Mon Oct 6 15:11:56 2008 -0400
Turn coherent mode off by default on DVI
diff --git a/src/radeon_output.c b/src/radeon_output.c
index 3416edf..8c794fb 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -1158,7 +1158,7 @@ radeon_create_resources(xf86OutputPtr output)
"RRConfigureOutputProperty error, %d\n", err);
}
- data = 1; /* use coherent mode by default */
+ data = 0; /* coherent mode off by default */
err = RRChangeOutputProperty(output->randr_output, coherent_mode_atom,
XA_INTEGER, 32, PropModeReplace, 1, &data,
commit a5c5ce96279d01eb519bfb92b94c06a58acb7f07
Author: Alex Deucher <alexdeucher@gmail.com>
Date: Mon Oct 6 15:07:31 2008 -0400
Refactor atom LCD/DFP output setup
Simplify the code, properly handle dithering, coherent mode, encoding, etc.
Should fix bug 17897.
diff --git a/src/atombios_output.c b/src/atombios_output.c
index 83b86a7..50e3681 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -206,7 +206,8 @@ atombios_output_tv1_setup(xf86OutputPtr output, DisplayModePtr mode)
int
atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode)
{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
+ ScrnInfoPtr pScrn = output->scrn;
+ RADEONInfoPtr info = RADEONPTR(pScrn);
ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION disp_data;
AtomBiosArgRec data;
unsigned char *space;
@@ -218,7 +219,7 @@ atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode)
else
disp_data.sXTmdsEncoder.ucMisc = 0;
- if (!info->dac6bits)
+ if (pScrn->rgbBits == 8)
disp_data.sXTmdsEncoder.ucMisc |= (1 << 1);
data.exec.index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
@@ -264,84 +265,107 @@ atombios_output_ddia_setup(xf86OutputPtr output, DisplayModePtr mode)
}
static int
-atombios_output_tmds1_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr mode)
{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- TMDS1_ENCODER_CONTROL_PS_ALLOCATION disp_data;
+ RADEONOutputPrivatePtr radeon_output = output->driver_private;
+ ScrnInfoPtr pScrn = output->scrn;
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ LVDS_ENCODER_CONTROL_PS_ALLOCATION disp_data;
+ LVDS_ENCODER_CONTROL_PS_ALLOCATION_V2 disp_data2;
AtomBiosArgRec data;
unsigned char *space;
+ int index;
+ int major, minor;
- disp_data.ucAction = 1;
- if (mode->Clock > 165000)
- disp_data.ucMisc = 1;
- else
- disp_data.ucMisc = 0;
- disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
- data.exec.index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
- data.exec.dataSpace = (void *)&space;
- data.exec.pspace = &disp_data;
-
- if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
- ErrorF("Output TMDS1 setup success\n");
- return ATOM_SUCCESS;
+ switch (device) {
+ case ATOM_DEVICE_DFP1_SUPPORT:
+ index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
+ break;
+ case ATOM_DEVICE_LCD1_SUPPORT:
+ index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
+ break;
+ case ATOM_DEVICE_DFP3_SUPPORT:
+ index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
+ break;
+ default:
+ return ATOM_NOT_IMPLEMENTED;
+ break;
}
- ErrorF("Output TMDS1 setup failed\n");
- return ATOM_NOT_IMPLEMENTED;
-
-}
-
-static int
-atombios_output_tmds2_setup(xf86OutputPtr output, DisplayModePtr mode)
-{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- TMDS2_ENCODER_CONTROL_PS_ALLOCATION disp_data;
- AtomBiosArgRec data;
- unsigned char *space;
-
- disp_data.ucAction = 1;
- if (mode->Clock > 165000)
- disp_data.ucMisc = 1;
- else
- disp_data.ucMisc = 0;
- disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
- data.exec.index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
- data.exec.dataSpace = (void *)&space;
- data.exec.pspace = &disp_data;
+ atombios_get_command_table_version(info->atomBIOS, index, &major, &minor);
- if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
- ErrorF("Output TMDS2 setup success\n");
- return ATOM_SUCCESS;
+ /*ErrorF("table is %d %d\n", major, minor);*/
+ switch (major) {
+ case 0:
+ case 1:
+ switch (minor) {
+ case 1:
+ disp_data.ucMisc = 0;
+ disp_data.ucAction = PANEL_ENCODER_ACTION_ENABLE;
+ if (radeon_output->type == OUTPUT_HDMI)
+ disp_data.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
+ disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ if (device == ATOM_DEVICE_DFP1_SUPPORT) {
+ if (radeon_output->lvds_misc & (1 << 0))
+ disp_data.ucMisc |= PANEL_ENCODER_MISC_DUAL;
+ if (radeon_output->lvds_misc & (1 << 1))
+ disp_data.ucMisc |= (1 << 1);
+ } else {
+ if (mode->Clock > 165000)
+ disp_data.ucMisc |= PANEL_ENCODER_MISC_DUAL;
+ if (pScrn->rgbBits == 8)
+ disp_data.ucMisc |= (1 << 1);
+ }
+ data.exec.pspace = &disp_data;
+ break;
+ case 2:
+ case 3:
+ disp_data2.ucMisc = 0;
+ disp_data2.ucAction = PANEL_ENCODER_ACTION_ENABLE;
+ if (minor == 3) {
+ if (radeon_output->coherent_mode) {
+ disp_data2.ucMisc |= PANEL_ENCODER_MISC_COHERENT;
+ xf86DrvMsg(output->scrn->scrnIndex, X_INFO, "Coherent Mode enabled\n");
+ }
+ }
+ if (radeon_output->type == OUTPUT_HDMI)
+ disp_data2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
+ disp_data2.ucTruncate = 0;
+ disp_data2.ucSpatial = 0;
+ disp_data2.ucTemporal = 0;
+ disp_data2.ucFRC = 0;
+ if (device == ATOM_DEVICE_DFP1_SUPPORT) {
+ if (radeon_output->lvds_misc & (1 << 0))
+ disp_data2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
+ if (radeon_output->lvds_misc & (1 << 5)) {
+ disp_data2.ucSpatial = PANEL_ENCODER_SPATIAL_DITHER_EN;
+ if (radeon_output->lvds_misc & (1 << 1))
+ disp_data2.ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH;
+ }
+ if (radeon_output->lvds_misc & (1 << 6)) {
+ disp_data2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN;
+ if (radeon_output->lvds_misc & (1 << 1))
+ disp_data2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH;
+ }
+ } else {
+ if (mode->Clock > 165000)
+ disp_data2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
+ }
+ data.exec.pspace = &disp_data2;
+ break;
+ }
+ break;
}
- ErrorF("Output TMDS2 setup failed\n");
- return ATOM_NOT_IMPLEMENTED;
-}
-
-static int
-atombios_output_lvds_setup(xf86OutputPtr output, DisplayModePtr mode)
-{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- LVDS_ENCODER_CONTROL_PS_ALLOCATION disp_data;
- AtomBiosArgRec data;
- unsigned char *space;
-
- disp_data.ucAction = 1;
- if (mode->Clock > 165000)
- disp_data.ucMisc = 1;
- else
- disp_data.ucMisc = 0;
- disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
- data.exec.index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
+ data.exec.index = index;
data.exec.dataSpace = (void *)&space;
- data.exec.pspace = &disp_data;
if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
- ErrorF("Output LVDS setup success\n");
+ ErrorF("Output digital setup success\n");
return ATOM_SUCCESS;
}
- ErrorF("Output LVDS setup failed\n");
+ ErrorF("Output digital setup failed\n");
return ATOM_NOT_IMPLEMENTED;
}
@@ -600,34 +624,6 @@ atombios_output_scaler_setup(xf86OutputPtr output, DisplayModePtr mode)
}
-static void
-dfp_disable_dither(xf86OutputPtr output, int device)
-{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- switch (device) {
- case ATOM_DEVICE_DFP1_SUPPORT:
- OUTREG(AVIVO_TMDSA_BIT_DEPTH_CONTROL, 0); /* TMDSA */
- break;
- case ATOM_DEVICE_DFP2_SUPPORT:
- if ((info->ChipFamily == CHIP_FAMILY_RS600) ||
- (info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740))
- OUTREG(AVIVO_DDIA_BIT_DEPTH_CONTROL, 0); /* DDIA */
- else
- OUTREG(AVIVO_DVOA_BIT_DEPTH_CONTROL, 0); /* DVO */
- break;
- /*case ATOM_DEVICE_LCD1_SUPPORT:*/ /* LVDS panels need dither enabled */
- case ATOM_DEVICE_DFP3_SUPPORT:
- OUTREG(AVIVO_LVTMA_BIT_DEPTH_CONTROL, 0); /* LVTMA */
- break;
- default:
- break;
- }
-
-}
-
static AtomBiosResult
atombios_display_device_control(atomBiosHandlePtr atomBIOS, int device, Bool state)
{
@@ -920,10 +916,8 @@ atombios_output_mode_set(xf86OutputPtr output,
if (IS_DCE3_VARIANT) {
atombios_output_dig1_setup(output, adjusted_mode);
atombios_output_dig1_transmitter_setup(output, adjusted_mode);
- } else {
- atombios_output_tmds1_setup(output, adjusted_mode);
- dfp_disable_dither(output, ATOM_DEVICE_DFP1_SUPPORT);
- }
+ } else
+ atombios_output_digital_setup(output, ATOM_DEVICE_DFP1_SUPPORT, adjusted_mode);
} else if (radeon_output->devices & ATOM_DEVICE_DFP2_SUPPORT) {
if (IS_DCE3_VARIANT) {
// fix me
@@ -934,26 +928,21 @@ atombios_output_mode_set(xf86OutputPtr output,
atombios_output_ddia_setup(output, adjusted_mode);
else
atombios_external_tmds_setup(output, adjusted_mode);
- dfp_disable_dither(output, ATOM_DEVICE_DFP2_SUPPORT);
}
} else if (radeon_output->devices & ATOM_DEVICE_DFP3_SUPPORT) {
if (IS_DCE3_VARIANT) {
atombios_output_dig2_setup(output, adjusted_mode);
atombios_output_dig2_transmitter_setup(output, adjusted_mode);
- } else {
- atombios_output_tmds2_setup(output, adjusted_mode);
- dfp_disable_dither(output, ATOM_DEVICE_DFP3_SUPPORT);
- }
+ } else
+ atombios_output_digital_setup(output, ATOM_DEVICE_DFP3_SUPPORT, adjusted_mode);
}
} else if (radeon_output->MonType == MT_LCD) {
if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT) {
if (IS_DCE3_VARIANT) {
atombios_output_dig2_setup(output, adjusted_mode);
atombios_output_dig2_transmitter_setup(output, adjusted_mode);
- } else {
- atombios_output_lvds_setup(output, adjusted_mode);
- dfp_disable_dither(output, ATOM_DEVICE_LCD1_SUPPORT);
- }
+ } else
+ atombios_output_digital_setup(output, ATOM_DEVICE_LCD1_SUPPORT, adjusted_mode);
}
} else if ((radeon_output->MonType == MT_CTV) ||
(radeon_output->MonType == MT_STV) ||
diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c
index 12aeeca..13eb1fc 100644
--- a/src/radeon_atombios.c
+++ b/src/radeon_atombios.c
@@ -1668,6 +1668,71 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn)
}
Bool
+RADEONGetATOMLVDSInfo(xf86OutputPtr output)
Reply to: