intel OPAE FPGA Linux Device Driver Arkitektura
OPAE Intel FPGA Linux Device Driver Arkitektura
OPAE Intel FPGA kontrolatzaileak erabiltzaile-espazioko aplikazioetarako interfazeak eskaintzen ditu FPGA azeleragailuak konfiguratzeko, zenbatzeko, irekitzeko eta sartzeko Intel FPGA soluzioekin hornitutako plataformetan, eta sistema-mailako kudeaketa funtzioak ahalbidetzen ditu, hala nola FPGA birkonfigurazioa, energia-kudeaketa eta birtualizazioa.
Hardware Arkitektura
OS-en puntutik view, FPGA hardwarea PCIe gailu arrunt gisa agertzen da. FPGA gailuaren memoria aurrez zehaztutako datu-egitura baten bidez antolatzen da (Gailuaren ezaugarrien zerrenda). FPGA gailuak onartzen dituen ezaugarriak datu-egitura hauen bidez azaltzen dira, ondoko irudian azaltzen den bezala:
FPGA PCIe gailua
Gidariak PCIe SR-IOV onartzen du Funtzio Birtualak (VF) sortzeko, zeinak makina birtualei azeleragailu indibidualak esleitzeko erabil daitezkeen.
Intel Corporation. Eskubide guztiak erreserbatuak. Intel, Intel logotipoa eta beste Intel marka Intel Corporation edo bere filialen marka komertzialak dira. Intel-ek bere FPGA eta erdieroaleen produktuen errendimendua bermatzen du uneko zehaztapenekin, Intel-en berme estandarraren arabera, baina edozein unetan edozein produktu eta zerbitzutan aldaketak egiteko eskubidea gordetzen du jakinarazi gabe. Intel-ek ez du bere gain hartzen hemen deskribatutako edozein informazio, produktu edo zerbitzuren aplikazio edo erabileratik eratorritako erantzukizunik edo erantzukizunik, Intel-ek idatziz berariaz hitzartutakoa izan ezik. Intel-eko bezeroei gomendatzen zaie gailuaren zehaztapenen azken bertsioa eskuratzea argitaratutako edozein informaziotan oinarritu aurretik eta produktu edo zerbitzuen eskaerak egin aurretik.
Beste izen eta marka batzuk beste batzuen jabetza direla erreklamatu daitezke.
FPGA PCIe gailu birtualizatua
FPGA Kudeaketa Motorra (FME)
FPGA Kudeaketa Motorrak energia eta kudeaketa termikoa, erroreen berri ematea, birkonfigurazioa, errendimenduaren berri ematea eta beste azpiegitura-funtzio batzuk egiten ditu. FPGA bakoitzak FME bat du, eta beti Funtzio Fisikoaren (PF) bidez sartzen da. Erabiltzaile-espazioko aplikazioek FMErako sarbide esklusiboa lor dezakete open( erabiliz), eta askatu close() erabiliz erabiltzaile pribilegiatu gisa (root).
Portua
Portu batek FPGA ehun estatikoaren ("FPGA Interface Manager (FIM)") eta Azeleragailu Funtzioa (AF) duen partzialki birkonfiguragarria den eskualde baten arteko interfazea adierazten du. Portuak softwaretik azeleragailurako komunikazioa kontrolatzen du eta berrezarri eta arazketa bezalako ezaugarriak erakusten ditu. PCIe gailu batek hainbat Portu izan ditzake, eta Portu bakoitza VF baten bidez ikus daiteke FME gailuko FPGA_FME_PORT_ASSIGN ioctl erabiliz esleituta.
Azeleragailu Funtzioa (AF) Unitatea
- Azeleragailu Funtzio (AF) Unitate bat Portu bati lotuta dago eta 256K MMIO eskualde bat erakusten du azeleragailuaren berariazko kontrol-erregistroetarako erabiltzeko.
- Erabiltzaile-espazioko aplikazioek Portu bati lotuta dagoen AFU baterako sarbide esklusiboa lor dezakete Portuko gailuan open() erabiliz, eta askatu close() erabiliz.
- Erabiltzaile-espazioko aplikazioek mmap() MMIO eskualdeak ere bizkor ditzakete.
Birkonfigurazio partziala
Goian esan bezala, azeleragailuak birkonfiguratu daitezke Azeleragailu Funtzio (AF) baten birkonfigurazio partzialen bidez. file. Azeleragailuaren Funtzioa (AF) FPGAren FIM zehatzerako eta zuzendutako eskualde estatikorako (Portua) sortu behar da; bestela, birkonfigurazio-eragiketak huts egingo du eta ziurrenik sistemaren ezegonkortasuna eragingo du. Bateragarritasun hori egiazta daiteke AF goiburuan adierazitako interfazearen IDa FMEk sysfs bidez erakusten duen interfazearen IDarekin alderatuz. Egiaztapen hau normalean erabiltzailearen espazioak egiten du birkonfigurazioa IOCTLra deitu aurretik.
Oharra:
Gaur egun, FPGAra sartzen den edozein software programa, birtualizatutako ostalari batean exekutatzen direnak barne, itxi egin behar dira birkonfigurazio partzial bat saiatu aurretik. Urratsak hauek izango lirateke:
- Deskargatu gidaria gonbidatuarengandik
- Deskonektatu VF gonbidatuarengandik
- Desgaitu SR-IOV
- Egin birkonfigurazio partziala
- Gaitu SR-IOV
- Konektatu VF gonbidatuari
- Kargatu gidaria gonbidatuan
FPGA birtualizazioa
VM batean exekutatzen diren aplikazioetatik azeleragailu batera atzitzea gaitzeko, dagokion AFUren ataka VF bati esleitu behar zaio urrats hauek erabiliz:
- PF-k AFU ataka guztien jabe da lehenespenez. VF bati esleitu behar zaion edozein ataka lehenik PFtik askatu behar da FME gailuko FPGA_FME_PORT_RELEASE ioctl bidez.
- N atakak PFtik askatzen direnean, beheko komandoa erabil daiteke SRIOV eta VFak gaitzeko. VF bakoitzak ataka bakarra du AFUrekin. echo N > PCI_DEVICE_PATH/sriov_numvfs
- Pasa VFetatik VMetara.
- VF azpian dagoen AFU VMko aplikazioetatik (VF barruko kontrolatzaile bera erabiliz) eskuragarri dago.
Oharra:
FME bat ezin zaio VF bati esleitu, beraz PR eta beste kudeaketa-funtzioak PFren bidez bakarrik daude eskuragarri.
Gidarien Antolakuntza
PCIe moduluaren gailu kontrolatzailea
Gidarien Antolakuntza
FPGA gailuak PCIe gailu arrunt gisa agertzen dira; horrela, FPGA PCIe gailu kontrolatzailea (intel-FPGA-PCI.ko) beti kargatzen da lehenik FPGA PCIe PF edo VF bat detektatzen denean. Gidari honek azpiegitura-eginkizuna betetzen du gidariaren arkitekturan. Hau:
- FPGA edukiontzi gailu bat sortzen du ezaugarrien gailuen guraso gisa.
- PCIe gailuaren BAR memorian inplementatutako Gailu Ezaugarrien Zerrendan zehar ibiltzen da, ezaugarri gailuak eta haien azpieginbideak ezagutzeko eta edukiontziaren gailuaren azpian haientzako plataforma-gailuak sortzeko.
- SR-IOV onartzen du.
- Ezaugarrien gailuen azpiegitura aurkezten du, azpieginbideen eragiketak abstraitzen dituena eta funtzio komunak erakusten dituena gailu-kontrolatzaileei.
PCIe moduluaren gailu kontrolatzailearen funtzioak
- PCIe aurkikuntza, gailuen zenbaketa eta funtzioen aurkikuntza ditu.
- Sysfs direktorioak sortzen ditu gailu nagusirako, FPGA Management Engine (FME) eta Porturako.
- Plataformako kontrolatzaileen instantziak sortzen ditu, eta Linux nukleoak dagozkien plataformako moduluen kontrolatzaileak kargatuko ditu.
FME plataformako moduluaren gailu kontrolatzailea
- Energiaren eta termikoaren kudeaketa, akatsen berri ematea, errendimenduaren berri ematea eta beste azpiegitura-funtzioak. Funtzio hauetara FME kontrolatzaileak erakutsitako sysfs interfazeen bidez sar zaitezke.
- Birkonfigurazio partziala. FME kontrolatzaileak FPGA kudeatzailea erregistratzen du PR azpi-eginbidearen hasierako garaian; zuregandik FPGA_FME_PORT_PR ioctl bat jasotzen duenean, FPGA Manager-en interfaze-funtzio komuna deitzen du emandako Portura bit-korrontearen birkonfigurazio partziala osatzeko.
- Birtualizaziorako portuen kudeaketa. FME kontrolatzaileak bi ioctl sartzen ditu, FPGA_FME_PORT_RELEASE, PF-tik emandako Portua askatzen duena; eta FPGA_FME_PORT_ASSIGN, Portua PFri esleitzen diona. Portua PFtik askatu ondoren, VF-ra esleitu daiteke PCIe kontrolatzaileak emandako SR-IOV interfazeen bidez. Informazio gehiagorako, ikusi "FPGA birtualizazioa" atalera.
FME Plataforma Modulua Gailuaren kontrolatzailearen funtzioak
- FME karaktere-gailuaren nodoa sortzen du.
- FME sysfs sortzen du files eta FME sysfs inplementatzen du file osagarriak.
- FME funtzio pribatuen azpi-kontrolatzaileak inplementatzen ditu.
- FME eginbide pribatuen azpi-kontrolatzaileak:
- FME goiburua
- Kudeaketa Termikoa
- Potentzia kudeaketa
- Errore globala
- Birkonfigurazio partziala
- Errendimendu globala
Portuko plataformaren moduluaren gailu kontrolatzailea
FME kontrolatzailearen antzera, FPGA ataka (eta AFU) kontrolatzailea (intel-fpga-afu. ko) zundatzen da Portu plataformako gailua sortzen denean. Modulu honen funtzio nagusia erabiltzaile-espazioko aplikazioei interfaze bat eskaintzea da azeleragailu indibidualetara sartzeko, besteak beste, Portuko oinarrizko berrezartze kontrola, AFU MMIO eskualdearen esportazioa, DMA buffer mapa-zerbitzua, UMsg(1) jakinarazpena eta urruneko arazketa funtzioak ( ikusi goian).
UMsg Acceleration Stack-en bidez soilik onartzen da FPGA integratua duen Intel Xeon® prozesadorerako.
Portuko plataformaren modulua Gailuaren kontrolatzailearen funtzioak
- Port karakterearen gailu-nodoa sortzen du.
- Port sysfs sortzen du files eta Port sysfs inplementatzen du file osagarriak.
- Portuko ezaugarri pribatuen azpi-kontrolatzaileak inplementatzen ditu.
- Portu eginbide pribatuen azpi-kontrolatzaileak:
- Portuaren goiburua
- AFU
- Portuko errorea
- UMsg(2)
- Seinalea Sakatu
Aplikazioa FPGA Gailu Zenbaketa
Atal honetan aplikazioek FPGA gailua sysfs hierarkiatik nola zenbatzen duten aurkezten da /sys/class/fpga azpian. Adibampbehean, Intel FPGA bi gailu instalatuta daude ostalarian. FPGA gailu bakoitzak FME bat eta bi Portu (AFU) ditu. FPGA gailu bakoitzeko, gailu direktorio bat sortzen da /sys/class/fpga azpian:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Nodo bakoitzak FME bat eta bi Portu (AFU) ditu gailu ume gisa:
/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
Oro har, FME/Port sysfs interfazeak honela izendatzen dira:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
I edukiontzi-gailu guztiak jarraian zenbakituz, j FME-ak jarraian zenbakituz eta k Portu guztiak jarraian zenbakituz.
ioctl() eta mmap()-erako erabiltzen diren gailu-nodoei erreferentzia egin daiteke:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe kontrolatzaileen zenbaketa
Atal honek gaina ematen duview intel-fpga-pci.ko-k egindako gailuen zenbaketa kode-fluxuarena. Datuen egitura eta funtzio nagusiak nabarmentzen dira. Atal hau hobeto jarraitu behar da viewhonekin batera doan iturburu-kodea (pcie.c).
Zenbaketa Datuen Egiturak
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
egitura estatikoa idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *izena;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
egitura-klase estatikoa *fpga_class;
egitura estatikoa 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,}
};
egitura estatikoa 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
};
egitura cci_drvdata {
int device_id;
struct gailua *fme_dev;
struct mutex blokeoa;
struct list_head port_dev_list;
int kaleratu_port_num;
struct list_head eskualdeak;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int uneko_barra;
void __iomem *pfme_hdr;
struct device *parent_dev;
struct platform_device *eginbide_dev;
};
Zenbaketa-fluxua
- ccidrv_init()
- Hasieratu fpga_ids idr_init() erabiliz.
- Hasieratu fpga_chrdevs[i].devt alloc_chrdev_region() erabiliz.
- Hasieratu fpga_class class_create() erabiliz.
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Gaitu PCI gailua, eskatu bere eskualdeetarako sarbidea, ezarri PCI master modua eta konfiguratu DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Esleitu build_feature_devs_info egitura bat, hasieratu.
.parent_dev FME eta Port sysfs direktorio nagusiak dituen sysfs direktorio nagusi batean ezartzen da (intel-fpga-dev.id).
- Esleitu build_feature_devs_info egitura bat, hasieratu.
- parse_feature_list()
- Ibili BAR0 Gailuaren Ezaugarrien Zerrendan FME, Portua eta haien ezaugarri pribatuak ezagutzeko.
- parse_feature() parse_feature_afus() parse_feature_fme()
- FME bat aurkitzen denean:
- build_info_create_dev()
- Esleitu plataforma-gailu bat FMErako, build_feature_devs_info.feature_dev-en gordeta.
- feature_dev.id idr_alloc(fpga_ids[FME_ID]) emaitzarekin hasieratzen da
- feature_dev.parent build_feature_devs_info.parent_dev gisa ezarrita dago.
- Esleitu egitura-baliabideen array bat feature_dev.resource-n.
- Esleitu struct feature_platform_data, hasieratu eta gorde erakuslea feature_dev.dev.platform_data-n
- create_feature_instance() build_info_add_sub_feature()
- Hasieratu feature_dev.resource[FME_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Hasieratu feature_platform_data.features[FME_FEATURE_ID_HEADER], dena .fops izan ezik.
- parse_feature() parse_feature_afus() parse_feature_port()
- Portu bat aurkitzen denean:
- build_info_create_dev()
- Esleitu plataforma-gailu bat Portura, build_feature_devs_info.feature_dev-en gordeta.
- feature_dev.id idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent build_feature_devs_info.parent_dev gisa ezarrita dago.
- Esleitu egitura-baliabideen array bat feature_dev.resource-n.
- Esleitu struct feature_platform_data, hasieratu eta gorde erakuslea feature_dev.dev.platform_data-n
- build_info_commit_dev()
- Gehitu porturako struct feature_platform_data.node struct cci_drvdata.port_dev_list-eko Portuen zerrendara
- create_feature_instance() build_info_add_sub_feature()
- Hasieratu feature_dev.resource[PORT_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Hasieratu feature_platform_data.features[PORT_FEATURE_ID_HEADER], dena .fops izan ezik.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- AFU bat aurkitzen denean:
- create_feature_instance() build_info_add_sub_feature()
- Hasieratu feature_dev.resource[PORT_FEATURE_ID_UAFU].
- feature_platform_data_add()
- Hasieratu feature_platform_data.features[PORT_FEATURE_ID_UAFU], dena .fops izan ezik.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- FME ezaugarri pribatu bat aurkitzen denean:
- create_feature_instance() build_info_add_sub_feature()
- Hasieratu feature_dev.resource[id].
- feature_platform_data_add()
- Hasieratu feature_platform_data.features[id], .fops izan ezik.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Portuko ezaugarri pribatu bat aurkitzen denean: * create_feature_instance() build_info_add_sub_feature() * Hasieratu feature_dev.resource[id]. * feature_platform_data_add() Hasieratu feature_platform_data.features[id], dena .fops izan ezik.
- parse_ports_from_fme()
- Gidaria Funtzio fisikoan (PF) kargatuta badago, orduan:
- Exekutatu parse_feature_list() fluxua FME goiburuan deskribatutako ataka bakoitzean.
- Erabili goiburuko Portuko sarrera bakoitzean aipatutako BAR.
FME plataformako gailuaren hasieratzea
Atal honek gaina ematen duview intel-fpga-fme.ko-k egindako FME gailuaren hasierako kode-fluxuarena. Datuen egitura eta funtzio nagusiak nabarmentzen dira. Atal hau hobeto jarraitu behar da viewhonekin batera doan iturburu-kodea (fme-main.c).
FME Plataforma Gailuaren Datuen Egiturak
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
luzea (*ioctl)(struct platform_device *pdev, struct ezaugarria *eginbidea,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *ezaugarri);
};
egitura-ezaugarri {
const char *izena;
int baliabide_indizea;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct ezaugarri_plataformaren_datuak {
struct list_head nodoa;
struct mutex blokeoa;
sinatu gabeko dev_status luzea;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
hutsune *pribatu;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); egitura
ezaugarri ezaugarriak[0];
};
struct perf_object {
zuk eskua;
const struct attribute_group **attr_groups;
struct gailua *fme_dev;
struct list_head nodoa;
struct list_head seme-alabak;
struct kobject kobj;
};
struct fpga_fme {
u8 ataka_id;
u64 pr_err;
struct device *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME Plataforma Gailuaren Hasierako Fluxua
FME Hasierako Fluxua
- fme_probe() fme_dev_init()
- Hasieratu struct fpga_fme eta gorde feature_platform_data.private eremuan.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Gorde struct feature_ops feature_platform_data.features atalean populatutako eginbide bakoitzeko.
- Deitu proba funtzioari, baldin badago, egituratik.
- Deitu init funtzioari egituratik.
- fme_probe() fpga_register_dev_ops()
- Sortu FME karaktere-gailuaren nodoa, egitura bat erregistratuz file_eragiketak.
Portu-plataforma gailuaren hasieratzea
Atal honek gaina ematen duview Intel-fpga-afu.ko-k egindako ataka-gailuaren hasierako kode-fluxuarena. Datuen egitura eta funtzio nagusiak nabarmentzen dira. Atal hau hobeto jarraitu behar da viewhonekin batera doan iturburu-kodea (afu.c).
Portuko Plataforma Gailuaren Datuen Egiturak
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
luzea (*ioctl)(struct platform_device *pdev, struct ezaugarria *eginbidea,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *ezaugarri);
};
egitura-ezaugarri {
const char *izena;
int baliabide_indizea;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct ezaugarri_plataformaren_datuak {
struct list_head nodoa;
struct mutex blokeoa;
sinatu gabeko dev_status luzea;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
hutsune *pribatu;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
struct ezaugarri ezaugarriak[0];
};
struct fpga_afu_region {
u32 indizea;
u32 banderak;
u64 tamaina;
u64 offset;
u64 fisikoa;
struct list_head nodoa;
};
struct fpga_afu_dma_region {
u64 erabiltzaile-helbidea;
u64 luzera;
u64 iova;
struct page **orriak;
struct rb_node nodoa;
bool in_use;
};
egitura fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head eskualdeak;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Portu-plataformako gailuaren hasierako fluxua
Portuko Hasierako Fluxua
- afu_probe() afu_dev_init()
- Hasieratu struct fpga_afu eta gorde feature_platform_data.private eremuan.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Gorde struct feature_ops feature_platform_data.features atalean populatutako eginbide bakoitzeko.
- Deitu proba funtzioari, baldin badago, egituratik.
- Deitu init funtzioari egituratik.
- afu_probe() fpga_register_dev_ops()
- Sortu Port karakterearen gailu-nodoa, egitura bat erregistratuz file_eragiketak.
FME IOCTLak
IOCTLak irekita deitzen diren file /dev/intel-fpga-fme.j for deskribatzailea FPGA_GET_API_VERSION—itzuli uneko bertsioa zenbaki oso gisa, 0tik hasita.
FPGA_CHECK_EXTENSION: ez da onartzen oraingoz.
FPGA_FME_PORT_RELEASE—arg a-ren erakuslea da:
struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 banderak; // in: 0 izan behar du
__u32 ataka_id; // in: atakaren IDa (0tik aurrera) askatzeko.
};
FPGA_FME_PORT_ASSIGN—arg a-ren erakuslea da:
struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 banderak; // in: 0 izan behar du
__u32 ataka_id; // in: atakaren IDa (0tik aurrera) esleitzeko. (izan behar zuen
aurrez FPGA_FME_PORT_RELEASE-k kaleratua)
};
FPGA_FME_PORT_PR—arg a-ren erakuslea da:
struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 banderak; // in: 0 izan behar du
__u32 ataka_id; //-n: atakaren IDa (0tik aurrera)
__u32 buffer_tamaina; // in: bit-stream buffer-aren tamaina bytetan. 4 bytekoa izan behar du
lerrokatuta.
__u64 buffer_helbidea; // in: bit-stream buffer-aren prozesuaren helbidea
__u64 egoera; // atera: errore-egoera (bitmaskara)
};
Portuko IOCTLak
IOCTLak irekita deitzen diren file /dev/intel-fpga-port.k for deskribatzailea FPGA_GET_API_VERSION—itzuli uneko bertsioa zenbaki oso gisa, 0tik hasita. FPGA_CHECK_EXTENSION—ez da onartzen oraingoz.
FPGA_PORT_GET_INFO—arg a-ren erakuslea da:
struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 banderak; // kanpora: 0 itzultzen du
__u32 num_regions; // kanpora: MMIO eskualde kopurua, 2 (1 AFUrako eta 1
STP)
__u32 num_umsgs; // out: hardwareak onartzen dituen UMsg kopurua
};
FPGA_PORT_GET_REGION_INFO—arg a-ren erakuslea da:
struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 banderak; // atera: (bitmaskara) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indizea; // atalean: FPGA_PORT_INDEX_UAFU edo FPGA_PORT_INDEX_STP
__u32 betegarria; // in: 0 izan behar du
__u64 tamaina; // atera: MMIO eskualdearen tamaina bytetan
__u64 desplazamendua; // kanpora: MMIO eskualdearen desplazamendua fd gailuaren hasieratik
};
FPGA_PORT_DMA_MAP: arg a-ren erakuslea da:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 banderak; // in: 0 izan behar du __u64 user_addr; // in: prozesu birtual
helbidea. Orrialde lerrokatuta egon behar du.
__u64 luzera; // in: maparen luzera bytetan. Orriaren multiploa izan behar du
tamaina.
__u64 iova; // atera: IO helbide birtuala };
FPGA_PORT_DMA_UNMAP: arg a-rako erakuslea da:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 banderak; // in: 0 izan behar du
__u64 iova; // in: aurreko batek itzuli duen IO helbide birtuala
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg NULL izan behar du.
- FPGA_PORT_UMSG_ENABLE—arg NULL izan behar du.
- FPGA_PORT_UMSG_DISABLE: argumentuek NULL izan behar dute.
FPGA_PORT_UMSG_SET_MODE—arg a-rako erakuslea da:
struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 banderak; // in: 0 izan behar du
__u32 hint_bitmap; // in: UMsg aholku modua bit-mapa. UMsg zeintzuk diren adierazten du
gaituta.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg desgaitu egin behar da ioctl hau igorri aurretik.
- Iova eremuak UMsg guztientzat nahikoa den buffer baterako izan behar du (num_umsgs * PAGE_SIZE).
- Buffer-a "erabiltzen" gisa markatzen du gidariaren buffer-en kudeaketak.
- iova NULL bada, aurreko edozein eskualde ez dago markatuta "erabiltzen".
- arg a-rako erakuslea da:
struct fpga_port_umsg_base_addr {- u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
- u32 banderak; // in: 0 izan behar du
- u64 iova; // in: IO helbide birtuala FPGA_PORT_DMA_MAP-etik. };
Oharra:
- Portuko akatsak garbitzeko, uneko erroreen bitmaskara zehatza idatzi behar duzu, adibidezample, cat errores > garbitu
- UMsg Acceleration Stack-en bidez soilik onartzen da FPGA integratua duen Intel Xeon prozesadorerako.
sysfs Files
FME goiburuko sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio eremua | mota | sarbidea |
ataka_zenbakia | fme_header.capability.num_ports | hamartar int | Irakurtzeko soilik |
cache_tamaina | fme_header.capability.cache_size | hamartar int | Irakurtzeko soilik |
bertsioa | fme_header.capability.fabric_verid | hamartar int | Irakurtzeko soilik |
socket_id | fme_header.capability.socket_id | hamartar int | Irakurtzeko soilik |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Irakurtzeko soilik |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Irakurtzeko soilik |
FME Kudeaketa Termikoaren sistemak files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio eremua | mota | sarbidea |
atalasea 1 | thermal.threshold.tmp_thshold1 | hamartar int | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
atalasea 2 | thermal.threshold.tmp_thshold2 | hamartar int | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
atalase_bidaia | thermal.threshold.therm_trip_thshold | hamartar int | Irakurtzeko soilik |
atalasea1_iritsi da | thermal.threshold.thshold1_egos | hamartar int | Irakurtzeko soilik |
atalasea2_iritsi da | thermal.threshold.thshold2_egos | hamartar int | Irakurtzeko soilik |
atalasea1_politika | termikoa. atalasea.thshold_policy | hamartar int | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
tenperatura | thermal.rdsensor_fm1.fpga_temp | hamartar int | Irakurtzeko soilik |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio eremua | mota | sarbidea |
kontsumitu | power.status.pwr_consumed | hex uint64_t | Irakurtzeko soilik |
atalasea 1 | potentzia.atalasea.atalasea1 | hex uint64_t | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
atalasea 2 | potentzia.atalasea.atalasea2 | hex uint64_t | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
atalasea1_egoera | potentzia.atalasea.atalasea1_egoera | sinatu gabeko hamartar | Irakurtzeko soilik |
atalasea2_egoera | potentzia.atalasea.atalasea2_egoera | sinatu gabeko hamartar | Irakurtzeko soilik |
rtl | power.status.fpga_latency_report | sinatu gabeko hamartar | Irakurtzeko soilik |
FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio eremua | mota | sarbidea |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Irakurri eta idazteko |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Irakurri eta idazteko |
inject_error | gerror.ras_error_inj | hex uint64_t | Irakurri eta idazteko |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio eremua | mota | sarbidea |
akatsak | gerror.fme_err | hex uint64_t | Irakurtzeko soilik |
lehen_errorea | gerror.fme_first_err.err_reg_status | hex uint64_t | Irakurtzeko soilik |
hurrengo_errorea | gerror.fme_next_err.err_reg_status | hex uint64_t | Irakurtzeko soilik |
argi | Akatsak garbitzen ditu, lehen_errorea, hurrengo_errorea | hainbat uint64_t | Idazteko soilik |
Oharra:
FME akatsak garbitzeko, uneko erroreen bitmaskara zehatza idatzi behar duzu, adibidezample cat erroreak > garbitu.
FME birkonfigurazio partziala sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio eremua | mota | sarbidea |
interfaze_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16 byte | Irakurtzeko soilik |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio eremua | mota | sarbidea |
erlojua | gperf.clk.afu_interf_clock | hex uint64_t | Irakurtzeko soilik |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ez du balio FPGAdun Intel Xeon CPUrako Azelerazio Pilarako)
sysfs file | mmio eremua | mota | sarbidea |
izoztu | gperf.ch_ctl.freeze | hamartar int | Irakurri eta idazteko |
irakurri_sakatu | gperf.CACHE_RD_HIT | hex uint64_t | Irakurtzeko soilik |
irakurri_galdu | gperf.CACHE_RD_MISS | hex uint64_t | Irakurtzeko soilik |
idatzi_sakatu | gperf.CACHE_WR_HIT | hex uint64_t | Irakurtzeko soilik |
idatzi_galdu | gperf.CACHE_WR_MISS | hex uint64_t | Irakurtzeko soilik |
eutsi_eskaera | gperf.CACHE_HOLD_REQ | hex uint64_t | Irakurtzeko soilik |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Irakurtzeko soilik |
sysfs file | mmio eremua | mota | sarbidea |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Irakurtzeko soilik |
datuak_idatzi_ataka_kontaketa | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Irakurtzeko soilik |
tag_idatzi_portu_gatazka | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Irakurtzeko soilik |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ez du balio FPGAdun Intel Xeon CPUrako Azelerazio Pilarako)
sysfs file | mmio eremua | mota | sarbidea |
izoztu | gperf.vtd_ctl.freeze | hamartar int | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ez du balio FPGAdun Intel Xeon CPUrako Azelerazio Pilarako)
sysfs file | mmio eremua | mota | sarbidea |
irakurri_transakzioa | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Irakurtzeko soilik |
idatzi_transakzioa | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Irakurtzeko soilik |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Irakurtzeko soilik |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Irakurtzeko soilik |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio eremua | mota | sarbidea |
gaitu | gperf.fab_ctl.(gaituta) | hamartar int | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
izoztu | gperf.fab_ctl.freeze | hamartar int | Erabiltzailea: irakurtzeko soilik Erroa: irakurtzeko-idazteko |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Irakurtzeko soilik |
pcie0_idatzi | gperf.FAB_PCIE0_WR | hex uint64_t | Irakurtzeko soilik |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Irakurtzeko soilik |
pcie1_idatzi | gperf.FAB_PCIE1_WR | hex uint64_t | Irakurtzeko soilik |
upi_irakur | gperf.FAB_UPI_RD | hex uint64_t | Irakurtzeko soilik |
upi_idatzi | gperf.FAB_UPI_WR | hex uint64_t | Irakurtzeko soilik |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio eremua | mota | sarbidea |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Irakurtzeko soilik |
pcie0_idatzi | gperf.FAB_PCIE0_WR | hex uint64_t | Irakurtzeko soilik |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Irakurtzeko soilik |
pcie1_idatzi | gperf.FAB_PCIE1_WR | hex uint64_t | Irakurtzeko soilik |
upi_irakur | gperf.FAB_UPI_RD | hex uint64_t | Irakurtzeko soilik |
upi_idatzi | gperf.FAB_UPI_WR | hex uint64_t | Irakurtzeko soilik |
Portuko goiburua sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio eremua | mota | sarbidea |
id | ataka_goiburua.gaitasuna.port_zenbakia | hamartar int | Irakurtzeko soilik |
ltr | port_header.control.latency_tolerance | hamartar int | Irakurtzeko soilik |
Portu AFU goiburuko sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio eremua | mota | sarbidea |
afu_id | afu_header.guid | hex 16 byte | Irakurtzeko soilik |
Portuko errorea sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio eremua | mota | sarbidea |
akatsak | perror.port_error | hex uint64_t | Irakurtzeko soilik |
lehen_errorea | perror.port_first_error | hex uint64_t | Irakurtzeko soilik |
lehen_okerreko_eskaera | perror.malreq | hex 16 byte | Irakurtzeko soilik |
argi | errorea.(akats guztiak) | hainbat uint64_t | Idazteko soilik |
Oharra:
Portuko akatsak garbitzeko, uneko erroreen bitmaskara zehatza idatzi behar duzu, adibidezample cat erroreak > garbitu.
Berrikuspen historia
Dokumentuaren bertsioa | Aldaketak |
2017.10.02 | Hasierako Oharra. |
OPAE Intel FPGA Linux Device Driver Arkitektura Gida
Dokumentuak / Baliabideak
![]() |
intel OPAE FPGA Linux Device Driver Arkitektura [pdfErabiltzailearen gida OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |