From d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 02:45:28 +0000
Subject: [PATCH] add boot partition size
---
kernel/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c | 62 ++++++++++++++++++++++++++----
1 files changed, 53 insertions(+), 9 deletions(-)
diff --git a/kernel/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c b/kernel/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
index 5997483..bf1835b 100644
--- a/kernel/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
+++ b/kernel/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
@@ -71,29 +71,60 @@
kbase_csf_protected_memory_alloc(
struct kbase_device *const kbdev,
struct tagged_addr *phys,
- size_t num_pages)
+ size_t num_pages,
+ bool is_small_page)
{
size_t i;
struct protected_memory_allocator_device *pma_dev =
kbdev->csf.pma_dev;
- struct protected_memory_allocation **pma =
- kmalloc_array(num_pages, sizeof(*pma), GFP_KERNEL);
+ struct protected_memory_allocation **pma = NULL;
+ unsigned int order = KBASE_MEM_POOL_2MB_PAGE_TABLE_ORDER;
+ unsigned int num_pages_order;
+
+ if (is_small_page)
+ order = KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER;
+
+ num_pages_order = (1u << order);
+
+ /* Ensure the requested num_pages is aligned with
+ * the order type passed as argument.
+ *
+ * pma_alloc_page() will then handle the granularity
+ * of the allocation based on order.
+ */
+ num_pages = div64_u64(num_pages + num_pages_order - 1, num_pages_order);
+
+ pma = kmalloc_array(num_pages, sizeof(*pma), GFP_KERNEL);
if (WARN_ON(!pma_dev) || WARN_ON(!phys) || !pma)
return NULL;
for (i = 0; i < num_pages; i++) {
- pma[i] = pma_dev->ops.pma_alloc_page(pma_dev,
- KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER);
+ phys_addr_t phys_addr;
+
+ pma[i] = pma_dev->ops.pma_alloc_page(pma_dev, order);
if (!pma[i])
break;
- phys[i] = as_tagged(pma_dev->ops.pma_get_phys_addr(pma_dev,
- pma[i]));
+ phys_addr = pma_dev->ops.pma_get_phys_addr(pma_dev, pma[i]);
+
+ if (order) {
+ size_t j;
+
+ *phys++ = as_tagged_tag(phys_addr, HUGE_HEAD | HUGE_PAGE);
+
+ for (j = 1; j < num_pages_order; j++) {
+ *phys++ = as_tagged_tag(phys_addr +
+ PAGE_SIZE * j,
+ HUGE_PAGE);
+ }
+ } else {
+ phys[i] = as_tagged(phys_addr);
+ }
}
if (i != num_pages) {
- kbase_csf_protected_memory_free(kbdev, pma, i);
+ kbase_csf_protected_memory_free(kbdev, pma, i * num_pages_order, is_small_page);
return NULL;
}
@@ -103,15 +134,28 @@
void kbase_csf_protected_memory_free(
struct kbase_device *const kbdev,
struct protected_memory_allocation **pma,
- size_t num_pages)
+ size_t num_pages,
+ bool is_small_page)
{
size_t i;
struct protected_memory_allocator_device *pma_dev =
kbdev->csf.pma_dev;
+ unsigned int num_pages_order = (1u << KBASE_MEM_POOL_2MB_PAGE_TABLE_ORDER);
+
+ if (is_small_page)
+ num_pages_order = (1u << KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER);
if (WARN_ON(!pma_dev) || WARN_ON(!pma))
return;
+ /* Ensure the requested num_pages is aligned with
+ * the order type passed as argument.
+ *
+ * pma_alloc_page() will then handle the granularity
+ * of the allocation based on order.
+ */
+ num_pages = div64_u64(num_pages + num_pages_order - 1, num_pages_order);
+
for (i = 0; i < num_pages; i++)
pma_dev->ops.pma_free_page(pma_dev, pma[i]);
--
Gitblit v1.6.2