ARCH R

GPU driver

As duas pilhas gráficas da imagem, qual delas inicia e como trocar

A imagem traz dois jeitos de controlar a Mali-G31: o driver binário da ARM (libmali no espaço de usuário, mali_kbase no kernel) e o Mesa 26.1.3 com o driver Gallium Panfrost. Os dois são compilados e instalados, e só um fica ativo por vez.

O sistema inicia com a libmali. Esse é o padrão atual, não o Panfrost.


Por que a libmali é o padrão hoje

A chave gpu.driver não vem escrita no system.cfg da imagem, então numa instalação nova o script de boot encontra o valor vazio e grava libmali ele mesmo.

O seletor também está escondido de propósito. O EmulationStation só mostra a linha GPU DRIVER quando existe /usr/bin/gpudriver, e o ArchR instala esse auxiliar em /usr/lib/archr/gpudriver. O motivo registrado no pacote é que o caminho do Panfrost ainda não é confiável nas placas clone de RK3326: em algumas delas o probe trava o kernel, e o mali_kbase não pode ser descarregado com segurança para se recuperar disso. Enquanto isso não estiver resolvido, a troca fica fora do menu.


Trocar mesmo assim

Por SSH, edite /storage/.config/system/configs/system.cfg e coloque:

gpu.driver=panfrost

Depois reinicie. Para voltar, escreva libmali no mesmo lugar. Não há mais nada a mudar: o script de boot lê essa única chave.


O que acontece no boot

Um gancho de autostart roda /usr/lib/archr/gpudriver --start, que:

  1. Lê gpu.driver, usando libmali quando está vazio.
  2. Carrega o módulo de kernel correspondente, mali_kbase ou panfrost.
  3. Monta por bind as bibliotecas de GL correspondentes. Para a libmali isso significa /usr/lib/mali/* por cima do libEGL.so, do libGLESv2.so e companhia do Mesa, mais /dev/null por cima do libGL.so para nada pegar o Mesa por engano. Para o Panfrost ele desfaz tudo isso, e o Mesa volta a aparecer.
  4. Confere se o driver realmente se ligou: existe uma placa DRM, existe o nó específico do driver (/sys/bus/platform/drivers/panfrost/*.gpu ou /dev/mali0) e pelo menos um conector responde connected.
  5. Se essa checagem falha, ele carrega o outro driver e salva esse como o novo gpu.driver, de modo que você termina com uma tela funcionando em vez de uma tela preta.

Tudo o que ele faz vai para /storage/.config/gpudriver.log, que sobrevive a reinicializações. Com o Panfrost selecionado, ele também guarda ali as mensagens do kernel em volta do probe.

Proteção contra boot loop

Antes de mexer no driver, o script grava o nome do driver em /storage/.config/gpudriver.attempting com escrita síncrona, e apaga o arquivo assim que o driver sobe. Se ele ainda estiver lá no boot seguinte, é porque a tentativa anterior travou a placa antes de conseguir se recuperar, então o script força libmali e reescreve a configuração. É isso que impede um probe ruim do Panfrost de virar um ciclo infinito de reinício.


As diferenças que importam

libmaliPanfrost
OrigemDriver binário da ARM, versão g24p0 para a G31Mesa 26.1.3, código aberto
Lado do kernelmali_kbase, fora da árvorepanfrost, no kernel mainline
APIOpenGL ESOpenGL e OpenGL ES
Vulkannão nesta placanão nesta placa
Atualizaçõeso que vier no pacote do fornecedoracompanha os lançamentos do Mesa

Nenhum driver Vulkan é compilado para o RK3326, de um jeito nem do outro. O Mesa é configurado com -Dvulkan-drivers= vazio, e o pacote da libmali só instala bibliotecas Vulkan em outros SoCs. Emuladores que procuram por Vulkan aqui não vão achar e caem para GLES.


Ajustes do Mesa

O /etc/profile.d/041-panfrost é lido pelo /etc/profile, então isto chega a todo emulador lançado pelo runemu.sh e pelos scripts start_*.sh:

PAN_MESA_DEBUG=forcepack            # empacota atributos de vértice, menos draw calls na G31
MESA_NO_ERROR=1                     # emuladores não checam glGetError
MESA_SHADER_CACHE_DIR=/var/cache/mesa
MESA_SHADER_CACHE_MAX_SIZE=128MB

O /var/cache/mesa é um link para /storage/.cache/mesa_shader_cache, então o cache de shaders sobrevive ao reinício.

O /etc/profile.d/mali-priority.sh define MALI_SCHED_RT_THREAD_PRIORITY=95 para o caminho da libmali.


Quando dá errado

Tela preta depois de colocar gpu.driver=panfrost. Desligue, tire o cartão, monte a partição de storage num PC e volte para gpu.driver=libmali. Se a placa conseguiu reiniciar sozinha, a sentinela já deve ter feito isso por você.

Você escolheu panfrost e o sistema subiu com libmali. A checagem de bind falhou e o fallback entrou. O /storage/.config/gpudriver.log diz qual das três condições (placa, bind, display) não foi atendida, com as linhas de dmesg correspondentes logo abaixo.

A troca não parece valer na hora. E não vale mesmo. Nenhum dos dois módulos pode ser descarregado com segurança enquanto o outro está rodando, então a mudança só se aplica no próximo boot.

On this page