Espaço de configuração PCI - PCI configuration space

O espaço de configuração do PCI é a forma subjacente que o PCI Convencional , PCI-X e PCI Express executam a configuração automática das placas inseridas em seus barramentos.

Visão geral

Os dispositivos PCI têm um conjunto de registros conhecido como espaço de configuração e o PCI Express apresenta um espaço de configuração estendido para os dispositivos. Os registros do espaço de configuração são mapeados para os locais da memória. Os drivers de dispositivo e o software de diagnóstico devem ter acesso ao espaço de configuração e os sistemas operacionais geralmente usam APIs para permitir o acesso ao espaço de configuração do dispositivo. Quando o sistema operacional não tem métodos de acesso definidos ou APIs para solicitações de espaço de configuração de mapeamento de memória, o driver ou software de diagnóstico tem a responsabilidade de acessar o espaço de configuração de uma maneira que seja compatível com as regras de acesso subjacentes do sistema operacional. Em todos os sistemas, os drivers de dispositivo são encorajados a usar APIs fornecidas pelo sistema operacional para acessar o espaço de configuração do dispositivo.

Informação técnica

Uma das principais melhorias que o barramento local PCI teve sobre outras arquiteturas de E / S foi seu mecanismo de configuração. Além do mapeamento de memória normal e dos espaços de porta de E / S, cada função de dispositivo no barramento tem um espaço de configuração , que tem 256 bytes de comprimento, endereçável conhecendo o barramento PCI de oito bits , dispositivo de cinco bits e três números de função de bit para o dispositivo (comumente referido como BDF ou B / D / F , abreviado de barramento / dispositivo / função ). Isso permite até 256 barramentos, cada um com até 32 dispositivos, cada um suportando oito funções. Uma única placa de expansão PCI pode responder como um dispositivo e deve implementar pelo menos a função número zero. Os primeiros 64 bytes do espaço de configuração são padronizados; o restante está disponível para fins definidos pelo fornecedor.

Para permitir que mais partes do espaço de configuração sejam padronizadas sem entrar em conflito com os usos existentes, pode haver uma lista de recursos definidos nos 192 bytes restantes do espaço de configuração PCI. Cada capacidade tem um byte que descreve qual é a capacidade e um byte para apontar para a próxima capacidade. O número de bytes adicionais depende do ID do recurso. Se recursos estiverem sendo usados, um bit no registro de Status é definido e um ponteiro para o primeiro em uma lista vinculada de recursos é fornecido no Cap. registrador de ponteiro definido nos Registros Padronizados.

PCI-X 2.0 e PCI Express introduziram um espaço de configuração estendido, até 4096 bytes. A única parte padronizada do espaço de configuração estendido são os primeiros quatro bytes em 0x100, que são o início de uma lista de capacidade estendida. Os recursos estendidos são muito parecidos com os recursos normais, exceto que podem se referir a qualquer byte no espaço de configuração estendido (usando 12 bits em vez de oito), têm um número de versão de quatro bits e um ID de capacidade de 16 bits. Os IDs de capacidade estendidos se sobrepõem aos IDs de capacidade normal, mas não há chance de confusão, pois eles estão em listas separadas.

Registros padronizados

Image
Registros padrão do cabeçalho de espaço de configuração PCI Tipo 0 (sem ponte)

Os registros Device ID (DID) e Vendor ID (VID) identificam o dispositivo (como um IC ) e são comumente chamados de PCI ID . O ID do fornecedor de 16 bits é alocado pelo PCI-SIG . O ID do dispositivo de 16 bits é então atribuído pelo fornecedor. Há um projeto inativo para coletar todos os IDs de fornecedores e dispositivos conhecidos. (Veja os links externos abaixo.)

