Skip to main content
PCIe ไฝฟ็”จๅŒๅ‘่ฟžๆŽฅๅŒๆ—ถๅ‘้€ๅ’ŒๆŽฅๆ”ถไฟกๆฏ๏ผŒๅฆ‚ไธ‹ๅ›พๆ‰€็คบใ€‚
PCIe ่ฎพๅค‡่ฟžๆŽฅ้“พ่ทฏ

ๅ›พ๏ผšPCIe ่ฎพๅค‡่ฟžๆŽฅ้“พ่ทฏ

่ฎพๅค‡ไน‹้—ด็š„่ทฏๅพ„็งฐไธบ้“พ่ทฏ๏ผˆLink๏ผ‰ใ€‚ๅฎƒ็”ฑไธ€ไธชๆˆ–ๅคšไธชๅ‘้€ๅ’ŒๆŽฅๆ”ถๅฏน็ป„ๆˆใ€‚้“พ่ทฏไธญ็š„ไธ€ๅฏน็งฐไธบ้€š้“๏ผˆLane๏ผ‰ใ€‚Qualcomm Linux ่ฎพๅค‡ไธญ็š„ PCIe ่ฎพๅค‡่ฟžๆŽฅๆ”ฏๆŒ 16 ไธช้€š้“ใ€‚้€š้“ๆ•ฐๆˆ–้“พ่ทฏๅฎฝๅบฆไธบ x16ใ€‚ ไธ‹่กจๅˆ—ๅ‡บไบ†่ฎพๅค‡็š„ PCIe ่ฟžๆŽฅ็ฑปๅž‹ใ€‚

่กจ๏ผšPCIe ่ฟžๆŽฅ

PCIe ็ฑปๅž‹่ฏดๆ˜Ž
ๆ นๅคๅˆไฝ“๏ผˆRC๏ผ‰ๅฐ† CPU ่ฟžๆŽฅๅˆฐ PCIe ๆ‹“ๆ‰‘
ไบคๆขๆœบ่ฟžๆŽฅ 2 ไธชไปฅไธŠ็š„็ซฏๅฃๅนถๅ……ๅฝ“ๆ•ฐๆฎๅŒ…่ทฏ็”ฑๅ™จ
ๆกฅ่ฟžๆŽฅไธๅŒ็š„ๆ€ป็บฟ๏ผšไพ‹ๅฆ‚๏ผŒPCIe ๅˆฐ PCIe๏ผŒๆˆ– PCIe ๅˆฐๅค–่ฎพ็ป„ไปถไบ’่ฟž๏ผˆPCI๏ผ‰
็ซฏ็‚น๏ผˆEP๏ผ‰ไฝไบŽ PCIe ๆ‹“ๆ‰‘ๆ ‘็ป“ๆž„็š„ๅบ•้ƒจ๏ผŒๅชๆœ‰ไธ€ไธชไธŠๆธธ็ซฏๅฃ
ไผ ็ปŸ็ซฏ็‚นไฝฟ็”จ่พƒๆ—ง็š„ PCI ๆ€ป็บฟๆ“ไฝœไปฅๆ”ฏๆŒๅ‘ๅŽๅ…ผๅฎน

PCIe ไธปๆœบๆจกๅผๆžšไธพๅŠŸ่ƒฝ

็ณป็ปŸ้ฆ–ๆฌกไธŠ็”ตๆ—ถ๏ผŒๅœจ็ณป็ปŸไธปๆœบๅค„็†ๅ™จไธŠ่ฟ่กŒ็š„้…็ฝฎ่ฝฏไปถๅช็Ÿฅ้“ Bus 0 ็š„ๅญ˜ๅœจ๏ผˆๅฆ‚ๆžœๆ”ฏๆŒ PCIe๏ผ‰ใ€‚่ฝฏไปถไธไบ†่งฃๆ€ป็บฟๆ‹“ๆ‰‘ๆˆ–่ฟžๆŽฅๅˆฐๆ€ป็บฟ็š„ไปปไฝ•่ฎพๅค‡ใ€‚ๆžšไธพ่ฟ‡็จ‹ไผšๅ‘็Žฐ็ณป็ปŸไธญๅญ˜ๅœจ็š„ๅ„็งๆ€ป็บฟใ€่ฎพๅค‡ๅ’ŒๅŠŸ่ƒฝใ€‚ ๆžšไธพๅฎŒๆˆๅŽ๏ผŒ็ณป็ปŸไธญ็š„ๆฏๆกๆ€ป็บฟ็ผ–ๅทๅฆ‚ไธ‹๏ผš
  • ไธปๆ€ป็บฟๅท่กจ็คบ็›ดๆŽฅ่ฟžๆŽฅๅˆฐๆกฅ็š„ไธปๆŽฅๅฃ๏ผˆๆœๅ‘ๆ นๅคๅˆไฝ“๏ผ‰็š„ๆ€ป็บฟใ€‚
  • ๆฌกๆ€ป็บฟๅท่กจ็คบ็›ดๆŽฅ่ฟžๆŽฅๅˆฐๆกฅ็š„ๆฌกๆŽฅๅฃ๏ผˆ่ฟœ็ฆปๆ นๅคๅˆไฝ“๏ผ‰็š„ๆ€ป็บฟใ€‚
  • ไปŽๅฑžๆ€ป็บฟๅท่กจ็คบๅญ˜ๅœจไบŽๆกฅไธ‹ๆธธไพง็š„็ผ–ๅทๆœ€้ซ˜็š„ๆ€ป็บฟใ€‚
BDF ็ผ–ๅทๅ”ฏไธ€ๆ ‡่ฏ†ๆฏไธช่ฎพๅค‡ใ€‚ไบ‹ๅŠกๅฑ‚ๆ•ฐๆฎๅŒ…๏ผˆTLP๏ผ‰็š„ๅŸบไบŽ ID ็š„่ทฏ็”ฑๆ–นๆณ•ไฝฟ็”จๆญค็ผ–ๅทใ€‚PCIe ไธปๆœบๆจกๅผๆžšไธพ่ฟ‡็จ‹ๅŒ…ๆ‹ฌไปฅไธ‹ๆญฅ้ชค๏ผš
  1. ้“พ่ทฏ่ฎญ็ปƒ
  2. ๆ‰ซๆๆ€ป็บฟไธŠ็š„่ฎพๅค‡
  3. ๆณจๅ†Œ
ๆœ‰ๅ…ณ PCIe ่ฎพๅค‡ๅˆๅง‹ๅŒ–ใ€ๆžšไธพ่ฟ‡็จ‹็š„ๆ›ดๅคšไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… https://www.kernel.org/doc/html/latest/PCI/index.htmlใ€‚

PCIe ๅˆ†ๅฑ‚ๆžถๆž„

ไธ‹ๅ›พๅฑ•็คบไบ† PCIe ่ฝฏไปถๆžถๆž„ใ€‚
PCIe ่ฝฏไปถๆžถๆž„

ๅ›พ๏ผšPCIe ่ฝฏไปถๆžถๆž„

ไธ‹ๅ›พๅฑ•็คบไบ† PCIe ็š„ๅˆ†ๅฑ‚ๆžถๆž„ๆจกๅž‹ใ€‚
PCIe ๅˆ†ๅฑ‚ๆžถๆž„

ๅ›พ๏ผšPCIe ๅˆ†ๅฑ‚ๆžถๆž„

ไบคๆข็š„ไผ ่พ“ๅ•ๅ…ƒๅฆ‚ไธ‹ใ€‚
  • ็‰ฉ็†ๅฑ‚ๅฎžไฝ“ไน‹้—ด็š„ๆœ‰ๅบ้›†๏ผˆOrdered set๏ผ‰ใ€‚
  • ๆ•ฐๆฎ้“พ่ทฏๅฑ‚ๅฎžไฝ“ไน‹้—ด็š„ๆ•ฐๆฎ้“พ่ทฏๅฑ‚ๆ•ฐๆฎๅŒ…๏ผˆDLLP๏ผ‰ใ€‚
  • ไบ‹ๅŠกๅฑ‚ๅฎžไฝ“ไน‹้—ด็š„ไบ‹ๅŠกๅฑ‚ๆ•ฐๆฎๅŒ…๏ผˆTLP๏ผ‰ใ€‚
ไธ‹่กจๅˆ—ๅ‡บไบ† PCIe ๆžถๆž„ไธญ็š„ไธ‰ไธชๅฑ‚ๅŠๅ…ถๅ„่‡ช็š„ๅŠŸ่ƒฝใ€‚

่กจ๏ผšPCIe ๆžถๆž„ไธญ็š„ๅฑ‚

ๅฑ‚็‰นๆ€ง
็‰ฉ็†ๅฑ‚้€ป่พ‘ๅญๅ—๏ผš้“พ่ทฏ่ฎญ็ปƒใ€ๅˆๅง‹ๅŒ–ๅ’Œ็ปดๆŠคใ€‚
็‰ฉ็†ๅญๅ—๏ผš8b/10b ็ผ–็ ๅ’Œ่งฃ็ ๏ผŒไปฅๅŠๅนถไธฒๅ’Œไธฒๅนถ่ฝฌๆขใ€‚
ๆ•ฐๆฎ้“พ่ทฏๅฑ‚DLLP ๆ•ฐๆฎๅŒ…็š„็ป„่ฃ…ๅ’Œๆ‹†ๅธใ€‚
้“พ่ทฏๅฑ‚ CRC๏ผˆLCRC๏ผ‰็š„็”Ÿๆˆๅ’Œ้ชŒ่ฏใ€‚
็กฎ่ฎคๅ’Œๅฆๅฎš็กฎ่ฎคๅ่ฎฎ๏ผˆ้‡ไผ ๅ‡บ้”™็š„ TLP๏ผ‰ใ€‚
ไบ‹ๅŠกๅฑ‚TLP ๆ•ฐๆฎๅŒ…็š„็ป„่ฃ…ๅ’Œๆ‹†ๅธใ€‚
็ซฏๅˆฐ็ซฏ CRC๏ผˆECRC๏ผ‰็š„็”Ÿๆˆๅ’Œ้ชŒ่ฏใ€‚
ๆต้‡ๆŽงๅˆถ๏ผšๆŽฅๆ”ถๅฎžไฝ“ไฝฟ็”จ DLLP ้€šๅ‘Šๅฏ็”จๆŽฅๆ”ถ็ผ“ๅ†ฒๅŒบๅคงๅฐไฟกๆฏใ€‚
ๆœๅŠก่ดจ้‡๏ผˆQoS๏ผ‰๏ผšๆต้‡็ฑปๅˆซ๏ผˆTC๏ผ‰ๅˆฐ่™šๆ‹Ÿ้€š้“๏ผˆVC๏ผ‰็š„ๆ˜ ๅฐ„ใ€‚
ไบ‹ๅŠกๆŽ’ๅบ๏ผšๅœจ VC ๅ†…ๅฎž็Žฐไบ‹ๅŠกๆŽ’ๅบ่ง„ๅˆ™ใ€‚
PCI ไธบๆฏไธชๅŠŸ่ƒฝๅฎšไน‰ไบ†ไธ€ไธชไธ“็”จ็š„้…็ฝฎๅœฐๅ€็ฉบ้—ดๅ—๏ผŒๅฆ‚ไธ‹ๅ›พๆ‰€็คบใ€‚่ฝฏไปถ็กฎๅฎšๅŠŸ่ƒฝ็š„ๅญ˜ๅœจใ€ๅฏนๅ…ถ่ฟ›่กŒ้…็ฝฎ๏ผŒๅนถๆฃ€ๆŸฅๅ’ŒๆŽงๅˆถๅ…ถ็Šถๆ€ใ€‚
PCIe ้…็ฝฎๅœฐๅ€็ฉบ้—ด

