kernel5.4版本gpu DRM驱动入门--Apple的学习笔记

一,前言

昨天的framebuffer驱动qemu仿真调试--Apple的学习笔记中我提及到vxpress v9仿真使用的是drm不是framebuffer,所以今天来说说drm。

二,DRM框架

关于mesa,opengl和vulkan的3D绘图我之前都做过。大总结:嵌入式3D动画学习步骤总结--Apple的学习笔记里面有好几篇drm相关的。但是没有从内核驱动角度去分析,我当时主要学习的是3D应用编程。所以我先查了下内核help文档,并且网上搜索了下drm源码分析的资料,大概了解了下框架及drm_driver和相关主要函数。
之前学习framebuffer,我直接用下图左边的mmap操控显示。以前学习opengl等的时候使用的是下图右边绿色的通路操控显示。这就是区别,然后除了drm还有KMS,但是KMS我还不太清楚,所以先忽略。
自己先画一个层次图,理清下模块关系。

image.png

我现在理解DRM相关模块含义
1.framebuffer依然是画布。
2.CRTC是显示模式[等价于fb_info构造的fbdev](panel是显示区 域)。
3.Decoder是解码算法(比如yuv,rgb等)
4.Connector是连接接口转换波形用的(比如HDMI或DVI,他们的接口及显示时序不同吧!)

三,drm源码分析(Kernel 5.4.61)

搜索从设备树来定位使用的驱动代码sil,sii9022,立即搜索可以定位到sii902x_dt_ids.c而sii9022是HDMI解码芯片,它是一个i2c总线设备,不看具体内容,从框架角度来理解是比较容易的。
看了下设备树中endpoint的帮助,通过帮助还了解到了cma大容量内存设置也在设备树完成。
但是问题来了搜索关键字arm,pl111的时候,是在pl111_vexpress_clcd_init(pl111_vexpress.c)函数内,对应的c文件都没有probe函数的,感觉不太对呢!自己大概的看下相关c代码,我猜测应该会进入pl111_amba_probe(pl111_drv.c)函数。然后看到了,经过一路我不太熟悉的API调用后,会调用到register_framebuffer函数
drm_fb_helper_initial_config
-->__drm_fb_helper_initial_config_and_unlock
---->register_framebuffer
还是调试下吧!主要是看看probe是怎么进入的。
因为pl111_drv.c中只看到match table,而且没有name,只有id。

static const struct amba_id pl111_id_table[] = {
    {
        .id = 0x00041110,
        .mask = 0x000fffff,
        .data = (void *)&pl110_variant,
    },
    {
        .id = 0x00180110,
        .mask = 0x00fffffe,
        .data = (void *)&pl110_nomadik_variant,
    },
    {
        .id = 0x00041111,
        .mask = 0x000fffff,
        .data = (void *)&pl111_variant,
    },
    {0, 0},
};

四,drm驱动调试

果然可以进入pl111_amba_probe函数,我猜测正确,但是如何match的呢?

image.png

关于match函数一般都在bus相关的函数中,我找到了amba bus注册amba_driver_register,然后看到了关键函数amba_match

struct bus_type amba_bustype = {
    .name       = "amba",
    .dev_groups = amba_dev_groups,
    .match      = amba_match,
    .uevent     = amba_uevent,
    .dma_configure  = platform_dma_configure,
    .pm     = &amba_pm,
};

match函数中会调用amba_lookup,然后我看到了table->id和table->mask,我觉得和pl111_drv.c中的pl111_id_table对应上了,但是periphid是怎么来的呢?

static const struct amba_id *
amba_lookup(const struct amba_id *table, struct amba_device *dev)
{
    while (table->mask) {
        if (((dev->periphid & table->mask) == table->id) &&
            ((dev->cid != CORESIGHT_CID) ||
             (amba_cs_uci_id_match(table, dev))))
            return table;
        table++;
    }
    return NULL;
}

源码中搜索了下关键字periphid,猜测就是通过如下赋值的。

static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
{
......
        /*
         * Read pid and cid based on size of resource
         * they are located at end of region
         */
        for (pid = 0, i = 0; i < 4; i++)
            pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) <<
                (i * 8);
        for (cid = 0, i = 0; i < 4; i++)
            cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) <<
                (i * 8);

        if (cid == CORESIGHT_CID) {
            /* set the base to the start of the last 4k block */
            void __iomem *csbase = tmp + size - 4096;

            dev->uci.devarch =
                readl(csbase + UCI_REG_DEVARCH_OFFSET);
            dev->uci.devtype =
                readl(csbase + UCI_REG_DEVTYPE_OFFSET) & 0xff;
        }

        amba_put_disable_pclk(dev);

        if (cid == AMBA_CID || cid == CORESIGHT_CID) {
            dev->periphid = pid;  //periphid是在此处赋值的
            dev->cid = cid;
        }
}

然后调试验证下,谜底揭开了。果然是在此处赋值的,每次都是赋值新的值。通过函数内的注释大概了解到这些数值是资源的地址范围。此款芯片我不了解,暂时也不去下载datasheet查看,本次目的主要是顺便学习内核drm子系统框架,至于具体的drm内核API及详细代码将来有空再研究。


image.png

五,总结

了解了drm框架中的主要模块及关系。验证了pl111 LCDC驱动的probe是通过id经过mask匹配资源地址成功后进入的。另外了解下基于drm的设备树的关键字,今天算是drm驱动入门了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容