.. | .. |
---|
1 | 1 | // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note |
---|
2 | 2 | /* |
---|
3 | 3 | * |
---|
4 | | - * (C) COPYRIGHT 2014-2016, 2018, 2020-2021 ARM Limited. All rights reserved. |
---|
| 4 | + * (C) COPYRIGHT 2014-2016, 2018, 2020-2022 ARM Limited. All rights reserved. |
---|
5 | 5 | * |
---|
6 | 6 | * This program is free software and is provided to you under the terms of the |
---|
7 | 7 | * GNU General Public License version 2 as published by the Free Software |
---|
.. | .. |
---|
22 | 22 | #include "backend/gpu/mali_kbase_cache_policy_backend.h" |
---|
23 | 23 | #include <device/mali_kbase_device.h> |
---|
24 | 24 | |
---|
| 25 | +/** |
---|
| 26 | + * kbasep_amba_register_present() - Check AMBA_<> register is present |
---|
| 27 | + * in the GPU. |
---|
| 28 | + * @kbdev: Device pointer |
---|
| 29 | + * |
---|
| 30 | + * Note: Only for arch version 12.x.1 onwards. |
---|
| 31 | + * |
---|
| 32 | + * Return: true if AMBA_FEATURES/ENABLE registers are present. |
---|
| 33 | + */ |
---|
| 34 | +static bool kbasep_amba_register_present(struct kbase_device *kbdev) |
---|
| 35 | +{ |
---|
| 36 | + return (ARCH_MAJOR_REV_REG(kbdev->gpu_props.props.raw_props.gpu_id) >= |
---|
| 37 | + GPU_ID2_ARCH_MAJOR_REV_MAKE(12, 1)); |
---|
| 38 | +} |
---|
| 39 | + |
---|
25 | 40 | void kbase_cache_set_coherency_mode(struct kbase_device *kbdev, |
---|
26 | 41 | u32 mode) |
---|
27 | 42 | { |
---|
28 | 43 | kbdev->current_gpu_coherency_mode = mode; |
---|
29 | 44 | |
---|
30 | | - if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_COHERENCY_REG)) |
---|
| 45 | + if (kbasep_amba_register_present(kbdev)) { |
---|
| 46 | + u32 val = kbase_reg_read(kbdev, AMBA_ENABLE); |
---|
| 47 | + |
---|
| 48 | + val = AMBA_ENABLE_COHERENCY_PROTOCOL_SET(val, mode); |
---|
| 49 | + kbase_reg_write(kbdev, AMBA_ENABLE, val); |
---|
| 50 | + } else |
---|
31 | 51 | kbase_reg_write(kbdev, COHERENCY_ENABLE, mode); |
---|
32 | 52 | } |
---|
33 | 53 | |
---|
| 54 | +u32 kbase_cache_get_coherency_features(struct kbase_device *kbdev) |
---|
| 55 | +{ |
---|
| 56 | + u32 coherency_features; |
---|
| 57 | + |
---|
| 58 | + if (kbasep_amba_register_present(kbdev)) |
---|
| 59 | + coherency_features = |
---|
| 60 | + kbase_reg_read(kbdev, GPU_CONTROL_REG(AMBA_FEATURES)); |
---|
| 61 | + else |
---|
| 62 | + coherency_features = kbase_reg_read( |
---|
| 63 | + kbdev, GPU_CONTROL_REG(COHERENCY_FEATURES)); |
---|
| 64 | + |
---|
| 65 | + return coherency_features; |
---|
| 66 | +} |
---|
| 67 | + |
---|
| 68 | +void kbase_amba_set_memory_cache_support(struct kbase_device *kbdev, |
---|
| 69 | + bool enable) |
---|
| 70 | +{ |
---|
| 71 | + if (kbasep_amba_register_present(kbdev)) { |
---|
| 72 | + u32 val = kbase_reg_read(kbdev, AMBA_ENABLE); |
---|
| 73 | + |
---|
| 74 | + val = AMBA_ENABLE_MEMORY_CACHE_SUPPORT_SET(val, enable); |
---|
| 75 | + kbase_reg_write(kbdev, AMBA_ENABLE, val); |
---|
| 76 | + |
---|
| 77 | + } else { |
---|
| 78 | + WARN(1, "memory_cache_support not supported"); |
---|
| 79 | + } |
---|
| 80 | +} |
---|
| 81 | + |
---|
| 82 | +void kbase_amba_set_invalidate_hint(struct kbase_device *kbdev, bool enable) |
---|
| 83 | +{ |
---|
| 84 | + if (kbasep_amba_register_present(kbdev)) { |
---|
| 85 | + u32 val = kbase_reg_read(kbdev, AMBA_ENABLE); |
---|
| 86 | + |
---|
| 87 | + val = AMBA_ENABLE_INVALIDATE_HINT_SET(val, enable); |
---|
| 88 | + kbase_reg_write(kbdev, AMBA_ENABLE, val); |
---|
| 89 | + } else { |
---|
| 90 | + WARN(1, "invalidate_hint not supported"); |
---|
| 91 | + } |
---|
| 92 | +} |
---|