summaryrefslogtreecommitdiffstats
path: root/src/intel
diff options
context:
space:
mode:
authorEric Engestrom <[email protected]>2018-10-18 17:19:56 +0100
committerEric Engestrom <[email protected]>2019-07-29 13:58:57 +0100
commitef57fb235016a168b0f2260783c44c7f4ebea32d (patch)
tree4538239cbb52b538d4b92736f708bb53b91670c0 /src/intel
parent58ee973e8737441a78c3ca49d3f8fe9db29447d0 (diff)
intel: replace large stack buffer with heap allocation
For now, this keeps the "100 bytes" allocation; we can try to figure out the correct size as a follow up. Suggested-by: Lionel Landwerlin <[email protected]> Signed-off-by: Eric Engestrom <[email protected]> Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/intel')
-rw-r--r--src/intel/dev/gen_device_info.c57
-rw-r--r--src/intel/dev/gen_device_info.h2
2 files changed, 32 insertions, 27 deletions
diff --git a/src/intel/dev/gen_device_info.c b/src/intel/dev/gen_device_info.c
index 951e81d3e60..6f3b6ff35b6 100644
--- a/src/intel/dev/gen_device_info.c
+++ b/src/intel/dev/gen_device_info.c
@@ -22,6 +22,7 @@
*/
#include <assert.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -1057,62 +1058,66 @@ fill_masks(struct gen_device_info *devinfo)
}
}
-void
+bool
gen_device_info_update_from_masks(struct gen_device_info *devinfo,
uint32_t slice_mask,
uint32_t subslice_mask,
uint32_t n_eus)
{
- struct {
- struct drm_i915_query_topology_info base;
- uint8_t data[100];
- } topology;
+ struct drm_i915_query_topology_info *topology;
assert((slice_mask & 0xff) == slice_mask);
- memset(&topology, 0, sizeof(topology));
+ size_t data_length = 100;
+
+ topology = calloc(1, sizeof(*topology) + data_length);
+ if (!topology)
+ return false;
- topology.base.max_slices = util_last_bit(slice_mask);
- topology.base.max_subslices = util_last_bit(subslice_mask);
+ topology->max_slices = util_last_bit(slice_mask);
+ topology->max_subslices = util_last_bit(subslice_mask);
- topology.base.subslice_offset = DIV_ROUND_UP(topology.base.max_slices, 8);
- topology.base.subslice_stride = DIV_ROUND_UP(topology.base.max_subslices, 8);
+ topology->subslice_offset = DIV_ROUND_UP(topology->max_slices, 8);
+ topology->subslice_stride = DIV_ROUND_UP(topology->max_subslices, 8);
uint32_t n_subslices = __builtin_popcount(slice_mask) *
__builtin_popcount(subslice_mask);
uint32_t num_eu_per_subslice = DIV_ROUND_UP(n_eus, n_subslices);
uint32_t eu_mask = (1U << num_eu_per_subslice) - 1;
- topology.base.eu_offset = topology.base.subslice_offset +
- DIV_ROUND_UP(topology.base.max_subslices, 8);
- topology.base.eu_stride = DIV_ROUND_UP(num_eu_per_subslice, 8);
+ topology->eu_offset = topology->subslice_offset +
+ DIV_ROUND_UP(topology->max_subslices, 8);
+ topology->eu_stride = DIV_ROUND_UP(num_eu_per_subslice, 8);
/* Set slice mask in topology */
- for (int b = 0; b < topology.base.subslice_offset; b++)
- topology.base.data[b] = (slice_mask >> (b * 8)) & 0xff;
+ for (int b = 0; b < topology->subslice_offset; b++)
+ topology->data[b] = (slice_mask >> (b * 8)) & 0xff;
- for (int s = 0; s < topology.base.max_slices; s++) {
+ for (int s = 0; s < topology->max_slices; s++) {
/* Set subslice mask in topology */
- for (int b = 0; b < topology.base.subslice_stride; b++) {
- int subslice_offset = topology.base.subslice_offset +
- s * topology.base.subslice_stride + b;
+ for (int b = 0; b < topology->subslice_stride; b++) {
+ int subslice_offset = topology->subslice_offset +
+ s * topology->subslice_stride + b;
- topology.base.data[subslice_offset] = (subslice_mask >> (b * 8)) & 0xff;
+ topology->data[subslice_offset] = (subslice_mask >> (b * 8)) & 0xff;
}
/* Set eu mask in topology */
- for (int ss = 0; ss < topology.base.max_subslices; ss++) {
- for (int b = 0; b < topology.base.eu_stride; b++) {
- int eu_offset = topology.base.eu_offset +
- (s * topology.base.max_subslices + ss) * topology.base.eu_stride + b;
+ for (int ss = 0; ss < topology->max_subslices; ss++) {
+ for (int b = 0; b < topology->eu_stride; b++) {
+ int eu_offset = topology->eu_offset +
+ (s * topology->max_subslices + ss) * topology->eu_stride + b;
- topology.base.data[eu_offset] = (eu_mask >> (b * 8)) & 0xff;
+ topology->data[eu_offset] = (eu_mask >> (b * 8)) & 0xff;
}
}
}
- gen_device_info_update_from_topology(devinfo, &topology.base);
+ gen_device_info_update_from_topology(devinfo, topology);
+ free(topology);
+
+ return true;
}
static void
diff --git a/src/intel/dev/gen_device_info.h b/src/intel/dev/gen_device_info.h
index 4fe937355a7..6199290f995 100644
--- a/src/intel/dev/gen_device_info.h
+++ b/src/intel/dev/gen_device_info.h
@@ -268,7 +268,7 @@ bool gen_get_device_info(int devid, struct gen_device_info *devinfo);
const char *gen_get_device_name(int devid);
/* Used with SLICE_MASK/SUBSLICE_MASK values from DRM_I915_GETPARAM. */
-void gen_device_info_update_from_masks(struct gen_device_info *devinfo,
+bool gen_device_info_update_from_masks(struct gen_device_info *devinfo,
uint32_t slice_mask,
uint32_t subslice_mask,
uint32_t n_eus);