intel OPAE FPGA Linux Aygıt Sürücüsü Mimarisi
OPAE Intel FPGA Linux Aygıt Sürücüsü Mimarisi
OPAE Intel FPGA sürücüsü, Intel FPGA çözümleriyle donatılmış platformlarda FPGA hızlandırıcılarını yapılandırmak, numaralandırmak, açmak ve bunlara erişmek için kullanıcı alanı uygulamalarına yönelik arabirimler sağlar ve FPGA yeniden yapılandırması, güç yönetimi ve sanallaştırma gibi sistem düzeyinde yönetim işlevlerine olanak tanır.
Donanım Mimarisi
İşletim sistemi açısından viewFPGA donanımı normal bir PCIe cihazı gibi görünür. FPGA cihaz belleği, önceden tanımlanmış bir veri yapısı (Cihaz Özellik Listesi) kullanılarak düzenlenir. FPGA cihazı tarafından desteklenen özellikler, aşağıdaki şekilde gösterildiği gibi bu veri yapıları aracılığıyla gösterilmektedir:
FPGA PCIe Cihazı
Sürücü, sanal makinelere bireysel hızlandırıcılar atamak için kullanılabilecek Sanal İşlevler (VF'ler) oluşturmak için PCIe SR-IOV'yi destekler.
Intel Kurumu. Tüm hakları Saklıdır. Intel, Intel logosu ve diğer Intel markaları, Intel Corporation'ın veya yan kuruluşlarının ticari markalarıdır. Intel, FPGA ve yarı iletken ürünlerinin performansını Intel'in standart garantisine uygun olarak mevcut spesifikasyonlara göre garanti eder, ancak herhangi bir zamanda önceden bildirimde bulunmaksızın herhangi bir ürün ve hizmette değişiklik yapma hakkını saklı tutar. Intel, Intel tarafından yazılı olarak açıkça kabul edilmedikçe, burada açıklanan herhangi bir bilgi, ürün veya hizmetin uygulanmasından veya kullanılmasından kaynaklanan hiçbir sorumluluk veya yükümlülük kabul etmez. Intel müşterilerine, yayınlanan herhangi bir bilgiye güvenmeden ve ürün ya da hizmet siparişi vermeden önce aygıt özelliklerinin en son sürümünü edinmeleri önerilir.
Diğer isimler ve markalar başkalarının malı olarak iddia edilebilir.
Sanallaştırılmış FPGA PCIe Cihazı
FPGA Yönetim Motoru (FME)
FPGA Yönetim Motoru, güç ve termal yönetimi, hata raporlamayı, yeniden yapılandırmayı, performans raporlamayı ve diğer altyapı işlevlerini gerçekleştirir. Her FPGA, her zaman Fiziksel İşlev (PF) aracılığıyla erişilen bir FME'ye sahiptir. Kullanıcı alanı uygulamaları, open() kullanarak FME'ye özel erişim elde edebilir ve ayrıcalıklı bir kullanıcı (root) olarak close() kullanarak onu serbest bırakabilir.
Liman
Bağlantı Noktası, statik FPGA yapısı ("FPGA Arayüz Yöneticisi (FIM)") ile Hızlandırıcı İşlevi (AF) içeren kısmen yeniden yapılandırılabilir bir bölge arasındaki arayüzü temsil eder. Bağlantı Noktası, yazılımdan hızlandırıcıya olan iletişimi kontrol eder ve sıfırlama ve hata ayıklama gibi özellikleri ortaya çıkarır. Bir PCIe cihazının birden fazla Bağlantı Noktası olabilir ve her Bağlantı Noktası, FME cihazındaki FPGA_FME_PORT_ASSIGN ioctl kullanılarak atanarak bir VF aracılığıyla kullanıma sunulabilir.
Hızlandırıcı Fonksiyonu (AF) Birimi
- Bir Bağlantı Noktasına bir Hızlandırıcı İşlev (AF) Birimi takılır ve hızlandırıcıya özel kontrol kayıtları için kullanılacak 256K MMIO bölgesini açığa çıkarır.
- Kullanıcı alanı uygulamaları, Bağlantı Noktası aygıtındaki open() işlevini kullanarak bir Bağlantı Noktasına bağlı bir AFU'ya özel erişim elde edebilir ve bunu close() kullanarak serbest bırakabilir.
- Kullanıcı alanı uygulamaları aynı zamanda mmap() hızlandırıcı MMIO bölgelerini de kullanabilir.
Kısmi Yeniden Yapılandırma
Yukarıda belirtildiği gibi, hızlandırıcılar, Hızlandırıcı İşlevinin (AF) kısmen yeniden yapılandırılması yoluyla yeniden yapılandırılabilir. file. Hızlandırıcı Fonksiyonu (AF), FPGA'nın tam FIM'i ve hedeflenen statik bölgesi (Port) için oluşturulmuş olmalıdır; aksi takdirde yeniden yapılandırma işlemi başarısız olur ve muhtemelen sistemin kararsız olmasına neden olur. Bu uyumluluk, AF başlığında belirtilen arayüz kimliğinin sysfs aracılığıyla FME tarafından sunulan arayüz kimliğiyle karşılaştırılmasıyla kontrol edilebilir. Bu kontrol genellikle yeniden yapılandırma IOCTL'si çağrılmadan önce kullanıcı alanı tarafından yapılır.
Not:
Şu anda, sanallaştırılmış bir ana bilgisayarda çalışanlar da dahil olmak üzere FPGA'ye erişen herhangi bir yazılım programının, kısmi yeniden yapılandırma girişiminde bulunulmadan önce kapatılması gerekir. Adımlar şöyle olacaktır:
- Sürücüyü misafirden kaldırın
- VF'yi konuktan çıkarın
- SR-IOV'yi devre dışı bırak
- Kısmi yeniden yapılandırma gerçekleştirin
- SR-IOV'yi etkinleştir
- VF'yi misafire takın
- Sürücüyü misafire yükleyin
FPGA Sanallaştırma
Bir VM'de çalışan uygulamalardan bir hızlandırıcıya erişimi etkinleştirmek için ilgili AFU bağlantı noktasının aşağıdaki adımlar kullanılarak bir VF'ye atanması gerekir:
- PF, varsayılan olarak tüm AFU bağlantı noktalarının sahibidir. Bir VF'ye yeniden atanması gereken herhangi bir bağlantı noktasının öncelikle FME cihazındaki FPGA_FME_PORT_RELEASE ioctl aracılığıyla PF'den serbest bırakılması gerekir.
- N bağlantı noktası PF'den serbest bırakıldığında, SRIOV ve VF'leri etkinleştirmek için aşağıdaki komut kullanılabilir. Her VF, AFU'lu yalnızca bir bağlantı noktasına sahiptir. echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF'lerden VM'lere geçin.
- VF altındaki AFU'ya VM'deki uygulamalardan erişilebilir (VF içindeki aynı sürücüyü kullanarak).
Not:
Bir FME, bir VF'ye atanamaz, dolayısıyla PR ve diğer yönetim işlevleri yalnızca PF aracılığıyla kullanılabilir.
Sürücü Organizasyonu
PCIe Modülü Aygıt Sürücüsü
Sürücü Organizasyonu
FPGA cihazları normal PCIe cihazları gibi görünür; bu nedenle, bir FPGA PCIe PF veya VF algılandığında her zaman ilk olarak FPGA PCIe aygıt sürücüsü (intel-FPGA-PCI.ko) yüklenir. Bu sürücü, sürücü mimarisinde altyapısal bir rol oynar. BT:
- Özellik cihazlarının üst öğesi olarak bir FPGA kapsayıcı cihazı oluşturur.
- Özellik aygıtlarını ve bunların alt özelliklerini keşfetmek ve konteyner aygıtı altında bunlar için platform aygıtları oluşturmak için PCIe aygıt BAR belleğinde uygulanan Aygıt Özellik Listesinde gezinir.
- SR-IOV'yi destekler.
- Alt özelliklere ilişkin işlemleri özetleyen ve ortak işlevleri özellikli aygıt sürücülerine sunan özellikli aygıt altyapısını tanıtır.
PCIe Modülü Aygıt Sürücüsü İşlevleri
- PCIe keşfini, cihaz numaralandırmasını ve özellik keşfini içerir.
- Ana cihaz, FPGA Yönetim Motoru (FME) ve Bağlantı Noktası için sysfs dizinleri oluşturur.
- Platform sürücüsü örneklerini oluşturarak Linux çekirdeğinin ilgili platform modülü sürücülerini yüklemesine neden olur.
FME Platform Modülü Aygıt Sürücüsü
- Güç ve termal yönetim, hata raporlama, performans raporlama ve diğer altyapı fonksiyonları. Bu işlevlere FME sürücüsünün sunduğu sysfs arayüzleri aracılığıyla erişebilirsiniz.
- Kısmi Yeniden Yapılandırma. FME sürücüsü, PR alt özelliğinin başlatılması sırasında bir FPGA Yöneticisini kaydeder; Sizden bir FPGA_FME_PORT_PR ioctl aldığında, veri akışının verilen Bağlantı Noktasına kısmi yeniden yapılandırılmasını tamamlamak için FPGA Yöneticisinden ortak arayüz işlevini çağırır.
- Sanallaştırma için bağlantı noktası yönetimi. FME sürücüsü, verilen Bağlantı Noktasını PF'den serbest bırakan FPGA_FME_PORT_RELEASE adında iki ioctl sunar; ve Bağlantı Noktasını tekrar PF'ye atayan FPGA_FME_PORT_ASSIGN. Bağlantı Noktası PF'den serbest bırakıldığında, PCIe sürücüsü tarafından sağlanan SR-IOV arayüzleri aracılığıyla VF'ye atanabilir. Daha fazla bilgi için “FPGA Sanallaştırma” konusuna bakın.
FME Platform Modülü Aygıt Sürücüsü İşlevleri
- FME karakter aygıt düğümünü oluşturur.
- FME sysfs'yi oluşturur fileFME sysf'lerini uygular ve uygular file erişimciler.
- FME özel özellik alt sürücülerini uygular.
- FME özel özellik alt sürücüleri:
- FME Başlığı
- Isı Yönetimi
- Güç Yönetimi
- Genel Hata
- Kısmi Yeniden Yapılandırma
- Küresel Performans
Bağlantı Noktası Platform Modülü Aygıt Sürücüsü
FME sürücüsüne benzer şekilde, FPGA Bağlantı Noktası (ve AFU) sürücüsü (intel-fpga-afu.ko), Bağlantı Noktası platform cihazı oluşturulduktan sonra incelenir. Bu modülün ana işlevi, Bağlantı Noktasında temel sıfırlama kontrolü, AFU MMIO bölgesi dışa aktarma, DMA arabellek eşleme hizmeti, UMsg(1) bildirimi ve uzaktan hata ayıklama işlevleri dahil olmak üzere kullanıcı alanı uygulamalarının bireysel hızlandırıcılara erişmesi için bir arayüz sağlamaktır ( yukarıyı görmek).
UMsg yalnızca Entegre FPGA'lı Intel Xeon® İşlemci için Hızlandırma Yığını aracılığıyla desteklenir.
Bağlantı Noktası Platform Modülü Aygıt Sürücüsü İşlevleri
- Bağlantı noktası karakteri aygıt düğümünü oluşturur.
- Port sysfs'yi oluşturur filePort sysfs'yi uygular ve uygular file erişimciler.
- Bağlantı Noktası özel özelliği alt sürücülerini uygular.
- Bağlantı noktası özel özelliği alt sürücüleri:
- Bağlantı Noktası Başlığı
- AFU
- Bağlantı Noktası Hatası
- UMsg(2)
- Sinyal Dokunma
Uygulama FPGA Cihaz Numaralandırması
Bu bölümde uygulamaların /sys/class/fpga altındaki sysfs hiyerarşisinden FPGA cihazını nasıl numaralandırdığı anlatılmaktadır. eski sevgilideampAşağıdaki dosyada, ana bilgisayara iki Intel FPGA cihazı kuruludur. Her FPGA cihazında bir FME ve iki Bağlantı Noktası (AFU) bulunur. Her FPGA cihazı için /sys/class/fpga altında bir cihaz dizini oluşturulur:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Her düğümde alt aygıt olarak bir FME ve iki Bağlantı Noktası (AFU) bulunur:
/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
Genel olarak FME/Port sysfs arayüzleri şu şekilde 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ışık olarak tüm konteyner cihazlarını numaralandırıyor, j ardışık olarak FME'leri numaralandırıyor ve k ardışık olarak tüm Bağlantı Noktalarını numaralandırıyor.
ioctl() ve mmap() için kullanılan aygıt düğümlerine şu yollarla başvurulabilir:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe Sürücü Numaralandırması
Bu bölüm fazla verirview intel-fpga-pci.ko tarafından gerçekleştirilen cihaz numaralandırması için kod akışı. Ana veri yapıları ve işlevleri vurgulanmıştır. Bu bölüm aşağıdaki durumlarda en iyi şekilde takip edilir: viewEkteki kaynak kodunu (pcie.c) kullanarak.
Numaralandırma Veri Yapıları
numaralandırma fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statik yapı kimliği fpga_ids[FPGA_ID_MAX];
yapı fpga_chardev_info {
const karakter *isim;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statik yapı sınıfı *fpga_class;
statik yapı 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 yapı 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
};
yapı cci_drvdata {
int cihaz_kimliği;
yapı aygıtı *fme_dev;
yapı muteks kilidi;
struct list_head port_dev_list;
int yayımlanan_port_num;
struct list_head bölgeleri;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int geçerli_bar;
void __iomem *pfme_hdr;
yapı aygıtı *parent_dev;
struct platform_device *feature_dev;
};
Numaralandırma Akışı
- ccidrv_init()
- idr_init()'i kullanarak fpga_ids'i başlatın.
- alloc_chrdev_region()'u kullanarak fpga_chrdevs[i].devt'yi başlatın.
- fpga_class'ı class_create() kullanarak başlatın.
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- PCI aygıtını etkinleştirin, bölgelerine erişim isteyin, PCI ana modunu ayarlayın ve DMA'yı yapılandırın.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Bir yapı build_feature_devs_info tahsis edin, başlatın.
.parent_dev, FME ve Port sysfs dizinlerini içeren bir üst sysfs dizinine (intel-fpga-dev.id) ayarlanır.
- Bir yapı build_feature_devs_info tahsis edin, başlatın.
- parse_feature_list()
- FME'yi, Bağlantı Noktasını ve bunların özel özelliklerini keşfetmek için BAR0 Cihaz Özellik Listesini inceleyin.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Bir FME ile karşılaşıldığında:
- build_info_create_dev()
- FME için build_feature_devs_info.feature_dev'de depolanan bir platform cihazı tahsis edin.
- feature_dev.id, idr_alloc(fpga_ids[FME_ID]) sonucuna göre başlatılır,
- feature_dev.parent, build_feature_devs_info.parent_dev olarak ayarlandı.
- feature_dev.resource'ta bir dizi yapı kaynağı tahsis edin.
- feature_platform_data yapısını ayırın, başlatın ve feature_dev.dev.platform_data'da bir işaretçi saklayın
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[FME_FEATURE_ID_HEADER]'ı başlatın.
- feature_platform_data_add()
- feature_platform_data.features[FME_FEATURE_ID_HEADER], .fops dışındaki her şeyi başlatın.
- parse_feature() parse_feature_afus() parse_feature_port()
- Bir Bağlantı Noktasıyla karşılaşıldığında:
- build_info_create_dev()
- Bağlantı noktası için build_feature_devs_info.feature_dev'de depolanan bir platform cihazı tahsis edin.
- feature_dev.id, idr_alloc(fpga_ids[PORT_ID]) sonucuna göre başlatıldı,
- feature_dev.parent, build_feature_devs_info.parent_dev olarak ayarlandı.
- feature_dev.resource'ta bir dizi yapı kaynağı tahsis edin.
- feature_platform_data yapısını ayırın, başlatın ve feature_dev.dev.platform_data'da bir işaretçi saklayın
- build_info_commit_dev()
- Bağlantı Noktası için struct feature_platform_data.node'u struct cci_drvdata.port_dev_list'teki Bağlantı Noktaları listesine ekleyin
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[PORT_FEATURE_ID_HEADER]'ı başlatın.
- feature_platform_data_add()
- feature_platform_data.features[PORT_FEATURE_ID_HEADER], .fops dışındaki her şeyi başlatın.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Bir AFU ile karşılaşıldığında:
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[PORT_FEATURE_ID_UAFU]'yu başlatın.
- feature_platform_data_add()
- feature_platform_data.features[PORT_FEATURE_ID_UAFU], .fops dışındaki her şeyi başlatın.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Bir FME özel özelliğiyle karşılaşıldığında:
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[id]'yi başlatın.
- feature_platform_data_add()
- feature_platform_data.features[id]'yi, .fops dışındaki her şeyi başlatın.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Bir Bağlantı Noktası özel özelliğiyle karşılaşıldığında: * create_feature_instance() build_info_add_sub_feature() * feature_dev.resource[id]'yi başlatın. * feature_platform_data_add() feature_platform_data.features[id]'yi, .fops dışındaki her şeyi başlatın.
- parse_ports_from_fme()
- Sürücü Fiziksel İşleve (PF) yüklenmişse, o zaman:
- FME başlığında açıklanan her bağlantı noktasında parse_feature_list() akışını çalıştırın.
- Başlıktaki her Bağlantı Noktası girişinde belirtilen BAR'ı kullanın.
FME Platform Cihazının Başlatılması
Bu bölüm fazla verirview intel-fpga-fme.ko tarafından gerçekleştirilen FME cihazının başlatılmasına yönelik kod akışının. Ana veri yapıları ve işlevleri vurgulanmıştır. Bu bölüm aşağıdaki durumlarda en iyi şekilde takip edilir: viewEkteki kaynak kodunu (fme-main.c) kullanarak.
FME Platformu Cihaz Veri Yapıları
struct feature_ops {
int (*init)(struct platform_device *pdev, struct özelliği *özellik);
int (*uinit)(struct platform_device *pdev, struct özelliği *özellik);
long (*ioctl)(struct platform_device *pdev, struct özelliği *özellik,
imzasız int cmd, imzasız uzun arg);
int (*test)(struct platform_device *pdev, struct özelliği *özellik);
};
yapı özelliği {
const karakter *isim;
int kaynak_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head düğümü;
yapı muteks kilidi;
imzasız uzun dev_status;
struct cdev cdev;
struct platform_device *dev;
imzasız int devre dışı_sayımı;
geçersiz *özel;
int sayı;
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 *)); yapı
özellik özellikleri[0];
};
yapı perf_object {
int kimliği;
const struct nitelik_grubu **öznitelik_grupları;
yapı aygıtı *fme_dev;
struct list_head düğümü;
struct list_head çocukları;
yapı kobject kobj;
};
yapı fpga_fme {
u8 port_id;
u64 pr_err;
aygıt yapılandırması *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME Platform Cihazı Başlatma Akışı
FME Başlatma Akışı
- fme_probe() fme_dev_init()
- Bir fpga_fme yapısını başlatın ve onu feature_platform_data.private alanında saklayın.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Doldurulan her özellik için feature_platform_data.features içine bir feature_ops yapısını kaydedin.
- Varsa yapıdan test işlevini çağırın.
- Yapıdan init fonksiyonunu çağırın.
- fme_probe() fpga_register_dev_ops()
- Bir yapıyı kaydederek FME karakter aygıt düğümünü oluşturun file_operasyonlar.
Bağlantı Noktası Platformu Cihaz Başlatma
Bu bölüm fazla verirview intel-fpga-afu.ko tarafından gerçekleştirilen bağlantı noktası cihazının başlatılmasına yönelik kod akışının. Ana veri yapıları ve işlevleri vurgulanmıştır. Bu bölüm aşağıdaki durumlarda en iyi şekilde takip edilir: viewEkteki kaynak kodunu (afu.c) kullanarak.
Bağlantı Noktası Platformu Cihaz Veri Yapıları
struct feature_ops {
int (*init)(struct platform_device *pdev, struct özelliği *özellik);
int (*uinit)(struct platform_device *pdev, struct özelliği *özellik);
long (*ioctl)(struct platform_device *pdev, struct özelliği *özellik,
imzasız int cmd, imzasız uzun arg);
int (*test)(struct platform_device *pdev, struct özelliği *özellik);
};
yapı özelliği {
const karakter *isim;
int kaynak_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head düğümü;
yapı muteks kilidi;
imzasız uzun dev_status;
struct cdev cdev;
struct platform_device *dev;
imzasız int devre dışı_sayımı;
geçersiz *özel;
int sayı;
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 *));
yapı özelliği özellikleri[0];
};
struct fpga_afu_region {
u32 dizini;
u32 bayrakları;
u64 boyutu;
u64 ofset;
u64 fiziksel;
struct list_head düğümü;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 uzunluğu;
u64 iova;
yapı sayfası **sayfalar;
struct rb_node düğümü;
bool kullanımda;
};
yapı fpga_afu {
u64 bölge_cur_offset;
int sayı_bölgeler;
u8 num_umsgs;
struct list_head bölgeleri;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Bağlantı Noktası Platformu Cihaz Başlatma Akışı
Bağlantı Noktası Başlatma Akışı
- afu_probe() afu_dev_init()
- Bir fpga_afu yapısını başlatın ve feature_platform_data.private alanında saklayın.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Doldurulan her özellik için feature_platform_data.features içine bir feature_ops yapısını kaydedin.
- Varsa yapıdan test işlevini çağırın.
- Yapıdan init fonksiyonunu çağırın.
- afu_probe() fpga_register_dev_ops()
- Bir yapıyı kaydederek Bağlantı Noktası karakter aygıt düğümünü oluşturun file_operasyonlar.
FME IOCTL'ler
Açık olarak çağrılan IOCTL'ler file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION için tanımlayıcı—geçerli sürümü 0'dan başlayarak bir tamsayı olarak döndürür.
FPGA_CHECK_EXTENSION—şu anda desteklenmiyor.
FPGA_FME_PORT_RELEASE—arg aşağıdakilere yönelik bir işaretçidir:
struct fpga_fme_port_release {
__u32 argsz; // içinde: sizeof(struct fpga_fme_port_release)
__u32 bayrakları; // in: 0 olmalı
__u32 port_id; // in: serbest bırakılacak bağlantı noktası kimliği (0'dan itibaren).
};
FPGA_FME_PORT_ASSIGN—arg aşağıdakilere yönelik bir işaretçidir:
struct fpga_fme_port_sign {
__u32 argsz; // içinde: sizeof(struct fpga_fme_port_sign)
__u32 bayrakları; // in: 0 olmalı
__u32 port_id; // in: atanacak port kimliği (0'dan itibaren). (olmuş olmalı
daha önce FPGA_FME_PORT_RELEASE tarafından yayınlanmıştı)
};
FPGA_FME_PORT_PR—arg aşağıdakilere yönelik bir işaretçidir:
yapı fpga_fme_port_pr {
__u32 argsz; // içinde: sizeof(struct fpga_fme_port_pr)
__u32 bayrakları; // in: 0 olmalı
__u32 port_id; // içinde: port kimliği (0'dan itibaren)
__u32 tampon_boyutu; // in: bayt cinsinden bit akışı arabelleğinin boyutu. 4 bayt olmalı
hizalanmış.
__u64 tampon_adresi; // içinde: bit akışı arabelleğinin işlem adresi
__u64 durumu; // out: hata durumu (bit maskesi)
};
Bağlantı noktası IOCTL'leri
Açık olarak çağrılan IOCTL'ler file /dev/intel-fpga-port.k tanımlayıcısı FPGA_GET_API_VERSION—geçerli sürümü 0'dan başlayarak bir tamsayı olarak döndürür. FPGA_CHECK_EXTENSION—şu anda desteklenmiyor.
FPGA_PORT_GET_INFO—arg aşağıdakilere yönelik bir işaretçidir:
struct fpga_port_info {
__u32 argsz; // içinde: sizeof(struct fpga_port_info)
__u32 bayrakları; // çıkış: 0 değerini döndürür
__u32 sayı_bölgeler; // çıkış: MMIO bölgelerinin sayısı, 2 (AFU için 1 ve AFU için 1)
STP)
__u32 num_umsgs; // out: donanım tarafından desteklenen UMsg sayısı
};
FPGA_PORT_GET_REGION_INFO—arg aşağıdakilere yönelik bir işaretçidir:
struct fpga_port_region_info {
__u32 argsz; // içinde: sizeof(struct fpga_port_region_info)
__u32 bayrakları; // çıkış: (bit maskesi) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 dizini; // içinde: FPGA_PORT_INDEX_UAFU veya FPGA_PORT_INDEX_STP
__u32 dolgusu; // in: 0 olmalı
__u64 boyutu; // out: MMIO bölgesinin bayt cinsinden boyutu
__u64 uzaklığı; // out: MMIO bölgesinin fd cihazının başlangıcından itibaren ofseti
};
FPGA_PORT_DMA_MAP—arg aşağıdakilere yönelik bir işaretçidir:
struct fpga_port_dma_map {
__u32 argsz; // içinde: sizeof(struct fpga_port_dma_map)
__u32 bayrakları; // in: 0 olmalıdır __u64 user_addr; // içinde: sanal işlem
adres. Sayfaya hizalanmış olmalıdır.
__u64 uzunluğu; // in: bayt cinsinden eşlemenin uzunluğu. Birden fazla sayfa olmalı
boyut.
__u64 iova; // çıkış: GÇ sanal adresi };
FPGA_PORT_DMA_UNMAP—arg aşağıdakilere yönelik bir işaretçidir:
struct fpga_port_dma_unmap {
__u32 argsz; // içinde: sizeof(struct fpga_port_dma_unmap)
__u32 bayrakları; // in: 0 olmalı
__u64 iova; // içinde: önceki tarafından döndürülen GÇ sanal adresi
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—argümanlar NULL olmalıdır.
FPGA_PORT_UMSG_SET_MODE—arg aşağıdakilere yönelik bir işaretçidir:
yapı fpga_port_umsg_cfg {
__u32 argsz; // içinde: sizeof(struct fpga_port_umsg_cfg)
__u32 bayrakları; // in: 0 olmalı
__u32 ipucu_bit haritası; // içinde: UMsg ipucu modu bit haritası. Hangi UMsg'lerin olduğunu belirtir
etkinleştirilmiş.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- Bu ioctl'yi yayınlamadan önce UMsg'nin devre dışı bırakılması gerekir.
- iova alanı, tüm UMsg'ler (num_umsgs * PAGE_SIZE) için yeterince büyük bir arabellek için olmalıdır.
- Arabellek, sürücünün arabellek yönetimi tarafından "kullanımda" olarak işaretlenir.
- iova NULL ise önceki bölgelerin herhangi birinin "kullanımda" işareti kaldırılır.
- arg bir işaretçidir:
yapı fpga_port_umsg_base_addr {- u32 argsz; // içinde: sizeof(struct fpga_port_umsg_base_addr)
- u32 bayrakları; // in: 0 olmalı
- u64 iova; // içinde: FPGA_PORT_DMA_MAP'tan GÇ sanal adresi. };
Not:
- Bağlantı noktası hatalarını temizlemek için mevcut hataların tam bit maskesini yazmanız gerekir; örneğinample, kedi hataları > temizle
- UMsg yalnızca Entegre FPGA'lı Intel Xeon İşlemci için Hızlandırma Yığını aracılığıyla desteklenir.
sysfs Files
FME Başlığı sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio alanı | tip | erişim |
port_num | fme_header.capability.num_ports | ondalık int | Salt okunur |
önbellek_boyutu | fme_header.capability.cache_size | ondalık int | Salt okunur |
versiyon | fme_header.capability.fabric_verid | ondalık int | Salt okunur |
soket_kimliği | fme_header.capability.socket_id | ondalık int | Salt okunur |
bit akışı_id | fme_header.bitstream_id | altıgen uint64_t | Salt okunur |
bitstream_metadata | fme_header.bitstream_md | altıgen uint64_t | Salt okunur |
FME Termal Yönetim sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio alanı | tip | erişim |
eşik1 | termal.threshold.tmp_thshold1 | ondalık int | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
eşik2 | termal.threshold.tmp_thshold2 | ondalık int | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
eşik_trip | termal.threshold.therm_trip_thshold | ondalık int | Salt okunur |
eşik1_ulaşıldı | termal.threshold.thshold1_status | ondalık int | Salt okunur |
eşik2_ulaşıldı | termal.threshold.thshold2_status | ondalık int | Salt okunur |
eşik1_policy | termal. eşik.thshold_policy | ondalık int | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
sıcaklık | termal.rdsensor_fm1.fpga_temp | ondalık int | Salt okunur |
FME Güç Yönetimi sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio alanı | tip | erişim |
tüketilen | power.status.pwr_consumed | altıgen uint64_t | Salt okunur |
eşik1 | güç.threshold.threshold1 | altıgen uint64_t | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
eşik2 | güç.threshold.threshold2 | altıgen uint64_t | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
eşik1_durum | güç.threshold.threshold1_status | ondalık işaretsiz | Salt okunur |
eşik2_durum | güç.threshold.threshold2_status | ondalık işaretsiz | Salt okunur |
sağ | power.status.fpga_latency_report | ondalık işaretsiz | Salt okunur |
FME Genel Hatası sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio alanı | tip | erişim |
pcie0_errors | gerror.pcie0_err | altıgen uint64_t | Okuma yazma |
pcie1_errors | gerror.pcie1_err | altıgen uint64_t | Okuma yazma |
enjekte etme hatası | gerror.ras_error_inj | altıgen uint64_t | Okuma yazma |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio alanı | tip | erişim |
hatalar | gerror.fme_err | altıgen uint64_t | Salt okunur |
ilk_hata | gerror.fme_first_err.err_reg_status | altıgen uint64_t | Salt okunur |
sonraki_hata | gerror.fme_next_err.err_reg_status | altıgen uint64_t | Salt okunur |
temizlemek | Hataları temizler, ilk_hata, sonraki_hata | çeşitli uint64_t | Salt yazılır |
Not:
FME hatalarını temizlemek için mevcut hataların tam bit maskesini yazmalısınız; örneğinample cat hataları> temizle.
FME Kısmi Yeniden Yapılandırma sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio alanı | tip | erişim |
arayüz_kimliği | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | altıgen 16 bayt | Salt okunur |
FME Küresel Performans sysf'leri files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio alanı | tip | erişim |
saat | gperf.clk.afu_interf_clock | altıgen uint64_t | Salt okunur |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGA'lı Intel Xeon CPU için Hızlandırma Yığını için geçerli değildir)
sysfs file | mmio alanı | tip | erişim |
dondurmak | gperf.ch_ctl.freeze | ondalık int | Okuma yazma |
okuma_hit | gperf.CACHE_RD_HIT | altıgen uint64_t | Salt okunur |
okuma_miss | gperf.CACHE_RD_MISS | altıgen uint64_t | Salt okunur |
write_hit | gperf.CACHE_WR_HIT | altıgen uint64_t | Salt okunur |
write_miss | gperf.CACHE_WR_MISS | altıgen uint64_t | Salt okunur |
hold_request | gperf.CACHE_HOLD_REQ | altıgen uint64_t | Salt okunur |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | altıgen uint64_t | Salt okunur |
sysfs file | mmio alanı | tip | erişim |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | altıgen uint64_t | Salt okunur |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | altıgen uint64_t | Salt okunur |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | altıgen uint64_t | Salt okunur |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGA'lı Intel Xeon CPU için Hızlandırma Yığını için geçerli değildir)
sysfs file | mmio alanı | tip | erişim |
dondurmak | gperf.vtd_ctl.freeze | ondalık int | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA'lı Intel Xeon CPU için Hızlandırma Yığını için geçerli değildir)
sysfs file | mmio alanı | tip | erişim |
okuma_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | altıgen uint64_t | Salt okunur |
write_transaction | gperf.VTD_AFU0_MEM_WR_TRANS | altıgen uint64_t | Salt okunur |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | altıgen uint64_t | Salt okunur |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | altıgen uint64_t | Salt okunur |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio alanı | tip | erişim |
olanak vermek | gperf.fab_ctl.(etkin) | ondalık int | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
dondurmak | gperf.fab_ctl.freeze | ondalık int | Kullanıcı: Salt Okunur Kök: Okuma-yazma |
pcie0_read | gperf.FAB_PCIE0_RD | altıgen uint64_t | Salt okunur |
pcie0_write | gperf.FAB_PCIE0_WR | altıgen uint64_t | Salt okunur |
pcie1_read | gperf.FAB_PCIE1_RD | altıgen uint64_t | Salt okunur |
pcie1_write | gperf.FAB_PCIE1_WR | altıgen uint64_t | Salt okunur |
upi_read | gperf.FAB_UPI_RD | altıgen uint64_t | Salt okunur |
upi_write | gperf.FAB_UPI_WR | altıgen uint64_t | Salt okunur |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio alanı | tip | erişim |
pcie0_read | gperf.FAB_PCIE0_RD | altıgen uint64_t | Salt okunur |
pcie0_write | gperf.FAB_PCIE0_WR | altıgen uint64_t | Salt okunur |
pcie1_read | gperf.FAB_PCIE1_RD | altıgen uint64_t | Salt okunur |
pcie1_write | gperf.FAB_PCIE1_WR | altıgen uint64_t | Salt okunur |
upi_read | gperf.FAB_UPI_RD | altıgen uint64_t | Salt okunur |
upi_write | gperf.FAB_UPI_WR | altıgen uint64_t | Salt okunur |
Bağlantı Noktası Başlığı sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio alanı | tip | erişim |
id | port_header.capability.port_number | ondalık int | Salt okunur |
ltr | port_header.control.latency_tolerance | ondalık int | Salt okunur |
Bağlantı Noktası AFU Başlığı sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio alanı | tip | erişim |
afu_id | afu_header.guid | altıgen 16 bayt | Salt okunur |
Bağlantı Noktası Hatası sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio alanı | tip | erişim |
hatalar | perror.port_error | altıgen uint64_t | Salt okunur |
ilk_hata | perror.port_first_error | altıgen uint64_t | Salt okunur |
First_malformed_req | perror.malreq | altıgen 16 bayt | Salt okunur |
temizlemek | perror.(tüm hatalar) | çeşitli uint64_t | Salt yazılır |
Not:
Bağlantı noktası hatalarını temizlemek için mevcut hataların tam bit maskesini yazmanız gerekir; örneğinample cat hataları> temizle.
Revizyon Geçmişi
Belge Sürümü | Değişiklikler |
2017.10.02 | İlk Sürüm. |
OPAE Intel FPGA Linux Aygıt Sürücüsü Mimari Kılavuzu
Belgeler / Kaynaklar
![]() |
intel OPAE FPGA Linux Aygıt Sürücüsü Mimarisi [pdf] Kullanıcı Kılavuzu OPAE FPGA Linux Aygıt Sürücüsü Mimarisi, OPAE FPGA, Linux Aygıt Sürücüsü Mimarisi, Sürücü Mimarisi, Mimari |