AMD芯片组代际差异分析与pci-quirks源码解读

版权申诉
0 下载量 169 浏览量 更新于2024-11-05 收藏 9KB RAR 举报
资源摘要信息: "PCI特殊案例(Quirks)的历史和芯片组代(Generation)" 在信息技术和计算机硬件领域,PCI(外围组件互连)是一种广泛应用的技术,用于连接主板上的外围设备。随着时间的推移,PCI经历了多次更新和版本变化,以适应不断提高的性能和功能需求。特别是,随着不同厂商的芯片组出现,为了确保硬件与软件的兼容性,针对特定硬件缺陷或异常行为的PCI特殊案例(Quirks)应运而生。 本资源文件 "pci-quirks.rar_generations" 描述了AMD(Advanced Micro Devices)芯片组的发展历程,并强调了各个不同芯片组代的特殊案例文件。这里提取的知识点将围绕AMD芯片组的历史、不同代的技术特点,以及这些变化对于PCI特殊案例文件的意义。 AMD芯片组从最初问世以来,就扮演着支持AMD处理器的角色,同时提供了与内存、显卡、存储设备等其他PC组件连接的重要桥梁。随着时间的推移,AMD推出了多种芯片组,为不同市场细分和性能需求提供了产品。 描述中提到的"amd_chipset_gen values"可能指的是定义在文件"pci-quirks.c"和"pci-quirks.h"中的枚举值,这些值代表了AMD芯片组的不同世代。每一个芯片组代可能都伴随着新的特性、改进或是硬件兼容性问题,这可能需要相应的软件调整以确保系统的稳定运行。 例如,AMD芯片组的早期代可能需要解决与旧版PCI设备的兼容性问题,随着技术的发展,新一代的芯片组可能需要支持新的电源管理特性或是高速数据传输协议。为了解决这些问题,开发者可能需要修改驱动程序中的PCI Quirks部分,这些修改以软件补丁的形式记录在"pci-quirks.c"和"pci-quirks.h"这两个文件中。 每个芯片组代可能涉及的PCI特殊案例(Quirks)包括但不限于: 1. PCI设备识别与枚举的特殊处理,以确保兼容性。 2. 特定型号的PCI设备的电源管理或性能优化。 3. 针对特定PCI设备的错误校验和错误处理调整。 4. 更新的PCI设备驱动程序以匹配新的硬件规范和接口。 5. 新的硬件特性,如支持新的PCI配置空间寄存器或扩展特性集。 由于PCI特殊案例文件通常包含底层的技术细节,理解和应用这些文件通常需要较深的硬件和系统架构知识,这对于系统开发者和硬件维护人员来说是必不可少的。 总的来说,"pci-quirks.rar_generations"文件为我们提供了AMD芯片组历代技术进步的概览,同时也揭示了软件开发中,尤其是在操作系统和驱动程序开发中,对于硬件特殊行为的处理方式。了解这些内容不仅有助于更好地理解硬件与软件之间的相互作用,还能指导技术人员进行更有效的问题诊断和解决。

static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж��׺��Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,可以通过修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。

2023-06-09 上传

static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж��׺��Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,如何修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。代码展示

2023-06-09 上传