Поделиться через


Реализация ребаланса PnP для аудио драйверов PortCls

Перебалансирование PnP используется в определенных сценариях PCI, где ресурсы памяти необходимо перераспределить.

Перебалансировать можно в двух основных сценариях:

  1. Hotplug PCI: пользователь подключается к устройству и шине PCI недостаточно ресурсов для загрузки драйвера для нового устройства. Некоторые примеры устройств, которые входят в эту категорию, включают Thunderbolt, USB-C и NVME служба хранилища. В этом сценарии ресурсы памяти должны быть переупорядочены и консолидированы (перебалансированы) для поддержки дополнительных устройств, добавляемых.
  2. BAR с изменением размера PCI: после успешной загрузки драйвера для устройства в памяти он запрашивает дополнительные ресурсы. Некоторые примеры устройств включают высокопроизводительные графические карта и устройства хранения. Дополнительные сведения о поддержке видеодрайвов см. в разделе поддержки resizable BAR. В этом разделе описывается, что необходимо сделать для реализации перебаланса PnP для звуковых драйверов PortCls.

Перебалансирование PnP доступно в Windows 10 версии 1511 и более поздних версиях Windows.

Требования к перебалансировать

Портклы звуковые драйверы имеют возможность поддерживать перебалансирование, если выполнены следующие условия:

Чтобы поддерживать перебалансирование при наличии активных звуковых потоков, портклы звуковые драйверы должны соответствовать одному из этих двух дополнительных требований.

ИЛИ

Поведение аудиопотока при повторном перебалансирование

Если активируется перебалансировка, при наличии активных звуковых потоков драйвер обеспечивает перебалансировку для активных аудиопотоков, то все активные звуковые потоки будут остановлены, и они не будут перезапущены автоматически.

COM-интерфейс IPortClsPnp

IPortClsPnp — это интерфейс управления PnP, который драйвер класса портов (PortCls) предоставляет адаптеру.

IPortClsPnp наследует от IUnknown и поддерживает следующие методы:

Драйверы аудиопорта могут зарегистрировать интерфейс уведомлений PNP с помощью экспорта Portcls или через интерфейс COM интерфейса IPortClsPnp IPortClsPnp , предоставляемый в объекте порта WaveRT. Используйте IPortClsPnp::RegisterAdapterPnpManagement и IPortClsPnp::UnregisterAdapterPnpManagement для регистрации и отмены регистрации.

Обязательные идентификаторы DDIS для экспорта портов

IAdapterPnpManagement — это интерфейс, который адаптеры должны реализовывать и регистрировать, если они хотят получать сообщения об управлении PnP. Зарегистрируйте этот интерфейс с помощью PortCls с помощью PcRegisterAdapterPnpManagement. Отмена регистрации этого интерфейса с помощью PortCls с помощью PcUnregisterAdapterPnpManagement.

Обязательные DDIS драйвера

Для поддержки перебалансировки необходимо реализовать следующие DDIS IAdapterPnpManagement .

  • IAdapterPnpManagement::GetSupportedRebalanceType вызывается Portcls при обработке QueryStop. Минипорт возвращает поддерживаемый тип перебаланса, как определено в перечислении PC_REBALANCE_TYPE .

    Примечание Portcls получает глобальную блокировку устройства перед выполнением этого вызова, поэтому минипорт должен выполнять этот вызов как можно быстрее.

  • IAdapterPnpManagement::P npQueryStop вызывается портклами незадолго до успешного выполнения IRP QueryStop. Это просто уведомление, и вызов не возвращает значение.

    Примечание Portcls получает глобальную блокировку устройства перед выполнением этого вызова, поэтому минипорт должен выполнять этот вызов как можно быстрее. Пока ожидается остановка, Портклы блокируют (удерживают) все новые запросы на создание.

  • IAdapterPnpManagement::P npCancelStop вызывается портклами при обработке IRP CanceStop. Это просто уведомление. Минипорт может получить PnpCancelStop даже без получения уведомления PnpQueryStop. Минипорт должен быть записан для соответствия этому поведению. Например, это происходит, когда логика QueryStop завершается ошибкой IRP, прежде чем Portcls имеет возможность перенаправить это уведомление в мини-порт. В этом сценарии диспетчер PnP по-прежнему вызывает остановку отмены PnP.

    Примечание Portcls получает глобальную блокировку устройства перед выполнением этого вызова, поэтому минипорт должен выполнять этот вызов как можно быстрее. Пока ожидается остановка, Портклы блокируют (удерживают) все новые запросы на создание. PortCls перезапускает все записные запросы на создание при отмене ожидающей остановки.

  • IAdapterPnpManagement::P npStop вызывается Portcls после остановки всех операций Ioctl и перемещения активных потоков из состояния [run|pause|acquire] в состояние [stop]. Этот вызов не выполняется при удержании глобальной блокировки устройства. Таким образом минипорт имеет возможность ждать своих асинхронных операций (рабочие элементы, dpc, асинхронные потоки) и отменять регистрацию своих звуковых вложенных элементов. Перед возвращением из этого вызова минипорт должен убедиться, что все ресурсы h/w были освобождены.

    Обратите внимание , что минипорт не должен ожидать удаления текущих объектов минипорта или потока, так как неясно, когда существующие звуковые клиенты будут выпускать текущие дескрипторы. Поток PnpStop не может блокироваться навсегда без сбоя системы, т. е. это поток PnP/Power.

IMiniportPnpNotify

IMiniportPnpNotify — это необязательный интерфейс, позволяющий минипорт-объектам (аудиоподделениям) получать уведомления об изменении состояния PnP.

Минипорты имеют возможность получать уведомление об остановке PnP для каждого зарегистрированного аудиоподключа. Чтобы получить это уведомление, subdevice должен поддерживать IMiniportPnpNotify. В этом интерфейсе определен только уведомление IMiniportPnpNotify::P npStop.

Интерфейс IMiniportPnpNotify доступен как в WaveRT, так и в топологии.

Обратите внимание , что Портклс получает глобальную блокировку устройства перед выполнением этого вызова, минипорт должен выполнять этот вызов как можно быстрее. Минипорт не должен ждать других действий при обработке этого вызова, чтобы предотвратить взаимоблокировку, когда другие потоки или рабочие элементы ожидают глобальной блокировки устройства. При необходимости минипорт может ждать в вызове IAdapterPnpManagement::P npStop .