drm/etnaviv: add function to construct MMUv2 init buffer
Both the safe/scratch address and the master TLB address are per pipe with the CPU mapped registers not properly propagating to the different translation units. The only way to correctly configure all translation units is to have a command stream snipped executed by the FE, before any other execution can start. Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "common.xml.h"
|
||||
#include "state.xml.h"
|
||||
#include "state_hi.xml.h"
|
||||
#include "state_3d.xml.h"
|
||||
#include "cmdstream.xml.h"
|
||||
|
||||
@@ -174,6 +175,39 @@ u16 etnaviv_buffer_init(struct etnaviv_gpu *gpu)
|
||||
return buffer->user_size / 8;
|
||||
}
|
||||
|
||||
u16 etnaviv_buffer_config_mmuv2(struct etnaviv_gpu *gpu, u32 mtlb_addr, u32 safe_addr)
|
||||
{
|
||||
struct etnaviv_cmdbuf *buffer = gpu->buffer;
|
||||
|
||||
buffer->user_size = 0;
|
||||
|
||||
if (gpu->identity.features & chipFeatures_PIPE_3D) {
|
||||
CMD_LOAD_STATE(buffer, VIVS_GL_PIPE_SELECT,
|
||||
VIVS_GL_PIPE_SELECT_PIPE(ETNA_PIPE_3D));
|
||||
CMD_LOAD_STATE(buffer, VIVS_MMUv2_CONFIGURATION,
|
||||
mtlb_addr | VIVS_MMUv2_CONFIGURATION_MODE_MODE4_K);
|
||||
CMD_LOAD_STATE(buffer, VIVS_MMUv2_SAFE_ADDRESS, safe_addr);
|
||||
CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
|
||||
CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
|
||||
}
|
||||
|
||||
if (gpu->identity.features & chipFeatures_PIPE_2D) {
|
||||
CMD_LOAD_STATE(buffer, VIVS_GL_PIPE_SELECT,
|
||||
VIVS_GL_PIPE_SELECT_PIPE(ETNA_PIPE_2D));
|
||||
CMD_LOAD_STATE(buffer, VIVS_MMUv2_CONFIGURATION,
|
||||
mtlb_addr | VIVS_MMUv2_CONFIGURATION_MODE_MODE4_K);
|
||||
CMD_LOAD_STATE(buffer, VIVS_MMUv2_SAFE_ADDRESS, safe_addr);
|
||||
CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
|
||||
CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
|
||||
}
|
||||
|
||||
CMD_END(buffer);
|
||||
|
||||
buffer->user_size = ALIGN(buffer->user_size, 8);
|
||||
|
||||
return buffer->user_size / 8;
|
||||
}
|
||||
|
||||
void etnaviv_buffer_end(struct etnaviv_gpu *gpu)
|
||||
{
|
||||
struct etnaviv_cmdbuf *buffer = gpu->buffer;
|
||||
|
Reference in New Issue
Block a user