本文主要针对ramstage阶段的设备枚举的过程进行分析。限于精力,就直接使用qemu-i440fx作为分析,baytrail就免了吧。在分析时,不一定会根据顺序,也不一定会详细到每个函数。如果要详细的信息,请查阅代码。也建议根据前文给出的主干流程图进行参照分析。

枚举的函数如下:

void dev_enumerate(void)
{struct device *root;printk(BIOS_INFO, "Enumerating buses...\n");root = &dev_root;show_all_devs(BIOS_SPEW, "Before device enumeration.");printk(BIOS_SPEW, "Compare with tree...\n");show_devs_tree(root, BIOS_SPEW, 0, 0);// 在enable_dev函数中赋值scan_bus的 比如baytrail和qemu i440fxif (root->chip_ops && root->chip_ops->enable_dev)root->chip_ops->enable_dev(root);if (!root->ops || !root->ops->scan_bus) {printk(BIOS_ERR, "dev_root missing scan_bus operation");return;}// 扫描总线 从root开始scan_bus(root);post_log_clear();printk(BIOS_INFO, "done\n");}

从该函数中看出,主要有3个步骤:一是打印设备树;二是调用chip_ops的使能设备函数enable_dev;最后是调用scan_bus函数扫描总线。

阅读过前文的相信已经知道在i440fx中是没有芯片级别的初始化和使能函数的,为了做试验,在mainboard.c中做了空实现函数。但是,在北桥芯片northbridge.c文件中,同样有chip_operations结构体,同样有使能的函数:

struct chip_operations mainboard_emulation_qemu_i440fx_ops = {CHIP_NAME("QEMU Northbridge i440fx").enable_dev = northbridge_enable,
};

northbridge_enable函数如下:

static void northbridge_enable(struct device *dev)
{ll_printk("in %s() dev type: %d...\n", __func__, dev->path.type);/* Set the operations if it is a special bus type */if (dev->path.type == DEVICE_PATH_DOMAIN) {dev->ops = &pci_domain_ops;}else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {dev->ops = &cpu_bus_ops;}
}

其中pci域设备操作函数集结构体定义如下:

static struct device_operations pci_domain_ops = {.read_resources       = cpu_pci_domain_read_resources, // 读资源调用此函数.set_resources     = cpu_pci_domain_set_resources, // 设置资源调用此函数.enable_resources  = NULL,.init           = NULL,.scan_bus       = pci_domain_scan_bus, // 扫描总线.ops_pci_bus = pci_bus_default_ops,
#if CONFIG_GENERATE_SMBIOS_TABLES.get_smbios_data   = qemu_get_smbios_data,
#endif
};

注意,如果要讲pci域,则需要涉及到存储器域、PCI总线域,还有南北桥方面的东西了。那不是当前笔者力之能及的事,建议看看PCI体系结构的书籍。(但谁又能确定未来的笔者不会被领导安排做PCI有关的事务呢?)

另外,cpu设备操作函数集定义如下:

// cpu初始化、总线扫描在这里定义
static struct device_operations cpu_bus_ops = {.read_resources   = DEVICE_NOOP,.set_resources    = DEVICE_NOOP,.enable_resources = DEVICE_NOOP,.init             = cpu_bus_init,.scan_bus         = cpu_bus_scan,
};

值得注意的是,pci_domain_ops和cpu_bus_ops同是device_operations变量,一个“设备类型”为DEVICE_PATH_DOMAIN,另一个为DEVICE_PATH_CPU_CLUSTER,它们分别对应PCI域和CPU设备,在接下来的文章中将会看到CPU初始化时,就会调用到cpu_bus_init函数。在coreboot中,很多操作实际上是遍历设备树,然后调用对应的device_operations指针,而设备树上不同的设备,使用枚举类型device_path_type来区分。

PCI的扫描比较复杂。总体而言,在扫描时遇到PCI桥时,再递归调用扫描函数。从而完成所有PCI设备的扫描工作。

根据代码整理的流程图如下:

(此处留空)

附上此过程的打印信息:

[LL DEBUG]: in bs_dev_enumerate()...
Enumerating buses...
Show all devs... Before device enumeration.
Root Device: enabled 1
CPU_CLUSTER: 0: enabled 1
APIC: 00: enabled 1
DOMAIN: 0000: enabled 1
PCI: 00:00.0: enabled 1
PCI: 00:01.0: enabled 1
PCI: 00:01.1: enabled 1
PCI: 00:01.3: enabled 1
Compare with tree...
Root Device: enabled 1CPU_CLUSTER: 0: enabled 1APIC: 00: enabled 1DOMAIN: 0000: enabled 1PCI: 00:00.0: enabled 1PCI: 00:01.0: enabled 1PCI: 00:01.1: enabled 1PCI: 00:01.3: enabled 1
[LL DEBUG]: in mainboard_i440fx_enable()...
Root Device scanning...
root_dev_scan_bus for Root Device
CPU_CLUSTER: 0 enabled
DOMAIN: 0000 enabled
CPU_CLUSTER: 0 scanning...
QEMU: firmware config interface detected
QEMU: max_cpus is 1
CPU: APIC: 00 enabled
scan_bus: scanning of bus CPU_CLUSTER: 0 took 0 usecs
DOMAIN: 0000 scanning...
PCI: pci_scan_bus for bus 00
POST: 0x24
PCI: 00:00.0 [8086/1237] ops
PCI: 00:00.0 [8086/1237] enabled
PCI: 00:01.0 [8086/7000] bus ops
PCI: 00:01.0 [8086/7000] enabled
PCI: 00:01.1 [8086/7010] ops
PCI: 00:01.1 [8086/7010] enabled
PCI: 00:01.3 [8086/7113] bus ops
PCI: 00:01.3 [8086/7113] enabled
PCI: 00:02.0 [1013/00b8] ops
PCI: 00:02.0 [1013/00b8] enabled
PCI: 00:03.0 [8086/100e] enabled
POST: 0x25
PCI: 00:01.0 scanning...
scan_lpc_bus for PCI: 00:01.0
scan_lpc_bus for PCI: 00:01.0 done
scan_bus: scanning of bus PCI: 00:01.0 took 0 usecs
PCI: 00:01.3 scanning...
scan_smbus for PCI: 00:01.3
scan_smbus for PCI: 00:01.3 done
scan_bus: scanning of bus PCI: 00:01.3 took 0 usecs
POST: 0x55
scan_bus: scanning of bus DOMAIN: 0000 took 0 usecs
root_dev_scan_bus for Root Device done
scan_bus: scanning of bus Root Device took 0 usecs
done

注:
由于coreboot方面资料较少,笔者第一次尝试分析代码,还有众多未能参透的地方,难免出错。任何问题,欢迎一起交流学习。

李迟 2016.4.3 周日 上午

coreboot学习7:ramstage阶段之设备枚举流程相关推荐

  1. coreboot学习9:ramstage阶段之设备初始化流程

    本文对ramstage阶段的设备初始化过程进行跟踪.设备初始化是在dev_initialize函数中完成的,代码如下: void dev_initialize(void) {struct bus *l ...

  2. coreboot学习6:ramstage阶段之芯片初始化流程

    从本文开始,就根据前文给出的ramstage的主干线索分析每个小阶段执行的过程.依然以qemu-i440fx为主做分析--因为当前条件只有这个"主板"才能在通过打印跟踪其过程.另外 ...

  3. coreboot学习5:启动流程跟踪之ramstage阶段主干分析

    ramstage阶段涉及比较多的操作,比如枚举板子上的外围设备,分配资源(PCI),使能设备.本文根据该阶段的主干函数流程做分析,细节方面不涉及.理顺这个主干,从全局上把控大致流程. romstage ...

  4. coreboot学习8:ramstage阶段之资源分配流程

    设备枚举后就是资源分配了,在dev_configure函数中完成,代码如下: void dev_configure(void) {struct resource *res;struct device ...

  5. coreboot学习4:启动流程跟踪之romstage阶段

    romstage是coreboot的第二个执行阶段.本文分别介绍基于qemu模拟环境的x86的跟踪,以及基于Intel baytrail平台的跟踪. 在romstage阶段,由于内存还未初始化好,所以 ...

  6. USB设备驱动之设备初始化(设备枚举)

    USB设备从接入HUB到正常工作之前.都属于设备枚举阶段.所谓设备枚举.就是让host控制器认识USB设备,并为其准备资源.建立好主机与设备间的数据传递机制. 该阶段的工作,是USB通信协议规定的,所 ...

  7. 第五篇 USB设备枚举过程(1)

    上一篇:https://blog.csdn.net/qq_40088639/article/details/109741653 总述 1. 设备枚举的整个过程 USB设备枚举过程,可大致分为下面的几个 ...

  8. 网络安全学习篇28_阶段一小结篇_木马的原理及木马防范

    上一篇博客:网络安全学习篇27_阶段一小结篇_DNS欺骗与钓鱼网站的防范 写在前面: 刚开始接触了一些关键词如渗透,sql注入,靶场等就发现对此方面挺感兴趣,毕竟有的人大大小小都有一个黑客梦,恰巧在 ...

  9. USB驱动程序之一(USB介绍、USB数据传输、USB设备枚举)

    文章目录 USB简介 USB系统架构 USB系统拓扑结构 USB主控制器 USB HUB USB设备 USB设备逻辑结构 USB描述符 设备描述符 配置描述符 接口描述符 端点描述符 USB数据传输 ...

最新文章

  1. java诡异的String.split()方法
  2. [zz]Ubuntu10.04源 更新源列表
  3. Nginx的rewrite应用
  4. Linux下svn搭建配置流程
  5. python 中cPickle学习二
  6. hash值为负_java – HashCode给出负值
  7. arm跑操作系统的意义_不太远的猜想:当ARM和鸿蒙OS在笔记本领域相遇,颠覆已无可避免...
  8. python写一个表白程序_用Python个女神做一个表白神器
  9. 目标检测回归损失函数——L1、L2、smooth L1
  10. 绿联串口线linux驱动下载,绿联usb转串口驱动
  11. ADC知识(2)——直流参数(输入电压参考,参考电流输入,积分非线性误差,差分非线性误差)
  12. 5v继电器模块实物接线_一秒看懂基础继电器电路图解
  13. 影响照片锐度的7个要素
  14. freertos和ucos的区别
  15. Flume跨服务器采集数据
  16. 国产加速度传感器QMA6100P
  17. 街区尺度下的通勤出行方式挖掘及其影响因子:以北京市为例
  18. 2023华中科技大学计算机考研信息汇总
  19. 中国的5G建设和美国马斯克的星链有什么区别?
  20. 金龙鱼粮油的高光和益海嘉里的隐忧:巨无霸迫切需要一个本土标签

热门文章

  1. 外媒:苹果公司将在美国为其“苹果汽车”生产电池
  2. 太损了!“特斯拉刹车失灵”同款白T恤已上架电商平台
  3. 瑞幸咖啡公布对董事长兼CEO郭谨一调查结果:未发现不当行为
  4. 突然!iPhone 12/12 Pro从苹果天猫旗舰店下架,不愿参加双11活动?
  5. 60秒语音有救了?曝微信测试语音进度条,内部人士一句话打回原形
  6. Redmi K30 Pro屏幕参数公布:没有90Hz刷新率又如何?
  7. 加速包可能没用!12306屏蔽多个抢票软件
  8. 贝壳“进社区”,让商业向文明靠拢
  9. OPPO Reno 3 Pro再曝光:5G手机也有轻薄机身
  10. 腾讯首届“科学探索奖”获奖名单揭晓,每人将获300万奖金