top of page

O driver HDMI SM750 da Silicon Motion chegou ao Hacker News, expondo a verdadeira vantagem do código aberto

O SM750 da Silicon Motion recebeu um novo driver HDMI experimental, conquistando 59 pontos e 30 comentários no Hacker News apesar de se destinar a uma placa gráfica obscura. O projeto faz mais do que permitir que um adaptador antigo exiba um ambiente de trabalho Linux. Ele mostra como o código aberto pode recuperar capacidades de hardware que o suporte do fornecedor, especificações incompletas e um driver antigo do kernel deixaram inacessíveis.

O programador, que usa o nome KodeMunkie, criou o driver para a placa PCIe SE-DP750A-HDMI. Essa placa combina um chip gráfico SM750G10 com um transmissor HDMI SiI9024A separado. O software resultante substitui o antigo caminho de framebuffer do Linux por uma implementação moderna de Direct Rendering Manager e Kernel Mode Setting.

O contraste é a verdadeira história. Um modelo de suporte proprietário normalmente deixaria essa placa incomum limitada às restrições escolhidas pelo fabricante. Um repositório aberto permite que um proprietário teste o hardware, publique os resultados, exponha os riscos e convide especialistas a questionar cada pressuposto.

O que o novo driver HDMI SM750 realmente muda

O projeto transforma um adaptador de vídeo com suporte restrito em um dispositivo Linux moderno e utilizável, ao mesmo tempo que documenta exatamente onde esse suporte termina.

O driver HDMI SM750 é um driver Linux experimental, exclusivamente GPL-2.0. Ele é direcionado à placa SE-DP750A-HDMI, e não a todos os produtos que usam um chip SM750. Essa distinção importa porque diferentes placas SM750 podem usar outros transmissores, conectores ou fiação GPIO.

A placa testada contém uma revisão A1 do SM750G10-AC, identificada pelo ID PCI 126f:0750. Ela tem 16 MiB de memória de vídeo, uma saída HDMI e um transmissor SiI9024ACNU. O transmissor converte a saída digital paralela da GPU em um sinal HDMI porque o SM750 não contém uma interface física HDMI nativa.

Esse conhecimento específico sobre o hardware é central para o projeto. A correspondência apenas do ID PCI não estabelece compatibilidade. Uma placa com a mesma GPU pode disponibilizar VGA, usar outra ponte HDMI ou conectar seus sinais de controlo de forma diferente.

O novo driver usa a arquitetura DRM/KMS do Linux. O DRM gere dispositivos e buffers de exibição, enquanto o Kernel Mode Setting permite que o kernel configure resoluções, taxas de atualização, conectores e pipelines de vídeo. O pipeline de exibição KMS oficial conecta framebuffers, planos, controladores de exibição, codificadores e conectores por meio de uma interface padrão do kernel.

Essa estrutura oferece aos ambientes de trabalho Linux contemporâneos uma base melhor do que o antigo driver de framebuffer sm750fb. O pacote deliberadamente coloca esse módulo legado na lista de bloqueio antes de carregar o seu próprio módulo de kernel sm750hdmidrm. Também usa DKMS, que recompila um módulo externo do kernel com base nos cabeçalhos instalados na máquina do utilizador.

O projeto atualmente visa Linux 6.17 e versões mais recentes. A documentação afirma que o código-fonte inclui caminhos de compatibilidade para Linux 6.17 até a série 6.x e Linux 7.0 em diante. No entanto, ele continua sendo um driver fora da árvore, portanto futuras mudanças na API DRM ainda podem exigir atualizações.

A operação normal permanece relativamente conservadora. O driver lê os Extended Display Identification Data, ou EDID, do monitor, que listam os modos de exibição que um monitor declara suportar. Por padrão, usa esses modos em vez de ativar imediatamente temporizações experimentais.

As aplicações continuam a renderizar em cor XRGB8888 de 32 bits. Antes de transferir regiões alteradas para a placa, o driver converte esses píxeis para o formato RGB565 de 16 bits com dithering. RGB565 armazena valores de vermelho, verde e azul em dois bytes, em vez dos quatro bytes usados pelo XRGB8888.

Essa conversão aborda um gargalo físico. A placa liga-se por uma ligação PCIe 1.1 x1 observada, o que limita a velocidade com que novos píxeis chegam à sua memória de vídeo. Enviar dois bytes por píxel de saída reduz pela metade o tráfego destinado ao dispositivo em comparação com um formato de quatro bytes.

