logo intel

intel OPAE FPGA Kiến trúc trình điều khiển thiết bị Linux

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-product

Kiến trúc trình điều khiển thiết bị Intel FPGA Linux của OPAE

Trình điều khiển FPGA Intel của OPAE cung cấp các giao diện cho các ứng dụng không gian người dùng để định cấu hình, liệt kê, mở và truy cập các bộ tăng tốc FPGA trên các nền tảng được trang bị các giải pháp FPGA của Intel và cho phép các chức năng quản lý cấp hệ thống như cấu hình lại FPGA, quản lý nguồn và ảo hóa.

Kiến trúc phần cứng

Từ quan điểm của hệ điều hành view, phần cứng FPGA xuất hiện dưới dạng thiết bị PCIe thông thường. Bộ nhớ thiết bị FPGA được tổ chức bằng cấu trúc dữ liệu được xác định trước (Danh sách tính năng thiết bị). Các tính năng được hỗ trợ bởi thiết bị FPGA được thể hiện thông qua các cấu trúc dữ liệu này, như được minh họa bên dưới trong hình sau:

Thiết bị FPGA PCIe

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (1)

Trình điều khiển hỗ trợ PCIe SR-IOV để tạo Hàm ảo (VF) có thể được sử dụng để gán các bộ tăng tốc riêng lẻ cho các máy ảo.

Tập đoàn Intel. Đã đăng ký Bản quyền. Intel, logo Intel và các nhãn hiệu khác của Intel là thương hiệu của Tập đoàn Intel hoặc các công ty con của Tập đoàn. Intel đảm bảo hiệu suất của các sản phẩm FPGA và chất bán dẫn của mình theo các thông số kỹ thuật hiện hành theo bảo hành tiêu chuẩn của Intel nhưng bảo lưu quyền thay đổi bất kỳ sản phẩm và dịch vụ nào vào bất kỳ lúc nào mà không cần thông báo. Intel không chịu trách nhiệm hoặc trách nhiệm pháp lý phát sinh từ ứng dụng hoặc việc sử dụng bất kỳ thông tin, sản phẩm hoặc dịch vụ nào được mô tả ở đây trừ khi được Intel đồng ý rõ ràng bằng văn bản. Khách hàng của Intel nên lấy phiên bản mới nhất của thông số kỹ thuật thiết bị trước khi dựa vào bất kỳ thông tin được công bố nào và trước khi đặt hàng sản phẩm hoặc dịch vụ.

Những tên và thương hiệu khác có thể được coi là tài sản của người khác.

Thiết bị FPGA PCIe ảo hóa

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (2)

Công cụ quản lý FPGA (FME)
Công cụ quản lý FPGA thực hiện quản lý năng lượng và nhiệt, báo cáo lỗi, cấu hình lại, báo cáo hiệu suất và các chức năng cơ sở hạ tầng khác. Mỗi FPGA có một FME luôn được truy cập thông qua Chức năng vật lý (PF). Các ứng dụng không gian người dùng có thể có quyền truy cập độc quyền vào FME bằng cách sử dụng open() và giải phóng nó bằng cách sử dụng close() với tư cách là người dùng đặc quyền (root).

Cảng
Cổng đại diện cho giao diện giữa kết cấu FPGA tĩnh (“Trình quản lý giao diện FPGA (FIM)”) và vùng có thể cấu hình lại một phần có chứa Chức năng bộ tăng tốc (AF). Cổng kiểm soát giao tiếp từ phần mềm đến máy gia tốc và hiển thị các tính năng như đặt lại và gỡ lỗi. Một thiết bị PCIe có thể có một số Cổng và mỗi Cổng có thể được hiển thị thông qua VF bằng cách chỉ định nó bằng cách sử dụng ioctl FPGA_FME_PORT_ASSIGN trên thiết bị FME.

Đơn vị Chức năng Gia tốc (AF)

  • Thiết bị Chức năng Máy gia tốc (AF) được gắn vào Cổng và hiển thị vùng 256K MMIO được sử dụng cho các thanh ghi điều khiển dành riêng cho máy gia tốc.
  • Các ứng dụng không gian người dùng có thể giành quyền truy cập độc quyền vào một AFU được gắn vào một Cổng bằng cách sử dụng open() trên thiết bị Cổng và giải phóng nó bằng cách sử dụng close().
  • Các ứng dụng không gian người dùng cũng có thể sử dụng các vùng MMIO tăng tốc mmap().

