โลโก้อินเทล

สถาปัตยกรรมไดรเวอร์อุปกรณ์ Intel OPAE FPGA Linux

Intel-OPAE-FPGA-Linux-อุปกรณ์-ไดรเวอร์-สถาปัตยกรรม-ผลิตภัณฑ์

สถาปัตยกรรมไดรเวอร์อุปกรณ์ OPAE Intel FPGA Linux

ไดรเวอร์ OPAE Intel FPGA มอบอินเทอร์เฟซสำหรับแอปพลิเคชันพื้นที่ผู้ใช้เพื่อกำหนดค่า แจกแจง เปิด และเข้าถึงตัวเร่งความเร็ว FPGA บนแพลตฟอร์มที่ติดตั้งโซลูชัน Intel FPGA และเปิดใช้งานฟังก์ชันการจัดการระดับระบบ เช่น การกำหนดค่า FPGA ใหม่ การจัดการพลังงาน และการจำลองเสมือน

สถาปัตยกรรมฮาร์ดแวร์

จากจุดของ OS viewฮาร์ดแวร์ FPGA จะปรากฏเป็นอุปกรณ์ PCIe ทั่วไป หน่วยความจำอุปกรณ์ FPGA ได้รับการจัดระเบียบโดยใช้โครงสร้างข้อมูลที่กำหนดไว้ล่วงหน้า (รายการคุณสมบัติอุปกรณ์) คุณสมบัติที่รองรับโดยอุปกรณ์ FPGA จะถูกเปิดเผยผ่านโครงสร้างข้อมูลเหล่านี้ ดังภาพประกอบด้านล่างในรูปต่อไปนี้:

อุปกรณ์ FPGA PCIe

intel-OPAE-FPGA-Linux-อุปกรณ์-ไดร์เวอร์-สถาปัตยกรรม-fig- (1)

ไดรเวอร์รองรับ PCIe SR-IOV เพื่อสร้างฟังก์ชันเสมือน (VF) ซึ่งสามารถใช้เพื่อกำหนดตัวเร่งความเร็วแต่ละตัวให้กับเครื่องเสมือน

อินเทล คอร์ปอเรชั่น สงวนลิขสิทธิ์. Intel, โลโก้ Intel และเครื่องหมาย Intel อื่นๆ เป็นเครื่องหมายการค้าของ Intel Corporation หรือบริษัทในเครือ Intel รับประกันประสิทธิภาพของผลิตภัณฑ์ FPGA และเซมิคอนดักเตอร์ตามข้อมูลจำเพาะปัจจุบันตามการรับประกันมาตรฐานของ Intel แต่ขอสงวนสิทธิ์ในการเปลี่ยนแปลงผลิตภัณฑ์และบริการใดๆ ได้ตลอดเวลาโดยไม่ต้องแจ้งให้ทราบล่วงหน้า Intel ไม่มีส่วนรับผิดชอบหรือความรับผิดที่เกิดขึ้นจากแอปพลิเคชันหรือการใช้ข้อมูล ผลิตภัณฑ์ หรือบริการใด ๆ ที่อธิบายไว้ในที่นี้ ยกเว้นตามที่ Intel ตกลงเป็นลายลักษณ์อักษรโดยชัดแจ้ง ขอแนะนำให้ลูกค้าของ Intel ได้รับข้อมูลจำเพาะของอุปกรณ์เวอร์ชันล่าสุดก่อนที่จะใช้ข้อมูลที่เผยแพร่ใด ๆ และก่อนที่จะทำการสั่งซื้อผลิตภัณฑ์หรือบริการ

ชื่อและยี่ห้ออื่น ๆ อาจถูกอ้างสิทธิ์โดยถือเป็นทรัพย์สินของผู้อื่น

อุปกรณ์ FPGA PCIe เสมือนจริง

intel-OPAE-FPGA-Linux-อุปกรณ์-ไดร์เวอร์-สถาปัตยกรรม-fig- (2)

กลไกการจัดการ FPGA (FME)
FPGA Management Engine ดำเนินการจัดการพลังงานและความร้อน การรายงานข้อผิดพลาด การกำหนดค่าใหม่ การรายงานประสิทธิภาพ และฟังก์ชันโครงสร้างพื้นฐานอื่นๆ FPGA แต่ละตัวมี FME หนึ่งตัว ซึ่งเข้าถึงได้ผ่าน Physical Function (PF) เสมอ แอปพลิเคชันพื้นที่ผู้ใช้สามารถรับสิทธิ์การเข้าถึง FME แบบเอกสิทธิ์เฉพาะบุคคลโดยใช้ open() และเผยแพร่โดยใช้ close() ในฐานะผู้ใช้ที่มีสิทธิ์ (root)

ท่าเรือ
พอร์ตแสดงถึงอินเทอร์เฟซระหว่างแฟบริค FPGA แบบคงที่ (“FPGA Interface Manager (FIM)”) และขอบเขตที่กำหนดค่าใหม่ได้บางส่วนซึ่งมีฟังก์ชัน Accelerator (AF) พอร์ตควบคุมการสื่อสารจากซอฟต์แวร์ไปยังตัวเร่งความเร็วและเปิดเผยคุณสมบัติต่างๆ เช่น การรีเซ็ตและการแก้ไขข้อบกพร่อง อุปกรณ์ PCIe อาจมีหลายพอร์ต และแต่ละพอร์ตสามารถเปิดเผยผ่าน VF ได้โดยการกำหนดโดยใช้ FPGA_FME_PORT_ASSIGN ioctl บนอุปกรณ์ FME

หน่วยฟังก์ชันเร่งความเร็ว (AF)

  • หน่วยฟังก์ชันเร่งความเร็ว (AF) เชื่อมต่อกับพอร์ตและเปิดเผยขอบเขต 256K MMIO เพื่อใช้สำหรับการลงทะเบียนการควบคุมเฉพาะตัวเร่งความเร็ว
  • แอปพลิเคชันพื้นที่ผู้ใช้สามารถรับสิทธิ์การเข้าถึง AFU ที่แนบมากับพอร์ตโดยเฉพาะได้โดยใช้ open() บนอุปกรณ์พอร์ต และปล่อยโดยใช้ close()
  • แอปพลิเคชันพื้นที่ผู้ใช้ยังสามารถภูมิภาค MMIO ของตัวเร่งความเร็ว mmap()

