diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2023-11-24 16:59:00 +0100 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-04-26 19:30:08 +0000 |
commit | 108d2103ea86f699ffa764f759021bd3745cc1e1 (patch) | |
tree | b2c7f36d481b4e837f156cd6c1d9f1c1cdaaa8c5 | |
parent | 06683288e0b891aba3b1ae602e820cde17638197 (diff) |
etnaviv: Pass npu to etna_screen_create in a separate parameter
Allow to pass both gpu and npu to etna_screen_create() separately,
in preparetion for devices with both 3D GPU and NPU.
Iterate over all cores or until both GPU and NPU are found.
If no 3D GPU was found, screen->gpu will be set to the npu as well,
so nothing changes for NPU-only devices.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28921>
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_screen.c | 9 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_screen.h | 3 | ||||
-rw-r--r-- | src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c | 43 |
3 files changed, 42 insertions, 13 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index 19a6a98ad8f..a3d3bfff6ac 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -106,6 +106,9 @@ etna_screen_destroy(struct pipe_screen *pscreen) if (screen->pipe) etna_pipe_del(screen->pipe); + if (screen->npu && screen->npu != screen->gpu) + etna_gpu_del(screen->npu); + if (screen->gpu) etna_gpu_del(screen->gpu); @@ -1059,7 +1062,7 @@ etna_screen_get_fd(struct pipe_screen *pscreen) struct pipe_screen * etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, - struct renderonly *ro) + struct etna_gpu *npu, struct renderonly *ro) { struct etna_screen *screen = CALLOC_STRUCT(etna_screen); struct pipe_screen *pscreen; @@ -1067,9 +1070,13 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, if (!screen) return NULL; + if (!gpu) + gpu = npu; + pscreen = &screen->base; screen->dev = dev; screen->gpu = gpu; + screen->npu = npu; screen->ro = ro; screen->info = etna_gpu_get_core_info(gpu); diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.h b/src/gallium/drivers/etnaviv/etnaviv_screen.h index 2bdf257658d..d45ce5fdb6a 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.h +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.h @@ -49,6 +49,7 @@ struct etna_screen { struct etna_device *dev; struct etna_gpu *gpu; + struct etna_gpu *npu; struct etna_pipe *pipe; struct etna_perfmon *perfmon; struct renderonly *ro; @@ -90,7 +91,7 @@ etna_screen_bo_from_handle(struct pipe_screen *pscreen, struct pipe_screen * etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, - struct renderonly *ro); + struct etna_gpu *npu, struct renderonly *ro); static inline size_t etna_screen_get_tile_size(struct etna_screen *screen, uint8_t ts_mode, diff --git a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c index 5ea3eca1a01..6c273c06a62 100644 --- a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c +++ b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c @@ -38,7 +38,8 @@ static struct pipe_screen * screen_create(int gpu_fd, const struct pipe_screen_config *config, struct renderonly *ro) { struct etna_device *dev; - struct etna_gpu *gpu; + struct etna_gpu *gpu = NULL; + struct etna_gpu *npu = NULL; int i; dev = etna_device_new_dup(gpu_fd); @@ -47,21 +48,41 @@ screen_create(int gpu_fd, const struct pipe_screen_config *config, struct render return NULL; } - for (i = 0;; i++) { - gpu = etna_gpu_new(dev, i); - if (!gpu) { - fprintf(stderr, "Error creating gpu\n"); - return NULL; - } + for (i = 0; !gpu || !npu; i++) { + struct etna_core_info *info; + struct etna_gpu *core = etna_gpu_new(dev, i); + + if (!core) + break; - /* Look for a 3D capable GPU */ - if (etna_core_has_feature(etna_gpu_get_core_info(gpu), ETNA_FEATURE_PIPE_3D)) + info = etna_gpu_get_core_info(core); + switch (info->type) { + case ETNA_CORE_GPU: + /* Look for a 3D capable GPU */ + if (!gpu && etna_core_has_feature(info, ETNA_FEATURE_PIPE_3D)) { + gpu = core; + continue; + } + break; + case ETNA_CORE_NPU: + if (!npu) { + npu = core; + continue; + } break; + default: + unreachable("invalid core type"); + } + + etna_gpu_del(core); + } - etna_gpu_del(gpu); + if (!gpu && !npu) { + fprintf(stderr, "Error creating gpu or npu\n"); + return NULL; } - return etna_screen_create(dev, gpu, ro); + return etna_screen_create(dev, gpu, npu, ro); } struct pipe_screen * |