O registro de status é usado para relatar quais recursos são suportados e se certos tipos de erros ocorreram. O registro de comando contém uma máscara de bits de recursos que podem ser ativados e desativados individualmente. Os valores de registro do tipo de cabeçalho determinam os diferentes layouts dos 48 bytes restantes (64-16) do cabeçalho, dependendo da função do dispositivo. Ou seja, cabeçalhos Tipo 1 para Root Complex, switches e bridges. Em seguida, digite 0 para terminais. O registro Cache Line Size deve ser programado antes que o dispositivo seja informado de que pode usar a transação de gravação e invalidação de memória. Isso normalmente deve corresponder ao tamanho da linha de cache da CPU , mas a configuração correta depende do sistema. Este registro não se aplica ao PCI Express.

O Subsystem ID (SSID) e o Subsystem Vendor ID (SVID) diferenciam o modelo específico (como uma placa adicional). Embora o ID do fornecedor seja do fabricante do chipset , o ID do fornecedor do subsistema é do fabricante da placa. O ID do subsistema é atribuído pelo fornecedor do subsistema com o mesmo espaço numérico que o ID do dispositivo. Por exemplo, no caso de placas de rede sem fio , o fabricante do chipset pode ser Broadcom ou Atheros , e o fabricante da placa pode ser Netgear ou D-Link . Geralmente, a combinação Vendor ID – Device ID designa qual driver o host deve carregar para lidar com o dispositivo, já que todas as placas com a mesma combinação VID: DID podem ser manipuladas pelo mesmo driver. A combinação Subsystem Vendor ID – Subsystem ID identifica o cartão, que é o tipo de informação que o motorista pode usar para aplicar uma pequena alteração específica do cartão em sua operação.

Enumeração de ônibus

Para endereçar um dispositivo PCI, ele deve ser habilitado sendo mapeado no espaço de endereço da porta de E / S do sistema ou espaço de endereço mapeado na memória. O firmware do sistema, os drivers de dispositivo ou o sistema operacional programam os Registros de Endereço de Base (comumente chamados de BARs) para informar o dispositivo de seu mapeamento de endereço gravando comandos de configuração no controlador PCI. Como todos os dispositivos PCI estão em um estado inativo após a reinicialização do sistema, eles não terão endereços atribuídos a eles pelos quais o sistema operacional ou os drivers de dispositivo possam se comunicar com eles. O BIOS ou o sistema operacional endereça geograficamente os slots PCI (por exemplo, o primeiro slot PCI, o segundo slot PCI ou o terceiro slot PCI, etc., na placa - mãe ) por meio do controlador PCI usando o por slot IDSEL (Inicialização Sinais de seleção de dispositivo).

PCI BAR Bits
Bits Descrição Valores
Para todos os PCI BARs
0 Tipo de Região 0 = Memória
1 = I / O
Para BARs de memória
2-1 Localizável 0 = qualquer 32 bits
1 = <1  MB
2 = qualquer 64 bits
3 Prefetchable 0 = não
1 = sim
31-4 Endereço Base naturalmente alinhado com 16 bytes
Para I / O BARs
1 Reservado
31-2 Endereço Base naturalmente alinhado com 4 bytes

Como não há um método direto para o BIOS ou sistema operacional determinar quais slots PCI têm dispositivos instalados (nem para determinar quais funções o dispositivo implementa), os barramentos PCI devem ser enumerados . A enumeração do barramento é realizada tentando ler o ID do fornecedor e o registro do ID do dispositivo (VID / DID) para cada combinação de número do barramento e número do dispositivo na função # 0 do dispositivo. Observe que o número do dispositivo, diferente de DID, é meramente um número sequencial do dispositivo naquele barramento. Além disso, depois que uma nova ponte é detectada, um novo número de barramento é definido e a enumeração do dispositivo reinicia no dispositivo número zero.

