diff options
| -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. |
