You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm radeon/nouveau/core fixes from Dave Airlie: "Mostly radeon fixes, with some nouveau bios parser, ttm fix and a fix for AST driver" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (42 commits) drm/fb-helper: don't sleep for screen unblank when an oops is in progress drm, ttm Fix uninitialized warning drm/ttm: fix the tt_populated check in ttm_tt_destroy() drm/nouveau/ttm: prevent double-free in nouveau_sgdma_create_ttm() failure path drm/nouveau/bios/init: fix thinko in INIT_CONFIGURE_MEM drm/nouveau/kms: enable for non-vga pci classes drm/nouveau/bios/init: stub opcode 0xaa drm/radeon: avoid UVD corruptions on AGP cards drm/radeon: fix panel scaling with eDP and LVDS bridges drm/radeon/dpm: rework auto performance level enable drm/radeon: Fix hmdi typo drm/radeon/dpm/rs780: fix force_performance state for same sclks drm/radeon/dpm/rs780: don't enable sclk scaling if not required drm/radeon/dpm/rs780: add some sanity checking to sclk scaling drm/radeon/dpm/rs780: use drm_mode_vrefresh() drm/udl: rip out set_need_resched drm/ast: fix the ast open key function drm/radeon/dpm: add bapm callback for kb/kv drm/radeon/dpm: add bapm callback for trinity drm/radeon/dpm: add infrastructure to properly handle bapm ...
This commit is contained in:
@@ -177,7 +177,7 @@ uint8_t ast_get_index_reg_mask(struct ast_private *ast,
|
||||
|
||||
static inline void ast_open_key(struct ast_private *ast)
|
||||
{
|
||||
ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xA1, 0xFF, 0x04);
|
||||
ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x80, 0xA8);
|
||||
}
|
||||
|
||||
#define AST_VIDMEM_SIZE_8M 0x00800000
|
||||
|
||||
@@ -407,6 +407,14 @@ static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
|
||||
struct drm_connector *connector;
|
||||
int i, j;
|
||||
|
||||
/*
|
||||
* fbdev->blank can be called from irq context in case of a panic.
|
||||
* Since we already have our own special panic handler which will
|
||||
* restore the fbdev console mode completely, just bail out early.
|
||||
*/
|
||||
if (oops_in_progress)
|
||||
return;
|
||||
|
||||
/*
|
||||
* fbdev->blank can be called from irq context in case of a panic.
|
||||
* Since we already have our own special panic handler which will
|
||||
|
||||
@@ -579,8 +579,22 @@ static void
|
||||
init_reserved(struct nvbios_init *init)
|
||||
{
|
||||
u8 opcode = nv_ro08(init->bios, init->offset);
|
||||
trace("RESERVED\t0x%02x\n", opcode);
|
||||
init->offset += 1;
|
||||
u8 length, i;
|
||||
|
||||
switch (opcode) {
|
||||
case 0xaa:
|
||||
length = 4;
|
||||
break;
|
||||
default:
|
||||
length = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
trace("RESERVED 0x%02x\t", opcode);
|
||||
for (i = 1; i < length; i++)
|
||||
cont(" 0x%02x", nv_ro08(init->bios, init->offset + i));
|
||||
cont("\n");
|
||||
init->offset += length;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1437,7 +1451,7 @@ init_configure_mem(struct nvbios_init *init)
|
||||
data = init_rdvgai(init, 0x03c4, 0x01);
|
||||
init_wrvgai(init, 0x03c4, 0x01, data | 0x20);
|
||||
|
||||
while ((addr = nv_ro32(bios, sdata)) != 0xffffffff) {
|
||||
for (; (addr = nv_ro32(bios, sdata)) != 0xffffffff; sdata += 4) {
|
||||
switch (addr) {
|
||||
case 0x10021c: /* CKE_NORMAL */
|
||||
case 0x1002d0: /* CMD_REFRESH */
|
||||
@@ -2135,6 +2149,7 @@ static struct nvbios_init_opcode {
|
||||
[0x99] = { init_zm_auxch },
|
||||
[0x9a] = { init_i2c_long_if },
|
||||
[0xa9] = { init_gpio_ne },
|
||||
[0xaa] = { init_reserved },
|
||||
};
|
||||
|
||||
#define init_opcode_nr (sizeof(init_opcode) / sizeof(init_opcode[0]))
|
||||
|
||||
@@ -278,7 +278,6 @@ nouveau_display_create(struct drm_device *dev)
|
||||
{
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct nouveau_display *disp;
|
||||
u32 pclass = dev->pdev->class >> 8;
|
||||
int ret, gen;
|
||||
|
||||
disp = drm->display = kzalloc(sizeof(*disp), GFP_KERNEL);
|
||||
@@ -340,29 +339,25 @@ nouveau_display_create(struct drm_device *dev)
|
||||
drm_kms_helper_poll_init(dev);
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
|
||||
if (nouveau_modeset == 1 ||
|
||||
(nouveau_modeset < 0 && pclass == PCI_CLASS_DISPLAY_VGA)) {
|
||||
if (drm->vbios.dcb.entries) {
|
||||
if (nv_device(drm->device)->card_type < NV_50)
|
||||
ret = nv04_display_create(dev);
|
||||
else
|
||||
ret = nv50_display_create(dev);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto disp_create_err;
|
||||
|
||||
if (dev->mode_config.num_crtc) {
|
||||
ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
|
||||
if (ret)
|
||||
goto vblank_err;
|
||||
}
|
||||
|
||||
nouveau_backlight_init(dev);
|
||||
if (drm->vbios.dcb.entries) {
|
||||
if (nv_device(drm->device)->card_type < NV_50)
|
||||
ret = nv04_display_create(dev);
|
||||
else
|
||||
ret = nv50_display_create(dev);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto disp_create_err;
|
||||
|
||||
if (dev->mode_config.num_crtc) {
|
||||
ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
|
||||
if (ret)
|
||||
goto vblank_err;
|
||||
}
|
||||
|
||||
nouveau_backlight_init(dev);
|
||||
return 0;
|
||||
|
||||
vblank_err:
|
||||
|
||||
@@ -454,7 +454,8 @@ nouveau_fbcon_init(struct drm_device *dev)
|
||||
int preferred_bpp;
|
||||
int ret;
|
||||
|
||||
if (!dev->mode_config.num_crtc)
|
||||
if (!dev->mode_config.num_crtc ||
|
||||
(dev->pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
||||
return 0;
|
||||
|
||||
fbcon = kzalloc(sizeof(struct nouveau_fbdev), GFP_KERNEL);
|
||||
|
||||
@@ -104,9 +104,7 @@ nouveau_sgdma_create_ttm(struct ttm_bo_device *bdev,
|
||||
else
|
||||
nvbe->ttm.ttm.func = &nv50_sgdma_backend;
|
||||
|
||||
if (ttm_dma_tt_init(&nvbe->ttm, bdev, size, page_flags, dummy_read_page)) {
|
||||
kfree(nvbe);
|
||||
if (ttm_dma_tt_init(&nvbe->ttm, bdev, size, page_flags, dummy_read_page))
|
||||
return NULL;
|
||||
}
|
||||
return &nvbe->ttm.ttm;
|
||||
}
|
||||
|
||||
@@ -707,8 +707,9 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
switch (connector->connector_type) {
|
||||
case DRM_MODE_CONNECTOR_DVII:
|
||||
case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
if ((radeon_connector->audio == RADEON_AUDIO_ENABLE) ||
|
||||
(drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
(radeon_connector->audio == RADEON_AUDIO_AUTO)))
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else if (radeon_connector->use_digital)
|
||||
return ATOM_ENCODER_MODE_DVI;
|
||||
@@ -718,8 +719,9 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
case DRM_MODE_CONNECTOR_DVID:
|
||||
case DRM_MODE_CONNECTOR_HDMIA:
|
||||
default:
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
if ((radeon_connector->audio == RADEON_AUDIO_ENABLE) ||
|
||||
(drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
(radeon_connector->audio == RADEON_AUDIO_AUTO)))
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else
|
||||
return ATOM_ENCODER_MODE_DVI;
|
||||
@@ -732,8 +734,9 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
|
||||
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
|
||||
return ATOM_ENCODER_MODE_DP;
|
||||
else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
else if ((radeon_connector->audio == RADEON_AUDIO_ENABLE) ||
|
||||
(drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
(radeon_connector->audio == RADEON_AUDIO_AUTO)))
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else
|
||||
return ATOM_ENCODER_MODE_DVI;
|
||||
@@ -1647,8 +1650,12 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
|
||||
atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0);
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0);
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
|
||||
/* some early dce3.2 boards have a bug in their transmitter control table */
|
||||
if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730))
|
||||
/* some dce3.x boards have a bug in their transmitter control table.
|
||||
* ACTION_ENABLE_OUTPUT can probably be dropped since ACTION_ENABLE
|
||||
* does the same thing and more.
|
||||
*/
|
||||
if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730) &&
|
||||
(rdev->family != CHIP_RS880))
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
|
||||
}
|
||||
if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
|
||||
|
||||
@@ -2340,12 +2340,6 @@ int btc_dpm_set_power_state(struct radeon_device *rdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rv770_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
|
||||
if (ret) {
|
||||
DRM_ERROR("rv770_dpm_force_performance_level failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -4748,12 +4748,6 @@ int ci_dpm_set_power_state(struct radeon_device *rdev)
|
||||
if (pi->pcie_performance_request)
|
||||
ci_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
|
||||
|
||||
ret = ci_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
|
||||
if (ret) {
|
||||
DRM_ERROR("ci_dpm_force_performance_level failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
|
||||
RADEON_CG_BLOCK_MC |
|
||||
RADEON_CG_BLOCK_SDMA |
|
||||
|
||||
@@ -47,10 +47,11 @@ int ci_copy_bytes_to_smc(struct radeon_device *rdev,
|
||||
u32 smc_start_address,
|
||||
const u8 *src, u32 byte_count, u32 limit)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 data, original_data;
|
||||
u32 addr;
|
||||
u32 extra_shift;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (smc_start_address & 3)
|
||||
return -EINVAL;
|
||||
@@ -59,13 +60,14 @@ int ci_copy_bytes_to_smc(struct radeon_device *rdev,
|
||||
|
||||
addr = smc_start_address;
|
||||
|
||||
spin_lock_irqsave(&rdev->smc_idx_lock, flags);
|
||||
while (byte_count >= 4) {
|
||||
/* SMC address space is BE */
|
||||
data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
|
||||
|
||||
ret = ci_set_smc_sram_address(rdev, addr, limit);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto done;
|
||||
|
||||
WREG32(SMC_IND_DATA_0, data);
|
||||
|
||||
@@ -80,7 +82,7 @@ int ci_copy_bytes_to_smc(struct radeon_device *rdev,
|
||||
|
||||
ret = ci_set_smc_sram_address(rdev, addr, limit);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto done;
|
||||
|
||||
original_data = RREG32(SMC_IND_DATA_0);
|
||||
|
||||
@@ -97,11 +99,15 @@ int ci_copy_bytes_to_smc(struct radeon_device *rdev,
|
||||
|
||||
ret = ci_set_smc_sram_address(rdev, addr, limit);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto done;
|
||||
|
||||
WREG32(SMC_IND_DATA_0, data);
|
||||
}
|
||||
return 0;
|
||||
|
||||
done:
|
||||
spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ci_start_smc(struct radeon_device *rdev)
|
||||
@@ -197,6 +203,7 @@ PPSMC_Result ci_wait_for_smc_inactive(struct radeon_device *rdev)
|
||||
|
||||
int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 ucode_start_address;
|
||||
u32 ucode_size;
|
||||
const u8 *src;
|
||||
@@ -219,6 +226,7 @@ int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
|
||||
return -EINVAL;
|
||||
|
||||
src = (const u8 *)rdev->smc_fw->data;
|
||||
spin_lock_irqsave(&rdev->smc_idx_lock, flags);
|
||||
WREG32(SMC_IND_INDEX_0, ucode_start_address);
|
||||
WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
|
||||
while (ucode_size >= 4) {
|
||||
@@ -231,6 +239,7 @@ int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
|
||||
ucode_size -= 4;
|
||||
}
|
||||
WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
|
||||
spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -238,25 +247,29 @@ int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
|
||||
int ci_read_smc_sram_dword(struct radeon_device *rdev,
|
||||
u32 smc_address, u32 *value, u32 limit)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&rdev->smc_idx_lock, flags);
|
||||
ret = ci_set_smc_sram_address(rdev, smc_address, limit);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
*value = RREG32(SMC_IND_DATA_0);
|
||||
spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
|
||||
|
||||
*value = RREG32(SMC_IND_DATA_0);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ci_write_smc_sram_dword(struct radeon_device *rdev,
|
||||
u32 smc_address, u32 value, u32 limit)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&rdev->smc_idx_lock, flags);
|
||||
ret = ci_set_smc_sram_address(rdev, smc_address, limit);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
WREG32(SMC_IND_DATA_0, value);
|
||||
spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
|
||||
|
||||
WREG32(SMC_IND_DATA_0, value);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -77,6 +77,8 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev);
|
||||
static void cik_program_aspm(struct radeon_device *rdev);
|
||||
static void cik_init_pg(struct radeon_device *rdev);
|
||||
static void cik_init_cg(struct radeon_device *rdev);
|
||||
static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
|
||||
bool enable);
|
||||
|
||||
/* get temperature in millidegrees */
|
||||
int ci_get_temp(struct radeon_device *rdev)
|
||||
@@ -120,20 +122,27 @@ int kv_get_temp(struct radeon_device *rdev)
|
||||
*/
|
||||
u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 r;
|
||||
|
||||
spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
|
||||
WREG32(PCIE_INDEX, reg);
|
||||
(void)RREG32(PCIE_INDEX);
|
||||
r = RREG32(PCIE_DATA);
|
||||
spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
|
||||
return r;
|
||||
}
|
||||
|
||||
void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
|
||||
WREG32(PCIE_INDEX, reg);
|
||||
(void)RREG32(PCIE_INDEX);
|
||||
WREG32(PCIE_DATA, v);
|
||||
(void)RREG32(PCIE_DATA);
|
||||
spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
|
||||
}
|
||||
|
||||
static const u32 spectre_rlc_save_restore_register_list[] =
|
||||
@@ -2722,7 +2731,8 @@ static void cik_gpu_init(struct radeon_device *rdev)
|
||||
} else if ((rdev->pdev->device == 0x1309) ||
|
||||
(rdev->pdev->device == 0x130A) ||
|
||||
(rdev->pdev->device == 0x130D) ||
|
||||
(rdev->pdev->device == 0x1313)) {
|
||||
(rdev->pdev->device == 0x1313) ||
|
||||
(rdev->pdev->device == 0x131D)) {
|
||||
rdev->config.cik.max_cu_per_sh = 6;
|
||||
rdev->config.cik.max_backends_per_se = 2;
|
||||
} else if ((rdev->pdev->device == 0x1306) ||
|
||||
@@ -4013,6 +4023,8 @@ static int cik_cp_resume(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
cik_enable_gui_idle_interrupt(rdev, false);
|
||||
|
||||
r = cik_cp_load_microcode(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
@@ -4024,6 +4036,8 @@ static int cik_cp_resume(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
cik_enable_gui_idle_interrupt(rdev, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5376,7 +5390,9 @@ static void cik_enable_hdp_ls(struct radeon_device *rdev,
|
||||
void cik_update_cg(struct radeon_device *rdev,
|
||||
u32 block, bool enable)
|
||||
{
|
||||
|
||||
if (block & RADEON_CG_BLOCK_GFX) {
|
||||
cik_enable_gui_idle_interrupt(rdev, false);
|
||||
/* order matters! */
|
||||
if (enable) {
|
||||
cik_enable_mgcg(rdev, true);
|
||||
@@ -5385,6 +5401,7 @@ void cik_update_cg(struct radeon_device *rdev,
|
||||
cik_enable_cgcg(rdev, false);
|
||||
cik_enable_mgcg(rdev, false);
|
||||
}
|
||||
cik_enable_gui_idle_interrupt(rdev, true);
|
||||
}
|
||||
|
||||
if (block & RADEON_CG_BLOCK_MC) {
|
||||
@@ -5541,7 +5558,7 @@ static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
|
||||
{
|
||||
u32 data, orig;
|
||||
|
||||
if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG)) {
|
||||
if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
|
||||
orig = data = RREG32(RLC_PG_CNTL);
|
||||
data |= GFX_PG_ENABLE;
|
||||
if (orig != data)
|
||||
@@ -5805,7 +5822,7 @@ static void cik_init_pg(struct radeon_device *rdev)
|
||||
if (rdev->pg_flags) {
|
||||
cik_enable_sck_slowdown_on_pu(rdev, true);
|
||||
cik_enable_sck_slowdown_on_pd(rdev, true);
|
||||
if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) {
|
||||
if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
|
||||
cik_init_gfx_cgpg(rdev);
|
||||
cik_enable_cp_pg(rdev, true);
|
||||
cik_enable_gds_pg(rdev, true);
|
||||
@@ -5819,7 +5836,7 @@ static void cik_fini_pg(struct radeon_device *rdev)
|
||||
{
|
||||
if (rdev->pg_flags) {
|
||||
cik_update_gfx_pg(rdev, false);
|
||||
if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) {
|
||||
if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
|
||||
cik_enable_cp_pg(rdev, false);
|
||||
cik_enable_gds_pg(rdev, false);
|
||||
}
|
||||
@@ -5895,7 +5912,9 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev)
|
||||
u32 tmp;
|
||||
|
||||
/* gfx ring */
|
||||
WREG32(CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
|
||||
tmp = RREG32(CP_INT_CNTL_RING0) &
|
||||
(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
|
||||
WREG32(CP_INT_CNTL_RING0, tmp);
|
||||
/* sdma */
|
||||
tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
|
||||
WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
|
||||
@@ -6036,8 +6055,7 @@ static int cik_irq_init(struct radeon_device *rdev)
|
||||
*/
|
||||
int cik_irq_set(struct radeon_device *rdev)
|
||||
{
|
||||
u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE |
|
||||
PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
|
||||
u32 cp_int_cntl;
|
||||
u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
|
||||
u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
|
||||
u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
|
||||
@@ -6058,6 +6076,10 @@ int cik_irq_set(struct radeon_device *rdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
|
||||
(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
|
||||
cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
|
||||
|
||||
hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
|
||||
hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
|
||||
hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
|
||||
|
||||
@@ -2014,12 +2014,6 @@ int cypress_dpm_set_power_state(struct radeon_device *rdev)
|
||||
if (eg_pi->pcie_performance_request)
|
||||
cypress_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
|
||||
|
||||
ret = rv770_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
|
||||
if (ret) {
|
||||
DRM_ERROR("rv770_dpm_force_performance_level failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,22 +28,30 @@
|
||||
static u32 dce6_endpoint_rreg(struct radeon_device *rdev,
|
||||
u32 block_offset, u32 reg)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 r;
|
||||
|
||||
spin_lock_irqsave(&rdev->end_idx_lock, flags);
|
||||
WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
|
||||
r = RREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset);
|
||||
spin_unlock_irqrestore(&rdev->end_idx_lock, flags);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void dce6_endpoint_wreg(struct radeon_device *rdev,
|
||||
u32 block_offset, u32 reg, u32 v)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rdev->end_idx_lock, flags);
|
||||
if (ASIC_IS_DCE8(rdev))
|
||||
WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
|
||||
else
|
||||
WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset,
|
||||
AZ_ENDPOINT_REG_WRITE_EN | AZ_ENDPOINT_REG_INDEX(reg));
|
||||
WREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset, v);
|
||||
spin_unlock_irqrestore(&rdev->end_idx_lock, flags);
|
||||
}
|
||||
|
||||
#define RREG32_ENDPOINT(block, reg) dce6_endpoint_rreg(rdev, (block), (reg))
|
||||
@@ -86,12 +94,12 @@ void dce6_afmt_select_pin(struct drm_encoder *encoder)
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
u32 offset = dig->afmt->offset;
|
||||
u32 id = dig->afmt->pin->id;
|
||||
|
||||
if (!dig->afmt->pin)
|
||||
return;
|
||||
|
||||
WREG32(AFMT_AUDIO_SRC_CONTROL + offset, AFMT_AUDIO_SRC_SELECT(id));
|
||||
WREG32(AFMT_AUDIO_SRC_CONTROL + offset,
|
||||
AFMT_AUDIO_SRC_SELECT(dig->afmt->pin->id));
|
||||
}
|
||||
|
||||
void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
|
||||
|
||||
+129
-35
@@ -40,6 +40,7 @@ static int kv_calculate_dpm_settings(struct radeon_device *rdev);
|
||||
static void kv_enable_new_levels(struct radeon_device *rdev);
|
||||
static void kv_program_nbps_index_settings(struct radeon_device *rdev,
|
||||
struct radeon_ps *new_rps);
|
||||
static int kv_set_enabled_level(struct radeon_device *rdev, u32 level);
|
||||
static int kv_set_enabled_levels(struct radeon_device *rdev);
|
||||
static int kv_force_dpm_highest(struct radeon_device *rdev);
|
||||
static int kv_force_dpm_lowest(struct radeon_device *rdev);
|
||||
@@ -519,7 +520,7 @@ static int kv_set_dpm_boot_state(struct radeon_device *rdev)
|
||||
|
||||
static void kv_program_vc(struct radeon_device *rdev)
|
||||
{
|
||||
WREG32_SMC(CG_FTV_0, 0x3FFFC000);
|
||||
WREG32_SMC(CG_FTV_0, 0x3FFFC100);
|
||||
}
|
||||
|
||||
static void kv_clear_vc(struct radeon_device *rdev)
|
||||
@@ -638,7 +639,10 @@ static int kv_force_lowest_valid(struct radeon_device *rdev)
|
||||
|
||||
static int kv_unforce_levels(struct radeon_device *rdev)
|
||||
{
|
||||
return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel);
|
||||
if (rdev->family == CHIP_KABINI)
|
||||
return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel);
|
||||
else
|
||||
return kv_set_enabled_levels(rdev);
|
||||
}
|
||||
|
||||
static int kv_update_sclk_t(struct radeon_device *rdev)
|
||||
@@ -667,9 +671,8 @@ static int kv_program_bootup_state(struct radeon_device *rdev)
|
||||
&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
|
||||
|
||||
if (table && table->count) {
|
||||
for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
|
||||
if ((table->entries[i].clk == pi->boot_pl.sclk) ||
|
||||
(i == 0))
|
||||
for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
|
||||
if (table->entries[i].clk == pi->boot_pl.sclk)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -682,9 +685,8 @@ static int kv_program_bootup_state(struct radeon_device *rdev)
|
||||
if (table->num_max_dpm_entries == 0)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
|
||||
if ((table->entries[i].sclk_frequency == pi->boot_pl.sclk) ||
|
||||
(i == 0))
|
||||
for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
|
||||
if (table->entries[i].sclk_frequency == pi->boot_pl.sclk)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1078,6 +1080,13 @@ static int kv_enable_ulv(struct radeon_device *rdev, bool enable)
|
||||
PPSMC_MSG_EnableULV : PPSMC_MSG_DisableULV);
|
||||
}
|
||||
|
||||
static void kv_reset_acp_boot_level(struct radeon_device *rdev)
|
||||
{
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
|
||||
pi->acp_boot_level = 0xff;
|
||||
}
|
||||
|
||||
static void kv_update_current_ps(struct radeon_device *rdev,
|
||||
struct radeon_ps *rps)
|
||||
{
|
||||
@@ -1100,6 +1109,18 @@ static void kv_update_requested_ps(struct radeon_device *rdev,
|
||||
pi->requested_rps.ps_priv = &pi->requested_ps;
|
||||
}
|
||||
|
||||
void kv_dpm_enable_bapm(struct radeon_device *rdev, bool enable)
|
||||
{
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
int ret;
|
||||
|
||||
if (pi->bapm_enable) {
|
||||
ret = kv_smc_bapm_enable(rdev, enable);
|
||||
if (ret)
|
||||
DRM_ERROR("kv_smc_bapm_enable failed\n");
|
||||
}
|
||||
}
|
||||
|
||||
int kv_dpm_enable(struct radeon_device *rdev)
|
||||
{
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
@@ -1192,6 +1213,8 @@ int kv_dpm_enable(struct radeon_device *rdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
kv_reset_acp_boot_level(rdev);
|
||||
|
||||
if (rdev->irq.installed &&
|
||||
r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
|
||||
ret = kv_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
|
||||
@@ -1203,6 +1226,12 @@ int kv_dpm_enable(struct radeon_device *rdev)
|
||||
radeon_irq_set(rdev);
|
||||
}
|
||||
|
||||
ret = kv_smc_bapm_enable(rdev, false);
|
||||
if (ret) {
|
||||
DRM_ERROR("kv_smc_bapm_enable failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* powerdown unused blocks for now */
|
||||
kv_dpm_powergate_acp(rdev, true);
|
||||
kv_dpm_powergate_samu(rdev, true);
|
||||
@@ -1226,6 +1255,8 @@ void kv_dpm_disable(struct radeon_device *rdev)
|
||||
RADEON_CG_BLOCK_BIF |
|
||||
RADEON_CG_BLOCK_HDP), false);
|
||||
|
||||
kv_smc_bapm_enable(rdev, false);
|
||||
|
||||
/* powerup blocks */
|
||||
kv_dpm_powergate_acp(rdev, false);
|
||||
kv_dpm_powergate_samu(rdev, false);
|
||||
@@ -1450,6 +1481,39 @@ static int kv_update_samu_dpm(struct radeon_device *rdev, bool gate)
|
||||
return kv_enable_samu_dpm(rdev, !gate);
|
||||
}
|
||||
|
||||
static u8 kv_get_acp_boot_level(struct radeon_device *rdev)
|
||||
{
|
||||
u8 i;
|
||||
struct radeon_clock_voltage_dependency_table *table =
|
||||
&rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table;
|
||||
|
||||
for (i = 0; i < table->count; i++) {
|
||||
if (table->entries[i].clk >= 0) /* XXX */
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= table->count)
|
||||
i = table->count - 1;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static void kv_update_acp_boot_level(struct radeon_device *rdev)
|
||||
{
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
u8 acp_boot_level;
|
||||
|
||||
if (!pi->caps_stable_p_state) {
|
||||
acp_boot_level = kv_get_acp_boot_level(rdev);
|
||||
if (acp_boot_level != pi->acp_boot_level) {
|
||||
pi->acp_boot_level = acp_boot_level;
|
||||
kv_send_msg_to_smc_with_parameter(rdev,
|
||||
PPSMC_MSG_ACPDPM_SetEnabledMask,
|
||||
(1 << pi->acp_boot_level));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int kv_update_acp_dpm(struct radeon_device *rdev, bool gate)
|
||||
{
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
@@ -1461,7 +1525,7 @@ static int kv_update_acp_dpm(struct radeon_device *rdev, bool gate)
|
||||
if (pi->caps_stable_p_state)
|
||||
pi->acp_boot_level = table->count - 1;
|
||||
else
|
||||
pi->acp_boot_level = 0;
|
||||
pi->acp_boot_level = kv_get_acp_boot_level(rdev);
|
||||
|
||||
ret = kv_copy_bytes_to_smc(rdev,
|
||||
pi->dpm_table_start +
|
||||
@@ -1588,13 +1652,11 @@ static void kv_set_valid_clock_range(struct radeon_device *rdev,
|
||||
}
|
||||
}
|
||||
|
||||
for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
|
||||
if ((table->entries[i].clk <= new_ps->levels[new_ps->num_levels -1].sclk) ||
|
||||
(i == 0)) {
|
||||
pi->highest_valid = i;
|
||||
for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
|
||||
if (table->entries[i].clk <= new_ps->levels[new_ps->num_levels - 1].sclk)
|
||||
break;
|
||||
}
|
||||
}
|
||||
pi->highest_valid = i;
|
||||
|
||||
if (pi->lowest_valid > pi->highest_valid) {
|
||||
if ((new_ps->levels[0].sclk - table->entries[pi->highest_valid].clk) >
|
||||
@@ -1615,14 +1677,12 @@ static void kv_set_valid_clock_range(struct radeon_device *rdev,
|
||||
}
|
||||
}
|
||||
|
||||
for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
|
||||
for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
|
||||
if (table->entries[i].sclk_frequency <=
|
||||
new_ps->levels[new_ps->num_levels - 1].sclk ||
|
||||
i == 0) {
|
||||
pi->highest_valid = i;
|
||||
new_ps->levels[new_ps->num_levels - 1].sclk)
|
||||
break;
|
||||
}
|
||||
}
|
||||
pi->highest_valid = i;
|
||||
|
||||
if (pi->lowest_valid > pi->highest_valid) {
|
||||
if ((new_ps->levels[0].sclk -
|
||||
@@ -1724,6 +1784,14 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
|
||||
RADEON_CG_BLOCK_BIF |
|
||||
RADEON_CG_BLOCK_HDP), false);
|
||||
|
||||
if (pi->bapm_enable) {
|
||||
ret = kv_smc_bapm_enable(rdev, rdev->pm.dpm.ac_power);
|
||||
if (ret) {
|
||||
DRM_ERROR("kv_smc_bapm_enable failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (rdev->family == CHIP_KABINI) {
|
||||
if (pi->enable_dpm) {
|
||||
kv_set_valid_clock_range(rdev, new_ps);
|
||||
@@ -1775,6 +1843,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
kv_update_acp_boot_level(rdev);
|
||||
kv_update_sclk_t(rdev);
|
||||
kv_enable_nb_dpm(rdev);
|
||||
}
|
||||
@@ -1785,7 +1854,6 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
|
||||
RADEON_CG_BLOCK_BIF |
|
||||
RADEON_CG_BLOCK_HDP), true);
|
||||
|
||||
rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1806,12 +1874,23 @@ void kv_dpm_setup_asic(struct radeon_device *rdev)
|
||||
|
||||
void kv_dpm_reset_asic(struct radeon_device *rdev)
|
||||
{
|
||||
kv_force_lowest_valid(rdev);
|
||||
kv_init_graphics_levels(rdev);
|
||||
kv_program_bootup_state(rdev);
|
||||
kv_upload_dpm_settings(rdev);
|
||||
kv_force_lowest_valid(rdev);
|
||||
kv_unforce_levels(rdev);
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
|
||||
if (rdev->family == CHIP_KABINI) {
|
||||
kv_force_lowest_valid(rdev);
|
||||
kv_init_graphics_levels(rdev);
|
||||
kv_program_bootup_state(rdev);
|
||||
kv_upload_dpm_settings(rdev);
|
||||
kv_force_lowest_valid(rdev);
|
||||
kv_unforce_levels(rdev);
|
||||
} else {
|
||||
kv_init_graphics_levels(rdev);
|
||||
kv_program_bootup_state(rdev);
|
||||
kv_freeze_sclk_dpm(rdev, true);
|
||||
kv_upload_dpm_settings(rdev);
|
||||
kv_freeze_sclk_dpm(rdev, false);
|
||||
kv_set_enabled_level(rdev, pi->graphics_boot_level);
|
||||
}
|
||||
}
|
||||
|
||||
//XXX use sumo_dpm_display_configuration_changed
|
||||
@@ -1871,12 +1950,15 @@ static int kv_force_dpm_highest(struct radeon_device *rdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = SMU7_MAX_LEVELS_GRAPHICS - 1; i >= 0; i--) {
|
||||
for (i = SMU7_MAX_LEVELS_GRAPHICS - 1; i > 0; i--) {
|
||||
if (enable_mask & (1 << i))
|
||||
break;
|
||||
}
|
||||
|
||||
return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
|
||||
if (rdev->family == CHIP_KABINI)
|
||||
return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
|
||||
else
|
||||
return kv_set_enabled_level(rdev, i);
|
||||
}
|
||||
|
||||
static int kv_force_dpm_lowest(struct radeon_device *rdev)
|
||||
@@ -1893,7 +1975,10 @@ static int kv_force_dpm_lowest(struct radeon_device *rdev)
|
||||
break;
|
||||
}
|
||||
|
||||
return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
|
||||
if (rdev->family == CHIP_KABINI)
|
||||
return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
|
||||
else
|
||||
return kv_set_enabled_level(rdev, i);
|
||||
}
|
||||
|
||||
static u8 kv_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
|
||||
@@ -1911,9 +1996,9 @@ static u8 kv_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
|
||||
if (!pi->caps_sclk_ds)
|
||||
return 0;
|
||||
|
||||
for (i = KV_MAX_DEEPSLEEP_DIVIDER_ID; i <= 0; i--) {
|
||||
for (i = KV_MAX_DEEPSLEEP_DIVIDER_ID; i > 0; i--) {
|
||||
temp = sclk / sumo_get_sleep_divider_from_id(i);
|
||||
if ((temp >= min) || (i == 0))
|
||||
if (temp >= min)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2039,12 +2124,12 @@ static void kv_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
ps->dpmx_nb_ps_lo = 0x1;
|
||||
ps->dpmx_nb_ps_hi = 0x0;
|
||||
} else {
|
||||
ps->dpm0_pg_nb_ps_lo = 0x1;
|
||||
ps->dpm0_pg_nb_ps_lo = 0x3;
|
||||
ps->dpm0_pg_nb_ps_hi = 0x0;
|
||||
ps->dpmx_nb_ps_lo = 0x2;
|
||||
ps->dpmx_nb_ps_hi = 0x1;
|
||||
ps->dpmx_nb_ps_lo = 0x3;
|
||||
ps->dpmx_nb_ps_hi = 0x0;
|
||||
|
||||
if (pi->sys_info.nb_dpm_enable && pi->battery_state) {
|
||||
if (pi->sys_info.nb_dpm_enable) {
|
||||
force_high = (mclk >= pi->sys_info.nbp_memory_clock[3]) ||
|
||||
pi->video_start || (rdev->pm.dpm.new_active_crtc_count >= 3) ||
|
||||
pi->disable_nb_ps3_in_battery;
|
||||
@@ -2210,6 +2295,15 @@ static void kv_enable_new_levels(struct radeon_device *rdev)
|
||||
}
|
||||
}
|
||||
|
||||
static int kv_set_enabled_level(struct radeon_device *rdev, u32 level)
|
||||
{
|
||||
u32 new_mask = (1 << level);
|
||||
|
||||
return kv_send_msg_to_smc_with_parameter(rdev,
|
||||
PPSMC_MSG_SCLKDPM_SetEnabledMask,
|
||||
new_mask);
|
||||
}
|
||||
|
||||
static int kv_set_enabled_levels(struct radeon_device *rdev)
|
||||
{
|
||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||
|
||||
@@ -192,6 +192,7 @@ int kv_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
|
||||
int kv_read_smc_sram_dword(struct radeon_device *rdev, u32 smc_address,
|
||||
u32 *value, u32 limit);
|
||||
int kv_smc_dpm_enable(struct radeon_device *rdev, bool enable);
|
||||
int kv_smc_bapm_enable(struct radeon_device *rdev, bool enable);
|
||||
int kv_copy_bytes_to_smc(struct radeon_device *rdev,
|
||||
u32 smc_start_address,
|
||||
const u8 *src, u32 byte_count, u32 limit);
|
||||
|
||||
@@ -107,6 +107,14 @@ int kv_smc_dpm_enable(struct radeon_device *rdev, bool enable)
|
||||
return kv_notify_message_to_smu(rdev, PPSMC_MSG_DPM_Disable);
|
||||
}
|
||||
|
||||
int kv_smc_bapm_enable(struct radeon_device *rdev, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
return kv_notify_message_to_smu(rdev, PPSMC_MSG_EnableBAPM);
|
||||
else
|
||||
return kv_notify_message_to_smu(rdev, PPSMC_MSG_DisableBAPM);
|
||||
}
|
||||
|
||||
int kv_copy_bytes_to_smc(struct radeon_device *rdev,
|
||||
u32 smc_start_address,
|
||||
const u8 *src, u32 byte_count, u32 limit)
|
||||
|
||||
@@ -3865,12 +3865,6 @@ int ni_dpm_set_power_state(struct radeon_device *rdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ni_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
|
||||
if (ret) {
|
||||
DRM_ERROR("ni_dpm_force_performance_level failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -163,6 +163,8 @@ typedef uint8_t PPSMC_Result;
|
||||
#define PPSMC_MSG_VCEPowerON ((uint32_t) 0x10f)
|
||||
#define PPSMC_MSG_DCE_RemoveVoltageAdjustment ((uint32_t) 0x11d)
|
||||
#define PPSMC_MSG_DCE_AllowVoltageAdjustment ((uint32_t) 0x11e)
|
||||
#define PPSMC_MSG_EnableBAPM ((uint32_t) 0x120)
|
||||
#define PPSMC_MSG_DisableBAPM ((uint32_t) 0x121)
|
||||
#define PPSMC_MSG_UVD_DPM_Config ((uint32_t) 0x124)
|
||||
|
||||
|
||||
|
||||
@@ -2853,21 +2853,28 @@ static void r100_pll_errata_after_data(struct radeon_device *rdev)
|
||||
|
||||
uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg)
|
||||
{
|
||||
unsigned long flags;
|
||||
uint32_t data;
|
||||
|
||||
spin_lock_irqsave(&rdev->pll_idx_lock, flags);
|
||||
WREG8(RADEON_CLOCK_CNTL_INDEX, reg & 0x3f);
|
||||
r100_pll_errata_after_index(rdev);
|
||||
data = RREG32(RADEON_CLOCK_CNTL_DATA);
|
||||
r100_pll_errata_after_data(rdev);
|
||||
spin_unlock_irqrestore(&rdev->pll_idx_lock, flags);
|
||||
return data;
|
||||
}
|
||||
|
||||
void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rdev->pll_idx_lock, flags);
|
||||
WREG8(RADEON_CLOCK_CNTL_INDEX, ((reg & 0x3f) | RADEON_PLL_WR_EN));
|
||||
r100_pll_errata_after_index(rdev);
|
||||
WREG32(RADEON_CLOCK_CNTL_DATA, v);
|
||||
r100_pll_errata_after_data(rdev);
|
||||
spin_unlock_irqrestore(&rdev->pll_idx_lock, flags);
|
||||
}
|
||||
|
||||
static void r100_set_safe_registers(struct radeon_device *rdev)
|
||||
|
||||
@@ -160,18 +160,25 @@ void r420_pipes_init(struct radeon_device *rdev)
|
||||
|
||||
u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 r;
|
||||
|
||||
spin_lock_irqsave(&rdev->mc_idx_lock, flags);
|
||||
WREG32(R_0001F8_MC_IND_INDEX, S_0001F8_MC_IND_ADDR(reg));
|
||||
r = RREG32(R_0001FC_MC_IND_DATA);
|
||||
spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
|
||||
return r;
|
||||
}
|
||||
|
||||
void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rdev->mc_idx_lock, flags);
|
||||
WREG32(R_0001F8_MC_IND_INDEX, S_0001F8_MC_IND_ADDR(reg) |
|
||||
S_0001F8_MC_IND_WR_EN(1));
|
||||
WREG32(R_0001FC_MC_IND_DATA, v);
|
||||
spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
|
||||
}
|
||||
|
||||
static void r420_debugfs(struct radeon_device *rdev)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user