intel-loqosu

intel OPAE FPGA Linux Device Driver Architecture

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Memarlıq-məhsulu

OPAE Intel FPGA Linux Device Driver Arxitekturası

OPAE Intel FPGA drayveri, Intel FPGA həlləri ilə təchiz edilmiş platformalarda FPGA sürətləndiricilərini konfiqurasiya etmək, sadalamaq, açmaq və onlara daxil olmaq üçün istifadəçi məkan proqramları üçün interfeyslər təqdim edir və FPGA-nın yenidən konfiqurasiyası, enerjinin idarə edilməsi və virtuallaşdırma kimi sistem səviyyəsində idarəetmə funksiyalarını təmin edir.

Avadanlıq Memarlığı

OS baxımından view, FPGA aparatı adi PCIe cihazı kimi görünür. FPGA cihazının yaddaşı əvvəlcədən təyin edilmiş məlumat strukturundan (Cihaz Xüsusiyyətləri Siyahısından) istifadə edərək təşkil edilir. Aşağıdakı şəkildə göstərildiyi kimi, FPGA cihazı tərəfindən dəstəklənən xüsusiyyətlər bu məlumat strukturları vasitəsilə ifşa olunur:

FPGA PCIe Cihazı

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Arxitektura-şəkil- (1)

Sürücü virtual maşınlara fərdi sürətləndiricilər təyin etmək üçün istifadə edilə bilən Virtual Funksiyalar (VF) yaratmaq üçün PCIe SR-IOV-ni dəstəkləyir.

Intel Korporasiyası. Bütün hüquqlar qorunur. Intel, Intel loqosu və digər Intel markaları Intel Korporasiyasının və ya onun törəmə şirkətlərinin ticarət nişanlarıdır. Intel FPGA və yarımkeçirici məhsullarının Intel-in standart zəmanətinə uyğun olaraq cari spesifikasiyalara uyğun işləməsinə zəmanət verir, lakin istənilən vaxt xəbərdarlıq etmədən istənilən məhsul və xidmətlərə dəyişiklik etmək hüququnu özündə saxlayır. Intel tərəfindən yazılı şəkildə açıq şəkildə razılaşdırıldığı hallar istisna olmaqla, Intel burada təsvir edilən hər hansı məlumat, məhsul və ya xidmətin tətbiqi və ya istifadəsindən irəli gələn heç bir məsuliyyət və ya öhdəlik götürmür. Intel müştərilərinə hər hansı dərc edilmiş məlumata etibar etməzdən və məhsul və ya xidmətlər üçün sifariş verməzdən əvvəl cihazın texniki xüsusiyyətlərinin ən son versiyasını əldə etmələri tövsiyə olunur.

Digər adlar və markalar başqalarının mülkiyyəti kimi iddia edilə bilər.

Virtuallaşdırılmış FPGA PCIe Cihazı

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Arxitektura-şəkil- (2)

FPGA İdarəetmə Mühərriki (FME)
FPGA İdarəetmə Mühərriki güc və istilik idarəçiliyi, səhvlər haqqında hesabat, yenidən konfiqurasiya, performans hesabatı və digər infrastruktur funksiyalarını yerinə yetirir. Hər bir FPGA-da bir FME var, ona həmişə Fiziki Funksiya (PF) vasitəsilə daxil olur. İstifadəçi məkan proqramları open() istifadə edərək FME-yə eksklüziv giriş əldə edə və imtiyazlı istifadəçi (root) kimi close() istifadə edərək onu buraxa bilər.

Liman
Port statik FPGA quruluşu ("FPGA İnterfeys Meneceri (FIM)") və Sürətləndirici Funksiyanı (AF) ehtiva edən qismən yenidən konfiqurasiya edilə bilən bölgə arasındakı interfeysi təmsil edir. Port proqram təminatından sürətləndiriciyə qədər olan əlaqəni idarə edir və sıfırlama və sazlama kimi funksiyaları ifşa edir. PCIe cihazının bir neçə Portu ola bilər və hər bir Port FME cihazında FPGA_FME_PORT_ASSIGN ioctl istifadə edərək onu təyin etməklə VF vasitəsilə ifşa oluna bilər.

Sürətləndirici Funksiya (AF) Vahidi

  • Sürətləndirici Funksiya (AF) Vahidi Limana qoşulub və sürətləndirici üçün xüsusi idarəetmə registrləri üçün istifadə edilmək üçün 256K MMIO bölgəsini ifşa edir.
  • İstifadəçi məkan proqramları Port cihazında open() funksiyasından istifadə etməklə Porta qoşulmuş AFU-ya eksklüziv giriş əldə edə və close() istifadə edərək onu buraxa bilər.
  • İstifadəçi məkan proqramları həmçinin MMIO regionlarını mmap() sürətləndirə bilər.

Qismən yenidən konfiqurasiya
Yuxarıda qeyd edildiyi kimi, sürətləndiricilər Sürətləndirici Funksiyasının (AF) qismən yenidən konfiqurasiyası ilə yenidən konfiqurasiya edilə bilər. file. Sürətləndirici Funksiya (AF) FPGA-nın dəqiq FIM ​​və hədəflənmiş statik bölgəsi (Port) üçün yaradılmalıdır; əks halda, yenidən konfiqurasiya əməliyyatı uğursuz olacaq və ola bilsin ki, sistemin qeyri-sabitliyinə səbəb ola bilər. Bu uyğunluq AF başlığında qeyd edilmiş interfeys ID-sini sysfs vasitəsilə FME-nin ifşa etdiyi interfeys ID-si ilə müqayisə etməklə yoxlanıla bilər. Bu yoxlama adətən IOCTL yenidən konfiqurasiyasını çağırmazdan əvvəl istifadəçi sahəsi tərəfindən aparılır.

Qeyd:
Hal-hazırda, virtuallaşdırılmış hostda işləyənlər də daxil olmaqla, FPGA-ya daxil olan hər hansı proqram təminatı qismən yenidən konfiqurasiyaya cəhd etməzdən əvvəl bağlanmalıdır. Addımlar belə olardı:

  1. Sürücünü qonaqdan boşaltın
  2. VF-ni qonaqdan ayırın
  3. SR-IOV-ni söndürün
  4. Qismən yenidən konfiqurasiya edin
  5. SR-IOV-ni aktivləşdirin
  6. VF-ni qonağa qoşun
  7. Sürücünü qonağa yükləyin

FPGA Virtualizasiyası
VM-də işləyən proqramlardan sürətləndiriciyə daxil olmağı aktivləşdirmək üçün müvafiq AFU-nun portu aşağıdakı addımlardan istifadə etməklə VF-yə təyin edilməlidir:

  1. PF standart olaraq bütün AFU portlarına sahibdir. VF-yə yenidən təyin edilməli olan istənilən port əvvəlcə FME cihazındakı FPGA_FME_PORT_RELEASE ioctl vasitəsilə PF-dən buraxılmalıdır.
  2. PF-dən N port buraxıldıqdan sonra SRIOV və VF-ləri aktivləşdirmək üçün aşağıdakı əmrdən istifadə etmək olar. Hər bir VF AFU ilə yalnız bir porta malikdir. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. VF-lərdən VM-lərə keçin.
  4. VF altında AFU-ya VM-dəki proqramlardan daxil olmaq mümkündür (VF daxilində eyni sürücüdən istifadə etməklə).

Qeyd:
FME VF-yə təyin edilə bilməz, beləliklə, PR və digər idarəetmə funksiyaları yalnız PF vasitəsilə mövcuddur.

Sürücü təşkilatı

PCIe Modul Cihaz Sürücüsü

Sürücü təşkilatı

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Arxitektura-şəkil- (3)

FPGA cihazları adi PCIe cihazları kimi görünür; beləliklə, FPGA PCIe cihazının drayveri (intel-FPGA-PCI.ko) həmişə FPGA PCIe PF və ya VF aşkar edildikdən sonra yüklənir. Bu sürücü sürücü arxitekturasında infrastruktur rolunu oynayır. O:

  • Xüsusiyyət cihazlarının əsas hissəsi kimi FPGA konteyner cihazını yaradır.
  • Xüsusiyyət cihazlarını və onların alt xüsusiyyətlərini tapmaq və konteyner cihazının altında onlar üçün platforma qurğuları yaratmaq üçün PCIe cihazının BAR yaddaşında tətbiq olunan Cihaz Xüsusiyyət Siyahısını gəzir.
  • SR-IOV dəstəkləyir.
  • Alt funksiyalar üçün əməliyyatları abstraktlaşdıran və ümumi funksiyaları xüsusiyyət cihaz drayverlərinə ifşa edən xüsusiyyət cihaz infrastrukturunu təqdim edir.

PCIe Modul Cihaz Sürücü Funksiyaları

  • Tərkibində PCIe kəşfi, cihaz siyahıları və xüsusiyyət kəşfi var.
  • Ana cihaz, FPGA İdarəetmə Mühərriki (FME) və Port üçün sysfs qovluqları yaradır.
  • Linux nüvəsinin müvafiq platforma modul drayverlərini yükləməsinə səbəb olan platforma drayverinin nümunələrini yaradır.

FME Platforma Modulu Cihaz Sürücüsü

  • Enerji və istilik idarəetməsi, xəta hesabatı, performans hesabatı və digər infrastruktur funksiyaları. Bu funksiyalara FME sürücüsü tərəfindən məruz qalan sysfs interfeysləri vasitəsilə daxil ola bilərsiniz.
  • Qismən yenidən konfiqurasiya. FME sürücüsü PR alt funksiyasının işə salınması zamanı FPGA Menecerini qeyd edir; sizdən FPGA_FME_PORT_PR ioctl aldıqdan sonra o, verilmiş Porta bit axınının qismən yenidən konfiqurasiyasını tamamlamaq üçün FPGA Manager-dən ümumi interfeys funksiyasını işə salır.
  • Virtuallaşdırma üçün portun idarə edilməsi. FME sürücüsü iki ioctl təqdim edir, FPGA_FME_PORT_RELEASE, verilmiş Portu PF-dən buraxır; və Portu yenidən PF-yə təyin edən FPGA_FME_PORT_ASSIGN. Port PF-dən buraxıldıqdan sonra, PCIe sürücüsü tərəfindən təmin edilən SR-IOV interfeysləri vasitəsilə VF-yə təyin edilə bilər. Əlavə məlumat üçün “FPGA Virtualizasiyası”na baxın.

FME Platforma Modulu Cihaz Sürücü Funksiyaları

  • FME simvol cihaz node yaradır.
  • FME sysfs yaradır files və FME sistemlərini həyata keçirir file aksesuarlar.
  • FME özəl funksiya alt sürücülərini həyata keçirir.
  • FME özəl xüsusiyyət alt sürücüləri:
    • FME Başlığı
    • Termal İdarəetmə
    • Güc İdarəetmə
    • Qlobal Səhv
    • Qismən yenidən konfiqurasiya
    • Qlobal Performans

Port Platforma Modul Cihaz Sürücüsü
FME drayverinə bənzər olaraq, Port platforma cihazı yaradıldıqdan sonra FPGA Port (və AFU) sürücüsü (intel-fpga-afu. ko) yoxlanılır. Bu modulun əsas funksiyası Portda əsas sıfırlama nəzarəti, AFU MMIO regionunun ixracı, DMA bufer xəritələşdirilməsi xidməti, UMsg(1) bildirişi və uzaqdan sazlama funksiyaları daxil olmaqla fərdi sürətləndiricilərə daxil olmaq üçün istifadəçi məkanı proqramları üçün interfeys təmin etməkdir. yuxarıya baxın).

UMsg yalnız İnteqrasiya edilmiş FPGA ilə Intel Xeon® Prosessoru üçün Sürətləndirmə Stack vasitəsilə dəstəklənir.

Port Platforma Modulu Cihaz Sürücüsü Funksiyaları

  • Port simvolu cihaz qovşağını yaradır.
  • Port sysfs yaradır files və Port sysfs tətbiq edir file aksesuarlar.
  • Port özəl xüsusiyyət alt sürücülərini həyata keçirir.
  • Port özəl xüsusiyyət alt sürücüləri:
    • Port başlığı
    • AFU
    • Port xətası
    • UMsg(2)
    • Siqnal vurun

Tətbiq FPGA Cihaz Sadalanması
Bu bölmə proqramların FPGA cihazını /sys/class/fpga altında sysfs iyerarxiyasından necə sıraladığını təqdim edir. KeçmişdəampAşağıda, hostda iki Intel FPGA cihazı quraşdırılmışdır. Hər bir FPGA cihazında bir FME və iki Port (AFU) var. Hər bir FPGA cihazı üçün /sys/class/fpga altında cihaz kataloqu yaradılır:

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

Hər bir node uşaq qurğular kimi bir FME və iki Porta (AFU) malikdir:
/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

Ümumiyyətlə, FME/Port sysfs interfeysləri aşağıdakı kimi adlandırılır:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

I ardıcıl olaraq bütün konteyner cihazlarını nömrələyirəm, j ardıcıl olaraq FME-ləri nömrələyirəm və k ardıcıl olaraq bütün Portları nömrələyirəm.

ioctl() və mmap() üçün istifadə olunan cihaz qovşaqlarına aşağıdakılar vasitəsilə istinad edilə bilər:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe Sürücü Sadalanması
Bu bölmə son həddini verirview intel-fpga-pci.ko tərəfindən həyata keçirilən cihazın siyahıya alınması üçün kod axınının. Əsas məlumat strukturları və funksiyaları vurğulanır. Bu bölmə ən yaxşı zaman izlənilir viewmüşayiət olunan mənbə kodunu (pcie.c) daxil edin.

Sadalanma məlumat strukturları

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statik struktur idr fpga_ids[FPGA_ID_MAX];
struktur fpga_chardev_info {
const char *ad;
dev_t devt;
};
struktur fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statik struktur sinfi *fpga_class;
statik quruluş 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,}
};
statik quruluş 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;
struktur cihazı *fme_dev;
struct mutex kilidi;
struct list_head port_dev_list;
int buraxılmış_port_num;
struct list_head regionları;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
etibarsız __iomem *ioaddr;
etibarsız __iomem *ioend;
int cari_bar;
etibarsız __iomem *pfme_hdr;
struktur cihazı *parent_dev;
struct platform_device *feature_dev;
};

Sadalama axını

  • ccidrv_init()
    • idr_init() istifadə edərək fpga_idləri işə salın.
    • alloc_chrdev_region() istifadə edərək fpga_chrdevs[i].devt-i işə salın.
    • class_create() istifadə edərək fpga_class-ı işə salın.
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • PCI cihazını aktivləşdirin, onun regionlarına giriş tələb edin, PCI master rejimini təyin edin və DMA-nı konfiqurasiya edin.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • build_feature_devs_info strukturunu ayırın, onu işə salın.
      .parent_dev FME və Port sysfs qovluqlarını ehtiva edən ana sysfs kataloquna (intel-fpga-dev.id) təyin edilib.
  • parse_feature_list()
    • FME, Port və onların şəxsi xüsusiyyətlərini kəşf etmək üçün BAR0 Cihaz Xüsusiyyətlər Siyahısını gəzin.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • FME ilə qarşılaşdıqda:
  • build_info_create_dev()
    • build_feature_devs_info.feature_dev-də saxlayaraq FME üçün platforma cihazı ayırın.
    • Feature_dev.id idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent build_feature_devs_info.parent_dev olaraq təyin edilib.
    • Feature_dev.resource-da struktur resursları massivini ayırın.
  • Feature_platform_data strukturunu ayırın, onu işə salın və göstəricini feature_dev.dev.platform_data-da saxlayın
    • create_feature_instance() build_info_add_sub_feature()
    • Feature_dev.resource[FME_FEATURE_ID_HEADER] işə salın.
    • xüsusiyyət_platforma_data_add()
    • Feature_platform_data.features[FME_FEATURE_ID_HEADER], .fopsdan başqa hər şeyi işə salın.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Limanla qarşılaşdıqda:
  • build_info_create_dev()
    • build_feature_devs_info.feature_dev-də saxlayaraq Port üçün platforma cihazı ayırın.
    • feature_dev.id idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent build_feature_devs_info.parent_dev olaraq təyin edilib.
    • Feature_dev.resource-da struktur resurs massivini ayırın.
    • Feature_platform_data strukturunu ayırın, onu işə salın və göstəricini feature_dev.dev.platform_data-da saxlayın
  • build_info_commit_dev()
    • struct cci_drvdata.port_dev_list-də Portlar siyahısına Port üçün struct feature_platform_data.node əlavə edin.
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[PORT_FEATURE_ID_HEADER]-ni işə salın.
  • xüsusiyyət_platforma_data_add()
    • Feature_platform_data.features[PORT_FEATURE_ID_HEADER], .fopsdan başqa hər şeyi işə salın.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • AFU ilə qarşılaşdıqda:
  • create_feature_instance() build_info_add_sub_feature()
    • Feature_dev.resource[PORT_FEATURE_ID_UAFU] işə salın.
  • xüsusiyyət_platforma_data_add()
    • Feature_platform_data.features[PORT_FEATURE_ID_UAFU], .fops istisna olmaqla hər şeyi işə salın.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • FME özəl xüsusiyyəti ilə qarşılaşdıqda:
  • create_feature_instance() build_info_add_sub_feature()
    • Feature_dev.resource[id]-ni işə salın.
  • xüsusiyyət_platforma_data_add()
    • Feature_platform_data.features[id], .fopsdan başqa hər şeyi işə salın.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Port özəl xüsusiyyəti ilə qarşılaşdıqda: * create_feature_instance() build_info_add_sub_feature() * Feature_dev.resource[id]-ni işə salın. * feature_platform_data_add() Features_platform_data.features[id], .fopsdan başqa hər şeyi işə salın.
  • parse_ports_from_fme()
    • Sürücü Fiziki Funksiyaya (PF) yüklənibsə, onda:
  • FME başlığında təsvir olunan hər bir portda parse_feature_list() axınını işə salın.
  • Başlıqdakı hər Port girişində qeyd olunan BAR-dan istifadə edin.

