Merge branch 'exec-update-lock-for-v5.11' of git://git.kernel.org/pub/scm/linux/kerne...
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / df_v3_6.c
index 7b89fd2..6b4b30a 100644 (file)
 #define DF_3_6_SMN_REG_INST_DIST        0x8
 #define DF_3_6_INST_CNT                 8
 
-static u32 df_v3_6_channel_number[] = {1, 2, 0, 4, 0, 8, 0,
-                                      16, 32, 0, 0, 0, 2, 4, 8};
-
-/* init df format attrs */
-AMDGPU_PMU_ATTR(event,         "config:0-7");
-AMDGPU_PMU_ATTR(instance,      "config:8-15");
-AMDGPU_PMU_ATTR(umask,         "config:16-23");
-
-/* df format attributes  */
-static struct attribute *df_v3_6_format_attrs[] = {
-       &pmu_attr_event.attr,
-       &pmu_attr_instance.attr,
-       &pmu_attr_umask.attr,
-       NULL
-};
-
-/* df format attribute group */
-static struct attribute_group df_v3_6_format_attr_group = {
-       .name = "format",
-       .attrs = df_v3_6_format_attrs,
-};
-
-/* df event attrs */
-AMDGPU_PMU_ATTR(cake0_pcsout_txdata,
-                     "event=0x7,instance=0x46,umask=0x2");
-AMDGPU_PMU_ATTR(cake1_pcsout_txdata,
-                     "event=0x7,instance=0x47,umask=0x2");
-AMDGPU_PMU_ATTR(cake0_pcsout_txmeta,
-                     "event=0x7,instance=0x46,umask=0x4");
-AMDGPU_PMU_ATTR(cake1_pcsout_txmeta,
-                     "event=0x7,instance=0x47,umask=0x4");
-AMDGPU_PMU_ATTR(cake0_ftiinstat_reqalloc,
-                     "event=0xb,instance=0x46,umask=0x4");
-AMDGPU_PMU_ATTR(cake1_ftiinstat_reqalloc,
-                     "event=0xb,instance=0x47,umask=0x4");
-AMDGPU_PMU_ATTR(cake0_ftiinstat_rspalloc,
-                     "event=0xb,instance=0x46,umask=0x8");
-AMDGPU_PMU_ATTR(cake1_ftiinstat_rspalloc,
-                     "event=0xb,instance=0x47,umask=0x8");
-
-/* df event attributes  */
-static struct attribute *df_v3_6_event_attrs[] = {
-       &pmu_attr_cake0_pcsout_txdata.attr,
-       &pmu_attr_cake1_pcsout_txdata.attr,
-       &pmu_attr_cake0_pcsout_txmeta.attr,
-       &pmu_attr_cake1_pcsout_txmeta.attr,
-       &pmu_attr_cake0_ftiinstat_reqalloc.attr,
-       &pmu_attr_cake1_ftiinstat_reqalloc.attr,
-       &pmu_attr_cake0_ftiinstat_rspalloc.attr,
-       &pmu_attr_cake1_ftiinstat_rspalloc.attr,
-       NULL
-};
+/* Defined in global_features.h as FTI_PERFMON_VISIBLE */
+#define DF_V3_6_MAX_COUNTERS           4
 
-/* df event attribute group */
-static struct attribute_group df_v3_6_event_attr_group = {
-       .name = "events",
-       .attrs = df_v3_6_event_attrs
-};
+/* get flags from df perfmon config */
+#define DF_V3_6_GET_EVENT(x)           (x & 0xFFUL)
+#define DF_V3_6_GET_INSTANCE(x)                ((x >> 8) & 0xFFUL)
+#define DF_V3_6_GET_UNITMASK(x)                ((x >> 16) & 0xFFUL)
+#define DF_V3_6_PERFMON_OVERFLOW       0xFFFFFFFFFFFFULL
 
