diff options
Diffstat (limited to 'shared-core/nouveau_irq.c')
-rw-r--r-- | shared-core/nouveau_irq.c | 91 |
1 files changed, 5 insertions, 86 deletions
diff --git a/shared-core/nouveau_irq.c b/shared-core/nouveau_irq.c index 48872622..2a3d8a0b 100644 --- a/shared-core/nouveau_irq.c +++ b/shared-core/nouveau_irq.c @@ -37,13 +37,6 @@ #include "nouveau_reg.h" #include "nouveau_swmthd.h" -/* needed for interrupt based vpll changes */ -#include "nv50_display.h" -#include "nv50_crtc.h" -#include "nv50_output.h" -/* needed for hotplug irq */ -#include "nv50_kms_wrapper.h" - void nouveau_irq_preinstall(struct drm_device *dev) { @@ -510,82 +503,11 @@ static void nouveau_nv50_display_irq_handler(struct drm_device *dev) { struct drm_nouveau_private *dev_priv = dev->dev_private; - uint32_t val = NV_READ(NV50_PDISPLAY_SUPERVISOR); - - DRM_INFO("NV50_PDISPLAY_SUPERVISOR - 0x%08X\n", val); - - /* vblank interrupts */ - if (val & NV50_PDISPLAY_SUPERVISOR_CRTCn) { - NV_WRITE(NV50_PDISPLAY_SUPERVISOR, val & NV50_PDISPLAY_SUPERVISOR_CRTCn); - val &= ~NV50_PDISPLAY_SUPERVISOR_CRTCn; - } - - /* clock setting amongst other things. */ - if (val & NV50_PDISPLAY_SUPERVISOR_CLK_MASK) { - uint32_t state = (val & NV50_PDISPLAY_SUPERVISOR_CLK_MASK) >> NV50_PDISPLAY_SUPERVISOR_CLK_MASK__SHIFT; - - NV50_DEBUG("state %d\n", state); - - /* Set pll */ - if (state == 2) { - struct nv50_display *display = nv50_get_display(dev); - struct nv50_output *output = NULL; - struct nv50_crtc *crtc = NULL; - int crtc_index; - - uint32_t unk30 = NV_READ(NV50_PDISPLAY_UNK30_CTRL); - - for (crtc_index = 0; crtc_index < 2; crtc_index++) { - bool clock_change = false; - bool clock_ack = false; - - if (crtc_index == 0 && (unk30 & NV50_PDISPLAY_UNK30_CTRL_UPDATE_VCLK0)) - clock_change = true; - - if (crtc_index == 1 && (unk30 & NV50_PDISPLAY_UNK30_CTRL_UPDATE_VCLK1)) - clock_change = true; - - if (clock_change) - clock_ack = true; - - if (display->last_crtc == crtc_index) - clock_ack = true; + uint32_t val = NV_READ(NV50_DISPLAY_SUPERVISOR); - list_for_each_entry(crtc, &display->crtcs, item) { - if (crtc->index == crtc_index) - break; - } + DRM_INFO("NV50_DISPLAY_INTR - 0x%08X\n", val); - if (clock_change) - crtc->set_clock(crtc); - - NV50_DEBUG("index %d clock_change %d clock_ack %d\n", crtc_index, clock_change, clock_ack); - - if (!clock_ack) - continue; - - crtc->set_clock_mode(crtc); - - list_for_each_entry(output, &display->outputs, item) { - if (!output->crtc) - continue; - - if (output->crtc == crtc) - output->set_clock_mode(output); - } - } - } - - NV_WRITE(NV50_PDISPLAY_UNK30_CTRL, NV50_PDISPLAY_UNK30_CTRL_PENDING); - NV_WRITE(NV50_PDISPLAY_SUPERVISOR, val & NV50_PDISPLAY_SUPERVISOR_CLK_MASK); - - val &= ~NV50_PDISPLAY_SUPERVISOR_CLK_MASK; - } - - if (val) - DRM_ERROR("unsupported NV50_DISPLAY_INTR - 0x%08X\n", val); - - NV_WRITE(NV50_PDISPLAY_SUPERVISOR, val); + NV_WRITE(NV50_DISPLAY_SUPERVISOR, val); } static void @@ -593,13 +515,10 @@ nouveau_nv50_i2c_irq_handler(struct drm_device *dev) { struct drm_nouveau_private *dev_priv = dev->dev_private; - DRM_INFO("NV50_PCONNECTOR_HOTPLUG_CTRL - 0x%08X\n", NV_READ(NV50_PCONNECTOR_HOTPLUG_CTRL)); + DRM_INFO("NV50_I2C_INTR - 0x%08X\n", NV_READ(NV50_I2C_CONTROLLER)); /* This seems to be the way to acknowledge an interrupt. */ - NV_WRITE(NV50_PCONNECTOR_HOTPLUG_CTRL, 0x7FFF7FFF); - - /* Do a "dumb" detect all */ - nv50_kms_connector_detect_all(dev); + NV_WRITE(NV50_I2C_CONTROLLER, 0x7FFF7FFF); } irqreturn_t |