ๅ›พ๏ผšPCIe ้…็ฝฎๅœฐๅ€็ฉบ้—ด

PCIe ่ฝฏไปถ้ฉฑๅŠจ็จ‹ๅบ้…็ฝฎ

PCIe ๆŽงๅˆถๅ™จ้ฉฑๅŠจ็จ‹ๅบๅˆๅง‹ๅŒ– PCIe ่ต„ๆบๅนถๆ‰ง่กŒ้“พ่ทฏ่ฎญ็ปƒใ€‚่ฎญ็ปƒๆˆๅŠŸๅŽ๏ผŒๆŽงๅˆถๅ™จ้ฉฑๅŠจ็จ‹ๅบ่ฐƒ็”จ PCIe ๆก†ๆžถ่ฟ›่กŒ้“พ่ทฏๆžšไธพ๏ผŒไพ‹ๅฆ‚็ซฏ็‚นๅ‘็Žฐใ€่ฏ†ๅˆซๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบๅนถๆŽขๆต‹่ฟ™ไบ›้ฉฑๅŠจ็จ‹ๅบใ€‚ๆœ‰ๅ…ณ PCIe ๆก†ๆžถๅ’Œๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบ PCIe ๆณจๅ†Œ็š„ๆ›ดๅคšไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… https://www.kernel.org/doc/html/latest/PCI/index.htmlใ€‚

้“พ่ทฏ่ฎญ็ปƒ

้“พ่ทฏ่ฎญ็ปƒๅŒ…ๆ‹ฌไปฅไธ‹ๆ“ไฝœ๏ผš
  1. ไฝไบŽ https://github.com/torvalds/linux/blob/master/drivers/pci/controller/dwc/pcie-qcom.c ็š„ PCIe ้ฉฑๅŠจ็จ‹ๅบ pcie-qcom.c ๆ–‡ไปถไปŽ่ฎพๅค‡ๆ ‘่Žทๅ–ๆ‰€้œ€่ต„ๆบ๏ผŒไพ‹ๅฆ‚็จณๅŽ‹ๅ™จใ€ๆ—ถ้’Ÿใ€‚
  2. PCIe ้ฉฑๅŠจ็จ‹ๅบ่ฐƒ็”จไฝไบŽ https://github.com/torvalds/linux/blob/master/drivers/pci/controller/dwc/pcie-designware-host.c ็š„ Synopsys DesignWareยฎ Core ไธปๆœบ้ฉฑๅŠจ็จ‹ๅบ pcie-designware-host.c ๆ–‡ไปถๆฅๅˆๅง‹ๅŒ–ๆ นๅคๅˆไฝ“ใ€‚
  3. Synopsys DesignWare Core ้ฉฑๅŠจ็จ‹ๅบๆ‰ง่กŒๆ‰€ๆœ‰ๅฟ…่ฆ็š„ๅˆๅง‹ๅŒ–ใ€‚
  4. Synopsys DesignWare Core ้ฉฑๅŠจ็จ‹ๅบ่ฐƒ็”จๅ‡ฝๆ•ฐๆŒ‡้’ˆไปฅๆ‰ง่กŒไธปๆœบๅˆๅง‹ๅŒ–ใ€‚
  5. Qualcomm PCIe ้ฉฑๅŠจ็จ‹ๅบๆ‰ง่กŒ PHY ไธŠ็”ต๏ผŒๅฏ็”จๆ‰€ๆœ‰็จณๅŽ‹ๅ™จใ€ๆ—ถ้’Ÿใ€‚
  6. Synopsys DesignWare Core ้ฉฑๅŠจ็จ‹ๅบ้€š่ฟ‡่ฐƒ็”จๅฏๅŠจ้“พ่ทฏ็š„ๅ‡ฝๆ•ฐๆŒ‡้’ˆๆฅๅผ€ๅง‹้“พ่ทฏ่ฎญ็ปƒใ€‚

็กฌไปถๅˆๅง‹ๅŒ–

้ฉฑๅŠจ็จ‹ๅบๅˆๅง‹ๅŒ–ๅนถ้…็ฝฎ PCIe ็กฌไปถๆจกๅ—ๅนถๆ‰ง่กŒ้“พ่ทฏ่ฎญ็ปƒใ€‚ๅˆๅง‹ๅŒ–ๅœจ่ฐƒ็”จ platform _probe() ้ฉฑๅŠจๅ‡ฝๆ•ฐไน‹ๅŽ่ฟ›่กŒใ€‚
ๅฝ“ Synopsys DesignWare Core ้ฉฑๅŠจ็จ‹ๅบๅˆๅง‹ๅŒ–ๆ—ถ๏ผŒๅฎƒ่ฟ˜ไผšๅˆๅง‹ๅŒ– MSIใ€MSIx ๅ’ŒๆŽงๅˆถๅ™จใ€‚่ฏฅ้ฉฑๅŠจ็จ‹ๅบ่ฐƒ็”จ Qualcomm ๅ‡ฝๆ•ฐๆŒ‡้’ˆไปฅๅผ€ๅง‹้“พ่ทฏ่ฎญ็ปƒใ€‚
Synopsys DesignWare Core ้ฉฑๅŠจ็จ‹ๅบ็ญ‰ๅพ…้“พ่ทฏๆฟ€ๆดปๅŽๅ†ๆžšไธพ PCI ๆก†ๆžถใ€‚Qualcomm PCIe ้ฉฑๅŠจ็จ‹ๅบไป…ๅฏ็”จ้“พ่ทฏ่ฎญ็ปƒใ€‚
ๆณจๆ„๏ผšPCIE_0 ๆ นๅคๅˆไฝ“ๅฎžไพ‹้ป˜่ฎคๅฏ็”จ๏ผŒ็”จไบŽ WLAN EP ่ฟžๆŽฅใ€‚

ไธบ Dragonwing IQ-9075๏ผˆLemans๏ผ‰ๅฏ็”จ PCIe ็ซฏ็‚น๏ผˆEP๏ผ‰ๆจกๅผ

Dragonwing IQ-9075๏ผˆLemans๏ผ‰ไธŠ็š„ๆฏไธช PCIe ๆŽงๅˆถๅ™จๅฎžไพ‹้ƒฝๅฏไปฅ่ฟ่กŒๅœจๆ นๅคๅˆไฝ“๏ผˆRC๏ผ‰ๆˆ–็ซฏ็‚น๏ผˆEP๏ผ‰ๆจกๅผ๏ผŒไฝ†ไธ่ƒฝๅŒๆ—ถ่ฟ่กŒไธค็งๆจกๅผใ€‚่ฎพๅค‡ๆ ‘ๅœจๅŒไธ€ๅŸบๅœฐๅ€ๅค„ไธบๆฏ็งๆจกๅผๅฎšไน‰ไบ†ๅ•็‹ฌ็š„่Š‚็‚น,ๅนถไธ”ๆฏไธช PCIe ๅฎžไพ‹ๆฏๆฌกๅช่ƒฝๅฏ็”จๅ…ถไธญไธ€ไธชใ€‚
ๆณจๆ„๏ผšMonaco ไนŸๆ”ฏๆŒ PCIe EP ๆจกๅผ๏ผŒไฝ†่ฏฅๆ”ฏๆŒๅฐšๆœชๅŒ…ๅซๅœจๅฝ“ๅ‰ๅ†…ๆ ธไปฃ็ ๆ ‘ไธญ๏ผŒ่ฎกๅˆ’ๅœจๅŽ็ปญ็‰ˆๆœฌไธญๆไพ›ใ€‚

่กจ๏ผšLemans PCIe EP ่Š‚็‚น

EP ่Š‚็‚นRC ่Š‚็‚น๏ผˆไบ’ๆ–ฅ๏ผ‰Compatiblenum-laneslinux,pci-domain
pcie0_eppcie0qcom,sa8775p-pcie-ep20
pcie1_eppcie1qcom,sa8775p-pcie-ep41
pcie0_ep ๅ’Œ pcie1_ep ๅ‡ๅœจ arch/arm64/boot/dts/qcom/lemans.dtsi ไธญๅฎšไน‰๏ผŒไธ”้ป˜่ฎค status = "disabled",ๅ› ไธบๅฏนๅบ”็š„ RC ่Š‚็‚น(pcie0ใ€pcie1)ๅทฒๅฏ็”จใ€‚็ป‘ๅฎšๅˆฐ่ฟ™ไบ›่Š‚็‚น็š„ Qualcomm PCIe EP ๆŽงๅˆถๅ™จ้ฉฑๅŠจ็จ‹ๅบไธบ drivers/pci/controller/dwc/pcie-qcom-ep.c(้ฉฑๅŠจๅ็งฐ qcom-pcie-ep)ใ€‚

PCIe EP ๆจกๅผๅ†…ๆ ธ้…็ฝฎ

