Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe

Nouveau源码分析(三)

向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照.

对于匹配的设备,PCI模块就调用对应的probe函数,也就是nouveau_drm_probe.

// /drivers/gpu/drm/nouveau/nouveau_drm.c
281 static int nouveau_drm_probe(struct pci_dev *pdev,
282                              const struct pci_device_id *pent)
283 {
284         struct nouveau_device *device;
285         struct apertures_struct *aper;
286         bool boot = false;
287         int ret;
288 
289         /* remove conflicting drivers (vesafb, efifb etc) */
290         aper = alloc_apertures(3);
291         if (!aper)
292                 return -ENOMEM;
293 
294         aper->ranges[0].base = pci_resource_start(pdev, 1);
295         aper->ranges[0].size = pci_resource_len(pdev, 1);
296         aper->count = 1;
297 
298         if (pci_resource_len(pdev, 2)) {
299                 aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
300                 aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
301                 aper->count++;
302         }
303 
304         if (pci_resource_len(pdev, 3)) {
305                 aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
306                 aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
307                 aper->count++;
308         }
309 
310 #ifdef CONFIG_X86
311         boot = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
312 #endif
313         if (nouveau_modeset != 2)
314                 remove_conflicting_framebuffers(aper, "nouveaufb", boot);
315         kfree(aper);
316 
317         ret = nouveau_device_create(pdev, NOUVEAU_BUS_PCI,
318                                     nouveau_pci_name(pdev), pci_name(pdev),
319                                     nouveau_config, nouveau_debug, &device);
320         if (ret)
321                 return ret;
322 
323         pci_set_master(pdev);
324 
325         ret = drm_get_pci_dev(pdev, pent, &driver);
326         if (ret) {
327                 nouveau_object_ref(NULL, (struct nouveau_object **)&device);
328                 return ret;
329         }
330 
331         return 0;
332 }

第290~315行,分配了一个aper,把资源位置写进去,调用了remove_conflicting_framebuffer,接着释放这个aper.

一行注释和函数名已经说的很明白,就是移除冲突的framebuffer.


第317行,创建一个NV设备的结构体,这个函数我们要仔细看

// /drivers/gpu/drm/nouveau/core/include/engine/device.h
 13 #define nouveau_device_create(p,t,n,s,c,d,u)                                   \
 14         nouveau_device_create_((void *)(p), (t), (n), (s), (c), (d),           \
 15                                sizeof(**u), (void **)u)
 16 
 17 int  nouveau_device_create_(void *, enum nv_bus_type type, u64 name,
 18                             const char *sname, const char *cfg, const char *dbg,
 19                             int, void **);
想起了什么? 对,就是上一节讲的内容,我们还是先来看结构体.

// /drivers/gpu/drm/nouveau/core/include/core/device.h
 65 struct nouveau_device {
 66         struct nouveau_engine base;
 67         struct list_head head;
 68 
 69         struct pci_dev *pdev;
 70         struct platform_device *platformdev;
 71         u64 handle;
 72 
 73         struct nvkm_event event;
 74 
 75         const char *cfgopt;
 76         const char *dbgopt;
 77         const char *name;
 78         const char *cname;
 79         u64 disable_mask;
 80 
 81         enum {
 82                 NV_04    = 0x04,
 83                 NV_10    = 0x10,
 84                 NV_11    = 0x11,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nouveau 0000:01:00.0 是一种开源 NVIDIA 驱动程序,它通过 Linux 内核中的 DRM 框架与 NVIDIA 显卡进行交互。这个编号表示它正在使用第 1 个 PCI 总线上的第 0 个设备,也就是显卡。 ### 回答2: nouveau 0000:01:00.0 是一个Linux内核中的驱动程序,它用来支持NVIDIA的图形处理器。这个驱动程序是开源的,由社区开发和维护。在Linux系统中,它提供了对NVIDIA显卡的开源支持,使得用户可以在Linux系统中使用NVIDIA显卡进行图形计算、游戏和其他图形相关的任务。 0000:01:00.0 是NVIDIA显卡在计算机系统中的物理地址。在计算机硬件中,每个设备都有一个唯一的物理地址,用来标识它在计算机总线上的位置。0000:01:00.0 表示该显卡位于PCI总线上的第一个插槽,也就是编号为0x01的插槽。 通过nouveau 0000:01:00.0 驱动程序,Linux系统可以与这个NVIDIA显卡进行通信,并运行相关的应用程序。这个驱动程序提供了图形加速、视频解码、显示输出等核心功能,保证了NVIDIA显卡在Linux系统中的正常工作。 nouveau驱动程序是由社区团队开发和维护的,因此它通常与操作系统的发行版本捆绑在一起。用户在安装Linux操作系统后,通常会自动获取、安装和配置nouveau驱动程序。然而,有时用户也可以选择手动下载和安装最新版本的驱动程序,以获取更好的性能和支持。 总之,nouveau 0000:01:00.0 是一个Linux系统中用来支持NVIDIA显卡的开源驱动程序。它提供了对显卡的核心功能支持,使得用户可以在Linux系统中充分利用NVIDIA显卡的图形处理能力。 ### 回答3: nouveau是一个开源的显卡驱动程序,用于支持NVIDIA的显卡。0000:01:00.0则代表着PCI总线上的一个设备地址,用于唯一标识一块显卡。 在计算机中,显卡是用于处理和呈现图形的硬件设备。而NVIDIA是一个著名的显卡制造商,其产品在高性能计算、游戏和数据处理等领域广泛使用。nouveau则是为NVIDIA显卡开发的一个开源驱动程序,它的目的是提供一种免费的、开放源代码的解决方案,取代NVIDIA官方闭源驱动。 而0000:01:00.0这个地址则是唯一标识一块显卡的方式之一,它采用PCI总线的寻址方式。在计算机系统中,每个设备都会有一个唯一的地址,这使得操作系统能够准确地找到设备并与其进行通信。因此,0000:01:00.0可以被看作是一块显卡在计算机中的身份证明。 总而言之,nouveau 0000:01:00.0代表着一块使用开源驱动NVIDIA显卡,在计算机中具有唯一的地址,并且可以通过该地址进行准确的通信和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值