Cấu hình lại một phần
Như đã đề cập ở trên, máy gia tốc có thể được cấu hình lại thông qua cấu hình lại một phần Chức năng Máy gia tốc (AF) file. Chức năng Máy gia tốc (AF) phải được tạo cho FIM chính xác và vùng tĩnh được nhắm mục tiêu (Cổng) của FPGA; nếu không, thao tác cấu hình lại sẽ không thành công và có thể gây mất ổn định hệ thống. Có thể kiểm tra khả năng tương thích này bằng cách so sánh ID giao diện được ghi trong tiêu đề AF với ID giao diện được FME hiển thị thông qua sysfs. Việc kiểm tra này thường được thực hiện bởi không gian người dùng trước khi gọi IOCTL cấu hình lại.

Ghi chú:
Hiện tại, bất kỳ chương trình phần mềm nào truy cập FPGA, kể cả những chương trình đang chạy trong máy chủ ảo hóa, phải được đóng lại trước khi thử cấu hình lại một phần. Các bước sẽ là:

  1. Bốc lái cho khách
  2. Rút phích cắm VF khỏi khách
  3. Tắt SR-IOV
  4. Thực hiện cấu hình lại một phần
  5. Bật SR-IOV
  6. Cắm VF cho khách
  7. Tải trình điều khiển trong khách

Ảo hóa FPGA
Để cho phép truy cập trình tăng tốc từ các ứng dụng đang chạy trong VM, cổng của AFU tương ứng cần được gán cho VF bằng các bước sau:

  1. PF sở hữu tất cả các cổng AFU theo mặc định. Bất kỳ cổng nào cần được gán lại cho VF trước tiên phải được giải phóng khỏi PF thông qua ioctl FPGA_FME_PORT_RELEASE trên thiết bị FME.
  2. Khi N cổng được giải phóng khỏi PF, lệnh bên dưới có thể được sử dụng để kích hoạt SRIOV và VF. Mỗi VF chỉ sở hữu một cổng với AFU. tiếng vang N > PCI_DEVICE_PATH/sriov_numvfs
  3. Chuyển qua các VF sang VM.
  4. Có thể truy cập AFU trong VF từ các ứng dụng trong VM (sử dụng cùng một trình điều khiển bên trong VF).

Ghi chú:
Không thể gán FME cho VF, do đó PR và các chức năng quản lý khác chỉ khả dụng thông qua PF.

Tổ chức lái xe

Trình điều khiển thiết bị mô-đun PCIe

Tổ chức lái xe

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (3)

Các thiết bị FPGA xuất hiện dưới dạng thiết bị PCIe thông thường; do đó, trình điều khiển thiết bị FPGA PCIe (intel-FPGA-PCI.ko) luôn được tải đầu tiên sau khi phát hiện thấy FPGA PCIe PF hoặc VF. Trình điều khiển này đóng vai trò cơ sở hạ tầng trong kiến ​​trúc trình điều khiển. Nó:

  • Tạo một thiết bị chứa FPGA với tư cách là cha mẹ của các thiết bị tính năng.
  • Đi qua Danh sách Tính năng Thiết bị, được triển khai trong bộ nhớ BAR của thiết bị PCIe, để khám phá các thiết bị tính năng và các tính năng phụ của chúng, đồng thời tạo các thiết bị nền tảng cho chúng trong thiết bị chứa.
  • Hỗ trợ SR-IOV.
  • Giới thiệu cơ sở hạ tầng thiết bị tính năng, tóm tắt các hoạt động cho các tính năng phụ và hiển thị các chức năng phổ biến cho trình điều khiển thiết bị tính năng.

Chức năng trình điều khiển thiết bị mô-đun PCIe

  • Chứa khám phá PCIe, liệt kê thiết bị và khám phá tính năng.
  • Tạo các thư mục sysfs cho thiết bị mẹ, Công cụ quản lý FPGA (FME) và Cổng.
  • Tạo các phiên bản trình điều khiển nền tảng, khiến nhân Linux tải trình điều khiển mô-đun nền tảng tương ứng của chúng.

