上一篇文章講述nvme driver 識別找到支持該driver 的nvme pci設(shè)備的過程米母,現(xiàn)在開始講述nvme driver 識別之后击蹲,會調(diào)用該struct pci_driver實例中的probe 函數(shù)。
probe函數(shù)蕾久,功能是初始化controller势似,并為后續(xù)的進行IO做準(zhǔn)備。
主要以下幾個事情:
(1)host 設(shè)置pci和pcie 寄存器僧著,這些配置包括創(chuàng)建IO queue前叫编,使用a single interrupt(pin-based ,single-MSI, single MSI-X), 將controller 的pcie Bar 空間映射到host memory當(dāng)中霹抛,這樣host 就能直接配置controller的寄存器搓逾。需要說明的是,nvme 協(xié)議規(guī)定pcie的bar空間的最前面一段空間是作為controller的寄存器空間杯拐,需要暴露給host霞篡;
(2)host 通過check CSTS.RDY 是否為0世蔗,以等待上一次的reset完成;
(3)配置admin queue, 設(shè)置admin queue attributes(AQA)朗兵,admin submission queue(ASQ)污淋,admin completion queue(ACQ)三個寄存器;
AQA:配置admin cq 和 sq size
ASQ:配置host 存放 admin command的queue的host memory 基地址余掖;
ACQ:配置controller 存放admin command 返回command response 的host memory 基地址寸爆;
(3)admin queue 創(chuàng)建好之后,就可以通過admin queue創(chuàng)建IO 的SQ盐欺,CQ赁豆;
(4)配置controller 以下幾個設(shè)置:
a. 仲裁機制CC.AMS
b. memory page size設(shè)置CC.MPS
c. IO command set 設(shè)置CC.CSS
(5)使能controller, 通過CC.EN置
(6)host 需要wait for controller 是否ready,通過check CSTS.RDY是否為1.
(7)host 使用set feature command 并且用number of queue的feature id來確定sq,cq的個數(shù)冗美,確定完IO queue的數(shù)量之后魔种,我們就知道需要配置MSI和MSI-X的數(shù)量了。
(8)host 根據(jù)controller支持的數(shù)量和system 配置數(shù)量粉洼,先申請合適數(shù)量的IO cq,然后申請合適數(shù)量的IO sq节预;
(9)host 發(fā)送第一次identify命令,獲取controller 等配置属韧,這些配置信息包括namespace個數(shù)安拟;
(10)host 接下來針對每個namespace 發(fā)送identify 命令,獲取每個namaspace的配置信息,并check是否active, 若active的話宵喂,就并發(fā)送get feature 命令獲取namespace lab format, lba data size,metadata size等信息去扣;
(11)通過add_diak()將每個namespace 加入到塊設(shè)備層,IO就可以開始對其進行訪問樊破。
reference:
(1) nvme spec 1.3a.pdf
(2) Linux 3.18 nvme driver.