免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6683 | 回复: 17
打印 上一主题 下一主题

[硬件及驱动] 关于pci_mmcfg的疑问。。。 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-19 12:45 |只看该作者 |倒序浏览
  1. static struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start,
  2.                            int end, u64 addr)
  3. {   
  4.     struct pci_mmcfg_region *new;
  5.     struct resource *res;
  6.    
  7.     if (addr == 0)
  8.         return NULL;

  9.     new = kzalloc(sizeof(*new), GFP_KERNEL);
  10.     if (!new)
  11.         return NULL;

  12.     new->address = addr;
  13.     new->segment = segment;
  14.     new->start_bus = start;
  15.     new->end_bus = end;

  16.     res = &new->res;
  17.     res->start = addr + PCI_MMCFG_BUS_OFFSET(start);<------------
  18.     res->end = addr + PCI_MMCFG_BUS_OFFSET(end + 1) - 1;<------------
  19.     res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
  20.     snprintf(new->name, PCI_MMCFG_RESOURCE_NAME_LEN,
  21.          "PCI MMCONFIG %04x [bus %02x-%02x]", segment, start, end);
  22.     res->name = new->name;

  23.     return new;
  24. }
复制代码
res->start,res->end该如何理解?是望指点啊,谢谢。。。。

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
2 [报告]
发表于 2014-03-19 14:26 |只看该作者
  这是哪个版本的内核。应该是3.0以后的吧。。我看的是2.6里面没有这个接口

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-03-19 14:28 |只看该作者
回复 2# kiongf

3.9版本的



   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
4 [报告]
发表于 2014-03-19 14:30 |只看该作者
回复 3# chishanmingshen


    :wink: 没接触过。这个MMconfig是不是抽象了所有pci总线设备的配置空间到一个统一的一层?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [报告]
发表于 2014-03-19 15:08 |只看该作者
回复 1# chishanmingshen

对这个不了解。稍微搜索了下:

MMCONFIG的MM == Memory-Mapped,是PCI-E引入的,传统PCI没有。
它是要求firmware在ACPI中提供一个MCFG表,用做pcie设备的配置。


根据代码我大概猜测:

addr是物理地址中映射为 pcie的配置空间的区域的起始地址。

每一条总线直接占据 1MB的物理地址空间。见
#define PCI_MMCFG_BUS_OFFSET(bus)      ((bus) << 20)

每个 pci_mmcfg_region代表了 某个 PCI域中 start到 end范围内的总线总共占据的物理地址空间。

然后把这段物理地址空间范围写入到 struct resource当中,向系统报备这段物理地址空间已经在使用中了!类似于驱动中 request_mem_region()的动作!

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2014-03-19 16:26 |只看该作者
回复 5# asuka2001

谢谢。:wink:
几个疑问:
1.4k大小的pcie配置空间,1M是何含义?
2.这个mmcfg,哪里给填好的?是acpi?
3.mmcfg的配置范围哪里看得到?/proc/iomem中?


   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2014-03-19 16:29 |只看该作者
回复 4# kiongf
应该是吧。:wink:

   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
8 [报告]
发表于 2014-03-19 16:38 |只看该作者
本帖最后由 asuka2001 于 2014-03-19 16:51 编辑

回复 6# chishanmingshen

1. 每个 function配置空间占 4K,每个 bus 32 dev ,每个 dev 8 function 。所以:

4K * 32 * 8 = 1MB

一条总线最大需要 1MB的物理地址来映射其下挂载的所有 pci设备的配置空间!

2. 我猜测是 acpi,希望有人能够证实!

首先涉及到的是分配一块物理地址空间用以映射 pci设备的配置空间。目前看是从 E820表取的 reserve区域。

其次怎么配置北桥,让其将对该物理地址区域的访问映射到对 pci总线上挂载的 pci设备的配置空间的访问。

最后是内核中对 iomem_resource中该块区域声明。防止冲突出现和后续的 request_mem_region()!

3. cat /proc/iomem
......
  e0000000-efffffff : PCI MMCONFIG 0 [00-ff]
    e0000000-efffffff : reserved
      e0000000-efffffff : pnp 00:0d
......

dmesg
......
PCI: MCFG configuration 0: base e0000000 segment 0 buses 0 - 255
PCI: MCFG area at e0000000 reserved in E820
PCI: Using MMCONFIG at e0000000 - efffffff
......

256个总线,256MB的物理地址空间。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2014-03-19 16:51 |只看该作者
回复 8# asuka2001


非常感谢。
这个还是有些疑惑:4k * 32 * 8
为何”*8“? 每个设备不能同时用8种吧。


另外,这个估计有些小差异,我的机器不到256个总线:
  f8000000-fbffffff : PCI MMCONFIG 0000 [bus 00-3f]
    f8000000-fbffffff : reserved
      f8000000-fbffffff : pnp 00:0a


论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
10 [报告]
发表于 2014-03-19 16:53 |只看该作者
本帖最后由 asuka2001 于 2014-03-19 16:55 编辑

回复 9# chishanmingshen

1. 每个物理 pci设备可以有 8个 function!每个 function可以认为是一个逻辑功能设备,它拥有自己的配置空间!

2. 这个只是预先分配的一块区域,并非系统内真有那么多总线!所以预留大小估计就看是不是有那么多的 reserve区域吧!

没仔细研究过 acpi,不知道这块区域是怎么拿到的,怎么去配置的北桥。。。。求高手指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP