Merge branch 'drm-next-3.18' of git://people.freedesktop.org/~agd5f/linux into drm-next
It looks like you missed my last 3.18 pull from 9/24. This one includes those patches and a few more on top. The additional patches are: - Maarten's radeon fence updates - Some additional debugging output From the previous pull request: - Re-enable some dpm features that were previously disabled due to a bug that was fixed in 3.16 - Make some arrays static - re-arrange some audio code to properly reflect connected status in the audio driver * 'drm-next-3.18' of git://people.freedesktop.org/~agd5f/linux: drm/radeon/kv: add uvd/vce info to dpm debugfs output drm/radeon/ci: add uvd/vce info to dpm debugfs output drm/radeon: export reservation_object from dmabuf to ttm drm/radeon: cope with foreign fences inside the reservation object drm/radeon: cope with foreign fences inside display drm/radeon/cik: write gfx ucode version to ucode addr reg drm/radeon/si: print full CS when we hit a packet 0 drm/radeon: remove unecessary includes drm/radeon/combios: declare legacy_connector_convert as static drm/radeon/atombios: declare connector convert tables as static drm/radeon: drop btc_get_max_clock_from_voltage_dependency_table drm/radeon/dpm: drop clk/voltage dependency filters for BTC drm/radeon/dpm: drop clk/voltage dependency filters for CI drm/radeon/dpm: drop clk/voltage dependency filters for SI drm/radeon/dpm: drop clk/voltage dependency filters for NI drm/radeon: disable audio when we disable hdmi (v2) drm/radeon: split audio enable between eg and r600 (v2) drm/radeon: consolidate r600_audio.c into r600_hdmi.c drm/radeon: consolidate duplicate encode is digital function drm/radeon: fix register name to match internal name
This commit is contained in:
commit
ccb09a8e36
@ -72,7 +72,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
|
||||
radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \
|
||||
rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \
|
||||
r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \
|
||||
radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o dce3_1_afmt.o \
|
||||
radeon_pm.o atombios_dp.o r600_hdmi.o dce3_1_afmt.o \
|
||||
evergreen.o evergreen_cs.o evergreen_blit_shaders.o \
|
||||
evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \
|
||||
atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \
|
||||
|
@ -291,29 +291,6 @@ static void radeon_atom_backlight_exit(struct radeon_encoder *encoder)
|
||||
bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
struct drm_display_mode *mode);
|
||||
|
||||
|
||||
static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder)
|
||||
{
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
switch (radeon_encoder->encoder_id) {
|
||||
case ENCODER_OBJECT_ID_INTERNAL_LVDS:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DVO1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DDI:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
|
@ -1170,23 +1170,6 @@ static const struct radeon_blacklist_clocks btc_blacklist_clocks[] =
|
||||
{ 25000, 30000, RADEON_SCLK_UP }
|
||||
};
|
||||
|
||||
void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
|
||||
u32 *max_clock)
|
||||
{
|
||||
u32 i, clock = 0;
|
||||
|
||||
if ((table == NULL) || (table->count == 0)) {
|
||||
*max_clock = clock;
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < table->count; i++) {
|
||||
if (clock < table->entries[i].clk)
|
||||
clock = table->entries[i].clk;
|
||||
}
|
||||
*max_clock = clock;
|
||||
}
|
||||
|
||||
void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
|
||||
u32 clock, u16 max_voltage, u16 *voltage)
|
||||
{
|
||||
@ -2099,7 +2082,6 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
bool disable_mclk_switching;
|
||||
u32 mclk, sclk;
|
||||
u16 vddc, vddci;
|
||||
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
||||
|
||||
if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
|
||||
btc_dpm_vblank_too_short(rdev))
|
||||
@ -2141,39 +2123,6 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
ps->low.vddci = max_limits->vddci;
|
||||
}
|
||||
|
||||
/* limit clocks to max supported clocks based on voltage dependency tables */
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
|
||||
&max_sclk_vddc);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
|
||||
&max_mclk_vddci);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
|
||||
&max_mclk_vddc);
|
||||
|
||||
if (max_sclk_vddc) {
|
||||
if (ps->low.sclk > max_sclk_vddc)
|
||||
ps->low.sclk = max_sclk_vddc;
|
||||
if (ps->medium.sclk > max_sclk_vddc)
|
||||
ps->medium.sclk = max_sclk_vddc;
|
||||
if (ps->high.sclk > max_sclk_vddc)
|
||||
ps->high.sclk = max_sclk_vddc;
|
||||
}
|
||||
if (max_mclk_vddci) {
|
||||
if (ps->low.mclk > max_mclk_vddci)
|
||||
ps->low.mclk = max_mclk_vddci;
|
||||
if (ps->medium.mclk > max_mclk_vddci)
|
||||
ps->medium.mclk = max_mclk_vddci;
|
||||
if (ps->high.mclk > max_mclk_vddci)
|
||||
ps->high.mclk = max_mclk_vddci;
|
||||
}
|
||||
if (max_mclk_vddc) {
|
||||
if (ps->low.mclk > max_mclk_vddc)
|
||||
ps->low.mclk = max_mclk_vddc;
|
||||
if (ps->medium.mclk > max_mclk_vddc)
|
||||
ps->medium.mclk = max_mclk_vddc;
|
||||
if (ps->high.mclk > max_mclk_vddc)
|
||||
ps->high.mclk = max_mclk_vddc;
|
||||
}
|
||||
|
||||
/* XXX validate the min clocks required for display */
|
||||
|
||||
if (disable_mclk_switching) {
|
||||
|
@ -46,8 +46,6 @@ void btc_adjust_clock_combinations(struct radeon_device *rdev,
|
||||
struct rv7xx_pl *pl);
|
||||
void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
|
||||
u32 clock, u16 max_voltage, u16 *voltage);
|
||||
void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
|
||||
u32 *max_clock);
|
||||
void btc_apply_voltage_delta_rules(struct radeon_device *rdev,
|
||||
u16 max_vddc, u16 max_vddci,
|
||||
u16 *vddc, u16 *vddci);
|
||||
|
@ -162,8 +162,6 @@ static const struct ci_pt_config_reg didt_config_ci[] =
|
||||
};
|
||||
|
||||
extern u8 rv770_get_memory_module_index(struct radeon_device *rdev);
|
||||
extern void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
|
||||
u32 *max_clock);
|
||||
extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
|
||||
u32 arb_freq_src, u32 arb_freq_dest);
|
||||
extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock);
|
||||
@ -748,7 +746,6 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
struct radeon_clock_and_voltage_limits *max_limits;
|
||||
bool disable_mclk_switching;
|
||||
u32 sclk, mclk;
|
||||
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
||||
int i;
|
||||
|
||||
if (rps->vce_active) {
|
||||
@ -784,29 +781,6 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
}
|
||||
}
|
||||
|
||||
/* limit clocks to max supported clocks based on voltage dependency tables */
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
|
||||
&max_sclk_vddc);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
|
||||
&max_mclk_vddci);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
|
||||
&max_mclk_vddc);
|
||||
|
||||
for (i = 0; i < ps->performance_level_count; i++) {
|
||||
if (max_sclk_vddc) {
|
||||
if (ps->performance_levels[i].sclk > max_sclk_vddc)
|
||||
ps->performance_levels[i].sclk = max_sclk_vddc;
|
||||
}
|
||||
if (max_mclk_vddci) {
|
||||
if (ps->performance_levels[i].mclk > max_mclk_vddci)
|
||||
ps->performance_levels[i].mclk = max_mclk_vddci;
|
||||
}
|
||||
if (max_mclk_vddc) {
|
||||
if (ps->performance_levels[i].mclk > max_mclk_vddc)
|
||||
ps->performance_levels[i].mclk = max_mclk_vddc;
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX validate the min clocks required for display */
|
||||
|
||||
if (disable_mclk_switching) {
|
||||
@ -5293,9 +5267,13 @@ int ci_dpm_init(struct radeon_device *rdev)
|
||||
void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
|
||||
struct seq_file *m)
|
||||
{
|
||||
struct ci_power_info *pi = ci_get_pi(rdev);
|
||||
struct radeon_ps *rps = &pi->current_rps;
|
||||
u32 sclk = ci_get_average_sclk_freq(rdev);
|
||||
u32 mclk = ci_get_average_mclk_freq(rdev);
|
||||
|
||||
seq_printf(m, "uvd %sabled\n", pi->uvd_enabled ? "en" : "dis");
|
||||
seq_printf(m, "vce %sabled\n", rps->vce_active ? "en" : "dis");
|
||||
seq_printf(m, "power level avg sclk: %u mclk: %u\n",
|
||||
sclk, mclk);
|
||||
}
|
||||
|
@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
for (i = 0; i < num_loops; i++) {
|
||||
@ -4235,7 +4235,7 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
|
||||
WREG32(CP_PFP_UCODE_ADDR, 0);
|
||||
for (i = 0; i < fw_size; i++)
|
||||
WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
|
||||
WREG32(CP_PFP_UCODE_ADDR, 0);
|
||||
WREG32(CP_PFP_UCODE_ADDR, le32_to_cpu(pfp_hdr->header.ucode_version));
|
||||
|
||||
/* CE */
|
||||
fw_data = (const __le32 *)
|
||||
@ -4244,7 +4244,7 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
|
||||
WREG32(CP_CE_UCODE_ADDR, 0);
|
||||
for (i = 0; i < fw_size; i++)
|
||||
WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
|
||||
WREG32(CP_CE_UCODE_ADDR, 0);
|
||||
WREG32(CP_CE_UCODE_ADDR, le32_to_cpu(ce_hdr->header.ucode_version));
|
||||
|
||||
/* ME */
|
||||
fw_data = (const __be32 *)
|
||||
@ -4253,7 +4253,8 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
|
||||
WREG32(CP_ME_RAM_WADDR, 0);
|
||||
for (i = 0; i < fw_size; i++)
|
||||
WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
|
||||
WREG32(CP_ME_RAM_WADDR, 0);
|
||||
WREG32(CP_ME_RAM_WADDR, le32_to_cpu(me_hdr->header.ucode_version));
|
||||
WREG32(CP_ME_RAM_RADDR, le32_to_cpu(me_hdr->header.ucode_version));
|
||||
} else {
|
||||
const __be32 *fw_data;
|
||||
|
||||
@ -4279,10 +4280,6 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
|
||||
WREG32(CP_ME_RAM_WADDR, 0);
|
||||
}
|
||||
|
||||
WREG32(CP_PFP_UCODE_ADDR, 0);
|
||||
WREG32(CP_CE_UCODE_ADDR, 0);
|
||||
WREG32(CP_ME_RAM_WADDR, 0);
|
||||
WREG32(CP_ME_RAM_RADDR, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4564,7 +4561,7 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
|
||||
WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
|
||||
for (i = 0; i < fw_size; i++)
|
||||
WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
|
||||
WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
|
||||
WREG32(CP_MEC_ME1_UCODE_ADDR, le32_to_cpu(mec_hdr->header.ucode_version));
|
||||
|
||||
/* MEC2 */
|
||||
if (rdev->family == CHIP_KAVERI) {
|
||||
@ -4578,7 +4575,7 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
|
||||
WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
|
||||
for (i = 0; i < fw_size; i++)
|
||||
WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
|
||||
WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
|
||||
WREG32(CP_MEC_ME2_UCODE_ADDR, le32_to_cpu(mec2_hdr->header.ucode_version));
|
||||
}
|
||||
} else {
|
||||
const __be32 *fw_data;
|
||||
@ -4690,7 +4687,7 @@ static int cik_mec_init(struct radeon_device *rdev)
|
||||
r = radeon_bo_create(rdev,
|
||||
rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
|
||||
PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
|
||||
&rdev->mec.hpd_eop_obj);
|
||||
if (r) {
|
||||
dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
|
||||
@ -4861,7 +4858,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
|
||||
sizeof(struct bonaire_mqd),
|
||||
PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL,
|
||||
&rdev->ring[idx].mqd_obj);
|
||||
NULL, &rdev->ring[idx].mqd_obj);
|
||||
if (r) {
|
||||
dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
|
||||
return r;
|
||||
@ -6227,7 +6224,7 @@ static int cik_rlc_resume(struct radeon_device *rdev)
|
||||
WREG32(RLC_GPM_UCODE_ADDR, 0);
|
||||
for (i = 0; i < size; i++)
|
||||
WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
|
||||
WREG32(RLC_GPM_UCODE_ADDR, 0);
|
||||
WREG32(RLC_GPM_UCODE_ADDR, le32_to_cpu(hdr->header.ucode_version));
|
||||
} else {
|
||||
const __be32 *fw_data;
|
||||
|
||||
|
@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
for (i = 0; i < num_loops; i++) {
|
||||
|
@ -165,7 +165,7 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m
|
||||
|
||||
/* disable audio prior to setting up hw */
|
||||
dig->afmt->pin = r600_audio_get_pin(rdev);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, false);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, 0);
|
||||
|
||||
r600_audio_set_dto(encoder, mode->clock);
|
||||
|
||||
@ -240,5 +240,5 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m
|
||||
r600_hdmi_audio_workaround(encoder);
|
||||
|
||||
/* enable audio after to setting up hw */
|
||||
r600_audio_enable(rdev, dig->afmt->pin, true);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, 0xf);
|
||||
}
|
||||
|
@ -284,13 +284,13 @@ static int dce6_audio_chipset_supported(struct radeon_device *rdev)
|
||||
|
||||
void dce6_audio_enable(struct radeon_device *rdev,
|
||||
struct r600_audio_pin *pin,
|
||||
bool enable)
|
||||
u8 enable_mask)
|
||||
{
|
||||
if (!pin)
|
||||
return;
|
||||
|
||||
WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL,
|
||||
enable ? AUDIO_ENABLED : 0);
|
||||
WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
|
||||
enable_mask ? AUDIO_ENABLED : 0);
|
||||
}
|
||||
|
||||
static const u32 pin_offsets[7] =
|
||||
|
@ -22,7 +22,6 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
@ -4023,7 +4022,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
|
||||
if (rdev->rlc.save_restore_obj == NULL) {
|
||||
r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
&rdev->rlc.save_restore_obj);
|
||||
NULL, &rdev->rlc.save_restore_obj);
|
||||
if (r) {
|
||||
dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
|
||||
return r;
|
||||
@ -4102,7 +4101,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
|
||||
if (rdev->rlc.clear_state_obj == NULL) {
|
||||
r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
&rdev->rlc.clear_state_obj);
|
||||
NULL, &rdev->rlc.clear_state_obj);
|
||||
if (r) {
|
||||
dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
|
||||
sumo_rlc_fini(rdev);
|
||||
@ -4179,7 +4178,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
|
||||
r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
|
||||
PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
&rdev->rlc.cp_table_obj);
|
||||
NULL, &rdev->rlc.cp_table_obj);
|
||||
if (r) {
|
||||
dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
|
||||
sumo_rlc_fini(rdev);
|
||||
|
@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
for (i = 0; i < num_loops; i++) {
|
||||
|
@ -38,6 +38,37 @@ extern void dce6_afmt_select_pin(struct drm_encoder *encoder);
|
||||
extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode);
|
||||
|
||||
/* enable the audio stream */
|
||||
static void dce4_audio_enable(struct radeon_device *rdev,
|
||||
struct r600_audio_pin *pin,
|
||||
u8 enable_mask)
|
||||
{
|
||||
u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL);
|
||||
|
||||
if (!pin)
|
||||
return;
|
||||
|
||||
if (enable_mask) {
|
||||
tmp |= AUDIO_ENABLED;
|
||||
if (enable_mask & 1)
|
||||
tmp |= PIN0_AUDIO_ENABLED;
|
||||
if (enable_mask & 2)
|
||||
tmp |= PIN1_AUDIO_ENABLED;
|
||||
if (enable_mask & 4)
|
||||
tmp |= PIN2_AUDIO_ENABLED;
|
||||
if (enable_mask & 8)
|
||||
tmp |= PIN3_AUDIO_ENABLED;
|
||||
} else {
|
||||
tmp &= ~(AUDIO_ENABLED |
|
||||
PIN0_AUDIO_ENABLED |
|
||||
PIN1_AUDIO_ENABLED |
|
||||
PIN2_AUDIO_ENABLED |
|
||||
PIN3_AUDIO_ENABLED);
|
||||
}
|
||||
|
||||
WREG32(AZ_HOT_PLUG_CONTROL, tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* update the N and CTS parameters for a given pixel clock rate
|
||||
*/
|
||||
@ -318,10 +349,10 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
|
||||
/* disable audio prior to setting up hw */
|
||||
if (ASIC_IS_DCE6(rdev)) {
|
||||
dig->afmt->pin = dce6_audio_get_pin(rdev);
|
||||
dce6_audio_enable(rdev, dig->afmt->pin, false);
|
||||
dce6_audio_enable(rdev, dig->afmt->pin, 0);
|
||||
} else {
|
||||
dig->afmt->pin = r600_audio_get_pin(rdev);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, false);
|
||||
dce4_audio_enable(rdev, dig->afmt->pin, 0);
|
||||
}
|
||||
|
||||
evergreen_audio_set_dto(encoder, mode->clock);
|
||||
@ -463,13 +494,15 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
|
||||
|
||||
/* enable audio after to setting up hw */
|
||||
if (ASIC_IS_DCE6(rdev))
|
||||
dce6_audio_enable(rdev, dig->afmt->pin, true);
|
||||
dce6_audio_enable(rdev, dig->afmt->pin, 1);
|
||||
else
|
||||
r600_audio_enable(rdev, dig->afmt->pin, true);
|
||||
dce4_audio_enable(rdev, dig->afmt->pin, 0xf);
|
||||
}
|
||||
|
||||
void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
|
||||
@ -482,6 +515,14 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
|
||||
if (!enable && !dig->afmt->enabled)
|
||||
return;
|
||||
|
||||
if (!enable && dig->afmt->pin) {
|
||||
if (ASIC_IS_DCE6(rdev))
|
||||
dce6_audio_enable(rdev, dig->afmt->pin, 0);
|
||||
else
|
||||
dce4_audio_enable(rdev, dig->afmt->pin, 0);
|
||||
dig->afmt->pin = NULL;
|
||||
}
|
||||
|
||||
dig->afmt->enabled = enable;
|
||||
|
||||
DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n",
|
||||
|
@ -2773,6 +2773,8 @@ void kv_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
|
||||
tmp = (RREG32_SMC(SMU_VOLTAGE_STATUS) & SMU_VOLTAGE_CURRENT_LEVEL_MASK) >>
|
||||
SMU_VOLTAGE_CURRENT_LEVEL_SHIFT;
|
||||
vddc = kv_convert_8bit_index_to_voltage(rdev, (u16)tmp);
|
||||
seq_printf(m, "uvd %sabled\n", pi->uvd_power_gated ? "dis" : "en");
|
||||
seq_printf(m, "vce %sabled\n", pi->vce_power_gated ? "dis" : "en");
|
||||
seq_printf(m, "power level %d sclk: %u vddc: %u\n",
|
||||
current_index, sclk, vddc);
|
||||
}
|
||||
|
@ -789,7 +789,6 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
bool disable_mclk_switching;
|
||||
u32 mclk;
|
||||
u16 vddci;
|
||||
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
||||
int i;
|
||||
|
||||
if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
|
||||
@ -816,29 +815,6 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
}
|
||||
}
|
||||
|
||||
/* limit clocks to max supported clocks based on voltage dependency tables */
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
|
||||
&max_sclk_vddc);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
|
||||
&max_mclk_vddci);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
|
||||
&max_mclk_vddc);
|
||||
|
||||
for (i = 0; i < ps->performance_level_count; i++) {
|
||||
if (max_sclk_vddc) {
|
||||
if (ps->performance_levels[i].sclk > max_sclk_vddc)
|
||||
ps->performance_levels[i].sclk = max_sclk_vddc;
|
||||
}
|
||||
if (max_mclk_vddci) {
|
||||
if (ps->performance_levels[i].mclk > max_mclk_vddci)
|
||||
ps->performance_levels[i].mclk = max_mclk_vddci;
|
||||
}
|
||||
if (max_mclk_vddc) {
|
||||
if (ps->performance_levels[i].mclk > max_mclk_vddc)
|
||||
ps->performance_levels[i].mclk = max_mclk_vddc;
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX validate the min clocks required for display */
|
||||
|
||||
/* adjust low state */
|
||||
|
@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
|
||||
if (rdev->vram_scratch.robj == NULL) {
|
||||
r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
|
||||
PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||
0, NULL, &rdev->vram_scratch.robj);
|
||||
0, NULL, NULL, &rdev->vram_scratch.robj);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
|
||||
@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
|
||||
r = radeon_bo_create(rdev, rdev->ih.ring_size,
|
||||
PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_GTT, 0,
|
||||
NULL, &rdev->ih.ring_obj);
|
||||
NULL, NULL, &rdev->ih.ring_obj);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
|
||||
return r;
|
||||
|
@ -1,207 +0,0 @@
|
||||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Christian König.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Christian König
|
||||
*/
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_reg.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "atom.h"
|
||||
|
||||
/*
|
||||
* check if enc_priv stores radeon_encoder_atom_dig
|
||||
*/
|
||||
static bool radeon_dig_encoder(struct drm_encoder *encoder)
|
||||
{
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
switch (radeon_encoder->encoder_id) {
|
||||
case ENCODER_OBJECT_ID_INTERNAL_LVDS:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DVO1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DDI:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* check if the chipset is supported
|
||||
*/
|
||||
static int r600_audio_chipset_supported(struct radeon_device *rdev)
|
||||
{
|
||||
return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev);
|
||||
}
|
||||
|
||||
struct r600_audio_pin r600_audio_status(struct radeon_device *rdev)
|
||||
{
|
||||
struct r600_audio_pin status;
|
||||
uint32_t value;
|
||||
|
||||
value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL);
|
||||
|
||||
/* number of channels */
|
||||
status.channels = (value & 0x7) + 1;
|
||||
|
||||
/* bits per sample */
|
||||
switch ((value & 0xF0) >> 4) {
|
||||
case 0x0:
|
||||
status.bits_per_sample = 8;
|
||||
break;
|
||||
case 0x1:
|
||||
status.bits_per_sample = 16;
|
||||
break;
|
||||
case 0x2:
|
||||
status.bits_per_sample = 20;
|
||||
break;
|
||||
case 0x3:
|
||||
status.bits_per_sample = 24;
|
||||
break;
|
||||
case 0x4:
|
||||
status.bits_per_sample = 32;
|
||||
break;
|
||||
default:
|
||||
dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n",
|
||||
(int)value);
|
||||
status.bits_per_sample = 16;
|
||||
}
|
||||
|
||||
/* current sampling rate in HZ */
|
||||
if (value & 0x4000)
|
||||
status.rate = 44100;
|
||||
else
|
||||
status.rate = 48000;
|
||||
status.rate *= ((value >> 11) & 0x7) + 1;
|
||||
status.rate /= ((value >> 8) & 0x7) + 1;
|
||||
|
||||
value = RREG32(R600_AUDIO_STATUS_BITS);
|
||||
|
||||
/* iec 60958 status bits */
|
||||
status.status_bits = value & 0xff;
|
||||
|
||||
/* iec 60958 category code */
|
||||
status.category_code = (value >> 8) & 0xff;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* update all hdmi interfaces with current audio parameters
|
||||
*/
|
||||
void r600_audio_update_hdmi(struct work_struct *work)
|
||||
{
|
||||
struct radeon_device *rdev = container_of(work, struct radeon_device,
|
||||
audio_work);
|
||||
struct drm_device *dev = rdev->ddev;
|
||||
struct r600_audio_pin audio_status = r600_audio_status(rdev);
|
||||
struct drm_encoder *encoder;
|
||||
bool changed = false;
|
||||
|
||||
if (rdev->audio.pin[0].channels != audio_status.channels ||
|
||||
rdev->audio.pin[0].rate != audio_status.rate ||
|
||||
rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample ||
|
||||
rdev->audio.pin[0].status_bits != audio_status.status_bits ||
|
||||
rdev->audio.pin[0].category_code != audio_status.category_code) {
|
||||
rdev->audio.pin[0] = audio_status;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||
if (!radeon_dig_encoder(encoder))
|
||||
continue;
|
||||
if (changed || r600_hdmi_buffer_status_changed(encoder))
|
||||
r600_hdmi_update_audio_settings(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
/* enable the audio stream */
|
||||
void r600_audio_enable(struct radeon_device *rdev,
|
||||
struct r600_audio_pin *pin,
|
||||
bool enable)
|
||||
{
|
||||
u32 value = 0;
|
||||
|
||||
if (!pin)
|
||||
return;
|
||||
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
if (enable) {
|
||||
value |= 0x81000000; /* Required to enable audio */
|
||||
value |= 0x0e1000f0; /* fglrx sets that too */
|
||||
}
|
||||
WREG32(EVERGREEN_AUDIO_ENABLE, value);
|
||||
} else {
|
||||
WREG32_P(R600_AUDIO_ENABLE,
|
||||
enable ? 0x81000000 : 0x0, ~0x81000000);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize the audio vars
|
||||
*/
|
||||
int r600_audio_init(struct radeon_device *rdev)
|
||||
{
|
||||
if (!radeon_audio || !r600_audio_chipset_supported(rdev))
|
||||
return 0;
|
||||
|
||||
rdev->audio.enabled = true;
|
||||
|
||||
rdev->audio.num_pins = 1;
|
||||
rdev->audio.pin[0].channels = -1;
|
||||
rdev->audio.pin[0].rate = -1;
|
||||
rdev->audio.pin[0].bits_per_sample = -1;
|
||||
rdev->audio.pin[0].status_bits = 0;
|
||||
rdev->audio.pin[0].category_code = 0;
|
||||
rdev->audio.pin[0].id = 0;
|
||||
/* disable audio. it will be set up later */
|
||||
r600_audio_enable(rdev, &rdev->audio.pin[0], false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* release the audio timer
|
||||
* TODO: How to do this correctly on SMP systems?
|
||||
*/
|
||||
void r600_audio_fini(struct radeon_device *rdev)
|
||||
{
|
||||
if (!rdev->audio.enabled)
|
||||
return;
|
||||
|
||||
r600_audio_enable(rdev, &rdev->audio.pin[0], false);
|
||||
|
||||
rdev->audio.enabled = false;
|
||||
}
|
||||
|
||||
struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev)
|
||||
{
|
||||
/* only one pin on 6xx-NI */
|
||||
return &rdev->audio.pin[0];
|
||||
}
|
@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
for (i = 0; i < num_loops; i++) {
|
||||
|
@ -71,6 +71,169 @@ static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* check if the chipset is supported
|
||||
*/
|
||||
static int r600_audio_chipset_supported(struct radeon_device *rdev)
|
||||
{
|
||||
return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev);
|
||||
}
|
||||
|
||||
static struct r600_audio_pin r600_audio_status(struct radeon_device *rdev)
|
||||
{
|
||||
struct r600_audio_pin status;
|
||||
uint32_t value;
|
||||
|
||||
value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL);
|
||||
|
||||
/* number of channels */
|
||||
status.channels = (value & 0x7) + 1;
|
||||
|
||||
/* bits per sample */
|
||||
switch ((value & 0xF0) >> 4) {
|
||||
case 0x0:
|
||||
status.bits_per_sample = 8;
|
||||
break;
|
||||
case 0x1:
|
||||
status.bits_per_sample = 16;
|
||||
break;
|
||||
case 0x2:
|
||||
status.bits_per_sample = 20;
|
||||
break;
|
||||
case 0x3:
|
||||
status.bits_per_sample = 24;
|
||||
break;
|
||||
case 0x4:
|
||||
status.bits_per_sample = 32;
|
||||
break;
|
||||
default:
|
||||
dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n",
|
||||
(int)value);
|
||||
status.bits_per_sample = 16;
|
||||
}
|
||||
|
||||
/* current sampling rate in HZ */
|
||||
if (value & 0x4000)
|
||||
status.rate = 44100;
|
||||
else
|
||||
status.rate = 48000;
|
||||
status.rate *= ((value >> 11) & 0x7) + 1;
|
||||
status.rate /= ((value >> 8) & 0x7) + 1;
|
||||
|
||||
value = RREG32(R600_AUDIO_STATUS_BITS);
|
||||
|
||||
/* iec 60958 status bits */
|
||||
status.status_bits = value & 0xff;
|
||||
|
||||
/* iec 60958 category code */
|
||||
status.category_code = (value >> 8) & 0xff;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* update all hdmi interfaces with current audio parameters
|
||||
*/
|
||||
void r600_audio_update_hdmi(struct work_struct *work)
|
||||
{
|
||||
struct radeon_device *rdev = container_of(work, struct radeon_device,
|
||||
audio_work);
|
||||
struct drm_device *dev = rdev->ddev;
|
||||
struct r600_audio_pin audio_status = r600_audio_status(rdev);
|
||||
struct drm_encoder *encoder;
|
||||
bool changed = false;
|
||||
|
||||
if (rdev->audio.pin[0].channels != audio_status.channels ||
|
||||
rdev->audio.pin[0].rate != audio_status.rate ||
|
||||
rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample ||
|
||||
rdev->audio.pin[0].status_bits != audio_status.status_bits ||
|
||||
rdev->audio.pin[0].category_code != audio_status.category_code) {
|
||||
rdev->audio.pin[0] = audio_status;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||
if (!radeon_encoder_is_digital(encoder))
|
||||
continue;
|
||||
if (changed || r600_hdmi_buffer_status_changed(encoder))
|
||||
r600_hdmi_update_audio_settings(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
/* enable the audio stream */
|
||||
void r600_audio_enable(struct radeon_device *rdev,
|
||||
struct r600_audio_pin *pin,
|
||||
u8 enable_mask)
|
||||
{
|
||||
u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL);
|
||||
|
||||
if (!pin)
|
||||
return;
|
||||
|
||||
if (enable_mask) {
|
||||
tmp |= AUDIO_ENABLED;
|
||||
if (enable_mask & 1)
|
||||
tmp |= PIN0_AUDIO_ENABLED;
|
||||
if (enable_mask & 2)
|
||||
tmp |= PIN1_AUDIO_ENABLED;
|
||||
if (enable_mask & 4)
|
||||
tmp |= PIN2_AUDIO_ENABLED;
|
||||
if (enable_mask & 8)
|
||||
tmp |= PIN3_AUDIO_ENABLED;
|
||||
} else {
|
||||
tmp &= ~(AUDIO_ENABLED |
|
||||
PIN0_AUDIO_ENABLED |
|
||||
PIN1_AUDIO_ENABLED |
|
||||
PIN2_AUDIO_ENABLED |
|
||||
PIN3_AUDIO_ENABLED);
|
||||
}
|
||||
|
||||
WREG32(AZ_HOT_PLUG_CONTROL, tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize the audio vars
|
||||
*/
|
||||
int r600_audio_init(struct radeon_device *rdev)
|
||||
{
|
||||
if (!radeon_audio || !r600_audio_chipset_supported(rdev))
|
||||
return 0;
|
||||
|
||||
rdev->audio.enabled = true;
|
||||
|
||||
rdev->audio.num_pins = 1;
|
||||
rdev->audio.pin[0].channels = -1;
|
||||
rdev->audio.pin[0].rate = -1;
|
||||
rdev->audio.pin[0].bits_per_sample = -1;
|
||||
rdev->audio.pin[0].status_bits = 0;
|
||||
rdev->audio.pin[0].category_code = 0;
|
||||
rdev->audio.pin[0].id = 0;
|
||||
/* disable audio. it will be set up later */
|
||||
r600_audio_enable(rdev, &rdev->audio.pin[0], 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* release the audio timer
|
||||
* TODO: How to do this correctly on SMP systems?
|
||||
*/
|
||||
void r600_audio_fini(struct radeon_device *rdev)
|
||||
{
|
||||
if (!rdev->audio.enabled)
|
||||
return;
|
||||
|
||||
r600_audio_enable(rdev, &rdev->audio.pin[0], 0);
|
||||
|
||||
rdev->audio.enabled = false;
|
||||
}
|
||||
|
||||
struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev)
|
||||
{
|
||||
/* only one pin on 6xx-NI */
|
||||
return &rdev->audio.pin[0];
|
||||
}
|
||||
|
||||
/*
|
||||
* calculate CTS and N values if they are not found in the table
|
||||
*/
|
||||
@ -357,7 +520,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
|
||||
|
||||
/* disable audio prior to setting up hw */
|
||||
dig->afmt->pin = r600_audio_get_pin(rdev);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, false);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, 0xf);
|
||||
|
||||
r600_audio_set_dto(encoder, mode->clock);
|
||||
|
||||
@ -443,7 +606,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
|
||||
WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001);
|
||||
|
||||
/* enable audio after to setting up hw */
|
||||
r600_audio_enable(rdev, dig->afmt->pin, true);
|
||||
r600_audio_enable(rdev, dig->afmt->pin, 0xf);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -528,6 +691,11 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable)
|
||||
if (!enable && !dig->afmt->enabled)
|
||||
return;
|
||||
|
||||
if (!enable && dig->afmt->pin) {
|
||||
r600_audio_enable(rdev, dig->afmt->pin, 0);
|
||||
dig->afmt->pin = NULL;
|
||||
}
|
||||
|
||||
/* Older chipsets require setting HDMI and routing manually */
|
||||
if (!ASIC_IS_DCE3(rdev)) {
|
||||
if (enable)
|
||||
|
@ -934,6 +934,23 @@
|
||||
# define TARGET_LINK_SPEED_MASK (0xf << 0)
|
||||
# define SELECTABLE_DEEMPHASIS (1 << 6)
|
||||
|
||||
/* Audio */
|
||||
#define AZ_HOT_PLUG_CONTROL 0x7300
|
||||
# define AZ_FORCE_CODEC_WAKE (1 << 0)
|
||||
# define JACK_DETECTION_ENABLE (1 << 4)
|
||||
# define UNSOLICITED_RESPONSE_ENABLE (1 << 8)
|
||||
# define CODEC_HOT_PLUG_ENABLE (1 << 12)
|
||||
# define AUDIO_ENABLED (1 << 31)
|
||||
/* DCE3 adds */
|
||||
# define PIN0_JACK_DETECTION_ENABLE (1 << 4)
|
||||
# define PIN1_JACK_DETECTION_ENABLE (1 << 5)
|
||||
# define PIN2_JACK_DETECTION_ENABLE (1 << 6)
|
||||
# define PIN3_JACK_DETECTION_ENABLE (1 << 7)
|
||||
# define PIN0_AUDIO_ENABLED (1 << 24)
|
||||
# define PIN1_AUDIO_ENABLED (1 << 25)
|
||||
# define PIN2_AUDIO_ENABLED (1 << 26)
|
||||
# define PIN3_AUDIO_ENABLED (1 << 27)
|
||||
|
||||
/* Audio clocks DCE 2.0/3.0 */
|
||||
#define AUDIO_DTO 0x7340
|
||||
# define AUDIO_DTO_PHASE(x) (((x) & 0xffff) << 0)
|
||||
|
@ -589,9 +589,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
|
||||
struct radeon_semaphore *semaphore);
|
||||
void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
|
||||
struct radeon_fence *fence);
|
||||
void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
|
||||
struct reservation_object *resv,
|
||||
bool shared);
|
||||
int radeon_semaphore_sync_resv(struct radeon_device *rdev,
|
||||
struct radeon_semaphore *semaphore,
|
||||
struct reservation_object *resv,
|
||||
bool shared);
|
||||
int radeon_semaphore_sync_rings(struct radeon_device *rdev,
|
||||
struct radeon_semaphore *semaphore,
|
||||
int waiting_ring);
|
||||
@ -712,7 +713,7 @@ struct radeon_flip_work {
|
||||
uint64_t base;
|
||||
struct drm_pending_vblank_event *event;
|
||||
struct radeon_bo *old_rbo;
|
||||
struct radeon_fence *fence;
|
||||
struct fence *fence;
|
||||
};
|
||||
|
||||
struct r500_irq_stat_regs {
|
||||
@ -2977,10 +2978,10 @@ struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev);
|
||||
struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev);
|
||||
void r600_audio_enable(struct radeon_device *rdev,
|
||||
struct r600_audio_pin *pin,
|
||||
bool enable);
|
||||
u8 enable_mask);
|
||||
void dce6_audio_enable(struct radeon_device *rdev,
|
||||
struct r600_audio_pin *pin,
|
||||
bool enable);
|
||||
u8 enable_mask);
|
||||
|
||||
/*
|
||||
* R600 vram scratch functions
|
||||
|
@ -392,7 +392,6 @@ void r600_disable_interrupts(struct radeon_device *rdev);
|
||||
void r600_rlc_stop(struct radeon_device *rdev);
|
||||
/* r600 audio */
|
||||
int r600_audio_init(struct radeon_device *rdev);
|
||||
struct r600_audio_pin r600_audio_status(struct radeon_device *rdev);
|
||||
void r600_audio_fini(struct radeon_device *rdev);
|
||||
void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock);
|
||||
void r600_hdmi_update_avi_infoframe(struct drm_encoder *encoder, void *buffer,
|
||||
|
@ -458,7 +458,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
||||
return true;
|
||||
}
|
||||
|
||||
const int supported_devices_connector_convert[] = {
|
||||
static const int supported_devices_connector_convert[] = {
|
||||
DRM_MODE_CONNECTOR_Unknown,
|
||||
DRM_MODE_CONNECTOR_VGA,
|
||||
DRM_MODE_CONNECTOR_DVII,
|
||||
@ -477,7 +477,7 @@ const int supported_devices_connector_convert[] = {
|
||||
DRM_MODE_CONNECTOR_DisplayPort
|
||||
};
|
||||
|
||||
const uint16_t supported_devices_connector_object_id_convert[] = {
|
||||
static const uint16_t supported_devices_connector_object_id_convert[] = {
|
||||
CONNECTOR_OBJECT_ID_NONE,
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */
|
||||
@ -494,7 +494,7 @@ const uint16_t supported_devices_connector_object_id_convert[] = {
|
||||
CONNECTOR_OBJECT_ID_SVIDEO
|
||||
};
|
||||
|
||||
const int object_connector_convert[] = {
|
||||
static const int object_connector_convert[] = {
|
||||
DRM_MODE_CONNECTOR_Unknown,
|
||||
DRM_MODE_CONNECTOR_DVII,
|
||||
DRM_MODE_CONNECTOR_DVII,
|
||||
|
@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
|
||||
int time;
|
||||
|
||||
n = RADEON_BENCHMARK_ITERATIONS;
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
|
||||
if (r) {
|
||||
goto out_cleanup;
|
||||
}
|
||||
@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
|
||||
if (r) {
|
||||
goto out_cleanup;
|
||||
}
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
|
||||
if (r) {
|
||||
goto out_cleanup;
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ enum radeon_combios_connector {
|
||||
CONNECTOR_UNSUPPORTED_LEGACY
|
||||
};
|
||||
|
||||
const int legacy_connector_convert[] = {
|
||||
static const int legacy_connector_convert[] = {
|
||||
DRM_MODE_CONNECTOR_Unknown,
|
||||
DRM_MODE_CONNECTOR_DVID,
|
||||
DRM_MODE_CONNECTOR_VGA,
|
||||
|
@ -249,9 +249,9 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
|
||||
static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
|
||||
{
|
||||
int i;
|
||||
int i, r = 0;
|
||||
|
||||
for (i = 0; i < p->nrelocs; i++) {
|
||||
struct reservation_object *resv;
|
||||
@ -260,9 +260,13 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
|
||||
continue;
|
||||
|
||||
resv = p->relocs[i].robj->tbo.resv;
|
||||
radeon_semaphore_sync_resv(p->ib.semaphore, resv,
|
||||
p->relocs[i].tv.shared);
|
||||
r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
|
||||
p->relocs[i].tv.shared);
|
||||
|
||||
if (r)
|
||||
break;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/* XXX: note that this is called from the legacy UMS CS ioctl as well */
|
||||
@ -472,13 +476,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
|
||||
return r;
|
||||
}
|
||||
|
||||
r = radeon_cs_sync_rings(parser);
|
||||
if (r) {
|
||||
if (r != -ERESTARTSYS)
|
||||
DRM_ERROR("Failed to sync rings: %i\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
if (parser->ring == R600_RING_TYPE_UVD_INDEX)
|
||||
radeon_uvd_note_usage(rdev);
|
||||
else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
|
||||
(parser->ring == TN_RING_TYPE_VCE2_INDEX))
|
||||
radeon_vce_note_usage(rdev);
|
||||
|
||||
radeon_cs_sync_rings(parser);
|
||||
r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed to schedule IB !\n");
|
||||
@ -565,7 +575,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
|
||||
if (r) {
|
||||
goto out;
|
||||
}
|
||||
radeon_cs_sync_rings(parser);
|
||||
|
||||
r = radeon_cs_sync_rings(parser);
|
||||
if (r) {
|
||||
if (r != -ERESTARTSYS)
|
||||
DRM_ERROR("Failed to sync rings: %i\n", r);
|
||||
goto out;
|
||||
}
|
||||
radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
|
||||
|
||||
if ((rdev->family >= CHIP_TAHITI) &&
|
||||
|
@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev)
|
||||
|
||||
if (rdev->wb.wb_obj == NULL) {
|
||||
r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
|
||||
&rdev->wb.wb_obj);
|
||||
if (r) {
|
||||
dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
|
||||
|
@ -402,14 +402,21 @@ static void radeon_flip_work_func(struct work_struct *__work)
|
||||
|
||||
down_read(&rdev->exclusive_lock);
|
||||
if (work->fence) {
|
||||
r = radeon_fence_wait(work->fence, false);
|
||||
if (r == -EDEADLK) {
|
||||
up_read(&rdev->exclusive_lock);
|
||||
do {
|
||||
r = radeon_gpu_reset(rdev);
|
||||
} while (r == -EAGAIN);
|
||||
down_read(&rdev->exclusive_lock);
|
||||
}
|
||||
struct radeon_fence *fence;
|
||||
|
||||
fence = to_radeon_fence(work->fence);
|
||||
if (fence && fence->rdev == rdev) {
|
||||
r = radeon_fence_wait(fence, false);
|
||||
if (r == -EDEADLK) {
|
||||
up_read(&rdev->exclusive_lock);
|
||||
do {
|
||||
r = radeon_gpu_reset(rdev);
|
||||
} while (r == -EAGAIN);
|
||||
down_read(&rdev->exclusive_lock);
|
||||
}
|
||||
} else
|
||||
r = fence_wait(work->fence, false);
|
||||
|
||||
if (r)
|
||||
DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
|
||||
|
||||
@ -418,7 +425,8 @@ static void radeon_flip_work_func(struct work_struct *__work)
|
||||
* confused about which BO the CRTC is scanning out
|
||||
*/
|
||||
|
||||
radeon_fence_unref(&work->fence);
|
||||
fence_put(work->fence);
|
||||
work->fence = NULL;
|
||||
}
|
||||
|
||||
/* We borrow the event spin lock for protecting flip_status */
|
||||
@ -494,7 +502,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
|
||||
DRM_ERROR("failed to pin new rbo buffer before flip\n");
|
||||
goto cleanup;
|
||||
}
|
||||
work->fence = (struct radeon_fence *)fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
|
||||
work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
|
||||
radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);
|
||||
radeon_bo_unreserve(new_rbo);
|
||||
|
||||
@ -576,7 +584,7 @@ pflip_cleanup:
|
||||
|
||||
cleanup:
|
||||
drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
|
||||
radeon_fence_unref(&work->fence);
|
||||
fence_put(work->fence);
|
||||
kfree(work);
|
||||
return r;
|
||||
}
|
||||
|
@ -382,3 +382,24 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
|
||||
}
|
||||
}
|
||||
|
||||
bool radeon_encoder_is_digital(struct drm_encoder *encoder)
|
||||
{
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
switch (radeon_encoder->encoder_id) {
|
||||
case ENCODER_OBJECT_ID_INTERNAL_LVDS:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DVO1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DDI:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -541,6 +541,15 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
|
||||
uint64_t seq[RADEON_NUM_RINGS] = {};
|
||||
long r;
|
||||
|
||||
/*
|
||||
* 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, MAX_SCHEDULE_TIMEOUT);
|
||||
if (r < 0) {
|
||||
|
@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
|
||||
if (rdev->gart.robj == NULL) {
|
||||
r = radeon_bo_create(rdev, rdev->gart.table_size,
|
||||
PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||
0, NULL, &rdev->gart.robj);
|
||||
0, NULL, NULL, &rdev->gart.robj);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
|
||||
|
||||
retry:
|
||||
r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
|
||||
flags, NULL, &robj);
|
||||
flags, NULL, NULL, &robj);
|
||||
if (r) {
|
||||
if (r != -ERESTARTSYS) {
|
||||
if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||
|
@ -777,6 +777,7 @@ extern void atombios_digital_setup(struct drm_encoder *encoder, int action);
|
||||
extern int atombios_get_encoder_mode(struct drm_encoder *encoder);
|
||||
extern bool atombios_set_edp_panel_power(struct drm_connector *connector, int action);
|
||||
extern void radeon_encoder_set_active_device(struct drm_encoder *encoder);
|
||||
extern bool radeon_encoder_is_digital(struct drm_encoder *encoder);
|
||||
|
||||
extern void radeon_crtc_load_lut(struct drm_crtc *crtc);
|
||||
extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
|
||||
|
@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
||||
}
|
||||
|
||||
int radeon_bo_create(struct radeon_device *rdev,
|
||||
unsigned long size, int byte_align, bool kernel, u32 domain,
|
||||
u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
|
||||
unsigned long size, int byte_align, bool kernel,
|
||||
u32 domain, u32 flags, struct sg_table *sg,
|
||||
struct reservation_object *resv,
|
||||
struct radeon_bo **bo_ptr)
|
||||
{
|
||||
struct radeon_bo *bo;
|
||||
enum ttm_bo_type type;
|
||||
@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,
|
||||
down_read(&rdev->pm.mclk_lock);
|
||||
r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
|
||||
&bo->placement, page_align, !kernel, NULL,
|
||||
acc_size, sg, NULL, &radeon_ttm_bo_destroy);
|
||||
acc_size, sg, resv, &radeon_ttm_bo_destroy);
|
||||
up_read(&rdev->pm.mclk_lock);
|
||||
if (unlikely(r != 0)) {
|
||||
return r;
|
||||
|
@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev,
|
||||
unsigned long size, int byte_align,
|
||||
bool kernel, u32 domain, u32 flags,
|
||||
struct sg_table *sg,
|
||||
struct reservation_object *resv,
|
||||
struct radeon_bo **bo_ptr);
|
||||
extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
|
||||
extern void radeon_bo_kunmap(struct radeon_bo *bo);
|
||||
|
@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
|
||||
struct dma_buf_attachment *attach,
|
||||
struct sg_table *sg)
|
||||
{
|
||||
struct reservation_object *resv = attach->dmabuf->resv;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_bo *bo;
|
||||
int ret;
|
||||
|
||||
ww_mutex_lock(&resv->lock, NULL);
|
||||
ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
|
||||
RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo);
|
||||
ww_mutex_unlock(&resv->lock);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
|
@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
|
||||
/* Allocate ring buffer */
|
||||
if (ring->ring_obj == NULL) {
|
||||
r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_GTT, 0,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL,
|
||||
NULL, &ring->ring_obj);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "(%d) ring create failed\n", r);
|
||||
|
@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
|
||||
}
|
||||
|
||||
r = radeon_bo_create(rdev, size, align, true,
|
||||
domain, flags, NULL, &sa_manager->bo);
|
||||
domain, flags, NULL, NULL, &sa_manager->bo);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
|
||||
return r;
|
||||
|
@ -124,27 +124,42 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
|
||||
*
|
||||
* Sync to the fence using this semaphore object
|
||||
*/
|
||||
void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
|
||||
struct reservation_object *resv,
|
||||
bool shared)
|
||||
int radeon_semaphore_sync_resv(struct radeon_device *rdev,
|
||||
struct radeon_semaphore *sema,
|
||||
struct reservation_object *resv,
|
||||
bool shared)
|
||||
{
|
||||
struct reservation_object_list *flist;
|
||||
struct fence *f;
|
||||
struct radeon_fence *fence;
|
||||
unsigned i;
|
||||
int r = 0;
|
||||
|
||||
/* always sync to the exclusive fence */
|
||||
f = reservation_object_get_excl(resv);
|
||||
radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
|
||||
fence = f ? to_radeon_fence(f) : NULL;
|
||||
if (fence && fence->rdev == rdev)
|
||||
radeon_semaphore_sync_fence(sema, fence);
|
||||
else if (f)
|
||||
r = fence_wait(f, true);
|
||||
|
||||
flist = reservation_object_get_list(resv);
|
||||
if (shared || !flist)
|
||||
return;
|
||||
if (shared || !flist || r)
|
||||
return r;
|
||||
|
||||
for (i = 0; i < flist->shared_count; ++i) {
|
||||
f = rcu_dereference_protected(flist->shared[i],
|
||||
reservation_object_held(resv));
|
||||
radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
|
||||
fence = to_radeon_fence(f);
|
||||
if (fence && fence->rdev == rdev)
|
||||
radeon_semaphore_sync_fence(sema, fence);
|
||||
else
|
||||
r = fence_wait(f, true);
|
||||
|
||||
if (r)
|
||||
break;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
|
||||
}
|
||||
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||
0, NULL, &vram_obj);
|
||||
0, NULL, NULL, &vram_obj);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed to create VRAM object\n");
|
||||
goto out_cleanup;
|
||||
@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
|
||||
struct radeon_fence *fence = NULL;
|
||||
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
|
||||
RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
|
||||
gtt_obj + i);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed to create GTT object %d\n", i);
|
||||
goto out_lclean;
|
||||
|
@ -865,7 +865,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
|
||||
radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
|
||||
|
||||
r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
NULL, &rdev->stollen_vga_memory);
|
||||
if (r) {
|
||||
return r;
|
||||
|
@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev)
|
||||
RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
|
||||
RADEON_GPU_PAGE_SIZE;
|
||||
r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
NULL, &rdev->uvd.vcpu_bo);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
|
||||
return r;
|
||||
|
@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev)
|
||||
size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
|
||||
RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
|
||||
r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
|
||||
&rdev->vce.vcpu_bo);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
|
||||
return r;
|
||||
|
@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
||||
|
||||
r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
|
||||
RADEON_GPU_PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
|
||||
RADEON_GEM_DOMAIN_VRAM, 0,
|
||||
NULL, NULL, &pt);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -698,7 +699,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
|
||||
if (ib.length_dw != 0) {
|
||||
radeon_asic_vm_pad_ib(rdev, &ib);
|
||||
|
||||
radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false);
|
||||
radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);
|
||||
WARN_ON(ib.length_dw > ndw);
|
||||
r = radeon_ib_schedule(rdev, &ib, NULL, false);
|
||||
@ -825,7 +826,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
|
||||
unsigned nptes;
|
||||
uint64_t pte;
|
||||
|
||||
radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false);
|
||||
|
||||
if ((addr & ~mask) == (end & ~mask))
|
||||
nptes = end - addr;
|
||||
@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
|
||||
|
||||
r = radeon_bo_create(rdev, pd_size, align, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
&vm->page_directory);
|
||||
NULL, &vm->page_directory);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
@ -26,7 +26,6 @@
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
|
@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
for (i = 0; i < num_loops; i++) {
|
||||
|
@ -4684,7 +4684,7 @@ static int si_vm_packet3_compute_check(struct radeon_device *rdev,
|
||||
int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
{
|
||||
int ret = 0;
|
||||
u32 idx = 0;
|
||||
u32 idx = 0, i;
|
||||
struct radeon_cs_packet pkt;
|
||||
|
||||
do {
|
||||
@ -4695,6 +4695,12 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
switch (pkt.type) {
|
||||
case RADEON_PACKET_TYPE0:
|
||||
dev_err(rdev->dev, "Packet0 not allowed!\n");
|
||||
for (i = 0; i < ib->length_dw; i++) {
|
||||
if (i == idx)
|
||||
printk("\t0x%08x <---\n", ib->ptr[i]);
|
||||
else
|
||||
printk("\t0x%08x\n", ib->ptr[i]);
|
||||
}
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
case RADEON_PACKET_TYPE2:
|
||||
|
@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
radeon_semaphore_sync_resv(sem, resv, false);
|
||||
radeon_semaphore_sync_resv(rdev, sem, resv, false);
|
||||
radeon_semaphore_sync_rings(rdev, sem, ring->idx);
|
||||
|
||||
for (i = 0; i < num_loops; i++) {
|
||||
|
@ -2916,7 +2916,6 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
bool disable_sclk_switching = false;
|
||||
u32 mclk, sclk;
|
||||
u16 vddc, vddci;
|
||||
u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
|
||||
int i;
|
||||
|
||||
if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
|
||||
@ -2950,29 +2949,6 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
}
|
||||
}
|
||||
|
||||
/* limit clocks to max supported clocks based on voltage dependency tables */
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
|
||||
&max_sclk_vddc);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
|
||||
&max_mclk_vddci);
|
||||
btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
|
||||
&max_mclk_vddc);
|
||||
|
||||
for (i = 0; i < ps->performance_level_count; i++) {
|
||||
if (max_sclk_vddc) {
|
||||
if (ps->performance_levels[i].sclk > max_sclk_vddc)
|
||||
ps->performance_levels[i].sclk = max_sclk_vddc;
|
||||
}
|
||||
if (max_mclk_vddci) {
|
||||
if (ps->performance_levels[i].mclk > max_mclk_vddci)
|
||||
ps->performance_levels[i].mclk = max_mclk_vddci;
|
||||
}
|
||||
if (max_mclk_vddc) {
|
||||
if (ps->performance_levels[i].mclk > max_mclk_vddc)
|
||||
ps->performance_levels[i].mclk = max_mclk_vddc;
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX validate the min clocks required for display */
|
||||
|
||||
if (disable_mclk_switching) {
|
||||
|
@ -736,7 +736,7 @@
|
||||
# define DESCRIPTION16(x) (((x) & 0xff) << 0)
|
||||
# define DESCRIPTION17(x) (((x) & 0xff) << 8)
|
||||
|
||||
#define AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL 0x54
|
||||
#define AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL 0x54
|
||||
# define AUDIO_ENABLED (1 << 31)
|
||||
|
||||
#define AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT 0x56
|
||||
|
Loading…
x
Reference in New Issue
Block a user