基于片上系统的radeon rs780显卡驱动设计
1 平台相关信息 4
2 RS780图形加速相关技术 5
显存空间分配和管理 5
显存空间分配示例 5
显存空间分配管理机制 7
微码加载 11
命令处理器和缓冲区 11
命令处理器 11
环形缓冲区 13
间接缓冲区 14
3 pm4包 17
4 CPU与GPU 的fence同步 24
5 模式设置和测试 26
6 GPU驱动代码分析 27
PCI空间资源访问 27
GPU初始化和启动流程分析 28
GPU实现代码详细分析 29
显存空间初始化 29
显存控制器和输出模式 30
命令控制器设置 31
平台相关信息
在实现中我们需要注意的是龙芯页面大小是16K,GPU页表项大小为8B,每个GART页表项对应一个物理页。另外,系统可以将128M VRAM空间和IO空间全部映射给CPU,因此对CPU而言,可以实现对显存的的管理和操作。GPU详细信息请参考ATI的《》等文档。
RS780图形加速相关技术
rs780显卡驱动的设计(参考DRM/radeon)中,主要涉及到显存空间分配和管理、微码加载、CP&ring buffer、pm4包、CPU与GPU fence同步和模式设置及测试等相关技术。
显存空间分配和管理
显存空间分配示例
经过对系统信息的获取和分析,我们得知GPU的VRAM地址空间范围:从0X40000000到0X48000000;同时,还可以使用GART机制将系统内存空间映射为GPU显存,在我们的设计中仅仅使用了128M,作为测试验证使用(而radeon显卡一般需要分配不少于512M)。并通过PCI BAR0和BAR2寄存器,将PCI设备(此系统上GPU为PCI设备) memory和IO空间映射出来,以供CPU访问。显存分配结构图-。
图- 显存分配结构
现对图-,rs780 radeon 显卡是32位GPU,可以访存空间是4G。硬件设计上,VRAM大小是128M,地址范围:0X40000000~0X47FFFFFF;从0X48000000之上,是我们映射的128M系统主存空间,称为GTT主存空间。这样以来,我们就可以根据使用需求来对显存做具体划分,比如,我们在GTT主存上为ring buffer分配空间,地址范围:0X48004000~0X48103FFF。VRAM的分配较为简单(在此没对显存做管理,仅是最简单的使用方式),直接指定地址就可以,比如,
[FB_ZONE].size = ALIGN( 8 << 20UL, PAGE_SIZE);
[FB_ZONE].gpu = [VRAM_ZONE].gpu;
[FB_ZONE].cpu = [VRAM_ZONE].cpu;
这样,只要我们自己做合理的划分使用,就可以保证访问显存的合理合法性。另一方面,在显存的使用中比较麻烦的是GTT主存部分。这里要将系统主存映射为显存空间,然后才能使用。这其中涉及到分页机制的使用,而且在我们的系统上,CPU和GPU页大小并不一致,CPU页为16K,GPU页为4K(第一节中有介绍),具体关系见图-。
图- 系统内存和显存映射关系
在这样的一个过程,首先要分配连续的系统主存页,然后使用页表机制,将分配的空间映射到GTT主存空间。其中一个主要的函数是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 *)[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));
}
GPU内核代码分析 来自淘豆网m.daumloan.com转载请标明出处.