ati-4.6.7

git-svn-id: svn://kolibrios.org@7146 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2018-02-03 12:23:53 +00:00
parent ba018197c6
commit e9755d2ab6
61 changed files with 1738 additions and 2088 deletions

View File

@ -33,17 +33,6 @@ LDFLAGS = -nostdlib -shared -s $(PE_FLAGS) --image-base 0\
NAME:= atikms NAME:= atikms
HFILES:= $(DDK_INCLUDES)/linux/types.h \
$(DDK_INCLUDES)/linux/list.h \
$(DDK_INCLUDES)/linux/pci.h \
$(DDK_INCLUDES)/drm/drmP.h \
$(DDK_INCLUDES)/drm/drm_edid.h \
$(DDK_INCLUDES)/drm/drm_crtc.h \
$(DDK_INCLUDES)/drm/drm_mm.h \
atom.h \
radeon.h \
radeon_asic.h
NAME_SRC= \ NAME_SRC= \
main.c \ main.c \
pci.c \ pci.c \
@ -231,7 +220,7 @@ NAME_OBJS = $(patsubst %.S, %.o, $(patsubst %.asm, %.o,\
all: $(NAME).dll all: $(NAME).dll
$(NAME).dll: $(NAME_OBJS) $(FW_BINS) $(SRC_DEP) $(HFILES) $(LIBPATH)/libcore.a $(LIBPATH)/libddk.a atikms.lds Makefile $(NAME).dll: $(NAME_OBJS) $(FW_BINS) $(SRC_DEP) $(LIBPATH)/libcore.a $(LIBPATH)/libddk.a atikms.lds Makefile
$(LD) -L$(LIBPATH) $(LDFLAGS) -T atikms.lds -o $@ $(NAME_OBJS) $(LIBS) $(LD) -L$(LIBPATH) $(LDFLAGS) -T atikms.lds -o $@ $(NAME_OBJS) $(LIBS)

View File

@ -66,9 +66,10 @@ int atom_debug = 0;
static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params); static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params);
int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params); int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params);
static uint32_t atom_arg_mask[8] = static uint32_t atom_arg_mask[8] = {
{ 0xFFFFFFFF, 0xFFFF, 0xFFFF00, 0xFFFF0000, 0xFF, 0xFF00, 0xFF0000, 0xFFFFFFFF, 0x0000FFFF, 0x00FFFF00, 0xFFFF0000,
0xFF000000 }; 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000
};
static int atom_arg_shift[8] = { 0, 0, 8, 16, 0, 8, 16, 24 }; static int atom_arg_shift[8] = { 0, 0, 8, 16, 0, 8, 16, 24 };
static int atom_dst_to_src[8][4] = { static int atom_dst_to_src[8][4] = {

View File

@ -275,13 +275,15 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev)) if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
atombios_enable_crtc_memreq(crtc, ATOM_ENABLE); atombios_enable_crtc_memreq(crtc, ATOM_ENABLE);
atombios_blank_crtc(crtc, ATOM_DISABLE); atombios_blank_crtc(crtc, ATOM_DISABLE);
drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); if (dev->num_crtcs > radeon_crtc->crtc_id)
drm_vblank_on(dev, radeon_crtc->crtc_id);
radeon_crtc_load_lut(crtc); radeon_crtc_load_lut(crtc);
break; break;
case DRM_MODE_DPMS_STANDBY: case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND: case DRM_MODE_DPMS_SUSPEND:
case DRM_MODE_DPMS_OFF: case DRM_MODE_DPMS_OFF:
drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); if (dev->num_crtcs > radeon_crtc->crtc_id)
drm_vblank_off(dev, radeon_crtc->crtc_id);
if (radeon_crtc->enabled) if (radeon_crtc->enabled)
atombios_blank_crtc(crtc, ATOM_ENABLE); atombios_blank_crtc(crtc, ATOM_ENABLE);
if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev)) if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
@ -1665,11 +1667,11 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
} }
int atombios_crtc_set_base_atomic(struct drm_crtc *crtc, int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
int x, int y, enum mode_set_atomic state) int x, int y, enum mode_set_atomic state)
{ {
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
if (ASIC_IS_DCE4(rdev)) if (ASIC_IS_DCE4(rdev))
return dce4_crtc_do_set_base(crtc, fb, x, y, 1); return dce4_crtc_do_set_base(crtc, fb, x, y, 1);

View File

@ -37,10 +37,10 @@
#define DP_DPCD_SIZE DP_RECEIVER_CAP_SIZE #define DP_DPCD_SIZE DP_RECEIVER_CAP_SIZE
static char *voltage_names[] = { static char *voltage_names[] = {
"0.4V", "0.6V", "0.8V", "1.2V" "0.4V", "0.6V", "0.8V", "1.2V"
}; };
static char *pre_emph_names[] = { static char *pre_emph_names[] = {
"0dB", "3.5dB", "6dB", "9.5dB" "0dB", "3.5dB", "6dB", "9.5dB"
}; };
/***** radeon AUX functions *****/ /***** radeon AUX functions *****/
@ -305,7 +305,7 @@ static int convert_bpc_to_bpp(int bpc)
/***** radeon specific DP functions *****/ /***** radeon specific DP functions *****/
int radeon_dp_get_dp_link_config(struct drm_connector *connector, int radeon_dp_get_dp_link_config(struct drm_connector *connector,
const u8 dpcd[DP_DPCD_SIZE], const u8 dpcd[DP_DPCD_SIZE],
unsigned pix_clock, unsigned pix_clock,
unsigned *dp_lanes, unsigned *dp_rate) unsigned *dp_lanes, unsigned *dp_rate)
{ {
@ -317,7 +317,7 @@ int radeon_dp_get_dp_link_config(struct drm_connector *connector,
if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) ==
ENCODER_OBJECT_ID_NUTMEG) { ENCODER_OBJECT_ID_NUTMEG) {
for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) {
max_pix_clock = (lane_num * 270000 * 8) / bpp; max_pix_clock = (lane_num * 270000 * 8) / bpp;
if (max_pix_clock >= pix_clock) { if (max_pix_clock >= pix_clock) {
*dp_lanes = lane_num; *dp_lanes = lane_num;
@ -328,14 +328,14 @@ int radeon_dp_get_dp_link_config(struct drm_connector *connector,
} else { } else {
for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) {
for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) {
max_pix_clock = (lane_num * link_rates[i] * 8) / bpp; max_pix_clock = (lane_num * link_rates[i] * 8) / bpp;
if (max_pix_clock >= pix_clock) { if (max_pix_clock >= pix_clock) {
*dp_lanes = lane_num; *dp_lanes = lane_num;
*dp_rate = link_rates[i]; *dp_rate = link_rates[i];
return 0; return 0;
} }
} }
} }
} }
return -EINVAL; return -EINVAL;

View File

@ -2629,16 +2629,8 @@ radeon_atom_ext_dpms(struct drm_encoder *encoder, int mode)
} }
static bool radeon_atom_ext_mode_fixup(struct drm_encoder *encoder,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{
return true;
}
static const struct drm_encoder_helper_funcs radeon_atom_ext_helper_funcs = { static const struct drm_encoder_helper_funcs radeon_atom_ext_helper_funcs = {
.dpms = radeon_atom_ext_dpms, .dpms = radeon_atom_ext_dpms,
.mode_fixup = radeon_atom_ext_mode_fixup,
.prepare = radeon_atom_ext_prepare, .prepare = radeon_atom_ext_prepare,
.mode_set = radeon_atom_ext_mode_set, .mode_set = radeon_atom_ext_mode_set,
.commit = radeon_atom_ext_commit, .commit = radeon_atom_ext_commit,

View File

@ -1163,12 +1163,11 @@ u32 btc_valid_sclk[40] =
155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000 155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000
}; };
static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = {
{ { 10000, 30000, RADEON_SCLK_UP },
{ 10000, 30000, RADEON_SCLK_UP }, { 15000, 30000, RADEON_SCLK_UP },
{ 15000, 30000, RADEON_SCLK_UP }, { 20000, 30000, RADEON_SCLK_UP },
{ 20000, 30000, RADEON_SCLK_UP }, { 25000, 30000, RADEON_SCLK_UP }
{ 25000, 30000, RADEON_SCLK_UP }
}; };
void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
@ -1637,14 +1636,14 @@ static int btc_init_smc_table(struct radeon_device *rdev,
cypress_populate_smc_voltage_tables(rdev, table); cypress_populate_smc_voltage_tables(rdev, table);
switch (rdev->pm.int_thermal_type) { switch (rdev->pm.int_thermal_type) {
case THERMAL_TYPE_EVERGREEN: case THERMAL_TYPE_EVERGREEN:
case THERMAL_TYPE_EMC2103_WITH_INTERNAL: case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
break; break;
case THERMAL_TYPE_NONE: case THERMAL_TYPE_NONE:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
break; break;
default: default:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
break; break;
} }
@ -1860,37 +1859,37 @@ static bool btc_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
case MC_SEQ_RAS_TIMING >> 2: case MC_SEQ_RAS_TIMING >> 2:
*out_reg = MC_SEQ_RAS_TIMING_LP >> 2; *out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_CAS_TIMING >> 2: case MC_SEQ_CAS_TIMING >> 2:
*out_reg = MC_SEQ_CAS_TIMING_LP >> 2; *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING >> 2: case MC_SEQ_MISC_TIMING >> 2:
*out_reg = MC_SEQ_MISC_TIMING_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING2 >> 2: case MC_SEQ_MISC_TIMING2 >> 2:
*out_reg = MC_SEQ_MISC_TIMING2_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
break; break;
case MC_SEQ_RD_CTL_D0 >> 2: case MC_SEQ_RD_CTL_D0 >> 2:
*out_reg = MC_SEQ_RD_CTL_D0_LP >> 2; *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
break; break;
case MC_SEQ_RD_CTL_D1 >> 2: case MC_SEQ_RD_CTL_D1 >> 2:
*out_reg = MC_SEQ_RD_CTL_D1_LP >> 2; *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_D0 >> 2: case MC_SEQ_WR_CTL_D0 >> 2:
*out_reg = MC_SEQ_WR_CTL_D0_LP >> 2; *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_D1 >> 2: case MC_SEQ_WR_CTL_D1 >> 2:
*out_reg = MC_SEQ_WR_CTL_D1_LP >> 2; *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
break; break;
case MC_PMG_CMD_EMRS >> 2: case MC_PMG_CMD_EMRS >> 2:
*out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
break; break;
case MC_PMG_CMD_MRS >> 2: case MC_PMG_CMD_MRS >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
break; break;
case MC_PMG_CMD_MRS1 >> 2: case MC_PMG_CMD_MRS1 >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
break; break;
default: default:
result = false; result = false;
break; break;
} }

View File

@ -192,9 +192,9 @@ static void ci_fan_ctrl_set_default_mode(struct radeon_device *rdev);
static struct ci_power_info *ci_get_pi(struct radeon_device *rdev) static struct ci_power_info *ci_get_pi(struct radeon_device *rdev)
{ {
struct ci_power_info *pi = rdev->pm.dpm.priv; struct ci_power_info *pi = rdev->pm.dpm.priv;
return pi; return pi;
} }
static struct ci_ps *ci_get_ps(struct radeon_ps *rps) static struct ci_ps *ci_get_ps(struct radeon_ps *rps)
@ -1632,7 +1632,7 @@ static int ci_notify_hw_of_power_source(struct radeon_device *rdev,
else else
power_limit = (u32)(cac_tdp_table->battery_power_limit * 256); power_limit = (u32)(cac_tdp_table->battery_power_limit * 256);
ci_set_power_limit(rdev, power_limit); ci_set_power_limit(rdev, power_limit);
if (pi->caps_automatic_dc_transition) { if (pi->caps_automatic_dc_transition) {
if (ac_power) if (ac_power)
@ -2017,9 +2017,9 @@ static void ci_enable_display_gap(struct radeon_device *rdev)
{ {
u32 tmp = RREG32_SMC(CG_DISPLAY_GAP_CNTL); u32 tmp = RREG32_SMC(CG_DISPLAY_GAP_CNTL);
tmp &= ~(DISP_GAP_MASK | DISP_GAP_MCHG_MASK); tmp &= ~(DISP_GAP_MASK | DISP_GAP_MCHG_MASK);
tmp |= (DISP_GAP(R600_PM_DISPLAY_GAP_IGNORE) | tmp |= (DISP_GAP(R600_PM_DISPLAY_GAP_IGNORE) |
DISP_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK)); DISP_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK));
WREG32_SMC(CG_DISPLAY_GAP_CNTL, tmp); WREG32_SMC(CG_DISPLAY_GAP_CNTL, tmp);
} }
@ -2938,8 +2938,8 @@ static int ci_populate_single_memory_level(struct radeon_device *rdev,
memory_level->MinVddc = cpu_to_be32(memory_level->MinVddc * VOLTAGE_SCALE); memory_level->MinVddc = cpu_to_be32(memory_level->MinVddc * VOLTAGE_SCALE);
memory_level->MinVddcPhases = cpu_to_be32(memory_level->MinVddcPhases); memory_level->MinVddcPhases = cpu_to_be32(memory_level->MinVddcPhases);
memory_level->MinVddci = cpu_to_be32(memory_level->MinVddci * VOLTAGE_SCALE); memory_level->MinVddci = cpu_to_be32(memory_level->MinVddci * VOLTAGE_SCALE);
memory_level->MinMvdd = cpu_to_be32(memory_level->MinMvdd * VOLTAGE_SCALE); memory_level->MinMvdd = cpu_to_be32(memory_level->MinMvdd * VOLTAGE_SCALE);
memory_level->MclkFrequency = cpu_to_be32(memory_level->MclkFrequency); memory_level->MclkFrequency = cpu_to_be32(memory_level->MclkFrequency);
memory_level->ActivityLevel = cpu_to_be16(memory_level->ActivityLevel); memory_level->ActivityLevel = cpu_to_be16(memory_level->ActivityLevel);
@ -3152,7 +3152,7 @@ static int ci_calculate_sclk_params(struct radeon_device *rdev,
spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK; spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK;
spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv); spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv);
spll_func_cntl_3 |= SPLL_DITHEN; spll_func_cntl_3 |= SPLL_DITHEN;
if (pi->caps_sclk_ss_support) { if (pi->caps_sclk_ss_support) {
struct radeon_atom_ss ss; struct radeon_atom_ss ss;
@ -3229,7 +3229,7 @@ static int ci_populate_single_graphic_level(struct radeon_device *rdev,
graphic_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW; graphic_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
graphic_level->Flags = cpu_to_be32(graphic_level->Flags); graphic_level->Flags = cpu_to_be32(graphic_level->Flags);
graphic_level->MinVddc = cpu_to_be32(graphic_level->MinVddc * VOLTAGE_SCALE); graphic_level->MinVddc = cpu_to_be32(graphic_level->MinVddc * VOLTAGE_SCALE);
graphic_level->MinVddcPhases = cpu_to_be32(graphic_level->MinVddcPhases); graphic_level->MinVddcPhases = cpu_to_be32(graphic_level->MinVddcPhases);
graphic_level->SclkFrequency = cpu_to_be32(graphic_level->SclkFrequency); graphic_level->SclkFrequency = cpu_to_be32(graphic_level->SclkFrequency);
graphic_level->ActivityLevel = cpu_to_be16(graphic_level->ActivityLevel); graphic_level->ActivityLevel = cpu_to_be16(graphic_level->ActivityLevel);
@ -4393,7 +4393,7 @@ static bool ci_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
break; break;
case MC_SEQ_CAS_TIMING >> 2: case MC_SEQ_CAS_TIMING >> 2:
*out_reg = MC_SEQ_CAS_TIMING_LP >> 2; *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING >> 2: case MC_SEQ_MISC_TIMING >> 2:
*out_reg = MC_SEQ_MISC_TIMING_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
break; break;
@ -4625,7 +4625,7 @@ static int ci_initialize_mc_reg_table(struct radeon_device *rdev)
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
ret = ci_copy_vbios_mc_reg_table(table, ci_table); ret = ci_copy_vbios_mc_reg_table(table, ci_table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
@ -4916,7 +4916,7 @@ static int ci_set_private_data_variables_based_on_pptable(struct radeon_device *
allowed_mclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].clk; allowed_mclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].clk;
rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc =
allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].v; allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].v;
rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci =
allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 1].v; allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 1].v;
return 0; return 0;
@ -5517,7 +5517,7 @@ static int ci_parse_power_table(struct radeon_device *rdev)
struct _NonClockInfoArray *non_clock_info_array; struct _NonClockInfoArray *non_clock_info_array;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
u8 *power_state_offset; u8 *power_state_offset;
struct ci_ps *ps; struct ci_ps *ps;
@ -5693,8 +5693,8 @@ int ci_dpm_init(struct radeon_device *rdev)
return ret; return ret;
} }
pi->dll_default_on = false; pi->dll_default_on = false;
pi->sram_end = SMC_RAM_END; pi->sram_end = SMC_RAM_END;
pi->activity_target[0] = CISLAND_TARGETACTIVITY_DFLT; pi->activity_target[0] = CISLAND_TARGETACTIVITY_DFLT;
pi->activity_target[1] = CISLAND_TARGETACTIVITY_DFLT; pi->activity_target[1] = CISLAND_TARGETACTIVITY_DFLT;
@ -5734,9 +5734,9 @@ int ci_dpm_init(struct radeon_device *rdev)
pi->caps_uvd_dpm = true; pi->caps_uvd_dpm = true;
pi->caps_vce_dpm = true; pi->caps_vce_dpm = true;
ci_get_leakage_voltages(rdev); ci_get_leakage_voltages(rdev);
ci_patch_dependency_tables_with_leakage(rdev); ci_patch_dependency_tables_with_leakage(rdev);
ci_set_private_data_variables_based_on_pptable(rdev); ci_set_private_data_variables_based_on_pptable(rdev);
rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries = rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL); kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL);
@ -5839,7 +5839,7 @@ int ci_dpm_init(struct radeon_device *rdev)
pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2; pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
else else
rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL; rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL;
} }
if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_MVDDCONTROL) { if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_MVDDCONTROL) {
if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_GPIO_LUT)) if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_GPIO_LUT))
@ -5860,7 +5860,7 @@ int ci_dpm_init(struct radeon_device *rdev)
#endif #endif
if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
&frev, &crev, &data_offset)) { &frev, &crev, &data_offset)) {
pi->caps_sclk_ss_support = true; pi->caps_sclk_ss_support = true;
pi->caps_mclk_ss_support = true; pi->caps_mclk_ss_support = true;
pi->dynamic_ss = true; pi->dynamic_ss = true;

View File

@ -194,11 +194,11 @@ PPSMC_Result ci_wait_for_smc_inactive(struct radeon_device *rdev)
return PPSMC_Result_OK; return PPSMC_Result_OK;
for (i = 0; i < rdev->usec_timeout; i++) { for (i = 0; i < rdev->usec_timeout; i++) {
tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0); tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
if ((tmp & CKEN) == 0) if ((tmp & CKEN) == 0)
break; break;
udelay(1); udelay(1);
} }
return PPSMC_Result_OK; return PPSMC_Result_OK;
} }

