pikachu_dd
驱动牛犊
驱动牛犊
  • 注册日期2003-06-03
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1591回复:4

请问在x86 linux2.4下,系统对pci板卡的base_address[]是如何配置的?

楼主#
更多 发布于:2003-06-03 11:15
base_address[0]、base_address[1]、base_address[2]....中各存的是什么?这些内容是由谁来分配的?
非常感谢!
shownxu
驱动小牛
驱动小牛
  • 注册日期2002-02-05
  • 最后登录2008-04-25
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-03 11:27
由系统分配的,存的就是pci configuration space中的base address.
pikachu_dd
驱动牛犊
驱动牛犊
  • 注册日期2003-06-03
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-03 11:31
那就是说是linux自动分配的?那么pci configure space 中IO /memory等的分配各自分配到了 base_address[0]还是base_address[1]还是....?谢谢!
heiguo2001
驱动牛犊
驱动牛犊
  • 注册日期2002-12-07
  • 最后登录2005-09-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-03 13:14
系统会读取每个base_address[]的值来判断该寄存器存放的是IO空间或memory空间,Bit0 of all base address registers 决定寄存器是映射到IO 或Memory, (bit0==0  IO,  bit0==1 memory)。

具体实现是读取该寄存器的值,然后写回0xFFFFFFFF,再读回该寄存器值,如果第二次读回的值不为全0或全1,则该base address register包含地址映射值,具体linux实现代码如下 :
for(pos=0; pos<6; pos = next) {
next = pos+1;
res = &dev->resource[pos];
res->name = dev->name;
reg = PCI_BASE_ADDRESS_0 + (pos << 2);
pci_read_config_dword(dev, reg, &l);
pci_write_config_dword(dev, reg, ~0);
pci_read_config_dword(dev, reg, &sz);
pci_write_config_dword(dev, reg, l);
if (!sz || sz == 0xffffffff)
continue;
if (l == 0xffffffff)
l = 0;
if ((l & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) {
res->start = l & PCI_BASE_ADDRESS_MEM_MASK;
sz = pci_size(sz, PCI_BASE_ADDRESS_MEM_MASK);
} else {
res->start = l & PCI_BASE_ADDRESS_IO_MASK;
sz = pci_size(sz, PCI_BASE_ADDRESS_IO_MASK & 0xffff);
}
res->end = res->start + (unsigned long) sz;
res->flags |= (l & 0xf) | pci_calc_resource_flags(l);
if ((l & (PCI_BASE_ADDRESS_SPACE | PCI_BASE_ADDRESS_MEM_TYPE_MASK))
   == (PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64)) {
pci_read_config_dword(dev, reg+4, &l);
next++;
#if BITS_PER_LONG == 64
res->start |= ((unsigned long) l) << 32;
res->end = res->start + sz;
pci_write_config_dword(dev, reg+4, ~0);
pci_read_config_dword(dev, reg+4, &sz);
pci_write_config_dword(dev, reg+4, l);
if (~sz)
res->end = res->start + 0xffffffff +
(((unsigned long) ~sz) << 32);
#else
if (l) {
printk(KERN_ERR \"PCI: Unable to handle 64-bit address for device %s\\n\", dev->slot_name);
res->start = 0;
res->flags = 0;
continue;
}
#endif
}
}
pikachu_dd
驱动牛犊
驱动牛犊
  • 注册日期2003-06-03
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-04 14:00
谢谢!我是想知道系统对于每一个base_address[]是怎么分配的?每一个base_address[]中分配的是什么东东?
谢谢您的回答!
游客

返回顶部