PCIe

Hot Plug and Power Budgeting

PCIeMaster 2024. 12. 11. 15:43

Background 

 

PCIe를 사용하는 일부 시스템은 고가용성(high availability) 또는 무중단 운영이 필요합니다. 온라인 서비스 제공업체는 연간 몇 분 이하의 다운타임을 경험하는 컴퓨터 시스템을 요구합니다. 이러한 시스템을 구축하는 데는 많은 요소가 있지만, 장비의 신뢰성이 분명히 중요합니다. 이러한 목표를 달성하기 위해 PCIe는 다음과 같은 세 가지 중요한 기능을 제공하는 애드인(add-in) 카드용 Hot Plug/Hot Swap 솔루션을 지원합니다:

  1. 시스템을 종료하지 않고 고장 난 확장 카드를 교체할 수 있는 방법
  2. 수리 중 운영체제(O/S) 및 기타 서비스의 실행 유지
  3. 고장 난 장치와 관련된 소프트웨어의 종료 및 재시작

PCI가 널리 수용되기 이전에는 이러한 종류의 확장 카드 제거 및 교체를 지원하기 위해 다양한 독점적인 Hot Plug 솔루션이 개발되었습니다. 초기 PCI 구현은 카드의 핫 제거(Hot removal) 및 삽입(insertion)을 지원하지 않았지만, PCI에서 이 기능을 지원하기 위한 두 가지 표준화된 솔루션이 개발되었습니다. 첫 번째는 PC 서버 마더보드 및 확장 섀시 구현에서 사용되는 Hot Plug PCI 카드입니다. 두 번째는 Hot Swap이라고 불리며, 패시브(passive) PCI 백플레인 구현을 기반으로 하는 CompactPCI 시스템에서 사용됩니다.

두 솔루션 모두 공유된 PCI 버스로부터 카드 로직을 전기적으로 분리하기 위해 제어 로직을 사용합니다. 전원, 리셋, 클럭(clock)은 카드 제거 및 교체 시 질서 있게 전원을 끄고 켜도록 제어되며, 상태 및 전원 LED는 사용자가 카드를 안전하게 교체할 수 있는 시점을 알려줍니다.

PCI Express 카드에 대한 Hot Plug 지원을 확장하는 것은 당연한 단계이며, 설계자는 PCIe에 "기본" 기능으로 일부 Hot Plug 기능을 통합했습니다. 이 기능에는 Hot Plug 메시징, 레지스터, 그리고 이러한 기능을 지원하기 위한 절차가 포함됩니다.

 

Hot Plug in the PCI Express Environment 

PCIe Hot Plug는 PCI용 Standard Hot Plug Controller 사양(SHPC 1.0)의 1.0 리비전에서 파생되었습니다. PCI Express Hot Plug의 목표는 다음과 같습니다:

  • Standard Hot Plug Controller 사양에서 정의한 동일한 "표준화된 사용 모델(Standardized Usage Model)"을 지원합니다. 이를 통해 PCI Express Hot Plug가 사용자 관점에서 SHPC 1.0 사양을 기반으로 하는 기존 구현과 동일하게 작동하도록 보장합니다.
  • 기존 운영 체제에서 구현된 동일한 소프트웨어 모델을 지원합니다. 그러나 SHPC 1.0 호환 드라이버를 사용하는 운영 체제는 PCI Express Hot Plug 컨트롤러와 호환되지 않습니다. 이는 프로그래밍 인터페이스가 다르기 때문입니다.

Hot Plug Controller를 지원하기 위해 필요한 레지스터는 개별 루트 포트와 스위치 포트에 통합됩니다. Hot Plug 소프트웨어 제어 하에서, 이러한 컨트롤러와 관련된 포트 인터페이스는 카드 인터페이스 신호를 제어하여 카드가 변경될 때 질서 있는 전원 차단 및 전원 공급이 이루어지도록 해야 합니다. 이를 달성하려면 다음이 필요합니다:

  • PCI Express 카드 커넥터에 대해 PERST# 신호를 어설트(assert) 및 디어설트(deassert)합니다.
  • 카드 커넥터의 전원을 제거하거나 공급합니다.
  • 특정 카드 커넥터와 관련된 전원 및 주의 표시기를 선택적으로 켜거나 꺼서 사용자의 주의를 해당 커넥터로 유도하고 슬롯에 전원이 공급되고 있는지 표시합니다.
  • 슬롯 이벤트(예: 카드 제거)를 모니터링하고 이를 소프트웨어에 인터럽트를 통해 보고합니다.