FME Platforma Cihazının Başlanması
Bu bölmə son həddini verirview intel-fpga-fme.ko tərəfindən həyata keçirilən FME cihazının işə salınması üçün kod axınının. Əsas məlumat strukturları və funksiyaları vurğulanır. Bu bölmə ən yaxşı zaman izlənilir viewmüşayiət olunan mənbə kodu (fme-main.c).

FME Platforması Cihaz Məlumat Strukturları

struktur xüsusiyyət_ops {
int (*init)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət);
int (*uinit)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət);
uzun (*ioctl)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət);
};
struktur xüsusiyyəti {
const char *ad;
int resource_index;
etibarsız __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex kilidi;
imzasız uzun dev_status;
struct cdev cdev;
struct platform_device *dev;
imzasız int disable_count;
void *özəl;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*uyğunluq)(struct platform_device *, void *)); struktur
xüsusiyyət xüsusiyyətləri[0];
};
struct perf_object {
sən əl;
const struct atribut_qrupu **attr_qrupları;
struktur cihazı *fme_dev;
struct list_head node;
struct list_head uşaqları;
struct kobject kobj;
};
struktur fpga_fme {
u8 port_id;
u64 pr_err;
struktur cihazı *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME Platforma Qurğunun İnsializasiya axını

FME başlatma axınıintel-OPAE-FPGA-Linux-Cihaz-Sürücü-Arxitektura-şəkil- (4)

  • fme_probe() fme_dev_init()
    • fpga_fme strukturunu işə salın və onu feature_platform_data.private sahəsində saxlayın.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Hər bir doldurulmuş funksiya üçün xüsusiyyət_ops strukturunu Feature_platform_data.features-də yadda saxlayın.
    • Əgər varsa, strukturdan test funksiyasını çağırın.
    • Strukturdan init funksiyasını çağırın.
  • fme_probe() fpga_register_dev_ops()
    • Strukturu qeyd edərək FME simvol cihaz qovşağını yaradın file_əməliyyatlar.

Port Platforma Cihazının Başlanması
Bu bölmə son həddini verirview intel-fpga-afu.ko tərəfindən həyata keçirilən port cihazının işə salınması üçün kod axını. Əsas məlumat strukturları və funksiyaları vurğulanır. Bu bölmə ən yaxşı zaman izlənilir viewmüşayiət olunan mənbə kodunu (afu.c).

Port Platforma Cihazı Məlumat Strukturları

struktur xüsusiyyət_ops {
int (*init)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət);
int (*uinit)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət);
uzun (*ioctl)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struktur xüsusiyyəti *xüsusiyyət);
};
struktur xüsusiyyəti {
const char *ad;
int resource_index;
etibarsız __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex kilidi;
imzasız uzun dev_status;
struct cdev cdev;
struct platform_device *dev;
imzasız int disable_count;
void *özəl;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*uyğunluq)(struct platform_device *, void *));
struktur xüsusiyyətləri xüsusiyyətləri[0];
};
struktur fpga_afu_region {
u32 indeksi;
u32 bayraqları;
u64 ölçüsü;
u64 ofset;
u64 fiziki;
struct list_head node;
};
struktur fpga_afu_dma_region {
u64 user_addr;
u64 uzunluğu;
u64 iova;
struktur səhifə **səhifələr;
struct rb_node node;
bool in_use;
};
struktur fpga_afu {
u64 region_cur_offset;
int_regions;
u8 ədəd_ums;
struct list_head regionları;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Port Platforma Cihazının İnsializasiya axını

Port Başlatma axınıintel-OPAE-FPGA-Linux-Cihaz-Sürücü-Arxitektura-şəkil- (5)

  • afu_probe() afu_dev_init()
    • Fpga_afu strukturunu işə salın və onu feature_platform_data.private sahəsində saxlayın.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Hər bir doldurulmuş funksiya üçün xüsusiyyət_ops strukturunu Feature_platform_data.features-də yadda saxlayın.
    • Əgər varsa, strukturdan test funksiyasını çağırın.
    • Strukturdan init funksiyasını çağırın.
  • afu_probe() fpga_register_dev_ops()
    • Strukturu qeydiyyatdan keçirərək Port simvolu cihaz qovşağını yaradın file_əməliyyatlar.

FME IOCTLs
Açıq çağırılan IOCTL-lər file /dev/intel-fpga-fme.j üçün deskriptor FPGA_GET_API_VERSION—cari versiyanı 0-dan başlayaraq tam ədəd kimi qaytarın.

FPGA_CHECK_EXTENSION—hazırda dəstəklənmir.

FPGA_FME_PORT_RELEASE—arg bir göstəricidir:

struktur fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 bayraqlar; // in: 0 olmalıdır
__u32 port_id; // in: buraxılış üçün port ID (0-dan).
};

FPGA_FME_PORT_ASSIGN—arg bir göstəricidir:

struktur fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 bayraqlar; // in: 0 olmalıdır
__u32 port_id; // in: təyin etmək üçün port ID (0-dan). (olmalıdır
əvvəllər FPGA_FME_PORT_RELEASE tərəfindən buraxılmışdır)
};

FPGA_FME_PORT_PR—arg bir göstəricidir:

struktur fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 bayraqlar; // in: 0 olmalıdır
__u32 port_id; // in: port ID (0-dan)
__u32 bufer_ölçüsü; // in: bit axını buferinin baytlarda ölçüsü. 4 bayt olmalıdır
düzülüb.
__u64 bufer_ünvanı; // in: bit axını buferinin proses ünvanı
__u64 statusu; // çıxdı: xəta statusu (bit maskası)
};

Port IOCTLs
Açıq çağırılan IOCTL-lər file /dev/intel-fpga-port.k üçün deskriptor FPGA_GET_API_VERSION—cari versiyanı 0-dan başlayaraq tam ədəd kimi qaytarın. FPGA_CHECK_EXTENSION—hazırda dəstəklənmir.

FPGA_PORT_GET_INFO—arg bir göstəricidir:

struktur fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 bayraqlar; // out: 0 qaytarır
__u32 bölgələrin sayı; // çıxdı: MMIO bölgələrinin sayı, 2 (AFU üçün 1 və
STP)
__u32 ədəd_ums; // out: hardware tərəfindən dəstəklənən UMsg sayı
};

FPGA_PORT_GET_REGION_INFO—arg bir göstəricidir:

struktur fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 bayraqlar; // çıxış: (bit maskası) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeksi; //: FPGA_PORT_INDEX_UAFU və ya FPGA_PORT_INDEX_STP
__u32 dolgu; // in: 0 olmalıdır
__u64 ölçüsü; // out: baytlarda MMIO bölgəsinin ölçüsü
__u64 ofset; // out: cihazın başlanğıcından MMIO bölgəsinin ofseti fd
};

FPGA_PORT_DMA_MAP—arg bir göstəricidir:
struktur fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 bayraqlar; // in: 0 olmalıdır __u64 user_addr; // in: proses virtual
ünvanı. Səhifə düzülməlidir.
__u64 uzunluq; // in: baytlarda xəritələmə uzunluğu. Çoxsaylı səhifə olmalıdır
ölçüsü.
__u64 iova; // çıxdı: IO virtual ünvanı };

FPGA_PORT_DMA_UNMAP—arg bir göstəricidir:
struktur fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 bayraqlar; // in: 0 olmalıdır
__u64 iova; // in: əvvəlki tərəfindən qaytarılan IO virtual ünvanı
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg NULL olmalıdır.
  • FPGA_PORT_UMSG_ENABLE—arg NULL olmalıdır.
  • FPGA_PORT_UMSG_DISABLE—args NULL olmalıdır.

FPGA_PORT_UMSG_SET_MODE—arg bir göstəricidir:

struktur fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 bayraqlar; // in: 0 olmalıdır
__u32 hint_bitmap; // in: UMsg işarə rejimi bitmapı. UMsg-nin hansı olduğunu bildirir
aktivləşdirildi.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • Bu ioctl-i verməzdən əvvəl UMsg deaktiv edilməlidir.
  • iova sahəsi bütün UMsg (num_umsgs * PAGE_SIZE) üçün kifayət qədər böyük bufer üçün olmalıdır.
    • Bufer sürücünün bufer rəhbərliyi tərəfindən “istifadədə” kimi qeyd olunur.
    • iova NULL olarsa, hər hansı əvvəlki bölgə "istifadədə" kimi işarələnmir.
  • arg a üçün göstəricidir:
    struktur fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • u32 bayraqları; // in: 0 olmalıdır
    • u64 iova; // in: FPGA_PORT_DMA_MAP-dən IO virtual ünvanı. };

Qeyd:

  • Port xətalarını təmizləmək üçün cari xətaların dəqiq bit maskasını yazmalısınız, məsələnample, pişik səhvləri > aydın
  • UMsg yalnız İnteqrasiya edilmiş FPGA ilə Intel Xeon Prosessoru üçün Sürətləndirmə Stack vasitəsilə dəstəklənir.

sysfs Files

FME Başlıq sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file mmio sahəsi növü giriş
portların_num fme_header.capability.num_ports ondalık int Yalnız oxumaq üçün
cache_size fme_header.capability.cache_size ondalık int Yalnız oxumaq üçün
versiya fme_header.capability.fabric_verid ondalık int Yalnız oxumaq üçün
socket_id fme_header.capability.socket_id ondalık int Yalnız oxumaq üçün
bit axını_id fme_header.bitstream_id hex uint64_t Yalnız oxumaq üçün
bit axını_metadata fme_header.bitstream_md hex uint64_t Yalnız oxumaq üçün

FME Termal İdarəetmə sistemləri files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio sahəsi növü giriş
eşik 1 thermal.threshold.tmp_thshold1 ondalık int İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
eşik 2 thermal.threshold.tmp_thshold2 ondalık int İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
eşik_səfəri thermal.threshold.therm_trip_thshold ondalık int Yalnız oxumaq üçün
eşik1_çatıldı istilik.həddi.thshold1_status ondalık int Yalnız oxumaq üçün
eşik2_çatıldı istilik.həddi.thshold2_status ondalık int Yalnız oxumaq üçün
eşik1_siyasəti termal. eşik.həddi_siyasəti ondalık int İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
temperatur thermal.rdsensor_fm1.fpga_temp ondalık int Yalnız oxumaq üçün

FME Güc İdarəetmə sistemləri files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio sahəsi növü giriş
istehlak olunur güc.status.pwr_istehlak olunur hex uint64_t Yalnız oxumaq üçün
eşik 1 güc.həddi.ərəfəsində1 hex uint64_t İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
eşik 2 güc.həddi.ərəfəsində2 hex uint64_t İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
eşik1_status güc.həddi.ərəfəsində1_status ondalık işarəsiz Yalnız oxumaq üçün
eşik2_status güc.həddi.ərəfəsində2_status ondalık işarəsiz Yalnız oxumaq üçün
rtl power.status.fpga_latency_report ondalık işarəsiz Yalnız oxumaq üçün

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

sysfs file mmio sahəsi növü giriş
pcie0_errors gerror.pcie0_err hex uint64_t Oxumaq-yazmaq
pcie1_errors gerror.pcie1_err hex uint64_t Oxumaq-yazmaq
inject_error gerror.ras_error_inj hex uint64_t Oxumaq-yazmaq

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

sysfs file mmio sahəsi növü giriş
səhvlər gerror.fme_err hex uint64_t Yalnız oxumaq üçün
birinci_səhv gerror.fme_first_err.err_reg_status hex uint64_t Yalnız oxumaq üçün
sonrakı_səhv gerror.fme_next_err.err_reg_status hex uint64_t Yalnız oxumaq üçün
aydın Səhvləri təmizləyir, birinci_xəta, sonrakı_xəta müxtəlif uint64_t Yalnız yazın

Qeyd:
FME səhvlərini təmizləmək üçün cari səhvlərin dəqiq bit maskasını yazmalısınız, məsələnample pişik səhvləri > aydın.

FME qismən yenidən konfiqurasiya sistemləri files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio sahəsi növü giriş
interfeys_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16 bayt Yalnız oxumaq üçün