Trình điều khiển thiết bị mô-đun nền tảng FME

  • Quản lý nguồn và nhiệt, báo cáo lỗi, báo cáo hiệu suất và các chức năng cơ sở hạ tầng khác. Bạn có thể truy cập các chức năng này thông qua giao diện sysfs do trình điều khiển FME hiển thị.
  • Cấu hình lại một phần. Trình điều khiển FME đăng ký Trình quản lý FPGA trong quá trình khởi tạo tính năng phụ PR; một khi nó nhận được ioctl FPGA_FME_PORT_PR từ bạn, nó sẽ gọi chức năng giao diện chung từ Trình quản lý FPGA để hoàn tất cấu hình lại một phần của dòng bit tới Cổng đã cho.
  • Quản lý cổng cho ảo hóa. Trình điều khiển FME giới thiệu hai ioctl, FPGA_FME_PORT_RELEASE, giải phóng Cổng đã cho từ PF; và FPGA_FME_PORT_ASSIGN, nó gán lại Port cho PF. Khi Cổng được giải phóng khỏi PF, nó có thể được gán cho VF thông qua giao diện SR-IOV do trình điều khiển PCIe cung cấp. Để biết thêm thông tin, hãy tham khảo “Ảo hóa FPGA”.

Chức năng trình điều khiển thiết bị mô-đun nền tảng FME

  • Tạo nút thiết bị ký tự FME.
  • Tạo các hệ thống FME files và thực hiện các FME sysfs file người truy cập.
  • Triển khai các trình điều khiển phụ tính năng riêng của FME.
  • Trình điều khiển phụ tính năng riêng của FME:
    • Tiêu đề FME
    • Quản lý nhiệt
    • Quản lý năng lượng
    • Lỗi toàn cầu
    • Cấu hình lại một phần
    • Hiệu suất toàn cầu

Trình điều khiển thiết bị mô-đun nền tảng cổng
Tương tự như trình điều khiển FME, trình điều khiển Cổng FPGA (và AFU) (intel-fpga-afu. ko) được thăm dò sau khi thiết bị nền tảng Cổng được tạo. Chức năng chính của mô-đun này là cung cấp giao diện cho các ứng dụng không gian người dùng truy cập vào các bộ tăng tốc riêng lẻ, bao gồm điều khiển đặt lại cơ bản trên Cổng, xuất vùng AFU MMIO, dịch vụ ánh xạ bộ đệm DMA, thông báo UMsg(1) và các chức năng gỡ lỗi từ xa ( xem ở trên).

UMsg chỉ được hỗ trợ thông qua Ngăn xếp tăng tốc dành cho Bộ xử lý Intel Xeon® với FPGA tích hợp.

Chức năng trình điều khiển thiết bị mô-đun nền tảng cổng

  • Tạo nút thiết bị ký tự cổng.
  • Tạo Port sysfs files và thực hiện Port sysfs file người truy cập.
  • Triển khai các trình điều khiển phụ tính năng riêng của Cổng.
  • Trình điều khiển phụ tính năng riêng của cổng:
    • Tiêu đề cổng
    • AFU
    • Lỗi cổng
    • UMsg(2)
    • Nhấn tín hiệu

Ứng dụng FPGA Device Enumeration
Phần này giới thiệu cách các ứng dụng liệt kê thiết bị FPGA từ hệ thống phân cấp sysfs trong /sys/class/fpga. trong exampbên dưới, hai thiết bị Intel FPGA được cài đặt trong máy chủ. Mỗi thiết bị FPGA có một FME và hai Cổng (AFU). Đối với mỗi thiết bị FPGA, một thư mục thiết bị được tạo trong /sys/class/fpga:

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

Mỗi nút có một FME và hai Cổng (AFU) làm thiết bị con:
/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

Nói chung, các giao diện FME/Port sysfs được đặt tên như sau:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

với việc tôi đánh số liên tục tất cả các thiết bị chứa, j đánh số liên tục các FME và k đánh số liên tục tất cả các Cổng.

Các nút thiết bị được sử dụng cho ioctl() và mmap() có thể được tham chiếu thông qua:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Bảng liệt kê trình điều khiển PCIe
Phần này kết thúcview của dòng mã để liệt kê thiết bị do intel-fpga-pci.ko thực hiện. Các cấu trúc và chức năng dữ liệu chính được đánh dấu. Phần này được theo dõi tốt nhất khi viewnhập mã nguồn đi kèm (pcie.c).

Cấu trúc dữ liệu liệt kê

enum fpga_id_type {
ID CHA MẸ,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
cấu trúc tĩnh idr fpga_ids[FPGA_ID_MAX];
cấu trúc fpga_chardev_info {
const char * tên;
dev_t devt;
};
cấu trúc fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
lớp cấu trúc tĩnh *fpga_class;
cấu trúc tĩnh 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,}
};
cấu trúc tĩnh 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
};
cấu trúc cci_drvdata {
int device_id;
thiết bị cấu trúc *fme_dev;
cấu trúc khóa mutex;
cấu trúc list_head port_dev_list;
int đã phát hành_port_num;
danh sách cấu trúc vùng_đầu;
};
cấu trúc build_feature_devs_info {
cấu trúc pci_dev *pdev;
khoảng trống __iomem *ioaddr;
khoảng trống __iomem *ioend;
int thanh_thanh;
khoảng trống __iomem *pfme_hdr;
thiết bị cấu trúc *parent_dev;
cấu trúc platform_device *feature_dev;
};