การกำหนดค่าใหม่บางส่วน
ตามที่กล่าวไว้ข้างต้น ตัวเร่งความเร็วสามารถกำหนดค่าใหม่ได้ด้วยการกำหนดค่าใหม่บางส่วนของฟังก์ชันตัวเร่งความเร็ว (AF) file- ต้องสร้างฟังก์ชันเร่งความเร็ว (AF) สำหรับ FIM ที่แน่นอนและภูมิภาคคงที่เป้าหมาย (พอร์ต) ของ FPGA มิฉะนั้นการดำเนินการกำหนดค่าใหม่จะล้มเหลวและอาจทำให้ระบบไม่เสถียร ความเข้ากันได้นี้สามารถตรวจสอบได้โดยการเปรียบเทียบ ID อินเทอร์เฟซที่ระบุไว้ในส่วนหัว AF กับ ID อินเทอร์เฟซที่เปิดเผยโดย FME ผ่าน sysfs โดยปกติการตรวจสอบนี้จะดำเนินการโดยพื้นที่ผู้ใช้ก่อนที่จะเรียกการกำหนดค่า IOCTL ใหม่

บันทึก:
ในปัจจุบัน โปรแกรมซอฟต์แวร์ใดๆ ที่เข้าถึง FPGA รวมถึงโปรแกรมที่ทำงานในโฮสต์เสมือนจริง จะต้องถูกปิดก่อนที่จะพยายามกำหนดค่าใหม่บางส่วน ขั้นตอนจะเป็น:

  1. ยกเลิกการโหลดไดรเวอร์จากแขก
  2. ถอดปลั๊ก VF ออกจากแขก
  3. ปิดการใช้งาน SR-IOV
  4. ดำเนินการกำหนดค่าใหม่บางส่วน
  5. เปิดใช้งาน SR-IOV
  6. เสียบ VF เข้ากับแขก
  7. โหลดไดรเวอร์ในแขก

การจำลองเสมือน FPGA
หากต้องการเปิดใช้งานการเข้าถึงตัวเร่งความเร็วจากแอปพลิเคชันที่ทำงานใน VM จะต้องกำหนดพอร์ตของ AFU ที่เกี่ยวข้องให้กับ VF โดยใช้ขั้นตอนต่อไปนี้:

  1. PF เป็นเจ้าของพอร์ต AFU ทั้งหมดตามค่าเริ่มต้น พอร์ตใดๆ ที่ต้องกำหนดใหม่ให้กับ VF จะต้องถูกปล่อยจาก PF ก่อนผ่าน FPGA_FME_PORT_RELEASE ioctl บนอุปกรณ์ FME
  2. เมื่อพอร์ต N ถูกปล่อยออกจาก PF แล้ว คุณสามารถใช้คำสั่งด้านล่างเพื่อเปิดใช้งาน SRIOV และ VF ได้ VF แต่ละตัวมีพอร์ต AFU เพียงพอร์ตเดียวเท่านั้น เสียงสะท้อน N > PCI_DEVICE_PATH/sriov_numvfs
  3. ส่งผ่าน VF ไปยัง VM
  4. AFU ภายใต้ VF สามารถเข้าถึงได้จากแอปพลิเคชันใน VM (โดยใช้ไดรเวอร์เดียวกันภายใน VF)

บันทึก:
ไม่สามารถกำหนด FME ให้กับ VF ได้ ดังนั้นฟังก์ชัน PR และการจัดการอื่นๆ จึงมีให้ใช้งานได้ผ่าน PF เท่านั้น

องค์กรไดร์เวอร์

ไดร์เวอร์อุปกรณ์โมดูล PCIe

องค์กรไดร์เวอร์

intel-OPAE-FPGA-Linux-อุปกรณ์-ไดร์เวอร์-สถาปัตยกรรม-fig- (3)

อุปกรณ์ FPGA ปรากฏเป็นอุปกรณ์ PCIe ทั่วไป ดังนั้น ไดรเวอร์อุปกรณ์ FPGA PCIe (intel-FPGA-PCI.ko) จะถูกโหลดก่อนเสมอเมื่อตรวจพบ FPGA PCIe PF หรือ VF ไดรเวอร์นี้มีบทบาทด้านโครงสร้างพื้นฐานในสถาปัตยกรรมของไดรเวอร์ มัน:

  • สร้างอุปกรณ์คอนเทนเนอร์ FPGA เป็นพาเรนต์ของอุปกรณ์ฟีเจอร์
  • เดินผ่านรายการคุณสมบัติอุปกรณ์ ซึ่งใช้งานในหน่วยความจำ BAR ของอุปกรณ์ PCIe เพื่อค้นหาอุปกรณ์ฟีเจอร์และคุณสมบัติย่อย และสร้างอุปกรณ์แพลตฟอร์มสำหรับอุปกรณ์เหล่านั้นภายใต้อุปกรณ์คอนเทนเนอร์
  • รองรับ SR-IOV
  • แนะนำโครงสร้างพื้นฐานของอุปกรณ์ฟีเจอร์ ซึ่งจะสรุปการดำเนินการสำหรับฟีเจอร์ย่อยและเปิดเผยฟังก์ชันทั่วไปให้กับไดรเวอร์อุปกรณ์ฟีเจอร์

ฟังก์ชั่นไดร์เวอร์อุปกรณ์โมดูล PCIe

  • ประกอบด้วยการค้นพบ PCIe การแจงนับอุปกรณ์ และการค้นพบคุณลักษณะ
  • สร้างไดเร็กทอรี sysfs สำหรับอุปกรณ์หลัก, FPGA Management Engine (FME) และพอร์ต
  • สร้างอินสแตนซ์ไดรเวอร์แพลตฟอร์ม ส่งผลให้เคอร์เนล Linux โหลดไดรเวอร์โมดูลแพลตฟอร์มตามลำดับ

ไดรเวอร์อุปกรณ์โมดูลแพลตฟอร์ม FME

  • การจัดการพลังงานและความร้อน การรายงานข้อผิดพลาด การรายงานประสิทธิภาพ และฟังก์ชันโครงสร้างพื้นฐานอื่นๆ คุณสามารถเข้าถึงฟังก์ชันเหล่านี้ได้ผ่านทางอินเทอร์เฟซ sysfs ที่ไดรเวอร์ FME เปิดเผย
  • การกำหนดค่าใหม่บางส่วน ไดรเวอร์ FME ลงทะเบียน FPGA Manager ในระหว่างการเริ่มต้นคุณสมบัติย่อย PR เมื่อได้รับ FPGA_FME_PORT_PR ioctl จากคุณ มันจะเรียกใช้ฟังก์ชันอินเทอร์เฟซทั่วไปจาก FPGA Manager เพื่อกำหนดค่าบิตสตรีมใหม่บางส่วนไปยังพอร์ตที่กำหนดให้เสร็จสมบูรณ์
  • การจัดการพอร์ตสำหรับการจำลองเสมือน ไดรเวอร์ FME แนะนำสอง ioctls, FPGA_FME_PORT_RELEASE ซึ่งจะเผยแพร่พอร์ตที่กำหนดจาก PF; และ FPGA_FME_PORT_ASSIGN ซึ่งกำหนดพอร์ตกลับให้กับ PF เมื่อพอร์ตถูกปลดออกจาก PF แล้ว จะสามารถกำหนดให้กับ VF ผ่านทางอินเทอร์เฟซ SR-IOV ที่ไดรเวอร์ PCIe จัดให้ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ “FPGA Virtualization”

ฟังก์ชั่นไดรเวอร์อุปกรณ์โมดูลแพลตฟอร์ม FME

  • สร้างโหนดอุปกรณ์อักขระ FME
  • สร้าง FME sysfs files และนำ FME sysfs ไปใช้ file ตัวเข้าถึง
  • ใช้งานไดรเวอร์ย่อยคุณสมบัติส่วนตัวของ FME
  • ไดรเวอร์ย่อยคุณสมบัติส่วนตัวของ FME:
    • ส่วนหัว FME
    • การจัดการความร้อน
    • การจัดการพลังงาน
    • ข้อผิดพลาดระดับโลก
    • การกำหนดค่าใหม่บางส่วน
    • ประสิทธิภาพระดับโลก

ไดรเวอร์อุปกรณ์โมดูลแพลตฟอร์มพอร์ต
เช่นเดียวกับไดรเวอร์ FME ไดรเวอร์พอร์ต FPGA (และ AFU) (intel-fpga-afu. ko) จะถูกตรวจสอบเมื่ออุปกรณ์แพลตฟอร์มพอร์ตถูกสร้างขึ้น หน้าที่หลักของโมดูลนี้คือการจัดหาอินเทอร์เฟซสำหรับแอปพลิเคชันพื้นที่ผู้ใช้เพื่อเข้าถึงตัวเร่งความเร็วแต่ละตัว รวมถึงการควบคุมการรีเซ็ตพื้นฐานบนพอร์ต การส่งออกภูมิภาค AFU MMIO บริการการแมปบัฟเฟอร์ DMA การแจ้งเตือน UMsg(1) และฟังก์ชันการแก้ไขข้อบกพร่องระยะไกล ( ดูด้านบน).

UMsg รองรับผ่าน Acceleration Stack สำหรับโปรเซสเซอร์ Intel Xeon® พร้อม Integrated FPGA เท่านั้น

ฟังก์ชั่นไดร์เวอร์อุปกรณ์โมดูลแพลตฟอร์มพอร์ต

  • สร้างโหนดอุปกรณ์อักขระพอร์ต
  • สร้างพอร์ต sysfs files และใช้พอร์ต sysfs file ตัวเข้าถึง
  • ใช้ไดรเวอร์ย่อยคุณลักษณะส่วนตัวของพอร์ต
  • ไดร์เวอร์ย่อยคุณสมบัติส่วนตัวของพอร์ต:
    • หัวพอร์ต
    • อาฟยู
    • พอร์ตผิดพลาด
    • UMsg(2)
    • แตะสัญญาณ

แอปพลิเคชันการแจงนับอุปกรณ์ FPGA
ส่วนนี้จะแนะนำวิธีที่แอปพลิเคชันระบุอุปกรณ์ FPGA จากลำดับชั้น sysfs ภายใต้ /sys/class/fpga ในอดีตampด้านล่างนี้ มีอุปกรณ์ Intel FPGA สองเครื่องได้รับการติดตั้งในโฮสต์ อุปกรณ์ FPGA แต่ละตัวมีหนึ่ง FME และสองพอร์ต (AFU) สำหรับอุปกรณ์ FPGA แต่ละตัว ไดเร็กทอรีอุปกรณ์จะถูกสร้างขึ้นภายใต้ /sys/class/fpga:

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

แต่ละโหนดมีหนึ่ง FME และสองพอร์ต (AFU) เป็นอุปกรณ์ลูก:
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-fme.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.2
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.3

โดยทั่วไป อินเทอร์เฟซ FME/Port sysfs มีชื่อดังต่อไปนี้:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

โดยที่ฉันกำหนดหมายเลขอุปกรณ์คอนเทนเนอร์ทั้งหมดติดต่อกัน j กำหนดหมายเลข FME ติดต่อกันและ k กำหนดหมายเลขพอร์ตทั้งหมดติดต่อกัน

โหนดอุปกรณ์ที่ใช้สำหรับ ioctl() และ mmap() สามารถอ้างอิงผ่าน:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

การแจงนับไดรเวอร์ PCIe
ส่วนนี้ให้มากกว่าview ของการไหลของโค้ดสำหรับการแจงนับอุปกรณ์ที่ดำเนินการโดย intel-fpga-pci.ko โครงสร้างข้อมูลหลักและฟังก์ชันจะถูกเน้น ควรติดตามส่วนนี้เมื่อใด viewโดยใช้ซอร์สโค้ดที่ให้มา (pcie.c)

โครงสร้างข้อมูลแจงนับ

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
โครงสร้างคงที่ idr fpga_ids [FPGA_ID_MAX];
โครงสร้าง fpga_chardev_info {
อักขระ const * ชื่อ;
dev_t การพัฒนา;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
คลาสโครงสร้างแบบคงที่ *fpga_class;
โครงสร้างแบบคงที่ pci_device_id cci_pcie_id_tbl [] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_DCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_DCP),},
{0,}
};
โครงสร้างแบบคงที่ pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
โครงสร้าง cci_drvdata {
อุปกรณ์ int_id;
อุปกรณ์โครงสร้าง *fme_dev;
โครงสร้างล็อค mutex;
โครงสร้าง list_head port_dev_list;
int release_port_num;
struct list_head ภูมิภาค;
};
โครงสร้าง build_feature_devs_info {
โครงสร้าง pci_dev *pdev;
โมฆะ __iomem *ioaddr;
โมฆะ __iomem *ioend;
int current_bar;
โมฆะ __iomem *pfme_hdr;
อุปกรณ์โครงสร้าง * parent_dev;
struct platform_device *feature_dev;
};

การไหลแจงนับ

  • ccidrv_init()
    • เริ่มต้น fpga_ids โดยใช้ idr_init()
    • เริ่มต้น fpga_chrdevs[i].devt โดยใช้ alloc_chrdev_region()
    • เริ่มต้น fpga_class โดยใช้ class_create()
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • เปิดใช้งานอุปกรณ์ PCI ขอการเข้าถึงภูมิภาค ตั้งค่าโหมดต้นแบบ PCI และกำหนดค่า DMA
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • จัดสรร struct build_feature_devs_info เริ่มต้นมัน
      .parent_dev ถูกตั้งค่าเป็นไดเร็กทอรี sysfs หลัก (intel-fpga-dev.id) ที่มีไดเร็กทอรี FME และ Port sysfs
  • parse_feature_list()
    • เดินรายการคุณสมบัติอุปกรณ์ BAR0 เพื่อค้นหา FME, พอร์ต และคุณสมบัติส่วนตัว
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • เมื่อพบ FME:
  • build_info_create_dev()
    • จัดสรรอุปกรณ์แพลตฟอร์มสำหรับ FME โดยจัดเก็บไว้ใน build_feature_devs_info.feature_dev
    • Feature_dev.id เริ่มต้นเป็นผลลัพธ์ของ idr_alloc(fpga_ids[FME_ID]
    • Feature_dev.parent ถูกตั้งค่าเป็น build_feature_devs_info.parent_dev
    • จัดสรรอาร์เรย์ของทรัพยากรโครงสร้างใน Feature_dev.resource
  • จัดสรร struct Feature_platform_data เริ่มต้น และจัดเก็บพอยน์เตอร์ใน Feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • เตรียมใช้งานคุณลักษณะ_dev.resource[FME_FEATURE_ID_HEADER]
    • คุณลักษณะ_แพลตฟอร์ม_ข้อมูล_เพิ่ม()
    • เริ่มต้น คุณลักษณะ_platform_data.features[FME_FEATURE_ID_HEADER] ทุกอย่าง ยกเว้น .fops
  • parse_feature() parse_feature_afus() parse_feature_port()
    • เมื่อพบพอร์ต:
  • build_info_create_dev()
    • จัดสรรอุปกรณ์แพลตฟอร์มสำหรับพอร์ต โดยจัดเก็บไว้ใน build_feature_devs_info.feature_dev
    • Feature_dev.id ได้รับการเตรียมใช้งานเป็นผลลัพธ์ของ idr_alloc(fpga_ids[PORT_ID],
    • Feature_dev.parent ถูกตั้งค่าเป็น build_feature_devs_info.parent_dev
    • จัดสรรอาร์เรย์ของทรัพยากร struct ใน Feature_dev.resource
    • จัดสรร struct Feature_platform_data เริ่มต้น และจัดเก็บพอยน์เตอร์ใน Feature_dev.dev.platform_data
  • build_info_commit_dev()
    • เพิ่ม struct คุณลักษณะ_platform_data.node สำหรับพอร์ตไปยังรายการพอร์ตใน struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • เริ่มต้น คุณลักษณะ_dev.resource[PORT_FEATURE_ID_HEADER]
  • คุณลักษณะ_แพลตฟอร์ม_ข้อมูล_เพิ่ม()
    • เริ่มต้น คุณลักษณะ_platform_data.features[PORT_FEATURE_ID_HEADER] ทุกอย่าง ยกเว้น .fops
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • เมื่อพบ AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • เริ่มต้น คุณลักษณะ_dev.resource[PORT_FEATURE_ID_UAFU]
  • คุณลักษณะ_แพลตฟอร์ม_ข้อมูล_เพิ่ม()
    • เริ่มต้น คุณลักษณะ_platform_data.features[PORT_FEATURE_ID_UAFU] ทุกอย่าง ยกเว้น .fops
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • เมื่อพบคุณสมบัติส่วนตัวของ FME:
  • create_feature_instance() build_info_add_sub_feature()
    • เริ่มต้น คุณลักษณะ_dev.resource[id]
  • คุณลักษณะ_แพลตฟอร์ม_ข้อมูล_เพิ่ม()
    • เริ่มต้น features_platform_data.features[id] ทุกอย่างยกเว้น .fops
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • เมื่อพบคุณสมบัติส่วนตัวของพอร์ต: * create_feature_instance() build_info_add_sub_feature() * เตรียมใช้งาน Feature_dev.resource[id] * คุณลักษณะ_platform_data_add() เริ่มต้น คุณลักษณะ_platform_data.features[id] ทุกอย่างยกเว้น .fops
  • parse_ports_from_fme()
    • หากโหลดไดรเวอร์บน Physical Function (PF) แล้ว:
  • เรียกใช้โฟลว์ parse_feature_list() บนแต่ละพอร์ตที่อธิบายไว้ในส่วนหัว FME
  • ใช้ BAR ที่กล่าวถึงในแต่ละรายการพอร์ตในส่วนหัว

การเริ่มต้นอุปกรณ์แพลตฟอร์ม FME
ส่วนนี้ให้มากกว่าview ของโฟลว์โค้ดสำหรับการเริ่มต้นอุปกรณ์ FME ดำเนินการโดย intel-fpga-fme.ko โครงสร้างข้อมูลหลักและฟังก์ชันจะถูกเน้นไว้ ควรติดตามส่วนนี้เมื่อใด viewโดยใช้ซอร์สโค้ดที่แนบมาด้วย (fme-main.c)

โครงสร้างข้อมูลอุปกรณ์แพลตฟอร์ม FME

โครงสร้าง features_ops {
int (*init)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ);
int (*uinit)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ);
ยาว (*ioctl)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ,
int cmd ที่ไม่ได้ลงนาม, arg ยาวที่ไม่ได้ลงนาม);
int (*ทดสอบ)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ);
};
คุณสมบัติโครงสร้าง {
อักขระ const * ชื่อ;
int resources_index;
โมฆะ __iomem *ioaddr;
struct คุณลักษณะ_ops *ops;
};
โครงสร้าง features_platform_data {
โหนด struct list_head;
โครงสร้างล็อค mutex;
dev_status แบบยาวที่ไม่ได้ลงนาม;
โครงสร้าง cdev cdev;
struct platform_device *dev;
intdisable_count ที่ไม่ได้ลงนาม;
เป็นโมฆะ * ส่วนตัว;
จำนวนเต็ม;
int (*config_port)(struct platform_device *, u32, บูล);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
เป็นโมฆะ *, int (*ตรงกัน)(struct platform_device *, เป็นโมฆะ *)); โครงสร้าง
คุณสมบัติเด่น[0];
};
โครงสร้าง perf_object {
รหัส int;
const struct คุณลักษณะ_กลุ่ม **attr_groups;
อุปกรณ์โครงสร้าง *fme_dev;
โหนด struct list_head;
struct list_head ลูก ๆ ;
โครงสร้าง kobject kobj;
};
โครงสร้าง fpga_fme {
u8 พอร์ต_id;
u64 pr_err;
อุปกรณ์โครงสร้าง *dev_err;
โครงสร้าง perf_object *perf_dev;
struct คุณลักษณะ_แพลตฟอร์ม_data *pdata;
};

ขั้นตอนการเริ่มต้นอุปกรณ์แพลตฟอร์ม FME

ขั้นตอนการเริ่มต้น FMEintel-OPAE-FPGA-Linux-อุปกรณ์-ไดร์เวอร์-สถาปัตยกรรม-fig- (4)

  • fme_probe() fme_dev_init()
    • เริ่มต้น struct fpga_fme และจัดเก็บไว้ในฟิลด์ Feature_platform_data.private
  • fme_probe() fpga_dev_feature_init() คุณลักษณะ_instance_init()
    • บันทึก struct Feature_ops ลงใน Feature_platform_data.features สำหรับแต่ละฟีเจอร์ที่มีการเติมข้อมูล
    • เรียกใช้ฟังก์ชันทดสอบ (ถ้ามี) จากโครงสร้าง
    • เรียกใช้ฟังก์ชัน init จาก struct
  • fme_probe() fpga_register_dev_ops()
    • สร้างโหนดอุปกรณ์อักขระ FME โดยลงทะเบียนโครงสร้าง file_การดำเนินงาน

การเริ่มต้นอุปกรณ์แพลตฟอร์มพอร์ต
ส่วนนี้ให้มากกว่าview ของการไหลของโค้ดสำหรับการเริ่มต้นอุปกรณ์พอร์ตที่ดำเนินการโดย intel-fpga-afu.ko โครงสร้างข้อมูลหลักและฟังก์ชันจะถูกเน้น ควรติดตามส่วนนี้เมื่อใด viewโดยใช้ซอร์สโค้ดที่แนบมาด้วย (afu.c)

โครงสร้างข้อมูลอุปกรณ์แพลตฟอร์มพอร์ต

โครงสร้าง features_ops {
int (*init)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ);
int (*uinit)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ);
ยาว (*ioctl)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ,
int cmd ที่ไม่ได้ลงนาม, arg ยาวที่ไม่ได้ลงนาม);
int (*ทดสอบ)(struct platform_device *pdev, คุณสมบัติ struct *คุณสมบัติ);
};
คุณสมบัติโครงสร้าง {
อักขระ const * ชื่อ;
int resources_index;
โมฆะ __iomem *ioaddr;
struct คุณลักษณะ_ops *ops;
};
โครงสร้าง features_platform_data {
โหนด struct list_head;
โครงสร้างล็อค mutex;
dev_status แบบยาวที่ไม่ได้ลงนาม;
โครงสร้าง cdev cdev;
struct platform_device *dev;
intdisable_count ที่ไม่ได้ลงนาม;
เป็นโมฆะ * ส่วนตัว;
จำนวนเต็ม;
int (*config_port)(struct platform_device *, u32, บูล);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
เป็นโมฆะ *, int (*ตรงกัน)(struct platform_device *, เป็นโมฆะ *));
คุณสมบัติคุณสมบัติโครงสร้าง[0];
};
struct fpga_afu_region {
ดัชนี u32;
ธง u32;
ขนาด U64;
u64 ชดเชย;
u64 ฟิส;
โหนด struct list_head;
};
struct fpga_afu_dma_region {
u64 user_addr;
ความยาว u64;
u64 ไอโอวา;
หน้าโครงสร้าง **หน้า;
โหนด struct rb_node;
บูล in_use;
};
โครงสร้าง fpga_afu {
u64 ภูมิภาค_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head ภูมิภาค;
โครงสร้าง rb_root dma_regions;
struct คุณลักษณะ_แพลตฟอร์ม_data *pdata;
};

ขั้นตอนการเริ่มต้นอุปกรณ์แพลตฟอร์มพอร์ต

ขั้นตอนการเริ่มต้นพอร์ตintel-OPAE-FPGA-Linux-อุปกรณ์-ไดร์เวอร์-สถาปัตยกรรม-fig- (5)

  • afu_probe() afu_dev_init()
    • เริ่มต้น struct fpga_afu และจัดเก็บไว้ในฟิลด์ Feature_platform_data.private
  • afu_probe() fpga_dev_feature_init() Feature_instance_init()
    • บันทึก struct Feature_ops ลงใน Feature_platform_data.features สำหรับแต่ละฟีเจอร์ที่มีการเติมข้อมูล
    • เรียกใช้ฟังก์ชันทดสอบ (ถ้ามี) จากโครงสร้าง
    • เรียกใช้ฟังก์ชัน init จาก struct
  • afu_probe() fpga_register_dev_ops()
    • สร้างโหนดอุปกรณ์อักขระพอร์ต โดยลงทะเบียนโครงสร้าง file_การดำเนินงาน

FME IOCTL
IOCTL ที่ถูกเรียกใช้แบบเปิด file descriptor สำหรับ /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—ส่งคืนเวอร์ชันปัจจุบันเป็นจำนวนเต็ม โดยเริ่มจาก 0

FPGA_CHECK_EXTENSION—ยังไม่รองรับในขณะนี้

FPGA_FME_PORT_RELEASE—arg เป็นตัวชี้ไปยัง:

struct fpga_fme_port_release {
__u32 argsz; // ใน: sizeof (struct fpga_fme_port_release)
__u32 ธง; // ใน: ต้องเป็น 0
__u32 พอร์ต_id; // in: port ID (จาก 0) เพื่อปล่อย
};

FPGA_FME_PORT_ASSIGN—arg เป็นตัวชี้ไปยัง:

struct fpga_fme_port_มอบหมาย {
__u32 argsz; // ใน: sizeof (struct fpga_fme_port_assign)
__u32 ธง; // ใน: ต้องเป็น 0
__u32 พอร์ต_id; // in: port ID (จาก 0) ที่จะกำหนด (คงเป็น.
เปิดตัวก่อนหน้านี้โดย FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg เป็นตัวชี้ไปยัง:

struct fpga_fme_port_pr {
__u32 argsz; // ใน: sizeof (struct fpga_fme_port_pr)
__u32 ธง; // ใน: ต้องเป็น 0
__u32 พอร์ต_id; // ใน: รหัสพอร์ต (จาก 0)
__u32 ขนาดบัฟเฟอร์; // in: ขนาดของบัฟเฟอร์ bitstream เป็นไบต์ ต้องเป็น 4 ไบต์
เรียงชิดกัน
__u64 บัฟเฟอร์_ที่อยู่; // ใน: ที่อยู่กระบวนการของบัฟเฟอร์ bitstream
__สถานะ u64; // ออก: สถานะข้อผิดพลาด (บิตมาสก์)
};

พอร์ต IOCTL
IOCTL ที่ถูกเรียกใช้แบบเปิด file descriptor สำหรับ /dev/intel-fpga-port.k FPGA_GET_API_VERSION—คืนค่าเวอร์ชันปัจจุบันเป็นจำนวนเต็ม โดยเริ่มจาก 0 FPGA_CHECK_EXTENSION—ยังไม่รองรับในปัจจุบัน

FPGA_PORT_GET_INFO—arg เป็นตัวชี้ไปยัง:

โครงสร้าง fpga_port_info {
__u32 argsz; // ใน: sizeof (struct fpga_port_info)
__u32 ธง; // ออก: ส่งกลับ 0
__u32 num_ภูมิภาค; // ออก: จำนวนภูมิภาค MMIO, 2 (1 สำหรับ AFU และ 1 สำหรับ
เอสทีพี)
__u32 num_umsgs; // out: จำนวน UMsg ที่ฮาร์ดแวร์รองรับ
};

FPGA_PORT_GET_REGION_INFO—arg เป็นตัวชี้ไปยัง:

struct fpga_port_region_info {
__u32 argsz; // ใน: sizeof (struct fpga_port_region_info)
__u32 ธง; // ออก: (บิตมาสก์) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__ดัชนี u32; // ใน: FPGA_PORT_INDEX_UAFU หรือ FPGA_PORT_INDEX_STP
__u32 ช่องว่างภายใน; // ใน: ต้องเป็น 0
__ขนาด u64; // ออก: ขนาดของขอบเขต MMIO เป็นไบต์
__u64 ชดเชย; // ออก: ชดเชยขอบเขต MMIO จากจุดเริ่มต้นของอุปกรณ์ fd
};

