인텔 OPAE FPGA 리눅스 디바이스 드라이버 아키텍처
OPAE Intel FPGA Linux 장치 드라이버 아키텍처
OPAE Intel FPGA 드라이버는 사용자 공간 애플리케이션이 Intel FPGA 솔루션을 갖춘 플랫폼에서 FPGA 가속기를 구성, 열거, 열기 및 액세스할 수 있는 인터페이스를 제공하며 FPGA 재구성, 전원 관리, 가상화와 같은 시스템 수준 관리 기능을 지원합니다.
하드웨어 아키텍처
OS의 관점에서 view, FPGA 하드웨어는 일반 PCIe 장치로 나타납니다. FPGA 장치 메모리는 사전 정의된 데이터 구조(장치 기능 목록)를 사용하여 구성됩니다. FPGA 장치에서 지원하는 기능은 다음 그림에서 설명한 대로 이러한 데이터 구조를 통해 노출됩니다.
FPGA PCIe 장치
드라이버는 PCIe SR-IOV를 지원하여 가상 머신에 개별 가속기를 할당하는 데 사용할 수 있는 가상 기능(VF)을 생성합니다.
인텔사. 판권 소유. 인텔, 인텔 로고 및 기타 인텔 마크는 인텔사 또는 그 자회사의 상표입니다. Intel은 FPGA 및 반도체 제품의 성능을 Intel의 표준 보증에 따라 현재 사양으로 보증하지만 언제든지 통지 없이 모든 제품 및 서비스를 변경할 수 있는 권한을 보유합니다. 인텔은 인텔이 서면으로 명시적으로 동의한 경우를 제외하고 여기에 설명된 정보, 제품 또는 서비스의 응용 프로그램 또는 사용으로 인해 발생하는 책임을 지지 않습니다. 인텔 고객은 게시된 정보에 의존하기 전에 그리고 제품이나 서비스를 주문하기 전에 장치 사양의 최신 버전을 확인하는 것이 좋습니다.
다른 이름과 브랜드는 다른 사람의 재산이라고 주장될 수 있습니다.
가상화된 FPGA PCIe 장치
FPGA 관리 엔진(FME)
FPGA 관리 엔진은 전력 및 열 관리, 오류 보고, 재구성, 성능 보고 및 기타 인프라 기능을 수행합니다. 각 FPGA에는 항상 물리적 기능(PF)을 통해 액세스되는 하나의 FME가 있습니다. 사용자 공간 애플리케이션은 open()을 사용하여 FME에 대한 배타적 액세스를 획득하고 권한이 있는 사용자(루트)로서 close()를 사용하여 해제할 수 있습니다.
포트
포트는 정적 FPGA 패브릭(FPGA 인터페이스 관리자(FIM))과 가속기 기능(AF)을 포함하는 부분적으로 재구성 가능한 영역 간의 인터페이스를 나타냅니다. 포트는 소프트웨어에서 가속기로의 통신을 제어하고 재설정 및 디버그와 같은 기능을 노출합니다. PCIe 장치에는 여러 개의 포트가 있을 수 있으며, 각 포트는 FME 장치에서 FPGA_FME_PORT_ASSIGN ioctl을 사용하여 할당하여 VF를 통해 노출될 수 있습니다.
가속 기능(AF) 유닛
- 가속기 기능(AF) 장치는 포트에 연결되고 가속기 관련 제어 레지스터에 사용되는 256K MMIO 영역을 노출합니다.
- 사용자 공간 애플리케이션은 Port 장치에서 open()을 사용하여 Port에 연결된 AFU에 대한 독점적 액세스 권한을 얻고 close()를 사용하여 이를 해제할 수 있습니다.
- 사용자 공간 애플리케이션은 MMIO 영역을 mmap() 가속기로 사용할 수도 있습니다.
부분 재구성
위에서 언급했듯이 가속기는 가속기 기능(AF)의 부분 재구성을 통해 재구성될 수 있습니다. file. 가속기 기능(AF)은 FPGA의 정확한 FIM 및 대상 정적 영역(포트)에 대해 생성되어야 합니다. 그렇지 않으면 재구성 작업이 실패하고 시스템 불안정성을 초래할 수 있습니다. 이 호환성은 AF 헤더에 기록된 인터페이스 ID를 sysfs를 통해 FME에서 노출된 인터페이스 ID와 비교하여 확인할 수 있습니다. 이 확인은 일반적으로 재구성 IOCTL을 호출하기 전에 사용자 공간에서 수행됩니다.
메모:
현재, 가상화된 호스트에서 실행되는 것을 포함하여 FPGA에 액세스하는 모든 소프트웨어 프로그램은 부분 재구성을 시도하기 전에 닫아야 합니다. 단계는 다음과 같습니다.
- 게스트에서 드라이버 언로드
- 게스트에서 VF를 분리합니다.
- SR-IOV 비활성화
- 부분 재구성 수행
- SR-IOV 활성화
- VF를 게스트에 연결하세요
- 게스트에 드라이버 로드
FPGA 가상화
VM에서 실행되는 애플리케이션에서 가속기에 액세스할 수 있도록 하려면 다음 단계에 따라 해당 AFU의 포트를 VF에 할당해야 합니다.
- PF는 기본적으로 모든 AFU 포트를 소유합니다. VF에 재할당해야 하는 모든 포트는 먼저 FME 장치의 FPGA_FME_PORT_RELEASE ioctl을 통해 PF에서 해제해야 합니다.
- PF에서 N개의 포트가 해제되면 아래 명령을 사용하여 SRIOV 및 VF를 활성화할 수 있습니다. 각 VF는 AFU가 있는 포트를 하나만 소유합니다. echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF를 거쳐 VM으로 전달합니다.
- VF 아래의 AFU는 VM의 애플리케이션에서 접근할 수 있습니다(VF 내부의 동일한 드라이버를 사용).
메모:
FME는 VF에 할당될 수 없으므로 PR 및 기타 관리 기능은 PF를 통해서만 사용할 수 있습니다.
운전자 조직
PCIe 모듈 장치 드라이버
운전자 조직
FPGA 장치는 일반 PCIe 장치로 나타납니다. 따라서 FPGA PCIe 장치 드라이버(intel-FPGA-PCI.ko)는 FPGA PCIe PF 또는 VF가 감지되면 항상 먼저 로드됩니다. 이 드라이버는 드라이버 아키텍처에서 인프라 역할을 합니다. 그것은:
- 기능 장치의 부모로 FPGA 컨테이너 장치를 생성합니다.
- PCIe 장치 BAR 메모리에 구현된 장치 기능 목록을 살펴보고, 기능이 있는 장치와 하위 기능을 검색하고, 컨테이너 장치 아래에 해당 기능에 대한 플랫폼 장치를 생성합니다.
- SR-IOV를 지원합니다.
- 하위 기능에 대한 작업을 추상화하고 일반적인 기능을 기능 장치 드라이버에 노출하는 기능 장치 인프라를 소개합니다.
PCIe 모듈 장치 드라이버 기능
- PCIe 검색, 장치 열거, 기능 검색을 포함합니다.
- 부모 장치, FPGA 관리 엔진(FME), 포트에 대한 sysfs 디렉토리를 생성합니다.
- 플랫폼 드라이버 인스턴스를 생성하여 Linux 커널이 해당 플랫폼 모듈 드라이버를 로드하도록 합니다.
FME 플랫폼 모듈 장치 드라이버
- 전원 및 열 관리, 오류 보고, 성능 보고 및 기타 인프라 기능. FME 드라이버에서 노출된 sysfs 인터페이스를 통해 이러한 기능에 액세스할 수 있습니다.
- 부분 재구성. FME 드라이버는 PR 하위 기능 초기화 중에 FPGA 관리자를 등록합니다. 사용자에게서 FPGA_FME_PORT_PR ioctl을 받으면 FPGA 관리자에서 공통 인터페이스 함수를 호출하여 지정된 포트에 대한 비트스트림의 부분 재구성을 완료합니다.
- 가상화를 위한 포트 관리. FME 드라이버는 두 개의 ioctl, FPGA_FME_PORT_RELEASE를 도입하여 PF에서 주어진 포트를 해제하고, FPGA_FME_PORT_ASSIGN은 포트를 다시 PF에 할당합니다. 포트가 PF에서 해제되면 PCIe 드라이버에서 제공하는 SR-IOV 인터페이스를 통해 VF에 할당할 수 있습니다. 자세한 내용은 "FPGA 가상화"를 참조하십시오.
FME 플랫폼 모듈 장치 드라이버 기능
- FME 문자 장치 노드를 생성합니다.
- FME sysfs를 생성합니다 files 및 FME sysfs를 구현합니다. file 접근자.
- FME 개인 기능 하위 드라이버를 구현합니다.
- FME 개인 기능 하위 드라이버:
- FME 헤더
- 열 관리
- 전원 관리
- 전역 오류
- 부분 재구성
- 글로벌 성과
포트 플랫폼 모듈 장치 드라이버
FME 드라이버와 유사하게 FPGA Port(및 AFU) 드라이버(intel-fpga-afu.ko)는 Port 플랫폼 장치가 생성되면 프로브됩니다. 이 모듈의 주요 기능은 사용자 공간 애플리케이션이 개별 가속기에 액세스할 수 있는 인터페이스를 제공하는 것입니다. 여기에는 Port의 기본 재설정 제어, AFU MMIO 영역 내보내기, DMA 버퍼 매핑 서비스, UMsg(1) 알림 및 원격 디버그 기능(위 참조)이 포함됩니다.
UMsg는 통합 FPGA가 있는 Intel Xeon® 프로세서용 가속 스택을 통해서만 지원됩니다.
포트 플랫폼 모듈 장치 드라이버 기능
- 포트 문자 장치 노드를 생성합니다.
- 포트 sysfs를 생성합니다 files 및 Port sysfs를 구현합니다. file 접근자.
- 포트 개인 기능 하위 드라이버를 구현합니다.
- 포트 개인 기능 하위 드라이버:
- 포트 헤더
- 영어: AFU (공중급유기)
- 포트 오류
- UMsg(2)
- 신호 탭
응용 프로그램 FPGA 장치 열거
이 섹션에서는 애플리케이션이 /sys/class/fpga 아래의 sysfs 계층에서 FPGA 장치를 열거하는 방법을 소개합니다. ex에서amp아래 le에서 두 개의 Intel FPGA 장치가 호스트에 설치되었습니다. 각 FPGA 장치에는 하나의 FME와 두 개의 포트(AFU)가 있습니다. 각 FPGA 장치에 대해 /sys/class/fpga 아래에 장치 디렉토리가 생성됩니다.
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
각 노드에는 하나의 FME와 두 개의 포트(AFU)가 자식 장치로 있습니다.
/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
일반적으로 FME/Port sysfs 인터페이스는 다음과 같이 명명됩니다.
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
I는 모든 컨테이너 장치에 연속 번호를 매기고, j는 FME에 연속 번호를 매기고, k는 모든 포트에 연속 번호를 매깁니다.
ioctl() 및 mmap()에 사용되는 장치 노드는 다음을 통해 참조할 수 있습니다.
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe 드라이버 열거
이 섹션은view intel-fpga-pci.ko에서 수행한 장치 열거에 대한 코드 흐름. 주요 데이터 구조와 기능이 강조 표시됩니다. 이 섹션은 다음과 같은 경우에 가장 잘 따릅니다. view동반되는 소스 코드(pcie.c)를 참조하세요.
열거형 데이터 구조
열거형 fpga_id_type {
부모_ID,
FME_ID,
포트_ID,
FPGA_ID_최대
};
정적 구조체 idr fpga_ids[FPGA_ID_MAX];
구조체 fpga_chardev_info {
const char *이름;
개발자_t 개발자;
};
구조체 fpga_chardev_info fpga_chrdevs[] = {
{ .이름 = FPGA_기능_개발_FME },
{ .name = FPGA_기능_개발_포트 },
};
정적 구조체 클래스 *fpga_class;
정적 구조체 pci_device_id cci_pcie_id_tbl[] = {
{PCI_장치(인텔 PCI_공급업체_ID, PCIe_장치_ID_RCiEP0_MCP),},
{PCI 장치(인텔 PCI 공급업체 ID, VF MCP PCIe 장치 ID),},
{PCI_장치(인텔 PCI_공급업체_ID, PCIe_장치_ID_RCiEP0_SKX_P),},
{PCI 장치(인텔 PCI 공급업체 ID, VF SKX P PCIe 장치 ID),},
{PCI_장치(인텔 PCI_공급업체_ID, PCIe_장치_ID_RCiEP0_DCP),},
{PCI 장치(인텔 PCI 공급업체 ID, VF DCP PCIe 장치 ID),},
{0,}
};
정적 구조체 pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_테이블 = cci_pcie_id_tbl,
.프로브 = cci_pci_프로브,
.제거 = cci_pci_제거,
.sriov_configure = cci_pci_sriov_configure
};
구조체 cci_drvdata {
int 장치 ID;
구조체 장치 *fme_dev;
구조체 뮤텍스 잠금;
구조체 리스트_헤드 포트_장치_리스트;
int 릴리스된 포트 번호;
구조체 list_head 영역;
};
구조체 빌드_기능_개발_정보 {
구조체 pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int 현재 막대;
__iomem *pfme_hdr을 무효화합니다.
구조체 장치 *parent_dev;
구조체 플랫폼 장치 *기능 장치;
};
열거 흐름
- ccidrv_init()
- idr_init()를 사용하여 fpga_ids를 초기화합니다.
- alloc_chrdev_region()을 사용하여 fpga_chrdevs[i].devt를 초기화합니다.
- class_create()를 사용하여 fpga_class를 초기화합니다.
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- PCI 장치를 활성화하고, 해당 지역에 대한 액세스를 요청하고, PCI 마스터 모드를 설정하고, DMA를 구성합니다.
- cci_pci_create_feature_devs() 빌드_정보_할당_및_초기화()
- 구조체 build_feature_devs_info를 할당하고 초기화합니다.
.parent_dev는 FME 및 Port sysfs 디렉토리를 포함하는 상위 sysfs 디렉토리(intel-fpga-dev.id)로 설정됩니다.
- 구조체 build_feature_devs_info를 할당하고 초기화합니다.
- 분석_특징_목록()
- BAR0 장치 기능 목록을 살펴보면서 FME, 포트와 각각의 개인 기능을 알아보세요.
- 분석_특징() 분석_특징_afus() 분석_특징_fme()
- FME가 발생하는 경우:
- 빌드_정보_생성_개발()
- FME에 대한 플랫폼 장치를 할당하고 build_feature_devs_info.feature_dev에 저장합니다.
- feature_dev.id는 idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent는 build_feature_devs_info.parent_dev로 설정됩니다.
- feature_dev.resource에 구조체 리소스 배열을 할당합니다.
- 구조체 feature_platform_data를 할당하고 초기화한 다음 feature_dev.dev.platform_data에 포인터를 저장합니다.
- create_feature_instance() 빌드_정보_추가_하위_기능()
- feature_dev.resource[FME_FEATURE_ID_HEADER]를 초기화합니다.
- 기능_플랫폼_데이터_추가()
- feature_platform_data.features[FME_FEATURE_ID_HEADER]를 초기화하고 .fops를 제외한 모든 항목을 초기화합니다.
- 분석_특징() 분석_특징_afus() 분석_특징_포트()
- 포트가 발견되면:
- 빌드_정보_생성_개발()
- 포트에 대한 플랫폼 장치를 할당하고 build_feature_devs_info.feature_dev에 저장합니다.
- feature_dev.id는 idr_alloc(fpga_ids[PORT_ID], 의 결과로 초기화됩니다.
- feature_dev.parent는 build_feature_devs_info.parent_dev로 설정됩니다.
- feature_dev.resource에 구조체 리소스 배열을 할당합니다.
- 구조체 feature_platform_data를 할당하고 초기화한 다음 feature_dev.dev.platform_data에 포인터를 저장합니다.
- 빌드_정보_커밋_개발()
- struct cci_drvdata.port_dev_list의 포트 목록에 포트에 대한 struct feature_platform_data.node를 추가합니다.
- create_feature_instance() 빌드_정보_추가_하위_기능()
- feature_dev.resource[PORT_FEATURE_ID_HEADER]를 초기화합니다.
- 기능_플랫폼_데이터_추가()
- feature_platform_data.features[PORT_FEATURE_ID_HEADER]를 초기화하고 .fops를 제외한 모든 것을 초기화합니다.
- 분석_특징() 분석_특징_afus() 분석_특징_포트_uafu()
- AFU가 발생하는 경우:
- create_feature_instance() 빌드_정보_추가_하위_기능()
- feature_dev.resource[PORT_FEATURE_ID_UAFU]를 초기화합니다.
- 기능_플랫폼_데이터_추가()
- feature_platform_data.features[PORT_FEATURE_ID_UAFU]를 초기화하고 .fops를 제외한 모든 항목을 초기화합니다.
- 분석_특징() 분석_특징_개인() 분석_특징_fme_개인()
- FME 개인 기능이 발견되는 경우:
- create_feature_instance() 빌드_정보_추가_하위_기능()
- feature_dev.resource[id]를 초기화합니다.
- 기능_플랫폼_데이터_추가()
- feature_platform_data.features[id]를 초기화하고 .fops를 제외한 모든 항목을 초기화합니다.
- 분석 기능() 분석 기능 개인() 분석 기능 포트 개인()
- 포트 개인 기능이 발견되는 경우: * create_feature_instance() build_info_add_sub_feature() * feature_dev.resource[id]를 초기화합니다. * feature_platform_data_add() feature_platform_data.features[id]를 초기화하고 .fops를 제외한 모든 항목을 초기화합니다.
- fme에서 포트를 분석합니다()
- 드라이버가 물리적 기능(PF)에 로드된 경우:
- FME 헤더에 설명된 각 포트에서 parse_feature_list() 플로우를 실행합니다.
- 헤더의 각 포트 항목에 언급된 BAR을 사용하세요.
FME 플랫폼 장치 초기화
이 섹션은view intel-fpga-fme.ko에서 수행한 FME 장치 초기화를 위한 코드 흐름. 주요 데이터 구조와 기능이 강조 표시됩니다. 이 섹션은 다음과 같은 경우에 가장 잘 따릅니다. view동반되는 소스 코드(fme-main.c)를 참조하세요.
FME 플랫폼 장치 데이터 구조
구조체 feature_ops {
int (*init)(구조체 플랫폼_장치 *pdev, 구조 기능 *기능);
int (*uinit)(구조체 플랫폼_장치 *pdev, 구조 기능 *기능);
long (*ioctl)(구조체 플랫폼 장치 *pdev, 구조 기능 *기능,
unsigned int cmd, unsigned long arg);
int (*test)(구조체 플랫폼_장치 *pdev, 구조 기능 *기능);
};
구조 기능 {
const char *이름;
int 리소스 인덱스;
void __iomem *ioaddr;
구조체 feature_ops *ops;
};
구조체 기능_플랫폼_데이터 {
구조체 리스트_헤드 노드;
구조체 뮤텍스 잠금;
부호 없는 긴 dev_status;
구조체 cdev cdev;
구조체 플랫폼_장치 *dev;
부호 없는 int 비활성화_카운트;
무효 *비공개;
정수 번호;
int (*config_port)(구조체 플랫폼 장치 *, u32, bool);
구조체 플랫폼 장치 *(*fpga_for_each_port)(구조 플랫폼 장치 *,
void *, int (*match)(struct platform_device *, void *)); 구조체
기능 기능[0];
};
구조체 perf_object {
정수 아이디;
const 구조체 속성 그룹 **속성 그룹;
구조체 장치 *fme_dev;
구조체 리스트_헤드 노드;
구조체 리스트_헤드 자식;
구조체 kobject kobj;
};
구조체 fpga_fme {
u8 포트_ID;
u64 pr_err;
구조체 장치 *dev_err;
구조체 perf_object *perf_dev;
구조체 feature_platform_data *pdata;
};
FME 플랫폼 장치 초기화 흐름
FME 초기화 흐름
- fme_probe() fme_dev_init()
- struct fpga_fme를 초기화하고 feature_platform_data.private 필드에 저장합니다.
- fme_probe() fpga_dev_feature_init() 기능_인스턴스_초기화()
- 채워진 각 기능에 대해 feature_platform_data.features에 구조체 feature_ops를 저장합니다.
- 구조체에서 테스트 함수가 있으면 호출합니다.
- 구조체에서 init 함수를 호출합니다.
- fme_probe() fpga_register_dev_ops()
- FME 문자 장치 노드를 생성하고 구조체를 등록합니다. file_운영.
포트 플랫폼 장치 초기화
이 섹션은view intel-fpga-afu.ko에서 수행한 포트 장치 초기화를 위한 코드 흐름. 주요 데이터 구조와 기능이 강조 표시됩니다. 이 섹션은 다음과 같은 경우에 가장 잘 따릅니다. view동반되는 소스 코드(afu.c)를 참조하세요.
포트 플랫폼 장치 데이터 구조
구조체 feature_ops {
int (*init)(구조체 플랫폼_장치 *pdev, 구조 기능 *기능);
int (*uinit)(구조체 플랫폼_장치 *pdev, 구조 기능 *기능);
long (*ioctl)(구조체 플랫폼 장치 *pdev, 구조 기능 *기능,
unsigned int cmd, unsigned long arg);
int (*test)(구조체 플랫폼_장치 *pdev, 구조 기능 *기능);
};
구조 기능 {
const char *이름;
int 리소스 인덱스;
void __iomem *ioaddr;
구조체 feature_ops *ops;
};
구조체 기능_플랫폼_데이터 {
구조체 리스트_헤드 노드;
구조체 뮤텍스 잠금;
부호 없는 긴 dev_status;
구조체 cdev cdev;
구조체 플랫폼_장치 *dev;
부호 없는 int 비활성화_카운트;
무효 *비공개;
정수 번호;
int (*config_port)(구조체 플랫폼 장치 *, u32, bool);
구조체 플랫폼 장치 *(*fpga_for_each_port)(구조 플랫폼 장치 *,
void *, int (*match)(구조체 플랫폼 장치 *, void *));
구조 기능 기능[0];
};
구조체 fpga_afu_region {
u32 인덱스;
u32 플래그;
u64 크기;
u64 오프셋;
u64 물리;
구조체 리스트_헤드 노드;
};
구조체 fpga_afu_dma_region {
u64 사용자 주소;
u64 길이;
u64 아이오와;
구조체 페이지 **페이지;
구조체 rb_node 노드;
사용중인 bool;
};
구조체 fpga_afu {
u64 지역 현재 오프셋;
int 지역 수;
u8 숫자_음수;
구조체 list_head 영역;
구조체 rb_root dma_regions;
구조체 feature_platform_data *pdata;
};
포트 플랫폼 장치 초기화 흐름
포트 초기화 흐름
- afu_probe() afu_dev_init()
- struct fpga_afu를 초기화하고 feature_platform_data.private 필드에 저장합니다.
- afu_probe() fpga_dev_feature_init() 기능 인스턴스 초기화()
- 채워진 각 기능에 대해 feature_platform_data.features에 구조체 feature_ops를 저장합니다.
- 구조체에서 테스트 함수가 있으면 호출합니다.
- 구조체에서 init 함수를 호출합니다.
- afu_probe() fpga_register_dev_ops()
- 구조체를 등록하여 Port 문자 장치 노드를 생성합니다. file_운영.
FME IOCTL
개방형에서 호출되는 IOCTL file /dev/intel-fpga-fme.j에 대한 설명자 FPGA_GET_API_VERSION—0부터 시작하는 정수로 현재 버전을 반환합니다.
FPGA_CHECK_EXTENSION—현재 지원되지 않음.
FPGA_FME_PORT_RELEASE—arg는 다음에 대한 포인터입니다.
구조체 fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 플래그; // in: 0이어야 함
__u32 port_id; // in: 해제할 포트 ID(0부터).
};
FPGA_FME_PORT_ASSIGN—arg는 다음에 대한 포인터입니다.
구조체 fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 플래그; // in: 0이어야 함
__u32 port_id; // in: 할당할 포트 ID(0부터). (반드시 있어야 함)
이전에 FPGA_FME_PORT_RELEASE로 릴리스됨)
};
FPGA_FME_PORT_PR—arg는 다음에 대한 포인터입니다.
구조체 fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 플래그; // in: 0이어야 함
__u32 port_id; // in: 포트 ID(0부터)
__u32 buffer_size; // in: 비트스트림 버퍼 크기(바이트). 4바이트여야 함
정렬됨.
__u64 buffer_address; // in: 비트스트림 버퍼의 프로세스 주소
__u64 status; // out: 오류 상태(비트 마스크)
};
포트 IOCTL
개방형에서 호출되는 IOCTL file /dev/intel-fpga-port.k FPGA_GET_API_VERSION에 대한 설명자 - 0부터 시작하여 현재 버전을 정수로 반환합니다. FPGA_CHECK_EXTENSION - 현재 지원되지 않습니다.
FPGA_PORT_GET_INFO—arg는 다음에 대한 포인터입니다.
구조체 fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 플래그; // out: 0을 반환합니다.
__u32 num_regions; // out: MMIO 지역 수, 2(AFU용 1개, MMIO용 1개)
(스텝피)
__u32 num_umsgs; // out: 하드웨어가 지원하는 UMsg의 수
};
FPGA_PORT_GET_REGION_INFO—arg는 다음에 대한 포인터입니다.
구조체 fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 플래그; // 출력: (비트 마스크) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA 지역 MMAP }
__u32 인덱스; // in: FPGA_PORT_INDEX_UAFU 또는 FPGA_PORT_INDEX_STP
__u32 패딩; // in: 0이어야 함
__u64 size; // out: MMIO 영역의 크기(바이트)
__u64 offset; // out: 장치 fd 시작 부분부터 MMIO 영역의 오프셋
};
FPGA_PORT_DMA_MAP—arg는 다음에 대한 포인터입니다.
구조체 fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 플래그; // in: 0이어야 함 __u64 user_addr; // in: 프로세스 가상
주소. 페이지 정렬이 필요합니다.
__u64 length; // in: 매핑 길이(바이트). 페이지의 배수여야 함
크기.
__u64 iova; // 출력: IO 가상 주소 };
FPGA_PORT_DMA_UNMAP—arg는 다음에 대한 포인터입니다.
구조체 fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 플래그; // in: 0이어야 함
__u64 iova; // in: 이전에 반환된 IO 가상 주소
FPGA_포트_DMA_MAP };
- FPGA_PORT_RESET—arg는 NULL이어야 합니다.
- FPGA_PORT_UMSG_ENABLE—arg는 NULL이어야 합니다.
- FPGA_PORT_UMSG_DISABLE—args는 NULL이어야 합니다.
FPGA_PORT_UMSG_SET_MODE—arg는 다음에 대한 포인터입니다.
구조체 fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 플래그; // in: 0이어야 함
__u32 hint_bitmap; // in: UMsg 힌트 모드 비트맵. 어떤 UMsg가
활성화됨.
};
FPGA_포트_UMSG_SET_BASE_ADDR—
- 이 ioctl을 실행하기 전에 UMsg를 비활성화해야 합니다.
- iova 필드는 모든 UMsg(num_umsgs * PAGE_SIZE)에 충분히 큰 버퍼여야 합니다.
- 버퍼는 드라이버의 버퍼 관리에 의해 "사용 중"으로 표시됩니다.
- iova가 NULL인 경우 이전 모든 지역은 "사용 중"으로 표시되지 않습니다.
- arg는 다음을 가리키는 포인터입니다.
구조체 fpga_port_umsg_base_addr {- u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
- u32 플래그; // in: 0이어야 함
- u64 iova; // in: FPGA_PORT_DMA_MAP의 IO 가상 주소. };
메모:
- 포트 오류를 지우려면 현재 오류의 정확한 비트 마스크를 작성해야 합니다. 예를 들어,ample, cat 오류 > 지우기
- UMsg는 통합 FPGA가 탑재된 Intel Xeon 프로세서용 가속 스택을 통해서만 지원됩니다.
시스템 파일 시스템 Files
FME 헤더 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-FME.j/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
포트_번호 | fme_header.capability.num_ports | 10진수 정수 | 읽기 전용 |
캐시 크기 | fme_header.capability.캐시_크기 | 10진수 정수 | 읽기 전용 |
버전 | fme_header.기능.패브릭_베리드 | 10진수 정수 | 읽기 전용 |
소켓_아이디 | fme_header.capability.socket_id | 10진수 정수 | 읽기 전용 |
비트스트림_아이디 | fme_header.비트스트림_아이디 | 64진수 uintXNUMX_t | 읽기 전용 |
비트스트림 메타데이터 | fme_헤더.비트스트림_md | 64진수 uintXNUMX_t | 읽기 전용 |
FME 열 관리 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-FME.j/열_mgmt/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
임계값1 | 열 임계값.tmp_thshold1 | 10진수 정수 | 사용자: 읽기 전용 루트: 읽기-쓰기 |
임계값2 | 열 임계값.tmp_thshold2 | 10진수 정수 | 사용자: 읽기 전용 루트: 읽기-쓰기 |
임계값_여행 | 열.임계값.열_여행_임계값 | 10진수 정수 | 읽기 전용 |
임계값1_도달됨 | 열.임계값.thshold1_상태 | 10진수 정수 | 읽기 전용 |
임계값2_도달됨 | 열.임계값.thshold2_상태 | 10진수 정수 | 읽기 전용 |
임계값1_정책 | 열.임계값.thshold_policy | 10진수 정수 | 사용자: 읽기 전용 루트: 읽기-쓰기 |
온도 | 열.rdsensor_fm1.fpga_temp | 10진수 정수 | 읽기 전용 |
FME 전원 관리 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-FME.j/파워_MGMT/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
소비하다 | 전원.상태.pwr_소모됨 | 64진수 uintXNUMX_t | 읽기 전용 |
임계값1 | 전력.임계값.임계값1 | 64진수 uintXNUMX_t | 사용자: 읽기 전용 루트: 읽기-쓰기 |
임계값2 | 전력.임계값.임계값2 | 64진수 uintXNUMX_t | 사용자: 읽기 전용 루트: 읽기-쓰기 |
임계값1_상태 | 전력.임계값.임계값1_상태 | 십진수 부호 없음 | 읽기 전용 |
임계값2_상태 | 전력.임계값.임계값2_상태 | 십진수 부호 없음 | 읽기 전용 |
rtl | 전원.상태.FPGA_지연_보고서 | 십진수 부호 없음 | 읽기 전용 |
FME 글로벌 오류 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-FME.j/오류/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
pcie0_오류 | gerror.pcie0_err | 64진수 uintXNUMX_t | 읽기-쓰기 |
pcie1_오류 | gerror.pcie1_err | 64진수 uintXNUMX_t | 읽기-쓰기 |
주입_오류 | gerror.ras_error_inj | 64진수 uintXNUMX_t | 읽기-쓰기 |
인텔-fpga-dev.i/인텔-fpga-fme.j/오류/fme-오류/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
오류 | gerror.fme_err | 64진수 uintXNUMX_t | 읽기 전용 |
첫 번째 오류 | gerror.fme_first_err.err_reg_status | 64진수 uintXNUMX_t | 읽기 전용 |
다음_오류 | gerror.fme_next_err.err_reg_status | 64진수 uintXNUMX_t | 읽기 전용 |
분명한 | 오류를 지웁니다, first_error, next_error | 다양한 uint64_t | 쓰기 전용 |
메모:
FME 오류를 지우려면 현재 오류의 정확한 비트마스크를 작성해야 합니다.ample cat 오류 > 지우기.
FME 부분 재구성 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-FME.j/pr/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
인터페이스_아이디 | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | 16진수 XNUMX바이트 | 읽기 전용 |
FME 글로벌 퍼포먼스 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-FME.j/Dperf/클럭
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
시계 | gperf.clk.afu_interf_clock | 64진수 uintXNUMX_t | 읽기 전용 |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGA가 있는 Intel Xeon CPU의 가속 스택에는 유효하지 않음)
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
꼭 매달리게 하다 | gperf.ch_ctl.동결 | 10진수 정수 | 읽기-쓰기 |
읽다_적중하다 | gperf.캐시_RD_HIT | 64진수 uintXNUMX_t | 읽기 전용 |
읽음_실패 | gperf.캐시_RD_미스 | 64진수 uintXNUMX_t | 읽기 전용 |
쓰기_히트 | gperf.캐시_WR_HIT | 64진수 uintXNUMX_t | 읽기 전용 |
쓰기_미스 | gperf.캐시_WR_미스 | 64진수 uintXNUMX_t | 읽기 전용 |
보류 요청 | gperf.캐시_홀드_요청 | 64진수 uintXNUMX_t | 읽기 전용 |
거래_요구_지연 | gperf.CACHE_TX_REQ_STALL | 64진수 uintXNUMX_t | 읽기 전용 |
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | 64진수 uintXNUMX_t | 읽기 전용 |
데이터 쓰기 포트 경합 | gperf.캐시_데이터_WR_포트_내용 | 64진수 uintXNUMX_t | 읽기 전용 |
tag_포트_경합_쓰기 | gperf.CACHE_TAG_WR_포트_내용 | 64진수 uintXNUMX_t | 읽기 전용 |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGA가 있는 Intel Xeon CPU의 가속 스택에는 유효하지 않음)
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
꼭 매달리게 하다 | gperf.vtd_ctl.동결 | 10진수 정수 | 사용자: 읽기 전용 루트: 읽기-쓰기 |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA가 있는 Intel Xeon CPU의 가속 스택에는 유효하지 않음)
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
읽기_거래 | gperf.VTD_AFU0_MEM_RD_TRANS | 64진수 uintXNUMX_t | 읽기 전용 |
쓰기_거래 | gperf.VTD_AFU0_MEM_WR_트랜스 | 64진수 uintXNUMX_t | 읽기 전용 |
tlb_읽기_적중 | gperf.VTD_AFU0_TLB_RD_HIT | 64진수 uintXNUMX_t | 읽기 전용 |
tlb_쓰기_히트 | gperf.VTD_AFU0_TLB_WR_HIT | 64진수 uintXNUMX_t | 읽기 전용 |
인텔-FPGA-장치.i/인텔-FPGA-FME.j/Dperf/패브릭/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
~할 수 있게 하다 | gperf.fab_ctl.(활성화됨) | 10진수 정수 | 사용자: 읽기 전용 루트: 읽기-쓰기 |
꼭 매달리게 하다 | gperf.fab_ctl.동결 | 10진수 정수 | 사용자: 읽기 전용 루트: 읽기-쓰기 |
pcie0_read | gperf.FAB_PCIE0_RD | 64진수 uintXNUMX_t | 읽기 전용 |
pcie0_write | gperf.FAB_PCIE0_WR | 64진수 uintXNUMX_t | 읽기 전용 |
pcie1_read | gperf.FAB_PCIE1_RD | 64진수 uintXNUMX_t | 읽기 전용 |
pcie1_write | gperf.FAB_PCIE1_WR | 64진수 uintXNUMX_t | 읽기 전용 |
유피_리드 | gperf.FAB_UPI_RD | 64진수 uintXNUMX_t | 읽기 전용 |
유피_라이트 | gperf.FAB_UPI_WR | 64진수 uintXNUMX_t | 읽기 전용 |
인텔-FPGA-EV.I/인텔-FPGA/FME.J/D퍼프/패브릭/포트K/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
pcie0_read | gperf.FAB_PCIE0_RD | 64진수 uintXNUMX_t | 읽기 전용 |
pcie0_write | gperf.FAB_PCIE0_WR | 64진수 uintXNUMX_t | 읽기 전용 |
pcie1_read | gperf.FAB_PCIE1_RD | 64진수 uintXNUMX_t | 읽기 전용 |
pcie1_write | gperf.FAB_PCIE1_WR | 64진수 uintXNUMX_t | 읽기 전용 |
유피_리드 | gperf.FAB_UPI_RD | 64진수 uintXNUMX_t | 읽기 전용 |
유피_라이트 | gperf.FAB_UPI_WR | 64진수 uintXNUMX_t | 읽기 전용 |
포트 헤더 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-포트.k/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
id | 포트 헤더.기능.포트 번호 | 10진수 정수 | 읽기 전용 |
왼쪽 | 포트 헤더.컨트롤.지연_허용 | 10진수 정수 | 읽기 전용 |
포트 AFU 헤더 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-포트.k/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
아푸_아이디 | afu_header.guid | 16진수 XNUMX바이트 | 읽기 전용 |
포트 오류 sysfs files
인텔-FPGA-장치.i/인텔-FPGA-포트.k/오류/
시스템 파일 시스템 file | mmio 필드 | 유형 | 입장 |
오류 | 오류.포트_오류 | 64진수 uintXNUMX_t | 읽기 전용 |
첫 번째 오류 | 오류.포트_첫번째_오류 | 64진수 uintXNUMX_t | 읽기 전용 |
첫 번째_잘못된_요청 | 페로르.말렉 | 16진수 XNUMX바이트 | 읽기 전용 |
분명한 | 오류(모든 오류) | 다양한 uint64_t | 쓰기 전용 |
메모:
포트 오류를 지우려면 현재 오류의 정확한 비트마스크를 작성해야 합니다.ample cat 오류 > 지우기.
개정 내역
문서 버전 | 변화 |
2017.10.02 | 최초 릴리스. |
OPAE Intel FPGA Linux 장치 드라이버 아키텍처 가이드
문서 / 리소스
![]() |
인텔 OPAE FPGA 리눅스 디바이스 드라이버 아키텍처 [PDF 파일] 사용자 가이드 OPAE FPGA 리눅스 디바이스 드라이버 아키텍처, OPAE FPGA, 리눅스 디바이스 드라이버 아키텍처, 드라이버 아키텍처, 아키텍처 |