xserver-xorg-video-avivo: Changes to 'upstream-experimental'
include/avivo.h | 37 ++++--
xorg/Makefile.am | 2
xorg/avivo.c | 156 ++++++++++++++++++++++++---
xorg/avivo_bios.c | 75 +++++++++++++
xorg/avivo_crtc.c | 200 ++++++++++++++++++++++++-----------
xorg/avivo_cursor.c | 2
xorg/avivo_output.c | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++
xorg/avivo_state.c | 4
8 files changed, 683 insertions(+), 89 deletions(-)
New commits:
commit 52e78cf2d65b33ab23a6bea22caf6da68fa77768
Author: Jerome Glisse <glisse@freedesktop.org>
Date: Thu Jun 14 21:07:14 2007 +0200
avivo: randr1.2: initial support, not working enable with AVIVO_RR12
For some reason the server is not calling in driver crtc function
to set video mode thus launching with it will end up in a broken
display. This why this is disabled by default. Also randr 1.2 still
need work on rotation, allocating framebuffer, shadow buffer for
rotation, ...
diff --git a/include/avivo.h b/include/avivo.h
index ac136c0..e83e2b8 100644
--- a/include/avivo.h
+++ b/include/avivo.h
@@ -139,6 +139,7 @@ struct avivo_output_private {
I2CBusPtr i2c;
unsigned long output_offset;
int number;
+ char *name;
};
/**
diff --git a/xorg/Makefile.am b/xorg/Makefile.am
index 89c8dad..1a59543 100644
--- a/xorg/Makefile.am
+++ b/xorg/Makefile.am
@@ -33,5 +33,7 @@ avivo_drv_la_SOURCES = \
avivo_state.c \
avivo_bios.c \
avivo_cursor.c \
+ avivo_crtc.c \
+ avivo_output.c \
avivo_i2c.c \
avivo.c
diff --git a/xorg/avivo.c b/xorg/avivo.c
index 9986ee9..4672ea4 100644
--- a/xorg/avivo.c
+++ b/xorg/avivo.c
@@ -409,6 +409,7 @@ avivo_get_chipset(struct avivo_info *avivo)
static Bool
avivo_preinit(ScrnInfoPtr screen_info, int flags)
{
+ xf86CrtcConfigPtr config;
struct avivo_info *avivo;
DisplayModePtr mode;
ClockRangePtr clock_ranges;
@@ -461,7 +462,7 @@ avivo_preinit(ScrnInfoPtr screen_info, int flags)
avivo_get_chipset(avivo);
screen_info->chipset = "avivo";
screen_info->monitor = screen_info->confScreen->monitor;
- /* setup depth */
+
if (!xf86SetDepthBpp(screen_info, 0, 0, 0, Support32bppFb))
return FALSE;
xf86PrintDepthBpp(screen_info);
@@ -476,10 +477,73 @@ avivo_preinit(ScrnInfoPtr screen_info, int flags)
default:
FatalError("Unsupported screen depth: %d\n", xf86GetDepth());
}
-
-
+#if AVIVO_RR12
+ if (!avivo_crtc_create(screen_info))
+ return FALSE;
+#if 0
+ if (!avivo_output_setup(screen_info))
+ return FALSE;
+#else
+ avivo_output_setup(screen_info);
+#endif
+ /* color weight */
+ if (!xf86SetWeight(screen_info, rzeros, rzeros))
+ return FALSE;
+ /* visual init */
+ if (!xf86SetDefaultVisual(screen_info, -1))
+ return FALSE;
+ /* TODO: gamma correction */
+ xf86SetGamma(screen_info, gzeros);
+ /* Set display resolution */
+ xf86SetDpi(screen_info, 100, 100);
+ /* probe monitor found */
+ monitor = NULL;
+ config = XF86_CRTC_CONFIG_PTR(screen_info);
+ for (i = 0; i < config->num_output; i++) {
+ xf86OutputPtr output = config->output[i];
+ struct avivo_output_private *avivo_output = output->driver_private;
+ if (output->funcs->detect(output) == XF86OutputStatusConnected) {
+ output->funcs->get_modes(output);
+ monitor = output->MonInfo;
+ xf86PrintEDID(monitor);
+ }
+ }
+ if (monitor == NULL) {
+ xf86DrvMsg(screen_info->scrnIndex, X_ERROR,
+ "No monitor found.\n");
+ return FALSE;
+ }
+ xf86SetDDCproperties(screen_info, monitor);
+ /* validates mode */
+ clock_ranges = xcalloc(sizeof(ClockRange), 1);
+ if (clock_ranges == NULL) {
+ xf86DrvMsg(screen_info->scrnIndex, X_ERROR,
+ "Failed to allocate memory for clock range\n");
+ return FALSE;
+ }
+ clock_ranges->minClock = 12000;
+ clock_ranges->maxClock = 165000;
+ clock_ranges->clockIndex = -1;
+ clock_ranges->interlaceAllowed = FALSE;
+ clock_ranges->doubleScanAllowed = FALSE;
+ screen_info->progClock = TRUE;
+ xf86ValidateModes(screen_info, screen_info->monitor->Modes,
+ screen_info->display->modes, clock_ranges, 0, 320, 2048,
+ 16 * screen_info->bitsPerPixel, 200, 2047,
+ screen_info->display->virtualX,
+ screen_info->display->virtualY,
+ screen_info->videoRam, LOOKUP_BEST_REFRESH);
+ xf86PruneDriverModes(screen_info);
+ /* check if there modes available */
+ if (screen_info->modes == NULL) {
+ xf86DrvMsg(screen_info->scrnIndex, X_ERROR, "No modes available\n");
+ return FALSE;
+ }
+ screen_info->currentMode = screen_info->modes;
+#else
/* probe BIOS information */
avivo_probe_info(screen_info);
+
/* color weight */
if (!xf86SetWeight(screen_info, rzeros, rzeros))
return FALSE;
@@ -533,8 +597,8 @@ avivo_preinit(ScrnInfoPtr screen_info, int flags)
xf86DrvMsg(screen_info->scrnIndex, X_ERROR, "No modes available\n");
return FALSE;
}
-
screen_info->currentMode = screen_info->modes;
+#endif
/* options */
xf86CollectOptions(screen_info, NULL);
@@ -555,6 +619,7 @@ avivo_preinit(ScrnInfoPtr screen_info, int flags)
#endif
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO, "[ScreenPreInit OK]\n");
return TRUE;
}
@@ -575,8 +640,9 @@ avivo_screen_init(int index, ScreenPtr screen, int argc, char **argv)
{
ScrnInfoPtr screen_info = xf86Screens[index];
struct avivo_info *avivo = avivo_get_info(screen_info);
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(screen_info);
VisualPtr visual;
- int flags;
+ int flags, i;
unsigned int mc_memory_map;
unsigned int mc_memory_map_end;
@@ -592,13 +658,6 @@ avivo_screen_init(int index, ScreenPtr screen, int argc, char **argv)
(avivo->fb_addr >> 16) & AVIVO_MC_MEMORY_MAP_BASE_MASK);
OUTREG(AVIVO_VGA_FB_START, avivo->fb_addr);
- /* set first video mode */
- if (!avivo_set_mode(screen_info, screen_info->currentMode))
- return FALSE;
-
- /* set the viewport */
- avivo_adjust_frame(index, screen_info->frameX0, screen_info->frameY0, 0);
-
/* mi layer */
miClearVisualTypes();
@@ -630,18 +689,43 @@ avivo_screen_init(int index, ScreenPtr screen, int argc, char **argv)
visual->blueMask = screen_info->mask.blue;
}
}
-
/* must be after RGB ordering fixed */
fbPictureInit(screen, 0, 0);
xf86SetBlackWhitePixels(screen);
+#if AVIVO_RR12
+ for (i = 0; i < xf86_config->num_crtc; i++) {
+ xf86CrtcPtr crtc = xf86_config->crtc[i];
+ /* Mark that we'll need to re-set the mode for sure */
+ memset(&crtc->mode, 0, sizeof(crtc->mode));
+ if (!crtc->desiredMode.CrtcHDisplay) {
+ memcpy(&crtc->desiredMode, screen_info->currentMode,
+ sizeof(crtc->desiredMode));
+ crtc->desiredRotation = RR_Rotate_0;
+ crtc->desiredX = 0;
+ crtc->desiredY = 0;
+ }
- xf86DPMSInit(screen, avivo_dpms, 0);
+ if (!xf86CrtcSetMode (crtc, &crtc->desiredMode, crtc->desiredRotation,
+ crtc->desiredX, crtc->desiredY))
+ return FALSE;
+ }
+#else
+ /* set first video mode */
+ if (!avivo_set_mode(screen_info, screen_info->currentMode))
+ return FALSE;
+#endif
+ /* set the viewport */
+ avivo_adjust_frame(index, screen_info->frameX0, screen_info->frameY0, 0);
miDCInitialize(screen, xf86GetPointerScreenFuncs());
+#if 1
/* FIXME enormous hack ... */
avivo->cursor_offset = screen_info->virtualX * screen_info->virtualY * 4;
avivo_cursor_init(screen);
+#endif
+
+ xf86DPMSInit(screen, avivo_dpms, 0);
if (!miCreateDefColormap(screen))
return FALSE;
@@ -654,6 +738,12 @@ avivo_screen_init(int index, ScreenPtr screen, int argc, char **argv)
avivo->close_screen = screen->CloseScreen;
screen->CloseScreen = avivo_close_screen;
+#if AVIVO_RR12
+ if (!xf86CrtcScreenInit(screen))
+ return FALSE;
+#endif
+
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO, "[ScreenInit OK]\n");
return TRUE;
}
@@ -913,7 +1003,31 @@ avivo_setup_crtc(struct avivo_info *avivo, struct avivo_crtc *crtc,
avivo_crtc_enable(avivo, crtc, 1);
}
+#if AVIVO_RR12
+static Bool
+avivo_switch_mode(int index, DisplayModePtr mode, int flags)
+{
+ ScrnInfoPtr screen_info = xf86Screens[index];
+ Bool ok;
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO,
+ "set mode: hdisp %d, htotal %d, hss %d, hse %d, hsk %d\n",
+ mode->HDisplay, mode->HTotal, mode->HSyncStart, mode->HSyncEnd,
+ mode->HSkew);
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO,
+ " vdisp %d, vtotal %d, vss %d, vse %d, vsc %d\n",
+ mode->VDisplay, mode->VTotal, mode->VSyncStart, mode->VSyncEnd,
+ mode->VScan);
+
+ ok = xf86SetSingleMode(screen_info, mode, RR_Rotate_0);
+ if (!ok) {
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO, "Failed to set mode\n");
+ } else {
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO, "Setting mode succeed\n");
+ }
+ return ok;
+}
+#else
static Bool
avivo_switch_mode(int index, DisplayModePtr mode, int flags)
{
@@ -947,6 +1061,7 @@ avivo_switch_mode(int index, DisplayModePtr mode, int flags)
return TRUE;
}
+#endif
/* Set a graphics mode */
static Bool
diff --git a/xorg/avivo_bios.c b/xorg/avivo_bios.c
index e8d612c..e030602 100644
--- a/xorg/avivo_bios.c
+++ b/xorg/avivo_bios.c
@@ -328,3 +328,78 @@ avivo_probe_info(ScrnInfoPtr screen_info)
connector = connector->next;
}
}
+
+
+int
+avivo_output_clones(ScrnInfoPtr screen_info)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (screen_info);
+ int o, index_mask;
+
+ for (o = 0; o < config->num_output; o++) {
+ index_mask |= (1 << o);
+ }
+ return index_mask;
+}
+
+Bool
+avivo_output_setup(ScrnInfoPtr screen_info)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(screen_info);
+ struct avivo_info *avivo = avivo_get_info(screen_info);
+ int offset = 0;
+ int tmp, i;
+
+ if (RADEONGetBIOSInfo(screen_info))
+ return FALSE;
+
+ offset = RADEON_BIOS16(avivo->master_data + 22);
+ if (offset == 0) {
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO,
+ "No connector table in BIOS");
+ return 1;
+ }
+
+ tmp = RADEON_BIOS16(offset + 4);
+ for (i = 0; i < 8; i++) {
+ if (tmp & (1 << i)) {
+ int portinfo, number, connector_type, tmp0;
+ unsigned int ddc_reg;
+ xf86ConnectorType type;
+
+ portinfo = RADEON_BIOS16(offset + 6 + i * 2);
+ number = (portinfo >> 8) & 0xf;
+ connector_type = (portinfo >> 4) & 0xf;
+ tmp0 = RADEON_BIOS16(avivo->master_data + 24);
+ ddc_reg = RADEON_BIOS16(tmp0 + 4 + 27 * number) * 4;
+ switch (connector_type) {
+ case 0: type = XF86ConnectorNone; break;
+ case 1: type = XF86ConnectorVGA; break;
+ case 2: type = XF86ConnectorDVI_I; break;
+ case 3: type = XF86ConnectorDVI_D; break;
+ case 4: type = XF86ConnectorDVI_A; break;
+ case 5: type = XF86ConnectorSvideo; break;
+ case 6: type = XF86ConnectorComponent; break;
+ case 7: type = XF86ConnectorLFP; break;
+ case 8: type = XF86ConnectorNone; break;
+ default: type = XF86ConnectorNone; break;
+ }
+
+ switch (type) {
+ case XF86ConnectorVGA:
+ case XF86ConnectorLFP:
+ case XF86ConnectorDVI_I:
+ avivo_output_init(screen_info, type, number, ddc_reg);
+ break;
+ }
+ }
+ }
+
+
+ for (i = 0; i < config->num_output; i++) {
+ xf86OutputPtr output = config->output[i];
+ output->possible_crtcs = (1 << 0) | (1 << 1);
+ output->possible_clones = avivo_output_clones(screen_info);
+ }
+ return TRUE;
+}
diff --git a/xorg/avivo_crtc.c b/xorg/avivo_crtc.c
index 90375be..6233717 100644
--- a/xorg/avivo_crtc.c
+++ b/xorg/avivo_crtc.c
@@ -194,7 +194,16 @@ avivo_crtc_mode_set(xf86CrtcPtr crtc,
default:
FatalError("Unsupported screen depth: %d\n", xf86GetDepth());
}
-
+ xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO,
+ "crtc(%d) hdisp %d, htotal %d, hss %d, hse %d, hsk %d\n",
+ avivo_crtc->crtc_number, adjusted_mode->CrtcHDisplay,
+ adjusted_mode->CrtcHTotal, adjusted_mode->CrtcHSyncStart,
+ adjusted_mode->CrtcHSyncEnd, adjusted_mode->CrtcHSkew);
+ xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO,
+ "crtc(%d) vdisp %d, vtotal %d, vss %d, vse %d, vsc %d\n",
+ avivo_crtc->crtc_number, adjusted_mode->CrtcVDisplay,
+ adjusted_mode->CrtcVTotal, adjusted_mode->CrtcVSyncStart,
+ adjusted_mode->CrtcVSyncEnd, adjusted_mode->VScan);
/* TODO: find out what this regs truely are for.
* last guess: Switch from text to graphics mode.
*/
@@ -317,10 +326,10 @@ avivo_crtc_cursor_load_argb(xf86CrtcPtr crtc, CARD32 *image)
}
static void
-avivo_crtc_destroy(xf86OutputPtr output)
+avivo_crtc_destroy(xf86CrtcPtr crtc)
{
- if (output->driver_private)
- xfree(output->driver_private);
+ if (crtc->driver_private)
+ xfree(crtc->driver_private);
}
static const xf86CrtcFuncsRec avivo_crtc_funcs = {
@@ -358,6 +367,8 @@ avivo_crtc_init(ScrnInfoPtr screen_info, int crtc_number)
if (avivo_crtc == NULL)
return FALSE;
avivo_crtc->crtc_number = crtc_number;
+ avivo_crtc->fb_offset = 0;
+ avivo_crtc->cursor_offset = 0;
avivo_crtc->crtc_offset = 0;
if (avivo_crtc->crtc_number == 1)
avivo_crtc->crtc_offset = AVIVO_CRTC2_H_TOTAL - AVIVO_CRTC1_H_TOTAL;
@@ -370,6 +381,8 @@ avivo_crtc_init(ScrnInfoPtr screen_info, int crtc_number)
}
crtc->driver_private = avivo_crtc;
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO,
+ "added CRTC %d\n", crtc_number);
return TRUE;
}
diff --git a/xorg/avivo_state.c b/xorg/avivo_state.c
index f7a21bf..a1e65f6 100644
--- a/xorg/avivo_state.c
+++ b/xorg/avivo_state.c
@@ -32,7 +32,7 @@
#include "avivo.h"
#include "radeon_reg.h"
-static void
+void
avivo_save_cursor(ScrnInfoPtr screen_info)
{
struct avivo_info *avivo = avivo_get_info(screen_info);
commit 61f20371eb3af031767776300587eb9dacd453ef
Author: Jerome Glisse <glisse@freedesktop.org>
Date: Thu Jun 14 18:19:49 2007 +0200
avivo: fix bugs introduced by randr change.
diff --git a/xorg/avivo.c b/xorg/avivo.c
index 040cee0..9986ee9 100644
--- a/xorg/avivo.c
+++ b/xorg/avivo.c
@@ -461,8 +461,11 @@ avivo_preinit(ScrnInfoPtr screen_info, int flags)
avivo_get_chipset(avivo);
screen_info->chipset = "avivo";
screen_info->monitor = screen_info->confScreen->monitor;
-
- switch (xf86GetDepth()) {
+ /* setup depth */
+ if (!xf86SetDepthBpp(screen_info, 0, 0, 0, Support32bppFb))
+ return FALSE;
+ xf86PrintDepthBpp(screen_info);
+ switch (screen_info->depth) {
case 16:
avivo->bpp = 2;
break;
@@ -477,11 +480,6 @@ avivo_preinit(ScrnInfoPtr screen_info, int flags)
/* probe BIOS information */
avivo_probe_info(screen_info);
-
- if (!xf86SetDepthBpp(screen_info, 0, 0, 0, Support32bppFb))
- return FALSE;
- xf86PrintDepthBpp(screen_info);
-
/* color weight */
if (!xf86SetWeight(screen_info, rzeros, rzeros))
return FALSE;
diff --git a/xorg/avivo_cursor.c b/xorg/avivo_cursor.c
index b5588b8..5398438 100644
--- a/xorg/avivo_cursor.c
+++ b/xorg/avivo_cursor.c
@@ -65,7 +65,7 @@ avivo_cursor_set_position(ScrnInfoPtr screen_info, int x, int y)
avivo->cursor_y = y;
}
-static void
+void
avivo_setup_cursor(struct avivo_info *avivo, int id, int enable)
{
if (id == 1) {
commit ef115f143e6197aae9c2ed59c5759a095467eb28
Author: Jerome Glisse <glisse@freedesktop.org>
Date: Thu Jun 14 14:58:24 2007 +0200
avivo: crtc & output handling fixes.
diff --git a/xorg/avivo_crtc.c b/xorg/avivo_crtc.c
index 84a8a90..90375be 100644
--- a/xorg/avivo_crtc.c
+++ b/xorg/avivo_crtc.c
@@ -183,7 +183,7 @@ avivo_crtc_mode_set(xf86CrtcPtr crtc,
avivo_crtc->fb_pitch = adjusted_mode->CrtcHDisplay;
avivo_crtc->fb_offset = 0;
avivo_crtc->fb_length = avivo_crtc->fb_pitch * avivo_crtc->fb_height * 4;
- switch (xf86GetDepth()) {
+ switch (crtc->scrn->depth) {
case 16:
avivo_crtc->fb_format = AVIVO_CRTC_FORMAT_ARGB16;
break;
@@ -359,7 +359,7 @@ avivo_crtc_init(ScrnInfoPtr screen_info, int crtc_number)
return FALSE;
avivo_crtc->crtc_number = crtc_number;
avivo_crtc->crtc_offset = 0;
- if (avivo_crtc->crtc_number == 2)
+ if (avivo_crtc->crtc_number == 1)
avivo_crtc->crtc_offset = AVIVO_CRTC2_H_TOTAL - AVIVO_CRTC1_H_TOTAL;
/* allocate & initialize xf86Crtc */
@@ -390,6 +390,9 @@ avivo_crtc_create(ScrnInfoPtr screen_info)
/*
* add both crtc i think all r5xx chipset got two crtc
*/
-
+ if (!avivo_crtc_init(screen_info, 0))
+ return FALSE;
+ if (!avivo_crtc_init(screen_info, 1))
+ return FALSE;
return TRUE;
}
diff --git a/xorg/avivo_output.c b/xorg/avivo_output.c
index 8bbd335..805d653 100644
--- a/xorg/avivo_output.c
+++ b/xorg/avivo_output.c
@@ -202,6 +202,7 @@ avivo_output_destroy(xf86OutputPtr output)
if (avivo_output == NULL)
return;
xf86DestroyI2CBusRec(avivo_output->i2c, TRUE, TRUE);
+ xfree(avivo_output->name);
xfree(avivo_output);
}
@@ -225,21 +226,32 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
{
xf86OutputPtr output;
struct avivo_output_private *avivo_output;
+ int name_size;
/* allocate & initialize private crtc structure */
avivo_output = xcalloc(sizeof(struct avivo_output_private), 1);
if (avivo_output == NULL)
return FALSE;
+ name_size = snprintf(NULL, 0, "%s connector %d",
+ xf86ConnectorGetName(type), number);
+ avivo_output->name = xcalloc(name_size + 1, 1);
+ if (avivo_output->name == NULL) {
+ xfree(avivo_output);
+ xf86DrvMsg(screen_info->scrnIndex, X_ERROR,
+ "Failed to allocate memory for I2C bus name\n");
+ return FALSE;
+ }
+ snprintf(avivo_output->name, name_size + 1, "%s connector %d",
+ xf86ConnectorGetName(type), number);
+ avivo_output->i2c = xf86CreateI2CBusRec();
if (!avivo_output->i2c) {
- avivo_output->i2c = xf86CreateI2CBusRec();
- if (!avivo_output->i2c) {
- xfree(avivo_output);
- xf86DrvMsg(screen_info->scrnIndex, X_ERROR,
- "Couldn't create I2C bus\n");
- return FALSE;
- }
+ xfree(avivo_output);
+ xf86DrvMsg(screen_info->scrnIndex, X_ERROR,
+ "Couldn't create I2C bus for %s connector %d\n",
+ xf86ConnectorGetName(type), number);
+ return FALSE;
}
- avivo_output->i2c->BusName = "DDC";
+ avivo_output->i2c->BusName = avivo_output->name;
avivo_output->i2c->scrnIndex = screen_info->scrnIndex;
avivo_output->i2c->I2CPutBits = avivo_i2c_put_bits;
avivo_output->i2c->I2CGetBits = avivo_i2c_get_bits;
@@ -247,7 +259,8 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
avivo_output->i2c->DriverPrivate.uval = ddc_reg;
if (!xf86I2CBusInit(avivo_output->i2c)) {
xf86DrvMsg(screen_info->scrnIndex, X_ERROR,
- "Couldn't initialise I2C bus\n");
+ "Couldn't initialise I2C bus for %s connector %d\n",
+ xf86ConnectorGetName(type), number);
return;
}
avivo_output->type = type;
@@ -278,4 +291,6 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
output->driver_private = avivo_output;
output->interlaceAllowed = FALSE;
output->doubleScanAllowed = FALSE;
+ xf86DrvMsg(screen_info->scrnIndex, X_INFO,
+ "added %s connector %d\n", xf86ConnectorGetName(type), number);
}
commit e9e9a0b35a31840a4b1bff14efd506d2c9e5ac13
Author: Jerome Glisse <glisse@freedesktop.org>
Date: Thu Jun 14 14:14:15 2007 +0200
avivo: randr 1.2: fix crtc & output handling (not activated yet)
diff --git a/xorg/avivo_crtc.c b/xorg/avivo_crtc.c
index 1e5cebc..84a8a90 100644
--- a/xorg/avivo_crtc.c
+++ b/xorg/avivo_crtc.c
@@ -25,6 +25,9 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+/* DPMS */
+#define DPMS_SERVER
+#include <X11/extensions/dpms.h>
#include "avivo.h"
#include "radeon_reg.h"
@@ -179,7 +182,7 @@ avivo_crtc_mode_set(xf86CrtcPtr crtc,
avivo_crtc->fb_height = adjusted_mode->CrtcVDisplay;
avivo_crtc->fb_pitch = adjusted_mode->CrtcHDisplay;
avivo_crtc->fb_offset = 0;
- avivo_crtc->fb_length = avivo_crtc->fb_pitch * crtc->fb_height * 4;
+ avivo_crtc->fb_length = avivo_crtc->fb_pitch * avivo_crtc->fb_height * 4;
switch (xf86GetDepth()) {
case 16:
avivo_crtc->fb_format = AVIVO_CRTC_FORMAT_ARGB16;
@@ -189,6 +192,7 @@ avivo_crtc_mode_set(xf86CrtcPtr crtc,
avivo_crtc->fb_format = AVIVO_CRTC_FORMAT_ARGB32;
break;
default:
+ FatalError("Unsupported screen depth: %d\n", xf86GetDepth());
}
/* TODO: find out what this regs truely are for.
@@ -210,7 +214,7 @@ avivo_crtc_mode_set(xf86CrtcPtr crtc,
/* set PLL TODO: there is likely PLL registers we miss for having
* different PLL for each CRTC for instance.
*/
- avivo_crtc_set_pll(avivo, avivo_crtc, adjusted_mode);
+ avivo_crtc_set_pll(crtc, adjusted_mode);
/* finaly set the mode
*/
@@ -259,13 +263,13 @@ avivo_crtc_commit(xf86CrtcPtr crtc)
}
static void
-avivo_crtc_cursor_set_colors(xf86CrtcPtr crtc, int bg, int fg)
+avivo_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
{
/* TODO: implement */
}
static void
-avivo_crtc_cursor_set_position(xf86CrtcPtr crtc, int x, int y)
+avivo_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
{
struct avivo_crtc_private *avivo_crtc = crtc->driver_private;
struct avivo_info *avivo = avivo_get_info(crtc->scrn);
@@ -281,7 +285,7 @@ avivo_crtc_cursor_set_position(xf86CrtcPtr crtc, int x, int y)
}
static void
-avivo_crtc_cursor_show(xf86CrtcPtr crtc)
+avivo_crtc_show_cursor(xf86CrtcPtr crtc)
{
struct avivo_crtc_private *avivo_crtc = crtc->driver_private;
struct avivo_info *avivo = avivo_get_info(crtc->scrn);
@@ -292,7 +296,7 @@ avivo_crtc_cursor_show(xf86CrtcPtr crtc)
}
static void
-avivo_crtc_cursor_hide(xf86CrtcPtr crtc)
+avivo_crtc_hide_cursor(xf86CrtcPtr crtc)
{
struct avivo_crtc_private *avivo_crtc = crtc->driver_private;
struct avivo_info *avivo = avivo_get_info(crtc->scrn);
@@ -338,7 +342,7 @@ static const xf86CrtcFuncsRec avivo_crtc_funcs = {
.show_cursor = avivo_crtc_show_cursor,
.hide_cursor = avivo_crtc_hide_cursor,
.load_cursor_image = NULL,
- .load_cursor_argb = avivo_crtc_load_cursor_argb,
+ .load_cursor_argb = avivo_crtc_cursor_load_argb,
.destroy = avivo_crtc_destroy,
};
diff --git a/xorg/avivo_output.c b/xorg/avivo_output.c
index ba4a4f7..8bbd335 100644
--- a/xorg/avivo_output.c
+++ b/xorg/avivo_output.c
@@ -25,6 +25,9 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+/* DPMS */
+#define DPMS_SERVER
+#include <X11/extensions/dpms.h>
#include "avivo.h"
#include "radeon_reg.h"
@@ -167,7 +170,7 @@ avivo_output_detect_ddc(xf86OutputPtr output)
{
struct avivo_output_private *avivo_output = output->driver_private;
-o return xf86I2CProbeAddress(avivo_output->i2c, 0x00A0);
+ return xf86I2CProbeAddress(avivo_output->i2c, 0x00A0);
}
static xf86OutputStatus
@@ -202,10 +205,10 @@ avivo_output_destroy(xf86OutputPtr output)
xfree(avivo_output);
}
-static const xf86OutputFuncsRec avivo_output_output_funcs = {
+static const xf86OutputFuncsRec avivo_output_funcs = {
.dpms = avivo_output_dpms,
- .save = avivo_output_save,
- .restore = avivo_output_restore,
+ .save = NULL,
+ .restore = NULL,
.mode_valid = avivo_output_mode_valid,
.mode_fixup = avivo_output_mode_fixup,
.prepare = avivo_output_prepare,
@@ -221,10 +224,10 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
int number, unsigned long ddc_reg)
{
xf86OutputPtr output;
- struct avivo_output_private avivo_output;
+ struct avivo_output_private *avivo_output;
/* allocate & initialize private crtc structure */
- avivo_output = xcalloc (sizeof(struct avivo_output_private), 1);
+ avivo_output = xcalloc(sizeof(struct avivo_output_private), 1);
if (avivo_output == NULL)
return FALSE;
if (!avivo_output->i2c) {
commit c5caf1e26baf2c90d514f9a331626c43d099e555
Author: Jerome Glisse <glisse@freedesktop.org>
Date: Thu Jun 14 13:16:11 2007 +0200
avivo: randr 1.2 output (not compiled yet, work in progress)
diff --git a/include/avivo.h b/include/avivo.h
index e4815e6..ac136c0 100644
--- a/include/avivo.h
+++ b/include/avivo.h
@@ -24,22 +24,18 @@
/* All drivers should typically include these */
#include "xf86.h"
#include "xf86str.h"
+#include "xf86i2c.h"
+#include "xf86DDC.h"
+#include "xf86Crtc.h"
#include "xf86_OSproc.h"
#include "xf86Resources.h"
+#include "xf86RAC.h"
#include "compiler.h"
-
/* Drivers for PCI hardware need this */
#include "xf86PciInfo.h"
-
/* Drivers that need to access the PCI config space directly need this */
#include "xf86Pci.h"
-#include "xf86Resources.h"
-#include "xf86RAC.h"
-
-#include "xf86i2c.h"
-#include "xf86DDC.h"
-
#include "fb.h"
#ifdef PCIACCESS
@@ -137,6 +133,14 @@ struct avivo_output {
struct avivo_output *next;
};
+
+struct avivo_output_private {
+ xf86ConnectorType type;
+ I2CBusPtr i2c;
+ unsigned long output_offset;
+ int number;
+};
+
/**
* struct avivo_connector - avivo output connector information structure
* @is_connected: is output connected
@@ -310,6 +314,16 @@ struct avivo_info *avivo_get_info(ScrnInfoPtr screen_info);
void avivo_restore_state(ScrnInfoPtr screen_info);
void avivo_save_state(ScrnInfoPtr screen_info);
+/*
+ * avivo crtc handling
+ */
+Bool avivo_crtc_create(ScrnInfoPtr screen_info);
+
+/*
+ * avivo output handling
+ */
+Bool avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
+ int number, unsigned long ddc_reg);
/*
* avivo cursor handling
diff --git a/xorg/avivo_crtc.c b/xorg/avivo_crtc.c
index 57d2063..1e5cebc 100644
--- a/xorg/avivo_crtc.c
+++ b/xorg/avivo_crtc.c
@@ -312,6 +312,13 @@ avivo_crtc_cursor_load_argb(xf86CrtcPtr crtc, CARD32 *image)
memcpy(dst, image, 64 * 64 * 4);
}
+static void
+avivo_crtc_destroy(xf86OutputPtr output)
+{
+ if (output->driver_private)
+ xfree(output->driver_private);
+}
+
static const xf86CrtcFuncsRec avivo_crtc_funcs = {
.dpms = avivo_crtc_dpms,
.save = NULL, /* this got saved elsewhere */
diff --git a/xorg/avivo_output.c b/xorg/avivo_output.c
new file mode 100644
index 0000000..ba4a4f7
--- /dev/null
+++ b/xorg/avivo_output.c
@@ -0,0 +1,278 @@
+/*
+ * Copyright © 2007 Daniel Stone
+ * Copyright © 2007 Matthew Garrett
+ * Copyright © 2007 Jerome Glisse
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * A copy of the General Public License is included with the source
+ * distribution of this driver, as COPYING.
+ *
+ * Authors: Daniel Stone <daniel@fooishbar.org>
+ * Matthew Garrett <mjg59@srcf.ucam.org>
+ * Jerome Glisse <glisse@freedesktop.org>
+ */
+/*
+ * avivo output handling functions.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "avivo.h"
+#include "radeon_reg.h"
+
+static void
+avivo_i2c_get_bits(I2CBusPtr b, int *Clock, int *data)
+{
+ ScrnInfoPtr screen_info = xf86Screens[b->scrnIndex];
+ struct avivo_info *avivo = avivo_get_info(screen_info);
+ unsigned long val;
+
+ /* Get the result */
+ val = INREG(b->DriverPrivate.uval + 0xC);
+ *Clock = (val & (1<<0)) != 0;
+ *data = (val & (1<<8)) != 0;
+}
+
+static void
+avivo_i2c_put_bits(I2CBusPtr b, int Clock, int data)
+{
+ ScrnInfoPtr screen_info = xf86Screens[b->scrnIndex];
+ struct avivo_info *avivo = avivo_get_info(screen_info);
+ unsigned long val;
+
+ val = 0;
+ val |= (Clock ? 0:(1<<0));
+ val |= (data ? 0:(1<<8));
+ OUTREG(b->DriverPrivate.uval + 0x8, val);
+ /* read back to improve reliability on some cards. */
+ val = INREG(b->DriverPrivate.uval + 0x8);
+}
+
+static void
+avivo_output_dpms(xf86OutputPtr output, int mode)
+{
+ struct avivo_output_private *avivo_output = output->driver_private;
+ struct avivo_info *avivo = avivo_get_info(output->scrn);
+
+ switch (avivo_output->type) {
+ case XF86ConnectorVGA:
+ {
+ int value1, value2, value3;
+
+ switch(mode) {
+ case DPMSModeOn:
+ value1 = 0;
+ value2 = 0;
+ value3 = AVIVO_DAC_EN;
+ break;
+ case DPMSModeStandby:
+ case DPMSModeSuspend:
+ case DPMSModeOff:
+ value1 = AVIVO_DAC_MYSTERY1_DIS;
+ value2 = AVIVO_DAC_MYSTERY2_DIS;
+ value3 = 0;
+ break;
+ }
+ OUTREG(AVIVO_DAC1_MYSTERY1 + avivo_output->output_offset, value1);
+ OUTREG(AVIVO_DAC1_MYSTERY2 + avivo_output->output_offset, value2);
+ OUTREG(AVIVO_DAC1_CNTL + avivo_output->output_offset, value3);
+ break;
+ }
+ case XF86ConnectorDVI_I:
+ case XF86ConnectorDVI_D:
+ case XF86ConnectorDVI_A:
+ {
+ int value1, value2, value3, value4, value5;
+
+ value3 = 0x10000011;
+ value5 = 0x00001010;
+ switch(mode) {
+ case DPMSModeOn:
+ value1 = AVIVO_TMDS_MYSTERY1_EN;
+ value2 = AVIVO_TMDS_MYSTERY2_EN;
+ value4 = 0x00001f1f;
+ if (avivo_output->number == 2)
+ value4 |= 0x00000020;
+ value5 |= AVIVO_TMDS_EN;
+ break;
+ case DPMSModeStandby:
+ case DPMSModeSuspend:
+ case DPMSModeOff:
+ value1 = 0x04000000;
+ value2 = 0;
+ value4 = 0x00060000;
+ break;
+ }
+ OUTREG(AVIVO_TMDS1_MYSTERY1 + avivo_output->output_offset, value1);
+ OUTREG(AVIVO_TMDS1_MYSTERY2 + avivo_output->output_offset, value2);
+ OUTREG(AVIVO_TMDS1_MYSTERY3 + avivo_output->output_offset, value3);
+ OUTREG(AVIVO_TMDS1_CLOCK_CNTL + avivo_output->output_offset, value4);
+ OUTREG(AVIVO_TMDS1_CNTL + avivo_output->output_offset, value5);
+ break;
+ }
+ }
+}
+
+static int
+avivo_output_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
+{
+ if (pMode->Flags & V_DBLSCAN)
+ return MODE_NO_DBLESCAN;
+
+ if (pMode->Clock > 400000 || pMode->Clock < 25000)
+ return MODE_CLOCK_RANGE;
+
+ return MODE_OK;
+}
+
+static Bool
+avivo_output_mode_fixup(xf86OutputPtr output,
+ DisplayModePtr mode,
+ DisplayModePtr adjusted_mode)
+{
+ return TRUE;
+}
+
+static void
+avivo_output_prepare(xf86OutputPtr output)
+{
+ output->funcs->dpms(output, DPMSModeOff);
+}
+
+static void
+avivo_output_mode_set(xf86OutputPtr output,
+ DisplayModePtr mode,
+ DisplayModePtr adjusted_mode)
+{
+}
+
+static void
+avivo_output_commit(xf86OutputPtr output)
+{
+ output->funcs->dpms(output, DPMSModeOn);
+}
+
+
+static Bool
+avivo_output_detect_ddc(xf86OutputPtr output)
+{
+ struct avivo_output_private *avivo_output = output->driver_private;
+
+o return xf86I2CProbeAddress(avivo_output->i2c, 0x00A0);
Reply to: