From 416cb0993bf46c503b46ed36c84ebffa6dde9d9b Mon Sep 17 00:00:00 2001
From: Benjamin Lee <benjamin.lee@collabora.com>
Date: Thu, 20 Mar 2025 23:55:48 -0700
Subject: [PATCH] panvk: add core mask environment variables

PANVK_COMPUTE_CORE_MASK and PANVK_FRAGMENT_CORE_MASK override the
corresponding driconf options if present.

Signed-off-by: Benjamin Lee <benjamin.lee@collabora.com>
---
 src/panfrost/vulkan/panvk_physical_device.c | 25 +++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c
index 10892d62d37..d2504bbe108 100644
--- a/src/panfrost/vulkan/panvk_physical_device.c
+++ b/src/panfrost/vulkan/panvk_physical_device.c
@@ -133,10 +133,23 @@ get_cache_uuid(uint16_t family, void *uuid)
 static VkResult
 get_core_mask(struct panvk_physical_device *device,
               const struct panvk_instance *instance, const char *option_name,
-              uint64_t *mask)
+              const char *env_name, uint64_t *mask)
 {
+   *mask = driQueryOptionu64(&instance->dri_options, option_name);
+
+   const char *env_str = getenv(env_name);
+   if (env_str) {
+      char *end = NULL;
+      errno = 0;
+      *mask = strtoull(env_str, &end, 0);
+      if (errno == ERANGE || *end != 0 || env_str[0] == '-')
+         return panvk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
+                             "%s is not a 64-bit unsigned integer.\n",
+                             env_name);
+   }
+
    uint64_t present = device->kmod.props.shader_present;
-   *mask = driQueryOptionu64(&instance->dri_options, option_name) & present;
+   *mask &= present;
 
    if (!*mask)
       return panvk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
@@ -153,11 +166,15 @@ get_core_masks(struct panvk_physical_device *device,
 {
    VkResult result;
 
-   result = get_core_mask(device, instance, "panvk_compute_core_mask",
+   result = get_core_mask(device, instance,
+                          "panvk_compute_core_mask",
+                          "PANVK_COMPUTE_CORE_MASK",
                           &device->compute_core_mask);
    if (result != VK_SUCCESS)
       return result;
-   result = get_core_mask(device, instance, "panvk_fragment_core_mask",
+   result = get_core_mask(device, instance,
+                          "panvk_fragment_core_mask",
+                          "PANVK_FRAGMENT_CORE_MASK",
                           &device->fragment_core_mask);
 
    return result;
-- 
GitLab