다음을 통해 공유


PortCls 오디오 드라이버에 대한 PnP 리밸런스 구현

PnP 리밸런싱은 메모리 리소스를 다시 할당해야 하는 특정 PCI 시나리오에서 사용됩니다.

두 가지 기본 시나리오에서 재균형을 트리거할 수 있습니다.

  1. PCI 핫플러그: 사용자가 디바이스에 연결하고 PCI 버스에 새 디바이스에 대한 드라이버를 로드하기에 충분한 리소스가 없습니다. 이 범주에 속하는 디바이스의 몇 가지 예로는 Thunderbolt, USB-C 및 NVME Storage가 있습니다. 이 시나리오에서는 추가되는 추가 디바이스를 지원하기 위해 메모리 리소스를 다시 정렬하고 통합(재조정)해야 합니다.
  2. PCI 크기 조정 가능한 BAR: 디바이스에 대한 드라이버가 메모리에 성공적으로 로드되면 추가 리소스를 요청합니다. 디바이스의 몇 가지 예로는 고급 그래픽 카드 및 스토리지 디바이스가 있습니다. 비디오 드라이버 지원에 대한 자세한 내용은 크기 조정 가능한 BAR 지원을 참조하세요. 이 항목에서는 PortCls 오디오 드라이버에 대한 PnP 리밸런스를 구현하기 위해 수행해야 하는 작업에 대해 설명합니다.

PnP 리밸런싱은 Windows 10 버전 1511 이상 버전의 Windows에서 사용할 수 있습니다.

리밸런스 요구 사항

포트클 오디오 드라이버는 다음 조건이 충족되는 경우 리밸런스를 지원할 수 있습니다.

  • 미니포트는 IAdapterPnpManagement 인터페이스를 Portcls에 등록해야 합니다.
  • 미니포트는 IAdapterPnpManagement::GetSupportedRebalanceType에서 PcRebalanceRemoveSubdevices를 반환해야 합니다.
  • 토폴로지와 WaveRT는 지원되는 두 가지 포트 형식입니다.

활성 오디오 스트림이 있을 때 균형 조정을 지원하려면 포트클 오디오 드라이버가 이러한 두 가지 추가 요구 사항 중 하나를 충족해야 합니다.

또는

리밸런싱이 발생할 때 오디오 스트림 동작

리밸런스가 트리거되고 활성 오디오 스트림이 있고 드라이버가 활성 오디오 스트림에 대한 리밸런스를 지원하는 경우 모든 활성 오디오 스트림이 중지되고 자동으로 다시 시작되지 않습니다.

IPortClsPnp COM 인터페이스

IPortClsPnp 는 포트 클래스 드라이버(PortCls)가 어댑터에 노출하는 PnP 관리 인터페이스입니다.

IPortClsPnp는 IUnknown에서 상속되며 다음 메서드도 지원합니다.

오디오 미니포트 드라이버는 Portcls 내보내기를 사용하거나 WaveRT 포트 개체에 노출된 IPortClsPnp COM 인터페이스 IPortClsPnp를 통해 PNP 알림 인터페이스를 등록할 수 있습니다. IPortClsPnp::RegisterAdapterPnpManagementIPortClsPnp::UnregisterAdapterPnpManagement를 사용하여 등록 및 등록을 취소합니다.

필수 PortCls 내보내기 DDI

IAdapterPnpManagement 는 어댑터가 PnP 관리 메시지를 수신하려는 경우 구현하고 등록해야 하는 인터페이스입니다. PcRegisterAdapterPnpManagement를 사용하여 이 인터페이스를 PortCls에 등록합니다. PcUnregisterAdapterPnpManagement를 사용하여 PortCls에서 이 인터페이스의 등록을 취소합니다.

필수 드라이버 DDI

