logo intel

intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

Pemacu Intel FPGA OPAE menyediakan antara muka untuk aplikasi ruang pengguna untuk mengkonfigurasi, menghitung, membuka dan mengakses pemecut FPGA pada platform yang dilengkapi dengan penyelesaian Intel FPGA dan membolehkan fungsi pengurusan peringkat sistem seperti konfigurasi semula FPGA, pengurusan kuasa dan maya.

Seni Bina Perkakasan

Dari sudut OS view, perkakasan FPGA muncul sebagai peranti PCIe biasa. Memori peranti FPGA disusun menggunakan struktur data yang telah ditetapkan (Senarai Ciri Peranti). Ciri-ciri yang disokong oleh peranti FPGA didedahkan melalui struktur data ini, seperti yang digambarkan di bawah dalam rajah berikut:

Peranti PCIe FPGA

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

Pemacu menyokong PCIe SR-IOV untuk mencipta Fungsi Maya (VF) yang boleh digunakan untuk menetapkan pemecut individu kepada mesin maya.

Perbadanan Intel. Hak cipta terpelihara. Intel, logo Intel dan tanda Intel lain ialah tanda dagangan Intel Corporation atau anak syarikatnya. Intel menjamin prestasi produk FPGA dan semikonduktornya mengikut spesifikasi semasa menurut waranti standard Intel tetapi berhak untuk membuat perubahan kepada mana-mana produk dan perkhidmatan pada bila-bila masa tanpa notis. Intel tidak memikul tanggungjawab atau liabiliti yang timbul daripada aplikasi atau penggunaan mana-mana maklumat, produk atau perkhidmatan yang diterangkan di sini kecuali seperti yang dipersetujui secara bertulis oleh Intel. Pelanggan Intel dinasihatkan untuk mendapatkan versi terkini spesifikasi peranti sebelum bergantung pada sebarang maklumat yang diterbitkan dan sebelum membuat pesanan untuk produk atau perkhidmatan.

Nama dan jenama lain boleh dituntut sebagai hak milik orang lain.

Peranti PCIe FPGA termaya

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

Enjin Pengurusan FPGA (FME)
Enjin Pengurusan FPGA melaksanakan pengurusan kuasa dan haba, pelaporan ralat, konfigurasi semula, pelaporan prestasi dan fungsi infrastruktur lain. Setiap FPGA mempunyai satu FME, yang sentiasa diakses melalui Fungsi Fizikal (PF). Aplikasi ruang pengguna boleh memperoleh akses eksklusif kepada FME menggunakan open(), dan melepaskannya menggunakan close() sebagai pengguna istimewa (root).

Pelabuhan
Port mewakili antara muka antara fabrik FPGA statik ("Pengurus Antara Muka FPGA (FIM)") dan kawasan boleh dikonfigurasikan separa yang mengandungi Fungsi Pemecut (AF). Port mengawal komunikasi daripada perisian kepada pemecut dan mendedahkan ciri seperti tetapan semula dan nyahpepijat. Peranti PCIe mungkin mempunyai beberapa Port, dan setiap Port boleh didedahkan melalui VF dengan memberikannya menggunakan ioctl FPGA_FME_PORT_ASSIGN pada peranti FME.

Unit Fungsi Pemecut (AF).

  • Unit Fungsi Pemecut (AF) dilampirkan pada Port dan mendedahkan rantau 256K MMIO untuk digunakan untuk daftar kawalan khusus pemecut.
  • Aplikasi ruang pengguna boleh memperoleh akses eksklusif kepada AFU yang dilampirkan pada Port dengan menggunakan open() pada peranti Port, dan melepaskannya menggunakan close().
  • Aplikasi ruang pengguna juga boleh mmap() pemecut kawasan MMIO.

Konfigurasi Semula Separa
Seperti yang dinyatakan di atas, pemecut boleh dikonfigurasikan semula melalui konfigurasi semula separa bagi Fungsi Pemecut (AF) file. Fungsi Pemecut (AF) mesti telah dijana untuk FIM yang tepat dan kawasan statik sasaran (Port) FPGA; jika tidak, operasi konfigurasi semula akan gagal dan mungkin menyebabkan ketidakstabilan sistem. Keserasian ini boleh disemak dengan membandingkan ID antara muka yang dicatatkan dalam pengepala AF dengan ID antara muka yang didedahkan oleh FME melalui sysfs. Semakan ini biasanya dilakukan oleh ruang pengguna sebelum memanggil konfigurasi semula IOCTL.

