最近在看frame buffer相关的,看到这个结构体:(定义在fb.h中)
struct fb_fix_screeninfo {
char id[16]; /* identification string eg "TT Builtin" */
unsigned long smem_start; /* Start of frame buffer mem */
/* (physical address) */
__u32 smem_len; /* Length of frame buffer mem */
__u32 type; /* see FB_TYPE_* */
__u32 type_aux; /* Interleave for interleaved Planes */
__u32 visual; /* see FB_VISUAL_* */
__u16 xpanstep; /* zero if no hardware panning */
__u16 ypanstep; /* zero if no hardware panning */
__u16 ywrapstep; /* zero if no hardware ywrap */
__u32 line_length; /* length of a line in bytes */
unsigned long mmio_start; /* Start of Memory Mapped I/O */
/* (physical address) */
__u32 mmio_len; /* Length of Memory Mapped I/O */
__u32 accel; /* Indicate to driver which */
/* specific chip/card we have */
__u16 capabilities; /* see FB_CAP_* */
__u16 reserved[2]; /* Reserved for future compatibility */
};
发现它有smem_start和mmio_start两个字段。我刚开始看的时候就很疑惑:“帧缓冲区不就是MMIO的吗,这两个字段的区别在哪里?”
然后我翻了一些显卡的驱动代码,发现大部分的显卡驱动都是认为smem_start字段是“线性帧缓冲区的物理地址”,而“mmio_start”则是设备的一些可通过mmio来操作的寄存器之类的映射的基地址。
比如在 linux-6.1.9/drivers/video/fbdev/aty/radeon_base.c的1985和1993行,就是体现了上面的含义。
接着翻邮件列表,发现了下面这个对话:
https://www.spinics.net/lists/linux-fbdev/msg17606.html
主题: what’s the difference between smem_start and mmio_start?
发件人: z f taishan901028@xxxxxxxxx
发送日期: Sat, 18 Apr 2015 15:46:48 +0800
内容:
什么是 struct fb_fix_screeninfo 中的 smem_start 成员和 mmio_start 成员之间的区别?
我查看了 fb_mmap() 函数,但无法理解其行为:
http://lxr.free-electrons.com/source/drivers/video/fbdev/core/fbmem.c#L1413
邮件2:
https://www.spinics.net/lists/linux-fbdev/msg17732.html
主题: Re: what's the difference between smem_start and mmio_start?
发件人: Sudip Mukherjee sudipm.mukherjee@xxxxxxxxx
发送日期: Fri, 24 Apr 2015 13:00:04 +0530
在 2015年4月18日周六 15:46:48 +0800,z f 写道:
什么是 struct fb_fix_screeninfo 中的 smem_start 成员和 mmio_start 成员之间的区别?
让我尝试回答,但我不确定我是否完全正确。
smem_start 给出了您的帧缓冲区内存开始的地址。mmio_start 將给您一个可以从哪里访问内存映射 I/O 端口的内存地址。
我认为并非所有硬件都会遵循相同的定位规则。
例如,考虑我在 staging/sm7xxfb 中的驱动程序,内存映射如下:
所以这里有:
smem_start = pci_resource_start (pdev, 0); mmio_start = smem_start + 4MB
但是如果你看看 Radeon 驱动程序,你会看到他们有 smem_start = pci_resource_start (pdev, 0); 以及 mmio_start = pci_resource_start (pdev, 2);
祝好, Sudip
因此证实了我上面那个猜想:smem_start字段是“线性帧缓冲区的物理地址”,而“mmio_start”则是设备的一些可通过mmio来操作的寄存器之类的映射的基地址。
转载请注明来源:https://longjin666.cn/?p=1807
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~