- 1、本文档共31页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 =
您可能关注的文档
最近下载
- Unit 6 Understanding ideas Longji Rice Terraces 课件-高中英语外研版(2019)必修第一册.pptx VIP
- 护理学导论(高职)教学教案.docx
- 2024年部编新改版语文六年级上册全册月考试题含答案(共4套).docx
- 饮用水和环境卫生公众健康宣教及风险沟通答案-2024年全国疾控系统“大学习”活动.docx VIP
- 新型冠状病毒、甲型和乙型流感病毒全预混冻干多重荧光PCR检测试剂盒及其检测方法发明专利.pdf VIP
- 基金会捐赠协议.doc VIP
- XX市智慧安居工程(一期)报警求助综合受理指挥分系详细设计方案.doc VIP
- 《乡土中国》 第11篇 《长老统治》.ppt
- [知识]职业生涯人物访谈(教师).pdf VIP
- 第六单元整本书阅读《西游记》课件 2024—2025学年统编版语文七年级上册.pptx VIP
文档评论(0)