Se nenhuma resposta for recebida da função # 0 do dispositivo, o barramento mestre executa um aborto e retorna um valor all-bits-on ( FFFFFFFF em hexadecimal), que é um valor VID / DID inválido, portanto, um driver de dispositivo pode dizer que o combinação especificada bus / device_number / function (B / D / F) não está presente. Portanto, quando uma leitura para um ID de função de zero para um determinado barramento / dispositivo faz com que o mestre (iniciador) aborte, deve-se presumir que nenhum dispositivo funcional existe nesse barramento porque os dispositivos são necessários para implementar a função número zero. Nesse caso, as leituras dos números das funções restantes (1–7) não são necessárias, pois também não existirão.

Quando uma leitura para uma combinação B / D / F especificada para o registro de ID do fornecedor é bem-sucedida, um driver de dispositivo sabe que ela existe; ele grava todos em seus BARs e lê de volta o tamanho de memória solicitado do dispositivo em uma forma codificada. O design implica que todos os tamanhos de espaço de endereço são uma potência de dois e estão naturalmente alinhados.

Neste ponto, o BIOS ou sistema operacional irá programar os endereços de porta de E / S e mapeados na memória no registro de configuração BAR do dispositivo. Esses endereços permanecem válidos enquanto o sistema permanece ligado. Ao desligar, todas essas configurações são perdidas e o procedimento é repetido na próxima vez que o sistema for ligado novamente. Como todo esse processo é totalmente automatizado, o usuário é poupado da tarefa de configurar manualmente qualquer hardware recém-adicionado, alterando as chaves DIP nas próprias placas. Esta descoberta automática de dispositivo e atribuição de espaço de endereço é como o plug and play é implementado.

Se uma ponte PCI para PCI for encontrada, o sistema deve atribuir ao barramento PCI secundário além da ponte um número de barramento diferente de zero e, em seguida, enumerar os dispositivos nesse barramento secundário. Se mais pontes PCI forem encontradas, a descoberta continua recursivamente até que todas as combinações possíveis de domínio / barramento / dispositivo sejam varridas.

Cada função de dispositivo PCI sem ponte pode implementar até 6 BARs, cada um dos quais pode responder a endereços diferentes na porta de E / S e espaço de endereço mapeado na memória. Cada BAR descreve uma região com tamanho entre 16 bytes e 2 gigabytes, localizada abaixo do limite de espaço de endereço de 4 gigabytes. Se uma plataforma suportar a opção "Acima de 4G" no firmware do sistema, barras de 64 bits podem ser usadas.

Um dispositivo PCI também pode ter uma ROM opcional que pode conter o código do driver ou informações de configuração.

Implementação de hardware

Ao realizar um acesso ao Espaço de Configuração , um dispositivo PCI não decodifica o endereço para determinar se ele deve responder, mas em vez disso, olha para o sinal de Seleção do Dispositivo de Inicialização (IDSEL). Existe um método de ativação exclusivo em todo o sistema para cada sinal IDSEL. O dispositivo PCI é necessário para decodificar apenas os 11 bits de ordem mais baixa do espaço de endereço (AD [10] a AD [0]) sinais de endereço / dados e pode ignorar a decodificação de 21 sinais A / D de ordem alta (AD [31] para AD [11]) porque uma implementação de acesso ao Espaço de Configuração tem cada pino IDSEL do slot conectado a um endereço de ordem alta diferente / linha de dados AD [11] a AD [31]. O sinal IDSEL é um pino diferente para cada slot de adaptador / dispositivo PCI.

Para configurar a placa no slot n , a ponte de barramento PCI realiza um ciclo de acesso ao espaço de configuração com o registro do dispositivo PCI a ser endereçado nas linhas AD [7: 2] (AD [1: 0] são sempre zero, pois os registros são palavras duplas (32 bits)), e o número da função PCI especificado nos bits AD [10: 8], com todos os bits de ordem superior zeros, exceto AD [ n +11] sendo usados ​​como o sinal IDSEL em um determinado slot.

