Removing unneeded private FreeType2 symbol.

Updating to EDID 1.3. (Bugzilla# 1490, Jay Cotton, Egbert Eich).
Removing unneeded code.
Fixed KGA handling for i810. KGA handling for chips derived from C&T chips
    is slightly different. The changes make the code consistent with the
    C&T (chips) and i740 drivers.
This commit is contained in:
Egbert Eich 2004-11-02 08:54:53 +00:00
parent 1074992c28
commit 522c878fca
5 changed files with 185 additions and 38 deletions

View File

@ -11,7 +11,7 @@
*/
#ifndef _EDID_H_
#define _EDID_H_ 1
#define _EDID_H_
#include "vdif.h"
@ -126,7 +126,9 @@
#define SETUP _SETUP(GET(D_INPUT))
#define _SYNC(x) (x & 0x0F)
#define SYNC _SYNC(GET(D_INPUT))
#define _GAMMA(x) ((x + 100.0)/100.0)
#define _DFP(x) (x & 0x01)
#define DFP _DFP(GET(D_INPUT))
#define _GAMMA(x) (x == 0xff ? 1.0 : ((x + 100.0)/100.0))
#define GAMMA _GAMMA(GET(D_GAMMA))
#define HSIZE_MAX GET(D_HSIZE)
#define VSIZE_MAX GET(D_VSIZE)
@ -158,20 +160,28 @@
#define T_MANU GET(E_TMANU)
/* extract information from estabished timing section */
#define _VALID_TIMING(x) !(((x[0] == 0x01) && (x[1] == 0x01)) \
|| ((x[0] == 0x00) && (x[1] == 0x00)) \
|| ((x[0] == 0x20) && (x[1] == 0x20)) )
#define VALID_TIMING _VALID_TIMING(c)
#define _HSIZE1(x) ((x[0] + 31) * 8)
#define HSIZE1 _HSIZE1(c)
#define RATIO(x) ((x[1] & 0xC0) >> 6)
#define RATIO1_1 0
/* EDID Ver. 1.3 redefined this */
#define RATIO16_10 RATIO1_1
#define RATIO4_3 1
#define RATIO5_4 2
#define RATIO16_9 3
#define _VSIZE1(x,y) switch(RATIO(x)){ \
case RATIO1_1: y = _HSIZE1(x); break; \
#define _VSIZE1(x,y,r) switch(RATIO(x)){ \
case RATIO1_1: y = ((v->version > 1 || v->revision > 2) \
? (_HSIZE1(x) * 10) / 16 : _HSIZE1(x)); break; \
case RATIO4_3: y = _HSIZE1(x) * 3 / 4; break; \
case RATIO5_4: y = _HSIZE1(x) * 4 / 5; break; \
case RATIO16_9: y = _HSIZE1(x) * 9 / 16; break; \
}
#define VSIZE1(x) _VSIZE1(c,x)
#define VSIZE1(x) _VSIZE1(c,x,v)
#define _REFRESH_R(x) (x[1] & 0x3F) + 60
#define REFRESH_R _REFRESH_R(c)
#define _ID_LOW(x) x[0]
@ -183,7 +193,7 @@
#define NEXT_STD_TIMING _NEXT_STD_TIMING(c)
/* EDID Ver. > 1.2 */
/* EDID Ver. >= 1.2 */
#define _IS_MONITOR_DESC(x) (x[0] == 0 && x[1] == 0 && x[2] == 0 && x[4] == 0)
#define IS_MONITOR_DESC _IS_MONITOR_DESC(c)
#define _PIXEL_CLOCK(x) (x[0] + (x[1] << 8)) * 10000
@ -214,8 +224,10 @@
#define V_BORDER _V_BORDER(c)
#define _INTERLACED(x) ((x[17] & 0x80) >> 7)
#define INTERLACED _INTERLACED(c)
#define _STEREO(x) ((x[17] & 0x60) >> 6)
#define _STEREO(x) ((x[17] & 0x60) >> 5)
#define STEREO _STEREO(c)
#define _STEREO1(x) (x[17] & 0x1)
#define STEREO1 _STEREO(c)
#define _SYNC_T(x) ((x[17] & 0x18) >> 4)
#define SYNC_T _SYNC_T(c)
#define _MISC(x) ((x[17] & 0x06) >> 2)
@ -236,6 +248,18 @@
#define MAX_H _MAX_H(c)
#define _MAX_CLOCK(x) x[9]
#define MAX_CLOCK _MAX_CLOCK(c)
#define _HAVE_2ND_GTF(x) (x[10] == 0x02)
#define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
#define _F_2ND_GTF(x) (x[12] * 2)
#define F_2ND_GTF _F_2ND_GTF(c)
#define _C_2ND_GTF(x) (x[13] / 2)
#define C_2ND_GTF _C_2ND_GTF(c)
#define _M_2ND_GTF(x) (x[14] + (x[15] << 8))
#define M_2ND_GTF _M_2ND_GTF(c)
#define _K_2ND_GTF(x) (x[16])
#define K_2ND_GTF _K_2ND_GTF(c)
#define _J_2ND_GTF(x) (x[17] / 2)
#define J_2ND_GTF _J_2ND_GTF(c)
#define MONITOR_NAME 0xFC
#define ADD_COLOR_POINT 0xFB
#define WHITEX F_CC(I_CC((GET(D_BW_LOW)),(GET(D_WHITEX)),2))
@ -255,6 +279,7 @@
#define _WHITE_GAMMA2(x) _GAMMA(x[14])
#define WHITE_GAMMA2 _WHITE_GAMMA2(c)
#define ADD_STD_TIMINGS 0xFA
#define ADD_DUMMY 0x10
#define _NEXT_DT_MD_SECTION(x) (x = (x + DET_TIMING_INFO_LEN))
#define NEXT_DT_MD_SECTION _NEXT_DT_MD_SECTION(c)
@ -264,6 +289,9 @@
/* input type */
#define DIGITAL(x) x
/* DFP */
#define DFP1(x) x
/* input voltage level */
#define V070 0 /* 0.700V/0.300V */
#define V071 1 /* 0.714V/0.286V */
@ -297,8 +325,12 @@
/* detailed timing misc */
#define IS_INTERLACED(x) (x)
#define IS_STEREO(x) (x)
#define IS_RIGHT_ON_SYNC(x) (x & 0x01)
#define IS_LEFT_ON_SYNC(x) (x & 0x02)
#define IS_RIGHT_STEREO(x) (x & 0x01)
#define IS_LEFT_STEREO(x) (x & 0x02)
#define IS_4WAY_STEREO(x) (x & 0x03)
#define IS_RIGHT_ON_SYNC(x) IS_RIGHT_STEREO(x)
#define IS_LEFT_ON_SYNC(x) IS_LEFT_STEREO(x)
typedef unsigned int Uint;
typedef unsigned char Uchar;
@ -321,6 +353,7 @@ struct disp_features {
unsigned int input_voltage:2;
unsigned int input_setup:1;
unsigned int input_sync:5;
unsigned int input_dfp:1;
int hsize;
int vsize;
float gamma;
@ -368,6 +401,7 @@ struct detailed_timings {
unsigned int stereo:2;
unsigned int sync:2;
unsigned int misc:2;
unsigned int stereo_1:1;
};
#define DT 0
@ -377,6 +411,7 @@ struct detailed_timings {
#define DS_RANGES 0xFD
#define DS_WHITE_P 0xFB
#define DS_STD_TIMINGS 0xFA
#define DS_DUMMY 0x10
struct monitor_ranges {
int min_v;
@ -384,6 +419,11 @@ struct monitor_ranges {
int min_h;
int max_h;
int max_clock;
int gtf_2nd_f;
int gtf_2nd_c;
int gtf_2nd_m;
int gtf_2nd_k;
int gtf_2nd_j;
};
struct whitePoints{

View File

@ -13,16 +13,21 @@
static void get_vendor_section(Uchar*, struct vendor *);
static void get_version_section(Uchar*, struct edid_version *);
static void get_display_section(Uchar*, struct disp_features *);
static void get_display_section(Uchar*, struct disp_features *,
struct edid_version *);
static void get_established_timing_section(Uchar*, struct established_timings *);
static void get_std_timing_section(Uchar*, struct std_timings *);
static void get_std_timing_section(Uchar*, struct std_timings *,
struct edid_version *);
static void get_dt_md_section(Uchar *, struct edid_version *,
struct detailed_monitor_section *det_mon);
static void copy_string(Uchar *, Uchar *);
static void get_dst_timing_section(Uchar *, struct std_timings *);
static void get_dst_timing_section(Uchar *, struct std_timings *,
struct edid_version *);
static void get_monitor_ranges(Uchar *, struct monitor_ranges *);
static void get_whitepoint_section(Uchar *, struct whitePoints *);
static void get_detailed_timing_section(Uchar*, struct detailed_timings *);
static Bool validate_version(int scrnIndex, struct edid_version *);
xf86MonPtr
xf86InterpretEDID(int scrnIndex, Uchar *block)
@ -33,15 +38,24 @@ xf86InterpretEDID(int scrnIndex, Uchar *block)
if (! (m = xnfcalloc(sizeof(xf86Monitor),1))) return NULL;
m->scrnIndex = scrnIndex;
m->rawData = block;
get_vendor_section(SECTION(VENDOR_SECTION,block),&m->vendor);
get_version_section(SECTION(VERSION_SECTION,block),&m->ver);
get_display_section(SECTION(DISPLAY_SECTION,block),&m->features);
if (!validate_version(scrnIndex, &m->ver)) goto error;
get_display_section(SECTION(DISPLAY_SECTION,block),&m->features,
&m->ver);
get_established_timing_section(SECTION(ESTABLISHED_TIMING_SECTION,block),
&m->timings1);
get_std_timing_section(SECTION(STD_TIMING_SECTION,block),m->timings2);
get_std_timing_section(SECTION(STD_TIMING_SECTION,block),m->timings2,
&m->ver);
get_dt_md_section(SECTION(DET_TIMING_SECTION,block),&m->ver, m->det_mon);
m->no_sections = (int)*(char *)SECTION(NO_EDID,block);
return (m);
error:
xfree(m);
return NULL;
}
static void
@ -66,12 +80,16 @@ get_version_section(Uchar *c, struct edid_version *r)
}
static void
get_display_section(Uchar *c, struct disp_features *r)
get_display_section(Uchar *c, struct disp_features *r,
struct edid_version *v)
{
r->input_type = INPUT_TYPE;
r->input_voltage = INPUT_VOLTAGE;
r->input_setup = SETUP;
r->input_sync = SYNC;
if (!DIGITAL(r->input_type)) {
r->input_voltage = INPUT_VOLTAGE;
r->input_setup = SETUP;
r->input_sync = SYNC;
} else if (v->version > 1 || v->revision > 2)
r->input_dfp = DFP;
r->hsize = HSIZE_MAX;
r->vsize = VSIZE_MAX;
r->gamma = GAMMA;
@ -97,15 +115,20 @@ get_established_timing_section(Uchar *c, struct established_timings *r)
}
static void
get_std_timing_section(Uchar *c, struct std_timings *r)
get_std_timing_section(Uchar *c, struct std_timings *r,
struct edid_version *v)
{
int i;
for (i=0;i<STD_TIMINGS;i++){
r[i].hsize = HSIZE1;
VSIZE1(r[i].vsize);
r[i].refresh = REFRESH_R;
r[i].id = STD_TIMING_ID;
if (VALID_TIMING) {
r[i].hsize = HSIZE1;
VSIZE1(r[i].vsize);
r[i].refresh = REFRESH_R;
r[i].id = STD_TIMING_ID;
} else {
r[i].hsize = r[i].vsize = r[i].refresh = r[i].id = 0;
}
NEXT_STD_TIMING;
}
}
@ -142,8 +165,11 @@ get_dt_md_section(Uchar *c, struct edid_version *ver,
break;
case ADD_STD_TIMINGS:
det_mon[i].type = DS_STD_TIMINGS;
get_dst_timing_section(c,det_mon[i].section.std_t);
get_dst_timing_section(c,det_mon[i].section.std_t, ver);
break;
case ADD_DUMMY:
det_mon[i].type = DS_DUMMY;
break;
}
} else {
det_mon[i].type = DT;
@ -165,7 +191,8 @@ copy_string(Uchar *c, Uchar *s)
}
static void
get_dst_timing_section(Uchar *c, struct std_timings *t)
get_dst_timing_section(Uchar *c, struct std_timings *t,
struct edid_version *v)
{
int j;
c = c + 5;
@ -188,6 +215,14 @@ get_monitor_ranges(Uchar *c, struct monitor_ranges *r)
r->max_clock = 0;
if(MAX_CLOCK != 0xff) /* is specified? */
r->max_clock = MAX_CLOCK * 10;
if (HAVE_2ND_GTF) {
r->gtf_2nd_f = F_2ND_GTF;
r->gtf_2nd_c = C_2ND_GTF;
r->gtf_2nd_m = M_2ND_GTF;
r->gtf_2nd_k = K_2ND_GTF;
r->gtf_2nd_j = J_2ND_GTF;
} else
r->gtf_2nd_f = 0;
}
static void
@ -221,8 +256,21 @@ get_detailed_timing_section(Uchar *c, struct detailed_timings *r)
r->v_border = V_BORDER;
r->interlaced = INTERLACED;
r->stereo = STEREO;
r->stereo_1 = STEREO1;
r->sync = SYNC_T;
r->misc = MISC;
}
static Bool
validate_version(int scrnIndex, struct edid_version *r)
{
if (r->version != 1)
return FALSE;
if (r->revision > 3) {
xf86DrvMsg(scrnIndex, X_ERROR,"EDID Version 1.%i not yet supported\n",
r->revision);
return FALSE;
}
return TRUE;
}

