intel OPAE FPGA Linux Device Driver Architecture
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ı
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ı
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ı:
- Sürücünü qonaqdan boşaltın
- VF-ni qonaqdan ayırın
- SR-IOV-ni söndürün
- Qismən yenidən konfiqurasiya edin
- SR-IOV-ni aktivləşdirin
- VF-ni qonağa qoşun
- 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:
- 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.
- 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
- VF-lərdən VM-lərə keçin.
- 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ı
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.
- build_feature_devs_info strukturunu ayırın, onu işə salın.
- 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ı
- 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ı
- 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 |