forked from KolibriOS/kolibrios
ati-4.6.7
git-svn-id: svn://kolibrios.org@7146 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ba018197c6
commit
e9755d2ab6
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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] = {
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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, ÷rs);
|
clock, false, ÷rs);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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, ... );
|
||||||
|
@ -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, ÷rs);
|
ecclk, false, ÷rs);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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 +
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "atom.h"
|
#include "atom.h"
|
||||||
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
/*
|
/*
|
||||||
* BIOS.
|
* BIOS.
|
||||||
*/
|
*/
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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];
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
@ -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;
|
||||||
|
@ -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, ÷rs);
|
false, ÷rs);
|
||||||
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;
|
||||||
|
@ -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, ÷rs);
|
25000, false, ÷rs);
|
||||||
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, ÷rs);
|
sclk, false, ÷rs);
|
||||||
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, ÷rs);
|
sclk/2, false, ÷rs);
|
||||||
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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user