You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"This looks bigger than it is, as one of the nouveau firmware fixes
("drm/gf100-/gr: report class data to host on fwmthd failure")
regenerates a bunch of the firmware files after changing the assembly
by a few lines, without that, its more of a
36 files changed, 370 insertions(+), 129 deletions(-)
It contains some vt.c fixes acked by Greg, for rare hard hangs on i915
loading, that also fixes hangs on reload and spurious register write
errors.
drm core: one fix for uninit memory
nouveau: displayport rework caused a few regressions, Ben has been
fixing them as the appear, along with some other fixes
radeon: pageflipping regression fix, deep color fix, mode validation
fixes
i915: fbc disable, vga console kick off, backlight fix, divide-by-zero
fix"
* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (33 commits)
drm: fix uninitialized acquire_ctx fields (v2)
drm/radeon: Fix radeon_irq_kms_pflip_irq_get/put() imbalance
Revert "drm/radeon: remove drm_vblank_get|put from pflip handling"
drm/radeon: improve dvi_mode_valid
drm/radeon: update mode_valid testing for DP
drm/radeon: Use dce5/6 hdmi deep color clock setup also on dce8+
drm/nouveau/disp: fix oops in destructor with headless cards
drm/gf117/i2c: no aux channels on this chipset
drm/nouveau/doc: update the thermal documentation
drm/nouveau/pwr: fix typo in fifo wrap handling
drm/nv50/disp: fix a potential oops in supervisor handling
drm/nouveau/disp/dp: don't touch link config after success
drm/nouveau/kms: reference vblank for crtc during pageflip.
drm/gk104/fb/ram: fixups from an earlier search+replace
drm/nv50/gr: remove an unneeded write while initialising PGRAPH
drm/nv50/gr: fix overlap while zeroing zcull regions
drm/gf100-/gr: report class data to host on fwmthd failure
drm/gk104/ibus: increase various random timeouts
drm/gk104/clk: only touch divider for mode we'll be using
drm/radeon: Bypass hw lut's for > 8 bpc framebuffer scanout.
...
This commit is contained in:
@@ -4,7 +4,7 @@ Kernel driver nouveau
|
||||
Supported chips:
|
||||
* NV43+
|
||||
|
||||
Authors: Martin Peres (mupuf) <martin.peres@labri.fr>
|
||||
Authors: Martin Peres (mupuf) <martin.peres@free.fr>
|
||||
|
||||
Description
|
||||
---------
|
||||
@@ -68,8 +68,9 @@ Your fan can be driven in different modes:
|
||||
|
||||
NOTE: Be sure to use the manual mode if you want to drive the fan speed manually
|
||||
|
||||
NOTE2: Not all fan management modes may be supported on all chipsets. We are
|
||||
working on it.
|
||||
NOTE2: When operating in manual mode outside the vbios-defined
|
||||
[PWM_min, PWM_max] range, the reported fan speed (RPM) may not be accurate
|
||||
depending on your hardware.
|
||||
|
||||
Bug reports
|
||||
---------
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
void drm_modeset_acquire_init(struct drm_modeset_acquire_ctx *ctx,
|
||||
uint32_t flags)
|
||||
{
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
ww_acquire_init(&ctx->ww_ctx, &crtc_ww_class);
|
||||
INIT_LIST_HEAD(&ctx->locked);
|
||||
}
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "i915_drv.h"
|
||||
#include "i915_trace.h"
|
||||
#include <linux/pci.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/vt.h>
|
||||
#include <linux/vgaarb.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/pnp.h>
|
||||
@@ -1386,7 +1388,6 @@ cleanup_gem:
|
||||
i915_gem_context_fini(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
WARN_ON(dev_priv->mm.aliasing_ppgtt);
|
||||
drm_mm_takedown(&dev_priv->gtt.base.mm);
|
||||
cleanup_irq:
|
||||
drm_irq_uninstall(dev);
|
||||
cleanup_gem_stolen:
|
||||
@@ -1450,6 +1451,38 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_VGA_CONSOLE)
|
||||
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#elif !defined(CONFIG_DUMMY_CONSOLE)
|
||||
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#else
|
||||
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
DRM_INFO("Replacing VGA console driver\n");
|
||||
|
||||
console_lock();
|
||||
ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
|
||||
if (ret == 0) {
|
||||
ret = do_unregister_con_driver(&vga_con);
|
||||
|
||||
/* Ignore "already unregistered". */
|
||||
if (ret == -ENODEV)
|
||||
ret = 0;
|
||||
}
|
||||
console_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void i915_dump_device_info(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
const struct intel_device_info *info = &dev_priv->info;
|
||||
@@ -1623,8 +1656,15 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
if (ret)
|
||||
goto out_regs;
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||
ret = i915_kick_out_vgacon(dev_priv);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to remove conflicting VGA console\n");
|
||||
goto out_gtt;
|
||||
}
|
||||
|
||||
i915_kick_out_firmware_fb(dev_priv);
|
||||
}
|
||||
|
||||
pci_set_master(dev->pdev);
|
||||
|
||||
@@ -1756,8 +1796,6 @@ out_mtrrfree:
|
||||
arch_phys_wc_del(dev_priv->gtt.mtrr);
|
||||
io_mapping_free(dev_priv->gtt.mappable);
|
||||
out_gtt:
|
||||
list_del(&dev_priv->gtt.base.global_link);
|
||||
drm_mm_takedown(&dev_priv->gtt.base.mm);
|
||||
dev_priv->gtt.base.cleanup(&dev_priv->gtt.base);
|
||||
out_regs:
|
||||
intel_uncore_fini(dev);
|
||||
@@ -1846,7 +1884,6 @@ int i915_driver_unload(struct drm_device *dev)
|
||||
i915_free_hws(dev);
|
||||
}
|
||||
|
||||
list_del(&dev_priv->gtt.base.global_link);
|
||||
WARN_ON(!list_empty(&dev_priv->vm_list));
|
||||
|
||||
drm_vblank_cleanup(dev);
|
||||
|
||||
@@ -1992,7 +1992,10 @@ static void gen6_gmch_remove(struct i915_address_space *vm)
|
||||
|
||||
struct i915_gtt *gtt = container_of(vm, struct i915_gtt, base);
|
||||
|
||||
drm_mm_takedown(&vm->mm);
|
||||
if (drm_mm_initialized(&vm->mm)) {
|
||||
drm_mm_takedown(&vm->mm);
|
||||
list_del(&vm->global_link);
|
||||
}
|
||||
iounmap(gtt->gsm);
|
||||
teardown_scratch_page(vm->dev);
|
||||
}
|
||||
@@ -2025,6 +2028,10 @@ static int i915_gmch_probe(struct drm_device *dev,
|
||||
|
||||
static void i915_gmch_remove(struct i915_address_space *vm)
|
||||
{
|
||||
if (drm_mm_initialized(&vm->mm)) {
|
||||
drm_mm_takedown(&vm->mm);
|
||||
list_del(&vm->global_link);
|
||||
}
|
||||
intel_gmch_remove();
|
||||
}
|
||||
|
||||
|
||||
@@ -888,6 +888,8 @@ static void i915_gem_record_rings(struct drm_device *dev,
|
||||
for (i = 0; i < I915_NUM_RINGS; i++) {
|
||||
struct intel_engine_cs *ring = &dev_priv->ring[i];
|
||||
|
||||
error->ring[i].pid = -1;
|
||||
|
||||
if (ring->dev == NULL)
|
||||
continue;
|
||||
|
||||
@@ -895,7 +897,6 @@ static void i915_gem_record_rings(struct drm_device *dev,
|
||||
|
||||
i915_record_ring_state(dev, ring, &error->ring[i]);
|
||||
|
||||
error->ring[i].pid = -1;
|
||||
request = i915_gem_find_active_request(ring);
|
||||
if (request) {
|
||||
/* We need to copy these to an anonymous buffer
|
||||
|
||||
@@ -2847,10 +2847,14 @@ static int semaphore_passed(struct intel_engine_cs *ring)
|
||||
struct intel_engine_cs *signaller;
|
||||
u32 seqno, ctl;
|
||||
|
||||
ring->hangcheck.deadlock = true;
|
||||
ring->hangcheck.deadlock++;
|
||||
|
||||
signaller = semaphore_waits_for(ring, &seqno);
|
||||
if (signaller == NULL || signaller->hangcheck.deadlock)
|
||||
if (signaller == NULL)
|
||||
return -1;
|
||||
|
||||
/* Prevent pathological recursion due to driver bugs */
|
||||
if (signaller->hangcheck.deadlock >= I915_NUM_RINGS)
|
||||
return -1;
|
||||
|
||||
/* cursory check for an unkickable deadlock */
|
||||
@@ -2858,7 +2862,13 @@ static int semaphore_passed(struct intel_engine_cs *ring)
|
||||
if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0)
|
||||
return -1;
|
||||
|
||||
return i915_seqno_passed(signaller->get_seqno(signaller, false), seqno);
|
||||
if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno))
|
||||
return 1;
|
||||
|
||||
if (signaller->hangcheck.deadlock)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv)
|
||||
@@ -2867,7 +2877,7 @@ static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv)
|
||||
int i;
|
||||
|
||||
for_each_ring(ring, dev_priv, i)
|
||||
ring->hangcheck.deadlock = false;
|
||||
ring->hangcheck.deadlock = 0;
|
||||
}
|
||||
|
||||
static enum intel_ring_hangcheck_action
|
||||
|
||||
@@ -798,9 +798,6 @@ static void i965_enable_backlight(struct intel_connector *connector)
|
||||
ctl = freq << 16;
|
||||
I915_WRITE(BLC_PWM_CTL, ctl);
|
||||
|
||||
/* XXX: combine this into above write? */
|
||||
intel_panel_actually_set_backlight(connector, panel->backlight.level);
|
||||
|
||||
ctl2 = BLM_PIPE(pipe);
|
||||
if (panel->backlight.combination_mode)
|
||||
ctl2 |= BLM_COMBINATION_MODE;
|
||||
@@ -809,6 +806,8 @@ static void i965_enable_backlight(struct intel_connector *connector)
|
||||
I915_WRITE(BLC_PWM_CTL2, ctl2);
|
||||
POSTING_READ(BLC_PWM_CTL2);
|
||||
I915_WRITE(BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
|
||||
|
||||
intel_panel_actually_set_backlight(connector, panel->backlight.level);
|
||||
}
|
||||
|
||||
static void vlv_enable_backlight(struct intel_connector *connector)
|
||||
|
||||
@@ -511,8 +511,7 @@ void intel_update_fbc(struct drm_device *dev)
|
||||
obj = intel_fb->obj;
|
||||
adjusted_mode = &intel_crtc->config.adjusted_mode;
|
||||
|
||||
if (i915.enable_fbc < 0 &&
|
||||
INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) {
|
||||
if (i915.enable_fbc < 0) {
|
||||
if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT))
|
||||
DRM_DEBUG_KMS("disabled per chip default\n");
|
||||
goto out_disable;
|
||||
@@ -3506,15 +3505,11 @@ static void gen8_enable_rps(struct drm_device *dev)
|
||||
|
||||
I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
|
||||
|
||||
/* WaDisablePwrmtrEvent:chv (pre-production hw) */
|
||||
I915_WRITE(0xA80C, I915_READ(0xA80C) & 0x00ffffff);
|
||||
I915_WRITE(0xA810, I915_READ(0xA810) & 0xffffff00);
|
||||
|
||||
/* 5: Enable RPS */
|
||||
I915_WRITE(GEN6_RP_CONTROL,
|
||||
GEN6_RP_MEDIA_TURBO |
|
||||
GEN6_RP_MEDIA_HW_NORMAL_MODE |
|
||||
GEN6_RP_MEDIA_IS_GFX | /* WaSetMaskForGfxBusyness:chv (pre-production hw ?) */
|
||||
GEN6_RP_MEDIA_IS_GFX |
|
||||
GEN6_RP_ENABLE |
|
||||
GEN6_RP_UP_BUSY_AVG |
|
||||
GEN6_RP_DOWN_IDLE_AVG);
|
||||
|
||||
@@ -55,7 +55,7 @@ struct intel_ring_hangcheck {
|
||||
u32 seqno;
|
||||
int score;
|
||||
enum intel_ring_hangcheck_action action;
|
||||
bool deadlock;
|
||||
int deadlock;
|
||||
};
|
||||
|
||||
struct intel_ringbuffer {
|
||||
|
||||
@@ -1385,7 +1385,9 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
|
||||
>> SDVO_PORT_MULTIPLY_SHIFT) + 1;
|
||||
}
|
||||
|
||||
dotclock = pipe_config->port_clock / pipe_config->pixel_multiplier;
|
||||
dotclock = pipe_config->port_clock;
|
||||
if (pipe_config->pixel_multiplier)
|
||||
dotclock /= pipe_config->pixel_multiplier;
|
||||
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
ironlake_check_encoder_dotclock(pipe_config, dotclock);
|
||||
|
||||
@@ -320,7 +320,8 @@ static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
unsigned long irqflags;
|
||||
|
||||
del_timer_sync(&dev_priv->uncore.force_wake_timer);
|
||||
if (del_timer_sync(&dev_priv->uncore.force_wake_timer))
|
||||
gen6_force_wake_timer((unsigned long)dev_priv);
|
||||
|
||||
/* Hold uncore.lock across reset to prevent any register access
|
||||
* with forcewake not set correctly
|
||||
|
||||
@@ -140,6 +140,7 @@ nouveau-y += core/subdev/i2c/nv4e.o
|
||||
nouveau-y += core/subdev/i2c/nv50.o
|
||||
nouveau-y += core/subdev/i2c/nv94.o
|
||||
nouveau-y += core/subdev/i2c/nvd0.o
|
||||
nouveau-y += core/subdev/i2c/gf117.o
|
||||
nouveau-y += core/subdev/i2c/nve0.o
|
||||
nouveau-y += core/subdev/ibus/nvc0.o
|
||||
nouveau-y += core/subdev/ibus/nve0.o
|
||||
|
||||
@@ -314,7 +314,7 @@ nvc0_identify(struct nouveau_device *device)
|
||||
device->cname = "GF117";
|
||||
device->oclass[NVDEV_SUBDEV_VBIOS ] = &nouveau_bios_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_GPIO ] = nvd0_gpio_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_I2C ] = nvd0_i2c_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_I2C ] = gf117_i2c_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nvc0_clock_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||
|
||||
@@ -99,8 +99,10 @@ _nouveau_disp_dtor(struct nouveau_object *object)
|
||||
|
||||
nouveau_event_destroy(&disp->vblank);
|
||||
|
||||
list_for_each_entry_safe(outp, outt, &disp->outp, head) {
|
||||
nouveau_object_ref(NULL, (struct nouveau_object **)&outp);
|
||||
if (disp->outp.next) {
|
||||
list_for_each_entry_safe(outp, outt, &disp->outp, head) {
|
||||
nouveau_object_ref(NULL, (struct nouveau_object **)&outp);
|
||||
}
|
||||
}
|
||||
|
||||
nouveau_engine_destroy(&disp->base);
|
||||
|
||||
@@ -241,7 +241,9 @@ dp_link_train_eq(struct dp_state *dp)
|
||||
dp_set_training_pattern(dp, 2);
|
||||
|
||||
do {
|
||||
if (dp_link_train_update(dp, dp->pc2, 400))
|
||||
if ((tries &&
|
||||
dp_link_train_commit(dp, dp->pc2)) ||
|
||||
dp_link_train_update(dp, dp->pc2, 400))
|
||||
break;
|
||||
|
||||
eq_done = !!(dp->stat[2] & DPCD_LS04_INTERLANE_ALIGN_DONE);
|
||||
@@ -253,9 +255,6 @@ dp_link_train_eq(struct dp_state *dp)
|
||||
!(lane & DPCD_LS02_LANE0_SYMBOL_LOCKED))
|
||||
eq_done = false;
|
||||
}
|
||||
|
||||
if (dp_link_train_commit(dp, dp->pc2))
|
||||
break;
|
||||
} while (!eq_done && cr_done && ++tries <= 5);
|
||||
|
||||
return eq_done ? 0 : -1;
|
||||
|
||||
@@ -1270,7 +1270,7 @@ exec_clkcmp(struct nv50_disp_priv *priv, int head, int id, u32 pclk, u32 *conf)
|
||||
i--;
|
||||
|
||||
outp = exec_lookup(priv, head, i, ctrl, &data, &ver, &hdr, &cnt, &len, &info1);
|
||||
if (!data)
|
||||
if (!outp)
|
||||
return NULL;
|
||||
|
||||
if (outp->info.location == 0) {
|
||||
|
||||
@@ -54,7 +54,7 @@ mmio_list_base:
|
||||
#ifdef INCLUDE_CODE
|
||||
// reports an exception to the host
|
||||
//
|
||||
// In: $r15 error code (see nvc0.fuc)
|
||||
// In: $r15 error code (see os.h)
|
||||
//
|
||||
error:
|
||||
push $r14
|
||||
|
||||
@@ -49,7 +49,7 @@ hub_mmio_list_next:
|
||||
#ifdef INCLUDE_CODE
|
||||
// reports an exception to the host
|
||||
//
|
||||
// In: $r15 error code (see nvc0.fuc)
|
||||
// In: $r15 error code (see os.h)
|
||||
//
|
||||
error:
|
||||
nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(5), 0, $r15)
|
||||
@@ -343,13 +343,25 @@ ih:
|
||||
ih_no_ctxsw:
|
||||
and $r11 $r10 NV_PGRAPH_FECS_INTR_FWMTHD
|
||||
bra e #ih_no_fwmthd
|
||||
// none we handle, ack, and fall-through to unhandled
|
||||
// none we handle; report to host and ack
|
||||
nv_rd32($r15, NV_PGRAPH_TRAPPED_DATA_LO)
|
||||
nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(4), 0, $r15)
|
||||
nv_rd32($r15, NV_PGRAPH_TRAPPED_ADDR)
|
||||
nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(3), 0, $r15)
|
||||
extr $r14 $r15 16:18
|
||||
shl b32 $r14 $r14 2
|
||||
imm32($r15, NV_PGRAPH_FE_OBJECT_TABLE(0))
|
||||
add b32 $r14 $r15
|
||||
call(nv_rd32)
|
||||
nv_iowr(NV_PGRAPH_FECS_CC_SCRATCH_VAL(2), 0, $r15)
|
||||
mov $r15 E_BAD_FWMTHD
|
||||
call(error)
|
||||
mov $r11 0x100
|
||||
nv_wr32(0x400144, $r11)
|
||||
|
||||
// anything we didn't handle, bring it to the host's attention
|
||||
ih_no_fwmthd:
|
||||
mov $r11 0x104 // FIFO | CHSW
|
||||
mov $r11 0x504 // FIFO | CHSW | FWMTHD
|
||||
not b32 $r11
|
||||
and $r11 $r10 $r11
|
||||
bra e #ih_no_other
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user