Commit ba9086a6 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'amd-drm-fixes-5.9-2020-08-20' of...

Merge tag 'amd-drm-fixes-5.9-2020-08-20' of git://people.freedesktop.org/~agd5f/linux into drm-fixes

amd-drm-fixes-5.9-2020-08-20:

amdgpu:
- Fixes for Navy Flounder
- Misc display fixes
- RAS fix

amdkfd:
- SDMA fix for renoir
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200820041938.3928-1-alexander.deucher@amd.com
parents 485d41b0 da2446b6
...@@ -195,19 +195,32 @@ static uint32_t get_sdma_rlc_reg_offset(struct amdgpu_device *adev, ...@@ -195,19 +195,32 @@ static uint32_t get_sdma_rlc_reg_offset(struct amdgpu_device *adev,
unsigned int engine_id, unsigned int engine_id,
unsigned int queue_id) unsigned int queue_id)
{ {
uint32_t sdma_engine_reg_base[2] = { uint32_t sdma_engine_reg_base = 0;
SOC15_REG_OFFSET(SDMA0, 0, uint32_t sdma_rlc_reg_offset;
mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL,
SOC15_REG_OFFSET(SDMA1, 0, switch (engine_id) {
mmSDMA1_RLC0_RB_CNTL) - mmSDMA1_RLC0_RB_CNTL default:
}; dev_warn(adev->dev,
uint32_t retval = sdma_engine_reg_base[engine_id] "Invalid sdma engine id (%d), using engine id 0\n",
engine_id);
fallthrough;
case 0:
sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0,
mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;
break;
case 1:
sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA1, 0,
mmSDMA1_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;
break;
}
sdma_rlc_reg_offset = sdma_engine_reg_base
+ queue_id * (mmSDMA0_RLC1_RB_CNTL - mmSDMA0_RLC0_RB_CNTL); + queue_id * (mmSDMA0_RLC1_RB_CNTL - mmSDMA0_RLC0_RB_CNTL);
pr_debug("RLC register offset for SDMA%d RLC%d: 0x%x\n", engine_id, pr_debug("RLC register offset for SDMA%d RLC%d: 0x%x\n", engine_id,
queue_id, retval); queue_id, sdma_rlc_reg_offset);
return retval; return sdma_rlc_reg_offset;
} }
static inline struct v9_mqd *get_mqd(void *mqd) static inline struct v9_mqd *get_mqd(void *mqd)
......
...@@ -1243,7 +1243,6 @@ void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev, ...@@ -1243,7 +1243,6 @@ void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
if (!obj || !obj->ent) if (!obj || !obj->ent)
return; return;
debugfs_remove(obj->ent);
obj->ent = NULL; obj->ent = NULL;
put_obj(obj); put_obj(obj);
} }
...@@ -1257,7 +1256,6 @@ static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev) ...@@ -1257,7 +1256,6 @@ static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
amdgpu_ras_debugfs_remove(adev, &obj->head); amdgpu_ras_debugfs_remove(adev, &obj->head);
} }
debugfs_remove_recursive(con->dir);
con->dir = NULL; con->dir = NULL;
} }
/* debugfs end */ /* debugfs end */
......
...@@ -179,12 +179,11 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) ...@@ -179,12 +179,11 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
} }
break; break;
case CHIP_SIENNA_CICHLID: case CHIP_SIENNA_CICHLID:
case CHIP_NAVY_FLOUNDER:
err = psp_init_ta_microcode(&adev->psp, chip_name); err = psp_init_ta_microcode(&adev->psp, chip_name);
if (err) if (err)
return err; return err;
break; break;
case CHIP_NAVY_FLOUNDER:
break;
default: default:
BUG(); BUG();
} }
......
...@@ -1108,6 +1108,18 @@ static enum bp_result bios_parser_enable_disp_power_gating( ...@@ -1108,6 +1108,18 @@ static enum bp_result bios_parser_enable_disp_power_gating(
action); action);
} }
static enum bp_result bios_parser_enable_lvtma_control(
struct dc_bios *dcb,
uint8_t uc_pwr_on)
{
struct bios_parser *bp = BP_FROM_DCB(dcb);
if (!bp->cmd_tbl.enable_lvtma_control)
return BP_RESULT_FAILURE;
return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on);
}
static bool bios_parser_is_accelerated_mode( static bool bios_parser_is_accelerated_mode(
struct dc_bios *dcb) struct dc_bios *dcb)
{ {
...@@ -2208,7 +2220,9 @@ static const struct dc_vbios_funcs vbios_funcs = { ...@@ -2208,7 +2220,9 @@ static const struct dc_vbios_funcs vbios_funcs = {
.get_board_layout_info = bios_get_board_layout_info, .get_board_layout_info = bios_get_board_layout_info,
.pack_data_tables = bios_parser_pack_data_tables, .pack_data_tables = bios_parser_pack_data_tables,
.get_atom_dc_golden_table = bios_get_atom_dc_golden_table .get_atom_dc_golden_table = bios_get_atom_dc_golden_table,
.enable_lvtma_control = bios_parser_enable_lvtma_control
}; };
static bool bios_parser2_construct( static bool bios_parser2_construct(
......
...@@ -904,6 +904,33 @@ static unsigned int get_smu_clock_info_v3_1(struct bios_parser *bp, uint8_t id) ...@@ -904,6 +904,33 @@ static unsigned int get_smu_clock_info_v3_1(struct bios_parser *bp, uint8_t id)
return 0; return 0;
} }
/******************************************************************************
******************************************************************************
**
** LVTMA CONTROL
**
******************************************************************************
*****************************************************************************/
static enum bp_result enable_lvtma_control(
struct bios_parser *bp,
uint8_t uc_pwr_on);
static void init_enable_lvtma_control(struct bios_parser *bp)
{
/* TODO add switch for table vrsion */
bp->cmd_tbl.enable_lvtma_control = enable_lvtma_control;
}
static enum bp_result enable_lvtma_control(
struct bios_parser *bp,
uint8_t uc_pwr_on)
{
enum bp_result result = BP_RESULT_FAILURE;
return result;
}
void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp) void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp)
{ {
init_dig_encoder_control(bp); init_dig_encoder_control(bp);
...@@ -919,4 +946,5 @@ void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp) ...@@ -919,4 +946,5 @@ void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp)
init_set_dce_clock(bp); init_set_dce_clock(bp);
init_get_smu_clock_info(bp); init_get_smu_clock_info(bp);
init_enable_lvtma_control(bp);
} }
...@@ -94,7 +94,8 @@ struct cmd_tbl { ...@@ -94,7 +94,8 @@ struct cmd_tbl {
struct bp_set_dce_clock_parameters *bp_params); struct bp_set_dce_clock_parameters *bp_params);
unsigned int (*get_smu_clock_info)( unsigned int (*get_smu_clock_info)(
struct bios_parser *bp, uint8_t id); struct bios_parser *bp, uint8_t id);
enum bp_result (*enable_lvtma_control)(struct bios_parser *bp,
uint8_t uc_pwr_on);
}; };
void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp); void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp);
......
...@@ -136,6 +136,10 @@ struct dc_vbios_funcs { ...@@ -136,6 +136,10 @@ struct dc_vbios_funcs {
enum bp_result (*get_atom_dc_golden_table)( enum bp_result (*get_atom_dc_golden_table)(
struct dc_bios *dcb); struct dc_bios *dcb);
enum bp_result (*enable_lvtma_control)(
struct dc_bios *bios,
uint8_t uc_pwr_on);
}; };
struct bios_registers { struct bios_registers {
......
...@@ -842,6 +842,17 @@ void dce110_edp_power_control( ...@@ -842,6 +842,17 @@ void dce110_edp_power_control(
cntl.coherent = false; cntl.coherent = false;
cntl.lanes_number = LANE_COUNT_FOUR; cntl.lanes_number = LANE_COUNT_FOUR;
cntl.hpd_sel = link->link_enc->hpd_source; cntl.hpd_sel = link->link_enc->hpd_source;
if (ctx->dc->ctx->dmub_srv &&
ctx->dc->debug.dmub_command_table) {
if (cntl.action == TRANSMITTER_CONTROL_POWER_ON)
bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_POWER_ON);
else
bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_POWER_OFF);
}
bp_result = link_transmitter_control(ctx->dc_bios, &cntl); bp_result = link_transmitter_control(ctx->dc_bios, &cntl);
if (!power_up) if (!power_up)
...@@ -919,8 +930,21 @@ void dce110_edp_backlight_control( ...@@ -919,8 +930,21 @@ void dce110_edp_backlight_control(
/*edp 1.2*/ /*edp 1.2*/
if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON) if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON)
edp_receiver_ready_T7(link); edp_receiver_ready_T7(link);
if (ctx->dc->ctx->dmub_srv &&
ctx->dc->debug.dmub_command_table) {
if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON)
ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_LCD_BLON);
else
ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_LCD_BLOFF);
}
link_transmitter_control(ctx->dc_bios, &cntl); link_transmitter_control(ctx->dc_bios, &cntl);
if (enable && link->dpcd_sink_ext_caps.bits.oled) if (enable && link->dpcd_sink_ext_caps.bits.oled)
msleep(OLED_POST_T7_DELAY); msleep(OLED_POST_T7_DELAY);
......
...@@ -1457,8 +1457,8 @@ static void dcn20_update_dchubp_dpp( ...@@ -1457,8 +1457,8 @@ static void dcn20_update_dchubp_dpp(
/* Any updates are handled in dc interface, just need to apply existing for plane enable */ /* Any updates are handled in dc interface, just need to apply existing for plane enable */
if ((pipe_ctx->update_flags.bits.enable || pipe_ctx->update_flags.bits.opp_changed || if ((pipe_ctx->update_flags.bits.enable || pipe_ctx->update_flags.bits.opp_changed ||
pipe_ctx->update_flags.bits.scaler || pipe_ctx->update_flags.bits.viewport) pipe_ctx->update_flags.bits.scaler || viewport_changed == true) &&
&& pipe_ctx->stream->cursor_attributes.address.quad_part != 0) { pipe_ctx->stream->cursor_attributes.address.quad_part != 0) {
dc->hwss.set_cursor_position(pipe_ctx); dc->hwss.set_cursor_position(pipe_ctx);
dc->hwss.set_cursor_attribute(pipe_ctx); dc->hwss.set_cursor_attribute(pipe_ctx);
......
...@@ -167,7 +167,9 @@ ...@@ -167,7 +167,9 @@
LE_SF(DCIO_SOFT_RESET, UNIPHYB_SOFT_RESET, mask_sh),\ LE_SF(DCIO_SOFT_RESET, UNIPHYB_SOFT_RESET, mask_sh),\
LE_SF(DCIO_SOFT_RESET, UNIPHYC_SOFT_RESET, mask_sh),\ LE_SF(DCIO_SOFT_RESET, UNIPHYC_SOFT_RESET, mask_sh),\
LE_SF(DCIO_SOFT_RESET, UNIPHYD_SOFT_RESET, mask_sh),\ LE_SF(DCIO_SOFT_RESET, UNIPHYD_SOFT_RESET, mask_sh),\
LE_SF(DCIO_SOFT_RESET, UNIPHYE_SOFT_RESET, mask_sh) LE_SF(DCIO_SOFT_RESET, UNIPHYE_SOFT_RESET, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, mask_sh)
#define LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh)\ #define LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh)\
LINK_ENCODER_MASK_SH_LIST_DCN10(mask_sh),\ LINK_ENCODER_MASK_SH_LIST_DCN10(mask_sh),\
......
...@@ -61,7 +61,10 @@ ...@@ -61,7 +61,10 @@
DPCS_DCN2_MASK_SH_LIST(mask_sh),\ DPCS_DCN2_MASK_SH_LIST(mask_sh),\
LE_SF(DPCSTX0_DPCSTX_TX_CNTL, DPCS_TX_DATA_ORDER_INVERT_18_BIT, mask_sh),\ LE_SF(DPCSTX0_DPCSTX_TX_CNTL, DPCS_TX_DATA_ORDER_INVERT_18_BIT, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL0, RDPCS_PHY_TX_VBOOST_LVL, mask_sh),\ LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL0, RDPCS_PHY_TX_VBOOST_LVL, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_CLOCK_CNTL, RDPCS_TX_CLK_EN, mask_sh) LE_SF(RDPCSTX0_RDPCSTX_CLOCK_CNTL, RDPCS_TX_CLK_EN, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, mask_sh)
void dcn30_link_encoder_construct( void dcn30_link_encoder_construct(
struct dcn20_link_encoder *enc20, struct dcn20_link_encoder *enc20,
......
...@@ -491,6 +491,7 @@ static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = { ...@@ -491,6 +491,7 @@ static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
[id] = {\ [id] = {\
LE_DCN3_REG_LIST(id), \ LE_DCN3_REG_LIST(id), \
UNIPHY_DCN2_REG_LIST(phyid), \ UNIPHY_DCN2_REG_LIST(phyid), \
SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
} }
static const struct dce110_aux_registers_shift aux_shift = { static const struct dce110_aux_registers_shift aux_shift = {
......
...@@ -63,6 +63,7 @@ typedef struct { ...@@ -63,6 +63,7 @@ typedef struct {
#define BPP_INVALID 0 #define BPP_INVALID 0
#define BPP_BLENDED_PIPE 0xffffffff #define BPP_BLENDED_PIPE 0xffffffff
#define DCN30_MAX_DSC_IMAGE_WIDTH 5184
static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib); static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib);
static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation( static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
...@@ -3984,6 +3985,9 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l ...@@ -3984,6 +3985,9 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
} else if (v->PlaneRequiredDISPCLKWithoutODMCombine > v->MaxDispclkRoundedDownToDFSGranularity) { } else if (v->PlaneRequiredDISPCLKWithoutODMCombine > v->MaxDispclkRoundedDownToDFSGranularity) {
v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1; v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;
v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1; v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;
} else if (v->DSCEnabled[k] && (v->HActive[k] > DCN30_MAX_DSC_IMAGE_WIDTH)) {
v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;
v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;
} else { } else {
v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_disabled; v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_disabled;
v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithoutODMCombine; v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithoutODMCombine;
......
...@@ -101,6 +101,13 @@ enum bp_pipe_control_action { ...@@ -101,6 +101,13 @@ enum bp_pipe_control_action {
ASIC_PIPE_INIT ASIC_PIPE_INIT
}; };
enum bp_lvtma_control_action {
LVTMA_CONTROL_LCD_BLOFF = 2,
LVTMA_CONTROL_LCD_BLON = 3,
LVTMA_CONTROL_POWER_ON = 12,
LVTMA_CONTROL_POWER_OFF = 13
};
struct bp_encoder_control { struct bp_encoder_control {
enum bp_encoder_control_action action; enum bp_encoder_control_action action;
enum engine_id engine_id; enum engine_id engine_id;
......
...@@ -431,6 +431,9 @@ struct fixed31_32 dc_fixpt_log(struct fixed31_32 arg); ...@@ -431,6 +431,9 @@ struct fixed31_32 dc_fixpt_log(struct fixed31_32 arg);
*/ */
static inline struct fixed31_32 dc_fixpt_pow(struct fixed31_32 arg1, struct fixed31_32 arg2) static inline struct fixed31_32 dc_fixpt_pow(struct fixed31_32 arg1, struct fixed31_32 arg2)
{ {
if (arg1.value == 0)
return arg2.value == 0 ? dc_fixpt_one : dc_fixpt_zero;
return dc_fixpt_exp( return dc_fixpt_exp(
dc_fixpt_mul( dc_fixpt_mul(
dc_fixpt_log(arg1), dc_fixpt_log(arg1),
......
...@@ -2204,14 +2204,17 @@ static const struct throttling_logging_label { ...@@ -2204,14 +2204,17 @@ static const struct throttling_logging_label {
}; };
static void arcturus_log_thermal_throttling_event(struct smu_context *smu) static void arcturus_log_thermal_throttling_event(struct smu_context *smu)
{ {
int ret;
int throttler_idx, throtting_events = 0, buf_idx = 0; int throttler_idx, throtting_events = 0, buf_idx = 0;
struct amdgpu_device *adev = smu->adev; struct amdgpu_device *adev = smu->adev;
uint32_t throttler_status; uint32_t throttler_status;
char log_buf[256]; char log_buf[256];
arcturus_get_smu_metrics_data(smu, ret = arcturus_get_smu_metrics_data(smu,
METRICS_THROTTLER_STATUS, METRICS_THROTTLER_STATUS,
&throttler_status); &throttler_status);
if (ret)
return;
memset(log_buf, 0, sizeof(log_buf)); memset(log_buf, 0, sizeof(log_buf));
for (throttler_idx = 0; throttler_idx < ARRAY_SIZE(logging_label); for (throttler_idx = 0; throttler_idx < ARRAY_SIZE(logging_label);
......
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