FME Qlobal Performans sistemləri files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file mmio sahəsi növü giriş
saat gperf.clk.afu_interf_clock hex uint64_t Yalnız oxumaq üçün

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGA ilə Intel Xeon CPU üçün Sürətləndirmə Yığması üçün etibarlı deyil)

sysfs file mmio sahəsi növü giriş
dondurmaq gperf.ch_ctl.freeze ondalık int Oxumaq-yazmaq
oxu_vur gperf.CACHE_RD_HIT hex uint64_t Yalnız oxumaq üçün
oxumaq_qaçırmaq gperf.CACHE_RD_MISS hex uint64_t Yalnız oxumaq üçün
yaz_vur gperf.CACHE_WR_HIT hex uint64_t Yalnız oxumaq üçün
yaz_miss gperf.CACHE_WR_MISS hex uint64_t Yalnız oxumaq üçün
tutma_istək gperf.CACHE_HOLD_REQ hex uint64_t Yalnız oxumaq üçün
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Yalnız oxumaq üçün
sysfs file mmio sahəsi növü giriş
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Yalnız oxumaq üçün
data_write_port_content gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Yalnız oxumaq üçün
tag_port_mübahisəsi yazın gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Yalnız oxumaq üçün

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGA ilə Intel Xeon CPU üçün Sürətləndirmə Yığması üçün keçərli deyil)

sysfs file mmio sahəsi növü giriş
dondurmaq gperf.vtd_ctl.freeze ondalık int İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA ilə Intel Xeon CPU üçün Sürətləndirmə Yığması üçün etibarlı deyil)

sysfs file mmio sahəsi növü giriş
oxunan_tranzaksiya gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Yalnız oxumaq üçün
yazma_əməliyyatı gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Yalnız oxumaq üçün
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Yalnız oxumaq üçün
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Yalnız oxumaq üçün

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

sysfs file mmio sahəsi növü giriş
aktivləşdirin gperf.fab_ctl.(aktivdir) ondalık int İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
dondurmaq gperf.fab_ctl.freeze ondalık int İstifadəçi: Yalnız oxumaq üçün Kök: Oxumaq-yazmaq
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Yalnız oxumaq üçün
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Yalnız oxumaq üçün
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Yalnız oxumaq üçün
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Yalnız oxumaq üçün
upi_oxu gperf.FAB_UPI_RD hex uint64_t Yalnız oxumaq üçün
upi_write gperf.FAB_UPI_WR hex uint64_t Yalnız oxumaq üçün

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

sysfs file mmio sahəsi növü giriş
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Yalnız oxumaq üçün
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Yalnız oxumaq üçün
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Yalnız oxumaq üçün
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Yalnız oxumaq üçün
upi_oxu gperf.FAB_UPI_RD hex uint64_t Yalnız oxumaq üçün
upi_write gperf.FAB_UPI_WR hex uint64_t Yalnız oxumaq üçün

Port başlığı sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio sahəsi növü giriş
id port_header.capability.port_number ondalık int Yalnız oxumaq üçün
ltr port_header.control.latency_tolerance ondalık int Yalnız oxumaq üçün

Port AFU Başlıq sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio sahəsi növü giriş
afu_id afu_header.guid hex 16 bayt Yalnız oxumaq üçün

Port xətası sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio sahəsi növü giriş
səhvlər perror.port_error hex uint64_t Yalnız oxumaq üçün
birinci_səhv perror.port_first_error hex uint64_t Yalnız oxumaq üçün
birinci_səhv_tələb perror.malreq hex 16 bayt Yalnız oxumaq üçün
aydın səhv.(bütün səhvlər) müxtəlif uint64_t Yalnız yazın

Qeyd:
Port xətalarını təmizləmək üçün cari xətaların dəqiq bit maskasını yazmalısınız, məsələnample pişik səhvləri > aydın.

Təftiş Tarixçəsi

Sənəd versiyası Dəyişikliklər
2017.10.02 İlkin Buraxılış.

OPAE Intel FPGA Linux Device Driver Arxitektura Bələdçisi

Sənədlər / Resurslar

intel OPAE FPGA Linux Device Driver Architecture [pdf] İstifadəçi təlimatı
OPAE FPGA Linux Cihaz Sürücüsü Arxitekturası, OPAE FPGA, Linux Cihaz Sürücüsü Memarlığı, Sürücü Memarlığı, Memarlıq

İstinadlar

Şərh buraxın

E-poçt ünvanınız dərc olunmayacaq. Tələb olunan sahələr qeyd olunub *