Merge tag 'drm-intel-gt-next-2023-12-15' of git://anongit.freedesktop.org/drm/drm...
authorDave Airlie <airlied@redhat.com>
Wed, 10 Jan 2024 01:35:58 +0000 (11:35 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 10 Jan 2024 01:36:47 +0000 (11:36 +1000)
Driver Changes:

- Eliminate use of kmap_atomic() in i915 (Zhao)
- Add Wa_14019877138 for DG2 (Haridhar)
- Static checker and spelling fixes (Colin, Karthik, Randy)

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ZXxCibZZQqlqhDN3@jlahtine-mobl.ger.corp.intel.com
14 files changed:
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
drivers/gpu/drm/i915/gem/i915_gem_object.c
drivers/gpu/drm/i915/gem/i915_gem_phys.c
drivers/gpu/drm/i915/gem/i915_gem_shmem.c
drivers/gpu/drm/i915/gem/selftests/huge_pages.c
drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
drivers/gpu/drm/i915/gt/intel_gt_regs.h
drivers/gpu/drm/i915/gt/intel_workarounds.c
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
drivers/gpu/drm/i915/i915_cmd_parser.c
drivers/gpu/drm/i915/i915_hwmon.c
include/uapi/drm/i915_drm.h

index 81a57dd52dfda48d31506c7295dbb1ad1868ea57..555022c0652c804d55efbfa94b2d0ca5f9f97225 100644 (file)
@@ -1159,7 +1159,7 @@ static void reloc_cache_unmap(struct reloc_cache *cache)
 
        vaddr = unmask_page(cache->vaddr);
        if (cache->vaddr & KMAP)
-               kunmap_atomic(vaddr);
+               kunmap_local(vaddr);
        else
                io_mapping_unmap_atomic((void __iomem *)vaddr);
 }
@@ -1175,7 +1175,7 @@ static void reloc_cache_remap(struct reloc_cache *cache,
        if (cache->vaddr & KMAP) {
                struct page *page = i915_gem_object_get_page(obj, cache->page);
 
-               vaddr = kmap_atomic(page);
+               vaddr = kmap_local_page(page);
                cache->vaddr = unmask_flags(cache->vaddr) |
                        (unsigned long)vaddr;
        } else {
@@ -1205,7 +1205,7 @@ static void reloc_cache_reset(struct reloc_cache *cache, struct i915_execbuffer
                if (cache->vaddr & CLFLUSH_AFTER)
                        mb();
 
-               kunmap_atomic(vaddr);
+               kunmap_local(vaddr);
                i915_gem_object_finish_access(obj);
        } else {
                struct i915_ggtt *ggtt = cache_to_ggtt(cache);
@@ -1237,7 +1237,7 @@ static void *reloc_kmap(struct drm_i915_gem_object *obj,
        struct page *page;
 
        if (cache->vaddr) {
-               kunmap_atomic(unmask_page(cache->vaddr));
+               kunmap_local(unmask_page(cache->vaddr));
        } else {
                unsigned int flushes;
                int err;
@@ -1259,7 +1259,7 @@ static void *reloc_kmap(struct drm_i915_gem_object *obj,
        if (!obj->mm.dirty)
                set_page_dirty(page);
 
-       vaddr = kmap_atomic(page);
+       vaddr = kmap_local_page(page);
        cache->vaddr = unmask_flags(cache->vaddr) | (unsigned long)vaddr;
        cache->page = pageno;
 
index 25eeeb863209eece6a3123ba45f3a1c605f4bb78..58e6c680fe0df6f7ee6223eef68cf67c5eaf0b4e 100644 (file)
@@ -500,17 +500,15 @@ static void
 i915_gem_object_read_from_page_kmap(struct drm_i915_gem_object *obj, u64 offset, void *dst, int size)
 {
        pgoff_t idx = offset >> PAGE_SHIFT;
-       void *src_map;
        void *src_ptr;
 
-       src_map = kmap_atomic(i915_gem_object_get_page(obj, idx));
-
-       src_ptr = src_map + offset_in_page(offset);
+       src_ptr = kmap_local_page(i915_gem_object_get_page(obj, idx))
+                 + offset_in_page(offset);
        if (!(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ))
                drm_clflush_virt_range(src_ptr, size);
        memcpy(dst, src_ptr, size);
 
-       kunmap_atomic(src_map);
+       kunmap_local(src_ptr);
 }
 
 static void
index 5df128e2f4dc2082962818da89ab9d0816623057..ef85c6dc9fd592f9db1fec8e99e24974f3dc7029 100644 (file)
@@ -65,16 +65,13 @@ static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
        dst = vaddr;
        for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
                struct page *page;
-               void *src;
 
                page = shmem_read_mapping_page(mapping, i);
                if (IS_ERR(page))
                        goto err_st;
 
-               src = kmap_atomic(page);
-               memcpy(dst, src, PAGE_SIZE);
+               memcpy_from_page(dst, page, 0, PAGE_SIZE);
                drm_clflush_virt_range(dst, PAGE_SIZE);
-               kunmap_atomic(src);
 
                put_page(page);
                dst += PAGE_SIZE;
@@ -113,16 +110,13 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
 
                for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
                        struct page *page;
-                       char *dst;
 
                        page = shmem_read_mapping_page(mapping, i);
                        if (IS_ERR(page))
                                continue;
 
-                       dst = kmap_atomic(page);
                        drm_clflush_virt_range(src, PAGE_SIZE);
-                       memcpy(dst, src, PAGE_SIZE);
-                       kunmap_atomic(dst);
+                       memcpy_to_page(page, 0, src, PAGE_SIZE);
 
                        set_page_dirty(page);
                        if (obj->mm.madv == I915_MADV_WILLNEED)
index 73a4a4eb29e08689fdac30acd3a88739f3205a12..38b72d86560f0547a2c6cdcbe1ff531d56fda475 100644 (file)
@@ -485,11 +485,13 @@ shmem_pwrite(struct drm_i915_gem_object *obj,
                if (err < 0)
                        return err;
 
-               vaddr = kmap_atomic(page);
+               vaddr = kmap_local_page(page);
+               pagefault_disable();
                unwritten = __copy_from_user_inatomic(vaddr + pg,
                                                      user_data,
                                                      len);
-               kunmap_atomic(vaddr);
+               pagefault_enable();
+               kunmap_local(vaddr);
 
                err = aops->write_end(obj->base.filp, mapping, offset, len,
                                      len - unwritten, page, data);
index 6b9f6cf50bf6b24b9bb5804b123db70adeb206d8..c9e6d77abab075e490ee434e0a50c3e9235b1400 100644 (file)
@@ -1082,7 +1082,7 @@ __cpu_check_shmem(struct drm_i915_gem_object *obj, u32 dword, u32 val)
                goto err_unlock;
 
        for (n = 0; n < obj->base.size >> PAGE_SHIFT; ++n) {
-               u32 *ptr = kmap_atomic(i915_gem_object_get_page(obj, n));
+               u32 *ptr = kmap_local_page(i915_gem_object_get_page(obj, n));
 
                if (needs_flush & CLFLUSH_BEFORE)
                        drm_clflush_virt_range(ptr, PAGE_SIZE);
@@ -1090,12 +1090,12 @@ __cpu_check_shmem(struct drm_i915_gem_object *obj, u32 dword, u32 val)
                if (ptr[dword] != val) {
                        pr_err("n=%lu ptr[%u]=%u, val=%u\n",
                               n, dword, ptr[dword], val);
-                       kunmap_atomic(ptr);
+                       kunmap_local(ptr);
                        err = -EINVAL;
                        break;
                }
 
-               kunmap_atomic(ptr);
+               kunmap_local(ptr);
        }
 
        i915_gem_object_finish_access(obj);
index 3fd68a099a85efc37d4842abe344c5d0e3893f11..2a0c0634d446ed0b59871374d25104c06214dc87 100644 (file)
@@ -24,7 +24,6 @@ static int cpu_set(struct context *ctx, unsigned long offset, u32 v)
 {
        unsigned int needs_clflush;
        struct page *page;
-       void *map;
        u32 *cpu;
        int err;
 
@@ -34,8 +33,7 @@ static int cpu_set(struct context *ctx, unsigned long offset, u32 v)
                goto out;
 
        page = i915_gem_object_get_page(ctx->obj, offset >> PAGE_SHIFT);
-       map = kmap_atomic(page);
-       cpu = map + offset_in_page(offset);
+       cpu = kmap_local_page(page) + offset_in_page(offset);
 
        if (needs_clflush & CLFLUSH_BEFORE)
                drm_clflush_virt_range(cpu, sizeof(*cpu));
@@ -45,7 +43,7 @@ static int cpu_set(struct context *ctx, unsigned long offset, u32 v)
        if (needs_clflush & CLFLUSH_AFTER)
                drm_clflush_virt_range(cpu, sizeof(*cpu));
 
-       kunmap_atomic(map);
+       kunmap_local(cpu);
        i915_gem_object_finish_access(ctx->obj);
 
 out:
@@ -57,7 +55,6 @@ static int cpu_get(struct context *ctx, unsigned long offset, u32 *v)
 {
        unsigned int needs_clflush;
        struct page *page;
-       void *map;
        u32 *cpu;
        int err;
 
@@ -67,15 +64,14 @@ static int cpu_get(struct context *ctx, unsigned long offset, u32 *v)
                goto out;
 
        page = i915_gem_object_get_page(ctx->obj, offset >> PAGE_SHIFT);
-       map = kmap_atomic(page);
-       cpu = map + offset_in_page(offset);
+       cpu = kmap_local_page(page) + offset_in_page(offset);
 
        if (needs_clflush & CLFLUSH_BEFORE)
                drm_clflush_virt_range(cpu, sizeof(*cpu));
 
        *v = *cpu;
 
-       kunmap_atomic(map);
+       kunmap_local(cpu);
        i915_gem_object_finish_access(ctx->obj);
 
 out:
index 7021b6e9b219ef3502af7beaa3770a5a9a251409..89d4dc8b60c6a28fc82c8ce0e2554c0a0e537e81 100644 (file)
@@ -489,12 +489,12 @@ static int cpu_fill(struct drm_i915_gem_object *obj, u32 value)
        for (n = 0; n < real_page_count(obj); n++) {
                u32 *map;
 
-               map = kmap_atomic(i915_gem_object_get_page(obj, n));
+               map = kmap_local_page(i915_gem_object_get_page(obj, n));
                for (m = 0; m < DW_PER_PAGE; m++)
                        map[m] = value;
                if (!has_llc)
                        drm_clflush_virt_range(map, PAGE_SIZE);
-               kunmap_atomic(map);
+               kunmap_local(map);
        }
 
        i915_gem_object_finish_access(obj);
@@ -520,7 +520,7 @@ static noinline int cpu_check(struct drm_i915_gem_object *obj,
        for (n = 0; n < real_page_count(obj); n++) {
                u32 *map, m;
 
-               map = kmap_atomic(i915_gem_object_get_page(obj, n));
+               map = kmap_local_page(i915_gem_object_get_page(obj, n));
                if (needs_flush & CLFLUSH_BEFORE)
                        drm_clflush_virt_range(map, PAGE_SIZE);
 
@@ -546,7 +546,7 @@ static noinline int cpu_check(struct drm_i915_gem_object *obj,
                }
 
 out_unmap:
-               kunmap_atomic(map);
+               kunmap_local(map);
                if (err)
                        break;
        }
index e57f9390076c5567abcafa9810e15626d6f8a033..d684a70f2c0422554353eb5ca88a01fc1104b29c 100644 (file)
@@ -504,7 +504,7 @@ static int igt_dmabuf_export_vmap(void *arg)
        }
 
        if (memchr_inv(ptr, 0, dmabuf->size)) {
-               pr_err("Exported object not initialiased to zero!\n");
+               pr_err("Exported object not initialised to zero!\n");
                err = -EINVAL;
                goto out;
        }
index 9de41703fae58c3df763347f514c89fc62972c70..50962cfd1353ae4673b27a9bb2437d47633b5651 100644 (file)
 #define XEHP_PSS_MODE2                         MCR_REG(0x703c)
 #define   SCOREBOARD_STALL_FLUSH_CONTROL       REG_BIT(5)
 
+#define XEHP_PSS_CHICKEN                       MCR_REG(0x7044)
+#define   FD_END_COLLECT                       REG_BIT(5)
+
 #define GEN7_SC_INSTDONE                       _MMIO(0x7100)
 #define GEN12_SC_INSTDONE_EXTRA                        _MMIO(0x7104)
 #define GEN12_SC_INSTDONE_EXTRA2               _MMIO(0x7108)
index 4cbf9e51264599433b971b09c46aee43ba9e67fb..3eacbc50caf8d98fd92f45640cf64a5d106c9052 100644 (file)
@@ -777,6 +777,9 @@ static void dg2_ctx_workarounds_init(struct intel_engine_cs *engine,
 
        /* Wa_18019271663:dg2 */
        wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
+
+       /* Wa_14019877138:dg2 */
+       wa_mcr_masked_en(wal, XEHP_PSS_CHICKEN, FD_END_COLLECT);
 }
 
 static void xelpg_ctx_gt_tuning_init(struct intel_engine_cs *engine,
index 362639162ed60340383188e42031d22acb8ef28d..756093eaf2ad186e1962271cc176e58cf4e54d69 100644 (file)
@@ -1343,16 +1343,13 @@ size_t intel_uc_fw_copy_rsa(struct intel_uc_fw *uc_fw, void *dst, u32 max_len)
 
                for_each_sgt_page(page, iter, uc_fw->obj->mm.pages) {
                        u32 len = min_t(u32, size, PAGE_SIZE - offset);
-                       void *vaddr;
 
                        if (idx > 0) {
                                idx--;
                                continue;
                        }
 
-                       vaddr = kmap_atomic(page);
-                       memcpy(dst, vaddr + offset, len);
-                       kunmap_atomic(vaddr);
+                       memcpy_from_page(dst, page, offset, len);
 
                        offset = 0;
                        dst += len;
index ddf49c2dbb917c5dc650dfd88f409727760e4ba0..2905df83e180ed91eddbde3c30dafba4e0fb2991 100644 (file)
@@ -1211,11 +1211,11 @@ static u32 *copy_batch(struct drm_i915_gem_object *dst_obj,
                for (n = offset >> PAGE_SHIFT; remain; n++) {
                        int len = min(remain, PAGE_SIZE - x);
 
-                       src = kmap_atomic(i915_gem_object_get_page(src_obj, n));
+                       src = kmap_local_page(i915_gem_object_get_page(src_obj, n));
                        if (src_needs_clflush)
                                drm_clflush_virt_range(src + x, len);
                        memcpy(ptr, src + x, len);
-                       kunmap_atomic(src);
+                       kunmap_local(src);
 
                        ptr += len;
                        remain -= len;
index 975da8e7f2a9f8138c80b03c731ce03856ef7a89..8c3f443c8347e06f5f09700108f4a11c1e903f3b 100644 (file)
@@ -175,7 +175,7 @@ hwm_power1_max_interval_show(struct device *dev, struct device_attribute *attr,
         *     tau4 = (4 | x) << y
         * but add 2 when doing the final right shift to account for units
         */
-       tau4 = ((1 << x_w) | x) << y;
+       tau4 = (u64)((1 << x_w) | x) << y;
        /* val in hwmon interface units (millisec) */
        out = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w);
 
@@ -211,7 +211,7 @@ hwm_power1_max_interval_store(struct device *dev,
        r = FIELD_PREP(PKG_MAX_WIN, PKG_MAX_WIN_DEFAULT);
        x = REG_FIELD_GET(PKG_MAX_WIN_X, r);
        y = REG_FIELD_GET(PKG_MAX_WIN_Y, r);
-       tau4 = ((1 << x_w) | x) << y;
+       tau4 = (u64)((1 << x_w) | x) << y;
        max_win = mul_u64_u32_shr(tau4, SF_TIME, hwmon->scl_shift_time + x_w);
 
        if (val > max_win)
index 218edb0a96f8c043df13a5bf25f85ec754ee449a..fd4f9574d177a269b2cdbe5a36b3b30f2addbc94 100644 (file)
@@ -693,7 +693,7 @@ typedef struct drm_i915_irq_wait {
 #define I915_PARAM_HAS_EXEC_FENCE       44
 
 /* Query whether DRM_I915_GEM_EXECBUFFER2 supports the ability to capture
- * user specified bufffers for post-mortem debugging of GPU hangs. See
+ * user-specified buffers for post-mortem debugging of GPU hangs. See
  * EXEC_OBJECT_CAPTURE.
  */
 #define I915_PARAM_HAS_EXEC_CAPTURE     45
@@ -1606,7 +1606,7 @@ struct drm_i915_gem_busy {
         * is accurate.
         *
         * The returned dword is split into two fields to indicate both
-        * the engine classess on which the object is being read, and the
+        * the engine classes on which the object is being read, and the
         * engine class on which it is currently being written (if any).
         *
         * The low word (bits 0:15) indicate if the object is being written
@@ -1815,7 +1815,7 @@ struct drm_i915_gem_madvise {
        __u32 handle;
 
        /* Advice: either the buffer will be needed again in the near future,
-        *         or wont be and could be discarded under memory pressure.
+        *         or won't be and could be discarded under memory pressure.
         */
        __u32 madv;
 
@@ -3246,7 +3246,7 @@ struct drm_i915_query_topology_info {
  *     // enough to hold our array of engines. The kernel will fill out the
  *     // item.length for us, which is the number of bytes we need.
  *     //
- *     // Alternatively a large buffer can be allocated straight away enabling
+ *     // Alternatively a large buffer can be allocated straightaway enabling
  *     // querying in one pass, in which case item.length should contain the
  *     // length of the provided buffer.
  *     err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
@@ -3256,7 +3256,7 @@ struct drm_i915_query_topology_info {
  *     // Now that we allocated the required number of bytes, we call the ioctl
  *     // again, this time with the data_ptr pointing to our newly allocated
  *     // blob, which the kernel can then populate with info on all engines.
- *     item.data_ptr = (uintptr_t)&info,
+ *     item.data_ptr = (uintptr_t)&info;
  *
  *     err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
  *     if (err) ...
@@ -3286,7 +3286,7 @@ struct drm_i915_query_topology_info {
 /**
  * struct drm_i915_engine_info
  *
- * Describes one engine and it's capabilities as known to the driver.
+ * Describes one engine and its capabilities as known to the driver.
  */
 struct drm_i915_engine_info {
        /** @engine: Engine class and instance. */