CONFIG_PCI_ENDPOINT ๅ’Œ CONFIG_PCI_ENDPOINT_CONFIGFS ๅทฒๅœจ Lemans defconfig ไธญๅฏ็”จใ€‚็”จไบŽๆž„ๅปบ Qualcomm EP ๆŽงๅˆถๅ™จ้ฉฑๅŠจ็จ‹ๅบ็š„ CONFIG_PCIE_QCOM_EP ้ป˜่ฎคๆœชๅฏ็”จ๏ผŒๅฟ…้กปๅผ€ๅฏๆ‰่ƒฝๅฏ็”จ EP ๆจกๅผใ€‚CONFIG_PCI_EPF_MHI ๅŠๅ…ถไพ่ต–้กน CONFIG_MHI_BUS_EP ไนŸ้ป˜่ฎคๆœชๅฏ็”จ๏ผŒๅฟ…้กปๅผ€ๅฏๆ‰่ƒฝไฝฟ็”จ MHI ็ซฏ็‚นๅŠŸ่ƒฝใ€‚ ่ฆๅฏ็”จ่ฟ™ไบ›้…็ฝฎ๏ผŒ่ฏทๅฐ†ไปฅไธ‹่กฅไธๅบ”็”จๅˆฐ arch/arm64/configs/defconfig ๆ–‡ไปถใ€‚
ๆณจๆ„๏ผšCONFIG_PCIE_QCOM_EP ไพ่ต– CONFIG_PCI_ENDPOINT,ๅนถ้€‰ๆ‹ฉ drivers/pci/controller/dwc/Kconfig ไธญๅฎšไน‰็š„ CONFIG_PCIE_DW_EP ๅ’Œ CONFIG_PCIE_QCOM_COMMONใ€‚CONFIG_PCI_EPF_MHI ๅฎšไน‰ไบŽ drivers/pci/endpoint/functions/Kconfig,ไพ่ต– CONFIG_MHI_BUS_EPโ€”โ€”ๅณ drivers/bus/mhi/ep/Kconfig ไธญ็š„ MHI ็ซฏ็‚นๆ€ป็บฟๅฎž็Žฐใ€‚

ๅœจ่ฎพๅค‡ๆ ‘ไธญๅฏ็”จ EP ่Š‚็‚น

