if (adev->enforce_isolation[i] && !partition_values[i]) {
                        /* Going from enabled to disabled */
                        amdgpu_vmid_free_reserved(adev, AMDGPU_GFXHUB(i));
+                       amdgpu_mes_set_enforce_isolation(adev, i, false);
                } else if (!adev->enforce_isolation[i] && partition_values[i]) {
                        /* Going from disabled to enabled */
                        amdgpu_vmid_alloc_reserved(adev, AMDGPU_GFXHUB(i));
+                       amdgpu_mes_set_enforce_isolation(adev, i, true);
                }
                adev->enforce_isolation[i] = partition_values[i];
        }
 
        return is_supported;
 }
 
+/* Fix me -- node_id is used to identify the correct MES instances in the future */
+int amdgpu_mes_set_enforce_isolation(struct amdgpu_device *adev, uint32_t node_id, bool enable)
+{
+       struct mes_misc_op_input op_input = {0};
+       int r;
+
+       op_input.op = MES_MISC_OP_CHANGE_CONFIG;
+       op_input.change_config.option.limit_single_process = enable ? 1 : 0;
+
+       if (!adev->mes.funcs->misc_op) {
+               dev_err(adev->dev, "mes change config is not supported!\n");
+               r = -EINVAL;
+               goto error;
+       }
+
+       r = adev->mes.funcs->misc_op(&adev->mes, &op_input);
+       if (r)
+               dev_err(adev->dev, "failed to change_config.\n");
+
+error:
+       return r;
+}
+
 #if defined(CONFIG_DEBUG_FS)
 
 static int amdgpu_debugfs_mes_event_log_show(struct seq_file *m, void *unused)
 
        MES_MISC_OP_WRM_REG_WAIT,
        MES_MISC_OP_WRM_REG_WR_WAIT,
        MES_MISC_OP_SET_SHADER_DEBUGGER,
+       MES_MISC_OP_CHANGE_CONFIG,
 };
 
 struct mes_misc_op_input {
                        uint32_t tcp_watch_cntl[4];
                        uint32_t trap_en;
                } set_shader_debugger;
+
+               struct {
+                       union {
+                               struct {
+                                       uint32_t limit_single_process : 1;
+                                       uint32_t enable_hws_logging_buffer : 1;
+                                       uint32_t reserved : 30;
+                               };
+                               uint32_t all;
+                       } option;
+                       struct {
+                               uint32_t tdr_level;
+                               uint32_t tdr_delay;
+                       } tdr_config;
+               } change_config;
        };
 };
 
 }
 
 bool amdgpu_mes_suspend_resume_all_supported(struct amdgpu_device *adev);
+
+int amdgpu_mes_set_enforce_isolation(struct amdgpu_device *adev, uint32_t node_id, bool enable);
+
 #endif /* __AMDGPU_MES_H__ */
 
                                sizeof(misc_pkt.set_shader_debugger.tcp_watch_cntl));
                misc_pkt.set_shader_debugger.trap_en = input->set_shader_debugger.trap_en;
                break;
+       case MES_MISC_OP_CHANGE_CONFIG:
+               if ((mes->adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) < 0x63) {
+                       dev_err(mes->adev->dev, "MES FW versoin must be larger than 0x63 to support limit single process feature.\n");
+                       return -EINVAL;
+               }
+               misc_pkt.opcode = MESAPI_MISC__CHANGE_CONFIG;
+               misc_pkt.change_config.opcode =
+                               MESAPI_MISC__CHANGE_CONFIG_OPTION_LIMIT_SINGLE_PROCESS;
+               misc_pkt.change_config.option.bits.limit_single_process =
+                               input->change_config.option.limit_single_process;
+               break;
+
        default:
                DRM_ERROR("unsupported misc op (%d) \n", input->op);
                return -EINVAL;
                                        mes->event_log_gpu_addr;
        }
 
+       if (enforce_isolation)
+               mes_set_hw_res_pkt.limit_single_process = 1;
+
        return mes_v11_0_submit_pkt_and_poll_completion(mes,
                        &mes_set_hw_res_pkt, sizeof(mes_set_hw_res_pkt),
                        offsetof(union MESAPI_SET_HW_RESOURCES, api_status));
 
                                sizeof(misc_pkt.set_shader_debugger.tcp_watch_cntl));
                misc_pkt.set_shader_debugger.trap_en = input->set_shader_debugger.trap_en;
                break;
+       case MES_MISC_OP_CHANGE_CONFIG:
+               misc_pkt.opcode = MESAPI_MISC__CHANGE_CONFIG;
+               misc_pkt.change_config.opcode =
+                               MESAPI_MISC__CHANGE_CONFIG_OPTION_LIMIT_SINGLE_PROCESS;
+               misc_pkt.change_config.option.bits.limit_single_process =
+                               input->change_config.option.limit_single_process;
+               break;
+
        default:
                DRM_ERROR("unsupported misc op (%d) \n", input->op);
                return -EINVAL;
                mes_set_hw_res_pkt.event_intr_history_gpu_mc_ptr = mes->event_log_gpu_addr + pipe * AMDGPU_MES_LOG_BUFFER_SIZE;
        }
 
+       if (enforce_isolation)
+               mes_set_hw_res_pkt.limit_single_process = 1;
+
        return mes_v12_0_submit_pkt_and_poll_completion(mes, pipe,
                        &mes_set_hw_res_pkt, sizeof(mes_set_hw_res_pkt),
                        offsetof(union MESAPI_SET_HW_RESOURCES, api_status));