PCI 구성 공간

PCI configuration space

PCI 구성 공간기존 PCI, PCI-XPCI Express가 버스에 삽입된 카드의 자동 구성을 수행하는 기본 방법이다.

개요

PCI 디바이스에는 구성 공간이라고 하는 레지스터 세트가 있으며 PCI Express는 디바이스에 확장된 구성 공간을 도입한다.구성 공간 레지스터는 메모리 위치에 매핑된다.장치 드라이버와 진단 소프트웨어는 구성 공간에 대한 액세스 권한이 있어야 하며, 운영 체제는 일반적으로 API를 사용하여 장치 구성 공간에 대한 액세스를 허용한다.운영 체제에 정의된 액세스 방법이나 메모리 매핑된 구성 공간 요청에 대한 API가 없는 경우 드라이버 또는 진단 소프트웨어는 운영 체제의 기본 액세스 규칙과 호환되는 방식으로 구성 공간에 액세스해야 하는 부담을 갖는다.모든 시스템에서 장치 드라이버는 운영체제가 제공하는 API를 사용하여 장치의 구성 공간에 접속하도록 권장된다.

기술정보

PCI 로컬 버스가 다른 I/O 아키텍처에 비해 크게 개선한 것 중 하나는 구성 메커니즘이었다.버스의 각 장치 기능에는 일반적인 메모리 매핑 및 I/O 포트 공간 외에도, 길이가 256바이트인 구성 공간이 있으며, 8비트 PCI 버스, 5비트 장치 및 장치의 3비트 기능 번호(일반적으로 버스/장치/기능에서 약칭하여 BDF 또는 B/D/F라고 함)를 알면 주소를 지정할 수 있다.이를 통해 각각 최대 32대의 기기를 탑재한 256대의 버스가 각각 8가지 기능을 지원할 수 있다.단일 PCI 확장 카드는 디바이스로 응답할 수 있으며 최소한 기능 번호 0을 구현해야 한다.처음 64바이트의 구성 공간은 표준화되었고, 나머지는 벤더 정의 목적으로 사용할 수 있다.

기존 용도와 충돌하지 않고 구성 공간의 더 많은 부분을 표준화할 수 있도록 PCI 구성 공간의 나머지 192바이트 내에 정의된 기능 목록이 있을 수 있다.각 기능에는 그것이 어떤 기능인지 설명하는 1바이트와 다음 기능을 가리키는 1바이트가 있다.추가 바이트 수는 기능 ID에 따라 달라진다.기능이 사용 중인 경우 상태 레지스터에 비트가 설정되고, 연결된 기능 목록의 첫 번째 기능에 대한 포인터가 표준 레지스터에 정의된 포인터 레지스터에 제공된다.

PCI-X 2.0과 PCI Express는 최대 4096바이트의 확장된 구성 공간을 도입했다.확장된 구성 공간의 유일한 표준화된 부분은 에서 처음 4바이트 입니다.확장된 기능 목록의 시작인 0x100.확장된 기능은 확장된 구성 공간에서 (8비트 대신 12비트를 사용하여) 바이트를 참조할 수 있고, 4비트 버전 번호와 16비트 기능 ID를 가질 수 있다는 점을 제외하면 일반 기능과 매우 유사하다.확장된 기능 ID는 일반 기능 ID와 겹치지만 별도 목록에 있어 혼동 가능성은 없다.

표준 레지스터

PCI Type 0(비브리지) 구성 공간 헤더 표준 레지스터

DID(Device ID) 및 VID(Vendor ID) 레지스터는 디바이스(예: IC)를 식별하며 일반적으로 PCI ID라고 부른다.16비트 벤더 ID는 PCI-SIG에 의해 할당된다.그런 다음 벤더가 16비트 장치 ID를 할당한다.알려진 모든 공급업체 및 장치 ID를 수집하는 비활성 프로젝트가 있다(아래 외부 링크 참조).

상태 레지스터는 지원되는 기능과 특정 유형의 오류가 발생했는지 여부를 보고하는 데 사용된다.명령 레지스터에는 개별적으로 활성화 및 비활성화할 수 있는 기능의 비트마스크가 포함되어 있다.헤더 유형 레지스터 값은 장치의 기능에 따라 헤더의 나머지 48바이트(64-16)의 다른 레이아웃을 결정한다.즉, 루트 콤플렉스, 스위치 및 브리지의 유형 1 헤더.그런 다음 끝점에 대해 0을 입력하십시오.캐시 라인 크기 레지스터는 장치가 메모리-쓰기-유효하지 않은 트랜잭션을 사용할 수 있다는 것을 알려주기 전에 프로그래밍되어야 한다.이 값은 일반적으로 CPU의 캐시 라인 크기와 일치해야 하지만 올바른 설정은 시스템에 따라 다르다.이 레지스터는 PCI Express에는 적용되지 않는다.

