Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1a506e4

Browse files
committed
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull i915 drm fixes from Dave Airlie: "These should be the last two fixes for i915, one is for a fence leak killing X on some older GPUs, and one is a late regression partial revert for an swiotlb/xen/i915 interaction, Konrad has promised to figure out the proper answer, and this patch is the best thing to do at this stage to avoid regressing" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/i915: make compact dma scatter lists creation work with SWIOTLB backend. drm/i915: Restore fences after resume and GPU resets
2 parents 34a0868 + 426729d commit 1a506e4

File tree

3 files changed

+20
-20
lines changed

3 files changed

+20
-20
lines changed

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,8 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
16971697
struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
16981698
struct drm_gem_object *gem_obj, int flags);
16991699

1700+
void i915_gem_restore_fences(struct drm_device *dev);
1701+
17001702
/* i915_gem_context.c */
17011703
void i915_gem_context_init(struct drm_device *dev);
17021704
void i915_gem_context_fini(struct drm_device *dev);

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,7 +1801,14 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
18011801
gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;
18021802
gfp &= ~(__GFP_IO | __GFP_WAIT);
18031803
}
1804-
1804+
#ifdef CONFIG_SWIOTLB
1805+
if (swiotlb_nr_tbl()) {
1806+
st->nents++;
1807+
sg_set_page(sg, page, PAGE_SIZE, 0);
1808+
sg = sg_next(sg);
1809+
continue;
1810+
}
1811+
#endif
18051812
if (!i || page_to_pfn(page) != last_pfn + 1) {
18061813
if (i)
18071814
sg = sg_next(sg);
@@ -1812,8 +1819,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
18121819
}
18131820
last_pfn = page_to_pfn(page);
18141821
}
1815-
1816-
sg_mark_end(sg);
1822+
#ifdef CONFIG_SWIOTLB
1823+
if (!swiotlb_nr_tbl())
1824+
#endif
1825+
sg_mark_end(sg);
18171826
obj->pages = st;
18181827

18191828
if (i915_gem_object_needs_bit17_swizzle(obj))
@@ -2117,25 +2126,15 @@ static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
21172126
}
21182127
}
21192128

2120-
static void i915_gem_reset_fences(struct drm_device *dev)
2129+
void i915_gem_restore_fences(struct drm_device *dev)
21212130
{
21222131
struct drm_i915_private *dev_priv = dev->dev_private;
21232132
int i;
21242133

21252134
for (i = 0; i < dev_priv->num_fence_regs; i++) {
21262135
struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
2127-
2128-
if (reg->obj)
2129-
i915_gem_object_fence_lost(reg->obj);
2130-
2131-
i915_gem_write_fence(dev, i, NULL);
2132-
2133-
reg->pin_count = 0;
2134-
reg->obj = NULL;
2135-
INIT_LIST_HEAD(&reg->lru_list);
2136+
i915_gem_write_fence(dev, i, reg->obj);
21362137
}
2137-
2138-
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
21392138
}
21402139

21412140
void i915_gem_reset(struct drm_device *dev)
@@ -2158,8 +2157,7 @@ void i915_gem_reset(struct drm_device *dev)
21582157
obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
21592158
}
21602159

2161-
/* The fence registers are invalidated so clear them out */
2162-
i915_gem_reset_fences(dev);
2160+
i915_gem_restore_fences(dev);
21632161
}
21642162

21652163
/**
@@ -3865,8 +3863,6 @@ i915_gem_idle(struct drm_device *dev)
38653863
if (!drm_core_check_feature(dev, DRIVER_MODESET))
38663864
i915_gem_evict_everything(dev);
38673865

3868-
i915_gem_reset_fences(dev);
3869-
38703866
/* Hack! Don't let anybody do execbuf while we don't control the chip.
38713867
* We need to replace this with a semaphore, or something.
38723868
* And not confound mm.suspended!
@@ -4193,7 +4189,8 @@ i915_gem_load(struct drm_device *dev)
41934189
dev_priv->num_fence_regs = 8;
41944190

41954191
/* Initialize fence registers to zero */
4196-
i915_gem_reset_fences(dev);
4192+
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
4193+
i915_gem_restore_fences(dev);
41974194

41984195
i915_gem_detect_bit_6_swizzle(dev);
41994196
init_waitqueue_head(&dev_priv->pending_flip_queue);

drivers/gpu/drm/i915/i915_suspend.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ int i915_restore_state(struct drm_device *dev)
384384

385385
mutex_lock(&dev->struct_mutex);
386386

387+
i915_gem_restore_fences(dev);
387388
i915_restore_display(dev);
388389

389390
if (!drm_core_check_feature(dev, DRIVER_MODESET)) {

0 commit comments

Comments
 (0)