Para reduzir o carregamento elétrico do barramento AD [] crítico de tempo (e, portanto, sensível ao carregamento elétrico), o sinal IDSEL no conector do slot PCI é geralmente conectado ao pino AD [ n +11] atribuído por meio de um resistor. Isso faz com que o sinal IDSEL do PCI alcance sua condição ativa mais lentamente do que outros sinais de barramento PCI (devido à constante de tempo RC do resistor e da capacitância de entrada do pino IDSEL). Assim , os acessos ao Espaço de Configuração são realizados mais lentamente para permitir que o sinal IDSEL alcance um nível válido.

A varredura no barramento é realizada na plataforma Intel, acessando duas portas padronizadas definidas . Essas portas são a porta de E / S do Configuration Space Address ( 0xCF8 ) e a porta de E / S dos Configuration Space Data ( 0xCFC ). O valor gravado na porta de E / S de endereço de espaço de configuração é criado combinando valores B / D / F e o valor de endereço de registradores em uma palavra de 32 bits.

Implementação de software

As leituras e gravações da configuração podem ser iniciadas a partir da CPU de duas maneiras: um método legado por meio dos endereços de E / S 0xCF8 e 0xCFC e outro chamado configuração mapeada em memória.

O método legado estava presente no PCI original e é chamado de Mecanismo de Acesso à Configuração (CAM). Ele permite que 256 bytes do espaço de endereço de um dispositivo sejam alcançados indiretamente por meio de dois registros de 32 bits chamados PCI CONFIG_ADDRESS e PCI CONFIG_DATA. Esses registros estão nos endereços 0xCF8 e 0xCFC no espaço de endereço de E / S do x86. Por exemplo, um driver de software (firmware, kernel do sistema operacional ou driver do kernel) pode usar esses registros para configurar um dispositivo PCI escrevendo o endereço do registro do dispositivo em CONFIG_ADDRESS e colocando os dados que devem ser gravados no dispositivo em CONFIG_DATA. Uma vez que esse processo requer uma gravação em um registrador para gravar o registrador do dispositivo, ele é referido como "indireção".

O formato de CONFIG_ADDRESS é o seguinte:

0x80000000 | bus << 16 | device << 11 | function <<  8 | offset

Conforme explicado anteriormente, endereçar um dispositivo via Barramento, Dispositivo e Função (BDF) também é referido como "endereçar um dispositivo geograficamente". Veja arch/x86/pci/early.cno código do kernel do Linux um exemplo de código que usa endereçamento geográfico.

Quando o espaço de configuração estendido é usado em algumas CPUs AMD, os bits extras 11: 8 do deslocamento são escritos nos bits 27:24 do registro CONFIG_ADDRESS:

0x80000000 | (offset & 0xf00) << 16 | bus << 16 | device << 11 | function <<  8 | (offset & 0xff)

O segundo método foi criado para PCI Express. É denominado Enhanced Configuration Access Mechanism (ECAM). Ele estende o espaço de configuração do dispositivo para 4 KB, com os 256 bytes inferiores se sobrepondo ao espaço de configuração original (legado) no PCI. A seção do espaço endereçável é "roubada" para que os acessos da CPU não vão para a memória, mas cheguem a um determinado dispositivo na malha PCI Express. Durante a inicialização do sistema, o firmware determina o endereço de base para esta região de endereço "roubado" e o comunica ao complexo raiz e ao sistema operacional. Este método de comunicação é específico da implementação e não está definido na especificação PCI Express.

Cada dispositivo tem seu próprio espaço de 4 KB e as informações de cada dispositivo são acessíveis por meio de uma matriz simples, de dev[bus][device][function]modo que 256 MB de espaço físico contíguo sejam "roubados" para esse uso (256 barramentos x 32 dispositivos x 8 funções x 4 KB = 256 MB). O endereço físico básico desta matriz não foi especificado. Por exemplo, em sistemas x86 modernos, as tabelas ACPI contêm as informações necessárias.

Veja também

Referências

links externos