서브시스템 ID(SSID)서브시스템 벤더 ID(SVID)는 특정 모델(추가 카드 등)을 구분한다.공급업체 ID가 칩셋 제조업체의 ID인 반면 하위 시스템 공급업체 ID는 카드 제조업체의 ID이다.서브시스템 ID는 장치 ID와 동일한 숫자 공간의 서브시스템 벤더에 의해 할당된다.예를 들어 무선 네트워크 카드의 경우 칩 제조업체는 브로드컴 또는 아테로스일 수 있으며, 카드 제조업체는 넷기어 또는 D-링크일 수 있다.일반적으로 공급업체 ID-장치 ID 조합은 디바이스를 처리하기 위해 호스트가 로드해야 하는 드라이버를 VID가 동일한 모든 카드로 지정한다.DID 조합은 동일한 드라이버가 처리할 수 있다.서브시스템 벤더 ID-하위시스템 ID 조합은 카드를 식별하는데, 이는 운전자가 사소한 카드별 변경사항을 작동에 적용하기 위해 사용할 수 있는 정보의 일종이다.

버스 열거

PCI 디바이스를 어드레싱하려면 시스템의 I/O 포트 주소 공간 또는 메모리 매핑된 주소 공간에 매핑하여 해당 디바이스를 사용하도록 설정해야 한다.시스템의 펌웨어(예: BIOS) 또는 운영 체제PCI 컨트롤러에 구성 명령을 기록하여 디바이스에 리소스 구성을 알리기 위해 기본 주소 레지스터(일반적으로 BAR)를 프로그래밍한다.모든 PCI 디바이스는 시스템 재설정 시 비활성 상태에 있기 때문에 운영 체제나 디바이스 드라이버와 통신할 수 있는 주소가 할당되지 않는다.BIOS 또는 운영 체제가 슬롯별 IDSEL(Initialization Device Select) 신호를 사용하여 PCI 컨트롤러를 통해 PCI 디바이스(예: 마더보드의 첫 번째 PCI 슬롯, 두 번째 PCI 슬롯, 세 번째 PCI 슬롯 또는 통합 PCI 디바이스 등)를 지리적으로 해결한다.

PCI BAR 비트
비트 설명 가치
모든 PCI BAR의 경우
0 지역 유형 0 = 메모리
1 = I/O
메모리 바의 경우
2-1 위치 지정 가능 0 = 임의의 32비트
1 = < 1MB
2 = 모든 64비트
3 프리페치블 0 = 아니오
1 = 예
31-4 기본 주소 자연스럽게 16바이트 정렬
I/O BAR의 경우
1 예약됨
31-2 기본 주소 자연스럽게 4바이트 정렬

컴퓨터 전원이 켜지면 BIOS나 운영 체제에서 PCI 버스와 장치를 열거해야 한다.버스 열거는 각 버스, 장치 및 기능에 대한 PCI 구성 공간 레지스터에 대한 액세스를 시도함으로써 수행된다.VID 및 DID와 다른 장치 번호는 해당 버스의 장치 일련 번호일 뿐이라는 점에 유의하십시오.더욱이, 새로운 브리지가 감지된 후, 새로운 버스 번호가 정의되고, 기기 번호 0에서 기기 열거가 다시 시작된다.

#0 기능으로부터 응답이 수신되지 않는 경우, 버스 마스터는 중단을 수행하고 잘못된 VID/DID 값인 모든 비트-온 값(FFFFF 16진수)을 반환하므로 BIOS나 운영체제는 지정된 조합 버스/장치_번호/기능(B/D/F)이 존재하지 않음을 알 수 있다.따라서 주어진 버스/기기에 대해 함수 ID가 0으로 판독되면 마스터(이니시에이터)는 함수 번호 0을 구현하기 위해 기기가 필요하기 때문에 해당 버스에 작동 장치가 없는 것으로 가정해야 한다.이 경우 나머지 함수 번호(1~7)에 대한 판독도 존재하지 않으므로 필요하지 않다.