재조정을 지원하려면 다음 IAdapterPnpManagement DDI를 구현해야 합니다.

  • IAdapterPnpManagement::GetSupportedRebalanceType 은 QueryStop을 처리하는 동안 Portcls에서 호출됩니다. 미니포트는 PC_REBALANCE_TYPE 열거형에 정의된 대로 지원되는 리밸런스 형식을 반환합니다.

    호출을 하기 전에 Portcls는 디바이스 전역 잠금을 획득하므로 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다.

  • IAdapterPnpManagement::P npQueryStop 은 QueryStop IRP를 성공하기 직전에 포트클로 호출됩니다. 이는 알림일 뿐이며 호출은 값을 반환하지 않습니다.

    호출을 하기 전에 Portcls는 디바이스 전역 잠금을 획득하므로 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다. 중지가 보류 중인 동안 Portcls는 새 만들기 요청을 차단(보류)합니다.

  • IAdapterPnpManagement::P npCancelStop 은 CanceStop IRP를 처리하는 동안 포트클에 의해 호출됩니다. 이것은 단지 알림일 뿐입니다. 이전에 PnpQueryStop 알림을 받지 않아도 미니포트가 PnpCancelStop을 받을 수 있습니다. 이 동작을 수용하기 위해 미니포트를 작성해야 합니다. 예를 들어 Portcls가 이 알림을 미니포트에 전달할 기회가 있기 전에 QueryStop 논리가 IRP에 실패하는 경우입니다. 이 시나리오에서 PnP 관리자는 여전히 PnP 취소 중지를 호출합니다.

    호출을 하기 전에 Portcls는 디바이스 전역 잠금을 획득하므로 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다. 중지가 보류 중인 동안 Portcls는 새 만들기 요청을 차단(보류)합니다. 보류 중인 중지가 취소되면 PortCls는 보류 중인 만들기 요청을 다시 시작합니다.

  • IAdapterPnpManagement::P npStop 은 모든 Ioctl 작업을 중지하고 활성 스트림을 [run|pause|acquire] 상태에서 [stop] 상태로 이동한 후 Portcls에서 호출됩니다. 이 호출은 디바이스 전역 잠금을 유지하는 동안 수행되지 않습니다. 따라서 미니포트는 비동기 작업(작업 항목, dpc, 비동기 스레드)을 기다린 후 오디오 하위 서비스 등록을 취소할 수 있습니다. 이 호출에서 반환하기 전에 미니포트는 모든 h/w 리소스가 해제되었는지 확인해야 합니다.

    참고 : 미니포트는 기존 오디오 클라이언트가 현재 핸들을 해제할 시기가 불분명하기 때문에 현재 미니포트/스트림 개체가 삭제될 때까지 기다리지 않아야 합니다. PnpStop 스레드는 시스템을 충돌하지 않고 영원히 차단할 수 없습니다. 즉, PnP/Power 스레드입니다.

IMiniportPnpNotify

IMiniportPnpNotify 는 미니포트 개체(오디오 하위 서비스)가 PnP 상태 변경 알림을 받을 수 있도록 하는 선택적 인터페이스입니다.

미니포트는 등록한 각 오디오 하위 서비스에 대해 PnP 중지 알림을 받을 수 있습니다. 이 알림을 받으려면 하위 서비스가 IMiniportPnpNotify를 지원해야 합니다. IMiniportPnpNotify::P npStop 알림만 이 인터페이스에 정의되어 있습니다.

사용 가능한 IMiniportPnpNotify 인터페이스는 WaveRT와 토폴로지 모두에서 사용할 수 있습니다.

호출을 하기 전에 Portcls가 디바이스 전역 잠금을 획득하기 때문에 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다. 미니포트는 다른 스레드/작업 항목이 디바이스 전역 잠금을 기다리는 경우 교착 상태를 방지하기 위해 이 호출을 처리하는 동안 다른 작업을 기다리지 않아야 합니다. 필요한 경우 미니포트는 IAdapterPnpManagement::P npStop 호출에서 대기할 수 있습니다.