O driver também agrupa os carregamentos em lotes de oito linhas e usa acesso direto à memória quando disponível. O DMA permite que o dispositivo mova dados sem que a CPU tenha de executar diretamente cada transferência. Um modo alternativo por CPU permanece disponível se o DMA falhar.

Um cursor de hardware evita redesenhar repetidamente o ponteiro dentro da imagem principal do ambiente de trabalho. Um trabalhador de atualização assíncrona mantém a atualização pendente mais recente, em vez de processar uma fila crescente de mudanças obsoletas na tela. Essas são respostas práticas a hardware limitado, não tentativas de transformar o SM750 em uma GPU moderna para jogos.

O resultado é um driver de exibição focado na saída para ambiente de trabalho. Ele não disponibiliza o antigo motor 2D do chip como renderização Xorg acelerada. Usa shadow buffers, que são imagens na memória do sistema que o driver converte e carrega para a placa.

Esse escopo limitado explica por que o projeto importa. O programador não precisou recriar todos os recursos históricos. O código aberto permitiu que o esforço se concentrasse nas capacidades necessárias para tornar um sistema real útil.

Por que a atenção do Hacker News importa

A reação no Hacker News reflete uma preocupação recorrente entre programadores: o hardware funcional frequentemente sobrevive às premissas de software que o rodeiam.

Um projeto para uma única placa HDMI pouco conhecida raramente se qualificaria como notícia de tecnologia generalista. Ainda assim, o debate sobre código aberto acumulou 59 pontos e 30 comentários na captura fornecida da página inicial. Essa atenção veio do que o projeto representa, não do tamanho da sua provável base de utilizadores.

Os drivers gráficos situam-se numa fronteira desconfortável. Precisam coordenar interfaces do kernel, transferências de memória, formatos de píxeis, temporizações de exibição, fiação da placa e comportamento do monitor. Um detalhe de implementação ausente pode produzir desde baixo desempenho até uma tela em branco.

Os fornecedores de hardware têm pouco incentivo comercial para revisitar todas as placas antigas ou especializadas. Dar suporte a um kernel lançado anos após o principal período de vendas de um produto exige engenharia, testes e manutenção contínua. Adaptadores de baixo volume são especialmente vulneráveis quando esses recursos são distribuídos.

O código aberto muda a economia sem eliminar o trabalho. Um utilizador com o hardware afetado pode investigar um problema específico sem esperar por uma ampla justificativa de negócio. O código resultante torna-se então uma evidência inspecionável, e não uma solução alternativa privada.

Essa abertura é visível em todo o projeto SM750. O repositório identifica a placa exata testada, a configuração de memória, o transmissor HDMI, a ligação PCI e os limites conhecidos. Ele alerta que outras placas com o mesmo ID PCI não são necessariamente compatíveis.

O autor também revela o método de desenvolvimento do projeto. Segundo o repositório, o driver foi criado com ampla assistência de IA, por vezes descrita como vibe coding. O programador afirma que especificou e testou fisicamente o comportamento, mas não consegue garantir de forma independente todos os detalhes de implementação de DRM ou kernel.

Essa admissão reforça a necessidade de revisão, ao mesmo tempo que enfraquece qualquer alegação de prontidão para produção. A IA pode ajudar a produzir código e documentação, mas não pode substituir uma revisão informada, uma cobertura mais ampla de hardware ou manutenção upstream. Publicar o código-fonte cria a possibilidade dessas verificações.

O design do driver agora pode ser examinado em vários níveis. Programadores de kernel podem avaliar locking e segurança de memória. Especialistas em exibição podem revisar a validação de modos. Outros proprietários de SM750 podem testar se o comportamento observado se estende às suas placas.

Investigadores de segurança podem inspecionar o módulo em vez de confiar num binário opaco. Mantenedores de distribuições podem estudar o empacotamento e os pressupostos de compatibilidade. Os utilizadores podem decidir se os riscos documentados se adequam às suas próprias opções de recuperação.

Um driver experimental proprietário poderia conter os mesmos erros sem os expor. A diferença não é que o código aberto comece perfeito. A diferença é que as suas alegações, atalhos, proveniência e modos de falha ficam disponíveis para contestação.

Essa distinção torna-se mais importante quando a IA contribui com código. Implementações geradas podem parecer plausíveis enquanto interpretam mal um contrato do kernel. A revisão pública oferece um caminho para detetar esses erros, embora não garanta que alguém fará a revisão.

O pequeno repositório ainda tem validação limitada. Na captura observada, o GitHub mostrava 35 commits, 26 estrelas, um fork, nenhuma issue aberta e nenhum pull request aberto. Esses números descrevem interesse inicial, não maturidade.

A atenção do Hacker News, portanto, cria pressão sobre dois grupos. Os fornecedores de hardware enfrentam novas perguntas sobre produtos abandonados pelos canais oficiais de software. Os programadores de código aberto enfrentam a questão mais difícil de como código experimental se torna infraestrutura sustentável.

A visibilidade pode atrair revisores técnicos, testadores e colaboradores. Também pode incentivar utilizadores inexperientes a instalar um módulo de kernel arriscado porque um projeto se tornou popular. Os alertas do repositório precisam continuar a ser mais influentes do que a sua posição na página inicial.

É por isso que o evento é mais significativo do que os seus números de adoção. Ele expõe a lacuna entre capacidade de hardware e capacidade suportada. O código aberto pode estreitar essa lacuna quando alguém tem o dispositivo, paciência e liberdade para publicar o que descobre.

Documentação aberta versus suporte limitado pelo fornecedor

O conflito principal não é código comunitário contra código comercial; é conhecimento inspecionável e adaptável contra suporte que termina na fronteira escolhida por um fornecedor.

A Silicon Motion documentou o SM750 como um controlador gráfico de baixo consumo com conectividade PCI Express, opções de memória integrada e vários caminhos de exibição. A documentação do produto oferece um ponto de partida necessário, mas não descreve todas as implementações de placa ou casos extremos observados.

As descobertas de hardware do novo driver comparam capacidades publicadas com o comportamento medido na placa de desenvolvimento. A documentação afirma que a placa disponibiliza uma ligação PCIe x1 de 2,5 GT/s e 16 MiB de memória integrada utilizável.

O autor do driver também relata uma discrepância envolvendo atualizações parciais estreitas. Segundo o projeto, algumas atualizações exigem um píxel adicional de saída além do cálculo de cobertura ideal ou documentado. Sem essa solução alternativa, o píxel mais à direita pode permanecer desatualizado.

Essa é uma ilustração útil do papel do código aberto. Uma especificação oferece um modelo geral, enquanto o hardware em funcionamento revela como uma implementação específica se comporta. Publicar a solução alternativa permite que outros reproduzam, rejeitem ou aperfeiçoem a descoberta.

O projeto também excede de forma controlada a resolução horizontal indicada no resumo do produto. A sua documentação afirma que o SM750 pode fisicamente fazer scan-out de até 2.048 píxeis de largura na placa testada. O plano gráfico principal usa uma coordenada de borda direita de 11 bits, criando um limite rígido de largura de 2.048 píxeis.

Isso não significa que o chip passe subitamente a gerar um sinal nativo de 2.560 píxeis. Em vez disso, o driver oferece ambientes de trabalho ultrawide lógicos e comprime-os antes da saída. Um ambiente de trabalho de 2.560 por 1.080 torna-se um sinal HDMI real de 2.048 por 1.080, que um monitor compatível então estica pelo seu painel.

O modo de 2.560 píxeis usa uma redução exata de 5:4. O software comprime a largura em 20 por cento, e o monitor expande o sinal de 2.048 píxeis em 25 por cento. Isso restaura a cobertura de tela pretendida, mas não consegue recuperar os detalhes descartados durante a compressão.

O modo alternativo de 2.464 por 1.080 adota um compromisso diferente. Ele renderiza 103.680 pixels a menos por quadro que o modo de 2.560 pixels de largura, uma redução de 3,75%. Em seguida, comprime a imagem em 16,9% antes da transmissão.

O projeto recomenda essa largura lógica menor porque ela preserva mais detalhes horizontais e reduz o processamento. No entanto, estender 2.464 pixels lógicos por um painel de 2.560 pixels cria cerca de 3,9% de distorção na largura.

Nenhuma das opções altera o silício subjacente. A melhoria prática vem da combinação de escalonamento por software, atualizações de regiões modificadas, conversão de cores, DMA e estiramento no monitor. O código aberto torna cada compromisso explícito.

O dithering personalizado é outro exemplo. RGB565 fornece apenas cinco bits de vermelho, seis de verde e cinco de azul por pixel. Essa menor precisão pode produzir faixas de cor visíveis quando gradientes suaves são quantizados.

O dithering ordenado de KodeMunkie usa um padrão de 8 por 8 ancorado às coordenadas da tela. A ancoragem impede que o padrão se desloque quando apenas parte do display muda. A implementação também aplica uma correção padrão de 94% ao canal verde com base na saída testada.

Esse design preserva a vantagem de transferência de dois bytes ao mesmo tempo que melhora o detalhamento aparente das cores. Ele não recria cores completas de 24 bits. O projeto apresenta corretamente a técnica como um compromisso entre largura de banda e percepção.

Um driver fechado poderia empregar otimizações semelhantes. A diferença é que os usuários raramente veriam por que essas escolhas foram feitas ou quão precisamente correspondem ao hardware. Aqui, o algoritmo, os parâmetros padrão e as observações físicas estão todos disponíveis para análise.

A documentação aberta também ajuda a separar conhecimentos transferíveis de pressupostos específicos da placa. O comportamento dos registradores do SM750 pode orientar outro driver, enquanto o caminho de controle do SiI9024A ou as atribuições de GPIO podem se aplicar apenas a este adaptador.

Essa fronteira impede que uma narrativa atraente se transforme em uma falsa afirmação universal. O projeto é evidência de que uma configuração do SM750 pode fazer mais no Linux. Não é evidência de que todas as placas SM750 possam usar HDMI ou reproduzir os mesmos modos.

Essa distinção é onde os papéis de fornecedores e comunidade podem se complementar. Os fabricantes detêm conhecimento de projeto, limites elétricos e recursos de validação. Os usuários possuem hardware já implantado, configurações incomuns e incentivos para resolver problemas que já não se encaixam em um roteiro de produto.

O código aberto oferece o ponto de encontro. Ele permite que documentação de fornecedores, interfaces do kernel upstream, experimentos físicos e revisão independente convirjam em uma implementação auditável. Se essa convergência acontece depende da participação, não apenas do licenciamento.

A Maior Força do Driver Também É Seu Risco

A mesma liberdade que revela capacidades ocultas também permite que usuários ultrapassem limites validados, tornando a cautela parte do recurso, e não uma reflexão tardia.

O driver HDMI do SM750 expõe resoluções e taxas de atualização experimentais apenas quando os usuários desativam a restrição padrão de EDID. Essa escolha é intencional porque o EDID normalmente protege o sistema contra o envio de modos que o monitor conectado não anuncia.

Definir edid_only=0 disponibiliza o catálogo mais amplo de modos do driver. Ativar softscale_wide=1 adiciona desktops lógicos de 2.464 por 1.080 e 2.560 por 1.080. O repositório classifica ambas as opções como perigosas e recomenda manter SSH ou outro caminho de recuperação disponível.

Vários modos de alta taxa de atualização merecem atenção especial. A documentação de modos do projeto lista saídas de 2.048 por 1.080 a 70, 72 e 75 Hz. Seus clocks de pixel documentados chegam a aproximadamente 166,239, 171,142 e 178,592 MHz.

Esses valores excedem o teto de 165 MHz usado pelo driver upstream da ponte SiI902x no Linux. Os modos supostamente funcionaram com a placa e o monitor do autor, mas uma configuração bem-sucedida não estabelece segurança elétrica nem ampla compatibilidade.

Um cabo, switch KVM, adaptador, transmissor, GPU ou monitor pode falhar em um ponto diferente. Os sintomas podem incluir tela em branco, tremulação, bordas coloridas no texto, geometria distorcida ou reinicialização do gerenciador de exibição.

O monitor também precisa suportar estiramento em largura total para que a abordagem ultrawide se comporte como previsto. Sem essa configuração, ele pode exibir uma imagem mais estreita ou adicionar bordas. Mesmo com estiramento, detalhes horizontais finos já foram combinados durante a compressão por software.

