With this, we can support more CG flags.
Signed-off-by: Evan Quan <evan.quan@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
 extern int amdgpu_sched_hw_submission;
 extern uint amdgpu_pcie_gen_cap;
 extern uint amdgpu_pcie_lane_cap;
-extern uint amdgpu_cg_mask;
+extern u64 amdgpu_cg_mask;
 extern uint amdgpu_pg_mask;
 extern uint amdgpu_sdma_phase_quantum;
 extern char *amdgpu_disable_cu;
                                           enum amd_ip_block_type block_type,
                                           enum amd_powergating_state state);
 void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags);
+                                           u64 *flags);
 int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,
                                   enum amd_ip_block_type block_type);
 bool amdgpu_device_ip_is_idle(struct amdgpu_device *adev,
        /* powerplay */
        struct amd_powerplay            powerplay;
        struct amdgpu_pm                pm;
-       u32                             cg_flags;
+       u64                             cg_flags;
        u32                             pg_flags;
 
        /* nbio */
 
        /* rev==1 */
        config[no_regs++] = adev->rev_id;
        config[no_regs++] = adev->pg_flags;
-       config[no_regs++] = adev->cg_flags;
+       config[no_regs++] = lower_32_bits(adev->cg_flags);
 
        /* rev==2 */
        config[no_regs++] = adev->family;
        /* rev==4 APU flag */
        config[no_regs++] = adev->flags & AMD_IS_APU ? 1 : 0;
 
+       /* rev==5 CG flag upper 32bit */
+       config[no_regs++] = upper_32_bits(adev->cg_flags);
+
        while (size && (*pos < no_regs * 4)) {
                uint32_t value;
 
 
  * clockgating is enabled.
  */
 void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int i;
 
 
        void (*update_medium_grain_clock_gating)(struct amdgpu_device *adev,
                                                 bool enable);
        void (*get_clockgating_state)(struct amdgpu_device *adev,
-                                     u32 *flags);
+                                     u64 *flags);
        void (*enable_ecc_force_par_wr_rmw)(struct amdgpu_device *adev,
                                            bool enable);
        int (*pmc_start)(struct amdgpu_device *adev, uint64_t config,
 
 int amdgpu_sched_hw_submission = 2;
 uint amdgpu_pcie_gen_cap;
 uint amdgpu_pcie_lane_cap;
-uint amdgpu_cg_mask = 0xffffffff;
+u64 amdgpu_cg_mask = 0xffffffffffffffff;
 uint amdgpu_pg_mask = 0xffffffff;
 uint amdgpu_sdma_phase_quantum = 32;
 char *amdgpu_disable_cu = NULL;
 module_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444);
 
 /**
- * DOC: cg_mask (uint)
+ * DOC: cg_mask (ullong)
  * Override Clockgating features enabled on GPU (0 = disable clock gating). See the AMD_CG_SUPPORT flags in
- * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffff (all enabled).
+ * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffffffffffff (all enabled).
  */
 MODULE_PARM_DESC(cg_mask, "Clockgating flags mask (0 = disable clock gating)");
-module_param_named(cg_mask, amdgpu_cg_mask, uint, 0444);
+module_param_named(cg_mask, amdgpu_cg_mask, ullong, 0444);
 
 /**
  * DOC: pg_mask (uint)
 
        void (*invalidate_hdp)(struct amdgpu_device *adev,
                               struct amdgpu_ring *ring);
        void (*update_clock_gating)(struct amdgpu_device *adev, bool enable);
-       void (*get_clock_gating_state)(struct amdgpu_device *adev, u32 *flags);
+       void (*get_clock_gating_state)(struct amdgpu_device *adev, u64 *flags);
        void (*init_registers)(struct amdgpu_device *adev);
 };
 
 
        void (*gart_disable)(struct amdgpu_device *adev);
        int (*set_clockgating)(struct amdgpu_device *adev,
                               enum amd_clockgating_state state);
-       void (*get_clockgating)(struct amdgpu_device *adev, u32 *flags);
+       void (*get_clockgating)(struct amdgpu_device *adev, u64 *flags);
        void (*setup_vm_pt_regs)(struct amdgpu_device *adev, uint32_t vmid,
                                uint64_t page_table_base);
        void (*update_power_gating)(struct amdgpu_device *adev,
 
        void (*update_medium_grain_light_sleep)(struct amdgpu_device *adev,
                                                bool enable);
        void (*get_clockgating_state)(struct amdgpu_device *adev,
-                                     u32 *flags);
+                                     u64 *flags);
        void (*ih_control)(struct amdgpu_device *adev);
        void (*init_registers)(struct amdgpu_device *adev);
        void (*remap_hdp_registers)(struct amdgpu_device *adev);
 
        u32 (*get_rom_index_offset)(struct amdgpu_device *adev);
        u32 (*get_rom_data_offset)(struct amdgpu_device *adev);
        void (*update_rom_clock_gating)(struct amdgpu_device *adev, bool enable);
-       void (*get_clock_gating_state)(struct amdgpu_device *adev, u32 *flags);
+       void (*get_clock_gating_state)(struct amdgpu_device *adev, u64 *flags);
        u32 (*get_die_id)(struct amdgpu_device *adev);
        u32 (*get_socket_id)(struct amdgpu_device *adev);
        bool (*is_host_gpu_xgmi_supported)(struct amdgpu_device *adev);
 
        return 0;
 }
 
-void athub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+void athub_v1_0_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data;
 
 
 
 int athub_v1_0_set_clockgating(struct amdgpu_device *adev,
                               enum amd_clockgating_state state);
-void athub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags);
+void athub_v1_0_get_clockgating(struct amdgpu_device *adev, u64 *flags);
 
 #endif
 
        return 0;
 }
 
-void athub_v2_0_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+void athub_v2_0_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data;
 
 
 
 int athub_v2_0_set_clockgating(struct amdgpu_device *adev,
                               enum amd_clockgating_state state);
-void athub_v2_0_get_clockgating(struct amdgpu_device *adev, u32 *flags);
+void athub_v2_0_get_clockgating(struct amdgpu_device *adev, u64 *flags);
 
 #endif
 
        return 0;
 }
 
-void athub_v2_1_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+void athub_v2_1_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data;
 
 
 
 int athub_v2_1_set_clockgating(struct amdgpu_device *adev,
                               enum amd_clockgating_state state);
-void athub_v2_1_get_clockgating(struct amdgpu_device *adev, u32 *flags);
+void athub_v2_1_get_clockgating(struct amdgpu_device *adev, u64 *flags);
 
 #endif
 
 }
 
 static void df_v1_7_get_clockgating_state(struct amdgpu_device *adev,
-                                         u32 *flags)
+                                         u64 *flags)
 {
        u32 tmp;
 
 
 }
 
 static void df_v3_6_get_clockgating_state(struct amdgpu_device *adev,
-                                         u32 *flags)
+                                         u64 *flags)
 {
        u32 tmp;
 
 
        return 0;
 }
 
-static void gfx_v10_0_get_clockgating_state(void *handle, u32 *flags)
+static void gfx_v10_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void gfx_v8_0_get_clockgating_state(void *handle, u32 *flags)
+static void gfx_v8_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void gfx_v9_0_get_clockgating_state(void *handle, u32 *flags)
+static void gfx_v9_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
                return athub_v2_0_set_clockgating(adev, state);
 }
 
-static void gmc_v10_0_get_clockgating_state(void *handle, u32 *flags)
+static void gmc_v10_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
 
        return 0;
 }
 
-static void gmc_v8_0_get_clockgating_state(void *handle, u32 *flags)
+static void gmc_v8_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void gmc_v9_0_get_clockgating_state(void *handle, u32 *flags)
+static void gmc_v9_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
 
 }
 
 static void hdp_v4_0_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int data;
 
 
 }
 
 static void hdp_v5_0_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        uint32_t tmp;
 
 
        return 0;
 }
 
-static void mmhub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+static void mmhub_v1_0_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data, data1;
 
 
        return 0;
 }
 
-static void mmhub_v1_7_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+static void mmhub_v1_7_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data, data1;
 
 
        return 0;
 }
 
-static void mmhub_v2_0_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+static void mmhub_v2_0_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data, data1;
 
 
        return 0;
 }
 
-static void mmhub_v2_3_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+static void mmhub_v2_3_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data, data1, data2, data3;
 
 
        return 0;
 }
 
-static void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+static void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u64 *flags)
 {
        int data, data1;
 
 
        return 0;
 }
 
-static void navi10_ih_get_clockgating_state(void *handle, u32 *flags)
+static void navi10_ih_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
 
 }
 
 static void nbio_v2_3_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int data;
 
 
 }
 
 static void nbio_v6_1_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int data;
 
 
 }
 
 static void nbio_v7_0_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int data;
 
 
 }
 
 static void nbio_v7_2_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int data;
 
 
 }
 
 static void nbio_v7_4_get_clockgating_state(struct amdgpu_device *adev,
-                                           u32 *flags)
+                                           u64 *flags)
 {
        int data;
 
 
        return 0;
 }
 
-static void nv_common_get_clockgating_state(void *handle, u32 *flags)
+static void nv_common_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
 
        return 0;
 }
 
-static void sdma_v3_0_get_clockgating_state(void *handle, u32 *flags)
+static void sdma_v3_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void sdma_v4_0_get_clockgating_state(void *handle, u32 *flags)
+static void sdma_v4_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void sdma_v5_0_get_clockgating_state(void *handle, u32 *flags)
+static void sdma_v5_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void sdma_v5_2_get_clockgating_state(void *handle, u32 *flags)
+static void sdma_v5_2_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
                WREG32_SOC15(SMUIO, 0, mmCGTT_ROM_CLK_CTRL0, data);
 }
 
-static void smuio_v11_0_get_clock_gating_state(struct amdgpu_device *adev, u32 *flags)
+static void smuio_v11_0_get_clock_gating_state(struct amdgpu_device *adev, u64 *flags)
 {
        u32 data;
 
 
                WREG32_SOC15(SMUIO, 0, mmCGTT_ROM_CLK_CTRL0, data);
 }
 
-static void smuio_v11_0_6_get_clock_gating_state(struct amdgpu_device *adev, u32 *flags)
+static void smuio_v11_0_6_get_clock_gating_state(struct amdgpu_device *adev, u64 *flags)
 {
        u32 data;
 
 
                WREG32_SOC15(SMUIO, 0, regCGTT_ROM_CLK_CTRL0, data);
 }
 
-static void smuio_v13_0_get_clock_gating_state(struct amdgpu_device *adev, u32 *flags)
+static void smuio_v13_0_get_clock_gating_state(struct amdgpu_device *adev, u64 *flags)
 {
        u32 data;
 
 
                WREG32_SOC15(SMUIO, 0, mmCGTT_ROM_CLK_CTRL0, data);
 }
 
-static void smuio_v9_0_get_clock_gating_state(struct amdgpu_device *adev, u32 *flags)
+static void smuio_v9_0_get_clock_gating_state(struct amdgpu_device *adev, u64 *flags)
 {
        u32 data;
 
 
        return 0;
 }
 
-static void soc15_common_get_clockgating_state(void *handle, u32 *flags)
+static void soc15_common_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return ret;
 }
 
-static void uvd_v5_0_get_clockgating_state(void *handle, u32 *flags)
+static void uvd_v5_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return ret;
 }
 
-static void uvd_v6_0_get_clockgating_state(void *handle, u32 *flags)
+static void uvd_v6_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return ret;
 }
 
-static void vce_v3_0_get_clockgating_state(void *handle, u32 *flags)
+static void vce_v3_0_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
        return 0;
 }
 
-static void vi_common_get_clockgating_state(void *handle, u32 *flags)
+static void vi_common_get_clockgating_state(void *handle, u64 *flags)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int data;
 
 
 
 /* CG flags */
-#define AMD_CG_SUPPORT_GFX_MGCG                        (1 << 0)
-#define AMD_CG_SUPPORT_GFX_MGLS                        (1 << 1)
-#define AMD_CG_SUPPORT_GFX_CGCG                        (1 << 2)
-#define AMD_CG_SUPPORT_GFX_CGLS                        (1 << 3)
-#define AMD_CG_SUPPORT_GFX_CGTS                        (1 << 4)
-#define AMD_CG_SUPPORT_GFX_CGTS_LS             (1 << 5)
-#define AMD_CG_SUPPORT_GFX_CP_LS               (1 << 6)
-#define AMD_CG_SUPPORT_GFX_RLC_LS              (1 << 7)
-#define AMD_CG_SUPPORT_MC_LS                   (1 << 8)
-#define AMD_CG_SUPPORT_MC_MGCG                 (1 << 9)
-#define AMD_CG_SUPPORT_SDMA_LS                 (1 << 10)
-#define AMD_CG_SUPPORT_SDMA_MGCG               (1 << 11)
-#define AMD_CG_SUPPORT_BIF_LS                  (1 << 12)
-#define AMD_CG_SUPPORT_UVD_MGCG                        (1 << 13)
-#define AMD_CG_SUPPORT_VCE_MGCG                        (1 << 14)
-#define AMD_CG_SUPPORT_HDP_LS                  (1 << 15)
-#define AMD_CG_SUPPORT_HDP_MGCG                        (1 << 16)
-#define AMD_CG_SUPPORT_ROM_MGCG                        (1 << 17)
-#define AMD_CG_SUPPORT_DRM_LS                  (1 << 18)
-#define AMD_CG_SUPPORT_BIF_MGCG                        (1 << 19)
-#define AMD_CG_SUPPORT_GFX_3D_CGCG             (1 << 20)
-#define AMD_CG_SUPPORT_GFX_3D_CGLS             (1 << 21)
-#define AMD_CG_SUPPORT_DRM_MGCG                        (1 << 22)
-#define AMD_CG_SUPPORT_DF_MGCG                 (1 << 23)
-#define AMD_CG_SUPPORT_VCN_MGCG                        (1 << 24)
-#define AMD_CG_SUPPORT_HDP_DS                  (1 << 25)
-#define AMD_CG_SUPPORT_HDP_SD                  (1 << 26)
-#define AMD_CG_SUPPORT_IH_CG                   (1 << 27)
-#define AMD_CG_SUPPORT_ATHUB_LS                        (1 << 28)
-#define AMD_CG_SUPPORT_ATHUB_MGCG              (1 << 29)
-#define AMD_CG_SUPPORT_JPEG_MGCG               (1 << 30)
-#define AMD_CG_SUPPORT_GFX_FGCG                        (1 << 31)
+#define AMD_CG_SUPPORT_GFX_MGCG                        (1ULL << 0)
+#define AMD_CG_SUPPORT_GFX_MGLS                        (1ULL << 1)
+#define AMD_CG_SUPPORT_GFX_CGCG                        (1ULL << 2)
+#define AMD_CG_SUPPORT_GFX_CGLS                        (1ULL << 3)
+#define AMD_CG_SUPPORT_GFX_CGTS                        (1ULL << 4)
+#define AMD_CG_SUPPORT_GFX_CGTS_LS             (1ULL << 5)
+#define AMD_CG_SUPPORT_GFX_CP_LS               (1ULL << 6)
+#define AMD_CG_SUPPORT_GFX_RLC_LS              (1ULL << 7)
+#define AMD_CG_SUPPORT_MC_LS                   (1ULL << 8)
+#define AMD_CG_SUPPORT_MC_MGCG                 (1ULL << 9)
+#define AMD_CG_SUPPORT_SDMA_LS                 (1ULL << 10)
+#define AMD_CG_SUPPORT_SDMA_MGCG               (1ULL << 11)
+#define AMD_CG_SUPPORT_BIF_LS                  (1ULL << 12)
+#define AMD_CG_SUPPORT_UVD_MGCG                        (1ULL << 13)
+#define AMD_CG_SUPPORT_VCE_MGCG                        (1ULL << 14)
+#define AMD_CG_SUPPORT_HDP_LS                  (1ULL << 15)
+#define AMD_CG_SUPPORT_HDP_MGCG                        (1ULL << 16)
+#define AMD_CG_SUPPORT_ROM_MGCG                        (1ULL << 17)
+#define AMD_CG_SUPPORT_DRM_LS                  (1ULL << 18)
+#define AMD_CG_SUPPORT_BIF_MGCG                        (1ULL << 19)
+#define AMD_CG_SUPPORT_GFX_3D_CGCG             (1ULL << 20)
+#define AMD_CG_SUPPORT_GFX_3D_CGLS             (1ULL << 21)
+#define AMD_CG_SUPPORT_DRM_MGCG                        (1ULL << 22)
+#define AMD_CG_SUPPORT_DF_MGCG                 (1ULL << 23)
+#define AMD_CG_SUPPORT_VCN_MGCG                        (1ULL << 24)
+#define AMD_CG_SUPPORT_HDP_DS                  (1ULL << 25)
+#define AMD_CG_SUPPORT_HDP_SD                  (1ULL << 26)
+#define AMD_CG_SUPPORT_IH_CG                   (1ULL << 27)
+#define AMD_CG_SUPPORT_ATHUB_LS                        (1ULL << 28)
+#define AMD_CG_SUPPORT_ATHUB_MGCG              (1ULL << 29)
+#define AMD_CG_SUPPORT_JPEG_MGCG               (1ULL << 30)
+#define AMD_CG_SUPPORT_GFX_FGCG                        (1ULL << 31)
 /* PG flags */
 #define AMD_PG_SUPPORT_GFX_PG                  (1 << 0)
 #define AMD_PG_SUPPORT_GFX_SMG                 (1 << 1)
                                     enum amd_clockgating_state state);
        int (*set_powergating_state)(void *handle,
                                     enum amd_powergating_state state);
-       void (*get_clockgating_state)(void *handle, u32 *flags);
+       void (*get_clockgating_state)(void *handle, u64 *flags);
 };
 
 
 
        return 0;
 }
 
-static void amdgpu_parse_cg_state(struct seq_file *m, u32 flags)
+static void amdgpu_parse_cg_state(struct seq_file *m, u64 flags)
 {
        int i;
 
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
        struct drm_device *dev = adev_to_drm(adev);
-       u32 flags = 0;
+       u64 flags = 0;
        int r;
 
        if (amdgpu_in_reset(adev))
 
        amdgpu_device_ip_get_clockgating_state(adev, &flags);
 
-       seq_printf(m, "Clock Gating Flags Mask: 0x%x\n", flags);
+       seq_printf(m, "Clock Gating Flags Mask: 0x%llx\n", flags);
        amdgpu_parse_cg_state(m, flags);
        seq_printf(m, "\n");
 
 
 
 struct cg_flag_name
 {
-       u32 flag;
+       u64 flag;
        const char *name;
 };