pcie1๏ผˆRC๏ผ‰ๅ’Œ pcie1_ep๏ผˆEP๏ผ‰้ƒฝๅœจ lemans.dtsi ไธญ้€š่ฟ‡ๆ ‡็ญพๅฎšไน‰๏ผŒไธ” pcie1 ๅœจๅ…ถไธญ้ป˜่ฎค status = "disabled"ใ€‚็„ถ่€Œ๏ผŒlemans-evk.dts ๅˆ้€š่ฟ‡ๆฟ่ฝฝ M.2 E-key ่ฟžๆŽฅๅ™จๅฐ† pcie1 ้‡ๆ–ฐๅฏ็”จไธบ RC ๆจกๅผ(&pcie1 { ... status = "okay"; };)ใ€‚็”ฑไบŽๆฏไธช PCIe ๅฎžไพ‹ๅœจๅŒไธ€ๆ—ถ้—ดๅช่ƒฝๅค„ไบŽ RC ๆˆ– EP ไธญ็š„ไธ€็งๆจกๅผ๏ผŒๅ› ๆญคๅœจ Lemans EVK ไธŠๅฐ† PCIE_1 ๅˆ‡ๆขไธบ EP ๆจกๅผๆ„ๅ‘ณ็€็ฆ็”จ่ฏฅ RC ่ฆ†็›–๏ผŒๅนถๆ”นไธบๅฏ็”จ pcie1_epใ€‚ๅฐ†ไปฅไธ‹ๆ›ดๆ”นๅบ”็”จๅˆฐ arch/arm64/boot/dts/qcom/lemans-evk.dts๏ผš
pcie1_default_state๏ผˆๅœจ lemans-evk.dts ้ ๅŽไฝ็ฝฎ็š„ &tlmm ่Š‚็‚นไธญๅฎšไน‰๏ผ‰ไธบ GPIO 4 (PERST#) ๅ’Œ GPIO 5 (WAKE#) ่ฎพ็ฝฎไบ†ๅผ•่„šๅŠŸ่ƒฝใ€้ฉฑๅŠจๅผบๅบฆๅ’Œๅ็ฝฎ๏ผŒไฝ†ๆฒกๆœ‰ๅ›บๅฎšๅฎƒไปฌ็š„ๆ–นๅ‘,ๅ› ๆญค EP ่Š‚็‚นๅฏไปฅๅค็”จไธŽ RC ๆจกๅผ็›ธๅŒ็š„ pinctrl ็ป„ๅ’Œ็‰ฉ็† GPIOใ€‚ไฝ†ๆ˜ฏ,ๆฏไธช GPIO ไธŠ็š„ไฟกๅทๆ–นๅ‘ไผšๅœจไธค็งๆจกๅผไน‹้—ดๅ่ฝฌ:
  • ๅœจ RC ๆจกๅผไธ‹,pcie-qcom.c ๅฐ† PERST# GPIO ่ฏทๆฑ‚ไธบ GPIOD_OUT_HIGHโ€”โ€”ๆ นๅคๅˆไฝ“้ฉฑๅŠจ PERST# ไปฅๅคไฝไธ‹่กŒ่ฎพๅค‡ใ€‚RC ๆจกๅผไธ้ฉฑๅŠจ WAKE# GPIOใ€‚
  • ๅœจ EP ๆจกๅผไธ‹,pcie-qcom-ep.c ๅฐ† reset-gpios ่ฏทๆฑ‚ไธบ GPIOD_INโ€”โ€”็ซฏ็‚นๅฐ† PERST# ไฝœไธบ่พ“ๅ…ฅ่ฏปๅ–,็”ฑ่ฟžๆŽฅ็š„ๆ นๅคๅˆไฝ“้ฉฑๅŠจ;ๅนถๅฐ† wake-gpios ่ฏทๆฑ‚ไธบ GPIOD_OUT_LOWโ€”โ€”็ซฏ็‚นๅฐ† WAKE# ไฝœไธบ่พ“ๅ‡บ้ฉฑๅŠจๅˆฐไธปๆœบใ€‚
GPIO ๆ–นๅ‘็”ฑ้ฉฑๅŠจ็จ‹ๅบๅœจ probe ๆ—ถๆ นๆฎๅ…ถๅŒน้…็š„ๆจกๅผ็ป‘ๅฎš่ฎพ็ฝฎ,่€Œไธๆ˜ฏ็”ฑ pinctrl ็ป„่ฎพ็ฝฎ,ๅ› ๆญคไธ้œ€่ฆไธบๆ–นๅ‘ๅˆ‡ๆข้ขๅค–ไฟฎๆ”น่ฎพๅค‡ๆ ‘ใ€‚
ๆณจๆ„๏ผšไธŠๆธธ qcom,pcie-ep.yaml ็ป‘ๅฎš่ฆๆฑ‚ๆไพ› reset-gpios,ๅณ่ฟžๆŽฅๅˆฐ็”ฑๆ‰€่ฟžๆŽฅๆ นๅคๅˆไฝ“้ฉฑๅŠจ็š„ PERST# ่พ“ๅ…ฅ็š„ GPIOใ€‚lemans.dtsi ไธญ็š„ pcie1_ep ่Š‚็‚นๆฒกๆœ‰ๅฎšไน‰่ฏฅๅฑžๆ€ง,ๅ› ไธบๅฎƒๆ˜ฏๆฟๅก็›ธๅ…ณ็š„ใ€‚
ๅŒๆ ท็š„ๆญฅ้ชคไนŸ้€‚็”จไบŽ PCIE_0๏ผš็ฆ็”จ pcie0 RC ่ฆ†็›–๏ผŒๆ”นไธบๅฏ็”จ pcie0_ep,ๅค็”จ pcie0_default_state pinctrl ็ป„ๅŠๅ…ถ PERST#/WAKE# GPIOใ€‚
ๆณจๆ„๏ผš็ฆ็”จ pcie0 ไนŸไผšๅŒๆ—ถ็ฆ็”จ M.2 E-key ่ฟžๆŽฅๅ™จ็š„ PCIe ้“พ่ทฏ(pcieport0)๏ผŒๅ› ไธบ่ฏฅ่ฟžๆŽฅๅ™จๅœจ RC ๆจกๅผไธ‹ๆŽฅ็บฟๅˆฐ PCIE_0ใ€‚ไป…ๅฝ“ไฝ ไธ้œ€่ฆๅฐ† M.2 ่ฟžๆŽฅๅ™จ็”จไบŽ PCIe ๅกๆ—ถ๏ผŒๆ‰ๅฐ† PCIE_0 ๅˆ‡ๆขๅˆฐ EP ๆจกๅผใ€‚
physใ€iommusใ€interconnectsใ€power-domainsใ€clocks ๅ’Œ resets ๅทฒๅœจไธคไธช EP ่Š‚็‚นไธญๅกซๅ……ๅฎŒๆฏ•๏ผŒๆ ‡ๅ‡† bring-up ๆ—ถๆ— ้œ€ไฟฎๆ”นใ€‚

PCIe EP ้ฉฑๅŠจๅˆๅง‹ๅŒ–

pcie-qcom-ep.c ไธญ็š„ qcom_pcie_ep_probe() ไผš่Žทๅ– parfใ€dbiใ€mmio ๅ’Œ dma ๅฏ„ๅญ˜ๅ™จๅŒบๅŸŸใ€ๅ…จ้ƒจไบ”ไธชๅฎžไพ‹ๆ—ถ้’Ÿใ€core ๅคไฝใ€reset(PERST#)ๅ’Œๅฏ้€‰็š„ wake(WAKE#) GPIO,ไปฅๅŠๅฏ้€‰็š„ pciephy PHY,็„ถๅŽ่ฐƒ็”จๅ…ฌๅ…ฑ็š„ DesignWare dw_pcie_ep_init() ๆฅๅˆๅง‹ๅŒ–็ซฏ็‚นๆ ธๅฟƒใ€‚Lemans ๅŒน้… qcom,sa8775p-pcie-ep compatible ๅญ—็ฌฆไธฒ,่ฏฅๅญ—็ฌฆไธฒ้€‰ๆ‹ฉ cfg_1_34_0 ้…็ฝฎ(ๅฏ็”จ HDMA ๆ”ฏๆŒใ€NO_SNOOP ่ฆ†็›–,ๅนถ็ฆ็”จ MHI RAM ๅฅ‡ๅถๆ ก้ชŒ)ใ€‚ ไธ€ไธชๅ…จๅฑ€ IRQ ็บฟ็จ‹(qcom_pcie_ep_global_irq_thread())็”จไบŽๅค„็†็”ฑ่ฟžๆŽฅ็š„ๆ นๅคๅˆไฝ“่งฆๅ‘็š„้“พ่ทฏๅปบ็ซ‹/ๆ–ญๅผ€ไบ‹ไปถใ€ๆ€ป็บฟไธปๆŽงไฝฟ่ƒฝ(BME),ไปฅๅŠ PM turn-off/D ็Šถๆ€้€š็Ÿฅใ€‚

ไฝฟ็”จ configfs ็ป‘ๅฎš MHI ็ซฏ็‚นๅŠŸ่ƒฝ

pci-epf-mhi.c ้ฉฑๅŠจๅœจ pci_epf_mhi_ids[] ไธญไธบๆฏไธช SoC ๆณจๅ†Œไธ€ไธช่ฎพๅค‡ ID,ๆฏไธช้ƒฝๆœ‰ๅ„่‡ช็š„ header(vendor/device ID)ๅ’Œ MHI ้€š้“้…็ฝฎใ€‚Lemans ๅŒน้… pci_epf_mhi_sa8775p ๆก็›ฎ,่ฏฅๆก็›ฎ่ฎพ็ฝฎ่ฎพๅค‡ ID 0x0116,ไฝฟ็”จ BAR_0ใ€32 ไธช MSI ๅ‘้‡ใ€MRU ไธบ 0x8000,ๅนถๅฏ็”จ DMA ่พ…ๅŠฉไผ ่พ“(MHI_EPF_USE_DMA)ใ€‚่ฏฅๆก็›ฎ่ฟ˜้€‰ๆ‹ฉๆ ‡ๅ‡†็š„ mhi_v1_channels ่กจ(LOOPBACKใ€SAHARAใ€DIAGใ€SSRใ€QDSSใ€EFSใ€MBIMใ€QMIใ€IP-CTRL-1ใ€IPCRใ€DUNใ€IP_SW0)ใ€‚header ๅ’Œ้€š้“้…็ฝฎ็”ฑๆญคๆก็›ฎๅ›บๅฎš,ๅ› ๆญคๆ— ้œ€้€š่ฟ‡ configfs ๅ†™ๅ…ฅ vendorid/deviceidใ€‚ ๅ†…ๆ ธๅœจๅฏ็”จ pcie1_ep ็š„ๆƒ…ๅ†ตไธ‹ๅฏๅŠจๅŽ,ไฝฟ็”จ PCI ็ซฏ็‚น configfs ๆŽฅๅฃๅฐ† MHI ็ซฏ็‚นๅŠŸ่ƒฝ็ป‘ๅฎšๅˆฐ qcom-pcie-ep ๆŽงๅˆถๅ™จใ€‚functions ็›ฎๅฝ•ๅ็งฐๅฟ…้กปไธŽ pci_epf_mhi_sa8775p ๆก็›ฎๅŒน้…,ไปฅไพฟๆŽขๆต‹ๅˆฐๆญฃ็กฎ็š„่ฎพๅค‡ ID ๅ’Œ้€š้“่กจใ€‚
ๅ‘ start ๅ†™ๅ…ฅ 1 ไผšๅฃฐๆ˜Ž็ซฏ็‚นๅทฒๅฐฑ็ปช,ๅ…่ฎธ้“พ่ทฏไธŽ่ฟžๆŽฅ็š„ๆ นๅคๅˆไฝ“่ฟ›่กŒ่ฎญ็ปƒใ€‚pci_epf_mhi_bind() ไผšไปŽ็ˆถ qcom-pcie-ep ๅนณๅฐ่ฎพๅค‡ไธญๆŸฅๆ‰พ mmio ๅฏ„ๅญ˜ๅ™จๅŒบๅŸŸๅ’Œ doorbell ไธญๆ–ญ,่€Œ pci_epf_mhi_link_up() ไผšๅœจ้“พ่ทฏๅปบ็ซ‹ๅŽๆณจๅ†Œ MHI ็ซฏ็‚นๆŽงๅˆถๅ™จใ€‚
ๆณจๆ„๏ผšๅฆ‚ๆžœ mhi_bus_ep ๅ’Œ pci_epf_mhi ๆž„ๅปบไธบ็‹ฌ็ซ‹ๆจกๅ—,่ฏทๅ…ˆๅŠ ่ฝฝ mhi_bus_ep,ๅ› ไธบ CONFIG_PCI_EPF_MHI ไพ่ต– CONFIG_MHI_BUS_EPใ€‚

้ชŒ่ฏ MHI EP ๆจกๅผๆžšไธพ

ๅœจ่ฟžๆŽฅๅˆฐ Lemans EP ็ซฏๅฃ็š„ไธปๆœบไธŠ,็กฎ่ฎค่ฎพๅค‡ๅทฒไฝœไธบๅ…ทๆœ‰่ฏฅ MHI ่ฎพๅค‡ ID ็š„ PCI ็ซฏ็‚น่ขซๆžšไธพใ€‚
่พ“ๅ‡บ:
ๅœจ็›ฎๆ ‡็ซฏ,็กฎ่ฎค MHI ็ซฏ็‚น้€š้“ๅทฒๆณจๅ†Œใ€‚
ๆœ‰ๅ…ณๅŸบไบŽ configfs ็š„็ซฏ็‚น bring-up ๆต็จ‹็š„ๆ›ดๅคšไฟกๆฏ,่ฏทๅ‚้˜… https://www.kernel.org/doc/html/latest/PCI/endpoint/pci-endpoint-cfs.htmlใ€‚

ๅฏ็”จ QPS615 PCIe ไบคๆขๆœบ

ๆœฌ่Š‚ไป‹็ปๅฆ‚ไฝ•ๅœจ Qualcomm Linux ็กฌไปถ SoC ไธญๅฏ็”จ QPS615 PCIe ไบคๆขๆœบใ€‚QPS615 ไบคๆขๆœบ็ซฏ็‚นๅœจ PCIe1 ๅฎžไพ‹ไธŠๅ—ๆ”ฏๆŒใ€‚ไธ‹ๅ›พๅฑ•็คบไบ† QPS615 ็ซฏ็‚นๅ’Œ่ฟžๆŽฅใ€‚
QPS615 PCIe ไบคๆขๆœบ่ฟžๆŽฅๅ›พ

ๅ›พ๏ผšQPS615 PCIe ไบคๆขๆœบ่ฟžๆŽฅๅ›พ

ๅฏไปŽไปฅไธ‹ไฝ็ฝฎ่ฎฟ้—ฎ Qualcomm PCIe ้ฉฑๅŠจ็จ‹ๅบๆ–‡ๆกฃ๏ผš

PCIe ็›ธๅ…ณ้…็ฝฎ

ไปฅไธ‹้…็ฝฎ้ป˜่ฎคๅฏ็”จ๏ผŒไปฅๆ”ฏๆŒ QPS615 ไบคๆขๆœบใ€‚่‹ฅ่ฆๅฐ†ๅ…ถ็”จไบŽๅ…ถไป– PCIe ็ซฏ็‚น๏ผŒ่ฏท้€š่ฟ‡่ฟ˜ๅŽŸไปฃ็ ๆ›ดๆ”นๆฅ็ฆ็”จ QPS615 ไบคๆขๆœบ็š„้ป˜่ฎคๆ”ฏๆŒใ€‚ ่ฆๅฏ็”จ PCIe ็›ธๅ…ณ็š„ configs๏ผŒ่ฏทๅฐ†ไปฅไธ‹่กฅไธๅบ”็”จๅˆฐ /arch/arm64/configs/qcom_addons.config ๆ–‡ไปถใ€‚

ๆถˆๆฏไฟกๅทไธญๆ–ญ๏ผˆMSI๏ผ‰

ๅฝ“ๅ‰็š„ MSI ๆ˜ ๅฐ„ๅนถไธๅŒ…ๅซๆ‰€ๆœ‰ๅ‘้‡ใ€‚Qualcomm Linux ็กฌไปถ SoC ๆ”ฏๆŒๅ…ซไธชๅ‘้‡ใ€‚ๆฏไธชๅ‘้‡ๅˆๆ”ฏๆŒ 32 ไธช MSIใ€‚ๅ› ๆญค๏ผŒๆ”ฏๆŒ็š„ MSI ๆ€ปๆ•ฐไธบ 256ใ€‚ ๆœ‰ๅ…ณไธบๆญค PCIe ๅฎžไพ‹ๆทปๅŠ ๆ‰€ๆœ‰ๅ—ๆ”ฏๆŒ็š„ MSI ็ป„็š„ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… https://lore.kernel.org/linux-arm-msm/f1168212-bc6e-4570-869c-2870d6f248ad@linaro.org/T/ใ€‚

PCIe ๅ†…ๆ ธ้ฉฑๅŠจ็จ‹ๅบๆ—ฅๅฟ—็คบไพ‹

ไปฅไธ‹ๆ˜ฏๆฅ่‡ช QPS615 ่ฎพๅค‡ๆžšไธพ็š„ PCIe ๅ†…ๆ ธ้ฉฑๅŠจ็จ‹ๅบๆ—ฅๅฟ—็คบไพ‹ใ€‚

้€š่ฟ‡ QPS615 PCIe ไบคๆขๆœบๆ”ฏๆŒ็š„ไปฅๅคช็ฝ‘ๆŽฅๅฃ

QPS615 PCIe ไบคๆขๆœบไธบ่ฎพๅค‡ๅฏ็”จไปฅๅคช็ฝ‘่ฟžๆŽฅใ€‚ๅฝ“่ฎพๅค‡ๅŠ ่ฝฝ QPS615 ้ฉฑๅŠจ็จ‹ๅบๅนถๅปบ็ซ‹ PCIe ้“พ่ทฏๆ—ถ๏ผŒ้ป˜่ฎคๆƒ…ๅ†ตไธ‹ไผšๅœจ่ฎพๅค‡ๅฏๅŠจๆœŸ้—ด่‡ชๅŠจๆฟ€ๆดปๅ—ๆ”ฏๆŒ็š„ไปฅๅคช็ฝ‘ๆŽฅๅฃใ€‚ ่ฆ่‡ชๅฎšไน‰้ป˜่ฎค้…็ฝฎๆˆ–ๅฏ็”จ Qualcomm ็กฌไปถ่ฎพ็ฝฎไน‹ๅค–็š„้ขๅค– MAC/PHY ็ป„ไปถ๏ผŒ่ฏทๅ‚้˜… Qualcomm Linux Ethernet guide ไธญ็š„ Bring up Ethernet ้ƒจๅˆ†ใ€‚

่กจ๏ผšๆ”ฏๆŒ็š„ไปฅๅคช็ฝ‘ๆŽฅๅฃ

ๆŽฅๅฃ็ฑปๅž‹้€Ÿๅบฆ่ฟžๆŽฅๅ™จ็ฑปๅž‹่ฏดๆ˜Ž
QEP PHY (SGMII)2.5 GbEIX/RJ45 ่ฟžๆŽฅๅ™จ๏ผˆQEP8121๏ผ‰
  • ้ป˜่ฎคๅฏ็”จใ€‚
AQR PHY (USXGMII)10 GbEIX/RJ45 ่ฟžๆŽฅๅ™จ๏ผˆAQR113C๏ผ‰
  • 10 ๅƒๅ…†ไปฅๅคช็ฝ‘ AQR PHY ๆ˜ฏ RB3 Gen 2 ๅผ€ๅ‘ๅฅ—ไปถไปฅๅŠ Dragonwing IQ-8275 ๅ’Œ Dragonwing IQ-9075 ่ฏ„ไผฐๅฅ—ไปถ๏ผˆEVK๏ผ‰ไธญ็š„ๅฏ้€‰็ป„ไปถใ€‚ ๅฎƒๅทฒๅœจ AQR113C ไธŠ้€š่ฟ‡้ชŒ่ฏใ€‚

ๅฏ็”จๆ›ฟไปฃ็กฌไปถ็ป„ไปถ

ๆ‚จๅฏไปฅ่ฟžๆŽฅ Qualcomm ๆไพ›็š„็กฌไปถ้…็ฝฎไน‹ๅค–็š„ MAC/PHY ็ป„ไปถๅนถๅฐ†ๅ…ถๅฏ็”จใ€‚ ่ฆๅฐ† QPS615 ๆ›ฟๆขไธบๅ…ถไป–ๅŸบไบŽ PCIe ็š„ MAC/PHY๏ผŒ่ฏทๅ‚้˜…ๅฏ็”จ QPS615 PCIe ไบคๆขๆœบใ€‚
ๆณจๆ„๏ผšๆ‚จๅฟ…้กปไปŽ็›ธๅบ”็š„ไพ›ๅบ”ๅ•†ๅค„่Žทๅ– MAC/PHY ้ฉฑๅŠจ็จ‹ๅบๅ’Œๅ›บไปถใ€‚Qualcomm ๅฏน่ฟ™ไบ›้…็ฝฎๆ›ดๆ”นไธๆ‰ฟๆ‹…่ดฃไปปใ€‚

้€š่ฟ‡ PCIe ไบคๆขๆœบๅฏ็”จ USB ๆŽฅๅฃ

ๆœฌ่Š‚ไป‹็ปๅฆ‚ไฝ•ๅœจ Qualcomm Linux ็กฌไปถ SoC ไธญ้€š่ฟ‡ PCIe ไบคๆขๆœบๆฟ€ๆดป USB ๆŽฅๅฃใ€‚PCIE1 ๅฎžไพ‹่ฟžๆŽฅๅˆฐ QPS615 ไบคๆขๆœบ็š„็ซฏ็‚น๏ผŒQPS615 ็š„ไธ‹ๆธธ็ซฏๅฃ่ฟžๆŽฅๅˆฐ PCIe ่ฝฌ USB ็ซฏ็‚นใ€‚ๆœ‰ๅ…ณไฝฟ็”จ QPS615 ็š„ PCIe ่ฝฌ USB ็ซฏ็‚น่ฟžๆŽฅ๏ผŒ่ฏทๅ‚้˜…ไฝไบŽ https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-251/rb3_hardware_overview.html ็š„ไธปๆฟๅ’Œ่ฝฌๆŽฅๆฟๆก†ๅ›พใ€‚
ๆณจๆ„๏ผšDragonwing IQ-9075 PCIe ่ฝฏไปถไธๆ”ฏๆŒ USBใ€‚
USB ้›†็บฟๅ™จ็š„็”ตๆบ้€š่ฟ‡ pwrctrl ้ฉฑๅŠจ็จ‹ๅบๅฏ็”จ๏ผŒๆœ‰ๅ…ณ่ฟ™ไบ›่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…ไปฅไธ‹ไธŠๆธธ้“พๆŽฅใ€‚ https://elixir.bootlin.com/linux/v7.1/source/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts#L896 https://elixir.bootlin.com/linux/v7.1/source/Documentation/devicetree/bindings/usb/renesas,upd720201-pci.yaml https://elixir.bootlin.com/linux/v7.1/source/drivers/pci/pwrctrl/generic.c

ไธ‹่ฝฝ PCIe ่ฝฌ USB ๆŽงๅˆถๅ™จๅ›บไปถ

่ฆไปŽ https://www.renesas.com/us/en/products/interface/usb-switches-hubs/upd720201-usb-30-host-controller#design_development ไธ‹่ฝฝๅ›บไปถ๏ผŒ่ฏทๆณจๅ†Œๅนถ็™ปๅฝ• https://www.renesas.com/ใ€‚ๅฐ†ไธ‹่ฝฝ็š„ๅ›บไปถๆ–‡ไปถ้‡ๅ‘ฝๅไธบ renesas_usb_fw.memใ€‚
ๆณจๆ„๏ผšไธบ้˜ฒๆญขๅ‘ฝไปคๅคฑ่ดฅ๏ผŒ่ฏทๅœจๆ›ดๆ–ฐ Renesas ๅ›บไปถไน‹ๅ‰๏ผŒๆŒ‰็…ง Set up the device ้ƒจๅˆ†ไธญ็š„่ฏดๆ˜Žๆ›ดๆ–ฐ่ฝฏไปถใ€‚
้€‰้กน 1๏ผˆUbuntu๏ผ‰๏ผšไฝฟ็”จ SCP ๆˆ–็ฑปไผผๅทฅๅ…ทๆŽจ้€ๅ›บไปถๆ–‡ไปถใ€‚ไพ‹ๅฆ‚๏ผŒ
้€‰้กน 2๏ผˆYocto๏ผ‰๏ผš
  1. ้€š่ฟ‡ USB ็บฟ็ผ†ๅฐ†่ฎพๅค‡่ฟžๆŽฅๅˆฐไธปๆœบ PC ไปฅไฝฟ็”จ adbใ€‚
  2. ๅฐ†ๅ›บไปถๆŽจ้€ๅˆฐ่ฎพๅค‡ใ€‚
  3. ่ฆๆฟ€ๆดปๅ›บไปถ๏ผŒ่ฏทๆ‰ง่กŒไปฅไธ‹ไปปไธ€้€‰้กนใ€‚
    • ้€‰้กน A๏ผš้‡ๅฏ็›ฎๆ ‡่ฎพๅค‡ไปฅๅฏ็”จ USB Type-A ็ซฏๅฃใ€‚
    • ้€‰้กน B๏ผšๆ‰‹ๅŠจ็ป‘ๅฎš Renesas xHCI ้ฉฑๅŠจ็จ‹ๅบใ€‚
  4. ้ชŒ่ฏๅ›บไปถๆžšไธพใ€‚

็”จไบŽ PCIe ่ฝฌ USB ่ฎพๅค‡ๆžšไธพๅ‚่€ƒ็š„ PCIe ๅ†…ๆ ธ้ฉฑๅŠจ็จ‹ๅบๆ—ฅๅฟ—

ๆ‚จๅฏไปฅ่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคๆฅๆŸฅ็œ‹่ฎพๅค‡ไฟกๆฏ๏ผš
  • ่ฆๆ˜พ็คบ USB ไธญ็š„่ฎพๅค‡ไฟกๆฏ๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคใ€‚
    ๅฐ†ๆ˜พ็คบไปฅไธ‹ๆถˆๆฏใ€‚
  • ่ฆๆ˜พ็คบ PCIe ไธญ็š„่ฎพๅค‡ไฟกๆฏ๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคใ€‚
    ๅฐ†ๆ˜พ็คบไปฅไธ‹ๆถˆๆฏใ€‚

็บง่”่ฟžๆŽฅ QPS615 ไบคๆขๆœบ

ไปฅ็บง่”ๆ–นๅผ่ฟžๆŽฅ QPS615 ไบคๆขๆœบ๏ผŒไปฅๅฏ็”จ้ขๅค–็š„ไปฅๅคช็ฝ‘ใ€PCIe ๅ’Œ USB ็ซฏๅฃใ€‚
ๆณจๆ„๏ผšๆญคๅŠŸ่ƒฝไป…ๅœจ QCS6490 ไธญๅ—ๆ”ฏๆŒใ€‚
ไธ‹ๅ›พๅฑ•็คบไบ†ไปฅ็บง่”ๆ–นๅผ่ฟžๆŽฅๅˆฐ PCIE1 ็š„ไธคไธช QPS615 ไบคๆขๆœบ๏ผŒไปฅๅŠ่ฟžๆŽฅๅˆฐ PCIE2 ็š„ๅฆไธ€ไธช QPS615 ไบคๆขๆœบใ€‚
QPS615 ็บง่”่ฟžๆŽฅ

ๅ›พ๏ผšQPS615 ไบคๆขๆœบ็บง่”่ฟžๆŽฅ

่ฆไธบๆ‰€ๆœ‰็ซฏ็‚นๅฏๅŠจ้“พ่ทฏ่ฎญ็ปƒๅ’Œๆžšไธพ๏ผŒ่ฏทๆ‰ง่กŒไปฅไธ‹ๆ“ไฝœ๏ผš
  1. ่ฆ้‡็ฝฎ QPS615 ไบคๆขๆœบ๏ผŒ่ฏทๅˆ‡ๆข QPS615 #1 ๅ’Œ QPS615 #2 ็š„ RESX GPIOใ€‚
  2. ่ฆๆŽงๅˆถ็ซฏ็‚น้‡็ฝฎ๏ผŒ่ฏท่งฆๅ‘ PERSTใ€‚ไธคไธชไบคๆขๆœบๅ…ฑไบซ PERSTใ€‚
่ฎพๅค‡ๅฏไปฅ็›ดๆŽฅ่ฟžๆŽฅๅˆฐ QPS615 ไบคๆขๆœบใ€‚PCIe RC0 ่ฟžๆŽฅๅˆฐ WLAN ็ซฏ็‚นใ€‚็”ฑไบŽ PCIe ่Š‚็‚นๅฑ‚ๆฌก็ป“ๆž„๏ผŒๅญ˜ๅœจไปฅไธ‹ๅทฎๅผ‚ใ€‚
  • ่ฟžๆŽฅๅˆฐไบคๆขๆœบ็š„่ฎพๅค‡๏ผš
    • QPS615 PCIe ๆ ‘่Š‚็‚นๅฑ‚ๆฌก็ป“ๆž„ๆ˜ฏ้™ๆ€ๅ›บๅฎš็š„ใ€‚
    • ็”จไบŽไบคๆข USP ๅ’Œ DSP ็ซฏๅฃ็š„ๆ‰€ๆœ‰่Š‚็‚น้ƒฝๅœจ PCIe ๅˆๅง‹ๅŒ–ๆœŸ้—ดๅˆ›ๅปบใ€‚
    • ๅ…ถไธญไธ€ไธชไบคๆขๆœบ DSP ็ซฏๅฃไปฃ่กจ WLANใ€‚
    • ๅฆ‚ๆžœ็ฆ็”จ WLAN ่Š‚็‚น๏ผŒๅฐ†็ฆ็”จ WLAN ่ฎพๅค‡๏ผŒไฝ† PCIe ไธ‹ๆธธ็ซฏๅฃไปไฟๆŒๅฏ็”จ็Šถๆ€๏ผŒๅนถ่ฟ”ๅ›ž้ป˜่ฎค็š„ๆœ€ๅคง้“พ่ทฏๅฎฝๅบฆใ€‚
  • ็›ดๆŽฅ่ฟžๆŽฅ็š„ WLAN ่ฎพๅค‡๏ผš
    • ไป…็ฆ็”จๅ•ไธช่Š‚็‚นใ€‚
    • ๅฝ“ WLAN ่ขซ็ฆ็”จๆ—ถ๏ผŒ่ฟ”ๅ›ž Invalid argumentใ€‚

้€š่ฟ‡ PCIe ๆŽฅๅฃๅฏ็”จ NVMe

ๆœฌ่Š‚ไป‹็ปๅฆ‚ไฝ•ไฝฟ็”จ PCIe ๅฏ็”จ NVMe ไปฅ่ฟ›่กŒๅญ˜ๅ‚จๆ‰ฉๅฑ•ใ€‚่ฆ้ชŒ่ฏ NVMe ๆ˜ฏๅฆ้€š่ฟ‡ PCIe ๆŽฅๅฃ่ฟžๆŽฅ๏ผŒ่ฏทๆ‰ง่กŒไปฅไธ‹ๆ“ไฝœ๏ผš
  1. ่ฆๆ˜พ็คบ PCIe ่ฎพๅค‡ไฟกๆฏ๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคใ€‚
    ่พ“ๅ‡บ๏ผš
  2. ๆ‰พๅˆฐ PCIe ๆ—ฅๅฟ—ใ€‚
    ่พ“ๅ‡บ๏ผš
  3. ่ฆๆ‰พๅˆฐ NVMe ็›ฎๅฝ•๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคใ€‚
    ่พ“ๅ‡บ๏ผš

ไธบ SMMUv2 ็›ฎๆ ‡ๆ›ดๆ–ฐ iommu-map ๅฑžๆ€ง

ๅฏนไฝฟ็”จ SMMUv2 IOMMU ๅค„็† PCIe ็š„็›ฎๆ ‡(ไพ‹ๅฆ‚ Dragonwing IQ-9075 (Lemans)ใ€Monaco ๅ’Œ Kodiak)่€Œ่จ€,ๆฏไธช PCIe Requester ID (RID) ้ƒฝไผš้€š่ฟ‡ PCIe host bridge ่Š‚็‚นไธญ็š„ iommu-map ๅฑžๆ€ง่ฝฌๆขไธบไธ€ไธช Stream ID (SID)ใ€‚ๅœจ็ป™ PCIe ๆ นๅคๅˆไฝ“ไธ‹ๆธธๆทปๅŠ ่ฎพๅค‡ใ€ไบคๆขๆœบๆˆ–็ซฏ็‚นๆ—ถ,ๆญคๅฑžๆ€ง้…็ฝฎ้”™่ฏฏๆ˜ฏๅฏผ่‡ดๅ‡บ็Žฐ no iommu-map translation for id ๅคฑ่ดฅ็š„ๅธธ่งๅŽŸๅ› ใ€‚

iommu-map ็š„ๅทฅไฝœๅŽŸ็†

ๆฏไธช iommu-map ๆก็›ฎๅ…ทๆœ‰ไปฅไธ‹ๅฝขๅผ๏ผš
ๅ†…ๆ ธ(drivers/of/base.c: of_map_id())ๆŒ‰ไปฅไธ‹่ง„ๅˆ™ๅค„็†:
ๅคšไธชๆก็›ฎๆŒ‰้กบๅบๆฃ€ๆŸฅ,้ฆ–ไธชๅŒน้…้กน็”Ÿๆ•ˆใ€‚ๅฝ“ count = 1 ๆ—ถ,ๆ˜ ๅฐ„็ฎ€ๅŒ–ไธบ RID == rid_base -> SID = sid_baseใ€‚ๆฏไธชๆก็›ฎไฝฟ็”จ count = 1๏ผˆ็จ€็–็‚นๆ˜ ๅฐ„๏ผ‰ๅฏๅฐ†ไธ€ไธช RID ็ฒพ็กฎๅ›บๅฎšๅˆฐไธ€ไธช SID,ๆ— ่ฎบ RID ๅ€ผๆœ‰ๅคšๅคง,ๅนถๅฏ้ฟๅ…่€—ๅฐฝ SMMU ๅฎž็Žฐ็š„ SID ่Œƒๅ›ดใ€‚
ๆณจๆ„๏ผš็ฎ€ๅ•็š„ๅ•ไธ€ range ๆก็›ฎ,ไพ‹ๅฆ‚ iommu-map = <0x0 &pcie_smmu 0x0000 0x500>;,ไผšๅฐ† count ไธช่ฟž็ปญ็š„ RID ๆ˜ ๅฐ„ๅˆฐ count ไธช่ฟž็ปญ็š„ SID,ๅ› ๆญค SID ๅ็งปไผš้š RID ๅ€ผๆˆๆฏ”ไพ‹ๅขž้•ฟใ€‚ไธ€ๆ—ฆๆฅ่‡ชไธ‹ๆธธไบคๆขๆœบๆˆ–้ขๅค–็ซฏ็‚น็š„ RID ่ถ…ๅ‡บ SMMU ๅฏ็”จ็š„ SID ่Œƒๅ›ด,่ฟ™็งๆ˜ ๅฐ„ๅฐฑไผšๅคฑ่ดฅใ€‚

PCIe RID ไธŽ SID ๅŸบ็ก€

PCIe RID ๆ˜ฏไธ€ไธช 16 ไฝๅ€ผ,็ผ–็ ไบ†ๆ€ป็บฟใ€่ฎพๅค‡ๅ’ŒๅŠŸ่ƒฝ๏ผš

่กจ๏ผšๅธธ่ง RID ๅ€ผ

BusDevFnRID (hex)่ฏดๆ˜Ž
0000x0000ๆ นๅคๅˆไฝ“๏ผŒๅง‹็ปˆๅญ˜ๅœจ
1000x0100RC ไธ‹่กŒ็š„็ฌฌไธ€ไธช่ฎพๅค‡๏ผˆ็ซฏ็‚นๆˆ–ไบคๆขๆœบไธŠ่กŒ๏ผ‰
2100x0208ไบคๆขๆœบไธ‹่กŒ็ซฏๅฃ๏ผŒ่ฎพๅค‡ 1
21610x0281lspci ๅœฐๅ€ 02:10.1

lemans.dtsi ๅ‚่€ƒ็คบไพ‹

Lemans ๅฎšไน‰ไบ†ไธคไธช PCIe ๆŽงๅˆถๅ™จ,ๆฏไธช้ƒฝๆ˜ ๅฐ„ๅˆฐๅ…ฑไบซ pcie_smmu(qcom,sa8775p-smmu-500,ไธ€ไธช SMMUv2 ็ณปๅˆ— IOMMU)ไธญๅ„่‡ช็š„ SID ๅญ่Œƒๅ›ดใ€‚pcie0 ไฝฟ็”จ SID ๅŸบๅ€ 0x0000,pcie1 ไฝฟ็”จ SID ๅŸบๅ€ 0x0080,ๅ› ๆญคๅฎƒไปฌ็š„ SID ็ฉบ้—ดไธไผš้‡ๅ ใ€‚
RID 0x0000(bus 0, dev 0, fn 0)ๅœจ pcie0 ไธŠๆ˜ ๅฐ„ๅˆฐ SID 0x0000,ๅœจ pcie1 ไธŠๆ˜ ๅฐ„ๅˆฐ SID 0x0080ใ€‚RID 0x0100(bus 1, dev 0, fn 0)ๅœจ pcie0 ไธŠๆ˜ ๅฐ„ๅˆฐ SID 0x0001,ๅœจ pcie1 ไธŠๆ˜ ๅฐ„ๅˆฐ SID 0x0081ใ€‚Monaco ไฝฟ็”จๅ…ถ่‡ช่บซ็š„ pcie_smmu ๅฎžไพ‹้ตๅพช็›ธๅŒๆจกๅผ๏ผ›Kodiak ไนŸ้ตๅพช็›ธๅŒๆจกๅผ,ๅชๆ˜ฏไฝฟ็”จ apps_smmu(qcom,sc7280-smmu-500)่€Œไธๆ˜ฏไธ“็”จ็š„ pcie_smmuใ€‚
ๆณจๆ„๏ผšlemans-ride-common.dtsi ๅœจ pcieport0(bus 1, dev 0, fn 0 โ€” RID 0x0100)ไธŠๆŒ‚่ฝฝไบ†ไธ€ไธช WiFi ่Šฏ็‰‡,ๅนถไปŽ lemans.dtsi ็ปงๆ‰ฟ iommu-map ่€Œๆœช่ฆ†็›–,ๅ› ไธบๅŸบ็ก€ๆ–‡ไปถๅทฒ็ปๆถต็›–ไบ†่ฏฅ RIDใ€‚

ไธบไบคๆขๆœบๆ‹“ๆ‰‘ๆ‰ฉๅฑ• iommu-map

ๅฆ‚ๆžœๅœจๆŽงๅˆถๅ™จไธ‹ๆธธๅฎ‰่ฃ…ไบ† PCIe ไบคๆขๆœบ(ไพ‹ๅฆ‚,้€š่ฟ‡ไธคไธชไบคๆขๆœบ็ซฏๅฃๅœจ bus 4 ไธŠๆทปๅŠ  NVMe SSD),่ฏทๅœจๆก็›ฎๅˆ—่กจไธญไธบๆฏไธช RID ๅขžๅŠ ไธ€่กŒ,ๅนถๅฏนๆฏไธ€้กนไฟๆŒ count = 1๏ผš
่ฟ™ๆ€ปๅ…ฑๅชไฝฟ็”จไบ† 5 ไธช SID(0x0000 ๅˆฐ 0x0004),ๅ…จ้ƒจไฝไบŽ pcie0 ็š„ๅญ่Œƒๅ›ดไน‹ๅ†…;่€Œไธๆ˜ฏไฝฟ็”จไธ€ไธช count = 0x500 ็š„ๅ•ไธ€ range ๆก็›ฎ,ๅŽ่€…ๅฏ่ƒฝ่ถ…ๅ‡บ SMMU ๅฎž็Žฐ็š„ SID ่Œƒๅ›ดใ€‚
ๆณจๆ„๏ผšๅˆ†้…็ป™ๆฏไธช RID ็š„ SID ๅ€ผไธๅฟ…ๆ˜ฏ่ฟž็ปญ็š„,ไนŸไธๅฟ…ๆŒ‰ RID ้กบๅบๆŽ’ๅˆ—ใ€‚ๅฎƒไปฌๅช้œ€ๅœจ่ฏฅๆŽงๅˆถๅ™จ็š„ iommu-map ๅ†…ๅ”ฏไธ€,ๅนถไธ”ไฝไบŽ SMMU ๅฎž็Žฐ็š„ SID ่Œƒๅ›ดๅ†…ใ€‚

่ฏŠๆ–ญ็ผบๅคฑ็š„ iommu-map ๆก็›ฎ

ๅฝ“่ฎพๅค‡็š„ RID ๆฒกๆœ‰ๅŒน้…็š„ iommu-map ๆก็›ฎๆ—ถ,ๅ†…ๆ ธๆ—ฅๅฟ—ไผš่ฎฐๅฝ•็ฑปไผผๅฆ‚ไธ‹็š„้”™่ฏฏ:
  1. ไปŽๆ—ฅๅฟ—ไธญ่ฏปๅ– RIDใ€‚ๅœจๆญค็คบไพ‹ไธญ,RID ไธบ 0x0281ใ€‚
  2. ๅฐ† RID ่งฃ็ ไธบๆ€ป็บฟใ€่ฎพๅค‡ๅ’ŒๅŠŸ่ƒฝใ€‚
    ไธŽๅŒไธ€ๆ—ฅๅฟ—่กŒไธญ็š„ lspci ๅœฐๅ€ไบคๅ‰ๆ ธๅฏน(0001:02:10.1 โ†’ bus 2, device 0x10, function 1)ใ€‚ๅญ—ๆฎตไธ€่‡ด,็กฎ่ฎค RID ่งฃ็ ๆญฃ็กฎใ€‚
  3. ไธบ่ฏฅ่ฎพๅค‡้€‰ๆ‹ฉไธ€ไธช็ฉบ้—ฒ SIDใ€‚ๆŸฅ็œ‹็Žฐๆœ‰็š„ iommu-map ๆก็›ฎ,้€‰ไธ€ไธชๅฐšๆœช่ขซๆญคๆŽงๅˆถๅ™จๆ˜ ๅฐ„ไธญๅ…ถไป–ๆก็›ฎไฝฟ็”จใ€ๅนถไธ”ๅœจ SMMU ๅฎž็Žฐ็š„ SID ่Œƒๅ›ดๅ†…็š„ SIDใ€‚
  4. ไฝฟ็”จ count = 1 ๆทปๅŠ ๆก็›ฎใ€‚
    ๅฆ‚ๆžœ fn0 ๅ’Œ fn1 ่ฟž็ปญไธ”้ƒฝ่ฟ˜ๆฒกๆœ‰ SID,ๅฏไปฅ็”จไธ€ไธช count = 2 ็š„ๆก็›ฎๅŒๆ—ถ่ฆ†็›–ไธค่€…:<0x0280 &apps_smmu 0x1403 0x2> ไผšๅฐ† RID 0x0280 ๆ˜ ๅฐ„ๅˆฐ SID 0x1403,ๅฐ† RID 0x0281 ๆ˜ ๅฐ„ๅˆฐ SID 0x1404ใ€‚
  5. ้‡ๆ–ฐๆž„ๅปบ DTBใ€ๅˆทๅ†™ๅนถ้‡ๅฏ,็„ถๅŽ็กฎ่ฎคไฟฎๅคๆ•ˆๆžœใ€‚
    ้”™่ฏฏ่กŒๅฟ…้กปไธๅ†ๅ‡บ็Žฐใ€‚
ๆณจๆ„๏ผšๆ— ่ฎบๆ˜ฏๅฆๅญ˜ๅœจ iommu-map ๆก็›ฎ,lspci ้ƒฝไผšๆ˜พ็คบ่ฎพๅค‡,ๅ› ไธบ lspci ็›ดๆŽฅ่ฏปๅ– PCI ้…็ฝฎ็ฉบ้—ด,ไธๅ— IOMMU ๆ˜ ๅฐ„ๅฝฑๅ“ใ€‚่ฏทไฝฟ็”จ dmesg,่€Œไธๆ˜ฏ lspci,ๆฅ็กฎ่ฎค็ผบๅคฑ็š„ๆก็›ฎๅทฒ่ขซไฟฎๅคใ€‚
ๆœ‰ๅ…ณๅ†…ๆ ธ RID ๅˆฐ SID ็š„่ฝฌๆข,่ฏทๅ‚้˜… drivers/of/base.c: of_map_id()ใ€‚

PCIe ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบ็คบไพ‹

ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบๅฎšไน‰ device-id ่กจๅ’Œ pci_driver ็ป“ๆž„๏ผŒๅนถๅ‘ PCIe ๆก†ๆžถๆณจๅ†Œใ€‚ไปฅไธ‹ๆ˜ฏไธ€ไบ› PCIe ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบ็คบไพ‹๏ผŒไพ›ๅ‚่€ƒใ€‚
  • ็”จไบŽไฟๅญ˜ๅฎขๆˆท็ซฏ็‰นๅฎš็งๆœ‰ๆ•ฐๆฎ็š„ๆ•ฐๆฎ็ป“ๆž„็คบไพ‹ใ€‚
  • ้ฉฑๅŠจ็จ‹ๅบ็คบไพ‹๏ผšๆ‚จๅฏไปฅๆ นๆฎ้ฉฑๅŠจ็จ‹ๅบ็‰นๅฎš็š„ๆ•ฐๆฎ็ป“ๆž„ๆไพ›ๆ•ฐๆฎใ€‚
  • ๅธฆๆœ‰้ฉฑๅŠจ็จ‹ๅบ็‰นๅฎšๆ•ฐๆฎ็š„่ฎพๅค‡ ID ่กจ็คบไพ‹ใ€‚ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบไฝฟ็”จ 0x306 ่ฎพๅค‡ ID ่ฟ›่กŒๆณจๅ†Œใ€‚
ๆณจๆ„๏ผšMODULE_DEVICE_TABLE(pci, sample_pci_id_table); ๆ˜ฏๅผบๅˆถๆ€ง็š„ใ€‚
  • ๅธฆๆœ‰ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบๅ็งฐใ€pci-id ่กจๅ’Œๅ›ž่ฐƒ็š„ pci_driver ๆ•ฐๆฎ็ป“ๆž„็คบไพ‹ใ€‚ๅœจๅ‘ PCI ๆก†ๆžถๆณจๅ†Œๆ—ถไผšไผ ้€’ๆŒ‡ๅ‘ๆญค็ป“ๆž„็š„ๆŒ‡้’ˆใ€‚
  • ่ฆๅ‘ PCI ๅ›บไปถๆณจๅ†Œ๏ผŒ่ฏทไปŽ module_init() ไธญ่ฐƒ็”จ pci_register_driver(&sample_pci_driver)ใ€‚

PCIe ๅฏ็”จ๏ผˆbringup๏ผ‰

ๆœ‰ๅ…ณ PCIe ๅฏ็”จ็š„ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… PCIe-related configurations ๅ’Œ QPS615 switch supportใ€‚

PCIe ๅŠŸ่€—ไผ˜ๅŒ–

PCIe ๅฎšไน‰ไบ†ไธค็ง็ฑปๅž‹็š„็”ตๆบ็ฎก็†ๆ–นๆณ•ใ€‚
  • ็”ตๆบ็ฎก็†่ฝฏไปถ๏ผŒ็”จไบŽ็กฎๅฎšๆฏไธช่ฎพๅค‡็š„็”ตๆบ็ฎก็†่ƒฝๅŠ›ๅนถๅ•็‹ฌ็ฎก็†ๆฏไธช่ฎพๅค‡
  • ๆ— ้œ€่ฝฏไปถๅนฒ้ข„็š„็ณป็ปŸ๏ผŒไพ‹ๅฆ‚ๆดปๅŠจ็Šถๆ€็”ตๆบ็ฎก็†๏ผˆASPM๏ผ‰
ๅœจ้“พ่ทฏไธŠๆฒกๆœ‰ๆ•ฐๆฎๅŒ…ไผ ่พ“็š„ๆ—ถ้—ดๆฎตๅ†…๏ผŒ่ฎพๅค‡ไผšๅฐ†้“พ่ทฏ็ฝฎไบŽ็œ็”ต็Šถๆ€ใ€‚

PCIe L0 ้“พ่ทฏ็Šถๆ€

PCIe ็”ตๆบ็ฎก็†ๅฎšไน‰ไบ†ไปฅไธ‹ L0 ้“พ่ทฏ็Šถๆ€๏ผš
  • L0๏ผšๆดปๅŠจ็Šถๆ€๏ผŒๆ‰€ๆœ‰ PCIe ไบ‹ๅŠกๅ’Œๅ…ถไป–ๆ“ไฝœๅ‡ๅทฒๅฏ็”จ
  • L0s๏ผšๅ…ทๆœ‰ไฝŽๆขๅคๅปถ่ฟŸ็š„ ASPM ็Šถๆ€๏ผˆ่Š‚่ƒฝๅพ…ๆœบ็Šถๆ€๏ผ‰

PCIe ่ฎพๅค‡็Šถๆ€

PCIe ็”ตๆบ็ฎก็†ๅฎšไน‰ไบ†ไปฅไธ‹่ฎพๅค‡็Šถๆ€๏ผš
  • D0๏ผˆๅผบๅˆถ๏ผ‰๏ผš่ฎพๅค‡ๅค„ไบŽๅฎŒๅ…จๅผ€ๅฏ็Šถๆ€๏ผŒๅ…ถไธญๆœ‰ไธคไธชๅญ็Šถๆ€
    • D0uninitialized๏ผš่ฎพๅค‡ๅคไฝๅŽ๏ผŒๅŠŸ่ƒฝๅค„ไบŽ D0uninitialized ็Šถๆ€๏ผŒ็ญ‰ๅพ…่ขซๆžšไธพๅ’Œ้…็ฝฎใ€‚
    • D0active
      • ๆžšไธพๅ’Œ้…็ฝฎ่ฟ‡็จ‹ๅฎŒๆˆๅŽ๏ผŒๅŠŸ่ƒฝๅค„ไบŽ D0active ็Šถๆ€ใ€‚
      • ๅฝ“็ณป็ปŸ่ฝฏไปถๅฏ็”จไธ€ไธชๆˆ–ๅคšไธช๏ผˆไปปๆ„็ป„ๅˆ๏ผ‰ๅŠŸ่ƒฝๅ‚ๆ•ฐ๏ผˆไพ‹ๅฆ‚ๅ†…ๅญ˜็ฉบ้—ดไฝฟ่ƒฝใ€I/O ็ฉบ้—ดไฝฟ่ƒฝๆˆ– BME ไฝ๏ผ‰ๆ—ถ๏ผŒๅŠŸ่ƒฝ่ฟ›ๅ…ฅ D0active ็Šถๆ€ใ€‚
  • D1๏ผˆๅฏ้€‰๏ผ‰๏ผšๆต…็ก็œ ็Šถๆ€
    • ้™ค PME ๆถˆๆฏๅค–๏ผŒๅŠŸ่ƒฝไธ่ƒฝๅ‘่ตท TLP
    • ้™ค้…็ฝฎไบ‹ๅŠกๅค–๏ผŒๅŠŸ่ƒฝไธ่ƒฝไฝœไธบไบ‹ๅŠก็š„็›ฎๆ ‡ใ€‚
    • ๅŠŸ่ƒฝ้€š่ฟ‡ๅฏน PM ๆŽงๅˆถๅ’Œ็Šถๆ€ๅฏ„ๅญ˜ๅ™จ่ฟ›่กŒ็ผ–็จ‹ๆฅๅ‘ๅ‡บ่ฟ›ๅ…ฅ D1 ็Šถๆ€็š„่ฝฏไปถๅ‘ฝไปคใ€‚
  • D2๏ผˆๅฏ้€‰๏ผ‰๏ผšๆทฑ็ก็œ ็Šถๆ€
    • ้™ค PME ๆถˆๆฏๅค–๏ผŒๅŠŸ่ƒฝไธ่ƒฝๅ‘่ตท TLP
    • ้™ค้…็ฝฎไบ‹ๅŠกๅค–๏ผŒๅŠŸ่ƒฝไธ่ƒฝไฝœไธบไบ‹ๅŠก็š„็›ฎๆ ‡ใ€‚
    • ๅŠŸ่ƒฝ้€š่ฟ‡ๅฏน PM ๆŽงๅˆถๅ’Œ็Šถๆ€ๅฏ„ๅญ˜ๅ™จ่ฟ›่กŒ็ผ–็จ‹ๆฅๅ‘ๅ‡บ่ฟ›ๅ…ฅ D2 ็Šถๆ€็š„่ฝฏไปถๅ‘ฝไปคใ€‚
  • D3๏ผˆๅผบๅˆถ๏ผ‰๏ผš่ฎพๅค‡ๅค„ไบŽๆœ€ไฝŽๅŠŸ่€—็Šถๆ€๏ผŒๅŠŸ่ƒฝๅฟ…้กปๆ”ฏๆŒไธค็ง D3 ็Šถๆ€
  • D3hot
    • ้™ค PME ๆถˆๆฏๅค–๏ผŒๅŠŸ่ƒฝไธ่ƒฝๅ‘่ตท TLPใ€‚
    • ้™ค้…็ฝฎไบ‹ๅŠกๅค–๏ผŒๅŠŸ่ƒฝไธ่ƒฝไฝœไธบไบ‹ๅŠก็š„็›ฎๆ ‡ใ€‚
    • ๅŠŸ่ƒฝ้€š่ฟ‡ๅฏน็”ตๆบ็Šถๆ€ๅญ—ๆฎต่ฟ›่กŒ็ผ–็จ‹ๆฅๅ‘ๅ‡บ่ฟ›ๅ…ฅ D3hot ็Šถๆ€็š„่ฝฏไปถๅ‘ฝไปคใ€‚
  • D3cold๏ผš่ฎพๅค‡่ฟ›ๅ…ฅ D3cold ็Šถๆ€ๅนถๆ–ญ็”ต๏ผ›็”ตๆบๆขๅคๅŽ๏ผŒ่ฎพๅค‡่ฟ›ๅ…ฅ D0uninitialized ็Šถๆ€ใ€‚

PCIe ้ชŒ่ฏ

ๆœ‰ๅ…ณ PCIe ้ชŒ่ฏ็š„ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… PCIe-related configurations ๅ’Œ QPS615 switch supportใ€‚

่ฐƒ่ฏ• PCIe ้—ฎ้ข˜

lspci ๅ’Œ setpci ๅ‘ฝไปคๆ˜ฏ Linux ๅ‘่กŒ็‰ˆ็š„ๅŽŸ็”Ÿๅ‘ฝไปคใ€‚่ฟ™ไบ›ๅ‘ฝไปคๅ…ทๆœ‰ไธๅŒ็บงๅˆซ็š„่พ“ๅ‡บใ€‚่ฟ™ไบ›ๅ‘ฝไปค่ฟ˜ๅฏไปฅๆไพ›ๅฏน PCI ๆ€ป็บฟไธŠ่ฎญ็ปƒ็š„ไธๅŒ็ป„ไปถ็š„่ƒฝๅŠ›ๅ’Œ็Šถๆ€็š„ๆœ‰็”จ็š„ๅณๆ—ถๅฟซ็…งใ€‚่ฟ™ไบ›่ƒฝๅŠ›ๅคงๅคšๆ˜ฏ PCIe ๅŸบ็ก€่ง„่Œƒๆ‰€่ฆๆฑ‚็š„้…็ฝฎ็ฉบ้—ดๅฏ„ๅญ˜ๅ™จ็š„ๅๆ˜ ใ€‚ๆœ‰ๅ…ณๆ›ดๅคš่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… https://pcisig.com/specificationsใ€‚่ฆๆŸฅ็œ‹ไฝฟ็”จ่ฏดๆ˜Ž๏ผŒ่ฏท่ฟ่กŒไปฅไธ‹ๅ‘ฝไปคใ€‚
ไปฅไธ‹ๅŠŸ่ƒฝๅฏนๆŽ’ๆŸฅ PCIe ้—ฎ้ข˜ๅพˆๆœ‰็”จใ€‚
  • ๆ˜พ็คบ่ฎพๅค‡ไฟกๆฏ
    ๅฐ†ๆ˜พ็คบไปฅไธ‹ๆถˆๆฏใ€‚
  • ๆ˜พ็คบ่ฎพๅค‡ๆŽงๅˆถๅฏ„ๅญ˜ๅ™จไธญ็š„ PCIe ่ฎพๅค‡ๅ’Œไพ›ๅบ”ๅ•† IDใ€‚
    ๅฐ†ๆ˜พ็คบไปฅไธ‹ๆถˆๆฏใ€‚
ๆœ‰ๅ…ณ PCIe ่ฐƒ่ฏ•็š„ๆ›ดๅคšไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… https://www.kernel.org/doc/html/v4.17/driver-api/pci.htmlใ€‚

PCIe ็คบไพ‹

ๆœ‰ๅ…ณไธŠๆธธ่ฎพๅค‡ๆ ‘ๅ‚่€ƒ็š„ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…ไปฅไธ‹ๆ–‡ไปถใ€‚ ๆœ‰ๅ…ณ Qualcomm Linux ็กฌไปถ SoC ็š„่ฎพๅค‡ๆ ‘่Š‚็‚นไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…ไปฅไธ‹ DTSI ๆ–‡ไปถใ€‚

ๅฎขๆˆท็ซฏไธŽ PCI ้ฉฑๅŠจ็จ‹ๅบๆ“ไฝœๆต็จ‹็คบไพ‹

ไธ‹ๅ›พๅฑ•็คบไบ† PCIe ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบไธบๅฎขๆˆท็ซฏ้…็ฝฎ PCIe ้ฉฑๅŠจ็จ‹ๅบๆ‰€้ตๅพช็š„้กบๅบใ€‚
PCIe ่ฎพๅค‡่ฟžๆŽฅ้“พ่ทฏ

ๅฎขๆˆท็ซฏไธŽ PCI ้ฉฑๅŠจ็จ‹ๅบ้ซ˜ๅฑ‚่ฐƒ็”จๆต็จ‹็คบไพ‹

ไธ‹ๅ›พๅฑ•็คบไบ† PCIe ๅฎขๆˆท็ซฏ้ฉฑๅŠจ็จ‹ๅบไธŽ PCIe ้ฉฑๅŠจ็จ‹ๅบไน‹้—ด็š„้ซ˜ๅฑ‚่ฐƒ็”จๆต็จ‹ๅ’Œ่ฐƒ็”จ่ฏฆ็ป†ไฟกๆฏใ€‚
PCIe ่ฎพๅค‡่ฟžๆŽฅ้“พ่ทฏ