4.8 PCI Express Root Complex
4.8.1 Introduction
i.MX SoC에 포함된 PCI Express 하드웨어 모듈은 Root Complex나 PCIe Endpoint로 작동하도록 구성될 수 있다. 이 문서는 i.MX SoC 제품군에서 PCI Express Root Complex 구현을 설명하는 데 사용된다. 또한, i.MX PCI Express 디바이스에서 Root Complex로 구성하고 작동하는 데 필요한 드라이버에 대해 설명한다.
PCI Express(PCIe)는 저비용, 대용량, 멀티플랫폼 상호 연결 사용을 목표로 하는 Third Generation I/O Interconnect이다. 이전 PCI와 PCI-X의 개념을 가지고 있으며, 아래와 같은 차이점이 있는 기존 PCI 소프트웨어에 대한 하위 호환성을 제공한다:
- PCIe는 지점 간(point-to-point)에 상호 연결
- 디바이스 사이의 시리얼 링크
- 패킷 기반 통신
- X1에서 X16까지 Lane의 집합을 통한 확장 가능한 성능
- 두 개 이상의 PCIe 디바이스를 연결하려면, PCIe 스위치가 필요
4.8.2 Terminology and Conventions (용어와 규칙)
아래의 용어와 규칙은 이 문서에서 사용되고 있다:
- Bridge (브리지)
PCI/PCI-X 세그먼트나 PCI Express Port를 내부 컴포넌트 상호 연결이나 다른 PCI/PCI-X 버스 세그먼트나 PCI Express Port와 가상 또는 실제로 연결하는 기능. - Downstream (다운스트림)
- Root Complex에서 더 멀리 있는 상호 연결/System Element (Port/컴포넌트)의 상대적인 위치이다. Switch의 Port는 Upstream Port가 아닌 Downstream Port이다. Root Complex의 모든 Port는 Downstream Port이다. Link에서 Downstream 컴포넌트는 Root Complex에서 더 멀리 있는 컴포넌트이다.
- Root Complex에서 정보가 빠져나가는 정보 흐름의 방향이다.
- Endpoint (엔드포인트)
정의된 여러 System Element 중 하나이다. Type 00h Configuration Space 헤더를 가지는 함수이다. - Host (호스트)
하나 이상의 Central Processing Unit(CPU)와 Root Complex로 연결된 여러 PCIe 노드에서 공유할 수 있는 Memory(RAM)와 같은 리소스로 구성된 엔티티이다. - Lane (레인)
전송용 한쌍과 수신용 한쌍의 차동 신호 쌍의 세트 - Link (링크)
두 개의 Port와 상호 연결되는 Lane의 모음이다. Link는 두 컴포넌트 사이의 듀얼 심플렉스 통신 경로이다. - PCIe Fabric (PCIe 패브릭)
디바이스라고도 하는 다양한 PCI Express 노드로 구성된 토폴로지이다. 패브릭의 디바이스는 Root Complex, Endpoint, PCIe-PCI/PCI-X Bridge 또는 Switch일 수 있다. - Port (포트)
- 논리적으로 컴포넌트와 PCI Express Link 사이의 인터페이스이다.
- 물리적으로 링크를 정의하는 동일한 칩에 위치한 Transmitters와 Receivers 그룹이다.
- Root Complex (루트 컴플렉스)
RC는 Host Bridge, 0개 이상의 Root Complex Integrated Endpoint, 0개 이상의 Root Complex Event Collector 그리고 하나 이상의 Root Port를 포함하는 정의된 System Element이다. - Root Port
연결된 가상 PCI-PCI Bridge를 통해 Hierarchy(계층 구조)의 일부를 매핑하는 Root Complex의 PCI Express Port이다. - Upstream
Root Complex에 더 가까운 상호 연결/System Element(Port/컴포넌트)의 상대적 위치이다. Root Complex에 토폴로지적으로 가장 가까운 Switch의 Port는 Upstream Port이다. Endpoint 또는 Bridge Function만 포함하는 컴포넌트의 Port는 Upstream Port이다. Link의 Upstream 컴포넌트는 Root Complex에 더 가까운 컴포넌트이다.
상대적으로 RC에 가까운 패브릭 요소는 'Upstream'으로 처리된다. RC에 가까운 모든 PCIe Endpoint 포트(브리지의 종단 지점 포함)와 Switch 포트를 해당 디바이스의 Upstream Port라고 한다. Upstream Flow는 RC 쪽으로 이동하는 통신이다.
4.8.3 PCIe Topology on i.MX
i.MX에는 하나의 PCIe 포트가 있다. 현재, Linux BSP에서는 RC 모드만 활성화되어 있다.
아래 그림은 i.MX의 PCIe RC 포트 다이어그램을 묘사한다.
PCI Enumeration Mapping (PCI 열거형 매핑)
PCI Express는 점대점(point to point) 토폴로지이므로, 레거시 PCI Bus(Software Enumeration에 사용되는 Device 개념)와의 호환성을 유지하기 위해 PCI 디바이스/기능 측면에서 다양한 노드와 해당 내부(예: PCIe Switch)를 식별할 수 있는 아래 개념을 도입한다:
- Host Bridge: Host에 대한 PCI 호환 연결을 위해 RC에 통합된 브리지이다. 이 브리지의 PCI 측은 항상 Bus #0이다. 즉, 이 버스의 디바이스는 호스트 자체가 된다.
- Virtual PCI-PCI Bridge: RC 또는 Switch의 일부인 각 PCI Express 포트는 가상 PCI-PCI 브리지로 처리된다. 즉, 각 포트에는 기본과 보조 PCI 버스가 있고 다운스트림은 원격 구성 공간에 매핑됨을 의미한다.
- 가상 브리지와 연결된 Root 포트에는 기본 측에 Bus #0가 있고, 다운스트림에 보조 버스가 있다.
- 각 PCIe Switch는 실제로 스위치의 업스트립 포트를 형성하는 다른 PCI-PCI 브리지의 보조 버스인 가상 PCI 버스에 연결된 다운스트림 포트 수만큼 많은 가상 PCI-PCI 브리지 모음으로 간주된다.
- 각 EP의 업스트립 포트는 스위치 또는 루트 포트의 다운스트림 포트를 나타내는 가상 PCI-PCI Bridge의 보조 버스 세그먼트의 일부일 수 있다.
4.8.4 Features
아래는 i.MX에서 PCI Express Root Complex드라이버로 지원하는 다양한 기능이다:
- Express Base Specification Revision 2.0 준수
- 단일 방향에서 5 GT/s 로우 전송 속도를 지원하는 x1 링크를 사용한 Gen2 작업
- Legacy Interrupts(INTx)와 MSI를 지원
- Max_Payload_Size 크기(128바이트)
- PCI 호환 소프트웨어 열거 지원을 제공하기 위해 Linux PCI Bus 프레임워크에 적합하다.
- 또한, Endpoint Driver에 대한 인터페이스를 제공하여 다운스트림에서 감지된 각 디바이스에 액세스한다.
- AER, ASP 등을 처리하기 위해, Linux OS의 PCI Express Port Bus Driver 프레임워크에서 동일한 인터페이스를 사용할 수 있다.
- Legacy Interrupts(INTx)와 같은 EP 드라이버를 위한 인터럽트 처리 기능
- Linux PCI 서브시스템의 일반적인 I/O 액세서리로 EP I/O BAR에 액세스한다.
- PCIe 오류의 원활한 처리
- L0, L0s, L1과 L1.1 ASPM 전원 관리를 지원
4.8.5 Linux OS PCI Subsystem and RC driver
Linux OS에서, PCI 구현은 크게 PCI BIOS Architecture-specific Linux OS 구현, Host Controller(RC) Module 그리고 Core와 같은 주요 컴포넌트로 나눌 수 있다.
- PCI 버스 초기화를 시작하기 위한 PCI BIOS Architecture-specific Linux OS 구현이다. 버스 열거와 리소스(메모리와 인터럽트 같은) 할당을 수행하기 위해 PCI Host Controller 코드와 PCI Core에 인터페이스한다. BIOS 실행이 성공적으로 완료되면, 시스템의 모든 PCI 디바이스에 사용 가능한 PCI 리소스의 일부와 개별 드라이버(Slave Driver라고도 함)가 할당된다. PCI는 PCI Core에서 제공되는 기능을 사용하여 이를 컨트롤할 수 있다. 리소스 할당은 건너뛸 수 있다(예로 PC 시나리오와 같이, Linux OS가 부팅되기 전에 할당된 경우).
- Host Controller (RC) Module은 하드웨어(SoC + Board) 특정 초기화와 구성을 처리하고 PCI BIOS를 호출한다. PCI 시스템 초기화와 구성 주기 동안 PCI 버스에 액세스하는 사이에 호출되는 PCI Core뿐만 아니라 BIOS에 대한 콜백 함수을 제공해야 한다. 사용 가능한 메모리/IO 공간, INTx 인터럽트 라인, MSI에 대한 리소스 정보를 제공한다. 또한, in _x_ () out _x_ ()를 통해 IO 공간 액세스(지원되는 대로)를 용이하게 해야 한다. read _x_ () write _x_ ()를 통해 간접 메모리 액세스(h/w에서 지원하는 경우)를 제공해야 할 수도 있다.
- Core는 시스템에서 브리지뿐만 아니라 버스 디바이스에 대한 데이터 구조 트리를 생성 및 초기화하고, bus/device 번호 지정을 처리하고, 디바이스 항목과 proc/sysfs 정보를 생성하고, BIOS와 슬레이브 드라이버에 대한 서비스를 제공하고, 핫 플러그 지원을 제공한다(선택 사항/ H/W에서 지원되야 함). (EP) 드라이버 인터페이스 쿼리를 대상으로 하고 열거 중에 발견된 해당 디바이스를 초기화한다. 또한 MSI 인터럽트 처리 프레임워크와 PCI 익스프레스 포트 버스 지원을 제공한다. Hot-Plug 지원(지원되는 경우)이 제공되면, 고급 오류 보고 지원, 전원 관리 이벤트 지원 그리고 PCI 익스프레스 포트에서 실행하기 위한 가상 Channel 지원(지원되는 경우)을 제공한다.
4.8.6 PCIe Driver Source Files
Table 45. Source Files
File | Description |
---|---|
drivers/pci/controller/dwc/pci-imx6.c | i.MX 6 PCIe 소스 |
4.8.7 System Resource: Memory Layout
- IO와 메모리 공간은 디바이스가 CPU의 Linux 커널에서 실행 중인 디바이스 드라이버와 통신하기 위해 사용하는 두 개의 주소 공간이다.
- 상위 16KB PCIe host configuration space
- 이 메모리 세그먼트는 PCIe RC의 구성 공간을 매핑하는 데 사용된다. SW는 DBI 인터페이스로 PCIe RC 코어 구성 공간에 액세스할 수 있다.
- PCIe device configuration space
- RC 다운스트림 포트에 삽입된 PCIe EP 디바이스의 구성 공간을 매핑하는 데 사용된다.
i.MX 8QuadMax/8QuadXPlus:
i.MX 8QuadMax에는 PCIeA와 PCIeB가 모두 있는 반면, i.MX 8QuadXPlus에는 PCIeB만 있다.
- PCIeA
- PCIe host configuration space: 0x5f00_0000 – 0x5f00_ffff (64K bytes)
- PCIe device configuration space: 0x6ff0_0000 – 0x6ff7_ffff (512K bytes)
- PCIe IO space: 0x6ff8_0000 – 0x6ff8_ffff (64K bytes)
- PCIe memory space: 0x6000_0000 – 0x6fef_ffff (255M bytes)
- PCIeB
- PCIe host configuration space: 0x5f01_0000 – 0x5f01_ffff (64K bytes)
- PCIe device configuration space: 0x7ff0_0000 – 0x7ff7_ffff (512K bytes)
- PCIe IO space: 0x7ff8_0000 – 0x7ff8_ffff (64K bytes)
- PCIe memory space: 0x7000_0000 – 0x7fef_ffff (255M bytes)
i.MX 8M Quad:
- PCIe0
- PCIe host configuration space: 0x3380_0000 – 0x33bf_ffff (4Mbytes)
- PCIe device configuration space: 0x1ff0_0000 – 0x1ff7_ffff (512K bytes)
- PCIe IO space: 0x1ff8_0000 – 0x1ff8_ffff (64K bytes)
- PCIe memory space: 0x1800_0000 – 0x1fef_ffff (127M bytes)
- PCIe1
- PCIe host configuration space: 0x33c0_0000 – 0x33ff_ffff (4Mbytes)
- PCIe device configuration space: 0x27f0_0000 – 0x27f7_ffff (512K bytes)
- PCIe IO space: 0x27f8_0000 – 0x27f8_ffff (64K bytes)
- PCIe memory space: 0x2000_0000 – 0x27ef_ffff (127M bytes)
4.8.8 System Resource: Interrupt lines
i.MX Root Complex 드라이버는 i.MX 6플랫폼의 MSI INT에 대해 인터럽트 라인 152를 사용하고, i.MX 7Dual 플랫폼의 MSI INT에 대해 154를 사용한다.