File diff suppressed because it is too large Load Diff

View File

@ -737,11 +737,16 @@ int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r); DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
return r; return r;
} }
r = radeon_fence_wait(ib.fence, false); r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
if (r) { RADEON_USEC_IB_TEST_TIMEOUT));
if (r < 0) {
DRM_ERROR("radeon: fence wait failed (%d).\n", r); DRM_ERROR("radeon: fence wait failed (%d).\n", r);
return r; return r;
} else if (r == 0) {
DRM_ERROR("radeon: fence wait timed out.\n");
return -ETIMEDOUT;
} }
r = 0;
for (i = 0; i < rdev->usec_timeout; i++) { for (i = 0; i < rdev->usec_timeout; i++) {
tmp = le32_to_cpu(rdev->wb.wb[index/4]); tmp = le32_to_cpu(rdev->wb.wb[index/4]);
if (tmp == 0xDEADBEEF) if (tmp == 0xDEADBEEF)

View File

@ -1620,14 +1620,14 @@ static int cypress_init_smc_table(struct radeon_device *rdev,
cypress_populate_smc_voltage_tables(rdev, table); cypress_populate_smc_voltage_tables(rdev, table);
switch (rdev->pm.int_thermal_type) { switch (rdev->pm.int_thermal_type) {
case THERMAL_TYPE_EVERGREEN: case THERMAL_TYPE_EVERGREEN:
case THERMAL_TYPE_EMC2103_WITH_INTERNAL: case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
break; break;
case THERMAL_TYPE_NONE: case THERMAL_TYPE_NONE:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
break; break;
default: default:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
break; break;
} }

View File

@ -1140,7 +1140,7 @@ static int sumo_set_uvd_clock(struct radeon_device *rdev, u32 clock,
int r, i; int r, i;
struct atom_clock_dividers dividers; struct atom_clock_dividers dividers;
r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
clock, false, &dividers); clock, false, &dividers);
if (r) if (r)
return r; return r;

View File

@ -1816,8 +1816,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(idx_value & 0xfffffff0) + (idx_value & 0xfffffff0) +
((u64)(tmp & 0xff) << 32); ((u64)(tmp & 0xff) << 32);
ib[idx + 0] = offset; ib[idx + 0] = offset;
ib[idx + 1] = (tmp & 0xffffff00) | (upper_32_bits(offset) & 0xff); ib[idx + 1] = (tmp & 0xffffff00) | (upper_32_bits(offset) & 0xff);
@ -1862,8 +1862,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
idx_value + idx_value +
((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32);
ib[idx+0] = offset; ib[idx+0] = offset;
ib[idx+1] = upper_32_bits(offset) & 0xff; ib[idx+1] = upper_32_bits(offset) & 0xff;
@ -1897,8 +1897,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
idx_value + idx_value +
((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32);
ib[idx+0] = offset; ib[idx+0] = offset;
ib[idx+1] = upper_32_bits(offset) & 0xff; ib[idx+1] = upper_32_bits(offset) & 0xff;
@ -1925,8 +1925,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
radeon_get_ib_value(p, idx+1) + radeon_get_ib_value(p, idx+1) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = offset; ib[idx+1] = offset;
ib[idx+2] = upper_32_bits(offset) & 0xff; ib[idx+2] = upper_32_bits(offset) & 0xff;
@ -2098,8 +2098,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffffc) + (radeon_get_ib_value(p, idx+1) & 0xfffffffc) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = (ib[idx+1] & 0x3) | (offset & 0xfffffffc); ib[idx+1] = (ib[idx+1] & 0x3) | (offset & 0xfffffffc);
ib[idx+2] = upper_32_bits(offset) & 0xff; ib[idx+2] = upper_32_bits(offset) & 0xff;
@ -2239,8 +2239,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
return -EINVAL; return -EINVAL;
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffff8) + (radeon_get_ib_value(p, idx+1) & 0xfffffff8) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = offset & 0xfffffff8; ib[idx+1] = offset & 0xfffffff8;
ib[idx+2] = upper_32_bits(offset) & 0xff; ib[idx+2] = upper_32_bits(offset) & 0xff;
@ -2261,8 +2261,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffffc) + (radeon_get_ib_value(p, idx+1) & 0xfffffffc) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = offset & 0xfffffffc; ib[idx+1] = offset & 0xfffffffc;
ib[idx+2] = (ib[idx+2] & 0xffffff00) | (upper_32_bits(offset) & 0xff); ib[idx+2] = (ib[idx+2] & 0xffffff00) | (upper_32_bits(offset) & 0xff);
@ -2283,8 +2283,8 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffffc) + (radeon_get_ib_value(p, idx+1) & 0xfffffffc) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = offset & 0xfffffffc; ib[idx+1] = offset & 0xfffffffc;
ib[idx+2] = (ib[idx+2] & 0xffffff00) | (upper_32_bits(offset) & 0xff); ib[idx+2] = (ib[idx+2] & 0xffffff00) | (upper_32_bits(offset) & 0xff);

View File

@ -206,7 +206,7 @@ void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder,
* build a AVI Info Frame * build a AVI Info Frame
*/ */
void evergreen_set_avi_packet(struct radeon_device *rdev, u32 offset, void evergreen_set_avi_packet(struct radeon_device *rdev, u32 offset,
unsigned char *buffer, size_t size) unsigned char *buffer, size_t size)
{ {
uint8_t *frame = buffer + 3; uint8_t *frame = buffer + 3;

View File

@ -2640,7 +2640,7 @@ static int kv_parse_power_table(struct radeon_device *rdev)
struct _NonClockInfoArray *non_clock_info_array; struct _NonClockInfoArray *non_clock_info_array;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
u8 *power_state_offset; u8 *power_state_offset;
struct kv_ps *ps; struct kv_ps *ps;
@ -2738,7 +2738,7 @@ int kv_dpm_init(struct radeon_device *rdev)
for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++)
pi->at[i] = TRINITY_AT_DFLT; pi->at[i] = TRINITY_AT_DFLT;
pi->sram_end = SMC_RAM_END; pi->sram_end = SMC_RAM_END;
/* Enabling nb dpm on an asrock system prevents dpm from working */ /* Enabling nb dpm on an asrock system prevents dpm from working */
if (rdev->pdev->subsystem_vendor == 0x1849) if (rdev->pdev->subsystem_vendor == 0x1849)

View File

@ -5,7 +5,7 @@
#include "radeon.h" #include "radeon.h"
#include "bitmap.h" #include "bitmap.h"
#define DRV_NAME "atikms v4.5.7" #define DRV_NAME "atikms v4.6.7"
void __init dmi_scan_machine(void); void __init dmi_scan_machine(void);
int printf ( const char * format, ... ); int printf ( const char * format, ... );

View File

@ -1257,7 +1257,7 @@ static void cayman_gpu_init(struct radeon_device *rdev)
tmp = RREG32_CG(CG_CGTT_LOCAL_0); tmp = RREG32_CG(CG_CGTT_LOCAL_0);
tmp &= ~0x00380000; tmp &= ~0x00380000;
WREG32_CG(CG_CGTT_LOCAL_0, tmp); WREG32_CG(CG_CGTT_LOCAL_0, tmp);
tmp = RREG32_CG(CG_CGTT_LOCAL_1); tmp = RREG32_CG(CG_CGTT_LOCAL_1);
tmp &= ~0x0e000000; tmp &= ~0x0e000000;
WREG32_CG(CG_CGTT_LOCAL_1, tmp); WREG32_CG(CG_CGTT_LOCAL_1, tmp);
} }
@ -2593,7 +2593,7 @@ int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
struct atom_clock_dividers dividers; struct atom_clock_dividers dividers;
int r, i; int r, i;
r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
ecclk, false, &dividers); ecclk, false, &dividers);
if (r) if (r)
return r; return r;

View File