Luồng liệt kê

  • ccidrv_init()
    • Khởi tạo fpga_ids bằng idr_init().
    • Khởi tạo fpga_chrdevs[i].devt sử dụng alloc_chrdev_region().
    • Khởi tạo fpga_class sử dụng class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Bật thiết bị PCI, yêu cầu quyền truy cập vào các vùng của thiết bị, đặt chế độ chính PCI và định cấu hình DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Phân bổ một cấu trúc build_feature_devs_info, khởi tạo nó.
      .parent_dev được đặt thành thư mục sysfs chính (intel-fpga-dev.id) chứa các thư mục FME và Port sysfs.
  • phân tích cú pháp_feature_list()
    • Xem Danh sách tính năng thiết bị BAR0 để khám phá FME, Cổng và các tính năng riêng tư của chúng.
  • parse_feature() phân tích cú pháp_feature_afus() phân tích cú pháp_feature_fme()
    • Khi gặp FME:
  • build_info_create_dev()
    • Cấp phát thiết bị nền tảng cho FME, lưu trữ trong build_feature_devs_info.feature_dev.
    • Feature_dev.id được khởi tạo thành kết quả của idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent được đặt thành build_feature_devs_info.parent_dev.
    • Phân bổ một mảng tài nguyên cấu trúc trong feature_dev.resource.
  • Phân bổ một cấu trúc feature_platform_data, khởi tạo nó và lưu trữ một con trỏ trong feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Khởi tạo feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Khởi tạo feature_platform_data.features[FME_FEATURE_ID_HEADER], mọi thứ trừ .fops.
  • parse_feature() phân tích cú pháp_feature_afus() phân tích cú pháp_feature_port()
    • Khi gặp phải một Cổng:
  • build_info_create_dev()
    • Cấp phát thiết bị nền tảng cho Cổng, lưu trữ trong build_feature_devs_info.feature_dev.
    • Feature_dev.id được khởi tạo thành kết quả của idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent được đặt thành build_feature_devs_info.parent_dev.
    • Phân bổ một mảng tài nguyên cấu trúc trong feature_dev.resource.
    • Phân bổ một cấu trúc feature_platform_data, khởi tạo nó và lưu trữ một con trỏ trong feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Thêm cấu trúc feature_platform_data.node cho Cổng vào danh sách Cổng trong cấu trúc cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Khởi tạo feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Khởi tạo feature_platform_data.features[PORT_FEATURE_ID_HEADER], mọi thứ trừ .fops.
  • parse_feature() phân tích cú pháp_feature_afus() phân tích cú pháp_feature_port_uafu()
    • Khi gặp AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Khởi tạo feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Khởi tạo feature_platform_data.features[PORT_FEATURE_ID_UAFU], mọi thứ trừ .fops.
  • phân tích cú pháp_feature() phân tích cú pháp_feature_private() phân tích cú pháp_feature_fme_private()
    • Khi gặp phải tính năng riêng của FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Khởi tạo feature_dev.resource[id].
  • feature_platform_data_add()
    • Khởi tạo feature_platform_data.features[id], mọi thứ trừ .fops.
  • phân tích cú pháp tính năng() phân tích cú pháp_feature_private() phân tích cú pháp_feature_port_private()
  • Khi gặp tính năng riêng của Cổng: * create_feature_instance() build_info_add_sub_feature() * Khởi tạo feature_dev.resource[id]. * Feature_platform_data_add() Khởi tạo Feature_platform_data.features[id], mọi thứ trừ .fops.
  • phân tích cú pháp_ports_from_fme()
    • Nếu trình điều khiển được tải trên Chức năng Vật lý (PF), thì:
  • Chạy luồng parse_feature_list() trên mỗi cổng được mô tả trong tiêu đề FME.
  • Sử dụng BAR được đề cập trong mỗi mục Cổng trong tiêu đề.

Khởi tạo thiết bị nền tảng FME
Phần này kết thúcview của dòng mã khởi tạo thiết bị FME do intel-fpga-fme.ko thực hiện. Các cấu trúc dữ liệu và chức năng chính được đánh dấu cao. Phần này được theo dõi tốt nhất khi viewnhập mã nguồn đi kèm (fme-main.c).

