drm/radeon/kms/pm: add mid profile
[safe/jmp/linux-2.6] / drivers / gpu / drm / radeon / r100.c
index 493b9b4..cf89aa2 100644 (file)
@@ -68,26 +68,25 @@ MODULE_FIRMWARE(FIRMWARE_R520);
  * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
  */
 
-void r100_get_power_state(struct radeon_device *rdev,
-                         enum radeon_pm_action action)
+void r100_pm_get_dynpm_state(struct radeon_device *rdev)
 {
        int i;
-       rdev->pm.can_upclock = true;
-       rdev->pm.can_downclock = true;
+       rdev->pm.dynpm_can_upclock = true;
+       rdev->pm.dynpm_can_downclock = true;
 
-       switch (action) {
-       case PM_ACTION_MINIMUM:
+       switch (rdev->pm.dynpm_planned_action) {
+       case DYNPM_ACTION_MINIMUM:
                rdev->pm.requested_power_state_index = 0;
-               rdev->pm.can_downclock = false;
+               rdev->pm.dynpm_can_downclock = false;
                break;
-       case PM_ACTION_DOWNCLOCK:
+       case DYNPM_ACTION_DOWNCLOCK:
                if (rdev->pm.current_power_state_index == 0) {
                        rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
-                       rdev->pm.can_downclock = false;
+                       rdev->pm.dynpm_can_downclock = false;
                } else {
                        if (rdev->pm.active_crtc_count > 1) {
                                for (i = 0; i < rdev->pm.num_power_states; i++) {
-                                       if (rdev->pm.power_state[i].flags & RADEON_PM_SINGLE_DISPLAY_ONLY)
+                                       if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)
                                                continue;
                                        else if (i >= rdev->pm.current_power_state_index) {
                                                rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
@@ -101,15 +100,21 @@ void r100_get_power_state(struct radeon_device *rdev,
                                rdev->pm.requested_power_state_index =
                                        rdev->pm.current_power_state_index - 1;
                }
+               /* don't use the power state if crtcs are active and no display flag is set */
+               if ((rdev->pm.active_crtc_count > 0) &&
+                   (rdev->pm.power_state[rdev->pm.requested_power_state_index].clock_info[0].flags &
+                    RADEON_PM_MODE_NO_DISPLAY)) {
+                       rdev->pm.requested_power_state_index++;
+               }
                break;
-       case PM_ACTION_UPCLOCK:
+       case DYNPM_ACTION_UPCLOCK:
                if (rdev->pm.current_power_state_index == (rdev->pm.num_power_states - 1)) {
                        rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
-                       rdev->pm.can_upclock = false;
+                       rdev->pm.dynpm_can_upclock = false;
                } else {
                        if (rdev->pm.active_crtc_count > 1) {
                                for (i = (rdev->pm.num_power_states - 1); i >= 0; i--) {
-                                       if (rdev->pm.power_state[i].flags & RADEON_PM_SINGLE_DISPLAY_ONLY)
+                                       if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)
                                                continue;
                                        else if (i <= rdev->pm.current_power_state_index) {
                                                rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
@@ -124,11 +129,11 @@ void r100_get_power_state(struct radeon_device *rdev,
                                        rdev->pm.current_power_state_index + 1;
                }
                break;
-       case PM_ACTION_DEFAULT:
+       case DYNPM_ACTION_DEFAULT:
                rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index;
-               rdev->pm.can_upclock = false;
+               rdev->pm.dynpm_can_upclock = false;
                break;
-       case PM_ACTION_NONE:
+       case DYNPM_ACTION_NONE:
        default:
                DRM_ERROR("Requested mode for not defined action\n");
                return;
@@ -136,91 +141,56 @@ void r100_get_power_state(struct radeon_device *rdev,
        /* only one clock mode per power state */
        rdev->pm.requested_clock_mode_index = 0;
 
-       DRM_INFO("Requested: e: %d m: %d p: %d\n",
-                rdev->pm.power_state[rdev->pm.requested_power_state_index].
-                clock_info[rdev->pm.requested_clock_mode_index].sclk,
-                rdev->pm.power_state[rdev->pm.requested_power_state_index].
-                clock_info[rdev->pm.requested_clock_mode_index].mclk,
-                rdev->pm.power_state[rdev->pm.requested_power_state_index].
-                pcie_lanes);
-}
-
-void r100_set_power_state(struct radeon_device *rdev, bool static_switch)
-{
-       u32 sclk, mclk;
-
-       if (rdev->pm.current_power_state_index == rdev->pm.requested_power_state_index)
-               return;
-
-       if (radeon_gui_idle(rdev)) {
-
-               sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index].
-                       clock_info[rdev->pm.requested_clock_mode_index].sclk;
-               if (sclk > rdev->clock.default_sclk)
-                       sclk = rdev->clock.default_sclk;
-
-               mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index].
-                       clock_info[rdev->pm.requested_clock_mode_index].mclk;
-               if (mclk > rdev->clock.default_mclk)
-                       mclk = rdev->clock.default_mclk;
-               /* don't change the mclk with multiple crtcs */
-               if (rdev->pm.active_crtc_count > 1)
-                       mclk = rdev->clock.default_mclk;
-
-               /* voltage, pcie lanes, etc.*/
-               radeon_pm_misc(rdev);
-
-               if (static_switch) {
-                       radeon_pm_prepare(rdev);
-                       /* set engine clock */
-                       if (sclk != rdev->pm.current_sclk) {
-                               radeon_set_engine_clock(rdev, sclk);
-                               rdev->pm.current_sclk = sclk;
-                               DRM_INFO("Setting: e: %d\n", sclk);
-                       }
-                       /* set memory clock */
-                       if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
-                               radeon_set_memory_clock(rdev, mclk);
-                               rdev->pm.current_mclk = mclk;
-                               DRM_INFO("Setting: m: %d\n", mclk);
-                       }
-                       radeon_pm_finish(rdev);
-               } else {
-                       radeon_sync_with_vblank(rdev);
-
-                       if (!radeon_pm_in_vbl(rdev))
-                               return;
-
-                       radeon_pm_prepare(rdev);
-                       /* set engine clock */
-                       if (sclk != rdev->pm.current_sclk) {
-                               radeon_pm_debug_check_in_vbl(rdev, false);
-                               radeon_set_engine_clock(rdev, sclk);
-                               radeon_pm_debug_check_in_vbl(rdev, true);
-                               rdev->pm.current_sclk = sclk;
-                               DRM_INFO("Setting: e: %d\n", sclk);
-                       }
-
-                       /* set memory clock */
-                       if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
-                               radeon_pm_debug_check_in_vbl(rdev, false);
-                               radeon_set_memory_clock(rdev, mclk);
-                               radeon_pm_debug_check_in_vbl(rdev, true);
-                               rdev->pm.current_mclk = mclk;
-                               DRM_INFO("Setting: m: %d\n", mclk);
-                       }
-                       radeon_pm_finish(rdev);
-               }
-
-               rdev->pm.current_power_state_index = rdev->pm.requested_power_state_index;
-               rdev->pm.current_clock_mode_index = rdev->pm.requested_clock_mode_index;
-       } else
-               DRM_INFO("GUI not idle!!!\n");
+       DRM_DEBUG("Requested: e: %d m: %d p: %d\n",
+                 rdev->pm.power_state[rdev->pm.requested_power_state_index].
+                 clock_info[rdev->pm.requested_clock_mode_index].sclk,
+                 rdev->pm.power_state[rdev->pm.requested_power_state_index].
+                 clock_info[rdev->pm.requested_clock_mode_index].mclk,
+                 rdev->pm.power_state[rdev->pm.requested_power_state_index].
+                 pcie_lanes);
+}
+
+void r100_pm_init_profile(struct radeon_device *rdev)
+{
+       /* default */
+       rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
+       rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
+       rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
+       /* low sh */
+       rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
+       /* mid sh */
+       rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
+       /* high sh */
+       rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
+       rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;
+       /* low mh */
+       rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
+       rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
+       /* mid mh */
+       rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
+       rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
+       /* high mh */
+       rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
+       rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
+       rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;
 }
 
 void r100_pm_misc(struct radeon_device *rdev)
 {
-#if 0
        int requested_index = rdev->pm.requested_power_state_index;
        struct radeon_power_state *ps = &rdev->pm.power_state[requested_index];
        struct radeon_voltage *voltage = &ps->clock_info[0].voltage;
@@ -306,9 +276,8 @@ void r100_pm_misc(struct radeon_device *rdev)
             rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) {
                radeon_set_pcie_lanes(rdev,
                                      ps->pcie_lanes);
-               DRM_INFO("Setting: p: %d\n", ps->pcie_lanes);
+               DRM_DEBUG("Setting: p: %d\n", ps->pcie_lanes);
        }
-#endif
 }
 
 void r100_pm_prepare(struct radeon_device *rdev)
@@ -3324,7 +3293,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
 
        for (i = 0; i < track->num_cb; i++) {
                if (track->cb[i].robj == NULL) {
-                       if (!(track->fastfill || track->color_channel_mask ||
+                       if (!(track->zb_cb_clear || track->color_channel_mask ||
                              track->blend_read_enable)) {
                                continue;
                        }
@@ -3811,7 +3780,6 @@ int r100_suspend(struct radeon_device *rdev)
 
 void r100_fini(struct radeon_device *rdev)
 {
-       radeon_pm_fini(rdev);
        r100_cp_fini(rdev);
        r100_wb_fini(rdev);
        r100_ib_fini(rdev);
@@ -3867,8 +3835,6 @@ int r100_init(struct radeon_device *rdev)
        r100_errata(rdev);
        /* Initialize clocks */
        radeon_get_clock_info(rdev->ddev);
-       /* Initialize power management */
-       radeon_pm_init(rdev);
        /* initialize AGP */
        if (rdev->flags & RADEON_IS_AGP) {
                r = radeon_agp_init(rdev);