@ -725,9 +725,9 @@ extern int ni_mc_load_microcode(struct radeon_device *rdev);
struct ni_power_info *ni_get_pi(struct radeon_device *rdev) struct ni_power_info *ni_get_pi(struct radeon_device *rdev)
{ {
struct ni_power_info *pi = rdev->pm.dpm.priv; struct ni_power_info *pi = rdev->pm.dpm.priv;
return pi; return pi;
} }
struct ni_ps *ni_get_ps(struct radeon_ps *rps) struct ni_ps *ni_get_ps(struct radeon_ps *rps)
@ -1096,9 +1096,9 @@ static void ni_stop_smc(struct radeon_device *rdev)
static int ni_process_firmware_header(struct radeon_device *rdev) static int ni_process_firmware_header(struct radeon_device *rdev)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
u32 tmp; u32 tmp;
int ret; int ret;
@ -1202,14 +1202,14 @@ static int ni_enter_ulp_state(struct radeon_device *rdev)
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
if (pi->gfx_clock_gating) { if (pi->gfx_clock_gating) {
WREG32_P(SCLK_PWRMGT_CNTL, 0, ~DYN_GFX_CLK_OFF_EN); WREG32_P(SCLK_PWRMGT_CNTL, 0, ~DYN_GFX_CLK_OFF_EN);
WREG32_P(SCLK_PWRMGT_CNTL, GFX_CLK_FORCE_ON, ~GFX_CLK_FORCE_ON); WREG32_P(SCLK_PWRMGT_CNTL, GFX_CLK_FORCE_ON, ~GFX_CLK_FORCE_ON);
WREG32_P(SCLK_PWRMGT_CNTL, 0, ~GFX_CLK_FORCE_ON); WREG32_P(SCLK_PWRMGT_CNTL, 0, ~GFX_CLK_FORCE_ON);
RREG32(GB_ADDR_CONFIG); RREG32(GB_ADDR_CONFIG);
} }
WREG32_P(SMC_MSG, HOST_SMC_MSG(PPSMC_MSG_SwitchToMinimumPower), WREG32_P(SMC_MSG, HOST_SMC_MSG(PPSMC_MSG_SwitchToMinimumPower),
~HOST_SMC_MSG_MASK); ~HOST_SMC_MSG_MASK);
udelay(25000); udelay(25000);
@ -1321,12 +1321,12 @@ static void ni_populate_mvdd_value(struct radeon_device *rdev,
u32 mclk, u32 mclk,
NISLANDS_SMC_VOLTAGE_VALUE *voltage) NISLANDS_SMC_VOLTAGE_VALUE *voltage)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
if (!pi->mvdd_control) { if (!pi->mvdd_control) {
voltage->index = eg_pi->mvdd_high_index; voltage->index = eg_pi->mvdd_high_index;
voltage->value = cpu_to_be16(MVDD_HIGH_VALUE); voltage->value = cpu_to_be16(MVDD_HIGH_VALUE);
return; return;
} }
@ -1510,47 +1510,47 @@ int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
u32 mc_cg_config; u32 mc_cg_config;
switch (arb_freq_src) { switch (arb_freq_src) {
case MC_CG_ARB_FREQ_F0: case MC_CG_ARB_FREQ_F0:
mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING); mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING);
mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2); mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE0_MASK) >> STATE0_SHIFT; burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE0_MASK) >> STATE0_SHIFT;
break; break;
case MC_CG_ARB_FREQ_F1: case MC_CG_ARB_FREQ_F1:
mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_1); mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_1);
mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_1); mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_1);
burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE1_MASK) >> STATE1_SHIFT; burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE1_MASK) >> STATE1_SHIFT;
break; break;
case MC_CG_ARB_FREQ_F2: case MC_CG_ARB_FREQ_F2:
mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_2); mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_2);
mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_2); mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_2);
burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE2_MASK) >> STATE2_SHIFT; burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE2_MASK) >> STATE2_SHIFT;
break; break;
case MC_CG_ARB_FREQ_F3: case MC_CG_ARB_FREQ_F3:
mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_3); mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_3);
mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_3); mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_3);
burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE3_MASK) >> STATE3_SHIFT; burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE3_MASK) >> STATE3_SHIFT;
break; break;
default: default:
return -EINVAL; return -EINVAL;
} }
switch (arb_freq_dest) { switch (arb_freq_dest) {
case MC_CG_ARB_FREQ_F0: case MC_CG_ARB_FREQ_F0:
WREG32(MC_ARB_DRAM_TIMING, mc_arb_dram_timing); WREG32(MC_ARB_DRAM_TIMING, mc_arb_dram_timing);
WREG32(MC_ARB_DRAM_TIMING2, mc_arb_dram_timing2); WREG32(MC_ARB_DRAM_TIMING2, mc_arb_dram_timing2);
WREG32_P(MC_ARB_BURST_TIME, STATE0(burst_time), ~STATE0_MASK); WREG32_P(MC_ARB_BURST_TIME, STATE0(burst_time), ~STATE0_MASK);
break; break;
case MC_CG_ARB_FREQ_F1: case MC_CG_ARB_FREQ_F1:
WREG32(MC_ARB_DRAM_TIMING_1, mc_arb_dram_timing); WREG32(MC_ARB_DRAM_TIMING_1, mc_arb_dram_timing);
WREG32(MC_ARB_DRAM_TIMING2_1, mc_arb_dram_timing2); WREG32(MC_ARB_DRAM_TIMING2_1, mc_arb_dram_timing2);
WREG32_P(MC_ARB_BURST_TIME, STATE1(burst_time), ~STATE1_MASK); WREG32_P(MC_ARB_BURST_TIME, STATE1(burst_time), ~STATE1_MASK);
break; break;
case MC_CG_ARB_FREQ_F2: case MC_CG_ARB_FREQ_F2:
WREG32(MC_ARB_DRAM_TIMING_2, mc_arb_dram_timing); WREG32(MC_ARB_DRAM_TIMING_2, mc_arb_dram_timing);
WREG32(MC_ARB_DRAM_TIMING2_2, mc_arb_dram_timing2); WREG32(MC_ARB_DRAM_TIMING2_2, mc_arb_dram_timing2);
WREG32_P(MC_ARB_BURST_TIME, STATE2(burst_time), ~STATE2_MASK); WREG32_P(MC_ARB_BURST_TIME, STATE2(burst_time), ~STATE2_MASK);
break; break;
case MC_CG_ARB_FREQ_F3: case MC_CG_ARB_FREQ_F3:
WREG32(MC_ARB_DRAM_TIMING_3, mc_arb_dram_timing); WREG32(MC_ARB_DRAM_TIMING_3, mc_arb_dram_timing);
WREG32(MC_ARB_DRAM_TIMING2_3, mc_arb_dram_timing2); WREG32(MC_ARB_DRAM_TIMING2_3, mc_arb_dram_timing2);
WREG32_P(MC_ARB_BURST_TIME, STATE3(burst_time), ~STATE3_MASK); WREG32_P(MC_ARB_BURST_TIME, STATE3(burst_time), ~STATE3_MASK);
@ -1621,9 +1621,7 @@ static int ni_populate_memory_timing_parameters(struct radeon_device *rdev,
(u8)rv770_calculate_memory_refresh_rate(rdev, pl->sclk); (u8)rv770_calculate_memory_refresh_rate(rdev, pl->sclk);
radeon_atom_set_engine_dram_timings(rdev, radeon_atom_set_engine_dram_timings(rdev, pl->sclk, pl->mclk);
pl->sclk,
pl->mclk);
dram_timing = RREG32(MC_ARB_DRAM_TIMING); dram_timing = RREG32(MC_ARB_DRAM_TIMING);
dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2); dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
@ -1867,9 +1865,9 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
mpll_ad_func_cntl_2 |= BIAS_GEN_PDNB | RESET_EN; mpll_ad_func_cntl_2 |= BIAS_GEN_PDNB | RESET_EN;
if (pi->mem_gddr5) if (pi->mem_gddr5)
mpll_dq_func_cntl &= ~PDNB; mpll_dq_func_cntl &= ~PDNB;
mpll_dq_func_cntl_2 |= BIAS_GEN_PDNB | RESET_EN | BYPASS; mpll_dq_func_cntl_2 |= BIAS_GEN_PDNB | RESET_EN | BYPASS;
mclk_pwrmgt_cntl |= (MRDCKA0_RESET | mclk_pwrmgt_cntl |= (MRDCKA0_RESET |
@ -1891,15 +1889,15 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
MRDCKD1_PDNB); MRDCKD1_PDNB);
dll_cntl |= (MRDCKA0_BYPASS | dll_cntl |= (MRDCKA0_BYPASS |
MRDCKA1_BYPASS | MRDCKA1_BYPASS |
MRDCKB0_BYPASS | MRDCKB0_BYPASS |
MRDCKB1_BYPASS | MRDCKB1_BYPASS |
MRDCKC0_BYPASS | MRDCKC0_BYPASS |
MRDCKC1_BYPASS | MRDCKC1_BYPASS |
MRDCKD0_BYPASS | MRDCKD0_BYPASS |
MRDCKD1_BYPASS); MRDCKD1_BYPASS);
spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK; spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
spll_func_cntl_2 |= SCLK_MUX_SEL(4); spll_func_cntl_2 |= SCLK_MUX_SEL(4);
table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl); table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
@ -2089,7 +2087,7 @@ static int ni_populate_sclk_value(struct radeon_device *rdev,
static int ni_init_smc_spll_table(struct radeon_device *rdev) static int ni_init_smc_spll_table(struct radeon_device *rdev)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
SMC_NISLANDS_SPLL_DIV_TABLE *spll_table; SMC_NISLANDS_SPLL_DIV_TABLE *spll_table;
NISLANDS_SMC_SCLK_VALUE sclk_params; NISLANDS_SMC_SCLK_VALUE sclk_params;
@ -2311,8 +2309,8 @@ static int ni_convert_power_level_to_smc(struct radeon_device *rdev,
NISLANDS_SMC_HW_PERFORMANCE_LEVEL *level) NISLANDS_SMC_HW_PERFORMANCE_LEVEL *level)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
int ret; int ret;
bool dll_state_on; bool dll_state_on;
u16 std_vddc; u16 std_vddc;
@ -2391,8 +2389,8 @@ static int ni_populate_smc_t(struct radeon_device *rdev,
struct radeon_ps *radeon_state, struct radeon_ps *radeon_state,
NISLANDS_SMC_SWSTATE *smc_state) NISLANDS_SMC_SWSTATE *smc_state)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_ps *state = ni_get_ps(radeon_state); struct ni_ps *state = ni_get_ps(radeon_state);
u32 a_t; u32 a_t;
u32 t_l, t_h; u32 t_l, t_h;
@ -2451,8 +2449,8 @@ static int ni_populate_power_containment_values(struct radeon_device *rdev,
struct radeon_ps *radeon_state, struct radeon_ps *radeon_state,
NISLANDS_SMC_SWSTATE *smc_state) NISLANDS_SMC_SWSTATE *smc_state)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
struct ni_ps *state = ni_get_ps(radeon_state); struct ni_ps *state = ni_get_ps(radeon_state);
u32 prev_sclk; u32 prev_sclk;
@ -2595,7 +2593,7 @@ static int ni_enable_power_containment(struct radeon_device *rdev,
struct radeon_ps *radeon_new_state, struct radeon_ps *radeon_new_state,
bool enable) bool enable)
{ {
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
PPSMC_Result smc_result; PPSMC_Result smc_result;
int ret = 0; int ret = 0;
@ -2625,7 +2623,7 @@ static int ni_convert_power_state_to_smc(struct radeon_device *rdev,
struct radeon_ps *radeon_state, struct radeon_ps *radeon_state,
NISLANDS_SMC_SWSTATE *smc_state) NISLANDS_SMC_SWSTATE *smc_state)
{ {
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
struct ni_ps *state = ni_get_ps(radeon_state); struct ni_ps *state = ni_get_ps(radeon_state);
int i, ret; int i, ret;
@ -2770,46 +2768,46 @@ static bool ni_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
bool result = true; bool result = true;
switch (in_reg) { switch (in_reg) {
case MC_SEQ_RAS_TIMING >> 2: case MC_SEQ_RAS_TIMING >> 2:
*out_reg = MC_SEQ_RAS_TIMING_LP >> 2; *out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_CAS_TIMING >> 2: case MC_SEQ_CAS_TIMING >> 2:
*out_reg = MC_SEQ_CAS_TIMING_LP >> 2; *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING >> 2: case MC_SEQ_MISC_TIMING >> 2:
*out_reg = MC_SEQ_MISC_TIMING_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING2 >> 2: case MC_SEQ_MISC_TIMING2 >> 2:
*out_reg = MC_SEQ_MISC_TIMING2_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
break; break;
case MC_SEQ_RD_CTL_D0 >> 2: case MC_SEQ_RD_CTL_D0 >> 2:
*out_reg = MC_SEQ_RD_CTL_D0_LP >> 2; *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
break; break;
case MC_SEQ_RD_CTL_D1 >> 2: case MC_SEQ_RD_CTL_D1 >> 2:
*out_reg = MC_SEQ_RD_CTL_D1_LP >> 2; *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_D0 >> 2: case MC_SEQ_WR_CTL_D0 >> 2:
*out_reg = MC_SEQ_WR_CTL_D0_LP >> 2; *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_D1 >> 2: case MC_SEQ_WR_CTL_D1 >> 2:
*out_reg = MC_SEQ_WR_CTL_D1_LP >> 2; *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
break; break;
case MC_PMG_CMD_EMRS >> 2: case MC_PMG_CMD_EMRS >> 2:
*out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
break; break;
case MC_PMG_CMD_MRS >> 2: case MC_PMG_CMD_MRS >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
break; break;
case MC_PMG_CMD_MRS1 >> 2: case MC_PMG_CMD_MRS1 >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
break; break;
case MC_SEQ_PMG_TIMING >> 2: case MC_SEQ_PMG_TIMING >> 2:
*out_reg = MC_SEQ_PMG_TIMING_LP >> 2; *out_reg = MC_SEQ_PMG_TIMING_LP >> 2;
break; break;
case MC_PMG_CMD_MRS2 >> 2: case MC_PMG_CMD_MRS2 >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2;
break; break;
default: default:
result = false; result = false;
break; break;
} }
@ -2876,9 +2874,9 @@ static int ni_initialize_mc_reg_table(struct radeon_device *rdev)
struct ni_mc_reg_table *ni_table = &ni_pi->mc_reg_table; struct ni_mc_reg_table *ni_table = &ni_pi->mc_reg_table;
u8 module_index = rv770_get_memory_module_index(rdev); u8 module_index = rv770_get_memory_module_index(rdev);
table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL); table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
if (!table) if (!table)
return -ENOMEM; return -ENOMEM;
WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING)); WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING)); WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
@ -2896,25 +2894,25 @@ static int ni_initialize_mc_reg_table(struct radeon_device *rdev)
ret = radeon_atom_init_mc_reg_table(rdev, module_index, table); ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
ret = ni_copy_vbios_mc_reg_table(table, ni_table); ret = ni_copy_vbios_mc_reg_table(table, ni_table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
ni_set_s0_mc_reg_index(ni_table); ni_set_s0_mc_reg_index(ni_table);
ret = ni_set_mc_special_registers(rdev, ni_table); ret = ni_set_mc_special_registers(rdev, ni_table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
ni_set_valid_flag(ni_table); ni_set_valid_flag(ni_table);
init_mc_done: init_mc_done:
kfree(table); kfree(table);
return ret; return ret;
} }
@ -2994,7 +2992,7 @@ static int ni_populate_mc_reg_table(struct radeon_device *rdev,
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
struct ni_ps *boot_state = ni_get_ps(radeon_boot_state); struct ni_ps *boot_state = ni_get_ps(radeon_boot_state);
SMC_NIslands_MCRegisters *mc_reg_table = &ni_pi->smc_mc_reg_table; SMC_NIslands_MCRegisters *mc_reg_table = &ni_pi->smc_mc_reg_table;
@ -3025,7 +3023,7 @@ static int ni_upload_mc_reg_table(struct radeon_device *rdev,
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
struct ni_ps *ni_new_state = ni_get_ps(radeon_new_state); struct ni_ps *ni_new_state = ni_get_ps(radeon_new_state);
SMC_NIslands_MCRegisters *mc_reg_table = &ni_pi->smc_mc_reg_table; SMC_NIslands_MCRegisters *mc_reg_table = &ni_pi->smc_mc_reg_table;
u16 address; u16 address;
@ -3142,7 +3140,7 @@ static int ni_initialize_smc_cac_tables(struct radeon_device *rdev)
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
PP_NIslands_CACTABLES *cac_tables = NULL; PP_NIslands_CACTABLES *cac_tables = NULL;
int i, ret; int i, ret;
u32 reg; u32 reg;
if (ni_pi->enable_cac == false) if (ni_pi->enable_cac == false)
return 0; return 0;
@ -3422,13 +3420,13 @@ static int ni_pcie_performance_request(struct radeon_device *rdev,
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
if ((perf_req == PCIE_PERF_REQ_PECI_GEN1) || if ((perf_req == PCIE_PERF_REQ_PECI_GEN1) ||
(perf_req == PCIE_PERF_REQ_PECI_GEN2)) { (perf_req == PCIE_PERF_REQ_PECI_GEN2)) {
if (eg_pi->pcie_performance_request_registered == false) if (eg_pi->pcie_performance_request_registered == false)
radeon_acpi_pcie_notify_device_ready(rdev); radeon_acpi_pcie_notify_device_ready(rdev);
eg_pi->pcie_performance_request_registered = true; eg_pi->pcie_performance_request_registered = true;
return radeon_acpi_pcie_performance_request(rdev, perf_req, advertise); return radeon_acpi_pcie_performance_request(rdev, perf_req, advertise);
} else if ((perf_req == PCIE_PERF_REQ_REMOVE_REGISTRY) && } else if ((perf_req == PCIE_PERF_REQ_REMOVE_REGISTRY) &&
eg_pi->pcie_performance_request_registered) { eg_pi->pcie_performance_request_registered) {
eg_pi->pcie_performance_request_registered = false; eg_pi->pcie_performance_request_registered = false;
return radeon_acpi_pcie_performance_request(rdev, perf_req, advertise); return radeon_acpi_pcie_performance_request(rdev, perf_req, advertise);
} }
@ -3441,12 +3439,12 @@ static int ni_advertise_gen2_capability(struct radeon_device *rdev)
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
u32 tmp; u32 tmp;
tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) && if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
(tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2))
pi->pcie_gen2 = true; pi->pcie_gen2 = true;
else else
pi->pcie_gen2 = false; pi->pcie_gen2 = false;
if (!pi->pcie_gen2) if (!pi->pcie_gen2)
@ -3458,8 +3456,8 @@ static int ni_advertise_gen2_capability(struct radeon_device *rdev)
static void ni_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev, static void ni_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev,
bool enable) bool enable)
{ {
struct rv7xx_power_info *pi = rv770_get_pi(rdev); struct rv7xx_power_info *pi = rv770_get_pi(rdev);
u32 tmp, bif; u32 tmp, bif;
tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
@ -3502,7 +3500,7 @@ static void ni_enable_dynamic_pcie_gen2(struct radeon_device *rdev,
if (enable) if (enable)
WREG32_P(GENERAL_PWRMGT, ENABLE_GEN2PCIE, ~ENABLE_GEN2PCIE); WREG32_P(GENERAL_PWRMGT, ENABLE_GEN2PCIE, ~ENABLE_GEN2PCIE);
else else
WREG32_P(GENERAL_PWRMGT, 0, ~ENABLE_GEN2PCIE); WREG32_P(GENERAL_PWRMGT, 0, ~ENABLE_GEN2PCIE);
} }
void ni_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev, void ni_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev,
@ -3563,7 +3561,7 @@ void ni_update_current_ps(struct radeon_device *rdev,
{ {
struct ni_ps *new_ps = ni_get_ps(rps); struct ni_ps *new_ps = ni_get_ps(rps);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
eg_pi->current_rps = *rps; eg_pi->current_rps = *rps;
ni_pi->current_ps = *new_ps; ni_pi->current_ps = *new_ps;
@ -3575,7 +3573,7 @@ void ni_update_requested_ps(struct radeon_device *rdev,
{ {
struct ni_ps *new_ps = ni_get_ps(rps); struct ni_ps *new_ps = ni_get_ps(rps);
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
struct ni_power_info *ni_pi = ni_get_pi(rdev); struct ni_power_info *ni_pi = ni_get_pi(rdev);
eg_pi->requested_rps = *rps; eg_pi->requested_rps = *rps;
ni_pi->requested_ps = *new_ps; ni_pi->requested_ps = *new_ps;
@ -3591,8 +3589,8 @@ int ni_dpm_enable(struct radeon_device *rdev)
if (pi->gfx_clock_gating) if (pi->gfx_clock_gating)
ni_cg_clockgating_default(rdev); ni_cg_clockgating_default(rdev);
if (btc_dpm_enabled(rdev)) if (btc_dpm_enabled(rdev))
return -EINVAL; return -EINVAL;
if (pi->mg_clock_gating) if (pi->mg_clock_gating)
ni_mg_clockgating_default(rdev); ni_mg_clockgating_default(rdev);
if (eg_pi->ls_clock_gating) if (eg_pi->ls_clock_gating)
@ -3991,7 +3989,7 @@ static int ni_parse_power_table(struct radeon_device *rdev)
union pplib_clock_info *clock_info; union pplib_clock_info *clock_info;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
struct ni_ps *ps; struct ni_ps *ps;

View File

@ -109,6 +109,8 @@
#define NI_DP_MSE_SAT2 0x7398 #define NI_DP_MSE_SAT2 0x7398
#define NI_DP_MSE_SAT_UPDATE 0x739c #define NI_DP_MSE_SAT_UPDATE 0x739c
# define NI_DP_MSE_SAT_UPDATE_MASK 0x3
# define NI_DP_MSE_16_MTP_KEEPOUT 0x100
#define NI_DIG_BE_CNTL 0x7140 #define NI_DIG_BE_CNTL 0x7140
# define NI_DIG_FE_SOURCE_SELECT(x) (((x) & 0x7f) << 8) # define NI_DIG_FE_SOURCE_SELECT(x) (((x) & 0x7f) << 8)

View File

@ -17,6 +17,9 @@ static LIST_HEAD(devices);
#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED) #define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
#define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, resource field overlaid */
#define IORESOURCE_ROM_BIOS_COPY (1<<3) /* ROM is BIOS copy, resource field overlaid */
/* /*
* Translate the low bits of the PCI base * Translate the low bits of the PCI base
* to the resource type * to the resource type

View File

@ -1547,6 +1547,7 @@ int r300_init(struct radeon_device *rdev)
rv370_pcie_gart_fini(rdev); rv370_pcie_gart_fini(rdev);
if (rdev->flags & RADEON_IS_PCI) if (rdev->flags & RADEON_IS_PCI)
r100_pci_gart_fini(rdev); r100_pci_gart_fini(rdev);
radeon_agp_fini(rdev);
rdev->accel_working = false; rdev->accel_working = false;
} }
return 0; return 0;

View File

@ -416,6 +416,7 @@ int r420_init(struct radeon_device *rdev)
rv370_pcie_gart_fini(rdev); rv370_pcie_gart_fini(rdev);
if (rdev->flags & RADEON_IS_PCI) if (rdev->flags & RADEON_IS_PCI)
r100_pci_gart_fini(rdev); r100_pci_gart_fini(rdev);
radeon_agp_fini(rdev);
rdev->accel_working = false; rdev->accel_working = false;
} }
return 0; return 0;

View File

@ -297,6 +297,7 @@ int r520_init(struct radeon_device *rdev)
radeon_ib_pool_fini(rdev); radeon_ib_pool_fini(rdev);
radeon_irq_kms_fini(rdev); radeon_irq_kms_fini(rdev);
rv370_pcie_gart_fini(rdev); rv370_pcie_gart_fini(rdev);
radeon_agp_fini(rdev);
rdev->accel_working = false; rdev->accel_working = false;
} }
return 0; return 0;

View File

@ -235,8 +235,8 @@ int r600_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
fb_div |= 1; fb_div |= 1;
r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
if (r) if (r)
return r; return r;
/* assert PLL_RESET */ /* assert PLL_RESET */
WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK); WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
@ -1490,7 +1490,7 @@ static int r600_mc_init(struct radeon_device *rdev)
rdev->fastfb_working = true; rdev->fastfb_working = true;
} }
} }
} }
} }
radeon_update_bandwidth_info(rdev); radeon_update_bandwidth_info(rdev);
@ -4521,7 +4521,7 @@ uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev)
mutex_lock(&rdev->gpu_clock_mutex); mutex_lock(&rdev->gpu_clock_mutex);
WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1); WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) | clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL); ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
mutex_unlock(&rdev->gpu_clock_mutex); mutex_unlock(&rdev->gpu_clock_mutex);
return clock; return clock;
} }