Cấu trúc dữ liệu thiết bị nền tảng FME

cấu trúc feature_ops {
int (*init)(struct platform_device *pdev, tính năng struct *feature);
int (*uinit)(struct platform_device *pdev, tính năng struct *feature);
dài (*ioctl)(struct platform_device *pdev, tính năng struct *feature,
int cmd không dấu, arg dài không dấu);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
tính năng cấu trúc {
const char * tên;
int Resource_index;
khoảng trống __iomem *ioaddr;
cấu trúc feature_ops *ops;
};
cấu trúc feature_platform_data {
cấu trúc nút list_head;
cấu trúc khóa mutex;
dev_status dài không dấu;
cấu trúc cdev cdev;
cấu trúc platform_device *dev;
unsigned int vô hiệu hóa_count;
khoảng trống *riêng tư;
int số;
int (*config_port)(struct platform_device *, u32, bool);
cấu trúc platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); cấu trúc
tính năng tính năng[0];
};
cấu trúc perf_object {
bạn tay;
const cấu trúc thuộc tính_group **attr_groups;
thiết bị cấu trúc *fme_dev;
cấu trúc nút list_head;
cấu trúc list_head con;
cấu trúc kobject kobj;
};
cấu trúc fpga_fme {
cổng u8_id;
u64 pr_err;
thiết bị cấu trúc *dev_err;
cấu trúc perf_object *perf_dev;
cấu trúc feature_platform_data *pdata;
};

Luồng khởi tạo thiết bị nền tảng FME

Luồng khởi tạo FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Khởi tạo một cấu trúc fpga_fme và lưu trữ nó trong trường feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Lưu một feature_ops cấu trúc vào feature_platform_data.features cho từng đối tượng địa lý được điền.
    • Gọi hàm kiểm tra, nếu có, từ cấu trúc.
    • Gọi hàm init từ cấu trúc.
  • fme_probe() fpga_register_dev_ops()
    • Tạo nút thiết bị ký tự FME, đăng ký một cấu trúc file_hoạt động.

Khởi tạo thiết bị nền tảng cổng
Phần này kết thúcview của dòng mã khởi tạo thiết bị cổng do intel-fpga-afu.ko thực hiện. Các cấu trúc và chức năng dữ liệu chính được đánh dấu. Phần này được theo dõi tốt nhất khi viewnhập mã nguồn đi kèm (afu.c).

Cấu trúc dữ liệu thiết bị nền tảng cổng

