]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
Merge tag 'drm-xe-next-2023-12-21-pr1-1' of https://gitlab.freedesktop.org/drm/xe...
[linux.git] / drivers / gpu / drm / amd / display / amdgpu_dm / amdgpu_dm_debugfs.c
index 13a177d3437625cde7975976a102c219d129b410..98b41ec7288e8979867680e624d4a961c8722b3f 100644 (file)
@@ -2971,6 +2971,104 @@ static int allow_edp_hotplug_detection_set(void *data, u64 val)
        return 0;
 }
 
+static int dmub_trace_mask_set(void *data, u64 val)
+{
+       struct amdgpu_device *adev = data;
+       struct dmub_srv *srv = adev->dm.dc->ctx->dmub_srv->dmub;
+       enum dmub_gpint_command cmd;
+       enum dmub_status status;
+       u64 mask = 0xffff;
+       u8 shift = 0;
+       u32 res;
+       int i;
+
+       if (!srv->fw_version)
+               return -EINVAL;
+
+       for (i = 0;  i < 4; i++) {
+               res = (val & mask) >> shift;
+
+               switch (i) {
+               case 0:
+                       cmd = DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD0;
+                       break;
+               case 1:
+                       cmd = DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD1;
+                       break;
+               case 2:
+                       cmd = DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD2;
+                       break;
+               case 3:
+                       cmd = DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD3;
+                       break;
+               }
+
+               status = dmub_srv_send_gpint_command(srv, cmd, res, 30);
+
+               if (status == DMUB_STATUS_TIMEOUT)
+                       return -ETIMEDOUT;
+               else if (status == DMUB_STATUS_INVALID)
+                       return -EINVAL;
+               else if (status != DMUB_STATUS_OK)
+                       return -EIO;
+
+               usleep_range(100, 1000);
+
+               mask <<= 16;
+               shift += 16;
+       }
+
+       return 0;
+}
+
+static int dmub_trace_mask_show(void *data, u64 *val)
+{
+       enum dmub_gpint_command cmd = DMUB_GPINT__GET_TRACE_BUFFER_MASK_WORD0;
+       struct amdgpu_device *adev = data;
+       struct dmub_srv *srv = adev->dm.dc->ctx->dmub_srv->dmub;
+       enum dmub_status status;
+       u8 shift = 0;
+       u64 raw = 0;
+       u64 res = 0;
+       int i = 0;
+
+       if (!srv->fw_version)
+               return -EINVAL;
+
+       while (i < 4) {
+               status = dmub_srv_send_gpint_command(srv, cmd, 0, 30);
+
+               if (status == DMUB_STATUS_OK) {
+                       status = dmub_srv_get_gpint_response(srv, (u32 *) &raw);
+
+                       if (status == DMUB_STATUS_INVALID)
+                               return -EINVAL;
+                       else if (status != DMUB_STATUS_OK)
+                               return -EIO;
+               } else if (status == DMUB_STATUS_TIMEOUT) {
+                       return -ETIMEDOUT;
+               } else if (status == DMUB_STATUS_INVALID) {
+                       return -EINVAL;
+               } else {
+                       return -EIO;
+               }
+
+               usleep_range(100, 1000);
+
+               cmd++;
+               res |= (raw << shift);
+               shift += 16;
+               i++;
+       }
+
+       *val = res;
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(dmub_trace_mask_fops, dmub_trace_mask_show,
+                        dmub_trace_mask_set, "0x%llx\n");
+
 /*
  * Set dmcub trace event IRQ enable or disable.
  * Usage to enable dmcub trace event IRQ: echo 1 > /sys/kernel/debug/dri/0/amdgpu_dm_dmcub_trace_event_en
@@ -3647,12 +3745,16 @@ static int capabilities_show(struct seq_file *m, void *unused)
        bool mall_supported = dc->caps.mall_size_total;
        bool subvp_supported = dc->caps.subvp_fw_processing_delay_us;
        unsigned int mall_in_use = false;
-       unsigned int subvp_in_use = dc->cap_funcs.get_subvp_en(dc, dc->current_state);
+       unsigned int subvp_in_use = false;
+
        struct hubbub *hubbub = dc->res_pool->hubbub;
 
        if (hubbub->funcs->get_mall_en)
                hubbub->funcs->get_mall_en(hubbub, &mall_in_use);
 
+       if (dc->cap_funcs.get_subvp_en)
+               subvp_in_use = dc->cap_funcs.get_subvp_en(dc, dc->current_state);
+
        seq_printf(m, "mall supported: %s, enabled: %s\n",
                           mall_supported ? "yes" : "no", mall_in_use ? "yes" : "no");
        seq_printf(m, "sub-viewport supported: %s, enabled: %s\n",
@@ -3880,6 +3982,9 @@ void dtn_debugfs_init(struct amdgpu_device *adev)
        debugfs_create_file_unsafe("amdgpu_dm_force_timing_sync", 0644, root,
                                   adev, &force_timing_sync_ops);
 
+       debugfs_create_file_unsafe("amdgpu_dm_dmub_trace_mask", 0644, root,
+                                  adev, &dmub_trace_mask_fops);
+
        debugfs_create_file_unsafe("amdgpu_dm_dmcub_trace_event_en", 0644, root,
                                   adev, &dmcub_trace_event_state_fops);
 
This page took 0.039042 seconds and 4 git commands to generate.