View File

@ -1671,8 +1671,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(idx_value & 0xfffffff0) + (idx_value & 0xfffffff0) +
((u64)(tmp & 0xff) << 32); ((u64)(tmp & 0xff) << 32);
ib[idx + 0] = offset; ib[idx + 0] = offset;
ib[idx + 1] = (tmp & 0xffffff00) | (upper_32_bits(offset) & 0xff); ib[idx + 1] = (tmp & 0xffffff00) | (upper_32_bits(offset) & 0xff);
@ -1712,8 +1712,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
idx_value + idx_value +
((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32);
ib[idx+0] = offset; ib[idx+0] = offset;
ib[idx+1] = upper_32_bits(offset) & 0xff; ib[idx+1] = upper_32_bits(offset) & 0xff;
@ -1764,8 +1764,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffff0) + (radeon_get_ib_value(p, idx+1) & 0xfffffff0) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = (ib[idx+1] & 0x3) | (offset & 0xfffffff0); ib[idx+1] = (ib[idx+1] & 0x3) | (offset & 0xfffffff0);
ib[idx+2] = upper_32_bits(offset) & 0xff; ib[idx+2] = upper_32_bits(offset) & 0xff;
@ -1876,8 +1876,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
return -EINVAL; return -EINVAL;
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffff8) + (radeon_get_ib_value(p, idx+1) & 0xfffffff8) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = offset & 0xfffffff8; ib[idx+1] = offset & 0xfffffff8;
ib[idx+2] = upper_32_bits(offset) & 0xff; ib[idx+2] = upper_32_bits(offset) & 0xff;
@ -1898,8 +1898,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
} }
offset = reloc->gpu_offset + offset = reloc->gpu_offset +
(radeon_get_ib_value(p, idx+1) & 0xfffffffc) + (radeon_get_ib_value(p, idx+1) & 0xfffffffc) +
((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32); ((u64)(radeon_get_ib_value(p, idx+2) & 0xff) << 32);
ib[idx+1] = offset & 0xfffffffc; ib[idx+1] = offset & 0xfffffffc;
ib[idx+2] = (ib[idx+2] & 0xffffff00) | (upper_32_bits(offset) & 0xff); ib[idx+2] = (ib[idx+2] & 0xffffff00) | (upper_32_bits(offset) & 0xff);

View File

@ -844,7 +844,7 @@ int r600_get_platform_caps(struct radeon_device *rdev)
struct radeon_mode_info *mode_info = &rdev->mode_info; struct radeon_mode_info *mode_info = &rdev->mode_info;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
if (!atom_parse_data_header(mode_info->atom_context, index, NULL, if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
@ -874,7 +874,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
union fan_info *fan_info; union fan_info *fan_info;
ATOM_PPLIB_Clock_Voltage_Dependency_Table *dep_table; ATOM_PPLIB_Clock_Voltage_Dependency_Table *dep_table;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
int ret, i; int ret, i;
@ -1070,7 +1070,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
ext_hdr->usVCETableOffset) { ext_hdr->usVCETableOffset) {
VCEClockInfoArray *array = (VCEClockInfoArray *) VCEClockInfoArray *array = (VCEClockInfoArray *)
(mode_info->atom_context->bios + data_offset + (mode_info->atom_context->bios + data_offset +
le16_to_cpu(ext_hdr->usVCETableOffset) + 1); le16_to_cpu(ext_hdr->usVCETableOffset) + 1);
ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table *limits = ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table *limits =
(ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table *) (ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table *)
(mode_info->atom_context->bios + data_offset + (mode_info->atom_context->bios + data_offset +

View File

@ -215,7 +215,7 @@ void r600_hdmi_update_acr(struct drm_encoder *encoder, long offset,
* build a HDMI Video Info Frame * build a HDMI Video Info Frame
*/ */
void r600_set_avi_packet(struct radeon_device *rdev, u32 offset, void r600_set_avi_packet(struct radeon_device *rdev, u32 offset,
unsigned char *buffer, size_t size) unsigned char *buffer, size_t size)
{ {
uint8_t *frame = buffer + 3; uint8_t *frame = buffer + 3;
@ -312,7 +312,7 @@ void r600_hdmi_audio_workaround(struct drm_encoder *encoder)
} }
void r600_hdmi_audio_set_dto(struct radeon_device *rdev, void r600_hdmi_audio_set_dto(struct radeon_device *rdev,
struct radeon_crtc *crtc, unsigned int clock) struct radeon_crtc *crtc, unsigned int clock)
{ {
struct radeon_encoder *radeon_encoder; struct radeon_encoder *radeon_encoder;
struct radeon_encoder_atom_dig *dig; struct radeon_encoder_atom_dig *dig;

View File

@ -126,6 +126,7 @@ extern int radeon_mst;
*/ */
#define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */ #define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */
#define RADEON_FENCE_JIFFIES_TIMEOUT (HZ / 2) #define RADEON_FENCE_JIFFIES_TIMEOUT (HZ / 2)
#define RADEON_USEC_IB_TEST_TIMEOUT 1000000 /* 1s */
/* RADEON_IB_POOL_SIZE must be a power of 2 */ /* RADEON_IB_POOL_SIZE must be a power of 2 */
#define RADEON_IB_POOL_SIZE 16 #define RADEON_IB_POOL_SIZE 16
#define RADEON_DEBUGFS_MAX_COMPONENTS 32 #define RADEON_DEBUGFS_MAX_COMPONENTS 32
@ -388,6 +389,7 @@ void radeon_fence_driver_force_completion(struct radeon_device *rdev, int ring);
int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring); int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
void radeon_fence_process(struct radeon_device *rdev, int ring); void radeon_fence_process(struct radeon_device *rdev, int ring);
bool radeon_fence_signaled(struct radeon_fence *fence); bool radeon_fence_signaled(struct radeon_fence *fence);
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool interruptible, long timeout);
int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
int radeon_fence_wait_next(struct radeon_device *rdev, int ring); int radeon_fence_wait_next(struct radeon_device *rdev, int ring);
int radeon_fence_wait_empty(struct radeon_device *rdev, int ring); int radeon_fence_wait_empty(struct radeon_device *rdev, int ring);
@ -474,7 +476,6 @@ struct radeon_bo_va {
/* protected by bo being reserved */ /* protected by bo being reserved */
struct list_head bo_list; struct list_head bo_list;
uint32_t flags; uint32_t flags;
uint64_t addr;
struct radeon_fence *last_pt_update; struct radeon_fence *last_pt_update;
unsigned ref_count; unsigned ref_count;

View File

@ -2095,7 +2095,7 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
struct radeon_i2c_bus_rec i2c_bus; struct radeon_i2c_bus_rec i2c_bus;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
if (!atom_parse_data_header(mode_info->atom_context, index, NULL, if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
@ -2575,7 +2575,7 @@ static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
bool valid; bool valid;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
if (!atom_parse_data_header(mode_info->atom_context, index, NULL, if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
@ -2666,7 +2666,7 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
bool valid; bool valid;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
u8 *power_state_offset; u8 *power_state_offset;

View File

@ -31,6 +31,7 @@
#include "atom.h" #include "atom.h"
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/acpi.h>
/* /*
* BIOS. * BIOS.
*/ */

View File

@ -34,7 +34,6 @@
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/pmac_feature.h> #include <asm/pmac_feature.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/pci-bridge.h>
#endif /* CONFIG_PPC_PMAC */ #endif /* CONFIG_PPC_PMAC */
/* from radeon_legacy_encoder.c */ /* from radeon_legacy_encoder.c */

View File

@ -34,6 +34,7 @@
#include "atom.h" #include "atom.h"
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/vga_switcheroo.h>
static int radeon_dp_handle_hpd(struct drm_connector *connector) static int radeon_dp_handle_hpd(struct drm_connector *connector)
{ {
@ -344,6 +345,11 @@ static void radeon_connector_get_edid(struct drm_connector *connector)
else if (radeon_connector->ddc_bus) else if (radeon_connector->ddc_bus)
radeon_connector->edid = drm_get_edid(&radeon_connector->base, radeon_connector->edid = drm_get_edid(&radeon_connector->base,
&radeon_connector->ddc_bus->adapter); &radeon_connector->ddc_bus->adapter);
} else if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC &&
connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&
radeon_connector->ddc_bus) {
radeon_connector->edid = drm_get_edid_switcheroo(&radeon_connector->base,
&radeon_connector->ddc_bus->adapter);
} else if (radeon_connector->ddc_bus) { } else if (radeon_connector->ddc_bus) {
radeon_connector->edid = drm_get_edid(&radeon_connector->base, radeon_connector->edid = drm_get_edid(&radeon_connector->base,
&radeon_connector->ddc_bus->adapter); &radeon_connector->ddc_bus->adapter);

View File

@ -31,6 +31,7 @@
#include <drm/drm_crtc_helper.h> #include <drm/drm_crtc_helper.h>
#include <drm/radeon_drm.h> #include <drm/radeon_drm.h>
#include <linux/vgaarb.h> #include <linux/vgaarb.h>
#include <linux/vga_switcheroo.h>
#include "radeon_reg.h" #include "radeon_reg.h"
#include "radeon.h" #include "radeon.h"
#include "atom.h" #include "atom.h"
@ -1203,9 +1204,9 @@ static void radeon_check_arguments(struct radeon_device *rdev)
radeon_vm_size = 4; radeon_vm_size = 4;
} }
/* /*
* Max GPUVM size for Cayman, SI and CI are 40 bits. * Max GPUVM size for Cayman, SI and CI are 40 bits.
*/ */
if (radeon_vm_size > 1024) { if (radeon_vm_size > 1024) {
dev_warn(rdev->dev, "VM size (%d) too large, max is 1TB\n", dev_warn(rdev->dev, "VM size (%d) too large, max is 1TB\n",
radeon_vm_size); radeon_vm_size);
@ -1278,9 +1279,9 @@ int radeon_device_init(struct radeon_device *rdev,
} }
rdev->fence_context = fence_context_alloc(RADEON_NUM_RINGS); rdev->fence_context = fence_context_alloc(RADEON_NUM_RINGS);
DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X).\n", DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
radeon_family_name[rdev->family], pdev->vendor, pdev->device, radeon_family_name[rdev->family], pdev->vendor, pdev->device,
pdev->subsystem_vendor, pdev->subsystem_device); pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
/* mutex initialization are all done here so we /* mutex initialization are all done here so we
* can recall function without having locking issues */ * can recall function without having locking issues */
@ -1348,13 +1349,6 @@ int radeon_device_init(struct radeon_device *rdev,
(rdev->family <= CHIP_RS740)) (rdev->family <= CHIP_RS740))
rdev->need_dma32 = true; rdev->need_dma32 = true;
dma_bits = rdev->need_dma32 ? 32 : 40;
r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
if (r) {
rdev->need_dma32 = true;
dma_bits = 32;
printk(KERN_WARNING "radeon: No suitable DMA available.\n");
}
/* Registers mapping */ /* Registers mapping */
/* TODO: block userspace mapping of io register */ /* TODO: block userspace mapping of io register */

View File

@ -351,6 +351,7 @@ radeon_crtc_set_config(struct drm_mode_set *set)
/* drop the power reference we got coming in here */ /* drop the power reference we got coming in here */
// pm_runtime_put_autosuspend(dev->dev); // pm_runtime_put_autosuspend(dev->dev);
return ret; return ret;
} }
static const struct drm_crtc_funcs radeon_crtc_funcs = { static const struct drm_crtc_funcs radeon_crtc_funcs = {
@ -584,7 +585,7 @@ static void avivo_reduce_ratio(unsigned *nom, unsigned *den,
*den /= tmp; *den /= tmp;
/* make sure nominator is large enough */ /* make sure nominator is large enough */
if (*nom < nom_min) { if (*nom < nom_min) {
tmp = DIV_ROUND_UP(nom_min, *nom); tmp = DIV_ROUND_UP(nom_min, *nom);
*nom *= tmp; *nom *= tmp;
*den *= tmp; *den *= tmp;
@ -624,7 +625,7 @@ static void avivo_get_fb_ref_div(unsigned nom, unsigned den, unsigned post_div,
*fb_div = DIV_ROUND_CLOSEST(nom * *ref_div * post_div, den); *fb_div = DIV_ROUND_CLOSEST(nom * *ref_div * post_div, den);
/* limit fb divider to its maximum */ /* limit fb divider to its maximum */
if (*fb_div > fb_div_max) { if (*fb_div > fb_div_max) {
*ref_div = DIV_ROUND_CLOSEST(*ref_div * fb_div_max, *fb_div); *ref_div = DIV_ROUND_CLOSEST(*ref_div * fb_div_max, *fb_div);
*fb_div = fb_div_max; *fb_div = fb_div_max;
} }
@ -1326,6 +1327,9 @@ void radeon_modeset_fini(struct radeon_device *rdev)
{ {
kfree(rdev->mode_info.bios_hardcoded_edid); kfree(rdev->mode_info.bios_hardcoded_edid);
/* free i2c buses */
radeon_i2c_fini(rdev);
if (rdev->mode_info.mode_config_initialized) { if (rdev->mode_info.mode_config_initialized) {
// radeon_afmt_fini(rdev); // radeon_afmt_fini(rdev);
// drm_kms_helper_poll_fini(rdev->ddev); // drm_kms_helper_poll_fini(rdev->ddev);
@ -1333,8 +1337,6 @@ void radeon_modeset_fini(struct radeon_device *rdev)
// drm_mode_config_cleanup(rdev->ddev); // drm_mode_config_cleanup(rdev->ddev);
rdev->mode_info.mode_config_initialized = false; rdev->mode_info.mode_config_initialized = false;
} }
/* free i2c buses */
radeon_i2c_fini(rdev);
} }
static bool is_hdtv_mode(const struct drm_display_mode *mode) static bool is_hdtv_mode(const struct drm_display_mode *mode)

View File

@ -89,8 +89,16 @@ static int radeon_dp_mst_set_stream_attrib(struct radeon_encoder *primary,
WREG32(NI_DP_MSE_SAT_UPDATE + primary->offset, 1); WREG32(NI_DP_MSE_SAT_UPDATE + primary->offset, 1);
do { do {
unsigned value1, value2;
udelay(10);
temp = RREG32(NI_DP_MSE_SAT_UPDATE + primary->offset); temp = RREG32(NI_DP_MSE_SAT_UPDATE + primary->offset);
} while ((temp & 0x1) && retries++ < 10000);
value1 = temp & NI_DP_MSE_SAT_UPDATE_MASK;
value2 = temp & NI_DP_MSE_16_MTP_KEEPOUT;
if (!value1 && !value2)
break;
} while (retries++ < 50);
if (retries == 10000) if (retries == 10000)
DRM_ERROR("timed out waitin for SAT update %d\n", primary->offset); DRM_ERROR("timed out waitin for SAT update %d\n", primary->offset);
@ -150,7 +158,7 @@ static int radeon_dp_mst_update_stream_attribs(struct radeon_connector *mst_conn
return 0; return 0;
} }
static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, uint32_t y) static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, s64 avg_time_slots_per_mtp)
{ {
struct drm_device *dev = mst->base.dev; struct drm_device *dev = mst->base.dev;
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
@ -158,6 +166,8 @@ static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, ui
uint32_t val, temp; uint32_t val, temp;
uint32_t offset = radeon_atom_set_enc_offset(mst_enc->fe); uint32_t offset = radeon_atom_set_enc_offset(mst_enc->fe);
int retries = 0; int retries = 0;
uint32_t x = drm_fixp2int(avg_time_slots_per_mtp);
uint32_t y = drm_fixp2int_ceil((avg_time_slots_per_mtp - x) << 26);
val = NI_DP_MSE_RATE_X(x) | NI_DP_MSE_RATE_Y(y); val = NI_DP_MSE_RATE_X(x) | NI_DP_MSE_RATE_Y(y);
@ -165,6 +175,7 @@ static int radeon_dp_mst_set_vcp_size(struct radeon_encoder *mst, uint32_t x, ui
do { do {
temp = RREG32(NI_DP_MSE_RATE_UPDATE + offset); temp = RREG32(NI_DP_MSE_RATE_UPDATE + offset);
udelay(10);
} while ((temp & 0x1) && (retries++ < 10000)); } while ((temp & 0x1) && (retries++ < 10000));
if (retries >= 10000) if (retries >= 10000)
@ -246,14 +257,8 @@ radeon_dp_mst_connector_destroy(struct drm_connector *connector)
kfree(radeon_connector); kfree(radeon_connector);
} }
static int radeon_connector_dpms(struct drm_connector *connector, int mode)
{
DRM_DEBUG_KMS("\n");
return 0;
}
static const struct drm_connector_funcs radeon_dp_mst_connector_funcs = { static const struct drm_connector_funcs radeon_dp_mst_connector_funcs = {
.dpms = radeon_connector_dpms, .dpms = drm_helper_connector_dpms,
.detect = radeon_dp_mst_detect, .detect = radeon_dp_mst_detect,
.fill_modes = drm_helper_probe_single_connector_modes, .fill_modes = drm_helper_probe_single_connector_modes,
.destroy = radeon_dp_mst_connector_destroy, .destroy = radeon_dp_mst_connector_destroy,
@ -394,7 +399,7 @@ radeon_mst_encoder_dpms(struct drm_encoder *encoder, int mode)
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct radeon_crtc *radeon_crtc; struct radeon_crtc *radeon_crtc;
int ret, slots; int ret, slots;
s64 fixed_pbn, fixed_pbn_per_slot, avg_time_slots_per_mtp;
if (!ASIC_IS_DCE5(rdev)) { if (!ASIC_IS_DCE5(rdev)) {
DRM_ERROR("got mst dpms on non-DCE5\n"); DRM_ERROR("got mst dpms on non-DCE5\n");
return; return;
@ -456,7 +461,11 @@ radeon_mst_encoder_dpms(struct drm_encoder *encoder, int mode)
mst_enc->enc_active = true; mst_enc->enc_active = true;
radeon_dp_mst_update_stream_attribs(radeon_connector->mst_port, primary); radeon_dp_mst_update_stream_attribs(radeon_connector->mst_port, primary);
radeon_dp_mst_set_vcp_size(radeon_encoder, slots, 0);
fixed_pbn = drm_int2fixp(mst_enc->pbn);
fixed_pbn_per_slot = drm_int2fixp(radeon_connector->mst_port->mst_mgr.pbn_div);
avg_time_slots_per_mtp = drm_fixp_div(fixed_pbn, fixed_pbn_per_slot);
radeon_dp_mst_set_vcp_size(radeon_encoder, avg_time_slots_per_mtp);
atombios_dig_encoder_setup2(&primary->base, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0, atombios_dig_encoder_setup2(&primary->base, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0,
mst_enc->fe); mst_enc->fe);
@ -510,6 +519,7 @@ static bool radeon_mst_mode_fixup(struct drm_encoder *encoder,
{ {
struct radeon_encoder_mst *mst_enc; struct radeon_encoder_mst *mst_enc;
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
struct radeon_connector_atom_dig *dig_connector;
int bpp = 24; int bpp = 24;
mst_enc = radeon_encoder->enc_priv; mst_enc = radeon_encoder->enc_priv;
@ -523,14 +533,11 @@ static bool radeon_mst_mode_fixup(struct drm_encoder *encoder,
drm_mode_set_crtcinfo(adjusted_mode, 0); drm_mode_set_crtcinfo(adjusted_mode, 0);
{ dig_connector = mst_enc->connector->con_priv;
struct radeon_connector_atom_dig *dig_connector; dig_connector->dp_lane_count = drm_dp_max_lane_count(dig_connector->dpcd);
dig_connector = mst_enc->connector->con_priv; dig_connector->dp_clock = drm_dp_max_link_rate(dig_connector->dpcd);
dig_connector->dp_lane_count = drm_dp_max_lane_count(dig_connector->dpcd); DRM_DEBUG_KMS("dig clock %p %d %d\n", dig_connector,
dig_connector->dp_clock = drm_dp_max_link_rate(dig_connector->dpcd); dig_connector->dp_lane_count, dig_connector->dp_clock);
DRM_DEBUG_KMS("dig clock %p %d %d\n", dig_connector,
dig_connector->dp_lane_count, dig_connector->dp_clock);
}
return true; return true;
} }

View File

@ -39,9 +39,9 @@ struct drm_framebuffer *main_fb;
struct drm_gem_object *main_fb_obj; struct drm_gem_object *main_fb_obj;
/* object hierarchy - /* object hierarchy -
this contains a helper + a radeon fb * this contains a helper + a radeon fb
the helper contains a pointer to radeon framebuffer baseclass. * the helper contains a pointer to radeon framebuffer baseclass.
*/ */
struct radeon_fbdev { struct radeon_fbdev {
struct drm_fb_helper helper; struct drm_fb_helper helper;
struct radeon_framebuffer rfb; struct radeon_framebuffer rfb;
@ -309,6 +309,10 @@ int radeon_fbdev_init(struct radeon_device *rdev)
int bpp_sel = 32; int bpp_sel = 32;
int ret; int ret;
/* don't enable fbdev if no connectors */
if (list_empty(&rdev->ddev->mode_config.connector_list))
return 0;
/* select 8 bpp console on RN50 or 16MB cards */ /* select 8 bpp console on RN50 or 16MB cards */
if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32*1024*1024)) if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32*1024*1024))
bpp_sel = 8; bpp_sel = 8;

View File

@ -408,7 +408,7 @@ static bool radeon_fence_enable_signaling(struct fence *f)
* *
* Check if the requested fence has signaled (all asics). * Check if the requested fence has signaled (all asics).
* Returns true if the fence has signaled or false if it has not. * Returns true if the fence has signaled or false if it has not.
*/ */
bool radeon_fence_signaled(struct radeon_fence *fence) bool radeon_fence_signaled(struct radeon_fence *fence)
{ {
if (!fence) if (!fence)
@ -475,36 +475,76 @@ static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev,
return timeout; return timeout;
/* enable IRQs and tracing */ /* enable IRQs and tracing */
for (i = 0; i < RADEON_NUM_RINGS; ++i) { for (i = 0; i < RADEON_NUM_RINGS; ++i) {
if (!target_seq[i]) if (!target_seq[i])
continue; continue;
trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]); trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]);
radeon_irq_kms_sw_irq_get(rdev, i); radeon_irq_kms_sw_irq_get(rdev, i);
} }
if (intr) { if (intr) {
r = wait_event_interruptible_timeout(rdev->fence_queue, ( r = wait_event_interruptible_timeout(rdev->fence_queue, (
radeon_fence_any_seq_signaled(rdev, target_seq) radeon_fence_any_seq_signaled(rdev, target_seq)
|| rdev->needs_reset), timeout); || rdev->needs_reset), timeout);
} else { } else {
r = wait_event_timeout(rdev->fence_queue, ( r = wait_event_timeout(rdev->fence_queue, (
radeon_fence_any_seq_signaled(rdev, target_seq) radeon_fence_any_seq_signaled(rdev, target_seq)
|| rdev->needs_reset), timeout); || rdev->needs_reset), timeout);
} }
if (rdev->needs_reset) if (rdev->needs_reset)
r = -EDEADLK; r = -EDEADLK;
for (i = 0; i < RADEON_NUM_RINGS; ++i) { for (i = 0; i < RADEON_NUM_RINGS; ++i) {
if (!target_seq[i]) if (!target_seq[i])
continue; continue;
radeon_irq_kms_sw_irq_put(rdev, i); radeon_irq_kms_sw_irq_put(rdev, i);
trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]); trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]);
} }
return r; return r;
}
/**
* radeon_fence_wait_timeout - wait for a fence to signal with timeout
*
* @fence: radeon fence object
* @intr: use interruptible sleep
*
* Wait for the requested fence to signal (all asics).
* @intr selects whether to use interruptable (true) or non-interruptable
* (false) sleep when waiting for the fence.
* @timeout: maximum time to wait, or MAX_SCHEDULE_TIMEOUT for infinite wait
* Returns remaining time if the sequence number has passed, 0 when
* the wait timeout, or an error for all other cases.
*/
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeout)
{
uint64_t seq[RADEON_NUM_RINGS] = {};
long r;
int r_sig;
/*
* This function should not be called on !radeon fences.
* If this is the case, it would mean this function can
* also be called on radeon fences belonging to another card.
* exclusive_lock is not held in that case.
*/
if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
return fence_wait(&fence->base, intr);
seq[fence->ring] = fence->seq;
r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, timeout);
if (r <= 0) {
return r;
}
r_sig = fence_signal(&fence->base);
if (!r_sig)
FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
return r;
} }
/** /**
@ -520,28 +560,12 @@ static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev,
*/ */
int radeon_fence_wait(struct radeon_fence *fence, bool intr) int radeon_fence_wait(struct radeon_fence *fence, bool intr)
{ {
uint64_t seq[RADEON_NUM_RINGS] = {}; long r = radeon_fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT);
long r; if (r > 0) {
return 0;
/* } else {
* This function should not be called on !radeon fences. return r;
* If this is the case, it would mean this function can
* also be called on radeon fences belonging to another card.
* exclusive_lock is not held in that case.
*/
if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
return fence_wait(&fence->base, intr);
seq[fence->ring] = fence->seq;
r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
if (r < 0) {
return r;
} }
r = fence_signal(&fence->base);
if (!r)
FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
return 0;
} }
/** /**

View File

@ -66,8 +66,8 @@ int radeon_gart_table_ram_alloc(struct radeon_device *rdev)
{ {
void *ptr; void *ptr;
ptr = pci_alloc_consistent(rdev->pdev, rdev->gart.table_size, ptr = pci_alloc_consistent(rdev->pdev, rdev->gart.table_size,
&rdev->gart.table_addr); &rdev->gart.table_addr);
if (ptr == NULL) { if (ptr == NULL) {
return -ENOMEM; return -ENOMEM;
} }

View File

@ -257,7 +257,6 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
struct drm_file *filp) struct drm_file *filp)
{ {
struct radeon_device *rdev = dev->dev_private;
struct drm_radeon_gem_busy *args = data; struct drm_radeon_gem_busy *args = data;
struct drm_gem_object *gobj; struct drm_gem_object *gobj;
struct radeon_bo *robj; struct radeon_bo *robj;
@ -272,7 +271,6 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
r = radeon_bo_wait(robj, &cur_placement, true); r = radeon_bo_wait(robj, &cur_placement, true);
args->domain = radeon_mem_type_to_domain(cur_placement); args->domain = radeon_mem_type_to_domain(cur_placement);
drm_gem_object_unreference_unlocked(gobj); drm_gem_object_unreference_unlocked(gobj);
r = radeon_gem_handle_lockup(rdev, r);
return r; return r;
} }

View File

@ -274,7 +274,7 @@ int radeon_ib_ring_tests(struct radeon_device *rdev)
if (i == RADEON_RING_TYPE_GFX_INDEX) { if (i == RADEON_RING_TYPE_GFX_INDEX) {
/* oh, oh, that's really bad */ /* oh, oh, that's really bad */
DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r); DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r);
rdev->accel_working = false; rdev->accel_working = false;
return r; return r;
} else { } else {
@ -304,7 +304,7 @@ static int radeon_debugfs_sa_info(struct seq_file *m, void *data)
} }
static struct drm_info_list radeon_debugfs_sa_list[] = { static struct drm_info_list radeon_debugfs_sa_list[] = {
{"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL}, {"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL},
}; };
#endif #endif

View File

@ -156,10 +156,12 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
if (r) { if (r) {
return r; return r;
} }
rdev->ddev->vblank_disable_allowed = true;
/* enable msi */ /* enable msi */
rdev->msi_enabled = 0; rdev->msi_enabled = 0;
rdev->irq.installed = true; rdev->irq.installed = true;
r = drm_irq_install(rdev->ddev, rdev->ddev->pdev->irq); r = drm_irq_install(rdev->ddev, rdev->ddev->pdev->irq);
if (r) { if (r) {
rdev->irq.installed = false; rdev->irq.installed = false;

View File

@ -33,7 +33,7 @@
struct radeon_device; struct radeon_device;
bool radeon_kfd_init(void); int radeon_kfd_init(void);
void radeon_kfd_fini(void); void radeon_kfd_fini(void);
void radeon_kfd_suspend(struct radeon_device *rdev); void radeon_kfd_suspend(struct radeon_device *rdev);

View File

@ -30,6 +30,7 @@
#include <drm/radeon_drm.h> #include <drm/radeon_drm.h>
#include "radeon_asic.h" #include "radeon_asic.h"
#include <linux/vga_switcheroo.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>

View File

@ -331,13 +331,15 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
RADEON_CRTC_DISP_REQ_EN_B)); RADEON_CRTC_DISP_REQ_EN_B));
WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl)); WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
} }
drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); if (dev->num_crtcs > radeon_crtc->crtc_id)
drm_vblank_on(dev, radeon_crtc->crtc_id);
radeon_crtc_load_lut(crtc); radeon_crtc_load_lut(crtc);
break; break;
case DRM_MODE_DPMS_STANDBY: case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND: case DRM_MODE_DPMS_SUSPEND:
case DRM_MODE_DPMS_OFF: case DRM_MODE_DPMS_OFF:
drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); if (dev->num_crtcs > radeon_crtc->crtc_id)
drm_vblank_off(dev, radeon_crtc->crtc_id);
if (radeon_crtc->crtc_id) if (radeon_crtc->crtc_id)
WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask)); WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
else { else {

View File

@ -818,52 +818,52 @@ static void radeon_legacy_tmds_int_mode_set(struct drm_encoder *encoder,
tmds_transmitter_cntl = RREG32(RADEON_TMDS_TRANSMITTER_CNTL) & tmds_transmitter_cntl = RREG32(RADEON_TMDS_TRANSMITTER_CNTL) &
~(RADEON_TMDS_TRANSMITTER_PLLRST); ~(RADEON_TMDS_TRANSMITTER_PLLRST);
if (rdev->family == CHIP_R200 || if (rdev->family == CHIP_R200 ||
rdev->family == CHIP_R100 || rdev->family == CHIP_R100 ||
ASIC_IS_R300(rdev)) ASIC_IS_R300(rdev))
tmds_transmitter_cntl &= ~(RADEON_TMDS_TRANSMITTER_PLLEN); tmds_transmitter_cntl &= ~(RADEON_TMDS_TRANSMITTER_PLLEN);
else /* RV chips got this bit reversed */ else /* RV chips got this bit reversed */
tmds_transmitter_cntl |= RADEON_TMDS_TRANSMITTER_PLLEN; tmds_transmitter_cntl |= RADEON_TMDS_TRANSMITTER_PLLEN;
fp_gen_cntl = (RREG32(RADEON_FP_GEN_CNTL) | fp_gen_cntl = (RREG32(RADEON_FP_GEN_CNTL) |
(RADEON_FP_CRTC_DONT_SHADOW_VPAR | (RADEON_FP_CRTC_DONT_SHADOW_VPAR |
RADEON_FP_CRTC_DONT_SHADOW_HEND)); RADEON_FP_CRTC_DONT_SHADOW_HEND));
fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN); fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN);
fp_gen_cntl &= ~(RADEON_FP_RMX_HVSYNC_CONTROL_EN | fp_gen_cntl &= ~(RADEON_FP_RMX_HVSYNC_CONTROL_EN |
RADEON_FP_DFP_SYNC_SEL | RADEON_FP_DFP_SYNC_SEL |
RADEON_FP_CRT_SYNC_SEL | RADEON_FP_CRT_SYNC_SEL |
RADEON_FP_CRTC_LOCK_8DOT | RADEON_FP_CRTC_LOCK_8DOT |
RADEON_FP_USE_SHADOW_EN | RADEON_FP_USE_SHADOW_EN |
RADEON_FP_CRTC_USE_SHADOW_VEND | RADEON_FP_CRTC_USE_SHADOW_VEND |
RADEON_FP_CRT_SYNC_ALT); RADEON_FP_CRT_SYNC_ALT);
if (1) /* FIXME rgbBits == 8 */ if (1) /* FIXME rgbBits == 8 */
fp_gen_cntl |= RADEON_FP_PANEL_FORMAT; /* 24 bit format */ fp_gen_cntl |= RADEON_FP_PANEL_FORMAT; /* 24 bit format */
else else
fp_gen_cntl &= ~RADEON_FP_PANEL_FORMAT;/* 18 bit format */ fp_gen_cntl &= ~RADEON_FP_PANEL_FORMAT;/* 18 bit format */
if (radeon_crtc->crtc_id == 0) { if (radeon_crtc->crtc_id == 0) {
if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) { if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) {
fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK; fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK;
if (radeon_encoder->rmx_type != RMX_OFF) if (radeon_encoder->rmx_type != RMX_OFF)
fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX; fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX;
else else
fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1; fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1;
} else } else
fp_gen_cntl &= ~RADEON_FP_SEL_CRTC2; fp_gen_cntl &= ~RADEON_FP_SEL_CRTC2;
} else { } else {
if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) { if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) {
fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK; fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK;
fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC2; fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC2;
} else } else
fp_gen_cntl |= RADEON_FP_SEL_CRTC2; fp_gen_cntl |= RADEON_FP_SEL_CRTC2;
} }
WREG32(RADEON_TMDS_PLL_CNTL, tmds_pll_cntl); WREG32(RADEON_TMDS_PLL_CNTL, tmds_pll_cntl);
WREG32(RADEON_TMDS_TRANSMITTER_CNTL, tmds_transmitter_cntl); WREG32(RADEON_TMDS_TRANSMITTER_CNTL, tmds_transmitter_cntl);
WREG32(RADEON_FP_GEN_CNTL, fp_gen_cntl); WREG32(RADEON_FP_GEN_CNTL, fp_gen_cntl);
if (rdev->is_atom_bios) if (rdev->is_atom_bios)
radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);

