From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> --- lib/Makefile.sources | 1 + lib/igt_edid_template.h | 74 ++++++++++++++++++++++++++++++++++++++++ lib/igt_kms.c | 90 +++++++++++-------------------------------------- 3 files changed, 95 insertions(+), 70 deletions(-) create mode 100644 lib/igt_edid_template.h diff --git a/lib/Makefile.sources b/lib/Makefile.sources index cb20f030cbec..4999868052b1 100644 --- a/lib/Makefile.sources +++ b/lib/Makefile.sources @@ -11,6 +11,7 @@ libintel_tools_la_SOURCES = \ igt_debugfs.h \ igt_aux.c \ igt_aux.h \ + igt_edid_template.h \ igt_gt.c \ igt_gt.h \ igt_stats.c \ diff --git a/lib/igt_edid_template.h b/lib/igt_edid_template.h new file mode 100644 index 000000000000..de421e080a88 --- /dev/null +++ b/lib/igt_edid_template.h @@ -0,0 +1,74 @@ +#define GAMMA(x) (((x) * 100) - 100) + +#define MANUFACTURER_ID(a, b, c) (a - '@') << 2 | (b - '@') >> 3, \ + (b - '@') << 5 | (c - '@') + + +#define ab(x, y) ((x) & 0xff), ((y) & 0xff), (((x) & 0xf00) >> 4) | (((y) & 0xf00) >> 8) +#define op(ho, hp, vo, vp) ((ho) & 0xff), ((hp) & 0xff), \ + (((vo) & 0xf) << 4) | ((vp) & 0xf), \ + (((ho) & 0x300) >> 2) | (((hp) & 0x300) >> 4) \ + | (((vo) & 0x30) >> 2) | ((vp) & 0x30 >> 4) + +static unsigned char EDID_NAME[EDID_LENGTH] = { + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, /* header */ + MANUFACTURER_ID('I', 'G', 'T'), + /* product code, serial number, week and year of manufacture */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x03, /* edid version (1.3) */ + /* basic display parameters */ + /* digital display, maximum horizontal image size, maximum vertical + * image size, gamma, features: RGB 4:4:4, native pixel format and + * refresh rate in descriptor 1 */ + 0x80, HSIZE, VSIZE, GAMMA(2.20), 0x02, + /* chromaticity coordinates */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* established timings: 640x480 60Hz, 800x600 60Hz, 1024x768 60Hz */ + 0x21, 0x08, 0x00, + /* standard timings */ + 0xd1, 0xc0, /* 1920x1080 60Hz */ + 0x81, 0xc0, /* 1280x720 60Hz */ + 0x61, 0x40, /* 1024x768 60Hz */ + 0x45, 0x40, /* 800x600 60Hz */ + 0x31, 0x40, /* 640x480 60Hz */ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + /* descriptor 1 (preferred timing) */ + (CLOCK / 10) & 0x00ff, ((CLOCK / 10) & 0xff00) >> 8, + ab(HACTIVE, HBLANK), ab(VACTIVE, VBLANK), + op(HOFFSET, HPULSE, VOFFSET, VPULSE), + ab(HSIZE * 10, VSIZE * 10), + 0x00, 0x00, 0x00, + /* descriptor 2 (monitor range limits) */ + 0x00, 0x00, 0x00, 0xfd, 0x00, + VFREQ - 1, VFREQ + 1, /* minimum, maximum vertical field rate */ + (CLOCK / (HACTIVE + HBLANK)) - 1, /* minimum horizontal line rate */ + (CLOCK / (HACTIVE + HBLANK)) + 1, /* maximum horizontal line rate */ + (CLOCK / 10000) + 1, /* maximum pixel clock rate */ + 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + /* descriptor 3 (name descriptor) */ + 0x00, 0x00, 0x00, 0xfc, 0x00, 'I', 'G', 'T', 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + /* descriptor 4 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* extensions, checksum */ + 0x00, 0x00 +}; + +#undef EDID_NAME +#undef VFREQ +#undef CLOCK +#undef HACTIVE +#undef HBLANK +#undef VACTIVE +#undef VBLANK +#undef HOFFSET +#undef HPULSE +#undef VOFFSET +#undef VPULSE +#undef HSIZE +#undef VSIZE +#undef GAMMA +#undef MANUFACTURER_ID +#undef ab +#undef op diff --git a/lib/igt_kms.c b/lib/igt_kms.c index fd4f05e81f3d..da49f5676641 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -53,6 +53,23 @@ #define MAX_CONNECTORS 32 static char *forced_connectors[MAX_CONNECTORS + 1]; +static void update_edid_csum(unsigned char *edid) +{ + int i, sum = 0; + struct tm *tm; + time_t t; + + /* year of manufacture */ + t = time(NULL); + tm = localtime(&t); + edid[17] = tm->tm_year - 90; + + /* calculate checksum */ + for (i = 0; i < 127; i++) { + sum = sum + edid[i]; + } + edid[127] = 256 - sum; +} #define VFREQ 60 #define CLOCK 148500 @@ -68,62 +85,8 @@ static char *forced_connectors[MAX_CONNECTORS + 1]; #define HSIZE 52 #define VSIZE 30 -#define GAMMA(x) (x * 100) - 100 - -#define MANUFACTURER_ID(a, b, c) (a - '@') << 2 | (b - '@') >> 3, \ - (b - '@') << 5 | (c - '@') - - -#define ab(x, y) (x & 0xff), (y & 0xff), ((x & 0xf00) >> 4) | ((y & 0xf00) >> 8) -#define op(ho, hp, vo, vp) (ho & 0xff), (hp & 0xff), \ - ((vo & 0xf) << 4) | (vp & 0xf), \ - ((ho & 0x300) >> 2) | ((hp & 0x300) >> 4) \ - | ((vo & 0x30) >> 2) | (vp & 0x30 >> 4) - -static unsigned char base_edid[EDID_LENGTH] = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, /* header */ - MANUFACTURER_ID('I', 'G', 'T'), - /* product code, serial number, week and year of manufacture */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x03, /* edid version (1.3) */ - /* basic display parameters */ - /* digital display, maximum horizontal image size, maximum vertical - * image size, gamma, features: RGB 4:4:4, native pixel format and - * refresh rate in descriptor 1 */ - 0x80, HSIZE, VSIZE, GAMMA(2.20), 0x02, - /* chromaticity coordinates */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* established timings: 640x480 60Hz, 800x600 60Hz, 1024x768 60Hz */ - 0x21, 0x08, 0x00, - /* standard timings */ - 0xd1, 0xc0, /* 1920x1080 60Hz */ - 0x81, 0xc0, /* 1280x720 60Hz */ - 0x61, 0x40, /* 1024x768 60Hz */ - 0x45, 0x40, /* 800x600 60Hz */ - 0x31, 0x40, /* 640x480 60Hz */ - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - /* descriptor 1 (preferred timing) */ - (CLOCK / 10) & 0x00ff, ((CLOCK / 10) & 0xff00) >> 8, - ab(HACTIVE, HBLANK), ab(VACTIVE, VBLANK), - op(HOFFSET, HPULSE, VOFFSET, VPULSE), - ab(HSIZE * 10, VSIZE * 10), - 0x00, 0x00, 0x00, - /* descriptor 2 (monitor range limits) */ - 0x00, 0x00, 0x00, 0xfd, 0x00, - VFREQ - 1, VFREQ + 1, /* minimum, maximum vertical field rate */ - (CLOCK / (HACTIVE + HBLANK)) - 1, /* minimum horizontal line rate */ - (CLOCK / (HACTIVE + HBLANK)) + 1, /* maximum horizontal line rate */ - (CLOCK / 10000) + 1, /* maximum pixel clock rate */ - 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - /* descriptor 3 (name descriptor) */ - 0x00, 0x00, 0x00, 0xfc, 0x00, 'I', 'G', 'T', 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - /* descriptor 4 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* extensions, checksum */ - 0x00, 0x00 -}; +#define EDID_NAME base_edid +#include "igt_edid_template.h" /** * igt_kms_get_base_edid: @@ -143,20 +106,7 @@ static unsigned char base_edid[EDID_LENGTH] = { */ const unsigned char* igt_kms_get_base_edid(void) { - int i, sum = 0; - struct tm *tm; - time_t t; - - /* year of manufacture */ - t = time(NULL); - tm = localtime(&t); - base_edid[17] = tm->tm_year - 90; - - /* calculate checksum */ - for (i = 0; i < 127; i++) { - sum = sum + base_edid[i]; - } - base_edid[127] = 256 - sum; + update_edid_csum(base_edid); return base_edid; } -- 2.4.10 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx