Commit 16012806 authored by Wyatt Wood's avatar Wyatt Wood Committed by Alex Deucher

drm/amd/display: Add ABM driver implementation

[Why]
Moving ABM from DMCU to DMCUB.

[How]
Add ABM driver files and implementation.
Signed-off-by: default avatarWyatt Wood <wyatt.wood@amd.com>
Reviewed-by: default avatarNicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 46484870
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
DCE = dce_audio.o dce_stream_encoder.o dce_link_encoder.o dce_hwseq.o \ DCE = dce_audio.o dce_stream_encoder.o dce_link_encoder.o dce_hwseq.o \
dce_mem_input.o dce_clock_source.o dce_scl_filters.o dce_transform.o \ dce_mem_input.o dce_clock_source.o dce_scl_filters.o dce_transform.o \
dce_opp.o dce_dmcu.o dce_abm.o dce_ipp.o dce_aux.o \ dce_opp.o dce_dmcu.o dce_abm.o dce_ipp.o dce_aux.o \
dce_i2c.o dce_i2c_hw.o dce_i2c_sw.o dmub_psr.o dce_i2c.o dce_i2c_hw.o dce_i2c_sw.o dmub_psr.o dmub_abm.o
AMD_DAL_DCE = $(addprefix $(AMDDALPATH)/dc/dce/,$(DCE)) AMD_DAL_DCE = $(addprefix $(AMDDALPATH)/dc/dce/,$(DCE))
......
...@@ -447,6 +447,7 @@ static const struct abm_funcs dce_funcs = { ...@@ -447,6 +447,7 @@ static const struct abm_funcs dce_funcs = {
.set_backlight_level_pwm = dce_abm_set_backlight_level_pwm, .set_backlight_level_pwm = dce_abm_set_backlight_level_pwm,
.get_current_backlight = dce_abm_get_current_backlight, .get_current_backlight = dce_abm_get_current_backlight,
.get_target_backlight = dce_abm_get_target_backlight, .get_target_backlight = dce_abm_get_target_backlight,
.load_abm_config = NULL,
.set_abm_immediate_disable = dce_abm_immediate_disable .set_abm_immediate_disable = dce_abm_immediate_disable
}; };
......
This diff is collapsed.
/*
* Copyright 2019 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
*
*/
#ifndef __DMUB_ABM_H__
#define __DMUB_ABM_H__
#include "abm.h"
#include "dce_abm.h"
struct abm *dmub_abm_create(
struct dc_context *ctx,
const struct dce_abm_registers *regs,
const struct dce_abm_shift *abm_shift,
const struct dce_abm_mask *abm_mask);
void dmub_abm_destroy(struct abm **abm);
#endif
...@@ -85,6 +85,7 @@ ...@@ -85,6 +85,7 @@
#include "vm_helper.h" #include "vm_helper.h"
#include "dcn20/dcn20_vmid.h" #include "dcn20/dcn20_vmid.h"
#include "dce/dmub_psr.h" #include "dce/dmub_psr.h"
#include "dce/dmub_abm.h"
#define SOC_BOUNDING_BOX_VALID false #define SOC_BOUNDING_BOX_VALID false
#define DC_LOGGER_INIT(logger) #define DC_LOGGER_INIT(logger)
...@@ -991,9 +992,12 @@ static void dcn21_resource_destruct(struct dcn21_resource_pool *pool) ...@@ -991,9 +992,12 @@ static void dcn21_resource_destruct(struct dcn21_resource_pool *pool)
pool->base.dp_clock_source = NULL; pool->base.dp_clock_source = NULL;
} }
if (pool->base.abm != NULL) {
if (pool->base.abm != NULL) if (pool->base.abm->ctx->dc->debug.disable_dmcu)
dmub_abm_destroy(&pool->base.abm);
else
dce_abm_destroy(&pool->base.abm); dce_abm_destroy(&pool->base.abm);
}
if (pool->base.dmcu != NULL) if (pool->base.dmcu != NULL)
dce_dmcu_destroy(&pool->base.dmcu); dce_dmcu_destroy(&pool->base.dmcu);
...@@ -1842,6 +1846,7 @@ static bool dcn21_resource_construct( ...@@ -1842,6 +1846,7 @@ static bool dcn21_resource_construct(
goto create_fail; goto create_fail;
} }
if (!dc->debug.disable_dmcu) {
pool->base.dmcu = dcn21_dmcu_create(ctx, pool->base.dmcu = dcn21_dmcu_create(ctx,
&dmcu_regs, &dmcu_regs,
&dmcu_shift, &dmcu_shift,
...@@ -1851,6 +1856,7 @@ static bool dcn21_resource_construct( ...@@ -1851,6 +1856,7 @@ static bool dcn21_resource_construct(
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
goto create_fail; goto create_fail;
} }
}
if (dc->debug.disable_dmcu) { if (dc->debug.disable_dmcu) {
pool->base.psr = dmub_psr_create(ctx); pool->base.psr = dmub_psr_create(ctx);
...@@ -1862,15 +1868,16 @@ static bool dcn21_resource_construct( ...@@ -1862,15 +1868,16 @@ static bool dcn21_resource_construct(
} }
} }
if (dc->debug.disable_dmcu)
pool->base.abm = dmub_abm_create(ctx,
&abm_regs,
&abm_shift,
&abm_mask);
else
pool->base.abm = dce_abm_create(ctx, pool->base.abm = dce_abm_create(ctx,
&abm_regs, &abm_regs,
&abm_shift, &abm_shift,
&abm_mask); &abm_mask);
if (pool->base.abm == NULL) {
dm_error("DC: failed to create abm!\n");
BREAK_TO_DEBUGGER();
goto create_fail;
}
pool->base.pp_smu = dcn21_pp_smu_create(ctx); pool->base.pp_smu = dcn21_pp_smu_create(ctx);
......
...@@ -60,6 +60,10 @@ struct abm_funcs { ...@@ -60,6 +60,10 @@ struct abm_funcs {
unsigned int (*get_current_backlight)(struct abm *abm); unsigned int (*get_current_backlight)(struct abm *abm);
unsigned int (*get_target_backlight)(struct abm *abm); unsigned int (*get_target_backlight)(struct abm *abm);
bool (*load_abm_config)(struct abm *abm,
unsigned int start_offset,
const char *src,
unsigned int bytes);
}; };
#endif #endif
...@@ -303,6 +303,16 @@ struct dmub_rb_cmd_abm_set_pwm_frac { ...@@ -303,6 +303,16 @@ struct dmub_rb_cmd_abm_set_pwm_frac {
struct dmub_cmd_abm_set_pwm_frac_data abm_set_pwm_frac_data; struct dmub_cmd_abm_set_pwm_frac_data abm_set_pwm_frac_data;
}; };
struct dmub_cmd_abm_init_config_data {
union dmub_addr src;
uint16_t bytes;
};
struct dmub_rb_cmd_abm_init_config {
struct dmub_cmd_header header;
struct dmub_cmd_abm_init_config_data abm_init_config_data;
};
union dmub_rb_cmd { union dmub_rb_cmd {
struct dmub_rb_cmd_read_modify_write read_modify_write; struct dmub_rb_cmd_read_modify_write read_modify_write;
struct dmub_rb_cmd_reg_field_update_sequence reg_field_update_seq; struct dmub_rb_cmd_reg_field_update_sequence reg_field_update_seq;
...@@ -324,6 +334,7 @@ union dmub_rb_cmd { ...@@ -324,6 +334,7 @@ union dmub_rb_cmd {
struct dmub_rb_cmd_abm_set_level abm_set_level; struct dmub_rb_cmd_abm_set_level abm_set_level;
struct dmub_rb_cmd_abm_set_ambient_level abm_set_ambient_level; struct dmub_rb_cmd_abm_set_ambient_level abm_set_ambient_level;
struct dmub_rb_cmd_abm_set_pwm_frac abm_set_pwm_frac; struct dmub_rb_cmd_abm_set_pwm_frac abm_set_pwm_frac;
struct dmub_rb_cmd_abm_init_config abm_init_config;
}; };
#pragma pack(pop) #pragma pack(pop)
......
...@@ -24,6 +24,9 @@ ...@@ -24,6 +24,9 @@
#include "power_helpers.h" #include "power_helpers.h"
#include "dc/inc/hw/dmcu.h" #include "dc/inc/hw/dmcu.h"
#include "dc/inc/hw/abm.h"
#include "dc.h"
#include "core_types.h"
#define DIV_ROUNDUP(a, b) (((a)+((b)/2))/(b)) #define DIV_ROUNDUP(a, b) (((a)+((b)/2))/(b))
...@@ -653,16 +656,24 @@ bool dmcu_load_iram(struct dmcu *dmcu, ...@@ -653,16 +656,24 @@ bool dmcu_load_iram(struct dmcu *dmcu,
{ {
unsigned char ram_table[IRAM_SIZE]; unsigned char ram_table[IRAM_SIZE];
bool result = false; bool result = false;
struct abm *abm = dmcu->ctx->dc->res_pool->abm;
if (dmcu == NULL) if (dmcu == NULL && abm == NULL)
return false; return false;
if (!dmcu->funcs->is_dmcu_initialized(dmcu)) if (dmcu && !dmcu->funcs->is_dmcu_initialized(dmcu))
return true; return true;
memset(&ram_table, 0, sizeof(ram_table)); memset(&ram_table, 0, sizeof(ram_table));
if (dmcu->dmcu_version.abm_version == 0x24) { // In the case where abm is implemented on dmcub,
// dmcu object will be null.
// ABM 2.4 and up are implemented on dmcub
if (dmcu == NULL) {
fill_iram_v_2_3((struct iram_table_v_2_2 *)ram_table, params);
result = abm->funcs->load_abm_config(
abm, 0, (char *)(&ram_table), IRAM_RESERVE_AREA_START_V2_2);
} else if (dmcu->dmcu_version.abm_version == 0x24) {
fill_iram_v_2_3((struct iram_table_v_2_2 *)ram_table, params); fill_iram_v_2_3((struct iram_table_v_2_2 *)ram_table, params);
result = dmcu->funcs->load_iram( result = dmcu->funcs->load_iram(
dmcu, 0, (char *)(&ram_table), IRAM_RESERVE_AREA_START_V2_2); dmcu, 0, (char *)(&ram_table), IRAM_RESERVE_AREA_START_V2_2);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment