diff options
author | Jack Diver <diverj@google.com> | 2023-02-08 15:40:46 +0000 |
---|---|---|
committer | Jack Diver <diverj@google.com> | 2023-03-23 12:11:40 +0000 |
commit | 399d0259f81adc479fdc8889a02297b23a2f2e54 (patch) | |
tree | 576a383a78b7149be3a60f67e0a501c629d7c1a8 /mali_pixel | |
parent | 37d40a8fccf65c9a318e73b7146d46000f80019c (diff) | |
download | gpu-399d0259f81adc479fdc8889a02297b23a2f2e54.tar.gz |
mali_pixel: Add entry point for resizing a memory group
Add a backdoor entry point to allow the mali_kbase platform integration
to resize the GPU SLC memory group, by mutating the underlying
partition.
Bug: 264990406
Test: Build mali_kbase, mali_pixel
Test: Boot to home
Change-Id: I8f933625b040d419b9e5676976ea3cf9cde87cec
Signed-off-by: Jack Diver <diverj@google.com>
Diffstat (limited to 'mali_pixel')
-rw-r--r-- | mali_pixel/memory_group_manager.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/mali_pixel/memory_group_manager.c b/mali_pixel/memory_group_manager.c index 64cf692..fc7a5bd 100644 --- a/mali_pixel/memory_group_manager.c +++ b/mali_pixel/memory_group_manager.c @@ -437,6 +437,83 @@ static void enable_partition(struct mgm_groups* data, enum pixel_mgm_group_id gr data->groups[group_id].state = MGM_GROUP_STATE_ENABLED; } +static void set_group_partition(struct mgm_groups* data, + enum pixel_mgm_group_id group_id, + int new_pt_index) +{ + int ptid, pbha; + int active_id = group_active_pt_id(data, group_id); + int new_id = group_pt_id(data, group_id, new_pt_index); + + /* Early out if no changes are needed */ + if (new_id == active_id) + return; + + ptid = pt_client_mutate(data->pt_handle, active_id, new_id); + if (ptid == -EINVAL) + dev_err(data->dev, "Failed to get partition for group: %d\n", group_id); + else + dev_info(data->dev, "pt_client_enable returned ptid=%d for group=%d", ptid, group_id); + + pbha = pt_pbha(data->dev->of_node, new_id); + if (pbha == PT_PBHA_INVALID) + dev_err(data->dev, "Failed to get PBHA for group: %d\n", group_id); + else + dev_info(data->dev, "pt_pbha returned PBHA=%d for group=%d", pbha, group_id); + + data->groups[group_id].ptid = ptid; + data->groups[group_id].pbha = pbha; + data->groups[group_id].active_pt_idx = new_pt_index; +} + +u64 pixel_mgm_resize_group_to_fit(struct memory_group_manager_device* mgm_dev, + enum pixel_mgm_group_id group_id, + u64 demand) +{ + struct mgm_groups *data; + struct mgm_group *group; + s64 diff, cur_size, min_diff = S64_MAX; + int pt_idx; + u64 ret = 0; + /* Convert demand to nearest KB */ + s64 demand_kb = demand >> 10; + + /* Early out if the group doesn't exist */ + if (INVALID_GROUP_ID(group_id)) + goto done; + + data = mgm_dev->data; + group = &data->groups[group_id]; + + /* Early out if the group has no partitions */ + if (group->pt_num == 0) + goto done; + + /* Calculate best partition to use, by finding the nearest size */ + for (pt_idx = 0; pt_idx < group->pt_num; ++pt_idx) + { + cur_size = data->pt_sizes[group_pt_id(data, group_id, pt_idx)]; + diff = abs(demand_kb - cur_size); + + if (diff > min_diff) + break; + + min_diff = diff; + } + + set_group_partition(data, group_id, pt_idx - 1); + + /* Get the new partition size, in bytes */ + ret = data->pt_sizes[group_active_pt_id(data, group_id)] << 10; + + dev_dbg(data->dev, "%s: resized memory_group_%d to %lluB for demand: %lldB", + __func__, group_id, ret, demand); + +done: + return ret; +} +EXPORT_SYMBOL(pixel_mgm_resize_group_to_fit); + static struct page *mgm_alloc_page( struct memory_group_manager_device *mgm_dev, int group_id, gfp_t gfp_mask, unsigned int order) |