Nota:
Pada masa ini, sebarang program perisian yang mengakses FPGA, termasuk yang dijalankan dalam hos maya, mesti ditutup sebelum mencuba konfigurasi semula separa. Langkah-langkahnya ialah:

  1. Punggah pemandu dari tetamu
  2. Cabut plag VF daripada tetamu
  3. Lumpuhkan SR-IOV
  4. Lakukan konfigurasi semula separa
  5. Dayakan SR-IOV
  6. Palamkan VF kepada tetamu
  7. Muatkan pemandu ke dalam tetamu

Maya FPGA
Untuk mendayakan mengakses pemecut daripada aplikasi yang dijalankan dalam VM, port AFU masing-masing perlu diberikan kepada VF menggunakan langkah berikut:

  1. PF memiliki semua port AFU secara lalai. Mana-mana port yang perlu ditetapkan semula kepada VF mesti dilepaskan terlebih dahulu daripada PF melalui ioctl FPGA_FME_PORT_RELEASE pada peranti FME.
  2. Setelah N port dilepaskan daripada PF, arahan di bawah boleh digunakan untuk mendayakan SRIOV dan VF. Setiap VF hanya memiliki satu port dengan AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Lulus melalui VF ke VM.
  4. AFU di bawah VF boleh diakses daripada aplikasi dalam VM (menggunakan pemacu yang sama di dalam VF).

Nota:
FME tidak boleh diberikan kepada VF, oleh itu PR dan fungsi pengurusan lain hanya tersedia melalui PF.

Organisasi Pemandu

Pemacu Peranti Modul PCIe

Organisasi Pemandu

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

Peranti FPGA muncul sebagai peranti PCIe biasa; oleh itu, pemacu peranti FPGA PCIe (intel-FPGA-PCI.ko) sentiasa dimuatkan dahulu sebaik sahaja FPGA PCIe PF atau VF dikesan. Pemandu ini memainkan peranan infrastruktur dalam seni bina pemandu. Ia:

  • Mencipta peranti bekas FPGA sebagai induk kepada peranti ciri.
  • Berjalan melalui Senarai Ciri Peranti, yang dilaksanakan dalam memori BAR peranti PCIe, untuk menemui peranti ciri dan subcirinya dan mencipta peranti platform untuknya di bawah peranti kontena.
  • Menyokong SR-IOV.
  • Memperkenalkan infrastruktur peranti ciri, yang mengabstraksi operasi untuk subciri dan mendedahkan fungsi biasa kepada pemacu peranti ciri.

Fungsi Pemacu Peranti Modul PCIe

  • Mengandungi penemuan PCIe, penghitungan peranti dan penemuan ciri.
  • Mencipta direktori sysfs untuk peranti induk, Enjin Pengurusan FPGA (FME) dan Port.
  • Mencipta kejadian pemacu platform, menyebabkan kernel Linux memuatkan pemacu modul platform masing-masing.

Pemacu Peranti Modul Platform FME

  • Pengurusan kuasa dan haba, pelaporan ralat, pelaporan prestasi dan fungsi infrastruktur lain. Anda boleh mengakses fungsi ini melalui antara muka sysfs yang didedahkan oleh pemacu FME.
  • Konfigurasi Semula Separa. Pemacu FME mendaftarkan Pengurus FPGA semasa permulaan sub-ciri PR; sebaik sahaja ia menerima FPGA_FME_PORT_PR ioctl daripada anda, ia menggunakan fungsi antara muka biasa daripada Pengurus FPGA untuk melengkapkan konfigurasi semula separa aliran bit ke Port yang diberikan.
  • Pengurusan pelabuhan untuk virtualisasi. Pemacu FME memperkenalkan dua ioctl, FPGA_FME_PORT_RELEASE, yang melepaskan Port yang diberikan daripada PF; dan FPGA_FME_PORT_ASSIGN, yang memberikan Port kembali kepada PF. Sebaik sahaja Port dilepaskan daripada PF, ia boleh diberikan kepada VF melalui antara muka SR-IOV yang disediakan oleh pemacu PCIe. Untuk maklumat lanjut, rujuk kepada "Penmayaran FPGA".

Fungsi Pemacu Peranti Modul Platform FME

  • Mencipta nod peranti aksara FME.
  • Mencipta sysfs FME files dan melaksanakan sysfs FME file aksesori.
  • Melaksanakan sub-pemacu ciri peribadi FME.
  • Sub-pemacu ciri peribadi FME:
    • Tajuk FME
    • Pengurusan Terma
    • Pengurusan Kuasa
    • Ralat Global
    • Konfigurasi Semula Separa
    • Prestasi Global

Pemacu Peranti Modul Pelabuhan Pelabuhan
Sama seperti pemacu FME, pemacu Port FPGA (dan AFU) (intel-fpga-afu. ko) disiasat sebaik sahaja peranti platform Port dibuat. Fungsi utama modul ini adalah untuk menyediakan antara muka untuk aplikasi ruang pengguna untuk mengakses pemecut individu, termasuk kawalan tetapan semula asas pada Port, eksport rantau AFU MMIO, perkhidmatan pemetaan penimbal DMA, pemberitahuan UMsg(1) dan fungsi nyahpepijat jauh ( lihat di atas).

UMsg hanya disokong melalui Timbunan Pecutan untuk Pemproses Intel Xeon® dengan FPGA Bersepadu.

Fungsi Pemacu Peranti Modul Pelabuhan Pelabuhan

  • Mencipta nod peranti aksara Port.
  • Mencipta sysfs Port files dan melaksanakan sysfs Port file aksesori.
  • Melaksanakan sub-pemacu ciri peribadi Port.
  • Sub-pemacu ciri peribadi port:
    • Pengepala Pelabuhan
    • AFU
    • Ralat Pelabuhan
    • UMsg(2)
    • Ketik Isyarat

Pengiraan Peranti FPGA Aplikasi
Bahagian ini memperkenalkan cara aplikasi menghitung peranti FPGA daripada hierarki sysfs di bawah /sys/class/fpga. Dalam bekasampDi bawah, dua peranti Intel FPGA dipasang dalam hos. Setiap peranti FPGA mempunyai satu FME dan dua Port (AFU). Untuk setiap peranti FPGA, direktori peranti dibuat di bawah /sys/class/fpga:

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

Setiap nod mempunyai satu FME dan dua Port (AFU) sebagai peranti kanak-kanak:
/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

Secara umum, antara muka sysfs FME/Port dinamakan seperti berikut:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

dengan I berturut-turut menomborkan semua peranti kontena, j berturut-turut menomborkan FME dan k berturut-turut menomborkan semua Port.

Nod peranti yang digunakan untuk ioctl() dan mmap() boleh dirujuk melalui:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Penghitungan Pemacu PCIe
Bahagian ini memberi kelebihanview aliran kod untuk penghitungan peranti yang dilakukan oleh intel-fpga-pci.ko. Struktur dan fungsi data utama diserlahkan. Bahagian ini paling baik diikuti apabila viewdalam kod sumber yang disertakan (pcie.c).

Struktur Data Penghitungan

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
struct statik idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nama;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
kelas struct statik *fpga_class;
struct statik 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,}
};
struct statik 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
};
struct cci_drvdata {
int device_id;
peranti struct *fme_dev;
kunci mutex struktur;
struct list_head port_dev_list;
int released_port_num;
kawasan list_head struktur;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
batal __iomem *ioaddr;
batal __iomem *ioend;
int current_bar;
batal __iomem *pfme_hdr;
peranti struct *parent_dev;
struct platform_device *feature_dev;
};

