MTK Linux DRM分析(十四)- Mediatek KMS實現mtk_drm_drv.c(Part.2)

一、MTK KMS分析

mtk_drm_kms_init 函數分析

mtk_drm_kms_init 是 MediaTek DRM 驅動程序中的一個靜態函數(static int mtk_drm_kms_init(struct drm_device *drm)),位于 mtk_drm_drv.c 文件中。該函數的主要作用是初始化 DRM 設備的 Kernel Mode Setting (KMS) 子系統,包括配置顯示模式、綁定硬件組件、創建 CRTC(Controller)、設置 DMA 參數、初始化各種輔助結構和工作隊列等。它是驅動從硬件抽象層過渡到 DRM 框架的核心入口點,通常在組件綁定(component_bind_all)后調用,確保顯示管道(display pipeline)準備就緒,支持用戶空間的圖形渲染和模式設置。

函數的輸入是一個已分配的 drm_device 結構(包含 MediaTek 特定的私有數據 mtk_drm_private)。輸出為 0(成功)或負錯誤碼(失敗)。整個函數邏輯嚴謹,包含多個錯誤處理路徑(使用 goto 跳轉清理資源)。下面我基于提供的代碼,按步驟詳細分析其執行流程、關鍵操作和潛在邏輯。

1. 準備階段:獲取私有數據和檢查依賴
  • struct mtk_drm_private *private = drm->dev_private;
    • 從 drm_device 中提取 MediaTek 特定的私有數據結構 mtk_drm_private,其中包含設備樹節點、寄存器映射、helper_opt 等信息(這些在 mtk_drm_probe 中已初始化)。
  • 檢查 M4U (Memory Management Unit) 支持:
    • if (mtk_drm_helper_get_opt(private->helper_opt, MTK_DRM_OPT_USE_M4U)) { ... }
      • 如果啟用 M4U(IOMMU 相關的內存管理選項),檢查 IOMMU 是否就緒(iommu_present(&platform_bus_type))。
      • 如果 IOMMU 未準備好,返回 -EPROBE_DEFER,延遲驅動探測(probe),等待 IOMMU 驅動加載。這確保了 DMA 內存分配的安全性和連續性(防止內存碎片)。
  • 日志記錄:DDPINFO("%s+\n", __func__); – 輸出調試信息,表示函數開始。
2. 初始化 DRM Mode Config
  • drm_mode_config_init(drm);
    • 初始化 DRM 的模式配置結構(drm_mode_config),設置默認的模式設置回調(如 atomic_check、atomic_commit),啟用原子模式設置支持。
  • 設置默認分辨率限制:
    • drm->mode_config.min_width = 1; drm->mode_config.min_height = 1;
      • 最小分辨率設置為 1x1(默認最小值,避免無效模式)。
    • drm->mode_config.max_width = 4096; drm->mode_config.max_height = 4096;
      • 最大分辨率設置為 4096x4096(默認值,用于檢查幀緩沖區大小限制,在 drm_mode_addfb 中使用)。
  • 設置模式配置函數:drm->mode_config.funcs = &mtk_drm_mode_config_funcs;
    • 關聯 MediaTek 特定的模式配置函數(未在代碼中顯示,但可能是自定義的頁面翻轉、屬性處理等)。
3. 綁定組件和初始化 VBlank
  • ret = component_bind_all(drm->dev, drm);
    • 綁定所有顯示組件(通過 mtk_drm_ops 中的 bind 函數),這些組件在 mtk_drm_probe 中已添加到 match 列表中(如 OVL、RDMA、DSI 等)。
    • 如果綁定失敗,跳轉到 err_config_cleanup 清理 mode config。
  • ret = drm_vblank_init(drm, MAX_CRTC);
    • 初始化 VBlank(垂直同步)支持,最多支持 MAX_CRTC 個 CRTC(通常為 3 或 4,根據 SoC)。
    • VBlank 用于同步幀渲染和顯示,避免撕裂(tearing)。失敗則跳轉到 err_component_unbind 解綁組件。
4. 創建 CRTC(顯示控制器)
  • ret = mtk_drm_crtc_create(drm, private->data->main_path_data);
    • 創建主路徑 CRTC(OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 等)。
    • main_path_data 來自 SoC 特定的數據(如 mt6885_mmsys_driver_data)。
  • 根據設備樹屬性和階段(disp_helper_get_stage())創建擴展路徑:
    • 如果是正常階段(DISP_HELPER_STAGE_NORMAL):
      • 檢查 "enable_ext_alter_path" 屬性,如果啟用,使用 ext_alter_path_data 創建擴展路徑 CRTC(OVL1 -> COLOR1 -> GAMMA -> RDMA1 -> DPI0)。
      • 否則,使用 ext_path_data。
    • 創建第三個 CRTC(third_path_data 或變體,根據 "condition-num" 屬性調整路徑,如是否包含 TDSHP)。
    • 創建第四個 CRTC(如果啟用 "enable_secondary_path" 或 "enable_discrete_path",使用 fourth_path_data_secondary 或 fourth_path_data_discrete)。
  • 這些 CRTC 代表不同的顯示管道,支持多屏輸出(如主屏、擴展屏)。
  • 失敗則跳轉到 err_component_unbind。
  • 注釋:/*TODO: Need to check path rule*/ – 表示路徑規則檢查待實現,可能涉及硬件兼容性。
5. 設置 DMA 和內存分配
  • 選擇 OVL 設備作為 DMA 分配設備:
    • 從主路徑或擴展路徑的第一個組件節點獲取 OVL 設備(private->comp_node[...])。
    • private->dma_dev = &pdev->dev;
      • 使用 OVL 設備進行所有 DMA 內存分配,確保連續 IOVA(IO Virtual Address)用于 PRIME 緩沖區導入。
  • 配置 DMA 參數:
    • 如果 dma_dev->dma_parms 未分配,動態分配(devm_kzalloc)。
    • ret = dma_set_max_seg_size(dma_dev, (unsigned int)DMA_BIT_MASK(32));
      • 設置 DMA 段最大大小為 32-bit(4GB),確保 PRIME 緩沖區導入時的連續性。
    • 失敗則清理并返回。
  • drm_mode_config_reset(drm);
    • 重置模式配置到默認狀態。
6. <

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94853.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型RAG(Retrieval-Augmented Generation)

RAG檢索增強生成 一種結合了檢索與生成能力的人工智能技術&#xff0c;主要用于增強大型語言模型在特定任務中的表現。 含義 RAG 將檢索系統與生成模型相結合&#xff0c;當接收到一個查詢或問題時&#xff0c;模型首先通過檢索模塊從大規模知識庫中尋找與查詢相關的信息片段&a…

企業版Idea 無快捷鍵的啟動方式

在沒有快捷鍵的情況下啟動 IntelliJ IDEA 企業版&#xff0c;可以通過以下幾種方式進行操作&#xff1a; 1. 通過應用程序菜單啟動&#xff08;適用于 macOS&#xff09; 在 macOS 系統中&#xff0c;可以打開 Launchpad&#xff0c;在應用程序列表中找到 IntelliJ IDEA&#x…

智慧清潔革命:有鹿機器人如何重塑三大行業未來

作為有鹿智能巡掃機器人&#xff0c;每天清晨當城市還未蘇醒&#xff0c;我已悄然完成數萬平方米的清潔工作。搭載254TOPS算力的具身智能大腦&#xff0c;我正重新定義保潔、環衛和物業行業的清潔標準。技術賦能&#xff1a;智慧清潔的全面突破我搭載的Master2000通用具身大腦和…

安寶特方案丨AR異地專家遠程支持平臺,適合:機電運維、應急處置、監造驗收

隨著車間設備智能化程度的不斷提高&#xff0c;其復雜性越來越高&#xff0c;故障維修難度越來越大&#xff0c;嚴重依賴設備原廠的技術支持和上門服務。但設備廠家受制于地理遠近和專業人才數量的限制&#xff0c;服務的及時性和服務質量均很難保證。鑒于市場現有的通信聊天軟…

QT應用層項目20250822

01.服務器端代碼1.dbhelper.cpp#include "dbhelper.h" #include <iostream> #include <cstring>using std::string; using std::cerr; using std::cout; using std::endl;template <typename T> std::vector<T>& operator<<(std::…

【Linux】Linux基礎開發工具從入門到實踐

前言&#xff1a;學了Linux的指令&#xff0c;再就是Linux基礎開發工具&#xff0c;熟練掌握基礎開發工具是提升效率的關鍵。本文學習Linux的基礎開發工具&#xff0c;無論是軟件安裝、代碼編輯&#xff0c;還是編譯調試、版本控制&#xff0c;一套順手的工具鏈能讓你在開發路上…

黑馬點評|項目日記(day02)

目錄 一. 全局id生成器 1.為什么需要全局id生成器 2.傳統方式的缺陷: 3.典型全局 ID 生成方案的設計思路 二.優惠券秒殺-Redis實現全局唯一id 三.優惠券秒殺-添加優惠券 四.優惠券秒殺-實現秒殺下單 五. 一人一單問題 1.單體項目下 1,超賣問題思路分析 2.樂觀鎖解決問…

shell腳本編程規范與變量

文章目錄Shell編程文檔整理一、Shell介紹1.1 簡介1.2 Shell解釋器二、快速入門2.1 編寫Shell腳本2.1.1 創建腳本示例2.1.2 賦予執行權限2.2 執行Shell腳本三、Shell程序&#xff1a;變量3.1 語法格式3.2 變量使用3.3 變量類型四、字符串4.1 單引號4.2 雙引號4.3 獲取字符串長度…

【AGI使用教程】Coze 搭建智能體(1)

歡迎關注【AGI使用教程】 專欄 【AGI使用教程】GPT-OSS 本地部署&#xff08;1&#xff09; 【AGI使用教程】GPT-OSS 本地部署&#xff08;2&#xff09; 【AGI使用教程】Coze 搭建智能體&#xff08;1&#xff09; 【AGI使用教程】Coze 搭建智能體&#xff08;2&#xff09; 【…

(二分查找)Leetcode34. 在排序數組中查找元素的第一個和最后一個位置+74. 搜索二維矩陣

首先要明確二分查找算法如何實現&#xff0c;是采用左閉右閉還是左閉右開 左閉右閉 第?種寫法&#xff0c;我們定義 target 是在?個在左閉右閉的區間?&#xff0c;也就是[left, right] &#xff08;這個很重要?常重要&#xff09;。 區間的定義這就決定了?分法的代碼應…

損失函數,及其優化方法

什么是損失函數&#xff1f;損失函數&#xff0c;也稱為代價函數&#xff0c;是一個用來??衡量機器學習模型預測結果與真實值之間差距??的函數。損失函數的優化方法有哪些&#xff0c;各自優缺點是什么&#xff0c;他們的應用范圍是什么&#xff1f;方法類別代表算法核心思…

pyqt+Python證件號智能校驗工具

目錄 一、引言 二、GUI界面設計 1.相關提示 2.效果演示 3.界面設計.py 三、主要程序詳解 1.導入相關模塊 2.初始化設置 3.校驗過程 四、總程序代碼 一、引言 在數字化轉型加速的背景下&#xff0c;證件信息核驗已成為金融、政務、安防等領域的剛需。傳統人工校驗存在…

主流技術棧 NestJS、TypeScript、Node.js版本使用統計

&#x1f4ca; 2024年主流技術棧版本使用統計&#x1f527; TypeScript 采用情況全球采用率: 38.5% 的開發者使用 TypeScript&#xff08;Stack Overflow 2024&#xff09;增長趨勢: 從 2017年的 12% 增長到 2024年的 35%&#xff08;JetBrains 調研&#xff09;TypeScript vs …

Techub News 與 TOKENPOST 達成戰略合作以推動中韓 Web3 資訊互通

Techub News 消息&#xff0c;香港 Web3 媒體 Techub News 與韓國區塊鏈媒體 TOKENPOST 達成戰略合作。TOKENPOST 將開設香港內容板塊&#xff0c;由 Techub News 提供本地化行業資訊&#xff1b;同時 Techub News 將推出韓國內容專欄&#xff0c;內容源由 TOKENPOST 支持。這一…

Java面試實戰系列【JVM篇】- JVM內存結構與運行時數據區詳解(私有區域)

文章目錄一、前言1.1 什么是JVM內存結構1.2 JVM內存結構與Java內存模型的區別1.3 為什么面試官愛問JVM內存結構二、JVM運行時數據區總覽2.1 運行時數據區域劃分2.2 線程私有區域 vs 線程共享區域三、線程私有區域詳解3.1 程序計數器&#xff08;PC Register&#xff09;3.1.1 定…

鴻蒙中使用極光推送

官方給出的步驟是對的&#xff0c;就是一時不知道從何下手&#xff0c;自己整了下&#xff0c;按照這個來就行 1.步驟 打開 APP 通知功能 1.先按照這個頁面進行配置SDK 集成指南 - 極光文檔&#xff0c;主要就是下載極光sdk&#xff0c;然后在AGC里開通推送服務&#xff0c;配…

ruoyi_wvp流媒體[海康 大華 GB1812 onvif rtsp]

ZLMediaKitxiaz: https://download.csdn.net/download/jinhuding/91775096 webrtc: https://download.csdn.net/download/jinhuding/91764243 yoloonnx(v3,v7,v8s,v9c)&#xff1a;https://download.csdn.net/download/jinhuding/91775170 項目部署步驟 1.后端目錄結構 2.前端…

強化學習筆記(二):有限馬爾可夫決策過程(一)

有限馬爾可夫決策過程 基本概念 多臂老虎機僅涉及評價性反饋&#xff0c;即動作的即時獎勵&#xff0c;估計每個動作 aaa 的價值 q?(a)q_*(a)q??(a)。 有限馬爾可夫決策過程&#xff08;Finite MDP&#xff09;引入了關聯性因素&#xff0c;即在不同狀態&#xff08;情境&am…

Maven項目中settings.xml終極優化指南

文章目錄1. 基礎優化2. 鏡像源優化&#xff08;國內推薦&#xff09;3. 插件倉庫優化4. 并行構建提升 30%-80%5. 下載可靠性優化6. CI/CD 環境優化7. 進階&#xff1a;依賴鎖定與預下載8. 實現效果Maven settings.xml 終極優化指南&#xff0c;重點是&#xff1a;構建速度提升、…

RCC_APB2PeriphClockCmd

RCC_APB2PeriphClockCmd 函數在STM32的標準外設庫中扮演著“電源開關”的角色。要理解這個函數&#xff0c;我們需要明白STM32微控制器的幾個關鍵概念&#xff1a;1. 外設時鐘與低功耗設計STM32內部有非常多的外設&#xff0c;如GPIO&#xff08;A, B, C...D&#xff09;、USAR…