cấu trúc feature_ops {
int (*init)(struct platform_device *pdev, tính năng struct *feature);
int (*uinit)(struct platform_device *pdev, tính năng struct *feature);
dài (*ioctl)(struct platform_device *pdev, tính năng struct *feature,
int cmd không dấu, arg dài không dấu);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
tính năng cấu trúc {
const char * tên;
int Resource_index;
khoảng trống __iomem *ioaddr;
cấu trúc feature_ops *ops;
};
cấu trúc feature_platform_data {
cấu trúc nút list_head;
cấu trúc khóa mutex;
dev_status dài không dấu;
cấu trúc cdev cdev;
cấu trúc platform_device *dev;
unsigned int vô hiệu hóa_count;
khoảng trống *riêng tư;
int số;
int (*config_port)(struct platform_device *, u32, bool);
cấu trúc platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
tính năng cấu trúc[0];
};
cấu trúc fpga_afu_region {
chỉ số u32;
cờ u32;
cỡ u64;
u64 bù đắp;
u64 lý;
cấu trúc nút list_head;
};
cấu trúc fpga_afu_dma_region {
u64 user_addr;
chiều dài u64;
u64 iova;
trang cấu trúc **trang;
cấu trúc nút rb_node;
bool in_use;
};
cấu trúc fpga_afu {
u64 vùng_cur_offset;
int num_khu vực;
u8 số_umsgs;
danh sách cấu trúc vùng_đầu;
cấu trúc rb_root dma_regions;
cấu trúc feature_platform_data *pdata;
};

Luồng khởi tạo thiết bị nền tảng cổng

Luồng khởi tạo cổngintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Khởi tạo một cấu trúc fpga_afu và lưu trữ nó trong trường feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Lưu một feature_ops cấu trúc vào feature_platform_data.features cho từng đối tượng địa lý được điền.
    • Gọi hàm kiểm tra, nếu có, từ cấu trúc.
    • Gọi hàm init từ cấu trúc.
  • afu_probe() fpga_register_dev_ops()
    • Tạo nút thiết bị ký tự Cổng, đăng ký một cấu trúc file_hoạt động.

FME IOCTL
IOCTL được gọi khi mở file bộ mô tả cho /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—trả về phiên bản hiện tại dưới dạng số nguyên, bắt đầu từ 0.

FPGA_CHECK_EXTENSION—hiện không được hỗ trợ.

FPGA_FME_PORT_RELEASE—arg là một con trỏ tới:

cấu trúc fpga_fme_port_release {
__u32 argsz; // trong: sizeof(struct fpga_fme_port_release)
__u32 cờ; // trong: phải là 0
__u32 cổng_id; // in: port ID (từ 0) để giải phóng.
};

FPGA_FME_PORT_ASSIGN—arg là một con trỏ tới:

cấu trúc fpga_fme_port_assign {
__u32 argsz; // trong: sizeof(struct fpga_fme_port_assign)
__u32 cờ; // trong: phải là 0
__u32 cổng_id; // in: port ID (từ 0) để gán. (chắc là đã
được phát hành trước đó bởi FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg là một con trỏ tới:

cấu trúc fpga_fme_port_pr {
__u32 argsz; // trong: sizeof(struct fpga_fme_port_pr)
__u32 cờ; // trong: phải là 0
__u32 cổng_id; // trong: ID cổng (từ 0)
__u32 bộ đệm_size; // in: kích thước của bộ đệm dòng bit tính bằng byte. Phải là 4 byte
căn chỉnh.
__u64 bộ đệm_địa chỉ; // in: địa chỉ xử lý của bộ đệm dòng bit
trạng thái __u64; // out: trạng thái lỗi (bitmask)
};

Cổng IOCTL
IOCTL được gọi khi mở file bộ mô tả cho /dev/intel-fpga-port.k FPGA_GET_API_VERSION—trả lại phiên bản hiện tại dưới dạng số nguyên, bắt đầu từ 0. FPGA_CHECK_EXTENSION—hiện không được hỗ trợ.

FPGA_PORT_GET_INFO—arg là một con trỏ tới:

cấu trúc fpga_port_info {
__u32 argsz; // trong: sizeof(struct fpga_port_info)
__u32 cờ; // ra: trả về 0
__u32 số_vùng; // out: số vùng MMIO, 2 (1 cho AFU và 1 cho
STP)
__u32 số_umsgs; // out: số lượng UMsg được hỗ trợ bởi phần cứng
};

FPGA_PORT_GET_REGION_INFO—arg là một con trỏ tới:

cấu trúc fpga_port_region_info {
__u32 argsz; // trong: sizeof(struct fpga_port_region_info)
__u32 cờ; // ra: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
chỉ mục __u32; // trong: FPGA_PORT_INDEX_UAFU hoặc FPGA_PORT_INDEX_STP
đệm __u32; // trong: phải là 0
kích thước __u64; // out: kích thước của vùng MMIO tính bằng byte
bù đắp __u64; // out: offset của vùng MMIO từ đầu thiết bị fd
};

FPGA_PORT_DMA_MAP—arg là một con trỏ tới:
cấu trúc fpga_port_dma_map {
__u32 argsz; // trong: sizeof(struct fpga_port_dma_map)
__u32 cờ; // trong: phải là 0 __u64 user_addr; // trong: xử lý ảo
Địa chỉ. Phải được căn chỉnh trang.
__u64 chiều dài; // in: độ dài ánh xạ theo byte. Phải là nhiều trang
kích cỡ.
__u64 iova; // out: IO địa chỉ ảo };

FPGA_PORT_DMA_UNMAP—arg là một con trỏ tới:
cấu trúc fpga_port_dma_unmap {
__u32 argsz; // trong: sizeof(struct fpga_port_dma_unmap)
__u32 cờ; // trong: phải là 0
__u64 iova; // in: IO địa chỉ ảo được trả về bởi một trước đó
FPGA_PORT_DMA_MAP};

  • FPGA_PORT_RESET—đối số phải là NULL.
  • FPGA_PORT_UMSG_ENABLE—đối số phải là NULL.
  • FPGA_PORT_UMSG_DISABLE—đối số phải là NULL.

FPGA_PORT_UMSG_SET_MODE—arg là một con trỏ tới:

cấu trúc fpga_port_umsg_cfg {
__u32 argsz; // trong: sizeof(struct fpga_port_umsg_cfg)
__u32 cờ; // trong: phải là 0
__u32 gợi ý_bitmap; // trong: chế độ gợi ý UMsg bitmap. Cho biết UMsg nào là
được bật.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg phải được tắt trước khi phát hành ioctl này.
  • Trường iova phải dành cho bộ đệm đủ lớn cho tất cả UMsg (num_umsgs * PAGE_SIZE).
    • Bộ đệm được đánh dấu là "đang sử dụng" bởi bộ quản lý bộ đệm của trình điều khiển.
    • Nếu iova là NULL, bất kỳ khu vực nào trước đó không được đánh dấu là "đang sử dụng".
  • arg là một con trỏ tới:
    cấu trúc fpga_port_umsg_base_addr {
    • u32 argsz; // trong: sizeof(struct fpga_port_umsg_base_addr)
    • cờ u32; // trong: phải là 0
    • u64 iova; // trong: IO địa chỉ ảo từ FPGA_PORT_DMA_MAP. };

Ghi chú:

  • Để xóa các lỗi cổng, bạn phải viết bitmask chính xác của các lỗi hiện tại, ví dụ:ample, lỗi mèo > xóa
  • UMsg chỉ được hỗ trợ thông qua Ngăn xếp tăng tốc dành cho Bộ xử lý Intel Xeon với FPGA tích hợp.

hệ thống Files

Hệ thống tiêu đề FME files
intel-fpga-dev.i/intel-fpga-fme.j/

hệ thống file trường mmio kiểu truy cập
cổng_num fme_header.capability.num_ports số thập phân Chỉ đọc
kích thước bộ nhớ đệm fme_header.capability.cache_size số thập phân Chỉ đọc
phiên bản fme_header.capability.fabric_verid số thập phân Chỉ đọc
socket_id fme_header.capability.socket_id số thập phân Chỉ đọc
dòng bit_id fme_header.bitstream_id hex uint64_t Chỉ đọc
siêu dữ liệu dòng bit fme_header.bitstream_md hex uint64_t Chỉ đọc

Hệ thống quản lý nhiệt FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

hệ thống file trường mmio kiểu truy cập
ngưỡng1 nhiệt.threshold.tmp_thshold1 số thập phân Người dùng: Chỉ đọc Gốc: Đọc-ghi
ngưỡng2 nhiệt.threshold.tmp_thshold2 số thập phân Người dùng: Chỉ đọc Gốc: Đọc-ghi
ngưỡng_chuyến nhiệt.threshold.therm_trip_thshold số thập phân Chỉ đọc
ngưỡng1_đã đạt nhiệt.threshold.thshold1_status số thập phân Chỉ đọc
ngưỡng2_đã đạt nhiệt.threshold.thshold2_status số thập phân Chỉ đọc
ngưỡng1_policy nhiệt. ngưỡng.thshold_policy số thập phân Người dùng: Chỉ đọc Gốc: Đọc-ghi
nhiệt độ nhiệt.rdsensor_fm1.fpga_temp số thập phân Chỉ đọc

Hệ thống quản lý năng lượng FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

hệ thống file trường mmio kiểu truy cập
đã tiêu thụ power.status.pwr_consumed hex uint64_t Chỉ đọc
ngưỡng1 sức mạnh.threshold.threshold1 hex uint64_t Người dùng: Chỉ đọc Gốc: Đọc-ghi
ngưỡng2 sức mạnh.threshold.threshold2 hex uint64_t Người dùng: Chỉ đọc Gốc: Đọc-ghi
ngưỡng1_status sức mạnh.threshold.threshold1_status thập phân không dấu Chỉ đọc
ngưỡng2_status sức mạnh.threshold.threshold2_status thập phân không dấu Chỉ đọc
rtl power.status.fpga_latency_report thập phân không dấu Chỉ đọc

Hệ thống lỗi toàn cầu FME files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

hệ thống file trường mmio kiểu truy cập
pcie0_errors gerror.pcie0_err hex uint64_t Đọc viết
pcie1_errors gerror.pcie1_err hex uint64_t Đọc viết
tiêm_error gerror.ras_error_inj hex uint64_t Đọc viết

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

hệ thống file trường mmio kiểu truy cập
lỗi gerror.fme_err hex uint64_t Chỉ đọc
lỗi đầu tiên gerror.fme_first_err.err_reg_status hex uint64_t Chỉ đọc
lỗi tiếp theo gerror.fme_next_err.err_reg_status hex uint64_t Chỉ đọc
thông thoáng Xóa lỗi, first_error, next_error uint64_t khác nhau Chỉ viết

Ghi chú:
Để xóa các lỗi FME, bạn phải viết bitmask chính xác của các lỗi hiện tại, ví dụ:amplỗi mèo > xóa.

Cấu hình lại một phần FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

hệ thống file trường mmio kiểu truy cập
giao diện_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16 byte Chỉ đọc

Hệ thống hiệu suất toàn cầu của FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

hệ thống file trường mmio kiểu truy cập
cái đồng hồ gperf.clk.afu_interf_clock hex uint64_t Chỉ đọc

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Không hợp lệ cho Ngăn xếp tăng tốc cho CPU Intel Xeon với FPGA)

hệ thống file trường mmio kiểu truy cập
đông cứng gperf.ch_ctl.freeze số thập phân Đọc viết
đọc_hit gperf.CACHE_RD_HIT hex uint64_t Chỉ đọc
đọc_miss gperf.CACHE_RD_MISS hex uint64_t Chỉ đọc
viết_hit gperf.CACHE_WR_HIT hex uint64_t Chỉ đọc
viết_miss gperf.CACHE_WR_MISS hex uint64_t Chỉ đọc
giữ_request gperf.CACHE_HOLD_REQ hex uint64_t Chỉ đọc
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Chỉ đọc
hệ thống file trường mmio kiểu truy cập
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Chỉ đọc
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Chỉ đọc
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Chỉ đọc

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Không hợp lệ cho Ngăn tăng tốc cho CPU Intel Xeon với FPGA)

hệ thống file trường mmio kiểu truy cập
đông cứng gperf.vtd_ctl.freeze số thập phân Người dùng: Chỉ đọc Gốc: Đọc-ghi

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Không hợp lệ cho Ngăn tăng tốc cho CPU Intel Xeon với FPGA)

hệ thống file trường mmio kiểu truy cập
đọc_giao dịch gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Chỉ đọc
ghi_giao dịch gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Chỉ đọc
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Chỉ đọc
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Chỉ đọc

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

hệ thống file trường mmio kiểu truy cập
cho phép gperf.fab_ctl.(đã bật) số thập phân Người dùng: Chỉ đọc Gốc: Đọc-ghi
đông cứng gperf.fab_ctl.freeze số thập phân Người dùng: Chỉ đọc Gốc: Đọc-ghi
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Chỉ đọc
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Chỉ đọc
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Chỉ đọc
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Chỉ đọc
upi_read gperf.FAB_UPI_RD hex uint64_t Chỉ đọc
upi_write gperf.FAB_UPI_WR hex uint64_t Chỉ đọc

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

hệ thống file trường mmio kiểu truy cập
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Chỉ đọc
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Chỉ đọc
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Chỉ đọc
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Chỉ đọc
upi_read gperf.FAB_UPI_RD hex uint64_t Chỉ đọc
upi_write gperf.FAB_UPI_WR hex uint64_t Chỉ đọc

Tiêu đề cổng sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

hệ thống file trường mmio kiểu truy cập
id port_header.capability.port_number số thập phân Chỉ đọc
ltr port_header.control.latency_tolerance số thập phân Chỉ đọc

Cổng AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

hệ thống file trường mmio kiểu truy cập
afu_id afu_header.guid hex 16 byte Chỉ đọc

Lỗi cổng sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

hệ thống file trường mmio kiểu truy cập
lỗi perror.port_error hex uint64_t Chỉ đọc
lỗi đầu tiên perror.port_first_error hex uint64_t Chỉ đọc
first_malforming_req perror.malreq hex 16 byte Chỉ đọc
thông thoáng perror.(tất cả các lỗi) uint64_t khác nhau Chỉ viết

Ghi chú:
Để xóa các lỗi Cổng, bạn phải viết bitmask chính xác của các lỗi hiện tại, ví dụ:amplỗi mèo > xóa.

Lịch sử sửa đổi

Phiên bản tài liệu Thay đổi
2017.10.02 Phiên bản phát hành đầu tiên.

Hướng dẫn kiến ​​trúc trình điều khiển thiết bị Intel FPGA Linux của OPAE

Tài liệu / Tài nguyên

intel OPAE FPGA Kiến trúc trình điều khiển thiết bị Linux [tập tin pdf] Hướng dẫn sử dụng
OPAE FPGA Kiến trúc trình điều khiển thiết bị Linux, OPAE FPGA, Kiến trúc trình điều khiển thiết bị Linux, Kiến trúc trình điều khiển, Kiến trúc

Tài liệu tham khảo

Để lại bình luận

Địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu *