replace common qcom sources with samsung ones
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2008-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2025, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <uapi/linux/sched/types.h>
|
||||
@@ -26,6 +26,8 @@
|
||||
#include <linux/string_helpers.h>
|
||||
#include <soc/qcom/of_common.h>
|
||||
#include <soc/qcom/secure_buffer.h>
|
||||
#include <linux/sec_mm.h>
|
||||
#include <trace/hooks/mm.h>
|
||||
|
||||
#include "kgsl_compat.h"
|
||||
#include "kgsl_debugfs.h"
|
||||
@@ -5205,6 +5207,81 @@ int kgsl_of_property_read_ddrtype(struct device_node *node, const char *base,
|
||||
return of_property_read_u32(node, base, ptr);
|
||||
}
|
||||
|
||||
static atomic_long_t kgsl_nr_shmem = ATOMIC_LONG_INIT(0);
|
||||
static atomic_long_t kgsl_nr_swapped = ATOMIC_LONG_INIT(0);
|
||||
|
||||
static inline bool is_gpu_mapping(struct address_space *mapping)
|
||||
{
|
||||
return (mapping && !((unsigned long)mapping & PAGE_MAPPING_ANON)
|
||||
&& (mapping->private_data == (void *)GPU_PAGE_MAGIC));
|
||||
}
|
||||
|
||||
static void kgsl_count_shmem(void *data, struct address_space *mapping, long nr_pages)
|
||||
{
|
||||
if (is_gpu_mapping(mapping))
|
||||
atomic_long_add(nr_pages, &kgsl_nr_shmem);
|
||||
}
|
||||
|
||||
static void kgsl_count_swapped(void *data, struct address_space *mapping, long nr_pages)
|
||||
{
|
||||
if (is_gpu_mapping(mapping))
|
||||
atomic_long_add(nr_pages, &kgsl_nr_swapped);
|
||||
}
|
||||
|
||||
static void kgsl_show_mem(void *data, unsigned int filter, nodemask_t *nodemask)
|
||||
{
|
||||
long total_kbytes = atomic_long_read(&kgsl_driver.stats.page_alloc) >> 10;
|
||||
long shmem_kbytes = K(atomic_long_read(&kgsl_nr_shmem));
|
||||
long swapped_kbytes = K(atomic_long_read(&kgsl_nr_swapped));
|
||||
|
||||
if (shmem_kbytes < 0)
|
||||
shmem_kbytes = 0;
|
||||
if (swapped_kbytes < 0)
|
||||
swapped_kbytes = 0;
|
||||
|
||||
pr_info("%s: %ld kB\n", "GpuTotal", total_kbytes);
|
||||
pr_info("%s: %lu kB\n", "KgslShmemUsage", shmem_kbytes);
|
||||
pr_info("%s: %lu kB\n", "GpuSwap", swapped_kbytes);
|
||||
}
|
||||
|
||||
static void kgsl_meminfo(void *data, struct seq_file *m)
|
||||
{
|
||||
long total_kbytes = atomic_long_read(&kgsl_driver.stats.page_alloc) >> 10;
|
||||
long shmem_kbytes = K(atomic_long_read(&kgsl_nr_shmem));
|
||||
long swapped_kbytes = K(atomic_long_read(&kgsl_nr_swapped));
|
||||
|
||||
if (shmem_kbytes < 0)
|
||||
shmem_kbytes = 0;
|
||||
if (swapped_kbytes < 0)
|
||||
swapped_kbytes = 0;
|
||||
|
||||
show_val_meminfo(m, "GpuTotal", total_kbytes);
|
||||
show_val_meminfo(m, "KgslShmemUsage", shmem_kbytes);
|
||||
show_val_meminfo(m, "GpuSwap", swapped_kbytes);
|
||||
}
|
||||
|
||||
static void kgsl_cache_adjust(void *data, unsigned long *cached)
|
||||
{
|
||||
long nr_shmem_pages = atomic_long_read(&kgsl_nr_shmem);
|
||||
|
||||
if (nr_shmem_pages < 0)
|
||||
nr_shmem_pages = 0;
|
||||
*cached -= (unsigned long)nr_shmem_pages;
|
||||
}
|
||||
|
||||
static void kgsl_meminfo_adjust_shmem(void *data, unsigned long *sharedram)
|
||||
{
|
||||
long nr_shmem_pages = atomic_long_read(&kgsl_nr_shmem);
|
||||
|
||||
if (nr_shmem_pages < 0)
|
||||
nr_shmem_pages = 0;
|
||||
|
||||
if (*sharedram >= (unsigned long)nr_shmem_pages)
|
||||
*sharedram -= nr_shmem_pages;
|
||||
else
|
||||
*sharedram = 0;
|
||||
}
|
||||
|
||||
int kgsl_device_platform_probe(struct kgsl_device *device)
|
||||
{
|
||||
struct platform_device *pdev = device->pdev;
|
||||
@@ -5246,6 +5323,13 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
|
||||
/* Set up the GPU events for the device */
|
||||
kgsl_device_events_probe(device);
|
||||
|
||||
register_trace_android_vh_shmem_mod_shmem(kgsl_count_shmem, NULL);
|
||||
register_trace_android_vh_shmem_mod_swapped(kgsl_count_swapped, NULL);
|
||||
register_trace_android_vh_show_mem(kgsl_show_mem, NULL);
|
||||
register_trace_android_vh_meminfo_proc_show(kgsl_meminfo, NULL);
|
||||
register_trace_android_vh_meminfo_cache_adjust(kgsl_cache_adjust, NULL);
|
||||
register_trace_android_vh_si_meminfo_adjust_shmem(kgsl_meminfo_adjust_shmem, NULL);
|
||||
|
||||
/* Initialize common sysfs entries */
|
||||
kgsl_pwrctrl_init_sysfs(device);
|
||||
kgsl_mmu_sysfs_init(&device->mmu);
|
||||
@@ -5268,6 +5352,13 @@ error:
|
||||
|
||||
void kgsl_device_platform_remove(struct kgsl_device *device)
|
||||
{
|
||||
unregister_trace_android_vh_shmem_mod_shmem(kgsl_count_shmem, NULL);
|
||||
unregister_trace_android_vh_shmem_mod_swapped(kgsl_count_swapped, NULL);
|
||||
unregister_trace_android_vh_show_mem(kgsl_show_mem, NULL);
|
||||
unregister_trace_android_vh_meminfo_proc_show(kgsl_meminfo, NULL);
|
||||
unregister_trace_android_vh_meminfo_cache_adjust(kgsl_cache_adjust, NULL);
|
||||
unregister_trace_android_vh_si_meminfo_adjust_shmem(kgsl_meminfo_adjust_shmem, NULL);
|
||||
|
||||
del_timer(&device->work_period_timer);
|
||||
|
||||
kthread_destroy_worker(device->events_worker);
|
||||
@@ -5292,6 +5383,16 @@ void kgsl_core_exit(void)
|
||||
kgsl_exit_page_pools();
|
||||
kgsl_eventlog_exit();
|
||||
|
||||
if (kgsl_driver.highprio_workqueue) {
|
||||
destroy_workqueue(kgsl_driver.highprio_workqueue);
|
||||
kgsl_driver.highprio_workqueue = NULL;
|
||||
}
|
||||
|
||||
if (kgsl_driver.normprio_workqueue) {
|
||||
destroy_workqueue(kgsl_driver.normprio_workqueue);
|
||||
kgsl_driver.normprio_workqueue = NULL;
|
||||
}
|
||||
|
||||
if (kgsl_driver.workqueue) {
|
||||
destroy_workqueue(kgsl_driver.workqueue);
|
||||
kgsl_driver.workqueue = NULL;
|
||||
@@ -5332,11 +5433,33 @@ void kgsl_core_exit(void)
|
||||
sysstats_unregister_kgsl_stats_cb();
|
||||
}
|
||||
|
||||
#define RECLAIM_CPUMASK 0x3Fu
|
||||
|
||||
static int kgsl_workqueue_setup_cpumask(struct workqueue_struct *wq,
|
||||
unsigned int setcpu)
|
||||
{
|
||||
struct workqueue_attrs *attrs;
|
||||
int i, err;
|
||||
|
||||
attrs = alloc_workqueue_attrs();
|
||||
if (!attrs)
|
||||
return -ENOMEM;
|
||||
|
||||
cpumask_clear(attrs->cpumask);
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (setcpu & (1 << i))
|
||||
cpumask_set_cpu(i, attrs->cpumask);
|
||||
|
||||
err = apply_workqueue_attrs(wq, attrs);
|
||||
free_workqueue_attrs(attrs);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int __init kgsl_core_init(void)
|
||||
{
|
||||
static u64 dma_mask = (u64)DMA_BIT_MASK(64);
|
||||
static struct device_dma_parameters dma_parms;
|
||||
int result = 0;
|
||||
int ret;
|
||||
|
||||
KGSL_BOOT_MARKER("KGSL Init");
|
||||
|
||||
@@ -5386,13 +5509,6 @@ int __init kgsl_core_init(void)
|
||||
goto err;
|
||||
}
|
||||
|
||||
kgsl_driver.virtdev.dma_mask = &dma_mask;
|
||||
kgsl_driver.virtdev.dma_parms = &dma_parms;
|
||||
|
||||
dma_set_max_seg_size(&kgsl_driver.virtdev, (u32)DMA_BIT_MASK(32));
|
||||
|
||||
set_dma_ops(&kgsl_driver.virtdev, NULL);
|
||||
|
||||
/* Make kobjects in the virtual device for storing statistics */
|
||||
|
||||
kgsl_driver.ptkobj =
|
||||
@@ -5418,6 +5534,38 @@ int __init kgsl_core_init(void)
|
||||
|
||||
INIT_LIST_HEAD(&kgsl_driver.wp_list);
|
||||
|
||||
kgsl_driver.highprio_workqueue = alloc_workqueue("kgsl-highprio-workqueue",
|
||||
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS | WQ_HIGHPRI, 0);
|
||||
|
||||
if (!kgsl_driver.highprio_workqueue) {
|
||||
pr_err("kgsl: Failed to allocate kgsl highprio workqueue\n");
|
||||
result = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = kgsl_workqueue_setup_cpumask(kgsl_driver.highprio_workqueue,
|
||||
RECLAIM_CPUMASK);
|
||||
if (ret) {
|
||||
pr_err("kgsl: Failed to setup highprio cpumasks ret %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
kgsl_driver.normprio_workqueue = alloc_workqueue("kgsl-normprio-workqueue",
|
||||
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
|
||||
|
||||
if (!kgsl_driver.normprio_workqueue) {
|
||||
pr_err("kgsl: Failed to allocate kgsl normprio workqueue\n");
|
||||
result = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = kgsl_workqueue_setup_cpumask(kgsl_driver.normprio_workqueue,
|
||||
RECLAIM_CPUMASK);
|
||||
if (ret) {
|
||||
pr_err("kgsl: Failed to setup normprio cpumasks ret %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
kgsl_driver.workqueue = alloc_workqueue("kgsl-workqueue",
|
||||
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
|
||||
|
||||
|
Reference in New Issue
Block a user