PCIe實踐之路 Linux RC驅動

2021-10-10 06:57:49 字數 2191 閱讀 1106

最新的4.12核心中對pci host driver進行一些劃分,把基於designware ip的主控驅動放到drivers/pci/dwc目錄下去了。如果是基於老的kernel開發,想要移植新版的核心的話,要注意,同時多了designware ep驅動框架。

非designware的主控驅動還是位於host目錄下,譬如pcie-xilinx.c。

下面就以xilinx pcie主控驅動為例來介紹如何新增自己的host driver。

現在的裝置驅動大部分都是通過device tree來給定平台資訊的,有了一套框架,其實寫驅動就是搭積木一樣,把槽位卡準了就行了,具體要如何操作呢?

這裡先放乙個device tree的模板。

zynq:

pci_express: axi-pcie@50000000 ;

};

首先定義好platform_driver。

static struct platform_driver xilinx_pcie_driver = ,

.probe = xilinx_pcie_probe,

};builtin_platform_driver(xilinx_pcie_driver);

這裡有乙個of_match_table字段,是這麼定義的:

static struct of_device_id xilinx_pcie_of_match = ,

{}};

這裡的compatible資訊是」xlnx,axi-pcie-host-1.00.a」,和device tree中的compatible = "xlnx,axi-pcie-host-1.00.a"是對應的。系統在啟動的時候會根據這個compatible欄位來probe驅動,這裡知道這個就能進到我們的probe函式了。

要知道進入probe就說明了以下幾個事實:

所以,進入probe後,先先定義乙個struct xilinx_pcie_port結構體,用來儲存作為root port需要的資訊,不僅kernel自己要知道device資訊,我們自己也要知道,這樣的話還能通過相關的結構和kernel進行互動。

首先,獲取最重要的device物件,後續的裝置操作都是和這個device結構體繫結的。

port->dev = dev
其次,parse device tree。

err = xilinx_pcie_parse_dt(port);

if (err)

各種device tree介面如下:

xilinx_pcie_init_port(port);
鏈路訓練,清中斷,使能中斷。

包括匯流排range(因為是root port,所以從0~255),獲取device tree中定義的range,生成相應的resource。然後通過devm_request_pci_bus_resources(dev, &res)向核心申請。

bus = pci_create_root_bus(dev, 0, &xilinx_pcie_ops, port, &res);

if (!bus)

#ifdef config_pci_msi

xilinx_pcie_msi_chip.dev = dev;

bus->msi = &xilinx_pcie_msi_chip;

#endif

// 掃瞄下級匯流排,然後申請核心資源

pci_scan_child_bus(bus);

pci_assign_unassigned_bus_resources(bus);

#ifndef config_microblaze

pci_fixup_irqs(pci_common_swizzle, of_irq_parse_and_map_pci);

#endif

list_for_each_entry(child, &bus->children, node)

pcie_bus_configure_settings(child);

// 掃瞄pcie裝置

pci_bus_add_devices(bus);

return 0;

至此,host的功能已經起來了。

PCIe實踐之路 Linux訪問PCIe空間

linux在列舉pcie裝置的過程由核心中的pci框架負責,在ep配置完成之後,驅動通過以下介面訪問pcie空間,原理參考前文 大話pcie 裝置列舉 相關介面位於drivers pci access.c 在列舉過程中,pci驅動已經分配了address給各個bar,通過一些介面就可以訪問到bar ...

PCIe實踐之路 DMA機制

pcie控制器也提供dma direct memory access 功能,用來批量地非同步資料傳輸。假設現在rc要從ep mem space讀1mb資料,可以有這麼兩種方式 rc發起dma讀 ep發起dma寫。這兩種方式結果是等效的,對最後完成中斷的方式會不一樣,前者通過local interru...

Followme Devops實踐之路

引言 天下武功,唯快不破 想要提高開發團隊效率,勢必要有一套完整而成熟的開發流程方案,除了sprint迭代開發模式之外,還有近幾年流行的devops流程,都是可以大幅度提高開發效率的工具.我們團隊也不斷探索 實踐,最終形成了現有的一套體系,從最初的手動發布到現有的自動化,從起始的繁瑣易亂到當下的簡潔...