drm/etnaviv: split out cmdbuf mapping into address space
This allows to decouple the cmdbuf suballocator create and mapping the region into the GPU address space. Allowing multiple AS to share a single cmdbuf suballoc. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Guido Günther <agx@sigxcpu.org>
This commit is contained in:
@@ -687,8 +687,8 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu)
|
||||
prefetch = etnaviv_buffer_init(gpu);
|
||||
|
||||
gpu_write(gpu, VIVS_HI_INTR_ENBL, ~0U);
|
||||
etnaviv_gpu_start_fe(gpu, etnaviv_cmdbuf_get_va(&gpu->buffer),
|
||||
prefetch);
|
||||
etnaviv_gpu_start_fe(gpu, etnaviv_cmdbuf_get_va(&gpu->buffer,
|
||||
&gpu->cmdbuf_mapping), prefetch);
|
||||
}
|
||||
|
||||
int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
||||
@@ -767,16 +767,24 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
||||
goto destroy_iommu;
|
||||
}
|
||||
|
||||
ret = etnaviv_cmdbuf_suballoc_map(gpu->cmdbuf_suballoc, gpu->mmu,
|
||||
&gpu->cmdbuf_mapping,
|
||||
gpu->memory_base);
|
||||
if (ret) {
|
||||
dev_err(gpu->dev, "failed to map cmdbuf suballoc\n");
|
||||
goto destroy_suballoc;
|
||||
}
|
||||
|
||||
/* Create buffer: */
|
||||
ret = etnaviv_cmdbuf_init(gpu->cmdbuf_suballoc, &gpu->buffer,
|
||||
PAGE_SIZE);
|
||||
if (ret) {
|
||||
dev_err(gpu->dev, "could not create command buffer\n");
|
||||
goto destroy_suballoc;
|
||||
goto unmap_suballoc;
|
||||
}
|
||||
|
||||
if (gpu->mmu->version == ETNAVIV_IOMMU_V1 &&
|
||||
etnaviv_cmdbuf_get_va(&gpu->buffer) > 0x80000000) {
|
||||
etnaviv_cmdbuf_get_va(&gpu->buffer, &gpu->cmdbuf_mapping) > 0x80000000) {
|
||||
ret = -EINVAL;
|
||||
dev_err(gpu->dev,
|
||||
"command buffer outside valid memory window\n");
|
||||
@@ -805,6 +813,8 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
||||
|
||||
free_buffer:
|
||||
etnaviv_cmdbuf_free(&gpu->buffer);
|
||||
unmap_suballoc:
|
||||
etnaviv_cmdbuf_suballoc_unmap(gpu->mmu, &gpu->cmdbuf_mapping);
|
||||
destroy_suballoc:
|
||||
etnaviv_cmdbuf_suballoc_destroy(gpu->cmdbuf_suballoc);
|
||||
destroy_iommu:
|
||||
@@ -1681,6 +1691,7 @@ static void etnaviv_gpu_unbind(struct device *dev, struct device *master,
|
||||
|
||||
if (gpu->initialized) {
|
||||
etnaviv_cmdbuf_free(&gpu->buffer);
|
||||
etnaviv_cmdbuf_suballoc_unmap(gpu->mmu, &gpu->cmdbuf_mapping);
|
||||
etnaviv_cmdbuf_suballoc_destroy(gpu->cmdbuf_suballoc);
|
||||
etnaviv_iommu_destroy(gpu->mmu);
|
||||
gpu->initialized = false;
|
||||
|
Reference in New Issue
Block a user