PCI Express Hot-Plug(PCI와 마찬가지로)는 "예상치 못한 일이 없는" Hot-Plug 방식으로 설계되었습니다. 다시 말해, 사용자는 시스템에 알리지 않고 PCI Express 카드를 설치하거나 제거할 수 없습니다. 소프트웨어는 카드와 슬롯을 모두 준비한 후, Hot Plug 프로세스 상태와 설치 또는 제거가 이제 수행될 수 있음을 운영자에게 알립니다

 

Surprise Removal Notification 

 

PCIe 카드 전기기계 사양(CEM)에 따라 설계된 카드는 커넥터에 카드 존재 감지 핀(PRSNT1# 및 PRSNT2#)을 구현합니다. 이러한 핀은 다른 핀보다 짧아 슬롯에서 카드가 제거될 때 먼저 접촉이 끊어지도록 설계되었습니다. 이는 신호 접촉이 끊어지기 전에 전원을 제거할 시간을 제공하여 소프트웨어에 "예상치 못한" 제거를 사전에 알리는 데 사용할 수 있습니다.

 

Differences between PCI and PCIe Hot Plug

Hot Plug을 지원하기 위해 필요한 요소는 PCI와 PCIe Hot Plug 솔루션 모두에서 본질적으로 동일합니다. 페이지 850의 그림 19-1은 Hot Plug를 지원하기 위해 필요한 PCI 하드웨어 및 소프트웨어 요소를 보여줍니다. PCI 솔루션은 시스템 보드에 단일 표준화된 Hot Plug 컨트롤러를 구현하여 버스의 모든 Hot Plug 슬롯을 처리합니다.

 

PCI 환경에서는 활성 버스의 신호에 간섭(glitch)이 발생하지 않도록 변경을 하기 전에 공유 버스로부터 카드를 전기적으로 분리하기 위해 Isolation Logic(분리 로직)이 필요합니다.

 

PCIe는 포인트-투-포인트(point-to-point) 연결을 사용합니다(페이지 851의 그림 19-2 참조). 이 방식은 Isolation Logic이 필요하지 않지만, 각 커넥터가 연결된 포트마다 별도의 Hot Plug 컨트롤러가 필요합니다. 각 Root 포트와 Switch 포트를 위해 정의된 표준화된 소프트웨어 인터페이스는 Hot Plug 작업을 제어합니다.

 

 

Elements Required to Support Hot Plug 

페이지 851의 그림 19-2에서 볼 수 있듯이, Hot Plug 환경을 작동시키기 위해 여러 구성 요소가 필요합니다. 논의를 위해 이를 소프트웨어 요소와 하드웨어 요소로 나누어 살펴보겠습니다.

 

Software Elements

 

다음 표는 Hot Plug 기능을 지원하는 주요 소프트웨어 요소를 설명합니다.

 

 

<Table 19-1 : Introduction to Major Hot-Plug Software Elements >

Software Element  Supplied by Description
User Interface OS vendor  OS에서 제공하는 유틸리티로, 사용자가 커넥터의 전원을 꺼서 카드를 제거하거나 전원을 켜서 방금 설치된 카드를 사용할 수 있도록 허용합니다.
Hot-Plug Service OS vendor 운영 체제(OS)가 발행하는 요청(Hot-Plug 기본 작업이라고도 함)을 처리하는 서비스입니다. 이러한 요청에는 다음이 포함됩니다:
  • 슬롯 식별자 제공
  • 카드 전원 켜기 또는 끄기
  • 주의 표시기 켜기 또는 끄기
  • 슬롯의 현재 전원 상태 읽기(켜짐 또는 꺼짐)
Hot-Plug 서비스는 요청을 처리하기 위해 Hot-Plug 시스템 드라이버와 상호 작용합니다. Hot-Plug 시스템 드라이버와의 인터페이스(API)는 OS 공급자가 정의합니다.
표준화된 Hot-Plug 시스템 드라이버 (Standardized Hot-Plug System Driver) 시스템 보드 공급자 또는 OS OS 내의 Hot-Plug 서비스로부터 요청(Hot-Plug 기본 작업)을 수신합니다. 하드웨어 Hot-Plug 컨트롤러와 상호 작용하여 요청을 처리합니다.
Device Driver Adapter card vendor Hot-Plug 기능을 지원하기 위해 특정 Hot-Plug 기능이 장치 드라이버에 포함되어야 합니다. 포함되는 기능:
- Quiesce 명령 지원
- Pause 명령 선택적 지원
- Start 명령 또는 선택적 Resume 명령 지원

 

Hot-Plug 기능을 지원하는 시스템이 Hot-Plug 기능을 지원하지 않는 OS를 사용할 수 있습니다. 이 경우 시스템 BIOS에 Hot-Plug 관련 소프트웨어가 포함되어 있을지라도, Hot-Plug 서비스는 존재하지 않을 것입니다. 사용자가 카드를 핫 삽입하거나 제거하려고 하지 않는다고 가정하면, 시스템은 표준 비-Hot-Plug 시스템으로 작동합니다:

  • 시스템 시작 펌웨어는 모든 주의 표시기가 꺼져 있는지 확인해야 합니다.
  • 사양에는 또한 다음과 같이 명시되어 있습니다: "Hot-Plug 슬롯은 비-Hot-Plug 시스템 소프트웨어를 로드하는 데 적합한 상태에 있어야 한다."

Hardware Elements

 

페이지 853의 표 19-2는 PCI Express Hot-Plug 작업을 지원하기 위해 필요한 주요 하드웨어 요소를 나열합니다.

 

<Table 19-2: Major Hot-Plug Hardware Elements>

Hardware Element Description
Hot-Plug Controller Hot-Plug 시스템 드라이버가 발행한 명령을 수신하고 처리합니다. 핫플러그 작업을 지원하는 각 Root 또는 Switch 포트에 하나의 컨트롤러가 연결됩니다. PCIe 사양은 Hot-Plug Controller를 위한 표준 소프트웨어 인터페이스를 정의합니다.
Card Slot Power Switching Logic 슬롯의 전원을 프로그램 제어 하에 켜거나 끌 수 있도록 합니다. Hot-Plug 시스템 드라이버의 지시에 따라 Hot Plug 컨트롤러가 제어합니다.
Card Reset Logic Hot Plug 컨트롤러가 Hot-Plug 시스템 드라이버의 지시에 따라 특정 슬롯에 PERST# 신호를 전달합니다.
Power Indicator 커넥터에 현재 전원이 공급되고 있는지를 나타냅니다. 각 포트와 연결된 Hot Plug 로직에 의해 제어되고 Hot Plug 시스템 드라이버가 지시합니다.
Attention Indicator 서비스가 필요한 커넥터에 대해 작업자의 주의를 끕니다. Hot Plug 로직에 의해 제어되고 Hot Plug 시스템 드라이버가 지시합니다.
Attention Button 작업자가 Hot Plug 소프트웨어에 카드 변경 요청을 알리기 위해 누르는 버튼입니다.
Card Present Detect Pins PRSNT1#은 카드 슬롯의 한쪽 끝에, PRSNT2#은 반대쪽 끝에 위치합니다. 이 핀들은 다른 핀보다 짧아 카드가 제거될 때 먼저 접촉이 끊어지도록 설계되었습니다.
시스템 보드는 PRSNT1#을 접지에 연결하고 PRSNT2#을 Pull-up 저항기를 사용하여 Hot Plug 컨트롤러의 입력으로 연결합니다. 추가 PRSNT2# 핀은 더 넓은 커넥터를 지원하며, 길이가 더 짧은 카드가 긴 커넥터에 삽입되었을 때 인식할 수 있도록 정의됩니다. 카드 자체는 PRSNT1#을 PRSNT2#에 연결(short)하여, 카드가 물리적으로 연결되어 있지 않을 경우 PRSNT2# 입력이 낮아지도록(low) 설계되었습니다.

 

 

카드 제거 및 삽입 절차

다음에 나오는 일반적인 카드 제거 및 삽입 절차에 대한 설명은 기본적인 소개를 목적으로 합니다. 이 절차는 새로 설치된 장치를 구성하는 책임이 Hot-Plug 시스템 드라이버가 아닌 운영 체제(OS)에 있다는 가정을 기반으로 합니다. Hot-Plug 시스템 드라이버가 이 책임을 가진 경우, Hot-Plug 서비스는 Hot-Plug 시스템 드라이버를 호출하여 새로 설치된 장치를 구성하도록 지시할 것입니다.

 

켜짐(On) 및 꺼짐(Off) 상태
켜짐(On) 상태의 슬롯은 다음과 같은 특징을 가집니다:

  • 슬롯에 전원이 공급됩니다.
  • REFCLK(참조 클럭)가 켜져 있습니다.
  • 링크가 활성 상태이거나 Active State Power Management 상태에 있습니다.
  • PERST# 신호가 비활성화(deassert)됩니다.

꺼짐(Off) 상태의 슬롯은 다음과 같은 특징을 가집니다:

  • 슬롯에 전원이 차단됩니다.
  • REFCLK이 꺼져 있습니다.
  • 링크가 비활성 상태입니다(스위치 포트 루트의 드라이버가 Hi Z 상태).
  • PERST# 신호가 활성화(assert)됩니다.

Turning Slot Off
켜짐(On) 상태에 있는 슬롯을 끄기 위한 단계는 다음과 같습니다:

  • 링크를 비활성화합니다. 이를 위해 EI(OS)를 사용하여 Hi Z 상태로 진입할 수 있습니다.
  • 슬롯에 PERST# 신호를 활성화합니다.
  • 슬롯의 REFCLK를 끕니다.
  • 슬롯에서 전원을 제거합니다.

Turning Slot On

현재 꺼짐(Off) 상태인 슬롯을 켜기 위한 단계:

  • 슬롯에 전원을 공급합니다.
  • 슬롯의 REFCLK(참조 클럭)를 켭니다.
  • 슬롯에 PERST# 신호를 비활성화(deassert)합니다. 시스템은 PCI Express 사양에 명시된 설정 및 유지 타이밍 요구 사항을 PERST# 상승 에지(rising edge)에 맞춰 충족해야 합니다.

전원과 클럭이 복구되고 PERST#이 제거되면, 두 포트의 물리 계층은 링크 트레이닝과 초기화를 수행합니다. 링크가 활성화되면, 장치는 VCO(흐름 제어 포함)를 초기화하여 링크가 TLP(전송 레이어 패킷)를 전송할 준비가 되도록 합니다.

 

Card Removal Procedure 

카드를 제거하려면 소프트웨어와 하드웨어를 준비하여 안전하게 제거를 수행하고, 카드가 처리 중임을 나타내는 표시등 상태를 설정해야 합니다. 정상적인 작동 중 표시등의 상태는 다음과 같습니다:

  • 주의 표시등(Amber 또는 Yellow) - 정상 작동 중 "꺼짐(Off)" 상태
  • 전원 표시등(Green) - 정상 작동 중 "켜짐(On)" 상태

소프트웨어는 Hot Plug 컨트롤러에 요청을 전송하며, 이는 Hot-Plug 지원 포트에서 구현된 슬롯 제어 레지스터를 대상으로 하는 구성 쓰기를 통해 이루어집니다. 이 요청은 슬롯의 전원과 표시등 상태를 제어합니다.

이벤트 순서는 다음과 같습니다:

  1. 작업자가 슬롯의 주의 버튼을 눌러 카드 제거를 요청하거나, 시스템의 사용자 인터페이스를 사용하여 제거할 물리적 슬롯 번호를 선택합니다. 버튼을 사용하는 경우, Hot-Plug 컨트롤러는 이 이벤트를 감지하고 루트 컴플렉스에 인터럽트를 전달합니다. 이 인터럽트는 Hot Plug 서비스가 Hot Plug 시스템 드라이버를 호출하여 슬롯 상태 정보를 읽고 주의 버튼 요청을 감지하도록 지시합니다.
  2. 이후 Hot-Plug 서비스는 Hot Plug 시스템 드라이버에 명령을 내려 슬롯의 전원 표시등을 깜박이게 하여 작업자에게 시각적 피드백을 제공합니다(5초 동안). 이 작업이 주의 버튼을 누르는 것으로 시작된 경우, 작업자는 이 5초 시간 내에 버튼을 다시 눌러 요청을 취소할 수 있습니다.
  3. Hot Plug 소프트웨어가 요청을 검증하는 동안 전원 표시등은 깜박이는 상태를 유지합니다. 카드가 중요한 시스템 작업에 사용 중인 경우, 소프트웨어는 요청을 거부할 수 있습니다. 이 경우, Hot-Plug 컨트롤러에 전원 표시등을 다시 켜도록 명령을 내립니다. 또한, 소프트웨어는 작업자에게 요청이 거부된 이유를 알리는 메시지를 표시하거나 로그 항목을 작성하도록 권장합니다.
  4. 요청이 검증되면, Hot-Plug 서비스 유틸리티가 카드의 장치 드라이버에 장치를 "조용히(Quiesce)" 하도록 명령합니다. 즉, 새로운 요청 생성을 비활성화하고 모든 루트 또는 스위치 포트 요청을 완료하거나 종료하도록 설정합니다.
  5. 이후 소프트웨어는 슬롯이 연결된 루트 또는 스위치 포트의 링크 제어 레지스터를 통해 카드의 링크를 비활성화하는 명령을 내립니다.
  6. 다음으로, 소프트웨어는 Hot Plug 컨트롤러에 슬롯의 전원을 끄도록 명령합니다.
  7. 전원이 성공적으로 꺼진 후, 소프트웨어는 전원 표시등을 끄는 요청을 발행하여 작업자가 카드 제거가 가능하다는 것을 알 수 있도록 합니다.
  8. 작업자가 기계적 고정 래치를 해제하면(있는 경우), Hot Plug 컨트롤러는 슬롯의 모든 스위칭 신호(예: SMBus 및 JTAG 신호)를 제거합니다. 이제 카드를 제거할 수 있습니다.
  9. 운영 체제(OS)는 장치에 할당된 메모리 공간, I/O 공간, 인터럽트 라인 등을 할당 해제하고, 이러한 리소스를 향후 다른 장치에 할당할 수 있도록 합니다.

Card Insertion Procedure 

새 카드를 설치하는 절차는 기본적으로 카드 제거 절차를 반대로 수행하는 것입니다. 다음 단계는 슬롯이 카드가 커넥터에서 제거된 직후와 동일한 상태로 남아 있다고 가정합니다(즉, 전원 표시등이 꺼져 있어 슬롯이 카드 삽입 대기 상태임을 나타냅니다).

카드를 삽입하고 활성화하는 단계는 다음과 같습니다:

  1. 작업자가 카드를 설치하고 MRL(Mechanical Retention Latch)을 고정합니다. MRL 센서가 구현된 경우, 센서는 래치가 닫혀 있음을 Hot Plug 컨트롤러에 신호로 알리며, 보조 신호와 VauxV_{aux}가 슬롯에 연결되도록 합니다.
  2. 작업자가 주의 버튼을 누르거나 Hot Plug 유틸리티 프로그램을 사용하여 슬롯을 선택함으로써 Hot Plug 서비스에 카드가 설치되었음을 알립니다.
  3. 버튼이 눌린 경우, 이벤트를 Hot Plug 컨트롤러에 신호로 보냅니다. 이는 상태 레지스터 비트를 설정하고 시스템 인터럽트를 루트 컴플렉스로 전송하는 결과를 초래합니다. 이후 Hot Plug 소프트웨어가 포트로부터 슬롯 상태를 읽고 요청을 인식합니다.
  4. Hot Plug 서비스는 Hot Plug 시스템 드라이버에 요청을 전달하여 Hot Plug 컨트롤러가 슬롯의 전원 표시등을 깜박이게 하도록 명령합니다. 이는 작업자에게 카드를 제거해서는 안 된다는 정보를 제공합니다. 작업자는 표시등이 깜박이기 시작한 시점부터 5초 동안 버튼을 다시 눌러 요청을 취소할 수 있는 기회를 가집니다.
  5. 전원 표시등은 Hot Plug 소프트웨어가 요청을 검증하는 동안 깜박이는 상태를 유지합니다. 소프트웨어가 요청을 검증하지 못할 수 있으며(예: 보안 정책 설정으로 슬롯이 활성화되지 않을 수 있음), 요청이 검증되지 않으면 Hot Plug 컨트롤러에 전원 표시등을 끄도록 명령합니다. 사양에서는 소프트웨어가 작업자에게 요청 거부의 원인을 알리는 메시지를 표시하거나 로그 항목을 기록하도록 권장합니다.
  6. Hot-Plug 서비스는 Hot Plug 시스템 드라이버에 요청을 전달하여 슬롯의 전원을 켜도록 명령합니다.
  7. 전원이 공급되면, 소프트웨어는 전원 표시등을 켜도록 명령합니다.
  8. 링크 트레이닝이 완료되면, 운영 체제(OS)는 플랫폼 구성 루틴(Platform Configuration Routine)에 명령을 내려 카드 기능을 구성하고 필요한 리소스를 할당합니다.
  9. OS는 PCI Express 장치 내에서 해당 기능에 적합한 드라이버를 찾습니다(검색 기준으로 Vendor ID와 Device ID, 또는 Class Code, Subsystem Vendor ID 및 Subsystem ID 구성 레지스터 값을 사용) 그리고 이를 메모리에 로드합니다.
  10. OS는 드라이버 초기화 코드 진입점(Initialization Code Entry Point)을 호출하여 프로세서가 드라이버 초기화 코드를 실행하도록 합니다. 이 코드는 장치의 설정을 완료하고 PCI 구성 명령 레지스터에 적절한 비트를 설정하여 장치를 활성화합니다.

Standard Hot Plug Controller Signaling Interface. 

페이지 864의 그림 19-3은 슬롯과 포트 간에 라우팅된 신호와 함께 Switch 포트 내 논리의 더 자세한 뷰를 제공합니다. 표준화된 Hot Plug 컨트롤러의 중요성은 장치 드라이버가 운영 체제에 통합되도록 하는 공통 소프트웨어 인터페이스입니다.

PCIe 사양은 Card ElectroMechanical(CEM) 사양과 함께 슬롯 신호 및 Hot Plug PCI Express 지원에 필요한 요구 사항을 정의합니다. 다음은 표준 사용 모델을 지원하기 위해 필요한 필수 및 선택적 포트 인터페이스 신호 목록입니다:

  • PWRLED# (필수) - 전원 표시등 상태를 제어하는 포트 출력
  • ATNLED# (필수) - 주의 표시등 상태를 제어하는 포트 출력
  • PWREN (참조 클럭이 구현된 경우 필수) - 슬롯의 메인 전원을 제어하는 포트 출력
  • REFCLKEN# (필수) - 슬롯에 참조 클럭을 제공하는 포트 출력
  • PERST# (필수) - 슬롯에서 PERST#을 제어하는 포트 출력
  • PRSNT1# (필수) - 커넥터에서 접지된 입력 포트
  • PRSNT2# (필수) - 시스템 보드에서 Pull-up된 입력 포트로, 슬롯에 카드가 있는지 나타냄
  • PWRFLT# (필수) - 외부 로직에 의해 감지된 전원 오류 조건을 Hot-Plug 컨트롤러에 알리는 입력 포트
  • AUXEN# (AUX 전원이 구현된 경우 필수) - MRL이 열리고 닫힐 때 전환된 AUX 신호와 AUX 전원을 슬롯으로 제어하는 포트 출력
  • MRL# (MRL 센서가 구현된 경우 필수) - MRL 센서로부터 입력 포트
  • BUTTON# (필수) - 주의 버튼으로부터 입력 포트