-/* df event attr groups  */
-const struct attribute_group *df_v3_6_attr_groups[] = {
-               &df_v3_6_format_attr_group,
-               &df_v3_6_event_attr_group,
-               NULL
-};
+static u32 df_v3_6_channel_number[] = {1, 2, 0, 4, 0, 8, 0,
+                                      16, 32, 0, 0, 0, 2, 4, 8};
 
 static uint64_t df_v3_6_get_fica(struct amdgpu_device *adev,
                                 uint32_t ficaa_val)
@@ -391,33 +337,28 @@ static void df_v3_6_get_clockgating_state(struct amdgpu_device *adev,
 }
 
 /* get assigned df perfmon ctr as int */
-static int df_v3_6_pmc_config_2_cntr(struct amdgpu_device *adev,
-                                     uint64_t config)
+static bool df_v3_6_pmc_has_counter(struct amdgpu_device *adev,
+                                     uint64_t config,
+                                     int counter_idx)
 {
-       int i;
 
-       for (i = 0; i < DF_V3_6_MAX_COUNTERS; i++) {
-               if ((config & 0x0FFFFFFUL) ==
-                                       adev->df_perfmon_config_assign_mask[i])
-                       return i;
-       }
+       return ((config & 0x0FFFFFFUL) ==
+                       adev->df_perfmon_config_assign_mask[counter_idx]);
 
-       return -EINVAL;
 }
 
 /* get address based on counter assignment */
 static void df_v3_6_pmc_get_addr(struct amdgpu_device *adev,
                                 uint64_t config,
+                                int counter_idx,
                                 int is_ctrl,
                                 uint32_t *lo_base_addr,
                                 uint32_t *hi_base_addr)
 {
-       int target_cntr = df_v3_6_pmc_config_2_cntr(adev, config);
-
-       if (target_cntr < 0)
+       if (!df_v3_6_pmc_has_counter(adev, config, counter_idx))
                return;
 
-       switch (target_cntr) {
+       switch (counter_idx) {
 
        case 0:
                *lo_base_addr = is_ctrl ? smnPerfMonCtlLo4 : smnPerfMonCtrLo4;
@@ -443,15 +384,18 @@ static void df_v3_6_pmc_get_addr(struct amdgpu_device *adev,
 /* get read counter address */
 static void df_v3_6_pmc_get_read_settings(struct amdgpu_device *adev,
                                          uint64_t config,
+                                         int counter_idx,
                                          uint32_t *lo_base_addr,
                                          uint32_t *hi_base_addr)
 {
-       df_v3_6_pmc_get_addr(adev, config, 0, lo_base_addr, hi_base_addr);
+       df_v3_6_pmc_get_addr(adev, config, counter_idx, 0, lo_base_addr,
+                                                               hi_base_addr);
 }
 
 /* get control counter settings i.e. address and values to set */
 static int df_v3_6_pmc_get_ctrl_settings(struct amdgpu_device *adev,
                                          uint64_t config,
+                                         int counter_idx,
                                          uint32_t *lo_base_addr,
                                          uint32_t *hi_base_addr,
                                          uint32_t *lo_val,
@@ -462,7 +406,8 @@ static int df_v3_6_pmc_get_ctrl_settings(struct amdgpu_device *adev,
        uint32_t eventsel, instance, unitmask;
        uint32_t instance_10, instance_5432, instance_76;
 
-       df_v3_6_pmc_get_addr(adev, config, 1, lo_base_addr, hi_base_addr);
+       df_v3_6_pmc_get_addr(adev, config, counter_idx, 1, lo_base_addr,
+                               hi_base_addr);
 
        if ((*lo_base_addr == 0) || (*hi_base_addr == 0)) {
                DRM_ERROR("[DF PMC] addressing not retrieved! Lo: %x, Hi: %x",
@@ -492,18 +437,13 @@ static int df_v3_6_pmc_get_ctrl_settings(struct amdgpu_device *adev,
 static int df_v3_6_pmc_add_cntr(struct amdgpu_device *adev,
                                   uint64_t config)
 {
-       int i, target_cntr;
-
-       target_cntr = df_v3_6_pmc_config_2_cntr(adev, config);
-
-       if (target_cntr >= 0)
-               return 0;
+       int i;
 
        for (i = 0; i < DF_V3_6_MAX_COUNTERS; i++) {
                if (adev->df_perfmon_config_assign_mask[i] == 0U) {
                        adev->df_perfmon_config_assign_mask[i] =
                                                        config & 0x0FFFFFFUL;
-                       return 0;
+                       return i;
                }
        }
 
@@ -512,59 +452,50 @@ static int df_v3_6_pmc_add_cntr(struct amdgpu_device *adev,
 
 #define DEFERRED_ARM_MASK      (1 << 31)
 static int df_v3_6_pmc_set_deferred(struct amdgpu_device *adev,
-                                   uint64_t config, bool is_deferred)
+                                   int counter_idx, uint64_t config,
+                                   bool is_deferred)
 {
-       int target_cntr;
 
-       target_cntr = df_v3_6_pmc_config_2_cntr(adev, config);
-
-       if (target_cntr < 0)
+       if (!df_v3_6_pmc_has_counter(adev, config, counter_idx))
                return -EINVAL;
 
        if (is_deferred)
-               adev->df_perfmon_config_assign_mask[target_cntr] |=
+               adev->df_perfmon_config_assign_mask[counter_idx] |=
                                                        DEFERRED_ARM_MASK;
        else
-               adev->df_perfmon_config_assign_mask[target_cntr] &=
+               adev->df_perfmon_config_assign_mask[counter_idx] &=
                                                        ~DEFERRED_ARM_MASK;
 
        return 0;
 }
 
 static bool df_v3_6_pmc_is_deferred(struct amdgpu_device *adev,
+                                   int counter_idx,
                                    uint64_t config)
 {
-       int target_cntr;
-
-       target_cntr = df_v3_6_pmc_config_2_cntr(adev, config);
-
-       /*
-        * we never get target_cntr < 0 since this funciton is only called in
-        * pmc_count for now but we should check anyways.
-        */
-       return (target_cntr >= 0 &&
-                       (adev->df_perfmon_config_assign_mask[target_cntr]
-                       & DEFERRED_ARM_MASK));
+       return  (df_v3_6_pmc_has_counter(adev, config, counter_idx) &&
+                       (adev->df_perfmon_config_assign_mask[counter_idx]
+                               & DEFERRED_ARM_MASK));
 
 }
 
 /* release performance counter */
 static void df_v3_6_pmc_release_cntr(struct amdgpu_device *adev,
-                                    uint64_t config)
+                                    uint64_t config,
+                                    int counter_idx)
 {
-       int target_cntr = df_v3_6_pmc_config_2_cntr(adev, config);
-
-       if (target_cntr >= 0)
-               adev->df_perfmon_config_assign_mask[target_cntr] = 0ULL;
+       if (df_v3_6_pmc_has_counter(adev, config, counter_idx))
+               adev->df_perfmon_config_assign_mask[counter_idx] = 0ULL;
 }
 
 
 static void df_v3_6_reset_perfmon_cntr(struct amdgpu_device *adev,
-                                        uint64_t config)
+                                        uint64_t config,
+                                        int counter_idx)
 {
        uint32_t lo_base_addr = 0, hi_base_addr = 0;
 
-       df_v3_6_pmc_get_read_settings(adev, config, &lo_base_addr,
+       df_v3_6_pmc_get_read_settings(adev, config, counter_idx, &lo_base_addr,
                                      &hi_base_addr);
 
        if ((lo_base_addr == 0) || (hi_base_addr == 0))
@@ -573,21 +504,22 @@ static void df_v3_6_reset_perfmon_cntr(struct amdgpu_device *adev,
        df_v3_6_perfmon_wreg(adev, lo_base_addr, 0, hi_base_addr, 0);
 }
 
+/* return available counter if is_add == 1 otherwise return error status. */
 static int df_v3_6_pmc_start(struct amdgpu_device *adev, uint64_t config,
-                            int is_add)
+                            int counter_idx, int is_add)
 {
        uint32_t lo_base_addr, hi_base_addr, lo_val, hi_val;
        int err = 0, ret = 0;
 
        switch (adev->asic_type) {
        case CHIP_VEGA20:
+       case CHIP_ARCTURUS:
                if (is_add)
                        return df_v3_6_pmc_add_cntr(adev, config);
 
-               df_v3_6_reset_perfmon_cntr(adev, config);
-
                ret = df_v3_6_pmc_get_ctrl_settings(adev,
                                        config,
+                                       counter_idx,
                                        &lo_base_addr,
                                        &hi_base_addr,
                                        &lo_val,
@@ -604,7 +536,8 @@ static int df_v3_6_pmc_start(struct amdgpu_device *adev, uint64_t config,
                                                     hi_val);
 
                if (err)
-                       ret = df_v3_6_pmc_set_deferred(adev, config, true);
+                       ret = df_v3_6_pmc_set_deferred(adev, config,
+                                                       counter_idx, true);
 
                break;
        default:
@@ -615,15 +548,17 @@ static int df_v3_6_pmc_start(struct amdgpu_device *adev, uint64_t config,
 }
 
 static int df_v3_6_pmc_stop(struct amdgpu_device *adev, uint64_t config,
-                           int is_remove)
+                           int counter_idx, int is_remove)
 {
        uint32_t lo_base_addr, hi_base_addr, lo_val, hi_val;
        int ret = 0;
 
        switch (adev->asic_type) {
        case CHIP_VEGA20:
+       case CHIP_ARCTURUS:
                ret = df_v3_6_pmc_get_ctrl_settings(adev,
                        config,
+                       counter_idx,
                        &lo_base_addr,
                        &hi_base_addr,
                        &lo_val,
@@ -635,8 +570,8 @@ static int df_v3_6_pmc_stop(struct amdgpu_device *adev, uint64_t config,
 
 
                if (is_remove) {
-                       df_v3_6_reset_perfmon_cntr(adev, config);
-                       df_v3_6_pmc_release_cntr(adev, config);
+                       df_v3_6_reset_perfmon_cntr(adev, config, counter_idx);
+                       df_v3_6_pmc_release_cntr(adev, config, counter_idx);
                }
 
                break;
@@ -649,6 +584,7 @@ static int df_v3_6_pmc_stop(struct amdgpu_device *adev, uint64_t config,
 
 static void df_v3_6_pmc_get_count(struct amdgpu_device *adev,
                                  uint64_t config,
+                                 int counter_idx,
                                  uint64_t *count)
 {
        uint32_t lo_base_addr = 0, hi_base_addr = 0, lo_val = 0, hi_val = 0;
@@ -656,14 +592,15 @@ static void df_v3_6_pmc_get_count(struct amdgpu_device *adev,
 
        switch (adev->asic_type) {
        case CHIP_VEGA20:
-               df_v3_6_pmc_get_read_settings(adev, config, &lo_base_addr,
-                                     &hi_base_addr);
+       case CHIP_ARCTURUS:
+               df_v3_6_pmc_get_read_settings(adev, config, counter_idx,
+                                               &lo_base_addr, &hi_base_addr);
 
                if ((lo_base_addr == 0) || (hi_base_addr == 0))
                        return;
 
                /* rearm the counter or throw away count value on failure */
-               if (df_v3_6_pmc_is_deferred(adev, config)) {
+               if (df_v3_6_pmc_is_deferred(adev, config, counter_idx)) {
                        int rearm_err = df_v3_6_perfmon_arm_with_status(adev,
                                                        lo_base_addr, lo_val,
                                                        hi_base_addr, hi_val);
@@ -671,7 +608,8 @@ static void df_v3_6_pmc_get_count(struct amdgpu_device *adev,
                        if (rearm_err)
                                return;
 
-                       df_v3_6_pmc_set_deferred(adev, config, false);
+                       df_v3_6_pmc_set_deferred(adev, config, counter_idx,
+                                                                       false);
                }
 
                df_v3_6_perfmon_rreg(adev, lo_base_addr, &lo_val,