Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179//SPDX-License-Identifier: MIT/* * Copyright 2015 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Authors: AMD * */
#include <linux/string.h>#include <linux/acpi.h>
#include <drm/drm_probe_helper.h>#include <drm/amdgpu_drm.h>#include "dm_services.h"#include "amdgpu.h"#include "amdgpu_dm.h"#include "amdgpu_dm_backlight.h"#include "amdgpu_dm_irq.h"#include "amdgpu_pm.h"#include "amdgpu_dm_trace.h"#include "dm_helpers.h"
#if IS_ENABLED(CONFIG_DRM_AMD_DC_KUNIT_TEST)static const struct amdgpu_dm_services_kunit_ops amdgpu_dm_services_default_ops = { .bo_create_kernel = amdgpu_bo_create_kernel, .bo_free_kernel = amdgpu_bo_free_kernel,};
static const struct amdgpu_dm_services_kunit_ops *amdgpu_dm_services_ops = &amdgpu_dm_services_default_ops;
void amdgpu_dm_services_kunit_set_ops(const struct amdgpu_dm_services_kunit_ops *ops){ amdgpu_dm_services_ops = ops ? ops : &amdgpu_dm_services_default_ops;}EXPORT_IF_KUNIT(amdgpu_dm_services_kunit_set_ops);
#define services_bo_create_kernel amdgpu_dm_services_ops->bo_create_kernel#define services_bo_free_kernel amdgpu_dm_services_ops->bo_free_kernel
#else
#define services_bo_create_kernel amdgpu_bo_create_kernel#define services_bo_free_kernel amdgpu_bo_free_kernel
#endif
unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx, unsigned long long current_time_stamp, unsigned long long last_time_stamp){ return current_time_stamp - last_time_stamp;}EXPORT_IF_KUNIT(dm_get_elapse_time_in_ns);
void dm_perf_trace_timestamp(const char *func_name, unsigned int line, struct dc_context *ctx){ trace_amdgpu_dc_performance(ctx->perf_trace->read_count, ctx->perf_trace->write_count, &ctx->perf_trace->last_entry_read, &ctx->perf_trace->last_entry_write, func_name, line);}EXPORT_IF_KUNIT(dm_perf_trace_timestamp);
void dm_trace_smu_enter(uint32_t msg_id, uint32_t param_in, unsigned int delay, struct dc_context *ctx){}EXPORT_IF_KUNIT(dm_trace_smu_enter);
void dm_trace_smu_exit(bool success, uint32_t response, struct dc_context *ctx){}EXPORT_IF_KUNIT(dm_trace_smu_exit);
/**** power component interfaces ****/
bool dm_query_extended_brightness_caps(struct dc_context *ctx, enum dm_acpi_display_type display, struct dm_acpi_atif_backlight_caps *pCaps){ struct amdgpu_device *adev; struct amdgpu_display_manager *dm; int bl_index = (display == AcpiDisplayType_LCD1) ? 0 : 1;
if (!ctx || !pCaps || !ctx->driver_context) return false;
adev = (struct amdgpu_device *)ctx->driver_context; dm = &adev->dm;
amdgpu_dm_update_backlight_caps(dm, bl_index);
pCaps->num_data_points = dm->backlight_caps[bl_index].data_points; pCaps->max_input_signal = dm->backlight_caps[bl_index].max_input_signal; pCaps->min_input_signal = dm->backlight_caps[bl_index].min_input_signal; pCaps->ac_level_percentage = dm->backlight_caps[bl_index].ac_level; pCaps->dc_level_percentage = dm->backlight_caps[bl_index].dc_level;
if (pCaps->num_data_points > 0) memcpy(pCaps->data_points, dm->backlight_caps[bl_index].luminance_data, sizeof(struct dm_bl_data_point) * pCaps->num_data_points); return true;}EXPORT_IF_KUNIT(dm_query_extended_brightness_caps);
void*dm_allocate_gpu_mem( struct amdgpu_device *adev, enum dc_gpu_mem_alloc_type type, size_t size, long long *addr){ struct dal_allocation *da; u32 domain = (type == DC_MEM_ALLOC_TYPE_GART) ? AMDGPU_GEM_DOMAIN_GTT : AMDGPU_GEM_DOMAIN_VRAM; int ret;
da = kzalloc_obj(*da); if (!da) return NULL;
ret = services_bo_create_kernel(adev, size, PAGE_SIZE, domain, &da->bo, &da->gpu_addr, &da->cpu_ptr);
*addr = da->gpu_addr;
if (ret) { kfree(da); return NULL; }
/* add da to list in dm */ list_add(&da->list, &adev->dm.da_list);
return da->cpu_ptr;}EXPORT_IF_KUNIT(dm_allocate_gpu_mem);
voiddm_free_gpu_mem( struct amdgpu_device *adev, enum dc_gpu_mem_alloc_type type, void *pvMem){ struct dal_allocation *da;
/* walk the da list in DM */ list_for_each_entry(da, &adev->dm.da_list, list) { if (pvMem == da->cpu_ptr) { services_bo_free_kernel(&da->bo, &da->gpu_addr, &da->cpu_ptr); list_del(&da->list); kfree(da); break; } }
}EXPORT_IF_KUNIT(dm_free_gpu_mem);