Mesa (main): pvr: Add core count info and pvr_device_runtime_info.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Apr 13 18:04:42 UTC 2022
Module: Mesa
Branch: main
Commit: 76ee1671f6d8b99619abdba10fc328ea7f085bf3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=76ee1671f6d8b99619abdba10fc328ea7f085bf3
Author: Karmjit Mahil <Karmjit.Mahil at imgtec.com>
Date: Wed Feb 23 13:51:55 2022 +0000
pvr: Add core count info and pvr_device_runtime_info.
Signed-off-by: Karmjit Mahil <Karmjit.Mahil at imgtec.com>
Reviewed-by: Frank Binns <frank.binns at imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15880>
---
src/imagination/vulkan/pvr_device.c | 4 ++-
src/imagination/vulkan/pvr_private.h | 4 +++
src/imagination/vulkan/winsys/pvr_winsys.h | 4 ++-
src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c | 18 +++++++++--
.../vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c | 36 ++++++++++++++++++++++
.../vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h | 21 +++++++++++++
6 files changed, 83 insertions(+), 4 deletions(-)
diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c
index 4126055213a..0049fa08e3d 100644
--- a/src/imagination/vulkan/pvr_device.c
+++ b/src/imagination/vulkan/pvr_device.c
@@ -355,7 +355,9 @@ static VkResult pvr_physical_device_init(struct pvr_physical_device *pdevice,
goto err_vk_free_master_path;
}
- ret = pdevice->ws->ops->device_info_init(pdevice->ws, &pdevice->dev_info);
+ ret = pdevice->ws->ops->device_info_init(pdevice->ws,
+ &pdevice->dev_info,
+ &pdevice->dev_runtime_info);
if (ret) {
result = VK_ERROR_INITIALIZATION_FAILED;
goto err_pvr_winsys_destroy;
diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h
index 2eaf159f2f5..08a21422b8c 100644
--- a/src/imagination/vulkan/pvr_private.h
+++ b/src/imagination/vulkan/pvr_private.h
@@ -201,6 +201,10 @@ struct pvr_physical_device {
struct pvr_winsys *ws;
struct pvr_device_info dev_info;
+ struct pvr_device_runtime_info {
+ uint32_t core_count;
+ } dev_runtime_info;
+
VkPhysicalDeviceMemoryProperties memory;
uint8_t pipeline_cache_uuid[VK_UUID_SIZE];
diff --git a/src/imagination/vulkan/winsys/pvr_winsys.h b/src/imagination/vulkan/winsys/pvr_winsys.h
index a7d724f76c3..19e9a010978 100644
--- a/src/imagination/vulkan/winsys/pvr_winsys.h
+++ b/src/imagination/vulkan/winsys/pvr_winsys.h
@@ -40,6 +40,7 @@
#include "util/vma.h"
struct pvr_device_info;
+struct pvr_device_runtime_info;
/* device virtual address */
typedef struct pvr_dev_addr {
@@ -357,7 +358,8 @@ struct pvr_winsys_render_submit_info {
struct pvr_winsys_ops {
void (*destroy)(struct pvr_winsys *ws);
int (*device_info_init)(struct pvr_winsys *ws,
- struct pvr_device_info *dev_info);
+ struct pvr_device_info *dev_info,
+ struct pvr_device_runtime_info *runtime_info);
void (*get_heaps_info)(struct pvr_winsys *ws,
struct pvr_winsys_heaps *heaps);
diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c
index 3d12ae3e7b8..646ffc67d66 100644
--- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c
+++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv.c
@@ -328,10 +328,13 @@ static void pvr_srv_winsys_destroy(struct pvr_winsys *ws)
pvr_srv_connection_destroy(fd);
}
-static int pvr_srv_winsys_device_info_init(struct pvr_winsys *ws,
- struct pvr_device_info *dev_info)
+static int
+pvr_srv_winsys_device_info_init(struct pvr_winsys *ws,
+ struct pvr_device_info *dev_info,
+ struct pvr_device_runtime_info *runtime_info)
{
struct pvr_srv_winsys *srv_ws = to_pvr_srv_winsys(ws);
+ VkResult result;
int ret;
ret = pvr_device_info_init(dev_info, srv_ws->bvnc);
@@ -344,6 +347,17 @@ static int pvr_srv_winsys_device_info_init(struct pvr_winsys *ws,
return ret;
}
+ if (PVR_HAS_FEATURE(dev_info, gpu_multicore_support)) {
+ result = pvr_srv_get_multicore_info(srv_ws->render_fd,
+ 0,
+ NULL,
+ &runtime_info->core_count);
+ if (result != VK_SUCCESS)
+ return -ENODEV;
+ } else {
+ runtime_info->core_count = 1;
+ }
+
return 0;
}
diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c
index 064cf8f82ee..4fe434cee9d 100644
--- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c
+++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c
@@ -125,6 +125,42 @@ void pvr_srv_connection_destroy(int fd)
}
}
+VkResult pvr_srv_get_multicore_info(int fd,
+ uint32_t caps_size,
+ uint64_t *caps,
+ uint32_t *num_cores)
+{
+ struct pvr_srv_bridge_getmulticoreinfo_cmd cmd = {
+ .caps = caps,
+ .caps_size = caps_size,
+ };
+
+ struct pvr_srv_bridge_getmulticoreinfo_ret ret = {
+ .caps = caps,
+ .error = PVR_SRV_ERROR_BRIDGE_CALL_FAILED,
+ };
+
+ int result;
+
+ result = pvr_srv_bridge_call(fd,
+ PVR_SRV_BRIDGE_SRVCORE,
+ PVR_SRV_BRIDGE_SRVCORE_GETMULTICOREINFO,
+ &cmd,
+ sizeof(cmd),
+ &ret,
+ sizeof(ret));
+ if (result || ret.error != PVR_SRV_OK) {
+ return vk_bridge_err(VK_ERROR_INITIALIZATION_FAILED,
+ "PVR_SRV_BRIDGE_SRVCORE_GETMULTICOREINFO",
+ ret);
+ }
+
+ if (!num_cores)
+ *num_cores = ret.num_cores;
+
+ return VK_SUCCESS;
+}
+
VkResult pvr_srv_alloc_sync_primitive_block(int fd,
void **const handle_out,
void **const pmr_out,
diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h
index fa829888759..3ea2a4b8e5e 100644
--- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h
+++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h
@@ -40,6 +40,7 @@
#define PVR_SRV_BRIDGE_SRVCORE_CONNECT 0UL
#define PVR_SRV_BRIDGE_SRVCORE_DISCONNECT 1UL
+#define PVR_SRV_BRIDGE_SRVCORE_GETMULTICOREINFO 12U
#define PVR_SRV_BRIDGE_SYNC 2UL
@@ -175,6 +176,21 @@ struct pvr_srv_bridge_disconnect_ret {
enum pvr_srv_error error;
} PACKED;
+/******************************************************************************
+ PVR_SRV_BRIDGE_SRVCORE_GETMULTICOREINFO structs
+ ******************************************************************************/
+
+struct pvr_srv_bridge_getmulticoreinfo_cmd {
+ uint64_t *caps;
+ uint32_t caps_size;
+} PACKED;
+
+struct pvr_srv_bridge_getmulticoreinfo_ret {
+ uint64_t *caps;
+ enum pvr_srv_error error;
+ uint32_t num_cores;
+} PACKED;
+
/******************************************************************************
PVR_SRV_BRIDGE_SYNC_ALLOCSYNCPRIMITIVEBLOCK struct
******************************************************************************/
@@ -711,6 +727,11 @@ struct drm_srvkm_cmd {
VkResult pvr_srv_connection_create(int fd, uint64_t *const bvnc_out);
void pvr_srv_connection_destroy(int fd);
+VkResult pvr_srv_get_multicore_info(int fd,
+ uint32_t caps_size,
+ uint64_t *caps,
+ uint32_t *num_cores);
+
VkResult pvr_srv_alloc_sync_primitive_block(int fd,
void **const handle_out,
void **const pmr_out,
More information about the mesa-commit
mailing list