Eu assumo que o seu “dispositivo FPGA” é um bloco personalizado, mapeado para memória através da interface AXI para o Cortex-A9. Eu acho que existem 2 ou 3 maneiras de fazer isso funcionar.
1) Mapeamento em cache. A interface de hardware de cache faz a transferência instantânea de toda uma linha de cache por vez. Você precisaria limpar manualmente (após as gravações) e invalidar (antes das leituras).
2) O mapeamento não-armazenável em cache e possui uma rotina de linguagem assembly ARM manipula a transferência de baixo nível. Acho que as instruções "Carregar e armazenar vários registros" podem fornecer o que você está procurando.
Eu tive um problema semelhante em que um periférico AXI (controlador de memória personalizado) precisava ser acessado com transferências de 8 bytes do processador Cortex-A9. As instruções usuais do ARM, é claro, transferem 1, 2 ou 4 bytes (byte, halfword, word). Aqueles trabalhavam através de mapeamento em cache, mas não através de mapeamento não-cacheable. LDM / STM , 2 palavras de cada vez , trabalhou com os dois mapeamentos.
Os modos de transferência AHB / AXI dependem da implementação, é claro. Por sua descrição, você precisa dos modos INCR ou WRAP ao invés de SINGLE. Mas não deveria ser assim. Isso traz à tona a terceira maneira de fazer isso funcionar:
3) Converse com o seu designer de hardware digital, conscientize-o sobre o impacto do software em sua implementação.
Na minha opinião, você não precisa fazer operações incomuns / personalizadas de MMU de baixo nível. Linux tem métodos de alto nível, você colocaria ganchos padrão no seu driver de dispositivo e / ou board.c, a principal opção é ir uncached (isto é, COHERENT). Consulte LDD3 .