O desempenho continua limitado pelo link PCIe. Converter atualizações para RGB565 reduz o tráfego, enquanto rastrear regiões modificadas evita o envio de pixels que permaneceram iguais. Nenhuma dessas técnicas cria largura de banda ilimitada.

Vídeo em tela cheia, interfaces animadas, rolagem rápida e grandes movimentos de janelas podem alterar a maior parte do quadro. Essas cargas de trabalho reduzem a vantagem do rastreamento de atualizações parciais. Uma GPU moderna com memória e hardware de exibição mais rápidos continuará sendo substancialmente mais adequada para elas.

A política assíncrona do driver cria outro compromisso deliberado. Ela mantém a atualização pendente mais recente em vez de preservar todos os quadros obsoletos. Isso pode melhorar a responsividade percebida porque a tela se atualiza em vez de reproduzir estados intermediários ultrapassados.

No entanto, isso não é page flipping convencional entre buffers frontal e traseiro. O driver também oferece uma opção de sombra dupla que compara instantâneos da fonte e da saída para ignorar uploads redundantes. Essa configuração consome memória adicional do sistema e não deve ser confundida com flipping por hardware.

A qualidade do kernel é a incerteza mais ampla. Um módulo externo interage com gerenciamento de memória, atualizações atômicas de exibição, conectores e registradores do dispositivo. Bugs nessas áreas podem afetar a estabilidade do sistema, e não apenas a qualidade visual.

O projeto inclui testes, scripts de empacotamento e um fluxo manual de integração contínua. Suas orientações de teste enfatizam o acesso de recuperação e recarregamentos controlados do módulo. Essas práticas reduzem riscos evitáveis, mas não substituem a revisão por especialistas.

A inclusão upstream imporia um processo mais exigente. Os mantenedores do Linux examinariam arquitetura, estilo de código, interfaces, funcionalidades duplicadas, escopo de hardware e manutenção de longo prazo. Eles também poderiam rejeitar recursos que deliberadamente excedem limites de clock documentados.

O projeto atualmente não reivindica qualidade upstream. Essa contenção é importante. O entusiasmo no Hacker News não deve transformar um repositório experimental em um endosso implícito do Linux, da Silicon Motion ou do fabricante do transmissor HDMI.

A assistência de IA acrescenta outra camada de incerteza. A divulgação do autor torna a procedência visível, mas a divulgação por si só não pode validar código gerado. Revisores ainda precisam inspecionar como o driver lida com tamanhos de buffer, sincronização, caminhos de erro e remoção do dispositivo.

Testes físicos são igualmente necessários. Emuladores e testes de compilação podem detectar alguns defeitos, mas não conseguem confirmar a qualidade do sinal em diferentes monitores e revisões de placa. Um driver projetado em torno de um adaptador precisa de mais proprietários de hardware antes que as alegações de compatibilidade possam se ampliar.

Portanto, o padrão apropriado é evidência, não origem. Código de kernel escrito por humanos pode conter bugs graves. Código assistido por IA pode ser útil quando seu comportamento é testado, sua fonte é revisável e suas alegações permanecem restritas.

Este projeto atende à parte da transparência desse padrão melhor do que muitos experimentos privados. Sua tarefa pendente é acumular validação independente. Até lá, ele deve continuar sendo uma opção controlada para usuários tecnicamente preparados, não um driver substituto de uso geral.

O Que a História no Hacker News Deve Fazer os Desenvolvedores Observarem a Seguir

Os três próximos sinais são testes independentes de hardware, manutenção contínua do kernel e evidências de um caminho upstream crível.

O primeiro sinal é o teste em placas SE-DP750A-HDMI adicionais. Vários proprietários precisam verificar o mesmo transmissor, configuração de memória, fiação GPIO, resoluções e comportamento de atualização. Resultados consistentes fortaleceriam a alegação de que a implementação suporta uma família de placas, e não apenas uma unidade.

Falhas também seriam valiosas. Uma placa com o mesmo rótulo comercial poderia conter uma revisão ou componente diferente. Registrar essas diferenças melhoraria a detecção de dispositivos e evitaria pressupostos inseguros.

Os relatórios mais úteis incluirão identificadores PCI exatos, marcações dos chips, modelos de monitor, versões do kernel, modos e sintomas de falha. Comentários gerais de que o driver “funciona” não conseguem estabelecer quais caminhos receberam testes relevantes.

