Merge tag 'drm-misc-next-fixes-2021-09-09' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / pm / inc / amdgpu_smu.h
index 3e89852..8156729 100644 (file)
@@ -34,6 +34,8 @@
 #define SMU_FW_NAME_LEN                        0x24
 
 #define SMU_DPM_USER_PROFILE_RESTORE (1 << 0)
+#define SMU_CUSTOM_FAN_SPEED_RPM     (1 << 1)
+#define SMU_CUSTOM_FAN_SPEED_PWM     (1 << 2)
 
 // Power Throttlers
 #define SMU_THROTTLER_PPT0_BIT                 0
@@ -229,8 +231,10 @@ enum smu_memory_pool_size
 struct smu_user_dpm_profile {
        uint32_t fan_mode;
        uint32_t power_limit;
-       uint32_t fan_speed_percent;
+       uint32_t fan_speed_pwm;
+       uint32_t fan_speed_rpm;
        uint32_t flags;
+       uint32_t user_od;
 
        /* user clock state information */
        uint32_t clk_mask[SMU_CLK_COUNT];
@@ -352,6 +356,7 @@ struct smu_table_context
 
        void                            *overdrive_table;
        void                            *boot_overdrive_table;
+       void                            *user_overdrive_table;
 
        uint32_t                        gpu_metrics_table_size;
        void                            *gpu_metrics_table;
@@ -538,7 +543,7 @@ struct smu_context
        struct work_struct interrupt_work;
 
        unsigned fan_max_rpm;
-       unsigned manual_fan_speed_percent;
+       unsigned manual_fan_speed_pwm;
 
        uint32_t gfx_default_hard_min_freq;
        uint32_t gfx_default_soft_max_freq;
@@ -623,6 +628,12 @@ struct pptable_funcs {
                                 enum PP_OD_DPM_TABLE_COMMAND type,
                                 long *input, uint32_t size);
 
+       /**
+        * @restore_user_od_settings: Restore the user customized
+        *                            OD settings on S3/S4/Runpm resume.
+        */
+       int (*restore_user_od_settings)(struct smu_context *smu);
+
        /**
         * @get_clock_by_type_with_latency: Get the speed and latency of a clock
         *                                  domain.
@@ -714,9 +725,14 @@ struct pptable_funcs {
        bool (*is_dpm_running)(struct smu_context *smu);
 
        /**
-        * @get_fan_speed_percent: Get the current fan speed in percent.
+        * @get_fan_speed_pwm: Get the current fan speed in PWM.
         */
-       int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed);
+       int (*get_fan_speed_pwm)(struct smu_context *smu, uint32_t *speed);
+
+       /**
+        * @get_fan_speed_rpm: Get the current fan speed in rpm.
+        */
+       int (*get_fan_speed_rpm)(struct smu_context *smu, uint32_t *speed);
 
        /**
         * @set_watermarks_table: Configure and upload the watermarks tables to
@@ -1035,9 +1051,14 @@ struct pptable_funcs {
        int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode);
 
        /**
-        * @set_fan_speed_percent: Set a static fan speed in percent.
+        * @set_fan_speed_pwm: Set a static fan speed in PWM.
+        */
+       int (*set_fan_speed_pwm)(struct smu_context *smu, uint32_t speed);
+
+       /**
+        * @set_fan_speed_rpm: Set a static fan speed in rpm.
         */
-       int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t speed);
+       int (*set_fan_speed_rpm)(struct smu_context *smu, uint32_t speed);
 
        /**
         * @set_xgmi_pstate: Set inter-chip global memory interconnect pstate.
@@ -1314,6 +1335,30 @@ enum smu_cmn2asic_mapping_type {
 #define WORKLOAD_MAP(profile, workload) \
        [profile] = {1, (workload)}
 
+/**
+ * smu_memcpy_trailing - Copy the end of one structure into the middle of another
+ *
+ * @dst: Pointer to destination struct
+ * @first_dst_member: The member name in @dst where the overwrite begins
+ * @last_dst_member: The member name in @dst where the overwrite ends after
+ * @src: Pointer to the source struct
+ * @first_src_member: The member name in @src where the copy begins
+ *
+ */
+#define smu_memcpy_trailing(dst, first_dst_member, last_dst_member,       \
+                           src, first_src_member)                         \
+({                                                                        \
+       size_t __src_offset = offsetof(typeof(*(src)), first_src_member);  \
+       size_t __src_size = sizeof(*(src)) - __src_offset;                 \
+       size_t __dst_offset = offsetof(typeof(*(dst)), first_dst_member);  \
+       size_t __dst_size = offsetofend(typeof(*(dst)), last_dst_member) - \
+                           __dst_offset;                                  \
+       BUILD_BUG_ON(__src_size != __dst_size);                            \
+       __builtin_memcpy((u8 *)(dst) + __dst_offset,                       \
+                        (u8 *)(src) + __src_offset,                       \
+                        __dst_size);                                      \
+})
+
 #if !defined(SWSMU_CODE_LAYER_L2) && !defined(SWSMU_CODE_LAYER_L3) && !defined(SWSMU_CODE_LAYER_L4)
 int smu_get_power_limit(void *handle,
                        uint32_t *limit,