Patch propõe driver de PMU AXI do Raspberry Pi para o kernel Linux

Patch propõe driver de PMU AXI do Raspberry Pi para o kernel Linux

O desenvolvedor Ian Rogers enviou à lista de discussão do kernel Linux uma série de patches que propõe um driver de unidade de monitoramento de desempenho (PMU) uncore para os sistemas Broadcom AXI e monitores do VideoCore VPU. A implementação é voltada para os SoCs do Raspberry Pi, cobrindo os modelos desde o BCM2835 até o BCM2712, o que engloba as gerações do Raspberry Pi 1 ao 5.

O que muda na prática

Atualmente, o Linux carece de um driver compatível com a API padrão perf para os blocos de contadores de desempenho AXI da Broadcom nas plataformas Raspberry Pi.

A nota de envio (cover letter) explica que as soluções anteriores, mantidas fora da árvore principal (out-of-tree), dependiam de nós customizados no debugfs e kthreads ad-hoc. Essa arquitetura impedia a integração com ferramentas padrão do Linux perf, como perf stat e perf list.

O novo driver implementa callbacks uncore de hardware struct pmu no diretório drivers/perf/. O código passa a expor aliases de eventos legíveis por humanos no sysfs, dimensionamento de unidades (como Bytes) e filtragem de barramento diretamente para o espaço do usuário.

Arquitetura híbrida e monitoramento uncore

zP5Ug9Y9 patch linux driver pmu axi raspberry pi 2
Patch propõe driver de PMU AXI do Raspberry Pi para o kernel Linux 4

O código proposto expõe eventos do barramento de interconexão AXI uncore através do caminho /sys/bus/event_source/devices/rpi_axi_pmu/. A implementação suporta amostragem de eventos e acumulação de contadores de hardware (local64_add), gerenciando o estouro (wraparound) de contadores de 31 bits durante transferências de interconexão de alta largura de banda.

O driver adota uma arquitetura híbrida que combina MMIO (Memory-Mapped I/O) e fila de trabalho por IPC de mailbox:

  • O monitor do sistema realiza leituras de memória mapeadas sobre o espaço de memória física ARM (MON__SYSTEM).
  • Para os SoCs BCM2835 a BCM2711, as chamadas IPC do monitor do VideoCore VPU são transferidas para o contexto de processo por meio de uma fila de trabalho dedicada (vpu_work) e serializadas sob vpu_mutex. Segundo o autor do patch, isso evita bloqueios ou esperas atômicas no contexto de interrupção ou temporizador.

Hotplug de CPU e suporte por geração

O patch registra notificadores dinâmicos de hotplug de CPU (CPUHP_AP_ONLINE_DYN). Quando um núcleo de CPU designado fica offline, o driver migra o contexto da PMU (perf_pmu_migrate_context) para um núcleo online, com o objetivo de evitar a manutenção de estados uncore desatualizados.

A série foi dividida em duas partes para organizar o suporte às gerações de hardware. O primeiro patch adiciona o driver central para os modelos BCM2835 a BCM2711, correspondentes ao Raspberry Pi 1 a 4.

O segundo patch expande o suporte para o BCM2712 (Raspberry Pi 5). Esta etapa adiciona monitoramento de links PCIe RP1 Southbridge, decodificador HEVC, motor de exibição HVS e interconexão L3 do Cortex-A76 DSU.

Validação em hardware

A série documenta validações do código em hardware real. No Raspberry Pi 400 (BCM2711), o teste envolveu os contadores de desempenho do L2 do sistema, da CPU ARM e do IPC de mailbox do firmware VideoCore VPU.

No Raspberry Pi 5 (BCM2712), os testes validaram a taxa de transferência de bytes ao vivo nos ciclos de atualização da tela HVS, no tráfego de memória da interconexão L3 do Cortex-A76 DSU e nas transferências do PCIe RP1 Southbridge.