Some test reports with this would be great.
In particular for radeon.

drm/i915: Fix mutex->owner inspection race under DEBUG_MUTEXES
drm/i915: Force the CS stall for invalidate flushes
drm/i915: Invalidate media caches on gen7
drm/radeon: properly filter DP1.2 4k modes on non-DP1.2 hw
drm/radeon: check the right ring in radeon_evict_flags()
drm/i915: Unlock panel even when LVDS is disabled
drm_calc_vbltimestamp_from_scanoutpos with 3.18.0-rc6
drm/radeon: add missing crtc unlock when setting up the MC
drm/radeon: add connector quirk for fujitsu board
drm/i915: Wait for vblank before enabling the TV encoder
drm/i915: Remove bogus __init annotation from DMI callbacks
drm/i915: read HEAD register back in init_ring_common() to enforce ordering
drm/radeon: load the lm63 driver for an lm64 thermal chip.
drm/radeon: avoid leaking edid data
drm/radeon: set default bl level to something reasonable
drm/radeon: stop poisoning the GART TLB

diff --git sys/dev/pci/drm/i915/i915_gem.c sys/dev/pci/drm/i915/i915_gem.c
index d42b923..95e351f 100644
--- sys/dev/pci/drm/i915/i915_gem.c
+++ sys/dev/pci/drm/i915/i915_gem.c
@@ -4596,7 +4596,7 @@ static bool mutex_is_locked_by(struct mutex *mutex, 
struct task_struct *task)
        if (!mutex_is_locked(mutex))
                return false;
 
-#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES)
+#if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES)
        return mutex->owner == task;
 #else
        /* Since UP may be pre-empted, we cannot assume that we own the lock */
diff --git sys/dev/pci/drm/i915/i915_reg.h sys/dev/pci/drm/i915/i915_reg.h
index cf447cf..b4b25bc 100644
--- sys/dev/pci/drm/i915/i915_reg.h
+++ sys/dev/pci/drm/i915/i915_reg.h
@@ -305,6 +305,7 @@
 #define   PIPE_CONTROL_GLOBAL_GTT_IVB                  (1<<24) /* gen7+ */
 #define   PIPE_CONTROL_CS_STALL                                (1<<20)
 #define   PIPE_CONTROL_TLB_INVALIDATE                  (1<<18)
+#define   PIPE_CONTROL_MEDIA_STATE_CLEAR               (1<<16)
 #define   PIPE_CONTROL_QW_WRITE                                (1<<14)
 #define   PIPE_CONTROL_DEPTH_STALL                     (1<<13)
 #define   PIPE_CONTROL_WRITE_FLUSH                     (1<<12)
diff --git sys/dev/pci/drm/i915/intel_bios.c sys/dev/pci/drm/i915/intel_bios.c
index 88406ad..47a0285 100644
--- sys/dev/pci/drm/i915/intel_bios.c
+++ sys/dev/pci/drm/i915/intel_bios.c
@@ -660,7 +660,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
        DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq);
 }
 
-static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id 
*id)
+static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
 {
        DRM_DEBUG_KMS("Falling back to manually reading VBT from "
                      "VBIOS ROM for %s\n",
diff --git sys/dev/pci/drm/i915/intel_crt.c sys/dev/pci/drm/i915/intel_crt.c
index adbbadf..9e8f01d 100644
--- sys/dev/pci/drm/i915/intel_crt.c
+++ sys/dev/pci/drm/i915/intel_crt.c
@@ -714,7 +714,7 @@ static const struct drm_encoder_funcs intel_crt_enc_funcs = 
{
        .destroy = intel_encoder_destroy,
 };
 
-static int __init intel_no_crt_dmi_callback(const struct dmi_system_id *id)
+static int intel_no_crt_dmi_callback(const struct dmi_system_id *id)
 {
        printf("Skipping CRT initialization for %s\n", id->ident);
        return 1;
diff --git sys/dev/pci/drm/i915/intel_lvds.c sys/dev/pci/drm/i915/intel_lvds.c
index 6c18e63..5b00c6f 100644
--- sys/dev/pci/drm/i915/intel_lvds.c
+++ sys/dev/pci/drm/i915/intel_lvds.c
@@ -636,7 +636,7 @@ static const struct drm_encoder_funcs intel_lvds_enc_funcs 
= {
        .destroy = intel_encoder_destroy,
 };
 
-static int __init intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
+static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
 {
        printf("Skipping LVDS initialization for %s\n", id->ident);
        return 1;
@@ -984,6 +984,17 @@ bool intel_lvds_init(struct drm_device *dev)
        int pipe;
        u8 pin;
 
+       /*
+        * Unlock registers and just leave them unlocked. Do this before
+        * checking quirk lists to avoid bogus WARNINGs.
+        */
+       if (HAS_PCH_SPLIT(dev)) {
+               I915_WRITE(PCH_PP_CONTROL,
+                          I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
+       } else {
+               I915_WRITE(PP_CONTROL,
+                          I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
+       }
        if (!intel_lvds_supported(dev))
                return false;
 
@@ -1154,17 +1165,6 @@ bool intel_lvds_init(struct drm_device *dev)
                goto failed;
 
 out:
-       /*
-        * Unlock registers and just
-        * leave them unlocked
-        */
-       if (HAS_PCH_SPLIT(dev)) {
-               I915_WRITE(PCH_PP_CONTROL,
-                          I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
-       } else {
-               I915_WRITE(PP_CONTROL,
-                          I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
-       }
 #ifdef notyet
        lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
        if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
diff --git sys/dev/pci/drm/i915/intel_ringbuffer.c 
sys/dev/pci/drm/i915/intel_ringbuffer.c
index 471286f..133a896 100644
--- sys/dev/pci/drm/i915/intel_ringbuffer.c
+++ sys/dev/pci/drm/i915/intel_ringbuffer.c
@@ -316,12 +316,15 @@ gen7_render_ring_flush(struct intel_ring_buffer *ring,
                flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
                flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
                flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
+               flags |= PIPE_CONTROL_MEDIA_STATE_CLEAR;
                /*
                 * TLB invalidate requires a post-sync write.
                 */
                flags |= PIPE_CONTROL_QW_WRITE;
                flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
 
+               flags |= PIPE_CONTROL_STALL_AT_SCOREBOARD;
+
                /* Workaround: we must issue a pipe_control with CS-stall bit
                 * set before a pipe_control command that has the state cache
                 * invalidate bit set. */
@@ -399,6 +402,9 @@ static int init_ring_common(struct intel_ring_buffer *ring)
                }
        }
 
+       /* Enforce ordering by reading HEAD register back */
+       I915_READ_HEAD(ring);
+
        /* Initialize the ring. This must happen _after_ we've cleared the ring
         * registers with the above sequence (the readback of the HEAD registers
         * also enforces ordering), otherwise the hw might lose the new ring
diff --git sys/dev/pci/drm/i915/intel_tv.c sys/dev/pci/drm/i915/intel_tv.c
index 8106aac..a931056 100644
--- sys/dev/pci/drm/i915/intel_tv.c
+++ sys/dev/pci/drm/i915/intel_tv.c
@@ -857,6 +857,10 @@ intel_enable_tv(struct intel_encoder *encoder)
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
+       /* Prevents vblank waits from timing out in intel_tv_detect_type() */
+       intel_wait_for_vblank(encoder->base.dev,
+                             to_intel_crtc(encoder->base.crtc)->pipe);
+
        I915_WRITE(TV_CTL, I915_READ(TV_CTL) | TV_ENC_ENABLE);
 }
 
diff --git sys/dev/pci/drm/radeon/atombios_dp.c 
sys/dev/pci/drm/radeon/atombios_dp.c
index 409d740..646742a 100644
--- sys/dev/pci/drm/radeon/atombios_dp.c
+++ sys/dev/pci/drm/radeon/atombios_dp.c
@@ -577,6 +577,10 @@ int radeon_dp_mode_valid_helper(struct drm_connector 
*connector,
        struct radeon_connector_atom_dig *dig_connector;
        int dp_clock;
 
+       if ((mode->clock > 340000) &&
+           (!radeon_connector_is_dp12_capable(connector)))
+               return MODE_CLOCK_HIGH;
+
        if (!radeon_connector->con_priv)
                return MODE_CLOCK_HIGH;
        dig_connector = radeon_connector->con_priv;
diff --git sys/dev/pci/drm/radeon/atombios_encoders.c 
sys/dev/pci/drm/radeon/atombios_encoders.c
index 02789d4..a632afa 100644
--- sys/dev/pci/drm/radeon/atombios_encoders.c
+++ sys/dev/pci/drm/radeon/atombios_encoders.c
@@ -189,7 +189,6 @@ void radeon_atom_backlight_init(struct radeon_encoder 
*radeon_encoder,
        struct backlight_properties props;
        struct radeon_backlight_privdata *pdata;
        struct radeon_encoder_atom_dig *dig;
-       u8 backlight_level;
        char bl_name[16];
 
        if (!radeon_encoder->enc_priv)
@@ -221,12 +220,17 @@ void radeon_atom_backlight_init(struct radeon_encoder 
*radeon_encoder,
 
        pdata->encoder = radeon_encoder;
 
-       backlight_level = radeon_atom_get_backlight_level_from_reg(rdev);
-
        dig = radeon_encoder->enc_priv;
        dig->bl_dev = bd;
 
        bd->props.brightness = radeon_atom_backlight_get_brightness(bd);
+       /* Set a reasonable default here if the level is 0 otherwise
+        * fbdev will attempt to turn the backlight on after console
+        * unblanking and it will try and restore 0 which turns the backlight
+        * off again.
+        */
+       if (bd->props.brightness == 0)
+               bd->props.brightness = RADEON_MAX_BL_LEVEL;
        bd->props.power = FB_BLANK_UNBLANK;
        backlight_update_status(bd);
 
diff --git sys/dev/pci/drm/radeon/evergreen.c sys/dev/pci/drm/radeon/evergreen.c
index e4dedc6..92221e6 100644
--- sys/dev/pci/drm/radeon/evergreen.c
+++ sys/dev/pci/drm/radeon/evergreen.c
@@ -1390,6 +1390,7 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct 
evergreen_mc_save *sav
                                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + 
crtc_offsets[i], 1);
                                        tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
                                        WREG32(EVERGREEN_CRTC_BLANK_CONTROL + 
crtc_offsets[i], tmp);
+                                       WREG32(EVERGREEN_CRTC_UPDATE_LOCK + 
crtc_offsets[i], 0);
                                }
                        } else {
                                tmp = RREG32(EVERGREEN_CRTC_CONTROL + 
crtc_offsets[i]);
diff --git sys/dev/pci/drm/radeon/radeon_atombios.c 
sys/dev/pci/drm/radeon/radeon_atombios.c
index 613c307..a1f72fc 100644
--- sys/dev/pci/drm/radeon/radeon_atombios.c
+++ sys/dev/pci/drm/radeon/radeon_atombios.c
@@ -472,6 +472,13 @@ static bool radeon_atom_apply_quirks(struct drm_device 
*dev,
                }
        }
 
+       /* Fujitsu D3003-S2 board lists DVI-I as DVI-I and VGA */
+       if ((dev->pdev->device == 0x9805) &&
+           (dev->pdev->subsystem_vendor == 0x1734) &&
+           (dev->pdev->subsystem_device == 0x11bd)) {
+               if (*connector_type == DRM_MODE_CONNECTOR_VGA)
+                       return false;
+       }
 
        return true;
 }
@@ -1917,7 +1924,7 @@ static const char *thermal_controller_names[] = {
        "adm1032",
        "adm1030",
        "max6649",
-       "lm64",
+       "lm63", /* lm64 */
        "f75375",
        "asc7xxx",
 };
@@ -1928,7 +1935,7 @@ static const char *pp_lib_thermal_controller_names[] = {
        "adm1032",
        "adm1030",
        "max6649",
-       "lm64",
+       "lm63", /* lm64 */
        "f75375",
        "RV6xx",
        "RV770",
diff --git sys/dev/pci/drm/radeon/radeon_display.c 
sys/dev/pci/drm/radeon/radeon_display.c
index 17b2f9b..62245ed 100644
--- sys/dev/pci/drm/radeon/radeon_display.c
+++ sys/dev/pci/drm/radeon/radeon_display.c
@@ -702,6 +702,10 @@ int radeon_ddc_get_modes(struct radeon_connector 
*radeon_connector)
        struct radeon_device *rdev = dev->dev_private;
        int ret = 0;
 
+       /* don't leak the edid if we already fetched it in detect() */
+       if (radeon_connector->edid)
+               goto got_edid;
+
        /* on hw with routers, select right port */
        if (radeon_connector->router.ddc_valid)
                radeon_router_select_ddc_port(radeon_connector);
@@ -741,6 +745,7 @@ int radeon_ddc_get_modes(struct radeon_connector 
*radeon_connector)
                        radeon_connector->edid = 
radeon_bios_get_hardcoded_edid(rdev);
        }
        if (radeon_connector->edid) {
+got_edid:
                
drm_mode_connector_update_edid_property(&radeon_connector->base, 
radeon_connector->edid);
                ret = drm_add_edid_modes(&radeon_connector->base, 
radeon_connector->edid);
                drm_edid_to_eld(&radeon_connector->base, 
radeon_connector->edid);
diff --git sys/dev/pci/drm/radeon/radeon_kms.c 
sys/dev/pci/drm/radeon/radeon_kms.c
index a7aabbd..546390b 100644
--- sys/dev/pci/drm/radeon/radeon_kms.c
+++ sys/dev/pci/drm/radeon/radeon_kms.c
@@ -1300,6 +1300,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device 
*dev, int crtc,
 
        /* 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,
diff --git sys/dev/pci/drm/radeon/radeon_ttm.c 
sys/dev/pci/drm/radeon/radeon_ttm.c
index 3fd4f3e..840406f 100644
--- sys/dev/pci/drm/radeon/radeon_ttm.c
+++ sys/dev/pci/drm/radeon/radeon_ttm.c
@@ -224,7 +224,7 @@ radeon_evict_flags(struct ttm_buffer_object *bo,
        rbo = container_of(bo, struct radeon_bo, tbo);
        switch (bo->mem.mem_type) {
        case TTM_PL_VRAM:
-               if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false)
+               if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == 
false)
                        radeon_ttm_placement_from_domain(rbo, 
RADEON_GEM_DOMAIN_CPU);
                else
                        radeon_ttm_placement_from_domain(rbo, 
RADEON_GEM_DOMAIN_GTT);
diff --git sys/dev/pci/drm/radeon/rs600.c sys/dev/pci/drm/radeon/rs600.c
index de23e52..7ed205d 100644
--- sys/dev/pci/drm/radeon/rs600.c
+++ sys/dev/pci/drm/radeon/rs600.c
@@ -587,8 +587,10 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, 
uint64_t addr)
                return -EINVAL;
        }
        addr = addr & 0xFFFFFFFFFFFFF000ULL;
-       addr |= R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED;
-       addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE;
+       if (addr != rdev->dummy_page.addr)
+               addr |= R600_PTE_VALID | R600_PTE_READABLE |
+                       R600_PTE_WRITEABLE;
+       addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED;
        ptr += i;
        *ptr = addr;
        return 0;

Reply via email to