Linux DRM那些事-内核代码

掀开DRM基本概念的面纱后,我们把“罪恶”的小手伸向DRM内核代码。

注:本文和后续DRM驱动系列基于Linux4.4内核、Rockchip RK3399进行介绍。

Linux DRM内核代码路径:drivers/gpu/drm。
使用ls命令查看该目录,显示如下:

root@ubuntu:/home/run/code/rockchip-bsp/kernel/drivers/gpu/drm# ls
amd               drm_atomic.c         drm_crtc_internal.h    drm_fb_cma_helper.c   drm_internal.h  drm_modes.c         drm_rect.c          exynos    mga      rcar-du   ttm
armada            drm_atomic_helper.c  drm_debugfs.c          drm_fb_helper.c       drm_ioc32.c     drm_modeset_lock.c  drm_scatter.c       fsl-dcu   mgag200  rockchip  udl
ast               drm_auth.c           drm_dma.c              drm_flip_work.c       drm_ioctl.c     drm_of.c            drm_scdc_helper.c   gma500    msm      savage    vc4
ati_pcigart.c     drm_bridge.c         drm_dp_helper.c        drm_fops.c            drm_irq.c       drm_panel.c         drm_sync_helper.c   i2c       nouveau  shmobile  vgem
atmel-hlcdc       drm_bufs.c           drm_dp_mst_topology.c  drm_gem.c             drm_legacy.h    drm_pci.c           drm_sysfs.c         i810      omapdrm  sis       via
bochs             drm_cache.c          drm_drv.c              drm_gem_cma_helper.c  drm_lock.c      drm_plane_helper.c  drm_trace.h         i915      panel    sti       virtio
bridge            drm_context.c        drm_edid.c             drm_global.c          drm_memory.c    drm_platform.c      drm_trace_points.c  imx       qxl      tdfx      vmwgfx
cirrus            drm_crtc.c           drm_edid_load.c        drm_hashtab.c         drm_mipi_dsi.c  drm_prime.c         drm_vma_manager.c   Kconfig   r128     tegra
drm_agpsupport.c  drm_crtc_helper.c    drm_encoder_slave.c    drm_info.c            drm_mm.c        drm_probe_helper.c  drm_vm.c            Makefile  radeon   tilcdc