View File

@ -12,7 +12,8 @@
static void print_vendor(int scrnIndex, struct vendor *);
static void print_version(int scrnIndex, struct edid_version *);
static void print_display(int scrnIndex, struct disp_features *);
static void print_display(int scrnIndex, struct disp_features *,
struct edid_version *);
static void print_established_timings(int scrnIndex,
struct established_timings *);
static void print_std_timings(int scrnIndex, struct std_timings *);
@ -21,19 +22,23 @@ static void print_detailed_monitor_section(int scrnIndex,
static void print_detailed_timings(int scrnIndex, struct detailed_timings *);
static void print_input_features(int scrnIndex, struct disp_features *);
static void print_dpms_features(int scrnIndex, struct disp_features *);
static void print_dpms_features(int scrnIndex, struct disp_features *,
struct edid_version *v);
static void print_whitepoint(int scrnIndex, struct disp_features *);
static void print_number_sections(int scrnIndex, int);
xf86MonPtr
xf86PrintEDID(xf86MonPtr m)
{
if (!(m)) return NULL;
print_vendor(m->scrnIndex,&m->vendor);
print_version(m->scrnIndex,&m->ver);
print_display(m->scrnIndex,&m->features);
print_display(m->scrnIndex,&m->features, &m->ver);
print_established_timings(m->scrnIndex,&m->timings1);
print_std_timings(m->scrnIndex,m->timings2);
print_detailed_monitor_section(m->scrnIndex,m->det_mon);
print_number_sections(m->scrnIndex,m->no_sections);
return m;
}
@ -53,7 +58,8 @@ print_version(int scrnIndex, struct edid_version *c)
}
static void
print_display(int scrnIndex, struct disp_features *disp)
print_display(int scrnIndex, struct disp_features *disp,
struct edid_version *version)
{
print_input_features(scrnIndex,disp);
xf86DrvMsg(scrnIndex,X_INFO,"Max H-Image Size [cm]: ");
@ -66,16 +72,18 @@ print_display(int scrnIndex, struct disp_features *disp)
else
xf86ErrorF("V-Size may change\n");
xf86DrvMsg(scrnIndex,X_INFO,"Gamma: %.2f\n", disp->gamma);
print_dpms_features(scrnIndex,disp);
print_dpms_features(scrnIndex,disp,version);
print_whitepoint(scrnIndex,disp);
}
static void
print_input_features(int scrnIndex, struct disp_features *c)
{
if (DIGITAL(c->input_type))
if (DIGITAL(c->input_type)) {
xf86DrvMsg(scrnIndex,X_INFO,"Digital Display Input\n");
else {
if (DFP1(c->input_dfp))
xf86DrvMsg(scrnIndex,X_INFO,"DFP 1.x compatible TMDS\n");
} else {
xf86DrvMsg(scrnIndex,X_INFO,"Analog Display Input, ");
xf86ErrorF("Input Voltage Level: ");
switch (c->input_voltage){
@ -111,7 +119,8 @@ print_input_features(int scrnIndex, struct disp_features *c)
}
static void
print_dpms_features(int scrnIndex, struct disp_features *c)
print_dpms_features(int scrnIndex, struct disp_features *c,
struct edid_version *v)
{
if (c->dpms) {
xf86DrvMsg(scrnIndex,X_INFO,"DPMS capabilities:");
@ -140,6 +149,10 @@ print_dpms_features(int scrnIndex, struct disp_features *c)
if (PREFERRED_TIMING_MODE(c->msc))
xf86DrvMsg(scrnIndex,X_INFO,
"First detailed timing is preferred mode\n");
else if (v->version == 1 && v->revision >= 3)
xf86DrvMsg(scrnIndex,X_INFO,
"First detailed timing not preferred "
"mode in violation of standard!");
if (GFT_SUPPORTED(c->msc))
xf86DrvMsg(scrnIndex,X_INFO,
"GTF timings supported\n");
@ -234,7 +247,15 @@ print_detailed_monitor_section(int scrnIndex,
if (m[i].section.ranges.max_clock != 0)
xf86ErrorF(" PixClock max %i MHz\n",m[i].section.ranges.max_clock);
else
xf86DrvMsg(scrnIndex,X_INFO,"\n");
xf86ErrorF("\n");
if (m[i].section.ranges.gtf_2nd_f > 0)
xf86DrvMsg(scrnIndex,X_INFO," 2nd GTF parameters: f: %i kHz "
"c: %i m: %i k %i j %i\n",
m[i].section.ranges.gtf_2nd_f,
m[i].section.ranges.gtf_2nd_c,
m[i].section.ranges.gtf_2nd_m,
m[i].section.ranges.gtf_2nd_k,
m[i].section.ranges.gtf_2nd_j);
break;
case DS_STD_TIMINGS:
for (j = 0; j<5; j++)
@ -252,6 +273,9 @@ print_detailed_monitor_section(int scrnIndex,
m[i].section.wp[j].white_y,
m[i].section.wp[j].white_gamma);
break;
case DS_DUMMY:
default:
break;
}
}
}
@ -278,9 +302,32 @@ print_detailed_timings(int scrnIndex, struct detailed_timings *t)
xf86ErrorF("v_border: %i\n",t->v_border);
if (IS_STEREO(t->stereo)) {
xf86DrvMsg(scrnIndex,X_INFO,"Stereo: ");
if (IS_RIGHT_ON_SYNC(t->stereo))
xf86ErrorF("right channel on sync\n");
else xf86ErrorF("right channel on sync\n");
if (IS_RIGHT_STEREO(t->stereo)) {
if (!t->stereo_1)
xf86ErrorF("right channel on sync\n");
else
xf86ErrorF("left channel on sync\n");
} else if (IS_LEFT_STEREO(t->stereo)) {
if (!t->stereo_1)
xf86ErrorF("right channel on even line\n");
else
xf86ErrorF("left channel on evel line\n");
}
if (IS_4WAY_STEREO(t->stereo)) {
if (!t->stereo_1)
xf86ErrorF("4-way interleaved\n");
else
xf86ErrorF("side-by-side interleaved");
}
}
}
}
static void
print_number_sections(int scrnIndex, int num)
{
if (num)
xf86DrvMsg(scrnIndex,X_INFO,"Number of EDID sections to follow: %i\n",
num);
}

View File

@ -200,6 +200,9 @@ char tmpname[32];
in= Popen(buf,"r");
#else
{
#ifdef DEBUG_CMD
ErrorF("xkb executes: %s\n",cmd);
#endif
if (System(buf) < 0)
ErrorF("Could not invoke keymap compiler\n");
else

View File

@ -176,6 +176,9 @@ char cmd[PATH_MAX],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
ErrorF("XkbDDXCompileNamedKeymap compiling keymap using:\n");
ErrorF(" \"cmd\"\n");
}
#endif
#ifdef DEBUG_CMD
ErrorF("xkb executes: %s\n",cmd);
#endif
if (System(cmd)==0) {
if (nameRtrn) {
@ -312,6 +315,12 @@ int i;
if (fclose(out)==0)
#endif
{
#ifdef DEBUG_CMD
ErrorF("xkb executes: %s\n",buf);
ErrorF("xkbcomp input:\n");
XkbWriteXKBKeymapForNames(stderr,names,NULL,xkb,want,need);
ErrorF("end xkbcomp input\n");
#endif
#ifdef WIN32
if (System(buf) < 0)
ErrorF("Could not invoke keymap compiler\n");