Re: DRM/panel: Bringing Linux DRM Display Panel support in the modern age

Linus Walleij <[email protected]> Tue, 26 May 2026 11:30:19 +0200
Newsgroups dev.linux.lists.ksummit
Message-ID <CAD++jLnM0VjQ-51MaW49y6-JukcOiV8aZeq2uHy-T+f8mPWOxg@mail.gmail.com>
Hi Neil,

I support this topic. I have hesitated to sign up as panel maintainer mainly
because I have too much other stuff to do.

One thing we need to discuss is the hostility or active disinterest of
panel IC vendors to the Linux community, or maybe to all their customers.
My general impression is that they rarely publish datasheets, and if so
under NDA, and their idea of a driver is a bunch of opaque custom
commands sent during panel start-up and other infliction points.

Has there ever been a single kernel commit directly from a panel IC
company such as Novatek, Ilitek, Samsung (their panel business unit,
not Samsung mobile), etc?

Do we have any indication that there is interest from the companies
actually doing display controllers?

My view of them is that they seem to be a bunch of company in
Asia who are deeply suspicious of each other and just think their
competitors will copy everything they do, but this may be prejudice
from my side.

On Tue, May 26, 2026 at 9:41 AM Neil Armstrong
<[email protected]> wrote:

> Furthermore, it fails to support advanced Display Driver IC (DDIC) features
> that modern hardware heavily relies on, including:
> - Standby and advanced power states

There are at least some standard DCS commands for this.

> - Advanced color management

For example panel-novatek-nt35510.c, my most ambitious driver:

/*
 * These gamma correction values are 10bit tuples, so only bits 0 and 1 is
 * ever used in the first byte. They form a positive and negative gamma
 * correction curve for each color, values must be strictly higher for each
 * step on the curve. As can be seen these default curves goes from 0x0001
 * to 0x03FE.
 */
#define NT35510_GAMMA_POS_DEFAULT 0x00, 0x01, 0x00, 0x43, 0x00, \
                0x6B, 0x00, 0x87, 0x00, 0xA3, 0x00, 0xCE, 0x00, 0xF1, 0x01, \
(...)
#define NT35510_GAMMA_NEG_DEFAULT 0x00, 0x01, 0x00, 0x43, 0x00, \
                0x6B, 0x00, 0x87, 0x00, 0xA3, 0x00, 0xCE, 0x00, 0xF1, 0x01, \
(...)
        /**
         * @gamma_corr_pos_r: Red gamma correction parameters, positive
         */
        u8 gamma_corr_pos_r[NT35510_P1_GAMMA_LEN];
        /**
         * @gamma_corr_pos_g: Green gamma correction parameters, positive
         */
        u8 gamma_corr_pos_g[NT35510_P1_GAMMA_LEN];
        /**
         * @gamma_corr_pos_b: Blue gamma correction parameters, positive
         */
        u8 gamma_corr_pos_b[NT35510_P1_GAMMA_LEN];
        /**
         * @gamma_corr_neg_r: Red gamma correction parameters, negative
         */
        u8 gamma_corr_neg_r[NT35510_P1_GAMMA_LEN];
        /**
         * @gamma_corr_neg_g: Green gamma correction parameters, negative
         */
        u8 gamma_corr_neg_g[NT35510_P1_GAMMA_LEN];
        /**
         * @gamma_corr_neg_b: Blue gamma correction parameters, negative
         */
        u8 gamma_corr_neg_b[NT35510_P1_GAMMA_LEN];

(...)
        /* Default gamma correction values */
        .gamma_corr_pos_r = { NT35510_GAMMA_POS_DEFAULT },
        .gamma_corr_pos_g = { NT35510_GAMMA_POS_DEFAULT },
        .gamma_corr_pos_b = { NT35510_GAMMA_POS_DEFAULT },
        .gamma_corr_neg_r = { NT35510_GAMMA_NEG_DEFAULT },
        .gamma_corr_neg_g = { NT35510_GAMMA_NEG_DEFAULT },
        .gamma_corr_neg_b = { NT35510_GAMMA_NEG_DEFAULT },

I have added driver support for this based on the code drops from Novatek.

So what we want is being able to actually adjust these curves, like we
do for professional monitors.

However without the datasheet how am I supposed to do anything with this?
I can't just trial-and-error such stuff. Novatek need to back any attempts
and provide feedback to do such stuff.

I guess adding gamma correction to the panel frameworks and using
the existing infrastructure in DRM for this is our problem, but then we at
least need to know what we are doing.

> - Dynamic rate switching
> - Command mode self-refresh
>
> This lack of evolution has led to severe fragmentation between upstream
> and vendor downstream trees for advanced devices support, creating a heavy
> maintenance burden and making native hardware support incredibly difficult.

How do these vendor trees look?

I'm curious. What I expect is more blobs of random hex digits without
explanation writing magic into the display IC and named do_the_stuff().
But maybe there are actually some real first class citizens here with
proper structured drivers and a datasheet to back the code up?

Yours,
Linus Walleij