Aliran Penghitungan

  • ccidrv_init()
    • Mulakan fpga_ids menggunakan idr_init().
    • Mulakan fpga_chrdevs[i].devt menggunakan alloc_chrdev_region().
    • Mulakan fpga_class menggunakan class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Dayakan peranti PCI, minta akses kepada kawasannya, tetapkan mod induk PCI dan konfigurasikan DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Peruntukkan struct build_feature_devs_info, mulakan ia.
      .parent_dev ditetapkan kepada direktori sysfs induk (intel-fpga-dev.id) yang mengandungi direktori sysfs FME dan Port.
  • parse_feature_list()
    • Ikuti Senarai Ciri Peranti BAR0 untuk menemui FME, Pelabuhan dan ciri peribadinya.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Apabila FME ditemui:
  • build_info_create_dev()
    • Peruntukkan peranti platform untuk FME, simpan dalam build_feature_devs_info.feature_dev.
    • feature_dev.id dimulakan kepada hasil idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent ditetapkan kepada build_feature_devs_info.parent_dev.
    • Peruntukkan tatasusunan sumber struct dalam feature_dev.resource.
  • Peruntukkan struct feature_platform_data, mulakan ia dan simpan penunjuk dalam feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Mulakan feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Mulakan feature_platform_data.features[FME_FEATURE_ID_HEADER], semuanya kecuali .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Apabila Pelabuhan ditemui:
  • build_info_create_dev()
    • Peruntukkan peranti platform untuk Port, simpan dalam build_feature_devs_info.feature_dev.
    • feature_dev.id dimulakan kepada hasil idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent ditetapkan kepada build_feature_devs_info.parent_dev.
    • Peruntukkan tatasusunan sumber struct dalam feature_dev.resource.
    • Peruntukkan struct feature_platform_data, mulakan ia dan simpan penunjuk dalam feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Tambahkan struct feature_platform_data.node untuk Port ke senarai Port dalam struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Mulakan feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Mulakan feature_platform_data.features[PORT_FEATURE_ID_HEADER], semuanya kecuali .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Apabila AFU ditemui:
  • create_feature_instance() build_info_add_sub_feature()
    • Mulakan feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Mulakan feature_platform_data.features[PORT_FEATURE_ID_UAFU], semuanya kecuali .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Apabila ciri peribadi FME ditemui:
  • create_feature_instance() build_info_add_sub_feature()
    • Mulakan feature_dev.resource[id].
  • feature_platform_data_add()
    • Mulakan feature_platform_data.features[id], semuanya kecuali .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Apabila ciri peribadi Port ditemui: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Mulakan feature_platform_data.features[id], semuanya kecuali .fops.
  • parse_ports_from_fme()
    • Jika pemandu dimuatkan pada Fungsi Fizikal (PF), maka:
  • Jalankan aliran parse_feature_list() pada setiap port yang diterangkan dalam pengepala FME.
  • Gunakan BAR yang disebut dalam setiap entri Port dalam pengepala.

Permulaan Peranti Platform FME
Bahagian ini memberi kelebihanview aliran kod untuk permulaan peranti FME yang dilakukan oleh intel-fpga-fme.ko. Struktur dan fungsi data utama diserlahkan. Bahagian ini paling baik diikuti apabila viewdalam kod sumber yang disertakan (fme-main.c).

Struktur Data Peranti Platform FME

struct feature_ops {
int (*init)(struct platform_device *pdev, ciri struct *ciri);
int (*uinit)(struct platform_device *pdev, ciri struct *ciri);
panjang (*ioctl)(peranti_platform struct *pdev, ciri struct *ciri,
unsigned int cmd, unsigned long arg);
int (*ujian)(peranti_platform struct *pdev, ciri struct *ciri);
};
ciri struct {
const char *nama;
int sumber_indeks;
batal __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head nod;
kunci mutex struktur;
status dev_panjang yang tidak ditandatangani;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
batal *peribadi;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); struct
ciri ciri[0];
};
struct perf_object {
tangan anda;
const struct attribute_group **attr_groups;
peranti struct *fme_dev;
struct list_head nod;
struct list_head kanak-kanak;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
peranti struct *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

Aliran Permulaan Peranti Platform FME

Aliran Permulaan FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Mulakan struct fpga_fme dan simpannya dalam medan feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Simpan struct feature_ops ke dalam feature_platform_data.features untuk setiap ciri yang diisi.
    • Panggil fungsi ujian, jika ada, dari struct.
    • Panggil fungsi init dari struct.
  • fme_probe() fpga_register_dev_ops()
    • Cipta nod peranti aksara FME, mendaftarkan struct file_operasi.

Permulaan Peranti Platform Pelabuhan
Bahagian ini memberi kelebihanview aliran kod untuk permulaan peranti port yang dilakukan oleh intel-fpga-afu.ko. Struktur dan fungsi data utama diserlahkan. Bahagian ini paling baik diikuti apabila viewdalam kod sumber yang disertakan (afu.c).

Struktur Data Peranti Pelabuhan

struct feature_ops {
int (*init)(struct platform_device *pdev, ciri struct *ciri);
int (*uinit)(struct platform_device *pdev, ciri struct *ciri);
panjang (*ioctl)(peranti_platform struct *pdev, ciri struct *ciri,
unsigned int cmd, unsigned long arg);
int (*ujian)(peranti_platform struct *pdev, ciri struct *ciri);
};
ciri struct {
const char *nama;
int sumber_indeks;
batal __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head nod;
kunci mutex struktur;
status dev_panjang yang tidak ditandatangani;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
batal *peribadi;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
ciri ciri struktur[0];
};
struct fpga_afu_region {
indeks u32;
bendera u32;
saiz u64;
u64 mengimbangi;
u64 fizikal;
struct list_head nod;
};
struct fpga_afu_dma_region {
u64 user_addr;
panjang u64;
u64 iova;
halaman struktur **halaman;
struct rb_node nod;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
kawasan list_head struktur;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Aliran Permulaan Peranti Platform Pelabuhan

Aliran Permulaan Portintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Mulakan struct fpga_afu dan simpannya dalam medan feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Simpan struct feature_ops ke dalam feature_platform_data.features untuk setiap ciri yang diisi.
    • Panggil fungsi ujian, jika ada, dari struct.
    • Panggil fungsi init dari struct.
  • afu_probe() fpga_register_dev_ops()
    • Cipta nod peranti aksara Port, mendaftarkan struct file_operasi.

IOCTL FME
IOCTL yang dipanggil terbuka file deskriptor untuk /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—kembali versi semasa sebagai integer, bermula dari 0.

FPGA_CHECK_EXTENSION—tidak disokong pada masa ini.

FPGA_FME_PORT_RELEASE—arg ialah penunjuk kepada:

struct fpga_fme_port_release {
__u32 argsz; // dalam: sizeof(struct fpga_fme_port_release)
__u32 bendera; // dalam: mestilah 0
__u32 port_id; // dalam: port ID (dari 0) untuk dikeluarkan.
};

FPGA_FME_PORT_ASSIGN—arg ialah penunjuk kepada:

struct fpga_fme_port_assign {
__u32 argsz; // dalam: sizeof(struct fpga_fme_port_assign)
__u32 bendera; // dalam: mestilah 0
__u32 port_id; // in: port ID (dari 0) untuk diberikan. (mestilah
dikeluarkan sebelum ini oleh FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg ialah penunjuk kepada:

struct fpga_fme_port_pr {
__u32 argsz; // dalam: sizeof(struct fpga_fme_port_pr)
__u32 bendera; // dalam: mestilah 0
__u32 port_id; // dalam: port ID (dari 0)
__u32 buffer_size; // dalam: saiz penimbal aliran bit dalam bait. Mestilah 4-bait
sejajar.
__u64 alamat_penampan; // dalam: alamat proses penimbal aliran bit
status __u64; // keluar: status ralat (bitmask)
};

Pelabuhan IOCTL
IOCTL yang dipanggil terbuka file deskriptor untuk /dev/intel-fpga-port.k FPGA_GET_API_VERSION—kembali versi semasa sebagai integer, bermula dari 0. FPGA_CHECK_EXTENSION—tidak disokong pada masa ini.

FPGA_PORT_GET_INFO—arg ialah penunjuk kepada:

struct fpga_port_info {
__u32 argsz; // dalam: sizeof(struct fpga_port_info)
__u32 bendera; // keluar: mengembalikan 0
__u32 num_regions; // keluar: bilangan wilayah MMIO, 2 (1 untuk AFU dan 1 untuk
STP)
__u32 num_umsgs; // keluar: bilangan UMsg yang disokong oleh perkakasan
};

FPGA_PORT_GET_REGION_INFO—arg ialah penunjuk kepada:

struct fpga_port_region_info {
__u32 argsz; // dalam: sizeof(struct fpga_port_region_info)
__u32 bendera; // keluar: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // dalam: FPGA_PORT_INDEX_UAFU atau FPGA_PORT_INDEX_STP
__u32 pelapik; // dalam: mestilah 0
__u64 saiz; // keluar: saiz rantau MMIO dalam bait
__u64 mengimbangi; // keluar: mengimbangi rantau MMIO dari permulaan peranti fd
};

FPGA_PORT_DMA_MAP—arg ialah penunjuk kepada:
struct fpga_port_dma_map {
__u32 argsz; // dalam: sizeof(struct fpga_port_dma_map)
__u32 bendera; // dalam: mestilah 0 __u64 user_addr; // dalam: proses maya
alamat. Mesti dijajarkan halaman.
__u64 panjang; // dalam: panjang pemetaan dalam bait. Mestilah berbilang halaman
saiz.
__u64 iova; // keluar: alamat maya IO };

FPGA_PORT_DMA_UNMAP—arg ialah penunjuk kepada:
struct fpga_port_dma_unmap {
__u32 argsz; // dalam: sizeof(struct fpga_port_dma_unmap)
__u32 bendera; // dalam: mestilah 0
__u64 iova; // dalam: alamat maya IO dikembalikan oleh alamat sebelumnya
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg mestilah NULL.
  • FPGA_PORT_UMSG_ENABLE—arg mestilah NULL.
  • FPGA_PORT_UMSG_DISABLE—arg mestilah NULL.

FPGA_PORT_UMSG_SET_MODE—arg ialah penunjuk kepada:

struct fpga_port_umsg_cfg {
__u32 argsz; // dalam: sizeof(struct fpga_port_umsg_cfg)
__u32 bendera; // dalam: mestilah 0
__u32 hint_bitmap; // dalam: peta bit mod petunjuk UMsg. Menandakan UMsg yang mana
didayakan.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg mesti dilumpuhkan sebelum mengeluarkan ioctl ini.
  • Medan iova mestilah untuk penimbal yang cukup besar untuk semua UMsg (num_umsgs * PAGE_SIZE).
    • Penampan ditandakan sebagai "sedang digunakan" oleh pengurusan penimbal pemandu.
    • Jika iova adalah NULL, mana-mana rantau sebelumnya tidak ditandakan sebagai "sedang digunakan".
  • arg ialah penunjuk kepada:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // dalam: sizeof(struct fpga_port_umsg_base_addr)
    • bendera u32; // dalam: mestilah 0
    • u64 iova; // dalam: alamat maya IO daripada FPGA_PORT_DMA_MAP. };

Nota:

  • Untuk mengosongkan ralat port, anda perlu menulis bitmask yang tepat bagi ralat semasa, contohnyaample, kesilapan kucing > jelas
  • UMsg hanya disokong melalui Timbunan Pecutan untuk Pemproses Intel Xeon dengan FPGA Bersepadu.

sysfs Files

sysfs Pengepala FME files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file medan mmio taip akses
ports_num fme_header.capability.num_ports int perpuluhan Baca sahaja
saiz_cache fme_header.capability.cache_size int perpuluhan Baca sahaja
versi fme_header.capability.fabric_verid int perpuluhan Baca sahaja
socket_id fme_header.capability.socket_id int perpuluhan Baca sahaja
bitstream_id fme_header.bitstream_id hex uint64_t Baca sahaja
bitstream_metadata fme_header.bitstream_md hex uint64_t Baca sahaja

Sistem Pengurusan Terma FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file medan mmio taip akses
ambang1 thermal.threshold.tmp_threshold1 int perpuluhan Pengguna: Baca sahaja Root: Baca-tulis
ambang2 thermal.threshold.tmp_threshold2 int perpuluhan Pengguna: Baca sahaja Root: Baca-tulis
ambang_perjalanan thermal.threshold.therm_trip_thshold int perpuluhan Baca sahaja
threshold1_reached thermal.threshold.thshold1_status int perpuluhan Baca sahaja
threshold2_reached thermal.threshold.thshold2_status int perpuluhan Baca sahaja
ambang1_dasar terma. ambang.dasar_ambang int perpuluhan Pengguna: Baca sahaja Root: Baca-tulis
suhu thermal.rdsensor_fm1.fpga_temp int perpuluhan Baca sahaja

Sistem Pengurusan Kuasa FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file medan mmio taip akses
dimakan kuasa.status.pwr_consumed hex uint64_t Baca sahaja
ambang1 kuasa.ambang.ambang1 hex uint64_t Pengguna: Baca sahaja Root: Baca-tulis
ambang2 kuasa.ambang.ambang2 hex uint64_t Pengguna: Baca sahaja Root: Baca-tulis
ambang1_status power.threshold.threshold1_status perpuluhan tidak ditandatangani Baca sahaja
ambang2_status power.threshold.threshold2_status perpuluhan tidak ditandatangani Baca sahaja
rtl power.status.fpga_latency_report perpuluhan tidak ditandatangani Baca sahaja

sysfs Ralat Global FME files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file medan mmio taip akses
pcie0_errors gerror.pcie0_err hex uint64_t Baca tulis
pcie1_errors gerror.pcie1_err hex uint64_t Baca tulis
inject_error gerror.ras_error_inj hex uint64_t Baca tulis

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

sysfs file medan mmio taip akses
kesilapan gerror.fme_err hex uint64_t Baca sahaja
first_error gerror.fme_first_err.err_reg_status hex uint64_t Baca sahaja
next_error gerror.fme_next_err.err_reg_status hex uint64_t Baca sahaja
jelas Membersihkan ralat, ralat_pertama, ralat_seterusnya pelbagai uint64_t Tulis sahaja

Nota:
Untuk mengosongkan ralat FME, anda mesti menulis bitmask yang tepat bagi ralat semasa, contohnyaampralat kucing > jelas.

Sistem Konfigurasi Semula Separa FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file medan mmio taip akses
id_antaramuka pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-bait Baca sahaja

sysfs Prestasi Global FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file medan mmio taip akses
jam gperf.clk.afu_interf_clock hex uint64_t Baca sahaja

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Tidak sah untuk Timbunan Pecutan untuk CPU Intel Xeon dengan FPGA)

sysfs file medan mmio taip akses
membekukan gperf.ch_ctl.freeze int perpuluhan Baca tulis
read_hit gperf.CACHE_RD_HIT hex uint64_t Baca sahaja
baca_rindu gperf.CACHE_RD_MISS hex uint64_t Baca sahaja
tulis_kena gperf.CACHE_WR_HIT hex uint64_t Baca sahaja
tulis_rindu gperf.CACHE_WR_MISS hex uint64_t Baca sahaja
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Baca sahaja
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Baca sahaja
sysfs file medan mmio taip akses
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Baca sahaja
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Baca sahaja
tag_tulis_port_perselisihan gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Baca sahaja

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Tidak sah untuk Timbunan Pecutan untuk CPU Intel Xeon dengan FPGA)

sysfs file medan mmio taip akses
membekukan gperf.vtd_ctl.freeze int perpuluhan Pengguna: Baca sahaja Root: Baca-tulis

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Tidak sah untuk Timbunan Pecutan untuk CPU Intel Xeon dengan FPGA)

sysfs file medan mmio taip akses
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Baca sahaja
tulis_urus niaga gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Baca sahaja
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Baca sahaja
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Baca sahaja

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

sysfs file medan mmio taip akses
membolehkan gperf.fab_ctl.(didayakan) int perpuluhan Pengguna: Baca sahaja Root: Baca-tulis
membekukan gperf.fab_ctl.freeze int perpuluhan Pengguna: Baca sahaja Root: Baca-tulis
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Baca sahaja
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Baca sahaja
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Baca sahaja
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Baca sahaja
upi_read gperf.FAB_UPI_RD hex uint64_t Baca sahaja
upi_write gperf.FAB_UPI_WR hex uint64_t Baca sahaja

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

sysfs file medan mmio taip akses
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Baca sahaja
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Baca sahaja
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Baca sahaja
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Baca sahaja
upi_read gperf.FAB_UPI_RD hex uint64_t Baca sahaja
upi_write gperf.FAB_UPI_WR hex uint64_t Baca sahaja

sysfs Pengepala Pelabuhan files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file medan mmio taip akses
id port_header.capability.port_number int perpuluhan Baca sahaja
ltr port_header.control.latency_tolerance int perpuluhan Baca sahaja

Port AFU Pengepala sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file medan mmio taip akses
afu_id afu_header.guid hex 16-bait Baca sahaja

sysfs Ralat Pelabuhan files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file medan mmio taip akses
kesilapan perror.port_error hex uint64_t Baca sahaja
first_error perror.port_first_error hex uint64_t Baca sahaja
first_malformed_req perror.malreq hex 16-bait Baca sahaja
jelas kesalahan.(semua kesilapan) pelbagai uint64_t Tulis sahaja

Nota:
Untuk mengosongkan ralat Port, anda mesti menulis bitmask yang tepat bagi ralat semasa, contohnyaampralat kucing > jelas.

Sejarah Semakan

Versi Dokumen Perubahan
2017.10.02 Keluaran Awal.

Panduan Seni Bina Pemacu Peranti OPAE Intel FPGA Linux

Dokumen / Sumber

intel OPAE FPGA Linux Device Driver Architecture [pdf] Panduan Pengguna
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Rujukan

Tinggalkan komen

Alamat e-mel anda tidak akan diterbitkan. Medan yang diperlukan ditanda *