GPU内核代码分析.doc

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GPU内核代码分析

基于片上系统的radeon rs780显卡驱动设计 1 平台相关信息 4 2 RS780图形加速相关技术 5 2.1 显存空间分配和管理 5 2.1.1 显存空间分配示例 5 2.1.2 显存空间分配管理机制 7 2.2 微码加载 11 2.3 命令处理器和缓冲区 11 2.3.1 命令处理器 11 2.3.2 环形缓冲区 13 2.3.3 间接缓冲区 14 3 pm4包 17 4 CPU与GPU 的fence同步 24 5 模式设置和测试 26 6 GPU驱动代码分析 27 6.1 PCI空间资源访问 27 6.2 GPU初始化和启动流程分析 28 6.3 GPU实现代码详细分析 29 6.3.1 显存空间初始化 29 6.3.2 显存控制器和输出模式 30 6.3.3 命令控制器设置 31 平台相关信息 在实现中我们需要注意的是龙芯页面大小是16K,GPU页表项大小为8B,每个GART页表项对应一个物理页。另外,系统可以将128M VRAM空间和IO空间全部映射给CPU,因此对CPU而言,可以实现对显存的的管理和操作。GPU详细信息请参考ATI的《R6xx_R7xx_3D.pdf》等文档。 RS780图形加速相关技术 rs780显卡驱动的设计(参考DRM/radeon)中,主要涉及到显存空间分配和管理、微码加载、CPring buffer、pm4包、CPU与GPU fence同步和模式设置及测试等相关技术。 显存空间分配和管理 2.1.1 显存空间分配示例 经过对系统信息的获取和分析,我们得知GPU的VRAM地址空间范围:从00同时,还可以使用GART机制将系统内存空间映射为GPU显存,在我们的设计中仅仅使用了128M,作为测试验证使用(而radeon显卡一般需要分配不少于512M)。并通过PCI BAR0和BAR2寄存器,将PCI设备(此系统上GPU为PCI设备) memory和IO空间映射出来,以供CPU访问。显存分配结构图-2.1.1。 图1 显存分配结构 现对图-2.1.1做详细分析,rs780 radeon 显卡是32位GPU,可以访存空间是4G。硬件设计上,VRAM大小是128M,地址范围:00X47FFFFFF;从0上,是我们映射的128M系统主存空间,称为GTT主存空间。这样以来,我们就可以根据使用需求来对显存做具体划分,比如,我们在GTT主存上为ring buffer分配空间,地址范围:00X48103FFF。VRAM的分配较为简单(在此没对显存做管理,仅是最简单的使用方式),直接指定地址就可以,比如, rdev.zone[FB_ZONE].size = ALIGN( 8 20UL, PAGE_SIZE); rdev.zone[FB_ZONE].gpu = rdev.zone[VRAM_ZONE].gpu; rdev.zone[FB_ZONE].cpu = rdev.zone[VRAM_ZONE].cpu; 这样,只要我们自己做合理的划分使用,就可以保证访问显存的合理合法性。另一方面,在显存的使用中比较麻烦的是GTT主存部分。这里要将系统主存映射为显存空间,然后才能使用。这其中涉及到分页机制的使用,而且在我们的系统上,CPU和GPU页大小并不一致,CPU页为16K,GPU页为4K(第一节中有介绍),具体关系见图-2.2.2。 图static inline void set_gpu_page(uint64_t dma_addr, uint32_t index),用于实现填写页表项的过程。 static inline void set_gpu_page(uint64_t dma_addr, uint32_t index) { void __iomem *ptr = (void *)rdev.zone[GTT_TABLE_ZONE].cpu; dma_addr = 0xfffffffffffff000ULL; dma_addr |= R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED; dma_addr |=R600_PTE_READABLE |R600_PTE_WRITEABLE; writeq(dma_addr, ((void __iomem *)ptr) + (index * 8)); } 将dma_addr地址写到以ptr为基址,每次向index索引(偏移)位置写8B(页表项大小)。现以为ring buffer分配1M连续空间分配为例。 rdev.cp_dma_addr = dma_addr; tmp_addr =

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档