drm/radeon/kms: release AGP bridge at suspend
[safe/jmp/linux-2.6] / drivers / gpu / drm / radeon / radeon.h
index 815df34..669feb6 100644 (file)
@@ -89,7 +89,6 @@ extern int radeon_testing;
 extern int radeon_connector_table;
 extern int radeon_tv;
 extern int radeon_new_pll;
-extern int radeon_dynpm;
 extern int radeon_audio;
 extern int radeon_disp_priority;
 extern int radeon_hw_i2c;
@@ -173,6 +172,8 @@ struct radeon_clock {
 int radeon_pm_init(struct radeon_device *rdev);
 void radeon_pm_fini(struct radeon_device *rdev);
 void radeon_pm_compute_clocks(struct radeon_device *rdev);
+void radeon_pm_suspend(struct radeon_device *rdev);
+void radeon_pm_resume(struct radeon_device *rdev);
 void radeon_combios_get_power_modes(struct radeon_device *rdev);
 void radeon_atombios_get_power_modes(struct radeon_device *rdev);
 
@@ -260,6 +261,7 @@ struct radeon_bo_list {
        unsigned                rdomain;
        unsigned                wdomain;
        u32                     tiling_flags;
+       bool                    reserved;
 };
 
 /*
@@ -376,6 +378,11 @@ struct radeon_irq {
        wait_queue_head_t       vblank_queue;
        /* FIXME: use defines for max hpd/dacs */
        bool            hpd[6];
+       bool            gui_idle;
+       bool            gui_idle_acked;
+       wait_queue_head_t       idle_queue;
+       /* FIXME: use defines for max HDMI blocks */
+       bool            hdmi[2];
        spinlock_t sw_lock;
        int sw_refcount;
 };
@@ -463,7 +470,9 @@ int radeon_ib_test(struct radeon_device *rdev);
 extern void radeon_ib_bogus_add(struct radeon_device *rdev, struct radeon_ib *ib);
 /* Ring access between begin & end cannot sleep */
 void radeon_ring_free_size(struct radeon_device *rdev);
+int radeon_ring_alloc(struct radeon_device *rdev, unsigned ndw);
 int radeon_ring_lock(struct radeon_device *rdev, unsigned ndw);
+void radeon_ring_commit(struct radeon_device *rdev);
 void radeon_ring_unlock_commit(struct radeon_device *rdev);
 void radeon_ring_unlock_undo(struct radeon_device *rdev);
 int radeon_ring_test(struct radeon_device *rdev);
@@ -567,6 +576,7 @@ typedef int (*radeon_packet3_check_t)(struct radeon_cs_parser *p,
  */
 int radeon_agp_init(struct radeon_device *rdev);
 void radeon_agp_resume(struct radeon_device *rdev);
+void radeon_agp_suspend(struct radeon_device *rdev);
 void radeon_agp_fini(struct radeon_device *rdev);
 
 
@@ -598,17 +608,24 @@ struct radeon_wb {
  * Equation between gpu/memory clock and available bandwidth is hw dependent
  * (type of memory, bus size, efficiency, ...)
  */
-enum radeon_pm_state {
-       PM_STATE_DISABLED,
-       PM_STATE_MINIMUM,
-       PM_STATE_PAUSED,
-       PM_STATE_ACTIVE
+
+enum radeon_pm_method {
+       PM_METHOD_PROFILE,
+       PM_METHOD_DYNPM,
+};
+
+enum radeon_dynpm_state {
+       DYNPM_STATE_DISABLED,
+       DYNPM_STATE_MINIMUM,
+       DYNPM_STATE_PAUSED,
+       DYNPM_STATE_ACTIVE
 };
-enum radeon_pm_action {
-       PM_ACTION_NONE,
-       PM_ACTION_MINIMUM,
-       PM_ACTION_DOWNCLOCK,
-       PM_ACTION_UPCLOCK
+enum radeon_dynpm_action {
+       DYNPM_ACTION_NONE,
+       DYNPM_ACTION_MINIMUM,
+       DYNPM_ACTION_DOWNCLOCK,
+       DYNPM_ACTION_UPCLOCK,
+       DYNPM_ACTION_DEFAULT
 };
 
 enum radeon_voltage_type {
@@ -626,11 +643,25 @@ enum radeon_pm_state_type {
        POWER_STATE_TYPE_PERFORMANCE,
 };
 
-enum radeon_pm_clock_mode_type {
-       POWER_MODE_TYPE_DEFAULT,
-       POWER_MODE_TYPE_LOW,
-       POWER_MODE_TYPE_MID,
-       POWER_MODE_TYPE_HIGH,
+enum radeon_pm_profile_type {
+       PM_PROFILE_DEFAULT,
+       PM_PROFILE_AUTO,
+       PM_PROFILE_LOW,
+       PM_PROFILE_HIGH,
+};
+
+#define PM_PROFILE_DEFAULT_IDX 0
+#define PM_PROFILE_LOW_SH_IDX  1
+#define PM_PROFILE_HIGH_SH_IDX 2
+#define PM_PROFILE_LOW_MH_IDX  3
+#define PM_PROFILE_HIGH_MH_IDX 4
+#define PM_PROFILE_MAX         5
+
+struct radeon_pm_profile {
+       int dpms_off_ps_idx;
+       int dpms_on_ps_idx;
+       int dpms_off_cm_idx;
+       int dpms_on_cm_idx;
 };
 
 struct radeon_voltage {
@@ -647,12 +678,8 @@ struct radeon_voltage {
        u32 voltage;
 };
 
-struct radeon_pm_non_clock_info {
-       /* pcie lanes */
-       int pcie_lanes;
-       /* standardized non-clock flags */
-       u32 flags;
-};
+/* clock mode flags */
+#define RADEON_PM_MODE_NO_DISPLAY          (1 << 0)
 
 struct radeon_pm_clock_info {
        /* memory clock */
@@ -661,10 +688,13 @@ struct radeon_pm_clock_info {
        u32 sclk;
        /* voltage info */
        struct radeon_voltage voltage;
-       /* standardized clock flags - not sure we'll need these */
+       /* standardized clock flags */
        u32 flags;
 };
 
+/* state flags */
+#define RADEON_PM_STATE_SINGLE_DISPLAY_ONLY (1 << 0)
+
 struct radeon_power_state {
        enum radeon_pm_state_type type;
        /* XXX: use a define for num clock modes */
@@ -672,9 +702,11 @@ struct radeon_power_state {
        /* number of valid clock modes in this power state */
        int num_clock_modes;
        struct radeon_pm_clock_info *default_clock_mode;
-       /* non clock info about this state */
-       struct radeon_pm_non_clock_info non_clock_info;
-       bool voltage_drop_active;
+       /* standardized state flags */
+       u32 flags;
+       u32 misc; /* vbios specific flags */
+       u32 misc2; /* vbios specific flags */
+       int pcie_lanes; /* pcie lanes */
 };
 
 /*
@@ -684,14 +716,11 @@ struct radeon_power_state {
 
 struct radeon_pm {
        struct mutex            mutex;
-       struct delayed_work     idle_work;
-       enum radeon_pm_state    state;
-       enum radeon_pm_action   planned_action;
-       unsigned long           action_timeout;
-       bool                    downclocked;
-       int                     active_crtcs;
+       u32                     active_crtcs;
+       int                     active_crtc_count;
        int                     req_vblank;
        bool                    vblank_sync;
+       bool                    gui_idle;
        fixed20_12              max_bandwidth;
        fixed20_12              igp_sideport_mclk;
        fixed20_12              igp_system_mclk;
@@ -708,12 +737,27 @@ struct radeon_pm {
        struct radeon_power_state power_state[8];
        /* number of valid power states */
        int                     num_power_states;
-       struct radeon_power_state *current_power_state;
-       struct radeon_pm_clock_info *current_clock_mode;
-       struct radeon_power_state *requested_power_state;
-       struct radeon_pm_clock_info *requested_clock_mode;
-       struct radeon_power_state *default_power_state;
+       int                     current_power_state_index;
+       int                     current_clock_mode_index;
+       int                     requested_power_state_index;
+       int                     requested_clock_mode_index;
+       int                     default_power_state_index;
+       u32                     current_sclk;
+       u32                     current_mclk;
        struct radeon_i2c_chan *i2c_bus;
+       /* selected pm method */
+       enum radeon_pm_method     pm_method;
+       /* dynpm power management */
+       struct delayed_work     dynpm_idle_work;
+       enum radeon_dynpm_state dynpm_state;
+       enum radeon_dynpm_action        dynpm_planned_action;
+       unsigned long           dynpm_action_timeout;
+       bool                    dynpm_can_upclock;
+       bool                    dynpm_can_downclock;
+       /* profile-based power management */
+       enum radeon_pm_profile_type profile;
+       int                     profile_index;
+       struct radeon_pm_profile profiles[PM_PROFILE_MAX];
 };
 
 
@@ -801,6 +845,13 @@ struct radeon_asic {
         * through ring.
         */
        void (*ioctl_wait_idle)(struct radeon_device *rdev, struct radeon_bo *bo);
+       bool (*gui_idle)(struct radeon_device *rdev);
+       /* power management */
+       void (*pm_misc)(struct radeon_device *rdev);
+       void (*pm_prepare)(struct radeon_device *rdev);
+       void (*pm_finish)(struct radeon_device *rdev);
+       void (*pm_init_profile)(struct radeon_device *rdev);
+       void (*pm_get_dynpm_state)(struct radeon_device *rdev);
 };
 
 /*
@@ -963,9 +1014,6 @@ struct radeon_device {
        bool                            is_atom_bios;
        uint16_t                        bios_header_start;
        struct radeon_bo                *stollen_vga_memory;
-       struct fb_info                  *fbdev_info;
-       struct radeon_bo                *fbdev_rbo;
-       struct radeon_framebuffer       *fbdev_rfb;
        /* Register mmio */
        resource_size_t                 rmmio_base;
        resource_size_t                 rmmio_size;
@@ -1010,6 +1058,7 @@ struct radeon_device {
        struct work_struct hotplug_work;
        int num_crtc; /* number of crtcs */
        struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
+       struct mutex vram_mutex;
 
        /* audio stuff */
        struct timer_list       audio_timer;
@@ -1020,6 +1069,7 @@ struct radeon_device {
        uint8_t                 audio_category_code;
 
        bool powered_down;
+       struct notifier_block acpi_nb;
 };
 
 int radeon_device_init(struct radeon_device *rdev,
@@ -1210,6 +1260,12 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
 #define radeon_hpd_fini(rdev) (rdev)->asic->hpd_fini((rdev))
 #define radeon_hpd_sense(rdev, hpd) (rdev)->asic->hpd_sense((rdev), (hpd))
 #define radeon_hpd_set_polarity(rdev, hpd) (rdev)->asic->hpd_set_polarity((rdev), (hpd))
+#define radeon_gui_idle(rdev) (rdev)->asic->gui_idle((rdev))
+#define radeon_pm_misc(rdev) (rdev)->asic->pm_misc((rdev))
+#define radeon_pm_prepare(rdev) (rdev)->asic->pm_prepare((rdev))
+#define radeon_pm_finish(rdev) (rdev)->asic->pm_finish((rdev))
+#define radeon_pm_init_profile(rdev) (rdev)->asic->pm_init_profile((rdev))
+#define radeon_pm_get_dynpm_state(rdev) (rdev)->asic->pm_get_dynpm_state((rdev))
 
 /* Common functions */
 /* AGP */
@@ -1330,18 +1386,21 @@ extern void r600_rlc_stop(struct radeon_device *rdev);
 extern int r600_audio_init(struct radeon_device *rdev);
 extern int r600_audio_tmds_index(struct drm_encoder *encoder);
 extern void r600_audio_set_clock(struct drm_encoder *encoder, int clock);
+extern int r600_audio_channels(struct radeon_device *rdev);
+extern int r600_audio_bits_per_sample(struct radeon_device *rdev);
+extern int r600_audio_rate(struct radeon_device *rdev);
+extern uint8_t r600_audio_status_bits(struct radeon_device *rdev);
+extern uint8_t r600_audio_category_code(struct radeon_device *rdev);
+extern void r600_audio_schedule_polling(struct radeon_device *rdev);
+extern void r600_audio_enable_polling(struct drm_encoder *encoder);
+extern void r600_audio_disable_polling(struct drm_encoder *encoder);
 extern void r600_audio_fini(struct radeon_device *rdev);
 extern void r600_hdmi_init(struct drm_encoder *encoder);
 extern void r600_hdmi_enable(struct drm_encoder *encoder);
 extern void r600_hdmi_disable(struct drm_encoder *encoder);
 extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
 extern int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
-extern void r600_hdmi_update_audio_settings(struct drm_encoder *encoder,
-                                           int channels,
-                                           int rate,
-                                           int bps,
-                                           uint8_t status_bits,
-                                           uint8_t category_code);
+extern void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
 
 extern void r700_cp_stop(struct radeon_device *rdev);
 extern void r700_cp_fini(struct radeon_device *rdev);