O segundo sinal é a manutenção em novas versões do Linux. As interfaces DRM evoluem, e um módulo fora da árvore pode deixar de compilar mesmo quando sua lógica de hardware continua correta. Correções regulares de compatibilidade demonstrariam que o repositório se tornou um projeto contínuo, e não um experimento pontual.

A manutenção também inclui responder a relatórios de bugs, revisar contribuições e adicionar testes de regressão. Uma contagem crescente de estrelas não mede essas atividades. A qualidade dos commits e a resolução de issues importam mais do que a visibilidade de curto prazo no Hacker News.

O terceiro sinal é o contato com mantenedores DRM experientes ou uma discussão upstream concreta. O upstreaming não precisa ocorrer imediatamente, e o escopo atual específico da placa pode complicar esse caminho. Ainda assim, a revisão por especialistas revelaria fragilidades arquiteturais que os testes de hardware, por si só, não podem detectar.

Um caminho upstream provavelmente exigiria separar o suporte conservador dos experimentos acima da especificação. Modos EDID padrão, controle do transmissor HDMI, rastreamento de danos e scanout RGB565 seguro podem ser mais fáceis de avaliar do que modos opcionais de clock elevado.

Mesmo sem uma submissão para a mainline, a revisão técnica pode aprimorar o driver externo. Mantenedores podem identificar auxiliares DRM existentes, pressupostos inseguros ou maneiras melhores de modelar a ponte e o conector. Esse feedback fortaleceria o código enquanto preserva recursos experimentais fora do caminho padrão.

Os desenvolvedores também devem observar se a Silicon Motion ou fornecedores de placas respondem. Eles poderiam divulgar documentação esclarecedora, confirmar limites elétricos ou contribuir com detalhes sobre projetos relacionados. O silêncio deixaria os testes da comunidade como a principal fonte de conhecimento operacional.

A lição maior vai além desta GPU. Hardware especializado frequentemente chega a um ponto em que a capacidade física permanece intacta, mas o software oficial deixa de acompanhar os sistemas operacionais atuais. Código comunitário pode reabrir essa capacidade quando há documentação e testes pacientes disponíveis.

No entanto, abertura não é um contrato automático de manutenção. Um repositório público ainda pode ser abandonado. Uma licença GPL permite que outros continuem o trabalho, mas apenas se os colaboradores entenderem o hardware e aceitarem responsabilidade por mudanças futuras.

O novo driver de GPU de código aberto é bem-sucedido na primeira etapa mais importante. Ele transforma a investigação de um usuário em código inspecionável, configuração reproduzível, medições documentadas e avisos explícitos. Isso é substancialmente mais útil do que um patch local não documentado.

Seu valor de longo prazo dependerá de outras pessoas reproduzirem os resultados e aprimorarem a implementação. Se isso acontecer, o projeto se tornará um pequeno exemplo de infraestrutura compartilhada surgindo de um problema pessoal de hardware.

Se não acontecer, o repositório ainda preservará conhecimento técnico que, de outra forma, desapareceria com uma máquina. Futuros proprietários poderão inspecionar o código, comparar projetos de placas ou reutilizar descobertas individuais sem começar do zero.

É por isso que essa história do Hacker News merece atenção até de desenvolvedores que nunca terão um SM750. A questão relevante não é se esse adaptador compete com o hardware gráfico atual. Claramente, não compete.

A questão é se dispositivos sem suporte devem continuar limitados ao último software disponibilizado por seus fabricantes. O código aberto oferece outra resposta, mas exige testes, revisão e limites honestos de todos os envolvidos.

Acompanhe os relatórios de hardware do repositório, o trabalho de compatibilidade do kernel e a atividade de revisão nos próximos meses. Esses sinais mostrarão se o experimento com a SM750 se tornará um suporte duradouro ou continuará sendo um fascinante sucesso em um único sistema. Qualquer um dos resultados revelará algo importante sobre como as comunidades abertas preservam hardware útil.

 
 

Comece grátis

Um assistente de IA local-first com gestão de conhecimento pessoal

Para oferecer uma experiência de IA melhor,

atualmente, o remio é compatível apenas com Windows 10+ (x64) e M-Chip Macs.

Seu parceiro de IA no trabalho
Faça mais com o remio

Planeje. Crie. Entregue.
Tudo em um só lugar.

bottom of page