intel-logosu

intel OPAE FPGA Linux Aygıt Sürücüsü Mimarisi

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Mimari-ürün

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ı

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Mimari-fig- (1)

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ı

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Mimari-fig- (2)

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:

  1. Sürücüyü misafirden kaldırın
  2. VF'yi konuktan çıkarın
  3. SR-IOV'yi devre dışı bırak
  4. Kısmi yeniden yapılandırma gerçekleştirin
  5. SR-IOV'yi etkinleştir
  6. VF'yi misafire takın
  7. 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:

  1. 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.
  2. 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
  3. VF'lerden VM'lere geçin.
  4. 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

intel-OPAE-FPGA-Linux-Cihaz-Sürücü-Mimari-fig- (3)

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.
  • 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ışıintel-OPAE-FPGA-Linux-Cihaz-Sürücü-Mimari-fig- (4)

  • 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ışıintel-OPAE-FPGA-Linux-Cihaz-Sürücü-Mimari-fig- (5)

  • 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

Referanslar

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar işaretlenmiştir *