龙芯软件开发(26)-- PCI设备初始化4
来源:互联网 发布:gta5捏脸数据黑寡妇 编辑:程序博客网 时间:2024/05/14 23:53
继续来分析PCI设备的搜索过程,下面就是通过调用搜索程序来实现的。
for(i = 0, pb = _pci_head; i < pci_roots; i++, pb = pb->next) {
_pci_scan_dev(pb, i, 0, init);
}
接着去看看函数_pci_scan_dev的实现:
static void
_pci_scan_dev(struct pci_device *dev, int bus, int device, int initialise)
{
for(; device < 32; device++) {
_pci_query_dev (dev, bus, device, initialise);
}
}
上面是根据PCI的总线定义,可以知道它最多有32个设备,因此就需要把这32个设备进行枚举。下面的搜索过程是通过PCI的标识来进行的,因为每个PCI插槽存在设备时,它的ID不为0xFFFF FFFF,根据这样的特征,就可以知道是否存在PCI设备了。
static void
_pci_query_dev (struct pci_device *dev, int bus, int device, int initialise)
{
pcitag_t tag;
pcireg_t id;
pcireg_t misc;
tag = _pci_make_tag(bus, device, 0);
if (!_pci_canscan (tag))
return;
上面组成PCI标识地址。
if (_pciverbose >= 2)
_pci_bdfprintf (bus, device, -1, "probe...");
id = _pci_conf_read(tag, PCI_ID_REG);
上面读取PCI的ID标识。
if (_pciverbose >= 2) {
PRINTF ("completed/n");
}
if (id == 0 || id == 0xffffffff) {
return;
}
上面判断是否存在PCI设备,如果不存在就返回。
misc = _pci_conf_read(tag, PCI_BHLC_REG);
if (PCI_HDRTYPE_MULTIFN(misc)) {
int function;
for (function = 0; function < 8; function++) {
tag = _pci_make_tag(bus, device, function);
id = _pci_conf_read(tag, PCI_ID_REG);
if (id == 0 || id == 0xffffffff) {
return;
}
_pci_query_dev_func (dev, tag, initialise);
}
}
else {
_pci_query_dev_func (dev, tag, initialise);
}
上面读取PCI信息,并分类PCI设备,然后保存到PCI设备列表里。
}
找到所有设备之后,就需要把PCI的总线带宽分配,并分别分配设备的内存映射空间。通过下面的程序实现的:
static void
_setup_pcibuses(int initialise)
{
struct pci_bus *pb;
struct pci_device *pd;
unsigned int def_ltim, max_ltim;
int i;
SBD_DISPLAY ("PCIS", CHKPNT_PCIS);
for(pb = _pci_bushead; pb != NULL; pb = pb->next) {
if (pb->ndev == 0)
return;
if (initialise) {
/* convert largest minimum grant time to cycle count */
/*XXX 66/33 Mhz */ max_ltim = pb->min_gnt * 33 / 4;
/* now see how much bandwidth is left to distribute */
if (pb->bandwidth <= 0) {
if (_pciverbose) {
_pci_bdfprintf (pb->bus, -1, -1,
"WARN: total bandwidth exceeded/n");
}
def_ltim = 1;
}
else {
/* calculate a fair share for each device */
def_ltim = pb->bandwidth / pb->ndev;
if (def_ltim > pb->max_lat) {
/* would exceed critical time for some device */
def_ltim = pb->max_lat;
}
/* convert to cycle count */
def_ltim = def_ltim * 33 / 4;
}
/* most devices don't implement bottom three bits */
def_ltim = (def_ltim + 7) & ~7;
max_ltim = (max_ltim + 7) & ~7;
pb->def_ltim = MIN (def_ltim, 255);
pb->max_ltim = MIN (MAX (max_ltim, def_ltim), 255);
}
}
SBD_DISPLAY ("PCIR", CHKPNT_PCIR);
_pci_hwreinit ();
/* setup the individual device windows */
SBD_DISPLAY ("PCIW", CHKPNT_PCIW);
for(i = 0, pd = _pci_head; i < pci_roots; i++, pd = pd->next) {
_pci_setup_windows (pd);
}
}
- 龙芯软件开发(26)-- PCI设备初始化4
- 龙芯软件开发(23)-- PCI设备初始化
- 龙芯软件开发(24)-- PCI设备初始化2
- 龙芯软件开发(25)-- PCI设备初始化3
- 龙芯软件开发(31)-- PCI设备查找细节
- PCI设备的初始化
- PMON PCI设备初始化
- WDF----PCI设备初始化
- pci设备的初始化
- pci设备的初始化
- pci设备的初始化
- Linux PCI设备驱动程序开发 --- PCI 体系结构(一)
- 获取PCI设备并初始化
- 获取PCI设备并初始化
- 获取PCI设备并初始化
- PCI设备驱动开发
- PCI设备驱动开发
- PCI设备驱动开发
- 树上的石灰
- actually i went to gz yesterday
- 又开始找房子了
- JAVA学习,this(),super()调用构造函数研究
- 我算是在创业,但此中艰辛有谁能够体会.....
- 龙芯软件开发(26)-- PCI设备初始化4
- 我教你怎么擒老鼠-给有电脑的朋友一个建设
- http://www.home71.com
- 疯娘
- 国内概率与数理统计专业牛人分布
- 子类和父类中方法和变量访问权限
- JAVA学习,常量的初始化
- Struts+Spring+Hibernate真正入门级实例
- 查杀"熊猫烧香"