View File

@ -76,7 +76,7 @@ void radeon_pm_acpi_event_handler(struct radeon_device *rdev)
radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power); radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power);
} }
mutex_unlock(&rdev->pm.mutex); mutex_unlock(&rdev->pm.mutex);
} else if (rdev->pm.pm_method == PM_METHOD_PROFILE) { } else if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
if (rdev->pm.profile == PM_PROFILE_AUTO) { if (rdev->pm.profile == PM_PROFILE_AUTO) {
mutex_lock(&rdev->pm.mutex); mutex_lock(&rdev->pm.mutex);
radeon_pm_update_profile(rdev); radeon_pm_update_profile(rdev);
@ -275,7 +275,7 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
if (rdev->pm.active_crtcs & (1 << i)) { if (rdev->pm.active_crtcs & (1 << i)) {
/* This can fail if a modeset is in progress */ /* This can fail if a modeset is in progress */
if (drm_vblank_get(rdev->ddev, i) == 0) if (drm_vblank_get(rdev->ddev, i) == 0)
rdev->pm.req_vblank |= (1 << i); rdev->pm.req_vblank |= (1 << i);
else else
DRM_DEBUG_DRIVER("crtc %d no vblank, can glitch\n", DRM_DEBUG_DRIVER("crtc %d no vblank, can glitch\n",
i); i);

View File

@ -56,7 +56,7 @@ int radeon_semaphore_create(struct radeon_device *rdev,
} }
bool radeon_semaphore_emit_signal(struct radeon_device *rdev, int ridx, bool radeon_semaphore_emit_signal(struct radeon_device *rdev, int ridx,
struct radeon_semaphore *semaphore) struct radeon_semaphore *semaphore)
{ {
struct radeon_ring *ring = &rdev->ring[ridx]; struct radeon_ring *ring = &rdev->ring[ridx];
@ -73,7 +73,7 @@ bool radeon_semaphore_emit_signal(struct radeon_device *rdev, int ridx,
} }
bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ridx, bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ridx,
struct radeon_semaphore *semaphore) struct radeon_semaphore *semaphore)
{ {
struct radeon_ring *ring = &rdev->ring[ridx]; struct radeon_ring *ring = &rdev->ring[ridx];

View File

@ -722,9 +722,11 @@ static int radeon_uvd_send_msg(struct radeon_device *rdev,
return r; return r;
} }
/* multiple fence commands without any stream commands in between can /*
crash the vcpu so just try to emmit a dummy create/destroy msg to * multiple fence commands without any stream commands in between can
avoid this */ * crash the vcpu so just try to emmit a dummy create/destroy msg to
* avoid this
*/
int radeon_uvd_get_create_msg(struct radeon_device *rdev, int ring, int radeon_uvd_get_create_msg(struct radeon_device *rdev, int ring,
uint32_t handle, struct radeon_fence **fence) uint32_t handle, struct radeon_fence **fence)
{ {

View File

@ -166,7 +166,7 @@ int radeon_vce_init(struct radeon_device *rdev)
for (i = 0; i < RADEON_MAX_VCE_HANDLES; ++i) { for (i = 0; i < RADEON_MAX_VCE_HANDLES; ++i) {
atomic_set(&rdev->vce.handles[i], 0); atomic_set(&rdev->vce.handles[i], 0);
rdev->vce.filp[i] = NULL; rdev->vce.filp[i] = NULL;
} }
return 0; return 0;
} }
@ -389,7 +389,7 @@ int radeon_vce_get_create_msg(struct radeon_device *rdev, int ring,
r = radeon_ib_schedule(rdev, &ib, NULL, false); r = radeon_ib_schedule(rdev, &ib, NULL, false);
if (r) { if (r) {
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r); DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
} }
if (fence) if (fence)
@ -446,7 +446,7 @@ int radeon_vce_get_destroy_msg(struct radeon_device *rdev, int ring,
r = radeon_ib_schedule(rdev, &ib, NULL, false); r = radeon_ib_schedule(rdev, &ib, NULL, false);
if (r) { if (r) {
DRM_ERROR("radeon: failed to schedule ib (%d).\n", r); DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
} }
if (fence) if (fence)
@ -769,18 +769,18 @@ int radeon_vce_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
radeon_ring_unlock_commit(rdev, ring, false); radeon_ring_unlock_commit(rdev, ring, false);
for (i = 0; i < rdev->usec_timeout; i++) { for (i = 0; i < rdev->usec_timeout; i++) {
if (vce_v1_0_get_rptr(rdev, ring) != rptr) if (vce_v1_0_get_rptr(rdev, ring) != rptr)
break; break;
DRM_UDELAY(1); DRM_UDELAY(1);
} }
if (i < rdev->usec_timeout) { if (i < rdev->usec_timeout) {
DRM_INFO("ring test on %d succeeded in %d usecs\n", DRM_INFO("ring test on %d succeeded in %d usecs\n",
ring->idx, i); ring->idx, i);
} else { } else {
DRM_ERROR("radeon: ring %d test failed\n", DRM_ERROR("radeon: ring %d test failed\n",
ring->idx); ring->idx);
r = -ETIMEDOUT; r = -ETIMEDOUT;
} }
return r; return r;

View File

@ -611,15 +611,16 @@ uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr)
*/ */
static uint32_t radeon_vm_page_flags(uint32_t flags) static uint32_t radeon_vm_page_flags(uint32_t flags)
{ {
uint32_t hw_flags = 0; uint32_t hw_flags = 0;
hw_flags |= (flags & RADEON_VM_PAGE_VALID) ? R600_PTE_VALID : 0;
hw_flags |= (flags & RADEON_VM_PAGE_READABLE) ? R600_PTE_READABLE : 0; hw_flags |= (flags & RADEON_VM_PAGE_VALID) ? R600_PTE_VALID : 0;
hw_flags |= (flags & RADEON_VM_PAGE_WRITEABLE) ? R600_PTE_WRITEABLE : 0; hw_flags |= (flags & RADEON_VM_PAGE_READABLE) ? R600_PTE_READABLE : 0;
if (flags & RADEON_VM_PAGE_SYSTEM) { hw_flags |= (flags & RADEON_VM_PAGE_WRITEABLE) ? R600_PTE_WRITEABLE : 0;
hw_flags |= R600_PTE_SYSTEM; if (flags & RADEON_VM_PAGE_SYSTEM) {
hw_flags |= (flags & RADEON_VM_PAGE_SNOOPED) ? R600_PTE_SNOOPED : 0; hw_flags |= R600_PTE_SYSTEM;
} hw_flags |= (flags & RADEON_VM_PAGE_SNOOPED) ? R600_PTE_SNOOPED : 0;
return hw_flags; }
return hw_flags;
} }
/** /**

View File

@ -795,7 +795,7 @@ static int rs780_parse_power_table(struct radeon_device *rdev)
union pplib_clock_info *clock_info; union pplib_clock_info *clock_info;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
struct igp_ps *ps; struct igp_ps *ps;

View File

@ -209,7 +209,7 @@ static struct rv6xx_sclk_stepping rv6xx_next_vco_step(struct radeon_device *rdev
static bool rv6xx_can_step_post_div(struct radeon_device *rdev, static bool rv6xx_can_step_post_div(struct radeon_device *rdev,
struct rv6xx_sclk_stepping *cur, struct rv6xx_sclk_stepping *cur,
struct rv6xx_sclk_stepping *target) struct rv6xx_sclk_stepping *target)
{ {
return (cur->post_divider > target->post_divider) && return (cur->post_divider > target->post_divider) &&
((cur->vco_frequency * target->post_divider) <= ((cur->vco_frequency * target->post_divider) <=
@ -239,7 +239,7 @@ static bool rv6xx_reached_stepping_target(struct radeon_device *rdev,
static void rv6xx_generate_steps(struct radeon_device *rdev, static void rv6xx_generate_steps(struct radeon_device *rdev,
u32 low, u32 high, u32 low, u32 high,
u32 start_index, u8 *end_index) u32 start_index, u8 *end_index)
{ {
struct rv6xx_sclk_stepping cur; struct rv6xx_sclk_stepping cur;
struct rv6xx_sclk_stepping target; struct rv6xx_sclk_stepping target;
@ -1356,23 +1356,23 @@ static void rv6xx_set_dpm_event_sources(struct radeon_device *rdev, u32 sources)
enum radeon_dpm_event_src dpm_event_src; enum radeon_dpm_event_src dpm_event_src;
switch (sources) { switch (sources) {
case 0: case 0:
default: default:
want_thermal_protection = false; want_thermal_protection = false;
break; break;
case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL): case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL; dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL;
break; break;
case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL): case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL; dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL;
break; break;
case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) | case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) |
(1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)): (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL; dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL;
break; break;
} }
@ -1879,7 +1879,7 @@ static int rv6xx_parse_power_table(struct radeon_device *rdev)
union pplib_clock_info *clock_info; union pplib_clock_info *clock_info;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
struct rv6xx_ps *ps; struct rv6xx_ps *ps;

View File

@ -36,28 +36,28 @@ u32 rv740_get_decoded_reference_divider(u32 encoded_ref)
u32 ref = 0; u32 ref = 0;
switch (encoded_ref) { switch (encoded_ref) {
case 0: case 0:
ref = 1; ref = 1;
break; break;
case 16: case 16:
ref = 2; ref = 2;
break; break;
case 17: case 17:
ref = 3; ref = 3;
break; break;
case 18: case 18:
ref = 2; ref = 2;
break; break;
case 19: case 19:
ref = 3; ref = 3;
break; break;
case 20: case 20:
ref = 4; ref = 4;
break; break;
case 21: case 21:
ref = 5; ref = 5;
break; break;
default: default:
DRM_ERROR("Invalid encoded Reference Divider\n"); DRM_ERROR("Invalid encoded Reference Divider\n");
ref = 0; ref = 0;
break; break;

View File

@ -345,27 +345,27 @@ static int rv770_encode_yclk_post_div(u32 postdiv, u32 *encoded_postdiv)
int ret = 0; int ret = 0;
switch (postdiv) { switch (postdiv) {
case 1: case 1:
*encoded_postdiv = 0; *encoded_postdiv = 0;
break; break;
case 2: case 2:
*encoded_postdiv = 1; *encoded_postdiv = 1;
break; break;
case 4: case 4:
*encoded_postdiv = 2; *encoded_postdiv = 2;
break; break;
case 8: case 8:
*encoded_postdiv = 3; *encoded_postdiv = 3;
break; break;
case 16: case 16:
*encoded_postdiv = 4; *encoded_postdiv = 4;
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
break; break;
} }
return ret; return ret;
} }
u32 rv770_map_clkf_to_ibias(struct radeon_device *rdev, u32 clkf) u32 rv770_map_clkf_to_ibias(struct radeon_device *rdev, u32 clkf)
@ -1175,15 +1175,15 @@ static int rv770_init_smc_table(struct radeon_device *rdev,
rv770_populate_smc_mvdd_table(rdev, table); rv770_populate_smc_mvdd_table(rdev, table);
switch (rdev->pm.int_thermal_type) { switch (rdev->pm.int_thermal_type) {
case THERMAL_TYPE_RV770: case THERMAL_TYPE_RV770:
case THERMAL_TYPE_ADT7473_WITH_INTERNAL: case THERMAL_TYPE_ADT7473_WITH_INTERNAL:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
break; break;
case THERMAL_TYPE_NONE: case THERMAL_TYPE_NONE:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
break; break;
case THERMAL_TYPE_EXTERNAL_GPIO: case THERMAL_TYPE_EXTERNAL_GPIO:
default: default:
table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL; table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
break; break;
} }
@ -1567,18 +1567,18 @@ void rv770_reset_smio_status(struct radeon_device *rdev)
sw_smio_index = sw_smio_index =
(RREG32(GENERAL_PWRMGT) & SW_SMIO_INDEX_MASK) >> SW_SMIO_INDEX_SHIFT; (RREG32(GENERAL_PWRMGT) & SW_SMIO_INDEX_MASK) >> SW_SMIO_INDEX_SHIFT;
switch (sw_smio_index) { switch (sw_smio_index) {
case 3: case 3:
vid_smio_cntl = RREG32(S3_VID_LOWER_SMIO_CNTL); vid_smio_cntl = RREG32(S3_VID_LOWER_SMIO_CNTL);
break; break;
case 2: case 2:
vid_smio_cntl = RREG32(S2_VID_LOWER_SMIO_CNTL); vid_smio_cntl = RREG32(S2_VID_LOWER_SMIO_CNTL);
break; break;
case 1: case 1:
vid_smio_cntl = RREG32(S1_VID_LOWER_SMIO_CNTL); vid_smio_cntl = RREG32(S1_VID_LOWER_SMIO_CNTL);
break; break;
case 0: case 0:
return; return;
default: default:
vid_smio_cntl = pi->s0_vid_lower_smio_cntl; vid_smio_cntl = pi->s0_vid_lower_smio_cntl;
break; break;
} }
@ -1817,21 +1817,21 @@ static void rv770_set_dpm_event_sources(struct radeon_device *rdev, u32 sources)
enum radeon_dpm_event_src dpm_event_src; enum radeon_dpm_event_src dpm_event_src;
switch (sources) { switch (sources) {
case 0: case 0:
default: default:
want_thermal_protection = false; want_thermal_protection = false;
break; break;
case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL): case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL; dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL;
break; break;
case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL): case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL; dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL;
break; break;
case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) | case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) |
(1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)): (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL; dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL;
@ -2273,7 +2273,7 @@ int rv7xx_parse_power_table(struct radeon_device *rdev)
union pplib_clock_info *clock_info; union pplib_clock_info *clock_info;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
struct rv7xx_ps *ps; struct rv7xx_ps *ps;

File diff suppressed because it is too large Load Diff

View File

@ -499,7 +499,7 @@ static const struct si_cac_config_reg lcac_pitcairn[] =
static const struct si_cac_config_reg cac_override_pitcairn[] = static const struct si_cac_config_reg cac_override_pitcairn[] =
{ {
{ 0xFFFFFFFF } { 0xFFFFFFFF }
}; };
static const struct si_powertune_data powertune_data_pitcairn = static const struct si_powertune_data powertune_data_pitcairn =
@ -991,7 +991,7 @@ static const struct si_cac_config_reg lcac_cape_verde[] =
static const struct si_cac_config_reg cac_override_cape_verde[] = static const struct si_cac_config_reg cac_override_cape_verde[] =
{ {
{ 0xFFFFFFFF } { 0xFFFFFFFF }
}; };
static const struct si_powertune_data powertune_data_cape_verde = static const struct si_powertune_data powertune_data_cape_verde =
@ -1762,9 +1762,9 @@ static void si_fan_ctrl_set_default_mode(struct radeon_device *rdev);
static struct si_power_info *si_get_pi(struct radeon_device *rdev) static struct si_power_info *si_get_pi(struct radeon_device *rdev)
{ {
struct si_power_info *pi = rdev->pm.dpm.priv; struct si_power_info *pi = rdev->pm.dpm.priv;
return pi; return pi;
} }
static void si_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coeffients *coeff, static void si_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coeffients *coeff,
@ -3157,9 +3157,9 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
} }
} }
for (i = 0; i < ps->performance_level_count; i++) for (i = 0; i < ps->performance_level_count; i++)
btc_adjust_clock_combinations(rdev, max_limits, btc_adjust_clock_combinations(rdev, max_limits,
&ps->performance_levels[i]); &ps->performance_levels[i]);
for (i = 0; i < ps->performance_level_count; i++) { for (i = 0; i < ps->performance_level_count; i++) {
if (ps->performance_levels[i].vddc < min_vce_voltage) if (ps->performance_levels[i].vddc < min_vce_voltage)
@ -3298,7 +3298,7 @@ static void si_set_dpm_event_sources(struct radeon_device *rdev, u32 sources)
case 0: case 0:
default: default:
want_thermal_protection = false; want_thermal_protection = false;
break; break;
case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL): case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL):
want_thermal_protection = true; want_thermal_protection = true;
dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL; dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL;
@ -3500,7 +3500,7 @@ static int si_process_firmware_header(struct radeon_device *rdev)
if (ret) if (ret)
return ret; return ret;
si_pi->state_table_start = tmp; si_pi->state_table_start = tmp;
ret = si_read_smc_sram_dword(rdev, ret = si_read_smc_sram_dword(rdev,
SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
@ -3659,7 +3659,7 @@ static void si_program_response_times(struct radeon_device *rdev)
si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_mvdd_chg_time, 1); si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_mvdd_chg_time, 1);
voltage_response_time = (u32)rdev->pm.dpm.voltage_response_time; voltage_response_time = (u32)rdev->pm.dpm.voltage_response_time;
backbias_response_time = (u32)rdev->pm.dpm.backbias_response_time; backbias_response_time = (u32)rdev->pm.dpm.backbias_response_time;
if (voltage_response_time == 0) if (voltage_response_time == 0)
voltage_response_time = 1000; voltage_response_time = 1000;
@ -3767,7 +3767,7 @@ static void si_setup_bsp(struct radeon_device *rdev)
&pi->pbsu); &pi->pbsu);
pi->dsp = BSP(pi->bsp) | BSU(pi->bsu); pi->dsp = BSP(pi->bsp) | BSU(pi->bsu);
pi->psp = BSP(pi->pbsp) | BSU(pi->pbsu); pi->psp = BSP(pi->pbsp) | BSU(pi->pbsu);
WREG32(CG_BSP, pi->dsp); WREG32(CG_BSP, pi->dsp);
@ -4315,7 +4315,7 @@ static int si_populate_memory_timing_parameters(struct radeon_device *rdev,
radeon_atom_set_engine_dram_timings(rdev, radeon_atom_set_engine_dram_timings(rdev,
pl->sclk, pl->sclk,
pl->mclk); pl->mclk);
dram_timing = RREG32(MC_ARB_DRAM_TIMING); dram_timing = RREG32(MC_ARB_DRAM_TIMING);
dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2); dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
@ -4350,7 +4350,7 @@ static int si_do_program_memory_timing_parameters(struct radeon_device *rdev,
si_pi->sram_end); si_pi->sram_end);
if (ret) if (ret)
break; break;
} }
return ret; return ret;
} }
@ -4828,9 +4828,9 @@ static int si_calculate_sclk_params(struct radeon_device *rdev,
spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK; spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
spll_func_cntl_2 |= SCLK_MUX_SEL(2); spll_func_cntl_2 |= SCLK_MUX_SEL(2);
spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK; spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK;
spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv); spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv);
spll_func_cntl_3 |= SPLL_DITHEN; spll_func_cntl_3 |= SPLL_DITHEN;
if (pi->sclk_ss) { if (pi->sclk_ss) {
struct radeon_atom_ss ss; struct radeon_atom_ss ss;
@ -4937,15 +4937,15 @@ static int si_populate_mclk_value(struct radeon_device *rdev,
tmp = freq_nom / reference_clock; tmp = freq_nom / reference_clock;
tmp = tmp * tmp; tmp = tmp * tmp;
if (radeon_atombios_get_asic_ss_info(rdev, &ss, if (radeon_atombios_get_asic_ss_info(rdev, &ss,
ASIC_INTERNAL_MEMORY_SS, freq_nom)) { ASIC_INTERNAL_MEMORY_SS, freq_nom)) {
u32 clks = reference_clock * 5 / ss.rate; u32 clks = reference_clock * 5 / ss.rate;
u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom); u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom);
mpll_ss1 &= ~CLKV_MASK; mpll_ss1 &= ~CLKV_MASK;
mpll_ss1 |= CLKV(clkv); mpll_ss1 |= CLKV(clkv);
mpll_ss2 &= ~CLKS_MASK; mpll_ss2 &= ~CLKS_MASK;
mpll_ss2 |= CLKS(clks); mpll_ss2 |= CLKS(clks);
} }
} }
@ -5272,7 +5272,7 @@ static int si_convert_power_state_to_smc(struct radeon_device *rdev,
ni_pi->enable_power_containment = false; ni_pi->enable_power_containment = false;
ret = si_populate_sq_ramping_values(rdev, radeon_state, smc_state); ret = si_populate_sq_ramping_values(rdev, radeon_state, smc_state);
if (ret) if (ret)
ni_pi->enable_sq_ramping = false; ni_pi->enable_sq_ramping = false;
return si_populate_smc_t(rdev, radeon_state, smc_state); return si_populate_smc_t(rdev, radeon_state, smc_state);
@ -5443,46 +5443,46 @@ static bool si_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
case MC_SEQ_RAS_TIMING >> 2: case MC_SEQ_RAS_TIMING >> 2:
*out_reg = MC_SEQ_RAS_TIMING_LP >> 2; *out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_CAS_TIMING >> 2: case MC_SEQ_CAS_TIMING >> 2:
*out_reg = MC_SEQ_CAS_TIMING_LP >> 2; *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING >> 2: case MC_SEQ_MISC_TIMING >> 2:
*out_reg = MC_SEQ_MISC_TIMING_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
break; break;
case MC_SEQ_MISC_TIMING2 >> 2: case MC_SEQ_MISC_TIMING2 >> 2:
*out_reg = MC_SEQ_MISC_TIMING2_LP >> 2; *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
break; break;
case MC_SEQ_RD_CTL_D0 >> 2: case MC_SEQ_RD_CTL_D0 >> 2:
*out_reg = MC_SEQ_RD_CTL_D0_LP >> 2; *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
break; break;
case MC_SEQ_RD_CTL_D1 >> 2: case MC_SEQ_RD_CTL_D1 >> 2:
*out_reg = MC_SEQ_RD_CTL_D1_LP >> 2; *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_D0 >> 2: case MC_SEQ_WR_CTL_D0 >> 2:
*out_reg = MC_SEQ_WR_CTL_D0_LP >> 2; *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_D1 >> 2: case MC_SEQ_WR_CTL_D1 >> 2:
*out_reg = MC_SEQ_WR_CTL_D1_LP >> 2; *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
break; break;
case MC_PMG_CMD_EMRS >> 2: case MC_PMG_CMD_EMRS >> 2:
*out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
break; break;
case MC_PMG_CMD_MRS >> 2: case MC_PMG_CMD_MRS >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
break; break;
case MC_PMG_CMD_MRS1 >> 2: case MC_PMG_CMD_MRS1 >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
break; break;
case MC_SEQ_PMG_TIMING >> 2: case MC_SEQ_PMG_TIMING >> 2:
*out_reg = MC_SEQ_PMG_TIMING_LP >> 2; *out_reg = MC_SEQ_PMG_TIMING_LP >> 2;
break; break;
case MC_PMG_CMD_MRS2 >> 2: case MC_PMG_CMD_MRS2 >> 2:
*out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2; *out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2;
break; break;
case MC_SEQ_WR_CTL_2 >> 2: case MC_SEQ_WR_CTL_2 >> 2:
*out_reg = MC_SEQ_WR_CTL_2_LP >> 2; *out_reg = MC_SEQ_WR_CTL_2_LP >> 2;
break; break;
default: default:
result = false; result = false;
break; break;
} }
@ -5569,19 +5569,19 @@ static int si_initialize_mc_reg_table(struct radeon_device *rdev)
WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2)); WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2));
WREG32(MC_SEQ_WR_CTL_2_LP, RREG32(MC_SEQ_WR_CTL_2)); WREG32(MC_SEQ_WR_CTL_2_LP, RREG32(MC_SEQ_WR_CTL_2));
ret = radeon_atom_init_mc_reg_table(rdev, module_index, table); ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
ret = si_copy_vbios_mc_reg_table(table, si_table); ret = si_copy_vbios_mc_reg_table(table, si_table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
si_set_s0_mc_reg_index(si_table); si_set_s0_mc_reg_index(si_table);
ret = si_set_mc_special_registers(rdev, si_table); ret = si_set_mc_special_registers(rdev, si_table);
if (ret) if (ret)
goto init_mc_done; goto init_mc_done;
si_set_valid_flag(si_table); si_set_valid_flag(si_table);
@ -5722,10 +5722,10 @@ static int si_upload_mc_reg_table(struct radeon_device *rdev,
static void si_enable_voltage_control(struct radeon_device *rdev, bool enable) static void si_enable_voltage_control(struct radeon_device *rdev, bool enable)
{ {
if (enable) if (enable)
WREG32_P(GENERAL_PWRMGT, VOLT_PWRMGT_EN, ~VOLT_PWRMGT_EN); WREG32_P(GENERAL_PWRMGT, VOLT_PWRMGT_EN, ~VOLT_PWRMGT_EN);
else else
WREG32_P(GENERAL_PWRMGT, 0, ~VOLT_PWRMGT_EN); WREG32_P(GENERAL_PWRMGT, 0, ~VOLT_PWRMGT_EN);
} }
static enum radeon_pcie_gen si_get_maximum_link_speed(struct radeon_device *rdev, static enum radeon_pcie_gen si_get_maximum_link_speed(struct radeon_device *rdev,
@ -6827,7 +6827,7 @@ static int si_parse_power_table(struct radeon_device *rdev)
struct _NonClockInfoArray *non_clock_info_array; struct _NonClockInfoArray *non_clock_info_array;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
u8 *power_state_offset; u8 *power_state_offset;
struct ni_ps *ps; struct ni_ps *ps;

View File

@ -787,8 +787,8 @@ static void sumo_program_acpi_power_level(struct radeon_device *rdev)
struct atom_clock_dividers dividers; struct atom_clock_dividers dividers;
int ret; int ret;
ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
pi->acpi_pl.sclk, pi->acpi_pl.sclk,
false, &dividers); false, &dividers);
if (ret) if (ret)
return; return;
@ -1462,7 +1462,7 @@ static int sumo_parse_power_table(struct radeon_device *rdev)
struct _NonClockInfoArray *non_clock_info_array; struct _NonClockInfoArray *non_clock_info_array;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
u8 *power_state_offset; u8 *power_state_offset;
struct sumo_ps *ps; struct sumo_ps *ps;

View File

@ -369,8 +369,8 @@ static void trinity_gfx_powergating_initialize(struct radeon_device *rdev)
int ret; int ret;
u32 hw_rev = (RREG32(HW_REV) & ATI_REV_ID_MASK) >> ATI_REV_ID_SHIFT; u32 hw_rev = (RREG32(HW_REV) & ATI_REV_ID_MASK) >> ATI_REV_ID_SHIFT;
ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
25000, false, &dividers); 25000, false, &dividers);
if (ret) if (ret)
return; return;
@ -587,8 +587,8 @@ static void trinity_set_divider_value(struct radeon_device *rdev,
u32 value; u32 value;
u32 ix = index * TRINITY_SIZEOF_DPM_STATE_TABLE; u32 ix = index * TRINITY_SIZEOF_DPM_STATE_TABLE;
ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
sclk, false, &dividers); sclk, false, &dividers);
if (ret) if (ret)
return; return;
@ -597,8 +597,8 @@ static void trinity_set_divider_value(struct radeon_device *rdev,
value |= CLK_DIVIDER(dividers.post_div); value |= CLK_DIVIDER(dividers.post_div);
WREG32_SMC(SMU_SCLK_DPM_STATE_0_CNTL_0 + ix, value); WREG32_SMC(SMU_SCLK_DPM_STATE_0_CNTL_0 + ix, value);
ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
sclk/2, false, &dividers); sclk/2, false, &dividers);
if (ret) if (ret)
return; return;
@ -1045,14 +1045,14 @@ static int trinity_set_thermal_temperature_range(struct radeon_device *rdev,
int low_temp = 0 * 1000; int low_temp = 0 * 1000;
int high_temp = 255 * 1000; int high_temp = 255 * 1000;
if (low_temp < min_temp) if (low_temp < min_temp)
low_temp = min_temp; low_temp = min_temp;
if (high_temp > max_temp) if (high_temp > max_temp)
high_temp = max_temp; high_temp = max_temp;
if (high_temp < low_temp) { if (high_temp < low_temp) {
DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp); DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp);
return -EINVAL; return -EINVAL;
} }
WREG32_P(CG_THERMAL_INT_CTRL, DIG_THERM_INTH(49 + (high_temp / 1000)), ~DIG_THERM_INTH_MASK); WREG32_P(CG_THERMAL_INT_CTRL, DIG_THERM_INTH(49 + (high_temp / 1000)), ~DIG_THERM_INTH_MASK);
WREG32_P(CG_THERMAL_INT_CTRL, DIG_THERM_INTL(49 + (low_temp / 1000)), ~DIG_THERM_INTL_MASK); WREG32_P(CG_THERMAL_INT_CTRL, DIG_THERM_INTL(49 + (low_temp / 1000)), ~DIG_THERM_INTL_MASK);
@ -1737,7 +1737,7 @@ static int trinity_parse_power_table(struct radeon_device *rdev)
struct _NonClockInfoArray *non_clock_info_array; struct _NonClockInfoArray *non_clock_info_array;
union power_info *power_info; union power_info *power_info;
int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
u16 data_offset; u16 data_offset;
u8 frev, crev; u8 frev, crev;
u8 *power_state_offset; u8 *power_state_offset;
struct sumo_ps *ps; struct sumo_ps *ps;

View File

@ -53,7 +53,7 @@ static void vce_v2_0_set_sw_cg(struct radeon_device *rdev, bool gated)
WREG32(VCE_UENC_REG_CLOCK_GATING, tmp); WREG32(VCE_UENC_REG_CLOCK_GATING, tmp);
WREG32(VCE_CGTT_CLK_OVERRIDE, 0); WREG32(VCE_CGTT_CLK_OVERRIDE, 0);
} else { } else {
tmp = RREG32(VCE_CLOCK_GATING_B); tmp = RREG32(VCE_CLOCK_GATING_B);
tmp |= 0xe7; tmp |= 0xe7;
tmp &= ~0xe70000; tmp &= ~0xe70000;

View File

@ -720,9 +720,9 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
if (mem_type == TTM_PL_SYSTEM) if (mem_type == TTM_PL_SYSTEM)
break; break;
ret = (*man->func->get_node)(man, bo, place, mem); ret = (*man->func->get_node)(man, bo, place, mem);
if (unlikely(ret)) if (unlikely(ret))
return ret; return ret;
if (mem->mm_node) if (mem->mm_node)
break; break;
@ -821,8 +821,8 @@ out_unlock:
} }
bool ttm_bo_mem_compat(struct ttm_placement *placement, bool ttm_bo_mem_compat(struct ttm_placement *placement,
struct ttm_mem_reg *mem, struct ttm_mem_reg *mem,
uint32_t *new_flags) uint32_t *new_flags)
{ {
int i; int i;
@ -854,6 +854,7 @@ bool ttm_bo_mem_compat(struct ttm_placement *placement,
return false; return false;
} }
EXPORT_SYMBOL(ttm_bo_mem_compat);
int ttm_bo_validate(struct ttm_buffer_object *bo, int ttm_bo_validate(struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
@ -893,17 +894,17 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
EXPORT_SYMBOL(ttm_bo_validate); EXPORT_SYMBOL(ttm_bo_validate);
int ttm_bo_init(struct ttm_bo_device *bdev, int ttm_bo_init(struct ttm_bo_device *bdev,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
unsigned long size, unsigned long size,
enum ttm_bo_type type, enum ttm_bo_type type,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t page_alignment, uint32_t page_alignment,
bool interruptible, bool interruptible,
struct file *persistent_swap_storage, struct file *persistent_swap_storage,
size_t acc_size, size_t acc_size,
struct sg_table *sg, struct sg_table *sg,
struct reservation_object *resv, struct reservation_object *resv,
void (*destroy) (struct ttm_buffer_object *)) void (*destroy) (struct ttm_buffer_object *))
{ {
int ret = 0; int ret = 0;
unsigned long num_pages; unsigned long num_pages;
@ -920,30 +921,30 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
} }
bo->destroy = destroy; bo->destroy = destroy;
kref_init(&bo->kref); kref_init(&bo->kref);
kref_init(&bo->list_kref); kref_init(&bo->list_kref);
atomic_set(&bo->cpu_writers, 0); atomic_set(&bo->cpu_writers, 0);
INIT_LIST_HEAD(&bo->lru); INIT_LIST_HEAD(&bo->lru);
INIT_LIST_HEAD(&bo->ddestroy); INIT_LIST_HEAD(&bo->ddestroy);
INIT_LIST_HEAD(&bo->swap); INIT_LIST_HEAD(&bo->swap);
INIT_LIST_HEAD(&bo->io_reserve_lru); INIT_LIST_HEAD(&bo->io_reserve_lru);
mutex_init(&bo->wu_mutex); mutex_init(&bo->wu_mutex);
bo->bdev = bdev; bo->bdev = bdev;
bo->glob = bdev->glob; bo->glob = bdev->glob;
bo->type = type; bo->type = type;
bo->num_pages = num_pages; bo->num_pages = num_pages;
bo->mem.size = num_pages << PAGE_SHIFT; bo->mem.size = num_pages << PAGE_SHIFT;
bo->mem.mem_type = TTM_PL_SYSTEM; bo->mem.mem_type = TTM_PL_SYSTEM;
bo->mem.num_pages = bo->num_pages; bo->mem.num_pages = bo->num_pages;
bo->mem.mm_node = NULL; bo->mem.mm_node = NULL;
bo->mem.page_alignment = page_alignment; bo->mem.page_alignment = page_alignment;
bo->mem.bus.io_reserved_vm = false; bo->mem.bus.io_reserved_vm = false;
bo->mem.bus.io_reserved_count = 0; bo->mem.bus.io_reserved_count = 0;
bo->priv_flags = 0; bo->priv_flags = 0;
bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
bo->persistent_swap_storage = persistent_swap_storage; bo->persistent_swap_storage = persistent_swap_storage;
bo->acc_size = acc_size; bo->acc_size = acc_size;
bo->sg = sg; bo->sg = sg;
if (resv) { if (resv) {
bo->resv = resv; bo->resv = resv;
lockdep_assert_held(&bo->resv->lock.base); lockdep_assert_held(&bo->resv->lock.base);
@ -952,12 +953,12 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
reservation_object_init(&bo->ttm_resv); reservation_object_init(&bo->ttm_resv);
} }
atomic_inc(&bo->glob->bo_count); atomic_inc(&bo->glob->bo_count);
drm_vma_node_reset(&bo->vma_node); drm_vma_node_reset(&bo->vma_node);
/* /*
* For ttm_bo_type_device buffers, allocate * For ttm_bo_type_device buffers, allocate
* address space from the device. * address space from the device.
*/ */
if (bo->type == ttm_bo_type_device || if (bo->type == ttm_bo_type_device ||
bo->type == ttm_bo_type_sg) bo->type == ttm_bo_type_sg)
ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node, ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node,
@ -974,13 +975,19 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
if (likely(!ret)) if (likely(!ret))
ret = ttm_bo_validate(bo, placement, interruptible, false); ret = ttm_bo_validate(bo, placement, interruptible, false);
if (!resv) if (!resv) {
ttm_bo_unreserve(bo); ttm_bo_unreserve(bo);
} else if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) {
spin_lock(&bo->glob->lru_lock);
ttm_bo_add_to_lru(bo);
spin_unlock(&bo->glob->lru_lock);
}
if (unlikely(ret)) if (unlikely(ret))
ttm_bo_unref(&bo); ttm_bo_unref(&bo);
return ret; return ret;
} }
EXPORT_SYMBOL(ttm_bo_init); EXPORT_SYMBOL(ttm_bo_init);
@ -1111,31 +1118,31 @@ EXPORT_SYMBOL(ttm_bo_global_release);
int ttm_bo_global_init(struct drm_global_reference *ref) int ttm_bo_global_init(struct drm_global_reference *ref)
{ {
struct ttm_bo_global_ref *bo_ref = struct ttm_bo_global_ref *bo_ref =
container_of(ref, struct ttm_bo_global_ref, ref); container_of(ref, struct ttm_bo_global_ref, ref);
struct ttm_bo_global *glob = ref->object; struct ttm_bo_global *glob = ref->object;
int ret; int ret;
mutex_init(&glob->device_list_mutex); mutex_init(&glob->device_list_mutex);
spin_lock_init(&glob->lru_lock); spin_lock_init(&glob->lru_lock);
glob->mem_glob = bo_ref->mem_glob; glob->mem_glob = bo_ref->mem_glob;
glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32); glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
if (unlikely(glob->dummy_read_page == NULL)) { if (unlikely(glob->dummy_read_page == NULL)) {
ret = -ENOMEM; ret = -ENOMEM;
goto out_no_drp; goto out_no_drp;
} }
INIT_LIST_HEAD(&glob->swap_lru); INIT_LIST_HEAD(&glob->swap_lru);
INIT_LIST_HEAD(&glob->device_list); INIT_LIST_HEAD(&glob->device_list);
atomic_set(&glob->bo_count, 0); atomic_set(&glob->bo_count, 0);
return 0; return 0;
out_no_drp: out_no_drp:
kfree(glob); kfree(glob);
return ret; return ret;
} }
EXPORT_SYMBOL(ttm_bo_global_init); EXPORT_SYMBOL(ttm_bo_global_init);
@ -1254,13 +1261,13 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
timeout = fence_wait_timeout(fence, timeout = fence_wait_timeout(fence,
interruptible, timeout); interruptible, timeout);
} }
} }
if (timeout < 0) if (timeout < 0)
return timeout; return timeout;
if (timeout == 0) if (timeout == 0)
return -EBUSY; return -EBUSY;
reservation_object_add_excl_fence(resv, NULL); reservation_object_add_excl_fence(resv, NULL);
clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);

View File

@ -40,8 +40,6 @@
#define __pgprot(x) ((pgprot_t) { (x) } ) #define __pgprot(x) ((pgprot_t) { (x) } )
void *vmap(struct page **pages, unsigned int count,
unsigned long flags, pgprot_t prot);
void ttm_bo_free_old_node(struct ttm_buffer_object *bo) void ttm_bo_free_old_node(struct ttm_buffer_object *bo)
{ {
@ -575,6 +573,7 @@ void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
iounmap(map->virtual); iounmap(map->virtual);
break; break;
case ttm_bo_map_vmap: case ttm_bo_map_vmap:
vunmap(map->virtual);
break; break;
case ttm_bo_map_kmap: case ttm_bo_map_kmap:
kunmap(map->page); kunmap(map->page);
@ -677,3 +676,8 @@ void *vmap(struct page **pages, unsigned int count,
return vaddr; return vaddr;
}; };
void vunmap(const void *addr)
{
FreeKernelSpace((void*)addr);
}