Merge tag 'drm-next-2019-09-27' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Dave Airlie: "Fixes built up over the past 1.5 weeks or so, it's two weeks of amdgpu, some core cleanups and some panfrost fixes. I also finally figured out why my desktop was slow to do a bunch of stuff (someone gave it an IPv6 address which can't reach anything!). core: - Some cleanups and fixes in the self-refresh helpers - Some cleanups and fixes in the atomic helpers amdgpu: - Fix a 64 bit divide - Prevent a memory leak in a failure case in dc - Load proper gfx firmware on navi14 variants - Add more navi12 and navi14 PCI ids - Misc fixes for renoir - Fix bandwidth issues with multiple displays on vega20 - Support for Dali - Fix a possible oops with KFD on hawaii - Fix for backlight level after resume on some APUs - Other misc fixes panfrost: - Multiple panfrost fixes for regulator support and page fault handling" * tag 'drm-next-2019-09-27' of git://anongit.freedesktop.org/drm/drm: (34 commits) drm/amd/display: prevent memory leak drm/amdgpu/gfx10: add support for wks firmware loading drm/amdgpu/display: include slab.h in dcn21_resource.c drm/amdgpu/display: fix 64 bit divide drm/panfrost: Prevent race when handling page fault drm/panfrost: Remove NULL checks for regulator drm/panfrost: Fix regulator_get_optional() misuse drm: Measure Self Refresh Entry/Exit times to avoid thrashing drm: Fix kerneldoc and remove unused struct member in self_refresh helper drm/atomic: Rename crtc_state->pageflip_flags to async_flip drm/atomic: Reject FLIP_ASYNC unconditionally drm/atomic: Take the atomic toys away from X drm/amdgpu: flag navi12 and 14 as experimental for 5.4 drm/kms: Duct-tape for mode object lifetime checks drm/amdgpu: add navi12 pci id drm/amdgpu: add navi14 PCI ID for work station SKU drm/amdkfd: Swap trap temporary registers in gfx10 trap handler drm/amd/powerplay: implement sysfs for getting dpm clock drm/amd/display: Restore backlight brightness after system resume drm/amd/display: Implement voltage limitation for dali ...
This commit is contained in:
@@ -708,6 +708,10 @@ static void hack_bounding_box(struct dcn_bw_internal_vars *v,
|
||||
|
||||
unsigned int get_highest_allowed_voltage_level(uint32_t hw_internal_rev)
|
||||
{
|
||||
/* for dali, the highest voltage level we want is 0 */
|
||||
if (ASICREV_IS_DALI(hw_internal_rev))
|
||||
return 0;
|
||||
|
||||
/* we are ok with all levels */
|
||||
return 4;
|
||||
}
|
||||
|
@@ -98,11 +98,14 @@ uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context)
|
||||
struct dc_stream_state *stream = context->streams[j];
|
||||
uint32_t vertical_blank_in_pixels = 0;
|
||||
uint32_t vertical_blank_time = 0;
|
||||
uint32_t vertical_total_min = stream->timing.v_total;
|
||||
struct dc_crtc_timing_adjust adjust = stream->adjust;
|
||||
if (adjust.v_total_max != adjust.v_total_min)
|
||||
vertical_total_min = adjust.v_total_min;
|
||||
|
||||
vertical_blank_in_pixels = stream->timing.h_total *
|
||||
(stream->timing.v_total
|
||||
(vertical_total_min
|
||||
- stream->timing.v_addressable);
|
||||
|
||||
vertical_blank_time = vertical_blank_in_pixels
|
||||
* 10000 / stream->timing.pix_clk_100hz;
|
||||
|
||||
@@ -171,6 +174,10 @@ void dce11_pplib_apply_display_requirements(
|
||||
struct dc_state *context)
|
||||
{
|
||||
struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
|
||||
int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
|
||||
|
||||
if (dc->bw_vbios && dc->bw_vbios->memory_type == bw_def_hbm)
|
||||
memory_type_multiplier = MEMORY_TYPE_HBM;
|
||||
|
||||
pp_display_cfg->all_displays_in_sync =
|
||||
context->bw_ctx.bw.dce.all_displays_in_sync;
|
||||
@@ -183,8 +190,20 @@ void dce11_pplib_apply_display_requirements(
|
||||
pp_display_cfg->cpu_pstate_separation_time =
|
||||
context->bw_ctx.bw.dce.blackout_recovery_time_us;
|
||||
|
||||
pp_display_cfg->min_memory_clock_khz = context->bw_ctx.bw.dce.yclk_khz
|
||||
/ MEMORY_TYPE_MULTIPLIER_CZ;
|
||||
/*
|
||||
* TODO: determine whether the bandwidth has reached memory's limitation
|
||||
* , then change minimum memory clock based on real-time bandwidth
|
||||
* limitation.
|
||||
*/
|
||||
if (ASICREV_IS_VEGA20_P(dc->ctx->asic_id.hw_internal_rev) && (context->stream_count >= 2)) {
|
||||
pp_display_cfg->min_memory_clock_khz = max(pp_display_cfg->min_memory_clock_khz,
|
||||
(uint32_t) div64_s64(
|
||||
div64_s64(dc->bw_vbios->high_yclk.value,
|
||||
memory_type_multiplier), 10000));
|
||||
} else {
|
||||
pp_display_cfg->min_memory_clock_khz = context->bw_ctx.bw.dce.yclk_khz
|
||||
/ memory_type_multiplier;
|
||||
}
|
||||
|
||||
pp_display_cfg->min_engine_clock_khz = determine_sclk_from_bounding_box(
|
||||
dc,
|
||||
|
@@ -148,7 +148,7 @@ static void dce_mi_program_pte_vm(
|
||||
pte->min_pte_before_flip_horiz_scan;
|
||||
|
||||
REG_UPDATE(GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT,
|
||||
GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, 0xff);
|
||||
GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, 0x7f);
|
||||
|
||||
REG_UPDATE_3(DVMM_PTE_CONTROL,
|
||||
DVMM_PAGE_WIDTH, page_width,
|
||||
@@ -157,7 +157,7 @@ static void dce_mi_program_pte_vm(
|
||||
|
||||
REG_UPDATE_2(DVMM_PTE_ARB_CONTROL,
|
||||
DVMM_PTE_REQ_PER_CHUNK, pte->pte_req_per_chunk,
|
||||
DVMM_MAX_PTE_REQ_OUTSTANDING, 0xff);
|
||||
DVMM_MAX_PTE_REQ_OUTSTANDING, 0x7f);
|
||||
}
|
||||
|
||||
static void program_urgency_watermark(
|
||||
|
@@ -1091,6 +1091,7 @@ struct resource_pool *dce100_create_resource_pool(
|
||||
if (construct(num_virtual_links, dc, pool))
|
||||
return &pool->base;
|
||||
|
||||
kfree(pool);
|
||||
BREAK_TO_DEBUGGER();
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -1462,6 +1462,7 @@ struct resource_pool *dce110_create_resource_pool(
|
||||
if (construct(num_virtual_links, dc, pool, asic_id))
|
||||
return &pool->base;
|
||||
|
||||
kfree(pool);
|
||||
BREAK_TO_DEBUGGER();
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -987,6 +987,10 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
|
||||
struct dm_pp_clock_levels_with_latency mem_clks = {0};
|
||||
struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0};
|
||||
struct dm_pp_clock_levels clks = {0};
|
||||
int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
|
||||
|
||||
if (dc->bw_vbios && dc->bw_vbios->memory_type == bw_def_hbm)
|
||||
memory_type_multiplier = MEMORY_TYPE_HBM;
|
||||
|
||||
/*do system clock TODO PPLIB: after PPLIB implement,
|
||||
* then remove old way
|
||||
@@ -1026,12 +1030,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
|
||||
&clks);
|
||||
|
||||
dc->bw_vbios->low_yclk = bw_frc_to_fixed(
|
||||
clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
|
||||
clks.clocks_in_khz[0] * memory_type_multiplier, 1000);
|
||||
dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
|
||||
clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER_CZ,
|
||||
clks.clocks_in_khz[clks.num_levels>>1] * memory_type_multiplier,
|
||||
1000);
|
||||
dc->bw_vbios->high_yclk = bw_frc_to_fixed(
|
||||
clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER_CZ,
|
||||
clks.clocks_in_khz[clks.num_levels-1] * memory_type_multiplier,
|
||||
1000);
|
||||
|
||||
return;
|
||||
@@ -1067,12 +1071,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
|
||||
* YCLK = UMACLK*m_memoryTypeMultiplier
|
||||
*/
|
||||
dc->bw_vbios->low_yclk = bw_frc_to_fixed(
|
||||
mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
|
||||
mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000);
|
||||
dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
|
||||
mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
|
||||
mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier,
|
||||
1000);
|
||||
dc->bw_vbios->high_yclk = bw_frc_to_fixed(
|
||||
mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
|
||||
mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier,
|
||||
1000);
|
||||
|
||||
/* Now notify PPLib/SMU about which Watermarks sets they should select
|
||||
@@ -1338,6 +1342,7 @@ struct resource_pool *dce112_create_resource_pool(
|
||||
if (construct(num_virtual_links, dc, pool))
|
||||
return &pool->base;
|
||||
|
||||
kfree(pool);
|
||||
BREAK_TO_DEBUGGER();
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -847,6 +847,8 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
|
||||
int i;
|
||||
unsigned int clk;
|
||||
unsigned int latency;
|
||||
/*original logic in dal3*/
|
||||
int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
|
||||
|
||||
/*do system clock*/
|
||||
if (!dm_pp_get_clock_levels_by_type_with_latency(
|
||||
@@ -905,13 +907,16 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
|
||||
* ALSO always convert UMA clock (from PPLIB) to YCLK (HW formula):
|
||||
* YCLK = UMACLK*m_memoryTypeMultiplier
|
||||
*/
|
||||
if (dc->bw_vbios->memory_type == bw_def_hbm)
|
||||
memory_type_multiplier = MEMORY_TYPE_HBM;
|
||||
|
||||
dc->bw_vbios->low_yclk = bw_frc_to_fixed(
|
||||
mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
|
||||
mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000);
|
||||
dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
|
||||
mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
|
||||
mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier,
|
||||
1000);
|
||||
dc->bw_vbios->high_yclk = bw_frc_to_fixed(
|
||||
mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
|
||||
mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier,
|
||||
1000);
|
||||
|
||||
/* Now notify PPLib/SMU about which Watermarks sets they should select
|
||||
@@ -1203,6 +1208,7 @@ struct resource_pool *dce120_create_resource_pool(
|
||||
if (construct(num_virtual_links, dc, pool))
|
||||
return &pool->base;
|
||||
|
||||
kfree(pool);
|
||||
BREAK_TO_DEBUGGER();
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -1570,6 +1570,7 @@ struct resource_pool *dcn10_create_resource_pool(
|
||||
if (construct(init_data->num_virtual_links, dc, pool))
|
||||
return &pool->base;
|
||||
|
||||
kfree(pool);
|
||||
BREAK_TO_DEBUGGER();
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -23,6 +23,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "dm_services.h"
|
||||
#include "dc.h"
|
||||
|
||||
|
@@ -35,12 +35,10 @@
|
||||
|
||||
#include "hw_factory_dcn21.h"
|
||||
|
||||
|
||||
#include "dcn/dcn_2_1_0_offset.h"
|
||||
#include "dcn/dcn_2_1_0_sh_mask.h"
|
||||
#include "renoir_ip_offset.h"
|
||||
|
||||
|
||||
#include "reg_helper.h"
|
||||
#include "../hpd_regs.h"
|
||||
/* begin *********************
|
||||
@@ -136,6 +134,39 @@ static const struct ddc_sh_mask ddc_mask[] = {
|
||||
DDC_MASK_SH_LIST_DCN2(_MASK, 6)
|
||||
};
|
||||
|
||||
#include "../generic_regs.h"
|
||||
|
||||
/* set field name */
|
||||
#define SF_GENERIC(reg_name, field_name, post_fix)\
|
||||
.field_name = reg_name ## __ ## field_name ## post_fix
|
||||
|
||||
#define generic_regs(id) \
|
||||
{\
|
||||
GENERIC_REG_LIST(id)\
|
||||
}
|
||||
|
||||
static const struct generic_registers generic_regs[] = {
|
||||
generic_regs(A),
|
||||
};
|
||||
|
||||
static const struct generic_sh_mask generic_shift[] = {
|
||||
GENERIC_MASK_SH_LIST(__SHIFT, A),
|
||||
};
|
||||
|
||||
static const struct generic_sh_mask generic_mask[] = {
|
||||
GENERIC_MASK_SH_LIST(_MASK, A),
|
||||
};
|
||||
|
||||
static void define_generic_registers(struct hw_gpio_pin *pin, uint32_t en)
|
||||
{
|
||||
struct hw_generic *generic = HW_GENERIC_FROM_BASE(pin);
|
||||
|
||||
generic->regs = &generic_regs[en];
|
||||
generic->shifts = &generic_shift[en];
|
||||
generic->masks = &generic_mask[en];
|
||||
generic->base.regs = &generic_regs[en].gpio;
|
||||
}
|
||||
|
||||
static void define_ddc_registers(
|
||||
struct hw_gpio_pin *pin,
|
||||
uint32_t en)
|
||||
@@ -181,7 +212,8 @@ static const struct hw_factory_funcs funcs = {
|
||||
.get_hpd_pin = dal_hw_hpd_get_pin,
|
||||
.get_generic_pin = dal_hw_generic_get_pin,
|
||||
.define_hpd_registers = define_hpd_registers,
|
||||
.define_ddc_registers = define_ddc_registers
|
||||
.define_ddc_registers = define_ddc_registers,
|
||||
.define_generic_registers = define_generic_registers
|
||||
};
|
||||
/*
|
||||
* dal_hw_factory_dcn10_init
|
||||
|
@@ -58,7 +58,6 @@
|
||||
#define SF_HPD(reg_name, field_name, post_fix)\
|
||||
.field_name = reg_name ## __ ## field_name ## post_fix
|
||||
|
||||
|
||||
/* macros to expend register list macro defined in HW object header file
|
||||
* end *********************/
|
||||
|
||||
@@ -71,7 +70,7 @@ static bool offset_to_id(
|
||||
{
|
||||
switch (offset) {
|
||||
/* GENERIC */
|
||||
case REG(DC_GENERICA):
|
||||
case REG(DC_GPIO_GENERIC_A):
|
||||
*id = GPIO_ID_GENERIC;
|
||||
switch (mask) {
|
||||
case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK:
|
||||
|
@@ -31,6 +31,8 @@
|
||||
#include "dm_pp_smu.h"
|
||||
|
||||
#define MEMORY_TYPE_MULTIPLIER_CZ 4
|
||||
#define MEMORY_TYPE_HBM 2
|
||||
|
||||
|
||||
enum dce_version resource_parse_asic_id(
|
||||
struct hw_asic_id asic_id);
|
||||
|
Reference in New Issue
Block a user