diff options
author | Dave Airlie <airlied@redhat.com> | 2019-05-10 00:28:36 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2019-05-10 00:28:36 -0400 |
commit | b1c19fa16c82f45032f6c1d715dbaf250bdd824c (patch) | |
tree | d6369c38e740535df0fd2c4af70f772dc0e1526f | |
parent | eb85d03e01c3e9f3b0ba7282b2e3515a635decb2 (diff) | |
parent | 23372cce8fe7ee98a6458fd3d035a55b87f0c6fe (diff) |
Merge tag 'drm-intel-next-fixes-2019-05-09' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
- Two fixes for the freshly enabled semaphore ordering code
- Includes gvt-next-fixes-2019-05-07
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190509100109.GA14820@jlahtine-desk.ger.corp.intel.com
-rw-r--r-- | drivers/gpu/drm/i915/gvt/debugfs.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/dmabuf.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio_context.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/reg.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_request.c | 59 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_context.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_context_types.h | 3 |
11 files changed, 93 insertions, 34 deletions
diff --git a/drivers/gpu/drm/i915/gvt/debugfs.c b/drivers/gpu/drm/i915/gvt/debugfs.c index 2ec89bcb59f1..8a9606f91e68 100644 --- a/drivers/gpu/drm/i915/gvt/debugfs.c +++ b/drivers/gpu/drm/i915/gvt/debugfs.c | |||
@@ -196,9 +196,9 @@ DEFINE_SIMPLE_ATTRIBUTE(vgpu_scan_nonprivbb_fops, | |||
196 | int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu) | 196 | int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu) |
197 | { | 197 | { |
198 | struct dentry *ent; | 198 | struct dentry *ent; |
199 | char name[10] = ""; | 199 | char name[16] = ""; |
200 | 200 | ||
201 | sprintf(name, "vgpu%d", vgpu->id); | 201 | snprintf(name, 16, "vgpu%d", vgpu->id); |
202 | vgpu->debugfs = debugfs_create_dir(name, vgpu->gvt->debugfs_root); | 202 | vgpu->debugfs = debugfs_create_dir(name, vgpu->gvt->debugfs_root); |
203 | if (!vgpu->debugfs) | 203 | if (!vgpu->debugfs) |
204 | return -ENOMEM; | 204 | return -ENOMEM; |
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c index 4e1e425189ba..41c8ebc60c63 100644 --- a/drivers/gpu/drm/i915/gvt/dmabuf.c +++ b/drivers/gpu/drm/i915/gvt/dmabuf.c | |||
@@ -45,6 +45,7 @@ static int vgpu_gem_get_pages( | |||
45 | int i, ret; | 45 | int i, ret; |
46 | gen8_pte_t __iomem *gtt_entries; | 46 | gen8_pte_t __iomem *gtt_entries; |
47 | struct intel_vgpu_fb_info *fb_info; | 47 | struct intel_vgpu_fb_info *fb_info; |
48 | u32 page_num; | ||
48 | 49 | ||
49 | fb_info = (struct intel_vgpu_fb_info *)obj->gvt_info; | 50 | fb_info = (struct intel_vgpu_fb_info *)obj->gvt_info; |
50 | if (WARN_ON(!fb_info)) | 51 | if (WARN_ON(!fb_info)) |
@@ -54,14 +55,15 @@ static int vgpu_gem_get_pages( | |||
54 | if (unlikely(!st)) | 55 | if (unlikely(!st)) |
55 | return -ENOMEM; | 56 | return -ENOMEM; |
56 | 57 | ||
57 | ret = sg_alloc_table(st, fb_info->size, GFP_KERNEL); | 58 | page_num = obj->base.size >> PAGE_SHIFT; |
59 | ret = sg_alloc_table(st, page_num, GFP_KERNEL); | ||
58 | if (ret) { | 60 | if (ret) { |
59 | kfree(st); | 61 | kfree(st); |
60 | return ret; | 62 | return ret; |
61 | } | 63 | } |
62 | gtt_entries = (gen8_pte_t __iomem *)dev_priv->ggtt.gsm + | 64 | gtt_entries = (gen8_pte_t __iomem *)dev_priv->ggtt.gsm + |
63 | (fb_info->start >> PAGE_SHIFT); | 65 | (fb_info->start >> PAGE_SHIFT); |
64 | for_each_sg(st->sgl, sg, fb_info->size, i) { | 66 | for_each_sg(st->sgl, sg, page_num, i) { |
65 | sg->offset = 0; | 67 | sg->offset = 0; |
66 | sg->length = PAGE_SIZE; | 68 | sg->length = PAGE_SIZE; |
67 | sg_dma_address(sg) = | 69 | sg_dma_address(sg) = |
@@ -158,7 +160,7 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev, | |||
158 | return NULL; | 160 | return NULL; |
159 | 161 | ||
160 | drm_gem_private_object_init(dev, &obj->base, | 162 | drm_gem_private_object_init(dev, &obj->base, |
161 | info->size << PAGE_SHIFT); | 163 | roundup(info->size, PAGE_SIZE)); |
162 | i915_gem_object_init(obj, &intel_vgpu_gem_ops); | 164 | i915_gem_object_init(obj, &intel_vgpu_gem_ops); |
163 | 165 | ||
164 | obj->read_domains = I915_GEM_DOMAIN_GTT; | 166 | obj->read_domains = I915_GEM_DOMAIN_GTT; |
@@ -206,11 +208,12 @@ static int vgpu_get_plane_info(struct drm_device *dev, | |||
206 | struct intel_vgpu_fb_info *info, | 208 | struct intel_vgpu_fb_info *info, |
207 | int plane_id) | 209 | int plane_id) |
208 | { | 210 | { |
209 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
210 | struct intel_vgpu_primary_plane_format p; | 211 | struct intel_vgpu_primary_plane_format p; |
211 | struct intel_vgpu_cursor_plane_format c; | 212 | struct intel_vgpu_cursor_plane_format c; |
212 | int ret, tile_height = 1; | 213 | int ret, tile_height = 1; |
213 | 214 | ||
215 | memset(info, 0, sizeof(*info)); | ||
216 | |||
214 | if (plane_id == DRM_PLANE_TYPE_PRIMARY) { | 217 | if (plane_id == DRM_PLANE_TYPE_PRIMARY) { |
215 | ret = intel_vgpu_decode_primary_plane(vgpu, &p); | 218 | ret = intel_vgpu_decode_primary_plane(vgpu, &p); |
216 | if (ret) | 219 | if (ret) |
@@ -267,8 +270,7 @@ static int vgpu_get_plane_info(struct drm_device *dev, | |||
267 | return -EINVAL; | 270 | return -EINVAL; |
268 | } | 271 | } |
269 | 272 | ||
270 | info->size = (info->stride * roundup(info->height, tile_height) | 273 | info->size = info->stride * roundup(info->height, tile_height); |
271 | + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
272 | if (info->size == 0) { | 274 | if (info->size == 0) { |
273 | gvt_vgpu_err("fb size is zero\n"); | 275 | gvt_vgpu_err("fb size is zero\n"); |
274 | return -EINVAL; | 276 | return -EINVAL; |
@@ -278,11 +280,6 @@ static int vgpu_get_plane_info(struct drm_device *dev, | |||
278 | gvt_vgpu_err("Not aligned fb address:0x%llx\n", info->start); | 280 | gvt_vgpu_err("Not aligned fb address:0x%llx\n", info->start); |
279 | return -EFAULT; | 281 | return -EFAULT; |
280 | } | 282 | } |
281 | if (((info->start >> PAGE_SHIFT) + info->size) > | ||
282 | ggtt_total_entries(&dev_priv->ggtt)) { | ||
283 | gvt_vgpu_err("Invalid GTT offset or size\n"); | ||
284 | return -EFAULT; | ||
285 | } | ||
286 | 283 | ||
287 | if (!intel_gvt_ggtt_validate_range(vgpu, info->start, info->size)) { | 284 | if (!intel_gvt_ggtt_validate_range(vgpu, info->start, info->size)) { |
288 | gvt_vgpu_err("invalid gma addr\n"); | 285 | gvt_vgpu_err("invalid gma addr\n"); |
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c index c2f7d20f6346..08c74e65836b 100644 --- a/drivers/gpu/drm/i915/gvt/gtt.c +++ b/drivers/gpu/drm/i915/gvt/gtt.c | |||
@@ -811,7 +811,7 @@ static int reclaim_one_ppgtt_mm(struct intel_gvt *gvt); | |||
811 | 811 | ||
812 | /* Allocate shadow page table without guest page. */ | 812 | /* Allocate shadow page table without guest page. */ |
813 | static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt( | 813 | static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt( |
814 | struct intel_vgpu *vgpu, intel_gvt_gtt_type_t type) | 814 | struct intel_vgpu *vgpu, enum intel_gvt_gtt_type type) |
815 | { | 815 | { |
816 | struct device *kdev = &vgpu->gvt->dev_priv->drm.pdev->dev; | 816 | struct device *kdev = &vgpu->gvt->dev_priv->drm.pdev->dev; |
817 | struct intel_vgpu_ppgtt_spt *spt = NULL; | 817 | struct intel_vgpu_ppgtt_spt *spt = NULL; |
@@ -861,7 +861,7 @@ err_free_spt: | |||
861 | 861 | ||
862 | /* Allocate shadow page table associated with specific gfn. */ | 862 | /* Allocate shadow page table associated with specific gfn. */ |
863 | static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt_gfn( | 863 | static struct intel_vgpu_ppgtt_spt *ppgtt_alloc_spt_gfn( |
864 | struct intel_vgpu *vgpu, intel_gvt_gtt_type_t type, | 864 | struct intel_vgpu *vgpu, enum intel_gvt_gtt_type type, |
865 | unsigned long gfn, bool guest_pde_ips) | 865 | unsigned long gfn, bool guest_pde_ips) |
866 | { | 866 | { |
867 | struct intel_vgpu_ppgtt_spt *spt; | 867 | struct intel_vgpu_ppgtt_spt *spt; |
@@ -936,7 +936,7 @@ static int ppgtt_invalidate_spt_by_shadow_entry(struct intel_vgpu *vgpu, | |||
936 | { | 936 | { |
937 | struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; | 937 | struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; |
938 | struct intel_vgpu_ppgtt_spt *s; | 938 | struct intel_vgpu_ppgtt_spt *s; |
939 | intel_gvt_gtt_type_t cur_pt_type; | 939 | enum intel_gvt_gtt_type cur_pt_type; |
940 | 940 | ||
941 | GEM_BUG_ON(!gtt_type_is_pt(get_next_pt_type(e->type))); | 941 | GEM_BUG_ON(!gtt_type_is_pt(get_next_pt_type(e->type))); |
942 | 942 | ||
@@ -1076,6 +1076,9 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_spt_by_guest_entry( | |||
1076 | } else { | 1076 | } else { |
1077 | int type = get_next_pt_type(we->type); | 1077 | int type = get_next_pt_type(we->type); |
1078 | 1078 | ||
1079 | if (!gtt_type_is_pt(type)) | ||
1080 | goto err; | ||
1081 | |||
1079 | spt = ppgtt_alloc_spt_gfn(vgpu, type, ops->get_pfn(we), ips); | 1082 | spt = ppgtt_alloc_spt_gfn(vgpu, type, ops->get_pfn(we), ips); |
1080 | if (IS_ERR(spt)) { | 1083 | if (IS_ERR(spt)) { |
1081 | ret = PTR_ERR(spt); | 1084 | ret = PTR_ERR(spt); |
@@ -1855,7 +1858,7 @@ static void vgpu_free_mm(struct intel_vgpu_mm *mm) | |||
1855 | * Zero on success, negative error code in pointer if failed. | 1858 | * Zero on success, negative error code in pointer if failed. |
1856 | */ | 1859 | */ |
1857 | struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu, | 1860 | struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu, |
1858 | intel_gvt_gtt_type_t root_entry_type, u64 pdps[]) | 1861 | enum intel_gvt_gtt_type root_entry_type, u64 pdps[]) |
1859 | { | 1862 | { |
1860 | struct intel_gvt *gvt = vgpu->gvt; | 1863 | struct intel_gvt *gvt = vgpu->gvt; |
1861 | struct intel_vgpu_mm *mm; | 1864 | struct intel_vgpu_mm *mm; |
@@ -2309,7 +2312,7 @@ int intel_vgpu_emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, | |||
2309 | } | 2312 | } |
2310 | 2313 | ||
2311 | static int alloc_scratch_pages(struct intel_vgpu *vgpu, | 2314 | static int alloc_scratch_pages(struct intel_vgpu *vgpu, |
2312 | intel_gvt_gtt_type_t type) | 2315 | enum intel_gvt_gtt_type type) |
2313 | { | 2316 | { |
2314 | struct intel_vgpu_gtt *gtt = &vgpu->gtt; | 2317 | struct intel_vgpu_gtt *gtt = &vgpu->gtt; |
2315 | struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; | 2318 | struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; |
@@ -2594,7 +2597,7 @@ struct intel_vgpu_mm *intel_vgpu_find_ppgtt_mm(struct intel_vgpu *vgpu, | |||
2594 | * Zero on success, negative error code if failed. | 2597 | * Zero on success, negative error code if failed. |
2595 | */ | 2598 | */ |
2596 | struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu, | 2599 | struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu, |
2597 | intel_gvt_gtt_type_t root_entry_type, u64 pdps[]) | 2600 | enum intel_gvt_gtt_type root_entry_type, u64 pdps[]) |
2598 | { | 2601 | { |
2599 | struct intel_vgpu_mm *mm; | 2602 | struct intel_vgpu_mm *mm; |
2600 | 2603 | ||
diff --git a/drivers/gpu/drm/i915/gvt/gtt.h b/drivers/gpu/drm/i915/gvt/gtt.h index 32c573aea494..42d0394f0de2 100644 --- a/drivers/gpu/drm/i915/gvt/gtt.h +++ b/drivers/gpu/drm/i915/gvt/gtt.h | |||
@@ -95,8 +95,8 @@ struct intel_gvt_gtt { | |||
95 | unsigned long scratch_mfn; | 95 | unsigned long scratch_mfn; |
96 | }; | 96 | }; |
97 | 97 | ||
98 | typedef enum { | 98 | enum intel_gvt_gtt_type { |
99 | GTT_TYPE_INVALID = -1, | 99 | GTT_TYPE_INVALID = 0, |
100 | 100 | ||
101 | GTT_TYPE_GGTT_PTE, | 101 | GTT_TYPE_GGTT_PTE, |
102 | 102 | ||
@@ -124,7 +124,7 @@ typedef enum { | |||
124 | GTT_TYPE_PPGTT_PML4_PT, | 124 | GTT_TYPE_PPGTT_PML4_PT, |
125 | 125 | ||
126 | GTT_TYPE_MAX, | 126 | GTT_TYPE_MAX, |
127 | } intel_gvt_gtt_type_t; | 127 | }; |
128 | 128 | ||
129 | enum intel_gvt_mm_type { | 129 | enum intel_gvt_mm_type { |
130 | INTEL_GVT_MM_GGTT, | 130 | INTEL_GVT_MM_GGTT, |
@@ -148,7 +148,7 @@ struct intel_vgpu_mm { | |||
148 | 148 | ||
149 | union { | 149 | union { |
150 | struct { | 150 | struct { |
151 | intel_gvt_gtt_type_t root_entry_type; | 151 | enum intel_gvt_gtt_type root_entry_type; |
152 | /* | 152 | /* |
153 | * The 4 PDPs in ring context. For 48bit addressing, | 153 | * The 4 PDPs in ring context. For 48bit addressing, |
154 | * only PDP0 is valid and point to PML4. For 32it | 154 | * only PDP0 is valid and point to PML4. For 32it |
@@ -169,7 +169,7 @@ struct intel_vgpu_mm { | |||
169 | }; | 169 | }; |
170 | 170 | ||
171 | struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu, | 171 | struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu, |
172 | intel_gvt_gtt_type_t root_entry_type, u64 pdps[]); | 172 | enum intel_gvt_gtt_type root_entry_type, u64 pdps[]); |
173 | 173 | ||
174 | static inline void intel_vgpu_mm_get(struct intel_vgpu_mm *mm) | 174 | static inline void intel_vgpu_mm_get(struct intel_vgpu_mm *mm) |
175 | { | 175 | { |
@@ -233,7 +233,7 @@ struct intel_vgpu_ppgtt_spt { | |||
233 | struct intel_vgpu *vgpu; | 233 | struct intel_vgpu *vgpu; |
234 | 234 | ||
235 | struct { | 235 | struct { |
236 | intel_gvt_gtt_type_t type; | 236 | enum intel_gvt_gtt_type type; |
237 | bool pde_ips; /* for 64KB PTEs */ | 237 | bool pde_ips; /* for 64KB PTEs */ |
238 | void *vaddr; | 238 | void *vaddr; |
239 | struct page *page; | 239 | struct page *page; |
@@ -241,7 +241,7 @@ struct intel_vgpu_ppgtt_spt { | |||
241 | } shadow_page; | 241 | } shadow_page; |
242 | 242 | ||
243 | struct { | 243 | struct { |
244 | intel_gvt_gtt_type_t type; | 244 | enum intel_gvt_gtt_type type; |
245 | bool pde_ips; /* for 64KB PTEs */ | 245 | bool pde_ips; /* for 64KB PTEs */ |
246 | unsigned long gfn; | 246 | unsigned long gfn; |
247 | unsigned long write_cnt; | 247 | unsigned long write_cnt; |
@@ -267,7 +267,7 @@ struct intel_vgpu_mm *intel_vgpu_find_ppgtt_mm(struct intel_vgpu *vgpu, | |||
267 | u64 pdps[]); | 267 | u64 pdps[]); |
268 | 268 | ||
269 | struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu, | 269 | struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu, |
270 | intel_gvt_gtt_type_t root_entry_type, u64 pdps[]); | 270 | enum intel_gvt_gtt_type root_entry_type, u64 pdps[]); |
271 | 271 | ||
272 | int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[]); | 272 | int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[]); |
273 | 273 | ||
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c index 18f01eeb2510..90673fca792f 100644 --- a/drivers/gpu/drm/i915/gvt/handlers.c +++ b/drivers/gpu/drm/i915/gvt/handlers.c | |||
@@ -1206,7 +1206,7 @@ static int pvinfo_mmio_read(struct intel_vgpu *vgpu, unsigned int offset, | |||
1206 | 1206 | ||
1207 | static int handle_g2v_notification(struct intel_vgpu *vgpu, int notification) | 1207 | static int handle_g2v_notification(struct intel_vgpu *vgpu, int notification) |
1208 | { | 1208 | { |
1209 | intel_gvt_gtt_type_t root_entry_type = GTT_TYPE_PPGTT_ROOT_L4_ENTRY; | 1209 | enum intel_gvt_gtt_type root_entry_type = GTT_TYPE_PPGTT_ROOT_L4_ENTRY; |
1210 | struct intel_vgpu_mm *mm; | 1210 | struct intel_vgpu_mm *mm; |
1211 | u64 *pdps; | 1211 | u64 *pdps; |
1212 | 1212 | ||
@@ -3303,7 +3303,7 @@ void intel_gvt_clean_mmio_info(struct intel_gvt *gvt) | |||
3303 | /* Special MMIO blocks. */ | 3303 | /* Special MMIO blocks. */ |
3304 | static struct gvt_mmio_block mmio_blocks[] = { | 3304 | static struct gvt_mmio_block mmio_blocks[] = { |
3305 | {D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL}, | 3305 | {D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL}, |
3306 | {D_ALL, MCHBAR_MIRROR_REG_BASE, 0x4000, NULL, NULL}, | 3306 | {D_ALL, _MMIO(MCHBAR_MIRROR_BASE_SNB), 0x40000, NULL, NULL}, |
3307 | {D_ALL, _MMIO(VGT_PVINFO_PAGE), VGT_PVINFO_SIZE, | 3307 | {D_ALL, _MMIO(VGT_PVINFO_PAGE), VGT_PVINFO_SIZE, |
3308 | pvinfo_mmio_read, pvinfo_mmio_write}, | 3308 | pvinfo_mmio_read, pvinfo_mmio_write}, |
3309 | {D_ALL, LGC_PALETTE(PIPE_A, 0), 1024, NULL, NULL}, | 3309 | {D_ALL, LGC_PALETTE(PIPE_A, 0), 1024, NULL, NULL}, |
diff --git a/drivers/gpu/drm/i915/gvt/mmio_context.c b/drivers/gpu/drm/i915/gvt/mmio_context.c index e7e14c842be4..edf6d646eb25 100644 --- a/drivers/gpu/drm/i915/gvt/mmio_context.c +++ b/drivers/gpu/drm/i915/gvt/mmio_context.c | |||
@@ -132,6 +132,7 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = { | |||
132 | 132 | ||
133 | {RCS0, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */ | 133 | {RCS0, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */ |
134 | {RCS0, GEN9_CSFE_CHICKEN1_RCS, 0xffff, false}, /* 0x20d4 */ | 134 | {RCS0, GEN9_CSFE_CHICKEN1_RCS, 0xffff, false}, /* 0x20d4 */ |
135 | {RCS0, _MMIO(0x20D8), 0xffff, true}, /* 0x20d8 */ | ||
135 | 136 | ||
136 | {RCS0, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */ | 137 | {RCS0, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */ |
137 | {RCS0, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */ | 138 | {RCS0, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */ |
diff --git a/drivers/gpu/drm/i915/gvt/reg.h b/drivers/gpu/drm/i915/gvt/reg.h index 3de5b643b266..33aaa14bfdde 100644 --- a/drivers/gpu/drm/i915/gvt/reg.h +++ b/drivers/gpu/drm/i915/gvt/reg.h | |||
@@ -126,7 +126,4 @@ | |||
126 | #define RING_GFX_MODE(base) _MMIO((base) + 0x29c) | 126 | #define RING_GFX_MODE(base) _MMIO((base) + 0x29c) |
127 | #define VF_GUARDBAND _MMIO(0x83a4) | 127 | #define VF_GUARDBAND _MMIO(0x83a4) |
128 | 128 | ||
129 | /* define the effective range of MCHBAR register on Sandybridge+ */ | ||
130 | #define MCHBAR_MIRROR_REG_BASE _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x4000) | ||
131 | |||
132 | #endif | 129 | #endif |
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c index 8998fa5ab198..7c99bbc3e2b8 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.c +++ b/drivers/gpu/drm/i915/gvt/scheduler.c | |||
@@ -1343,7 +1343,7 @@ static int prepare_mm(struct intel_vgpu_workload *workload) | |||
1343 | struct execlist_ctx_descriptor_format *desc = &workload->ctx_desc; | 1343 | struct execlist_ctx_descriptor_format *desc = &workload->ctx_desc; |
1344 | struct intel_vgpu_mm *mm; | 1344 | struct intel_vgpu_mm *mm; |
1345 | struct intel_vgpu *vgpu = workload->vgpu; | 1345 | struct intel_vgpu *vgpu = workload->vgpu; |
1346 | intel_gvt_gtt_type_t root_entry_type; | 1346 | enum intel_gvt_gtt_type root_entry_type; |
1347 | u64 pdps[GVT_RING_CTX_NR_PDPS]; | 1347 | u64 pdps[GVT_RING_CTX_NR_PDPS]; |
1348 | 1348 | ||
1349 | switch (desc->addressing_mode) { | 1349 | switch (desc->addressing_mode) { |
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c index b836721d3b13..ce342f7f7ddb 100644 --- a/drivers/gpu/drm/i915/i915_request.c +++ b/drivers/gpu/drm/i915/i915_request.c | |||
@@ -425,6 +425,26 @@ void __i915_request_submit(struct i915_request *request) | |||
425 | if (i915_gem_context_is_banned(request->gem_context)) | 425 | if (i915_gem_context_is_banned(request->gem_context)) |
426 | i915_request_skip(request, -EIO); | 426 | i915_request_skip(request, -EIO); |
427 | 427 | ||
428 | /* | ||
429 | * Are we using semaphores when the gpu is already saturated? | ||
430 | * | ||
431 | * Using semaphores incurs a cost in having the GPU poll a | ||
432 | * memory location, busywaiting for it to change. The continual | ||
433 | * memory reads can have a noticeable impact on the rest of the | ||
434 | * system with the extra bus traffic, stalling the cpu as it too | ||
435 | * tries to access memory across the bus (perf stat -e bus-cycles). | ||
436 | * | ||
437 | * If we installed a semaphore on this request and we only submit | ||
438 | * the request after the signaler completed, that indicates the | ||
439 | * system is overloaded and using semaphores at this time only | ||
440 | * increases the amount of work we are doing. If so, we disable | ||
441 | * further use of semaphores until we are idle again, whence we | ||
442 | * optimistically try again. | ||
443 | */ | ||
444 | if (request->sched.semaphores && | ||
445 | i915_sw_fence_signaled(&request->semaphore)) | ||
446 | request->hw_context->saturated |= request->sched.semaphores; | ||
447 | |||
428 | /* We may be recursing from the signal callback of another i915 fence */ | 448 | /* We may be recursing from the signal callback of another i915 fence */ |
429 | spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING); | 449 | spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING); |
430 | 450 | ||
@@ -799,6 +819,39 @@ err_unreserve: | |||
799 | } | 819 | } |
800 | 820 | ||
801 | static int | 821 | static int |
822 | i915_request_await_start(struct i915_request *rq, struct i915_request *signal) | ||
823 | { | ||
824 | if (list_is_first(&signal->ring_link, &signal->ring->request_list)) | ||
825 | return 0; | ||
826 | |||
827 | signal = list_prev_entry(signal, ring_link); | ||
828 | if (i915_timeline_sync_is_later(rq->timeline, &signal->fence)) | ||
829 | return 0; | ||
830 | |||
831 | return i915_sw_fence_await_dma_fence(&rq->submit, | ||
832 | &signal->fence, 0, | ||
833 | I915_FENCE_GFP); | ||
834 | } | ||
835 | |||
836 | static intel_engine_mask_t | ||
837 | already_busywaiting(struct i915_request *rq) | ||
838 | { | ||
839 | /* | ||
840 | * Polling a semaphore causes bus traffic, delaying other users of | ||
841 | * both the GPU and CPU. We want to limit the impact on others, | ||
842 | * while taking advantage of early submission to reduce GPU | ||
843 | * latency. Therefore we restrict ourselves to not using more | ||
844 | * than one semaphore from each source, and not using a semaphore | ||
845 | * if we have detected the engine is saturated (i.e. would not be | ||
846 | * submitted early and cause bus traffic reading an already passed | ||
847 | * semaphore). | ||
848 | * | ||
849 | * See the are-we-too-late? check in __i915_request_submit(). | ||
850 | */ | ||
851 | return rq->sched.semaphores | rq->hw_context->saturated; | ||
852 | } | ||
853 | |||
854 | static int | ||
802 | emit_semaphore_wait(struct i915_request *to, | 855 | emit_semaphore_wait(struct i915_request *to, |
803 | struct i915_request *from, | 856 | struct i915_request *from, |
804 | gfp_t gfp) | 857 | gfp_t gfp) |
@@ -811,11 +864,15 @@ emit_semaphore_wait(struct i915_request *to, | |||
811 | GEM_BUG_ON(INTEL_GEN(to->i915) < 8); | 864 | GEM_BUG_ON(INTEL_GEN(to->i915) < 8); |
812 | 865 | ||
813 | /* Just emit the first semaphore we see as request space is limited. */ | 866 | /* Just emit the first semaphore we see as request space is limited. */ |
814 | if (to->sched.semaphores & from->engine->mask) | 867 | if (already_busywaiting(to) & from->engine->mask) |
815 | return i915_sw_fence_await_dma_fence(&to->submit, | 868 | return i915_sw_fence_await_dma_fence(&to->submit, |
816 | &from->fence, 0, | 869 | &from->fence, 0, |
817 | I915_FENCE_GFP); | 870 | I915_FENCE_GFP); |
818 | 871 | ||
872 | err = i915_request_await_start(to, from); | ||
873 | if (err < 0) | ||
874 | return err; | ||
875 | |||
819 | err = i915_sw_fence_await_dma_fence(&to->semaphore, | 876 | err = i915_sw_fence_await_dma_fence(&to->semaphore, |
820 | &from->fence, 0, | 877 | &from->fence, 0, |
821 | I915_FENCE_GFP); | 878 | I915_FENCE_GFP); |
diff --git a/drivers/gpu/drm/i915/intel_context.c b/drivers/gpu/drm/i915/intel_context.c index 8931e0fee873..924cc556223a 100644 --- a/drivers/gpu/drm/i915/intel_context.c +++ b/drivers/gpu/drm/i915/intel_context.c | |||
@@ -230,6 +230,7 @@ intel_context_init(struct intel_context *ce, | |||
230 | ce->gem_context = ctx; | 230 | ce->gem_context = ctx; |
231 | ce->engine = engine; | 231 | ce->engine = engine; |
232 | ce->ops = engine->cops; | 232 | ce->ops = engine->cops; |
233 | ce->saturated = 0; | ||
233 | 234 | ||
234 | INIT_LIST_HEAD(&ce->signal_link); | 235 | INIT_LIST_HEAD(&ce->signal_link); |
235 | INIT_LIST_HEAD(&ce->signals); | 236 | INIT_LIST_HEAD(&ce->signals); |
diff --git a/drivers/gpu/drm/i915/intel_context_types.h b/drivers/gpu/drm/i915/intel_context_types.h index 68b4ca1611e0..339c7437fe82 100644 --- a/drivers/gpu/drm/i915/intel_context_types.h +++ b/drivers/gpu/drm/i915/intel_context_types.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | 15 | ||
16 | #include "i915_active_types.h" | 16 | #include "i915_active_types.h" |
17 | #include "intel_engine_types.h" | ||
17 | 18 | ||
18 | struct i915_gem_context; | 19 | struct i915_gem_context; |
19 | struct i915_vma; | 20 | struct i915_vma; |
@@ -58,6 +59,8 @@ struct intel_context { | |||
58 | atomic_t pin_count; | 59 | atomic_t pin_count; |
59 | struct mutex pin_mutex; /* guards pinning and associated on-gpuing */ | 60 | struct mutex pin_mutex; /* guards pinning and associated on-gpuing */ |
60 | 61 | ||
62 | intel_engine_mask_t saturated; /* submitting semaphores too late? */ | ||
63 | |||
61 | /** | 64 | /** |
62 | * active_tracker: Active tracker for the external rq activity | 65 | * active_tracker: Active tracker for the external rq activity |
63 | * on this intel_context object. | 66 | * on this intel_context object. |