最近在看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

欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~

你也可能喜欢

发表评论