Merge tag 'drm-for-v4.13' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "This is the main pull request for the drm, I think I've got one later driver pull for mediatek SoC driver, I'm undecided on if it needs to go to you yet. Otherwise summary below: Core drm: - Atomic add driver private objects - Deprecate preclose hook in modern drivers - MST bandwidth tracking - Use kvmalloc in more places - Add mode_valid hook for crtc/encoder/bridge - Reduce sync_file construction time - Documentation updates - New DRM synchronisation object support New drivers: - pl111 - pl111 CLCD display controller Panel: - Innolux P079ZCA panel driver - Add NL12880B20-05, NL192108AC18-02D, P320HVN03 panels - panel-samsung-s6e3ha2: Add s6e3hf2 panel support i915: - SKL+ watermark fixes - G4x/G33 reset improvements - DP AUX backlight improvements - Buffer based GuC/host communication - New getparam for (sub)slice infomation - Cannonlake and Coffeelake initial patches - Execbuf optimisations radeon/amdgpu: - Lots of Vega10 bug fixes - Preliminary raven support - KIQ support for compute rings - MEC queue management rework - DCE6 Audio support - SR-IOV improvements - Better radeon/amdgpu selection support nouveau: - HDMI stereoscopic support - Display code rework for >= GM20x GPUs msm: - GEM rework for fine-grained locking - Per-process pagetable work - HDMI fixes for Snapdragon 820. vc4: - Remove 256MB CMA limit from vc4 - Add out-fence support - Add support for cygnus - Get/set tiling ioctls support - Add T-format tiling support for scanout zte: - add VGA support. etnaviv: - Thermal throttle support for newer GPUs - Restore userspace buffer cache performance - dma-buf sync fix stm: - add stm32f429 display support exynos: - Rework vblank handling - Fixup sw-trigger code sun4i: - V3s display engine support - HDMI support for older SoCs - Preliminary work on dual-pipeline SoCs. rcar-du: - VSP work imx-drm: - Remove counter load enable from PRE - Double read/write reduction flag support tegra: - Documentation for the host1x and drm driver. - Lots of staging ioctl fixes due to grate project work. omapdrm: - dma-buf fence support - TILER rotation fixes" * tag 'drm-for-v4.13' of git://people.freedesktop.org/~airlied/linux: (1270 commits) drm: Remove unused drm_file parameter to drm_syncobj_replace_fence() drm/amd/powerplay: fix bug fail to remove sysfs when rmmod amdgpu. amdgpu: Set cik/si_support to 1 by default if radeon isn't built drm/amdgpu/gfx9: fix driver reload with KIQ drm/amdgpu/gfx8: fix driver reload with KIQ drm/amdgpu: Don't call amd_powerplay_destroy() if we don't have powerplay drm/ttm: Fix use-after-free in ttm_bo_clean_mm drm/amd/amdgpu: move get memory type function from early init to sw init drm/amdgpu/cgs: always set reference clock in mode_info drm/amdgpu: fix vblank_time when displays are off drm/amd/powerplay: power value format change for Vega10 drm/amdgpu/gfx9: support the amdgpu.disable_cu option drm/amd/powerplay: change PPSMC_MSG_GetCurrPkgPwr for Vega10 drm/amdgpu: Make amdgpu_cs_parser_init static (v2) drm/amdgpu/cs: fix a typo in a comment drm/amdgpu: Fix the exported always on CU bitmap drm/amdgpu/gfx9: gfx_v9_0_enable_gfx_static_mg_power_gating() can be static drm/amdgpu/psp: upper_32_bits/lower_32_bits for address setup drm/amd/powerplay/cz: print message if smc message fails drm/amdgpu: fix typo in amdgpu_debugfs_test_ib_init ...
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
# Makefile for the drm device driver. This driver provides support for the
|
||||
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
|
||||
|
||||
ccflags-y := -Iinclude/drm -Idrivers/gpu/drm/amd/include
|
||||
ccflags-y := -Idrivers/gpu/drm/amd/include
|
||||
|
||||
hostprogs-y := mkregtable
|
||||
clean-files := rn50_reg_safe.h r100_reg_safe.h r200_reg_safe.h rv515_reg_safe.h r300_reg_safe.h r420_reg_safe.h rs600_reg_safe.h r600_reg_safe.h evergreen_reg_safe.h cayman_reg_safe.h
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "btcd.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/firmware.h>
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "radeon_ucode.h"
|
||||
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/firmware.h>
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "cikd.h"
|
||||
#include "ppsmc.h"
|
||||
|
@@ -24,7 +24,7 @@
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "radeon_audio.h"
|
||||
@@ -4580,23 +4580,24 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
|
||||
/* init the pipes */
|
||||
mutex_lock(&rdev->srbm_mutex);
|
||||
|
||||
eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr;
|
||||
for (i = 0; i < rdev->mec.num_pipe; ++i) {
|
||||
cik_srbm_select(rdev, 0, i, 0, 0);
|
||||
|
||||
cik_srbm_select(rdev, 0, 0, 0, 0);
|
||||
eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE * 2) ;
|
||||
/* write the EOP addr */
|
||||
WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
|
||||
WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
|
||||
|
||||
/* write the EOP addr */
|
||||
WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
|
||||
WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
|
||||
/* set the VMID assigned */
|
||||
WREG32(CP_HPD_EOP_VMID, 0);
|
||||
|
||||
/* set the VMID assigned */
|
||||
WREG32(CP_HPD_EOP_VMID, 0);
|
||||
|
||||
/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
|
||||
tmp = RREG32(CP_HPD_EOP_CONTROL);
|
||||
tmp &= ~EOP_SIZE_MASK;
|
||||
tmp |= order_base_2(MEC_HPD_SIZE / 8);
|
||||
WREG32(CP_HPD_EOP_CONTROL, tmp);
|
||||
/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
|
||||
tmp = RREG32(CP_HPD_EOP_CONTROL);
|
||||
tmp &= ~EOP_SIZE_MASK;
|
||||
tmp |= order_base_2(MEC_HPD_SIZE / 8);
|
||||
WREG32(CP_HPD_EOP_CONTROL, tmp);
|
||||
|
||||
}
|
||||
mutex_unlock(&rdev->srbm_mutex);
|
||||
|
||||
/* init the queues. Just two for now. */
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "evergreend.h"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "cikd.h"
|
||||
#include "r600_dpm.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "cikd.h"
|
||||
#include "kv_dpm.h"
|
||||
|
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "nid.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "r600d.h"
|
||||
|
@@ -68,11 +68,11 @@
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/dma-fence.h>
|
||||
|
||||
#include <ttm/ttm_bo_api.h>
|
||||
#include <ttm/ttm_bo_driver.h>
|
||||
#include <ttm/ttm_placement.h>
|
||||
#include <ttm/ttm_module.h>
|
||||
#include <ttm/ttm_execbuf_util.h>
|
||||
#include <drm/ttm/ttm_bo_api.h>
|
||||
#include <drm/ttm/ttm_bo_driver.h>
|
||||
#include <drm/ttm/ttm_placement.h>
|
||||
#include <drm/ttm/ttm_module.h>
|
||||
#include <drm/ttm/ttm_execbuf_util.h>
|
||||
|
||||
#include <drm/drm_gem.h>
|
||||
|
||||
@@ -115,6 +115,8 @@ extern int radeon_auxch;
|
||||
extern int radeon_mst;
|
||||
extern int radeon_uvd;
|
||||
extern int radeon_vce;
|
||||
extern int radeon_si_support;
|
||||
extern int radeon_cik_support;
|
||||
|
||||
/*
|
||||
* Copy from radeon_drv.h so we don't have to include both and have conflicting
|
||||
@@ -767,24 +769,9 @@ struct r600_irq_stat_regs {
|
||||
};
|
||||
|
||||
struct evergreen_irq_stat_regs {
|
||||
u32 disp_int;
|
||||
u32 disp_int_cont;
|
||||
u32 disp_int_cont2;
|
||||
u32 disp_int_cont3;
|
||||
u32 disp_int_cont4;
|
||||
u32 disp_int_cont5;
|
||||
u32 d1grph_int;
|
||||
u32 d2grph_int;
|
||||
u32 d3grph_int;
|
||||
u32 d4grph_int;
|
||||
u32 d5grph_int;
|
||||
u32 d6grph_int;
|
||||
u32 afmt_status1;
|
||||
u32 afmt_status2;
|
||||
u32 afmt_status3;
|
||||
u32 afmt_status4;
|
||||
u32 afmt_status5;
|
||||
u32 afmt_status6;
|
||||
u32 disp_int[6];
|
||||
u32 grph_int[6];
|
||||
u32 afmt_status[6];
|
||||
};
|
||||
|
||||
struct cik_irq_stat_regs {
|
||||
@@ -2976,6 +2963,12 @@ int r600_cs_common_vline_parse(struct radeon_cs_parser *p,
|
||||
uint32_t *vline_start_end,
|
||||
uint32_t *vline_status);
|
||||
|
||||
/* interrupt control register helpers */
|
||||
void radeon_irq_kms_set_irq_n_enabled(struct radeon_device *rdev,
|
||||
u32 reg, u32 mask,
|
||||
bool enable, const char *name,
|
||||
unsigned n);
|
||||
|
||||
#include "radeon_object.h"
|
||||
|
||||
#endif
|
||||
|
@@ -87,7 +87,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
||||
p->dma_reloc_idx = 0;
|
||||
/* FIXME: we assume that each relocs use 4 dwords */
|
||||
p->nrelocs = chunk->length_dw / 4;
|
||||
p->relocs = drm_calloc_large(p->nrelocs, sizeof(struct radeon_bo_list));
|
||||
p->relocs = kvmalloc_array(p->nrelocs, sizeof(struct radeon_bo_list),
|
||||
GFP_KERNEL | __GFP_ZERO);
|
||||
if (p->relocs == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -341,7 +342,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
|
||||
continue;
|
||||
}
|
||||
|
||||
p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t));
|
||||
p->chunks[i].kdata = kvmalloc_array(size, sizeof(uint32_t), GFP_KERNEL);
|
||||
size *= sizeof(uint32_t);
|
||||
if (p->chunks[i].kdata == NULL) {
|
||||
return -ENOMEM;
|
||||
@@ -440,10 +441,10 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
|
||||
}
|
||||
}
|
||||
kfree(parser->track);
|
||||
drm_free_large(parser->relocs);
|
||||
drm_free_large(parser->vm_bos);
|
||||
kvfree(parser->relocs);
|
||||
kvfree(parser->vm_bos);
|
||||
for (i = 0; i < parser->nchunks; i++)
|
||||
drm_free_large(parser->chunks[i].kdata);
|
||||
kvfree(parser->chunks[i].kdata);
|
||||
kfree(parser->chunks);
|
||||
kfree(parser->chunks_array);
|
||||
radeon_ib_free(parser->rdev, &parser->ib);
|
||||
|
@@ -42,7 +42,7 @@
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
|
||||
#include "drm_crtc_helper.h"
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include "radeon_kfd.h"
|
||||
|
||||
/*
|
||||
@@ -116,10 +116,6 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
|
||||
u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
|
||||
int radeon_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
|
||||
void radeon_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
|
||||
int radeon_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
|
||||
int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
|
||||
void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
|
||||
@@ -298,6 +294,14 @@ module_param_named(uvd, radeon_uvd, int, 0444);
|
||||
MODULE_PARM_DESC(vce, "vce enable/disable vce support (1 = enable, 0 = disable)");
|
||||
module_param_named(vce, radeon_vce, int, 0444);
|
||||
|
||||
int radeon_si_support = 1;
|
||||
MODULE_PARM_DESC(si_support, "SI support (1 = enabled (default), 0 = disabled)");
|
||||
module_param_named(si_support, radeon_si_support, int, 0444);
|
||||
|
||||
int radeon_cik_support = 1;
|
||||
MODULE_PARM_DESC(cik_support, "CIK support (1 = enabled (default), 0 = disabled)");
|
||||
module_param_named(cik_support, radeon_cik_support, int, 0444);
|
||||
|
||||
static struct pci_device_id pciidlist[] = {
|
||||
radeon_PCI_IDS
|
||||
};
|
||||
@@ -544,6 +548,16 @@ static const struct file_operations radeon_driver_kms_fops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
static bool
|
||||
radeon_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe,
|
||||
bool in_vblank_irq, int *vpos, int *hpos,
|
||||
ktime_t *stime, ktime_t *etime,
|
||||
const struct drm_display_mode *mode)
|
||||
{
|
||||
return radeon_get_crtc_scanoutpos(dev, pipe, 0, vpos, hpos,
|
||||
stime, etime, mode);
|
||||
}
|
||||
|
||||
static struct drm_driver kms_driver = {
|
||||
.driver_features =
|
||||
DRIVER_USE_AGP |
|
||||
@@ -558,8 +572,8 @@ static struct drm_driver kms_driver = {
|
||||
.get_vblank_counter = radeon_get_vblank_counter_kms,
|
||||
.enable_vblank = radeon_enable_vblank_kms,
|
||||
.disable_vblank = radeon_disable_vblank_kms,
|
||||
.get_vblank_timestamp = radeon_get_vblank_timestamp_kms,
|
||||
.get_scanout_position = radeon_get_crtc_scanoutpos,
|
||||
.get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos,
|
||||
.get_scanout_position = radeon_get_crtc_scanout_position,
|
||||
.irq_preinstall = radeon_driver_irq_preinstall_kms,
|
||||
.irq_postinstall = radeon_driver_irq_postinstall_kms,
|
||||
.irq_uninstall = radeon_driver_irq_uninstall_kms,
|
||||
|
@@ -587,7 +587,7 @@ error_unreserve:
|
||||
ttm_eu_backoff_reservation(&ticket, &list);
|
||||
|
||||
error_free:
|
||||
drm_free_large(vm_bos);
|
||||
kvfree(vm_bos);
|
||||
|
||||
if (r && r != -ERESTARTSYS)
|
||||
DRM_ERROR("Couldn't update BO_VA (%d)\n", r);
|
||||
|
@@ -538,3 +538,38 @@ void radeon_irq_kms_disable_hpd(struct radeon_device *rdev, unsigned hpd_mask)
|
||||
spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_irq_kms_update_int_n - helper for updating interrupt enable registers
|
||||
*
|
||||
* @rdev: radeon device pointer
|
||||
* @reg: the register to write to enable/disable interrupts
|
||||
* @mask: the mask that enables the interrupts
|
||||
* @enable: whether to enable or disable the interrupt register
|
||||
* @name: the name of the interrupt register to print to the kernel log
|
||||
* @num: the number of the interrupt register to print to the kernel log
|
||||
*
|
||||
* Helper for updating the enable state of interrupt registers. Checks whether
|
||||
* or not the interrupt matches the enable state we want. If it doesn't, then
|
||||
* we update it and print a debugging message to the kernel log indicating the
|
||||
* new state of the interrupt register.
|
||||
*
|
||||
* Used for updating sequences of interrupts registers like HPD1, HPD2, etc.
|
||||
*/
|
||||
void radeon_irq_kms_set_irq_n_enabled(struct radeon_device *rdev,
|
||||
u32 reg, u32 mask,
|
||||
bool enable, const char *name, unsigned n)
|
||||
{
|
||||
u32 tmp = RREG32(reg);
|
||||
|
||||
/* Interrupt state didn't change */
|
||||
if (!!(tmp & mask) == enable)
|
||||
return;
|
||||
|
||||
if (enable) {
|
||||
DRM_DEBUG("%s%d interrupts enabled\n", name, n);
|
||||
WREG32(reg, tmp |= mask);
|
||||
} else {
|
||||
DRM_DEBUG("%s%d interrupts disabled\n", name, n);
|
||||
WREG32(reg, tmp & ~mask);
|
||||
}
|
||||
}
|
||||
|
@@ -179,14 +179,29 @@ void radeon_kfd_device_probe(struct radeon_device *rdev)
|
||||
|
||||
void radeon_kfd_device_init(struct radeon_device *rdev)
|
||||
{
|
||||
int i, queue, pipe, mec;
|
||||
|
||||
if (rdev->kfd) {
|
||||
struct kgd2kfd_shared_resources gpu_resources = {
|
||||
.compute_vmid_bitmap = 0xFF00,
|
||||
|
||||
.first_compute_pipe = 1,
|
||||
.compute_pipe_count = 4 - 1,
|
||||
.num_mec = 1,
|
||||
.num_pipe_per_mec = 4,
|
||||
.num_queue_per_pipe = 8
|
||||
};
|
||||
|
||||
bitmap_zero(gpu_resources.queue_bitmap, KGD_MAX_QUEUES);
|
||||
|
||||
for (i = 0; i < KGD_MAX_QUEUES; ++i) {
|
||||
queue = i % gpu_resources.num_queue_per_pipe;
|
||||
pipe = (i / gpu_resources.num_queue_per_pipe)
|
||||
% gpu_resources.num_pipe_per_mec;
|
||||
mec = (i / gpu_resources.num_queue_per_pipe)
|
||||
/ gpu_resources.num_pipe_per_mec;
|
||||
|
||||
if (mec == 0 && pipe > 0)
|
||||
set_bit(i, gpu_resources.queue_bitmap);
|
||||
}
|
||||
|
||||
radeon_doorbell_get_kfd_info(rdev,
|
||||
&gpu_resources.doorbell_physical_address,
|
||||
&gpu_resources.doorbell_aperture_size,
|
||||
@@ -423,18 +438,7 @@ static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid,
|
||||
static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id,
|
||||
uint32_t hpd_size, uint64_t hpd_gpu_addr)
|
||||
{
|
||||
uint32_t mec = (pipe_id / CIK_PIPE_PER_MEC) + 1;
|
||||
uint32_t pipe = (pipe_id % CIK_PIPE_PER_MEC);
|
||||
|
||||
lock_srbm(kgd, mec, pipe, 0, 0);
|
||||
write_register(kgd, CP_HPD_EOP_BASE_ADDR,
|
||||
lower_32_bits(hpd_gpu_addr >> 8));
|
||||
write_register(kgd, CP_HPD_EOP_BASE_ADDR_HI,
|
||||
upper_32_bits(hpd_gpu_addr >> 8));
|
||||
write_register(kgd, CP_HPD_EOP_VMID, 0);
|
||||
write_register(kgd, CP_HPD_EOP_CONTROL, hpd_size);
|
||||
unlock_srbm(kgd);
|
||||
|
||||
/* nothing to do here */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -98,6 +98,31 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
|
||||
struct radeon_device *rdev;
|
||||
int r, acpi_status;
|
||||
|
||||
if (!radeon_si_support) {
|
||||
switch (flags & RADEON_FAMILY_MASK) {
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
case CHIP_HAINAN:
|
||||
dev_info(dev->dev,
|
||||
"SI support disabled by module param\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
if (!radeon_cik_support) {
|
||||
switch (flags & RADEON_FAMILY_MASK) {
|
||||
case CHIP_KAVERI:
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
dev_info(dev->dev,
|
||||
"CIK support disabled by module param\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL);
|
||||
if (rdev == NULL) {
|
||||
return -ENOMEM;
|
||||
@@ -858,43 +883,6 @@ void radeon_disable_vblank_kms(struct drm_device *dev, int crtc)
|
||||
spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
|
||||
}
|
||||
|
||||
/**
|
||||
* radeon_get_vblank_timestamp_kms - get vblank timestamp
|
||||
*
|
||||
* @dev: drm dev pointer
|
||||
* @crtc: crtc to get the timestamp for
|
||||
* @max_error: max error
|
||||
* @vblank_time: time value
|
||||
* @flags: flags passed to the driver
|
||||
*
|
||||
* Gets the timestamp on the requested crtc based on the
|
||||
* scanout position. (all asics).
|
||||
* Returns postive status flags on success, negative error on failure.
|
||||
*/
|
||||
int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
{
|
||||
struct drm_crtc *drmcrtc;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
||||
if (crtc < 0 || crtc >= dev->num_crtcs) {
|
||||
DRM_ERROR("Invalid crtc %d\n", crtc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Get associated drm_crtc: */
|
||||
drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
|
||||
if (!drmcrtc)
|
||||
return -EINVAL;
|
||||
|
||||
/* Helper routine in DRM core does all the work: */
|
||||
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
|
||||
vblank_time, flags,
|
||||
&drmcrtc->hwmode);
|
||||
}
|
||||
|
||||
const struct drm_ioctl_desc radeon_ioctls_kms[] = {
|
||||
DRM_IOCTL_DEF_DRV(RADEON_CP_INIT, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
||||
DRM_IOCTL_DEF_DRV(RADEON_CP_START, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
||||
|
@@ -691,6 +691,9 @@ struct atom_voltage_table
|
||||
};
|
||||
|
||||
/* Driver internal use only flags of radeon_get_crtc_scanoutpos() */
|
||||
#define DRM_SCANOUTPOS_VALID (1 << 0)
|
||||
#define DRM_SCANOUTPOS_IN_VBLANK (1 << 1)
|
||||
#define DRM_SCANOUTPOS_ACCURATE (1 << 2)
|
||||
#define USE_REAL_VBLANKSTART (1 << 30)
|
||||
#define GET_DISTANCE_TO_VBLANKSTART (1 << 31)
|
||||
|
||||
|
@@ -314,7 +314,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring
|
||||
}
|
||||
|
||||
/* and then save the content of the ring */
|
||||
*data = drm_malloc_ab(size, sizeof(uint32_t));
|
||||
*data = kvmalloc_array(size, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (!*data) {
|
||||
mutex_unlock(&rdev->ring_lock);
|
||||
return 0;
|
||||
@@ -356,7 +356,7 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring,
|
||||
}
|
||||
|
||||
radeon_ring_unlock_commit(rdev, ring, false);
|
||||
drm_free_large(data);
|
||||
kvfree(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -29,11 +29,11 @@
|
||||
* Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
|
||||
* Dave Airlie
|
||||
*/
|
||||
#include <ttm/ttm_bo_api.h>
|
||||
#include <ttm/ttm_bo_driver.h>
|
||||
#include <ttm/ttm_placement.h>
|
||||
#include <ttm/ttm_module.h>
|
||||
#include <ttm/ttm_page_alloc.h>
|
||||
#include <drm/ttm/ttm_bo_api.h>
|
||||
#include <drm/ttm/ttm_bo_driver.h>
|
||||
#include <drm/ttm/ttm_placement.h>
|
||||
#include <drm/ttm/ttm_module.h>
|
||||
#include <drm/ttm/ttm_page_alloc.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/radeon_drm.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
@@ -132,8 +132,8 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
|
||||
struct radeon_bo_list *list;
|
||||
unsigned i, idx;
|
||||
|
||||
list = drm_malloc_ab(vm->max_pde_used + 2,
|
||||
sizeof(struct radeon_bo_list));
|
||||
list = kvmalloc_array(vm->max_pde_used + 2,
|
||||
sizeof(struct radeon_bo_list), GFP_KERNEL);
|
||||
if (!list)
|
||||
return NULL;
|
||||
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "rs780d.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "rv6xxd.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "rv730d.h"
|
||||
#include "r600_dpm.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "rv740d.h"
|
||||
#include "r600_dpm.h"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* Authors: Alex Deucher
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "rv770d.h"
|
||||
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/firmware.h>
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "rv770d.h"
|
||||
#include "rv770_dpm.h"
|
||||
|
@@ -139,6 +139,30 @@ static void si_fini_pg(struct radeon_device *rdev);
|
||||
static void si_fini_cg(struct radeon_device *rdev);
|
||||
static void si_rlc_stop(struct radeon_device *rdev);
|
||||
|
||||
static const u32 crtc_offsets[] =
|
||||
{
|
||||
EVERGREEN_CRTC0_REGISTER_OFFSET,
|
||||
EVERGREEN_CRTC1_REGISTER_OFFSET,
|
||||
EVERGREEN_CRTC2_REGISTER_OFFSET,
|
||||
EVERGREEN_CRTC3_REGISTER_OFFSET,
|
||||
EVERGREEN_CRTC4_REGISTER_OFFSET,
|
||||
EVERGREEN_CRTC5_REGISTER_OFFSET
|
||||
};
|
||||
|
||||
static const u32 si_disp_int_status[] =
|
||||
{
|
||||
DISP_INTERRUPT_STATUS,
|
||||
DISP_INTERRUPT_STATUS_CONTINUE,
|
||||
DISP_INTERRUPT_STATUS_CONTINUE2,
|
||||
DISP_INTERRUPT_STATUS_CONTINUE3,
|
||||
DISP_INTERRUPT_STATUS_CONTINUE4,
|
||||
DISP_INTERRUPT_STATUS_CONTINUE5
|
||||
};
|
||||
|
||||
#define DC_HPDx_CONTROL(x) (DC_HPD1_CONTROL + (x * 0xc))
|
||||
#define DC_HPDx_INT_CONTROL(x) (DC_HPD1_INT_CONTROL + (x * 0xc))
|
||||
#define DC_HPDx_INT_STATUS_REG(x) (DC_HPD1_INT_STATUS + (x * 0xc))
|
||||
|
||||
static const u32 verde_rlc_save_restore_register_list[] =
|
||||
{
|
||||
(0x8000 << 16) | (0x98f4 >> 2),
|
||||
@@ -5919,6 +5943,7 @@ static void si_disable_interrupts(struct radeon_device *rdev)
|
||||
|
||||
static void si_disable_interrupt_state(struct radeon_device *rdev)
|
||||
{
|
||||
int i;
|
||||
u32 tmp;
|
||||
|
||||
tmp = RREG32(CP_INT_CNTL_RING0) &
|
||||
@@ -5932,47 +5957,17 @@ static void si_disable_interrupt_state(struct radeon_device *rdev)
|
||||
WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp);
|
||||
WREG32(GRBM_INT_CNTL, 0);
|
||||
WREG32(SRBM_INT_CNTL, 0);
|
||||
if (rdev->num_crtc >= 2) {
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||
}
|
||||
if (rdev->num_crtc >= 4) {
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||
}
|
||||
if (rdev->num_crtc >= 6) {
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||
}
|
||||
|
||||
if (rdev->num_crtc >= 2) {
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||
}
|
||||
if (rdev->num_crtc >= 4) {
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
||||
}
|
||||
if (rdev->num_crtc >= 6) {
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||
}
|
||||
for (i = 0; i < rdev->num_crtc; i++)
|
||||
WREG32(INT_MASK + crtc_offsets[i], 0);
|
||||
for (i = 0; i < rdev->num_crtc; i++)
|
||||
WREG32(GRPH_INT_CONTROL + crtc_offsets[i], 0);
|
||||
|
||||
if (!ASIC_IS_NODCE(rdev)) {
|
||||
WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
|
||||
|
||||
tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
WREG32(DC_HPD1_INT_CONTROL, tmp);
|
||||
tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
WREG32(DC_HPD2_INT_CONTROL, tmp);
|
||||
tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
WREG32(DC_HPD3_INT_CONTROL, tmp);
|
||||
tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
WREG32(DC_HPD4_INT_CONTROL, tmp);
|
||||
tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
WREG32(DC_HPD5_INT_CONTROL, tmp);
|
||||
tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
WREG32(DC_HPD6_INT_CONTROL, tmp);
|
||||
for (i = 0; i < 6; i++)
|
||||
WREG32_AND(DC_HPDx_INT_CONTROL(i),
|
||||
DC_HPDx_INT_POLARITY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6047,12 +6042,12 @@ static int si_irq_init(struct radeon_device *rdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* The order we write back each register here is important */
|
||||
int si_irq_set(struct radeon_device *rdev)
|
||||
{
|
||||
int i;
|
||||
u32 cp_int_cntl;
|
||||
u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
|
||||
u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
|
||||
u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0;
|
||||
u32 grbm_int_cntl = 0;
|
||||
u32 dma_cntl, dma_cntl1;
|
||||
u32 thermal_int = 0;
|
||||
@@ -6072,15 +6067,6 @@ int si_irq_set(struct radeon_device *rdev)
|
||||
cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
|
||||
(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
|
||||
|
||||
if (!ASIC_IS_NODCE(rdev)) {
|
||||
hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
|
||||
hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
|
||||
hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
|
||||
hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
|
||||
hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
|
||||
hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
|
||||
}
|
||||
|
||||
dma_cntl = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
|
||||
dma_cntl1 = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
|
||||
|
||||
@@ -6109,60 +6095,6 @@ int si_irq_set(struct radeon_device *rdev)
|
||||
DRM_DEBUG("si_irq_set: sw int dma1\n");
|
||||
dma_cntl1 |= TRAP_ENABLE;
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[0] ||
|
||||
atomic_read(&rdev->irq.pflip[0])) {
|
||||
DRM_DEBUG("si_irq_set: vblank 0\n");
|
||||
crtc1 |= VBLANK_INT_MASK;
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[1] ||
|
||||
atomic_read(&rdev->irq.pflip[1])) {
|
||||
DRM_DEBUG("si_irq_set: vblank 1\n");
|
||||
crtc2 |= VBLANK_INT_MASK;
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[2] ||
|
||||
atomic_read(&rdev->irq.pflip[2])) {
|
||||
DRM_DEBUG("si_irq_set: vblank 2\n");
|
||||
crtc3 |= VBLANK_INT_MASK;
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[3] ||
|
||||
atomic_read(&rdev->irq.pflip[3])) {
|
||||
DRM_DEBUG("si_irq_set: vblank 3\n");
|
||||
crtc4 |= VBLANK_INT_MASK;
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[4] ||
|
||||
atomic_read(&rdev->irq.pflip[4])) {
|
||||
DRM_DEBUG("si_irq_set: vblank 4\n");
|
||||
crtc5 |= VBLANK_INT_MASK;
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[5] ||
|
||||
atomic_read(&rdev->irq.pflip[5])) {
|
||||
DRM_DEBUG("si_irq_set: vblank 5\n");
|
||||
crtc6 |= VBLANK_INT_MASK;
|
||||
}
|
||||
if (rdev->irq.hpd[0]) {
|
||||
DRM_DEBUG("si_irq_set: hpd 1\n");
|
||||
hpd1 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
|
||||
}
|
||||
if (rdev->irq.hpd[1]) {
|
||||
DRM_DEBUG("si_irq_set: hpd 2\n");
|
||||
hpd2 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
|
||||
}
|
||||
if (rdev->irq.hpd[2]) {
|
||||
DRM_DEBUG("si_irq_set: hpd 3\n");
|
||||
hpd3 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
|
||||
}
|
||||
if (rdev->irq.hpd[3]) {
|
||||
DRM_DEBUG("si_irq_set: hpd 4\n");
|
||||
hpd4 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
|
||||
}
|
||||
if (rdev->irq.hpd[4]) {
|
||||
DRM_DEBUG("si_irq_set: hpd 5\n");
|
||||
hpd5 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
|
||||
}
|
||||
if (rdev->irq.hpd[5]) {
|
||||
DRM_DEBUG("si_irq_set: hpd 6\n");
|
||||
hpd6 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
|
||||
}
|
||||
|
||||
WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
|
||||
WREG32(CP_INT_CNTL_RING1, cp_int_cntl1);
|
||||
@@ -6178,45 +6110,23 @@ int si_irq_set(struct radeon_device *rdev)
|
||||
thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
|
||||
}
|
||||
|
||||
if (rdev->num_crtc >= 2) {
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
|
||||
}
|
||||
if (rdev->num_crtc >= 4) {
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
|
||||
}
|
||||
if (rdev->num_crtc >= 6) {
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
|
||||
for (i = 0; i < rdev->num_crtc; i++) {
|
||||
radeon_irq_kms_set_irq_n_enabled(
|
||||
rdev, INT_MASK + crtc_offsets[i], VBLANK_INT_MASK,
|
||||
rdev->irq.crtc_vblank_int[i] ||
|
||||
atomic_read(&rdev->irq.pflip[i]), "vblank", i);
|
||||
}
|
||||
|
||||
if (rdev->num_crtc >= 2) {
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
|
||||
GRPH_PFLIP_INT_MASK);
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
|
||||
GRPH_PFLIP_INT_MASK);
|
||||
}
|
||||
if (rdev->num_crtc >= 4) {
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
||||
GRPH_PFLIP_INT_MASK);
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
|
||||
GRPH_PFLIP_INT_MASK);
|
||||
}
|
||||
if (rdev->num_crtc >= 6) {
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
||||
GRPH_PFLIP_INT_MASK);
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
|
||||
GRPH_PFLIP_INT_MASK);
|
||||
}
|
||||
for (i = 0; i < rdev->num_crtc; i++)
|
||||
WREG32(GRPH_INT_CONTROL + crtc_offsets[i], GRPH_PFLIP_INT_MASK);
|
||||
|
||||
if (!ASIC_IS_NODCE(rdev)) {
|
||||
WREG32(DC_HPD1_INT_CONTROL, hpd1);
|
||||
WREG32(DC_HPD2_INT_CONTROL, hpd2);
|
||||
WREG32(DC_HPD3_INT_CONTROL, hpd3);
|
||||
WREG32(DC_HPD4_INT_CONTROL, hpd4);
|
||||
WREG32(DC_HPD5_INT_CONTROL, hpd5);
|
||||
WREG32(DC_HPD6_INT_CONTROL, hpd6);
|
||||
for (i = 0; i < 6; i++) {
|
||||
radeon_irq_kms_set_irq_n_enabled(
|
||||
rdev, DC_HPDx_INT_CONTROL(i),
|
||||
DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN,
|
||||
rdev->irq.hpd[i], "HPD", i);
|
||||
}
|
||||
}
|
||||
|
||||
WREG32(CG_THERMAL_INT, thermal_int);
|
||||
@@ -6227,133 +6137,48 @@ int si_irq_set(struct radeon_device *rdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The order we write back each register here is important */
|
||||
static inline void si_irq_ack(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
int i, j;
|
||||
u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
|
||||
u32 *grph_int = rdev->irq.stat_regs.evergreen.grph_int;
|
||||
|
||||
if (ASIC_IS_NODCE(rdev))
|
||||
return;
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
|
||||
rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
|
||||
rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
||||
if (rdev->num_crtc >= 4) {
|
||||
rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
|
||||
rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
||||
}
|
||||
if (rdev->num_crtc >= 6) {
|
||||
rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
|
||||
rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
||||
for (i = 0; i < 6; i++) {
|
||||
disp_int[i] = RREG32(si_disp_int_status[i]);
|
||||
if (i < rdev->num_crtc)
|
||||
grph_int[i] = RREG32(GRPH_INT_STATUS + crtc_offsets[i]);
|
||||
}
|
||||
|
||||
if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||
if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
|
||||
/* We write back each interrupt register in pairs of two */
|
||||
for (i = 0; i < rdev->num_crtc; i += 2) {
|
||||
for (j = i; j < (i + 2); j++) {
|
||||
if (grph_int[j] & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + crtc_offsets[j],
|
||||
GRPH_PFLIP_INT_CLEAR);
|
||||
}
|
||||
|
||||
if (rdev->num_crtc >= 4) {
|
||||
if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||
if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
|
||||
for (j = i; j < (i + 2); j++) {
|
||||
if (disp_int[j] & LB_D1_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + crtc_offsets[j],
|
||||
VBLANK_ACK);
|
||||
if (disp_int[j] & LB_D1_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + crtc_offsets[j],
|
||||
VLINE_ACK);
|
||||
}
|
||||
}
|
||||
|
||||
if (rdev->num_crtc >= 6) {
|
||||
if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||
if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
|
||||
WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
|
||||
WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
|
||||
WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (disp_int[i] & DC_HPD1_INTERRUPT)
|
||||
WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_ACK);
|
||||
}
|
||||
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD1_INT_CONTROL);
|
||||
tmp |= DC_HPDx_INT_ACK;
|
||||
WREG32(DC_HPD1_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD2_INT_CONTROL);
|
||||
tmp |= DC_HPDx_INT_ACK;
|
||||
WREG32(DC_HPD2_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD3_INT_CONTROL);
|
||||
tmp |= DC_HPDx_INT_ACK;
|
||||
WREG32(DC_HPD3_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD4_INT_CONTROL);
|
||||
tmp |= DC_HPDx_INT_ACK;
|
||||
WREG32(DC_HPD4_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD5_INT_CONTROL);
|
||||
tmp |= DC_HPDx_INT_ACK;
|
||||
WREG32(DC_HPD5_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD6_INT_CONTROL);
|
||||
tmp |= DC_HPDx_INT_ACK;
|
||||
WREG32(DC_HPD6_INT_CONTROL, tmp);
|
||||
}
|
||||
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD1_INT_CONTROL);
|
||||
tmp |= DC_HPDx_RX_INT_ACK;
|
||||
WREG32(DC_HPD1_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD2_INT_CONTROL);
|
||||
tmp |= DC_HPDx_RX_INT_ACK;
|
||||
WREG32(DC_HPD2_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD3_INT_CONTROL);
|
||||
tmp |= DC_HPDx_RX_INT_ACK;
|
||||
WREG32(DC_HPD3_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD4_INT_CONTROL);
|
||||
tmp |= DC_HPDx_RX_INT_ACK;
|
||||
WREG32(DC_HPD4_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD5_INT_CONTROL);
|
||||
tmp |= DC_HPDx_RX_INT_ACK;
|
||||
WREG32(DC_HPD5_INT_CONTROL, tmp);
|
||||
}
|
||||
if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) {
|
||||
tmp = RREG32(DC_HPD6_INT_CONTROL);
|
||||
tmp |= DC_HPDx_RX_INT_ACK;
|
||||
WREG32(DC_HPD6_INT_CONTROL, tmp);
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (disp_int[i] & DC_HPD1_RX_INTERRUPT)
|
||||
WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_RX_INT_ACK);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6415,6 +6240,9 @@ static inline u32 si_get_ih_wptr(struct radeon_device *rdev)
|
||||
*/
|
||||
int si_irq_process(struct radeon_device *rdev)
|
||||
{
|
||||
u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
|
||||
u32 crtc_idx, hpd_idx;
|
||||
u32 mask;
|
||||
u32 wptr;
|
||||
u32 rptr;
|
||||
u32 src_id, src_data, ring_id;
|
||||
@@ -6423,6 +6251,7 @@ int si_irq_process(struct radeon_device *rdev)
|
||||
bool queue_dp = false;
|
||||
bool queue_thermal = false;
|
||||
u32 status, addr;
|
||||
const char *event_name;
|
||||
|
||||
if (!rdev->ih.enabled || rdev->shutdown)
|
||||
return IRQ_NONE;
|
||||
@@ -6452,184 +6281,44 @@ restart_ih:
|
||||
|
||||
switch (src_id) {
|
||||
case 1: /* D1 vblank/vline */
|
||||
switch (src_data) {
|
||||
case 0: /* D1 vblank */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[0]) {
|
||||
drm_handle_vblank(rdev->ddev, 0);
|
||||
rdev->pm.vblank_sync = true;
|
||||
wake_up(&rdev->irq.vblank_queue);
|
||||
}
|
||||
if (atomic_read(&rdev->irq.pflip[0]))
|
||||
radeon_crtc_handle_vblank(rdev, 0);
|
||||
rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
|
||||
DRM_DEBUG("IH: D1 vblank\n");
|
||||
|
||||
break;
|
||||
case 1: /* D1 vline */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
|
||||
DRM_DEBUG("IH: D1 vline\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2: /* D2 vblank/vline */
|
||||
switch (src_data) {
|
||||
case 0: /* D2 vblank */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[1]) {
|
||||
drm_handle_vblank(rdev->ddev, 1);
|
||||
rdev->pm.vblank_sync = true;
|
||||
wake_up(&rdev->irq.vblank_queue);
|
||||
}
|
||||
if (atomic_read(&rdev->irq.pflip[1]))
|
||||
radeon_crtc_handle_vblank(rdev, 1);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
|
||||
DRM_DEBUG("IH: D2 vblank\n");
|
||||
|
||||
break;
|
||||
case 1: /* D2 vline */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
|
||||
DRM_DEBUG("IH: D2 vline\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 3: /* D3 vblank/vline */
|
||||
switch (src_data) {
|
||||
case 0: /* D3 vblank */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[2]) {
|
||||
drm_handle_vblank(rdev->ddev, 2);
|
||||
rdev->pm.vblank_sync = true;
|
||||
wake_up(&rdev->irq.vblank_queue);
|
||||
}
|
||||
if (atomic_read(&rdev->irq.pflip[2]))
|
||||
radeon_crtc_handle_vblank(rdev, 2);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
|
||||
DRM_DEBUG("IH: D3 vblank\n");
|
||||
|
||||
break;
|
||||
case 1: /* D3 vline */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
|
||||
DRM_DEBUG("IH: D3 vline\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 4: /* D4 vblank/vline */
|
||||
switch (src_data) {
|
||||
case 0: /* D4 vblank */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[3]) {
|
||||
drm_handle_vblank(rdev->ddev, 3);
|
||||
rdev->pm.vblank_sync = true;
|
||||
wake_up(&rdev->irq.vblank_queue);
|
||||
}
|
||||
if (atomic_read(&rdev->irq.pflip[3]))
|
||||
radeon_crtc_handle_vblank(rdev, 3);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
|
||||
DRM_DEBUG("IH: D4 vblank\n");
|
||||
|
||||
break;
|
||||
case 1: /* D4 vline */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
|
||||
DRM_DEBUG("IH: D4 vline\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 5: /* D5 vblank/vline */
|
||||
switch (src_data) {
|
||||
case 0: /* D5 vblank */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[4]) {
|
||||
drm_handle_vblank(rdev->ddev, 4);
|
||||
rdev->pm.vblank_sync = true;
|
||||
wake_up(&rdev->irq.vblank_queue);
|
||||
}
|
||||
if (atomic_read(&rdev->irq.pflip[4]))
|
||||
radeon_crtc_handle_vblank(rdev, 4);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
|
||||
DRM_DEBUG("IH: D5 vblank\n");
|
||||
|
||||
break;
|
||||
case 1: /* D5 vline */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
|
||||
DRM_DEBUG("IH: D5 vline\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 6: /* D6 vblank/vline */
|
||||
switch (src_data) {
|
||||
case 0: /* D6 vblank */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
crtc_idx = src_id - 1;
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[5]) {
|
||||
drm_handle_vblank(rdev->ddev, 5);
|
||||
if (src_data == 0) { /* vblank */
|
||||
mask = LB_D1_VBLANK_INTERRUPT;
|
||||
event_name = "vblank";
|
||||
|
||||
if (rdev->irq.crtc_vblank_int[crtc_idx]) {
|
||||
drm_handle_vblank(rdev->ddev, crtc_idx);
|
||||
rdev->pm.vblank_sync = true;
|
||||
wake_up(&rdev->irq.vblank_queue);
|
||||
}
|
||||
if (atomic_read(&rdev->irq.pflip[5]))
|
||||
radeon_crtc_handle_vblank(rdev, 5);
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
|
||||
DRM_DEBUG("IH: D6 vblank\n");
|
||||
if (atomic_read(&rdev->irq.pflip[crtc_idx])) {
|
||||
radeon_crtc_handle_vblank(rdev,
|
||||
crtc_idx);
|
||||
}
|
||||
|
||||
break;
|
||||
case 1: /* D6 vline */
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
|
||||
DRM_DEBUG("IH: D6 vline\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
} else if (src_data == 1) { /* vline */
|
||||
mask = LB_D1_VLINE_INTERRUPT;
|
||||
event_name = "vline";
|
||||
} else {
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n",
|
||||
src_id, src_data);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(disp_int[crtc_idx] & mask)) {
|
||||
DRM_DEBUG("IH: D%d %s - IH event w/o asserted irq bit?\n",
|
||||
crtc_idx + 1, event_name);
|
||||
}
|
||||
|
||||
disp_int[crtc_idx] &= ~mask;
|
||||
DRM_DEBUG("IH: D%d %s\n", crtc_idx + 1, event_name);
|
||||
|
||||
break;
|
||||
case 8: /* D1 page flip */
|
||||
case 10: /* D2 page flip */
|
||||
@@ -6642,119 +6331,29 @@ restart_ih:
|
||||
radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
|
||||
break;
|
||||
case 42: /* HPD hotplug */
|
||||
switch (src_data) {
|
||||
case 0:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
|
||||
if (src_data <= 5) {
|
||||
hpd_idx = src_data;
|
||||
mask = DC_HPD1_INTERRUPT;
|
||||
queue_hotplug = true;
|
||||
DRM_DEBUG("IH: HPD1\n");
|
||||
event_name = "HPD";
|
||||
|
||||
break;
|
||||
case 1:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
|
||||
queue_hotplug = true;
|
||||
DRM_DEBUG("IH: HPD2\n");
|
||||
|
||||
break;
|
||||
case 2:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
|
||||
queue_hotplug = true;
|
||||
DRM_DEBUG("IH: HPD3\n");
|
||||
|
||||
break;
|
||||
case 3:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
|
||||
queue_hotplug = true;
|
||||
DRM_DEBUG("IH: HPD4\n");
|
||||
|
||||
break;
|
||||
case 4:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
|
||||
queue_hotplug = true;
|
||||
DRM_DEBUG("IH: HPD5\n");
|
||||
|
||||
break;
|
||||
case 5:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
|
||||
queue_hotplug = true;
|
||||
DRM_DEBUG("IH: HPD6\n");
|
||||
|
||||
break;
|
||||
case 6:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT;
|
||||
} else if (src_data <= 11) {
|
||||
hpd_idx = src_data - 6;
|
||||
mask = DC_HPD1_RX_INTERRUPT;
|
||||
queue_dp = true;
|
||||
DRM_DEBUG("IH: HPD_RX 1\n");
|
||||
event_name = "HPD_RX";
|
||||
|
||||
break;
|
||||
case 7:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT;
|
||||
queue_dp = true;
|
||||
DRM_DEBUG("IH: HPD_RX 2\n");
|
||||
|
||||
break;
|
||||
case 8:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT;
|
||||
queue_dp = true;
|
||||
DRM_DEBUG("IH: HPD_RX 3\n");
|
||||
|
||||
break;
|
||||
case 9:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT;
|
||||
queue_dp = true;
|
||||
DRM_DEBUG("IH: HPD_RX 4\n");
|
||||
|
||||
break;
|
||||
case 10:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT;
|
||||
queue_dp = true;
|
||||
DRM_DEBUG("IH: HPD_RX 5\n");
|
||||
|
||||
break;
|
||||
case 11:
|
||||
if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT;
|
||||
queue_dp = true;
|
||||
DRM_DEBUG("IH: HPD_RX 6\n");
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
|
||||
} else {
|
||||
DRM_DEBUG("Unhandled interrupt: %d %d\n",
|
||||
src_id, src_data);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(disp_int[hpd_idx] & mask))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
disp_int[hpd_idx] &= ~mask;
|
||||
DRM_DEBUG("IH: %s%d\n", event_name, hpd_idx + 1);
|
||||
break;
|
||||
case 96:
|
||||
DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
|
||||
|
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "sid.h"
|
||||
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/firmware.h>
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "sid.h"
|
||||
#include "ppsmc.h"
|
||||
|
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "sumod.h"
|
||||
|
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "sumod.h"
|
||||
#include "sumo_dpm.h"
|
||||
|
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "radeon_asic.h"
|
||||
#include "trinityd.h"
|
||||
|
@@ -21,7 +21,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "drmP.h"
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon.h"
|
||||
#include "trinityd.h"
|
||||
#include "trinity_dpm.h"
|
||||
|
Reference in New Issue
Block a user