From f70575805708cabdedea7498aaa3f710fde4d920 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 31 Jan 2024 03:29:01 +0000 Subject: [PATCH] add lvds1024*800 --- kernel/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c | 76 ++++++++++++++++++++++++++++--------- 1 files changed, 57 insertions(+), 19 deletions(-) diff --git a/kernel/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c b/kernel/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c index 16b928d..f2c6274 100644 --- a/kernel/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c +++ b/kernel/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note /* * - * (C) COPYRIGHT 2010-2014, 2016-2021 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2010-2014, 2016-2022 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -35,12 +35,13 @@ #define ENTRY_IS_INVAL 2ULL #define ENTRY_IS_PTE 3ULL -#define ENTRY_ATTR_BITS (7ULL << 2) /* bits 4:2 */ #define ENTRY_ACCESS_RW (1ULL << 6) /* bits 6:7 */ #define ENTRY_ACCESS_RO (3ULL << 6) -#define ENTRY_SHARE_BITS (3ULL << 8) /* bits 9:8 */ #define ENTRY_ACCESS_BIT (1ULL << 10) #define ENTRY_NX_BIT (1ULL << 54) + +#define UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR (55) +#define VALID_ENTRY_MASK ((u64)0xF << UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR) /* Helper Function to perform assignment of page table entries, to * ensure the use of strd, which is required on LPAE systems. @@ -85,6 +86,7 @@ if (!(entry & 1)) return 0; + entry &= ~VALID_ENTRY_MASK; return entry & ~0xFFF; } @@ -151,29 +153,65 @@ ENTRY_ACCESS_BIT | ENTRY_IS_ATE_L02); } +static unsigned int get_num_valid_entries(u64 *pgd) +{ + register unsigned int num_of_valid_entries; + + num_of_valid_entries = + (unsigned int)((pgd[2] & VALID_ENTRY_MASK) >> + (UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR - 8)); + num_of_valid_entries |= + (unsigned int)((pgd[1] & VALID_ENTRY_MASK) >> + (UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR - 4)); + num_of_valid_entries |= + (unsigned int)((pgd[0] & VALID_ENTRY_MASK) >> + (UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR)); + + return num_of_valid_entries; +} + +static void set_num_valid_entries(u64 *pgd, unsigned int num_of_valid_entries) +{ + WARN_ON_ONCE(num_of_valid_entries > KBASE_MMU_PAGE_ENTRIES); + + pgd[0] &= ~VALID_ENTRY_MASK; + pgd[0] |= ((u64)(num_of_valid_entries & 0xF) + << UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR); + + pgd[1] &= ~VALID_ENTRY_MASK; + pgd[1] |= ((u64)((num_of_valid_entries >> 4) & 0xF) + << UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR); + + pgd[2] &= ~VALID_ENTRY_MASK; + pgd[2] |= ((u64)((num_of_valid_entries >> 8) & 0xF) + << UNUSED_BIT_POSITION_IN_PAGE_DESCRIPTOR); +} + static void entry_set_pte(u64 *entry, phys_addr_t phy) { - page_table_entry_set(entry, (phy & PAGE_MASK) | - ENTRY_ACCESS_BIT | ENTRY_IS_PTE); + page_table_entry_set(entry, (phy & PAGE_MASK) | ENTRY_ACCESS_BIT | ENTRY_IS_PTE); } -static void entry_invalidate(u64 *entry) +static void entries_invalidate(u64 *entry, u32 count) { - page_table_entry_set(entry, ENTRY_IS_INVAL); + u32 i; + + for (i = 0; i < count; i++) + page_table_entry_set(entry + i, ENTRY_IS_INVAL); } -static struct kbase_mmu_mode const aarch64_mode = { - .update = mmu_update, - .get_as_setup = kbase_mmu_get_as_setup, - .disable_as = mmu_disable_as, - .pte_to_phy_addr = pte_to_phy_addr, - .ate_is_valid = ate_is_valid, - .pte_is_valid = pte_is_valid, - .entry_set_ate = entry_set_ate, - .entry_set_pte = entry_set_pte, - .entry_invalidate = entry_invalidate, - .flags = KBASE_MMU_MODE_HAS_NON_CACHEABLE -}; +static const struct kbase_mmu_mode aarch64_mode = { .update = mmu_update, + .get_as_setup = kbase_mmu_get_as_setup, + .disable_as = mmu_disable_as, + .pte_to_phy_addr = pte_to_phy_addr, + .ate_is_valid = ate_is_valid, + .pte_is_valid = pte_is_valid, + .entry_set_ate = entry_set_ate, + .entry_set_pte = entry_set_pte, + .entries_invalidate = entries_invalidate, + .get_num_valid_entries = get_num_valid_entries, + .set_num_valid_entries = set_num_valid_entries, + .flags = KBASE_MMU_MODE_HAS_NON_CACHEABLE }; struct kbase_mmu_mode const *kbase_mmu_mode_get_aarch64(void) { -- Gitblit v1.6.2