在Linux 内核中,通过Makefile、Kconfig和SOC厂商对应的*defconfig文件配合完成DRM代码编译。在DRM驱动程序中,主要涉及到的文件有:

  1. drivers/gpu/Makefile

    在Makefile中可以看到:obj-y += drm/,说明直接编译drm目录。

    A.小知识点:

    obj-y、obj-m 是Makefile变量。在Makefile中为这些变量赋值后,Kbuild会自动把对象编译到内核或者编译成模块。

    obj-y:表示编译进内核;obj-m:表示编译成模块。

    后续会专门介绍Linux内核Kbuild系统。

  2. drivers/gpu/drm/Makefile、Kconfig

    在Makefile中区分了DRM core和SOC DRM driver的编译。

    1)DRM core对应的部分文件

    drm-y       :=  drm_auth.o drm_bufs.o drm_cache.o \
                    drm_context.o drm_dma.o \
                    drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
                    drm_lock.o drm_memory.o drm_drv.o drm_vm.o \
                    drm_scatter.o drm_pci.o \
                    drm_platform.o drm_sysfs.o drm_hashtab.o drm_mm.o \
                    drm_crtc.o drm_modes.o drm_edid.o \
                    drm_info.o drm_debugfs.o drm_encoder_slave.o \
                    drm_trace_points.o drm_global.o drm_prime.o \
                    drm_rect.o drm_vma_manager.o drm_flip_work.o \
                    drm_modeset_lock.o drm_atomic.o drm_bridge.o \
                    drm_sync_helper.o drm_scdc_helper.o
    

    2)SOC DRM driver对应的部分文件

    obj-$(CONFIG_DRM_TTM)   += ttm/
    obj-$(CONFIG_DRM_R128)  += r128/
    obj-$(CONFIG_HSA_AMD) += amd/amdkfd/
    obj-$(CONFIG_DRM_RADEON)+= radeon/
    obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
    obj-$(CONFIG_DRM_MGA)   += mga/
    obj-$(CONFIG_DRM_I810)  += i810/
    obj-$(CONFIG_DRM_I915)  += i915/
    obj-$(CONFIG_DRM_MGAG200) += mgag200/
    obj-$(CONFIG_DRM_VC4)  += vc4/
    obj-$(CONFIG_DRM_CIRRUS_QEMU) += cirrus/
    obj-$(CONFIG_DRM_SIS)   += sis/
    obj-$(CONFIG_DRM_SAVAGE)+= savage/
    obj-$(CONFIG_DRM_VMWGFX)+= vmwgfx/
    obj-$(CONFIG_DRM_VIA)   +=via/
    obj-$(CONFIG_DRM_VGEM)  += vgem/
    obj-$(CONFIG_DRM_NOUVEAU) +=nouveau/
    obj-$(CONFIG_DRM_EXYNOS) +=exynos/
    obj-$(CONFIG_DRM_ROCKCHIP) +=rockchip/
    obj-$(CONFIG_DRM_GMA500) += gma500/
    obj-$(CONFIG_DRM_UDL) += udl/
    obj-$(CONFIG_DRM_AST) += ast/
    obj-$(CONFIG_DRM_ARMADA) += armada/
    obj-$(CONFIG_DRM_ATMEL_HLCDC)   += atmel-hlcdc/
    obj-$(CONFIG_DRM_RCAR_DU) += rcar-du/
    obj-$(CONFIG_DRM_SHMOBILE) +=shmobile/
    obj-$(CONFIG_DRM_OMAP)  += omapdrm/
    obj-$(CONFIG_DRM_QXL) += qxl/
    obj-$(CONFIG_DRM_BOCHS) += bochs/
    obj-$(CONFIG_DRM_VIRTIO_GPU) += virtio/
    obj-$(CONFIG_DRM_MSM) += msm/
    obj-$(CONFIG_DRM_TEGRA) += tegra/
    obj-$(CONFIG_DRM_STI) += sti/
    obj-$(CONFIG_DRM_IMX) += imx/
    

    在每个文件夹中的Kconfig文件中可以看到对应文件夹实现的功能。以RK3399为例,在drivers/gpu/drm/rockchip/Kconfig中:

    config DRM_ROCKCHIP
            tristate "DRM Support for Rockchip"
            depends on DRM
            depends on RESET_CONTROLLER
            select DRM_KMS_HELPER
            select DRM_KMS_FB_HELPER
            select DRM_PANEL
            select FB_CFB_FILLRECT
            select FB_CFB_COPYAREA
            select FB_CFB_IMAGEBLIT
            select VIDEOMODE_HELPERS
            help
              Choose this option if you have a Rockchip soc chipset.
              This driver provides kernel mode setting and buffer
              management to userspace. This driver does not provide
              2D or 3D acceleration; acceleration is performed by other
              IP found on the SoC.
    

    drivers/gpu/drm/中非SOC DRM driver做个简单说明,见下表。

    文件夹 简介
    bridge 接口转换驱动
    i2c I2C接口的encoder或transmitter芯片驱动
    ttm GEM和TTM是DRM的两套内存管理子系统
    vgem 非硬件支持的GEM服务
  3. drivers/gpu/drm/rockchip/Makefile、Kconfig

    在Makefile文件中,区分了RK3399 DRM驱动和RK3399 各种接口(hdmi、lvds、dp、mipi等)驱动,例:

    rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
                    rockchip_drm_gem.o rockchip_drm_vop.o
    rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
    
    obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o
    obj-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp.o
    cdn-dp-objs := cdn-dp-core.o cdn-dp-reg.o cdn-dp-link-training.o
    obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o
    obj-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o
    obj-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o
    obj-$(CONFIG_ROCKCHIP_LVDS) += rockchip_lvds.o
    obj-$(CONFIG_ROCKCHIP_RGB) += rockchip_rgb.o
    
    obj-$(CONFIG_ROCKCHIP_DRM_BACKLIGHT) += rockchip_drm_backlight.o
    obj-$(CONFIG_DRM_ROCKCHIP) += rockchip_vop_reg.o rockchipdrm.o
    obj-$(CONFIG_ROCKCHIP_DRM_TVE) += rockchip_drm_tve.o
    
    obj-$(CONFIG_ROCKCHIP_RK3066_HDMI) += rk3066_hdmi.o
    obj-$(CONFIG_DRM_ROCKCHIP_RK618) += rk618/
    
  4. arch/arm64/configs/rockchip_linux_defconfig

    rockchip_linux_defconfig文件在内核开始编译时会生成.config文件,在该文件中定义的宏,配合2和3进行编译。例:

    CONFIG_DRM=y
    CONFIG_DRM_LOAD_EDID_FIRMWARE=y
    CONFIG_DRM_DMA_SYNC=y
    CONFIG_DRM_ROCKCHIP=y
    CONFIG_ROCKCHIP_DW_HDMI=y
    

注:使用其它SOC厂商的DRM驱动时,3和4选择对应SOC厂商目录下的Makefile、Kconfig和defcofig。

B.小知识点:

在defconfig文件中,配置宏的值只有y和m。如果不定义配置宏,使用# CONFIG_* is not set

前文中提到:Linux DRM包括: DRM core和DRM Driver。DRM core提供基础框架,为不同SOC DRM driver提供注册接口,同时也给用户态提供一个硬件无关的ioctl调用。DRM driver实现硬件相关部分,负责硬件相关的ioctl调用。下篇文章开始介绍RK3399 DRM driver。

注:本文仅在简书、OSCHINA和今日头条发布过,转载请标注原作者和链接。

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

推荐阅读更多精彩内容

  • 一、Linux 内核源码 到 www.kernel.org 下载官方内内核。 1.linux内核目录 目录说明 a...
    Mr_Michael阅读 6,360评论 0 2
  • 一、Linux内核简介 1.宏内核与微内核 内核分为四大类:单内核(宏内核);微内核;混合内核;外内核。 宏内核(...
    Mr_Michael阅读 1,780评论 0 2
  • Linux操作系统是UNIX操作系统的一种克隆系统,诞生于1991年10月5日(第一次正式向外公布的时间)。Lin...
    konishi5202阅读 3,220评论 0 7
  • make menuconfig过程解析作者 codercjg 在 28 九月 2015, 5:27 下午 make...
    codercjg阅读 951评论 0 1
  • 写在前面   这篇文章旨在介绍Linux内核动态模块开发时的基本结构,以及如何编译开发的模块。 Linux内核模块...
    Mr_Left_阅读 434评论 0 1