Bug 38777

Summary: xorg устанавливает малый неверный размер матрицы
Product: Sisyphus Reporter: Speccyfighter <zxwarior>
Component: xorg-serverAssignee: Valery Inozemtsev <shrek>
Status: ASSIGNED --- QA Contact: qa-sisyphus
Severity: major    
Priority: P3 CC: asy, shrek, slazav, stranger573
Version: unstableKeywords: regression
Hardware: all   
OS: Linux   

Description Speccyfighter 2020-08-02 00:34:34 MSK
Всем доброго

В p9 xorg-server на intel kms через intel_drv устанавливает неверный заниженный размер активной зоны матрицы ноутбука Lenovo G50-80. Устанавливая его вместо 344x194, на 340x190 миллиметров. В результате приложение запускаемое в полный экран на рекомендуемом максимальном разрешении, например 0ad, рассыпает графику в мозаику. Возврат графики в номальное состояние, убить процесс по kill из tty.

В p8 на intel kms через intel_drv этой ошибки нет и xorg-server правильно устанавливает верный размер активной зоны матрицы в 344x194 mm и правильный 100 dpi.

Даташит на матрицу Lenovo G50-80:
LG Display LP156WHB-TPC1 Lenovo G50-80
http://www.datasheet-pdf.com/PDF/LP156WHB-TPC1-Datasheet-LG-929726

VESA EEDID Version 1, Revision 4:
https://glenwing.github.io/docs/VESA-EEDID-A2.pdf


Множество выбросов, включая выбросы X-сервера и разбор edid Lenovo G50-80:

Сравнение kms intel_drv и kms modesetting_drv в p9 и p8, с выбросами xdpyinfo и логами X-сервера, плюс скриншоты и ссылка на даташит LG Display LP156WHB-TPC1 Lenovo G50-80:
https://forum.altlinux.org/index.php?topic=13216.msg351069#msg351069

Разбор edid LP156WHB-TPC1, плюс грепаный лог X-сервера на p9 intel kms intel_drv:
https://forum.altlinux.org/index.php?topic=13216.msg351089#msg351089

Некоторые соображения в отношении неверных установок X-сервером с p9 kms intel_drv и кратко упоминанием сравнения этого же, но на p8:
https://forum.altlinux.org/index.php?topic=13216.msg351090#msg351090


Основная суть:

Активная зона матрицы LG Display LP156WHB-TPC1 Lenovo G50-80:
1366x768, 344.232x193.536 mm, 0.252 mm точка

В p9 с драйвером intel_drv, X-сервер устанвливает неверный физический размер активной зоны матрицы:

$ sed -n '86p; 89p; 143,144p; 1044,1045p' /var/log/Xorg.0.log
[    41.850] (--) intel(0): Output eDP1 using initial mode 1366x768 on pipe 0
[    41.852] (==) intel(0): DPI set to (96, 96)
[    42.472] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none
[    42.480] (II) intel(0): Setting screen physical size to 340 x 190
[    45.964] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none
[    45.989] (II) intel(0): Setting screen physical size to 340 x 190

В результате чего, приложение запускаемое в полный экран на максимальном рекомендуемом разрешении, рассыпает графику в мозаику.


Байты 12, 13, 14, descriptor 1, 

# cat /sys/class/drm/card0-eDP-1/edid > edid-LP156WHB-TPC1_intel_drv.bin

# edid-decode edid-LP156WHB-TPC1_intel_drv.bin
Extracted contents:
header:          00 ff ff ff ff ff ff 00
serial number:   30 e4 68 04 00 00 00 00 00 18
version:         01 04
basic params:    95 22 13 78 ea
chroma info:     05 f5 94 58 56 92 28 1e 50 54
established:     00 00 00
standard:        01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
descriptor 1:    d0 1d 56 f4 50 00 16 30 30 20 35 00 58 c2 10 00 00 19
descriptor 2:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
descriptor 3:    00 00 00 fe 00 4c 47 20 44 69 73 70 6c 61 79 0a 20 20
descriptor 4:    00 00 00 fe 00 4c 50 31 35 36 57 48 42 2d 54 50 43 31
extensions:      00
checksum:        b3

Manufacturer: LGD Model 468 Serial Number 0
Made week 0 of 2014
EDID version: 1.4
Digital display
6 bits per primary color channel
DisplayPort interface
Maximum image size: 34 cm x 19 cm
Gamma: 2.20
DPMS levels: Standby Suspend Off
Supported color formats: RGB 4:4:4, YCrCb 4:4:4
First detailed timing is preferred timing
Established timings supported:
Standard timings supported:
Detailed mode: Clock 76.320 MHz, 344 mm x 194 mm
               1366 1414 1446 1610 hborder 0
                768  771  776  790 vborder 0
               -hsync -vsync
Manufacturer-specified data, tag 0
ASCII string: LG Display
ASCII string: LP156WHB-TPC1
Checksum: 0xb3 (valid)
EDID block does NOT conform to EDID 1.3!
	Missing name descriptor
	Missing monitor ranges


содержат в edid верный размер активной зоны матрицы:

$ ./base.sh 0x58
hex=58    dec=88    oct=130    bin=1011000

$ ./base.sh 0xc2
hex=C2    dec=194    oct=302    bin=11000010

$ ./base.sh 0x10
hex=10    dec=16    oct=20    bin=10000

$ echo '88+256' | bc -l # байт 12 + полубайт байта 14 (младший бит старшего байта, для байтов 12 и 13) из descriptor 1
344


Но в p9 с kms intel_drv, активную зону матрицы, X-сервер устанавливает в 340x190 mm. Что неверно и меньше реального 344x194 mm. И предположительно, это значение берётся из второго и третьего байта basic params из edid-decode. Которые хранятся как целочисленное значение в сантиметрах по адресам 15h 16h (спецификация), что правильно для спецификации VESA EEDID 1R4, но неправильно для установки физического размера активной зоны матрицы.


При этом X-сервер в p9, установленный размер матрицы в конфиге, игнорирует:

$ cat /etc/X11/xorg.conf.d/10-monitor.conf 
# Generated by xsetup

Section "Monitor"
    Identifier "Monitor0"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Option "SwapbuffersWait" "false"
    Driver "intel"
EndSection

устанавливая Setting screen physical size to 340 x 190


В p8 это значение, X-сервер с этим же драйвером, устанавливает верно в 344x194 mm с правильным dpi для этой матрицы:

$ sed -n '81p; 84,85p; 123,124p; 269,271p' /var/log/Xorg.0.log
[    32.851] (--) intel(0): Output eDP1 using initial mode 1366x768 on pipe 0
[    32.852] (**) intel(0): Display dimensions: (344, 194) mm
[    32.852] (**) intel(0): DPI set to (100, 100)
[    33.416] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none
[    33.430] (II) intel(0): Setting screen physical size to 344 x 194
...


Ошибка тестировалась и анализировалась на ноутбуке Lenovo G50-80 в системах на alt-p8-sysv-xfce и alt-p9-xfce-sysv.
Comment 1 Valery Inozemtsev 2020-08-02 13:13:51 MSK
Удалите /etc/X11/xorg.conf.d/10-monitor.conf
Comment 2 Speccyfighter 2020-08-02 14:01:16 MSK
(Ответ для Valery Inozemtsev на комментарий #1)
> Удалите /etc/X11/xorg.conf.d/10-monitor.conf

Удаление 10-monitor.conf не устранит ошибку, а заменит intel_drv на modesetting_drv.
Comment 3 Speccyfighter 2020-08-25 22:47:24 MSK
Эта ошибка пересекается с багом #38841, в котором parse-edid возвращает такой же неверный размер активной зоны дисплея в 340 x 190 mm, байтами 15h 16h edid, что неверно и не соответствует истинному размеру экрана в 344 x 194 mm дисплея LP156WHB-TPC1. Поскольку байты 15h 16h edid, это размер экрана в сантиметрах, округлённый до ближайшего сантиметра (описание двух байтов разделом 3.6.2 спецификации VESA E-EDID Release 1, Revision 4).
Comment 4 Sergey Y. Afonin 2020-08-26 08:34:51 MSK
(In reply to Speccyfighter from comment #0)

> При этом X-сервер в p9, установленный размер матрицы в конфиге, игнорирует:

Такое впечатление у меня тоже сложилось при попытке избавиться от bug 36470. Хотя что не осень понятно - как оно там у меня потом правильно работает после логина.
Comment 5 stranger573 2020-08-26 20:39:06 MSK
(Ответ для Speccyfighter на комментарий #0)

> При этом X-сервер в p9, установленный размер матрицы в конфиге, игнорирует:

Если Identifier "Monitor0", то игнорирует.

Если:
Section "Monitor"
    Identifier "<default monitor>"
    DisplaySize 344 194
EndSection
Вполне себе принимает.
Comment 6 stranger573 2020-08-26 20:45:03 MSK
Похоже попутно ещё и синтаксис в конфигах разломали.
Comment 7 Speccyfighter 2020-08-27 05:04:10 MSK
(Ответ для stranger573 на комментарий #5)
> (Ответ для Speccyfighter на комментарий #0)
> 
> > При этом X-сервер в p9, установленный размер матрицы в конфиге, игнорирует:
> 
> Если Identifier "Monitor0", то игнорирует.
> 
> Если:
> Section "Monitor"
>     Identifier "<default monitor>"
>     DisplaySize 344 194
> EndSection
> Вполне себе принимает.

Спасибо!
Так работает, размер экрана и dpi устанавливается, оба верные, те, которые и должны быть:

$ cat /etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor"
    Identifier "<default monitor>"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Option "SwapbuffersWait" "false"
    Driver "intel"
EndSection


$ sed -n '145,146p' /var/log/Xorg.0.log
[    41.503] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none
[    41.514] (II) intel(0): Setting screen physical size to 344 x 194

$ xdpyinfo | grep -B2 resol
screen #0:
  dimensions:    1366x768 pixels (344x194 millimeters)
  resolution:    101x101 dots per inch