访问PCIe配置空间using Intel Chipsets

访问PCIe配置空间using Intel Chipsets

 

     目前用于访问PCIe配置空间寄存器的方法需要追溯到原始的PCI规范。为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所有PCI设备的255 bytes配置寄存器。Intel Chipsets目前仍然支持这种访问PCI配置空间的方法。

    PCIe规范在PCI规范的基础上,将配置空间扩展到4K bytes,至于为什么扩展到4K,具体可以参考PCIe规范,这些功能都需要配置空间。原来的CF8/CFC方法仍然可以访问所有PCIe设备配置空间的头255 bytes,但是该方法访问不了剩下的(4K-255)配置空间。怎么办呢?Intel提供了另外一种PCIe配置空间访问方法。Intel Chipset通过将配置空间映射到内存地址空间,PCIe配置空间可以像对映射范围内的内存进行read/write一样来访问了。这种映射是由北桥芯片来完成的,但是不同芯片的映射方式也是不同的。

1、CF8h/CFCH Method

    Intel Chipsets使用IO空间的CF8h/CFCh地址来访问PCI设备的配置寄存器,该方法同样可以访问PCIe设备的头255配置寄存器。

    为了对已知PCI设备发起一个PCI总线配置周期,软件必须执行以下步骤:

  1. PCI设备的总线号必须被填写到IO地址CF8h的[23:16] bits

  2. PCI设备的设备号必须被填写到IO地址CF8h的[15:11] bits

  3. PCI设备的功能号必须被填写到IO地址CF8h的[10:8] bits

  4. 需要访问的寄存器双字地址必须被填写到IO地址CF8h的[7:2] bits

  5. CF8h的最高位为配置位,该位必须设置为1

  6. 对于写操作,将设备的特定信息组合成一个双字(4bytes)后,写到CFCh地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个用于探测 PCI 设备的函数,使用静态修饰符标识只在当前文件中可见。函数名为 agp_ali_probe,接收两个参数,分别是一个指向 pci_dev 结构体的指针 pdev 和一个指向 pci_device_id 结构体的指针 ent。 函数首先定义了一个指向 agp_device_ids 结构体的指针变量 devs,其初始化值为 ali_agp_device_ids。接下来定义了一个指向 agp_bridge_data 结构体的指针变量 bridge 和两个整型变量 hidden_1621_id 和 cap_ptr。 函数通过调用 pci_find_capability 函数查找是否存在 PCI_CAP_ID_AGP 的能力,如果不存在则返回错误码 ENODEV。 然后,函数通过遍历 ali_agp_device_ids 数组,查找是否有匹配的设备 ID,如果找到了则跳转到 found 标签处,否则打印一个错误信息并返回 ENODEV 错误码。 如果找到了匹配的设备 ID,则调用 agp_alloc_bridge 函数分配一个 agp_bridge_data 结构体的内存空间,并将指针赋值给 bridge 变量。如果分配内存失败则返回 ENOMEM 错误码。 接下来,函数根据不同的设备 ID 设置不同的桥驱动,如果是 AL_M1541 设备,则使用 ali_m1541_bridge 驱动,如果是 AL_M1621 设备,则需要读取隐藏的 0xFB 寄存器,根据其值设置不同的芯片组名称,然后使用 ali_generic_bridge 驱动。最后,函数输出一个信息,表示探测到了 ALi 芯片组。 最后,函数通过调用 pci_read_config_dword 函数读取 PCI_AGP_STATUS 寄存器的值,并将其赋值给 bridge->mode 变量,然后通过调用 pci_set_drvdata 函数将 bridge 指针作为私有数据存储到设备的数据结构中。最后,函数通过调用 agp_add_bridge 函数将 bridge 添加到全局 agp_bridge_list 链表中,并返回操作结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值