FPGA_PORT_DMA_MAP—arg เป็นตัวชี้ไปยัง:
struct fpga_port_dma_map {
__u32 argsz; // ใน: sizeof (struct fpga_port_dma_map)
__u32 ธง; // ใน: ต้องเป็น 0 __u64 user_addr; // ใน: ประมวลผลเสมือน
ที่อยู่. จะต้องจัดหน้า
__u64 ความยาว; // in: ความยาวของการแมปเป็นไบต์ จะต้องมีหลายหน้า
ขนาด.
__u64 ไอโอวา; // ออก: ที่อยู่เสมือน IO };

FPGA_PORT_DMA_UNMAP—arg เป็นตัวชี้ไปยัง:
struct fpga_port_dma_unmap {
__u32 argsz; // ใน: sizeof (struct fpga_port_dma_unmap)
__u32 ธง; // ใน: ต้องเป็น 0
__u64 ไอโอวา; // ใน: ที่อยู่เสมือน IO ที่ส่งคืนโดยที่อยู่ก่อนหน้า
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—หาเรื่องต้องเป็นโมฆะ
  • FPGA_PORT_UMSG_ENABLE—หาเรื่องต้องเป็นโมฆะ
  • FPGA_PORT_UMSG_DISABLE—args ต้องเป็น NULL

FPGA_PORT_UMSG_SET_MODE—arg เป็นตัวชี้ไปยัง:

โครงสร้าง fpga_port_umsg_cfg {
__u32 argsz; // ใน: sizeof (struct fpga_port_umsg_cfg)
__u32 ธง; // ใน: ต้องเป็น 0
__u32 คำใบ้_บิตแมป; // ใน: บิตแมปโหมดคำใบ้ UMsg บ่งบอกว่า UMsg คืออะไร
เปิดใช้งานแล้ว
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • ต้องปิดการใช้งาน UMsg ก่อนที่จะออก ioctl นี้
  • ฟิลด์ iova จะต้องเป็นบัฟเฟอร์ที่มีขนาดใหญ่เพียงพอสำหรับ UMsg ทั้งหมด (num_umsgs * PAGE_SIZE)
    • บัฟเฟอร์ถูกทำเครื่องหมายว่า "ใช้งานอยู่" โดยการจัดการบัฟเฟอร์ของไดรเวอร์
    • หาก iova เป็น NULL ภูมิภาคใดๆ ก่อนหน้านี้จะถูกยกเลิกการทำเครื่องหมายว่า "ใช้งานอยู่"
  • arg เป็นตัวชี้ไปยัง:
    โครงสร้าง fpga_port_umsg_base_addr {
    • u32 argsz; // ใน: sizeof (struct fpga_port_umsg_base_addr)
    • ธง u32; // ใน: ต้องเป็น 0
    • u64 ไอโอวา; // ใน: ที่อยู่เสมือน IO จาก FPGA_PORT_DMA_MAP -

บันทึก:

  • หากต้องการล้างข้อผิดพลาดเกี่ยวกับพอร์ต คุณต้องเขียนบิตมาสก์ที่แน่นอนของข้อผิดพลาดปัจจุบัน เช่นampเลอ ข้อผิดพลาดของแมว > ชัดเจน
  • UMsg รองรับผ่าน Acceleration Stack สำหรับโปรเซสเซอร์ Intel Xeon พร้อม Integrated FPGA เท่านั้น

ซิสเอฟเอส Files

FME ส่วนหัว sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
port_num fme_header.capability.num_ports ทศนิยม อ่านอย่างเดียว
ขนาดแคช fme_header.capability.cache_size ทศนิยม อ่านอย่างเดียว
เวอร์ชัน fme_header.capability.fabric_verid ทศนิยม อ่านอย่างเดียว
socket_id fme_header.capability.socket_id ทศนิยม อ่านอย่างเดียว
bitstream_id fme_header.bitstream_id ฐานสิบหก uint64_t อ่านอย่างเดียว
bitstream_metadata fme_header.bitstream_md ฐานสิบหก uint64_t อ่านอย่างเดียว

ระบบการจัดการความร้อน FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
เกณฑ์1 Thermal.threshold.tmp_thshold1 ทศนิยม ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
เกณฑ์2 Thermal.threshold.tmp_thshold2 ทศนิยม ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
เกณฑ์_การเดินทาง Thermal.threshold.therm_trip_thshold ทศนิยม อ่านอย่างเดียว
ถึงเกณฑ์1_แล้ว Thermal.threshold.thshold1_status ทศนิยม อ่านอย่างเดียว
ถึงเกณฑ์2_แล้ว Thermal.threshold.thshold2_status ทศนิยม อ่านอย่างเดียว
เกณฑ์1_นโยบาย ความร้อน Threshold.thshold_policy ทศนิยม ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
อุณหภูมิ Thermal.rdsensor_fm1.fpga_temp ทศนิยม อ่านอย่างเดียว

ระบบการจัดการพลังงาน FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
บริโภค power.status.pwr_consumed ฐานสิบหก uint64_t อ่านอย่างเดียว
เกณฑ์1 power.threshold.threshold1 ฐานสิบหก uint64_t ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
เกณฑ์2 power.threshold.threshold2 ฐานสิบหก uint64_t ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
เกณฑ์1_สถานะ power.threshold.threshold1_status ทศนิยมที่ไม่ได้ลงนาม อ่านอย่างเดียว
เกณฑ์2_สถานะ power.threshold.threshold2_status ทศนิยมที่ไม่ได้ลงนาม อ่านอย่างเดียว
อาร์ทีแอล power.status.fpga_latency_report ทศนิยมที่ไม่ได้ลงนาม อ่านอย่างเดียว

ข้อผิดพลาดทั่วโลกของ FME sysfs.dll files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
pcie0_errors gerror.pcie0_err ฐานสิบหก uint64_t อ่านเขียน
pcie1_errors gerror.pcie1_err ฐานสิบหก uint64_t อ่านเขียน
ฉีด_ข้อผิดพลาด gerror.ras_error_inj ฐานสิบหก uint64_t อ่านเขียน

intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
ข้อผิดพลาด gerror.fme_err ฐานสิบหก uint64_t อ่านอย่างเดียว
first_error gerror.fme_first_err.err_reg_status ฐานสิบหก uint64_t อ่านอย่างเดียว
ถัดไป_ข้อผิดพลาด gerror.fme_next_err.err_reg_status ฐานสิบหก uint64_t อ่านอย่างเดียว
ชัดเจน ล้างข้อผิดพลาด first_error, next_error uint64_t ต่างๆ เขียนเท่านั้น

บันทึก:
หากต้องการล้างข้อผิดพลาด FME คุณต้องเขียนบิตมาสก์ที่แน่นอนของข้อผิดพลาดปัจจุบัน เช่นampข้อผิดพลาดของ le cat > ชัดเจน

FME การกำหนดค่าใหม่บางส่วน sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
อินเทอร์เฟซ_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l ฐานสิบหก 16 ไบต์ อ่านอย่างเดียว

ระบบ FME Global Performance files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/นาฬิกา

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
นาฬิกา gperf.clk.afu_interf_clock ฐานสิบหก uint64_t อ่านอย่างเดียว

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (ใช้ไม่ได้กับ Acceleration Stack สำหรับ Intel Xeon CPU ที่มี FPGA)

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
แช่แข็ง gperf.ch_ctl.แช่แข็ง ทศนิยม อ่านเขียน
read_hit gperf.CACHE_RD_HIT ฐานสิบหก uint64_t อ่านอย่างเดียว
read_miss gperf.CACHE_RD_MISS ฐานสิบหก uint64_t อ่านอย่างเดียว
write_hit gperf.CACHE_WR_HIT ฐานสิบหก uint64_t อ่านอย่างเดียว
write_miss gperf.CACHE_WR_MISS ฐานสิบหก uint64_t อ่านอย่างเดียว
ถือ_คำขอ gperf.CACHE_HOLD_REQ ฐานสิบหก uint64_t อ่านอย่างเดียว
tx_req_stall gperf.CACHE_TX_REQ_STALL ฐานสิบหก uint64_t อ่านอย่างเดียว
ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
rx_req_stall gperf.CACHE_RX_REQ_STALL ฐานสิบหก uint64_t อ่านอย่างเดียว
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN ฐานสิบหก uint64_t อ่านอย่างเดียว
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN ฐานสิบหก uint64_t อ่านอย่างเดียว

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (ใช้ไม่ได้กับ Acceleration Stack สำหรับ Intel Xeon CPU ที่มี FPGA)

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
แช่แข็ง gperf.vtd_ctl.ตรึง ทศนิยม ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (ใช้ไม่ได้กับ Acceleration Stack สำหรับ Intel Xeon CPU ที่มี FPGA)

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS ฐานสิบหก uint64_t อ่านอย่างเดียว
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS ฐานสิบหก uint64_t อ่านอย่างเดียว
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT ฐานสิบหก uint64_t อ่านอย่างเดียว
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT ฐานสิบหก uint64_t อ่านอย่างเดียว

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
เปิดใช้งาน gperf.fab_ctl.(เปิดใช้งาน) ทศนิยม ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
แช่แข็ง gperf.fab_ctl.ค้าง ทศนิยม ผู้ใช้: รูทแบบอ่านอย่างเดียว: อ่าน-เขียน
pcie0_read gperf.FAB_PCIE0_RD ฐานสิบหก uint64_t อ่านอย่างเดียว
pcie0_write gperf.FAB_PCIE0_WR ฐานสิบหก uint64_t อ่านอย่างเดียว
pcie1_read gperf.FAB_PCIE1_RD ฐานสิบหก uint64_t อ่านอย่างเดียว
pcie1_write gperf.FAB_PCIE1_WR ฐานสิบหก uint64_t อ่านอย่างเดียว
upi_read gperf.FAB_UPI_RD ฐานสิบหก uint64_t อ่านอย่างเดียว
upi_write gperf.FAB_UPI_WR ฐานสิบหก uint64_t อ่านอย่างเดียว

intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
pcie0_read gperf.FAB_PCIE0_RD ฐานสิบหก uint64_t อ่านอย่างเดียว
pcie0_write gperf.FAB_PCIE0_WR ฐานสิบหก uint64_t อ่านอย่างเดียว
pcie1_read gperf.FAB_PCIE1_RD ฐานสิบหก uint64_t อ่านอย่างเดียว
pcie1_write gperf.FAB_PCIE1_WR ฐานสิบหก uint64_t อ่านอย่างเดียว
upi_read gperf.FAB_UPI_RD ฐานสิบหก uint64_t อ่านอย่างเดียว
upi_write gperf.FAB_UPI_WR ฐานสิบหก uint64_t อ่านอย่างเดียว

ส่วนหัวของพอร์ต sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
id port_header.capability.port_number ทศนิยม อ่านอย่างเดียว
ลิตร port_header.control.latency_tolerance ทศนิยม อ่านอย่างเดียว

พอร์ต AFU ส่วนหัว sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
afu_id afu_header.guid ฐานสิบหก 16 ไบต์ อ่านอย่างเดียว

พอร์ตผิดพลาด sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

ซิสเอฟเอส file สนาม mmio พิมพ์ เข้าถึง
ข้อผิดพลาด pererror.port_error ฐานสิบหก uint64_t อ่านอย่างเดียว
first_error pererror.port_first_error ฐานสิบหก uint64_t อ่านอย่างเดียว
first_malformed_req peror.malreq ฐานสิบหก 16 ไบต์ อ่านอย่างเดียว
ชัดเจน perror.(ข้อผิดพลาดทั้งหมด) uint64_t ต่างๆ เขียนเท่านั้น

บันทึก:
หากต้องการล้างข้อผิดพลาดเกี่ยวกับพอร์ต คุณต้องเขียนบิตมาสก์ที่แน่นอนของข้อผิดพลาดปัจจุบัน เช่นampข้อผิดพลาดของ le cat > ชัดเจน

ประวัติการแก้ไข

เวอร์ชันเอกสาร การเปลี่ยนแปลง
2017.10.02 การเปิดตัวครั้งแรก

คู่มือสถาปัตยกรรมไดรเวอร์อุปกรณ์ OPAE Intel FPGA Linux

เอกสาร / แหล่งข้อมูล

สถาปัตยกรรมไดรเวอร์อุปกรณ์ Intel OPAE FPGA Linux [พีดีเอฟ] คู่มือการใช้งาน
สถาปัตยกรรมไดรเวอร์อุปกรณ์ OPAE FPGA Linux, OPAE FPGA, สถาปัตยกรรมไดรเวอร์อุปกรณ์ Linux, สถาปัตยกรรมไดรเวอร์, สถาปัตยกรรม

อ้างอิง

ฝากความคิดเห็น

ที่อยู่อีเมลของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องกรอกข้อมูลมีเครื่องหมาย *