벤더 ID 레지스터를 위해 지정된 B/D/F 조합에 대한 읽기가 성공하면, 시스템 펌웨어 또는 운영 체제는 그것이 존재함을 알고, 모든 것을 BAR에 기록하고, 기기의 요청 메모리 크기를 인코딩된 형태로 다시 읽는다.설계는 모든 주소 공간 크기가 2의 검정력이며 자연스럽게 정렬된다는 것을 의미한다.[1]

이때 BIOS 또는 운영체제는 메모리 매핑된 주소와 I/O 포트 주소를 장치의 BAR 구성 레지스터에 프로그래밍한다.이 주소들은 시스템이 켜져 있는 한 유효하다.전원을 끄면 이러한 설정이 손실되고 다음에 시스템 전원을 다시 켤 때 절차가 반복된다.BIOS 또는 운영 체제는 각 PCI 디바이스에 대한 PCI 구성 공간의 일부 다른 레지스터(예: 인터럽트 요청)도 프로그래밍한다.이 전체 프로세스가 완전히 자동화되므로 사용자는 카드의 DIP 스위치를 직접 변경하여 새로 추가된 하드웨어를 수동으로 구성하는 작업을 면하게 된다.이 자동 장치 검색 및 주소 공간 할당은 플러그플레이가 구현되는 방법이다.

PCI-PCI 브리지가 발견되면 시스템은 브리지 너머에 보조 PCI 버스를 0 이외의 버스 번호를 할당하고 그 보조 버스의 장치를 열거해야 한다.더 많은 PCI 브리지가 발견되면 가능한 모든 도메인/버스/장치 조합이 검색될 때까지 검색은 반복적으로 계속된다.

각 비 브리지 PCI 디바이스 기능은 최대 6개의 BAR을 구현할 수 있으며, 각 BAR은 I/O 포트와 메모리 매핑된 주소 공간의 서로 다른 주소에 응답할 수 있다.각 BAR은 크기가 16바이트에서 2기가바이트 사이이며 4기가바이트 주소 공간 제한보다 작은 지역을 설명한다.플랫폼이 시스템 펌웨어에서 "4G 이상" 옵션을 지원하는 경우 64비트 BAR을 사용할 수 있다.

PCI 장치에도 옵션 ROM이 있을 수 있다.

하드웨어 구현

Configuration Space 액세스를 수행할 때 PCI 디바이스는 응답해야 하는지 여부를 결정하기 위해 주소를 디코딩하지 않고 대신 IDSEL(Initialization Device Select 신호)을 본다.각 IDSEL 신호에는 시스템 차원의 고유 활성화 방법이 있다.The PCI device is required to decode only the lowest order 11 bits of the address space (AD[10] to AD[0]) address/data signals, and can ignore decoding the 21 high order A/D signals (AD[31] to AD[11]) because a Configuration Space access implementation has each slot's IDSEL pin connected to a different high order address/data line AD[11] through AD[31. IDSEL 신호는 각 PCI 디바이스/어댑터 슬롯에 대해 다른 핀이다.

슬롯 n에서 카드를 구성하기 위해 PCI 버스 브릿지는 PCI 디바이스의 레지스터가 AD[7:2](AD[1:0]은 항상 0이며 레지스터는 이중 단어(32비트)이고, PCI 함수 번호는 AD[10:8]를 제외한 모든 고차 비트 0이 사용되고 있다.지정된 슬롯의 IDSEL 신호로 설정.

타이밍 중요(따라서 전기 부하에 민감한) AD[] 버스를 전기 부하로 줄이기 위해 PCI 슬롯 커넥터의 IDSEL 신호는 보통 저항을 통해 할당된 AD[n+11] 핀에 연결된다.이로 인해 PCI의 IDSEL 신호가 다른 PCI 버스 신호보다 더 느리게 활성 상태에 도달하게 된다(저항기와 IDSEL 핀의 입력 캐패시턴스 모두의 RC 시간 상수 때문에).따라서 IDSEL 신호가 유효한 레벨에 도달하기 위한 시간을 허용하기 위해 Configuration Space 액세스가 더 느리게 수행된다.

버스의 스캐닝은 두 개의 정의된 표준화된 포트에 액세스하여 Intel 플랫폼에서 수행된다.이러한 포트는 구성 공간 주소(0xCF8) I/O 포트 및 구성 공간 데이터(0xCFC) I/O 포트 입니다.Configuration Space Address I/O 포트에 쓰여진 값은 B/D/F 값과 레지스터 주소 값을 32비트 워드로 결합하여 생성된다.

소프트웨어 구현

구성 읽기 및 쓰기는 두 가지 방법으로 CPU에서 시작할 수 있다. 하나는 I/O 주소 0xCF80xCFC를 통한 레거시 방식이고 다른 하나는 메모리 매핑된 구성이다.[3]

기존 방식은 기존 PCI에 존재했으며, 이를 CAM(Configuration Access Mechanism)이라고 한다.그것은 PCI CONFIG_ADDRESS와 PCI CONFIG_DATA라는 두 개의 32비트 레지스터를 통해 256바이트의 디바이스 주소 공간에 간접적으로 도달할 수 있도록 한다.이러한 레지스터는 x86 I/O 주소 공간의 주소 0xCF80xCFC에 있다.[4]예를 들어 소프트웨어 드라이버(펌웨어, OS 커널 또는 커널 드라이버)는 이러한 레지스터를 사용하여 장치 레지스터의 주소를 CONFIG_ADDRESS에 기록하고 장치에 기록해야 할 데이터를 CONFIG_DATA에 입력하여 PCI 장치를 구성할 수 있다.이 과정은 기기의 레지스터를 작성하기 위해서는 레지스터에 대한 쓰기가 필요하므로, 이를 "직접"이라고 한다.

CONFIG_ADDRESS의 형식은 다음과 같다.

0x80000000   버스 << 16   장치 << 11   기능을 발휘하다 <<  8   상쇄하다 

앞에서 설명한 대로, 버스, 장치 및 기능(BDF)을 통해 장치를 다루는 것을 "지리적으로 장치를 추가하는 것"이라고도 한다.참조arch/x86/pci/early.c지리적 주소 지정을 사용하는 코드의 예에 대한 Linux 커널 코드.[5]

일부 AMD CPU에 확장된 구성 공간을 사용하는 경우 오프셋의 추가 비트 11:8이 CONFIG_ADDRESS 레지스터의 비트 27:24에 기록된다.[6][7]

0x80000000   (상쇄하다 & 0xf00) << 16   버스 << 16   장치 << 11   기능을 발휘하다 <<  8   (상쇄하다 & 0xff) 

두 번째 방법은 PCI Express를 위해 만들어졌다.그것은 ECAM(Enhanced Configuration Access Mechanism)이라고 한다.디바이스의 구성 공간을 4KB까지 확장하고, 하위 256바이트는 PCI의 원래(레거시) 구성 공간과 겹친다.주소 지정 가능한 공간의 섹션은 CPU로부터의 액세스가 메모리로 가지 않고 오히려 PCI Express 패브릭의 지정된 디바이스에 도달하도록 "stolen"이다.시스템 초기화 중에 BIOS는 이 "stolen" 주소 영역의 기본 주소를 결정하여 루트 콤플렉스 및 운영 체제에 전달한다.

각 장치에는 4KB의 공간이 있으며 각 장치의 정보는 간단한 배열을 통해 액세스할 수 있다.dev[bus][device][function]256MB의 물리적 인접 공간이 이 용도로 "골든"이 되도록 한다. (256 버스 × 32개 장치 × 8개 기능 × 4KB = 256MB).이 배열의 기본 물리적 주소가 지정되지 않음.예를 들어, 현대의 x86 시스템에서 ACPI 표는 필요한 정보를 포함하고 있다.[8]

참고 항목

참조

  1. ^ a b "Base Address Registers". PCI. osdev.org. 2013-12-24. Retrieved 2014-04-17.
  2. ^ "PCI configuration methods". read.seas.hardvard.edu. 2011-11-22. Retrieved 2021-09-27.
  3. ^ "Accessing PCI Express* Configuration Registers Using Intel Chipsets" (PDF). Intel Corporation. Retrieved 27 September 2018.
  4. ^ "PCI Configuration Mechanism #1". osdev.org. 2015-01-01. Retrieved 2015-01-01.
  5. ^ "kernel/git/stable/linux-stable.git: arch/x86/pci/early.c (Linux kernel stable tree, version 3.12.7)". kernel.org. Retrieved 2014-01-10.
  6. ^ "kernel/git/stable/linux-stable.git: arch/x86/pci/direct.c (Linux kernel stable tree, version 3.12.7)". kernel.org. Retrieved 2017-09-11.
  7. ^ Richter, Robert. "x86: add PCI extended config space access for AMD Barcelona". kernel.org. Retrieved 26 September 2018.
  8. ^ "XSDT - OSDev Wiki". Retrieved 2017-04-30.

외부 링크