]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/oa: Add val arg to xe_oa_is_valid_config_reg
authorAshutosh Dixit <ashutosh.dixit@intel.com>
Thu, 30 Apr 2026 16:14:58 +0000 (09:14 -0700)
committerAshutosh Dixit <ashutosh.dixit@intel.com>
Tue, 12 May 2026 21:34:42 +0000 (14:34 -0700)
Add val arg to xe_oa_is_valid_config_reg so that register values can also
be verified, in addition to register address. Value verification is needed
to implement MERTOA Wa_14026779378.

Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patch.msgid.link/20260430161459.2892545-4-ashutosh.dixit@intel.com
drivers/gpu/drm/xe/xe_oa.c

index 13458050907adb91e2751f33a1088f07682a46c8..7e1e8a86d19c0bc6132a41815f697e55c605e511 100644 (file)
@@ -2249,7 +2249,7 @@ static bool xe_oa_is_valid_mux_addr(struct xe_oa *oa, u32 addr)
                return xe_oa_reg_in_range_table(addr, gen12_oa_mux_regs);
 }
 
-static bool xe_oa_is_valid_config_reg_addr(struct xe_oa *oa, u32 addr)
+static bool xe_oa_is_valid_config_reg(struct xe_oa *oa, u32 addr, u32 val)
 {
        return xe_oa_is_valid_flex_addr(oa, addr) ||
                xe_oa_is_valid_b_counter_addr(oa, addr) ||
@@ -2257,7 +2257,7 @@ static bool xe_oa_is_valid_config_reg_addr(struct xe_oa *oa, u32 addr)
 }
 
 static struct xe_oa_reg *
-xe_oa_alloc_regs(struct xe_oa *oa, bool (*is_valid)(struct xe_oa *oa, u32 addr),
+xe_oa_alloc_regs(struct xe_oa *oa, bool (*is_valid)(struct xe_oa *oa, u32 addr, u32 val),
                 u32 __user *regs, u32 n_regs)
 {
        struct xe_oa_reg *oa_regs;
@@ -2275,16 +2275,16 @@ xe_oa_alloc_regs(struct xe_oa *oa, bool (*is_valid)(struct xe_oa *oa, u32 addr),
                if (err)
                        goto addr_err;
 
-               if (!is_valid(oa, addr)) {
-                       drm_dbg(&oa->xe->drm, "Invalid oa_reg address: %X\n", addr);
-                       err = -EINVAL;
-                       goto addr_err;
-               }
-
                err = get_user(value, regs + 1);
                if (err)
                        goto addr_err;
 
+               if (!is_valid(oa, addr, value)) {
+                       drm_dbg(&oa->xe->drm, "Invalid oa_reg addr/value: %#x %#x\n", addr, value);
+                       err = -EINVAL;
+                       goto addr_err;
+               }
+
                oa_regs[i].addr = XE_REG(addr);
                oa_regs[i].value = value;
 
@@ -2383,7 +2383,7 @@ int xe_oa_add_config_ioctl(struct drm_device *dev, u64 data, struct drm_file *fi
        memcpy(oa_config->uuid, arg->uuid, sizeof(arg->uuid));
 
        oa_config->regs_len = arg->n_regs;
-       regs = xe_oa_alloc_regs(oa, xe_oa_is_valid_config_reg_addr,
+       regs = xe_oa_alloc_regs(oa, xe_oa_is_valid_config_reg,
                                u64_to_user_ptr(arg->regs_ptr),
                                arg->n_regs);
        if (IS_ERR(regs)) {