]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / drivers / gpu / drm / amd / amdgpu / dce_v11_0.c
index 367739bd19279fa5f968675b54733bad289b65e0..a7af5b33a5e30e1279619c096295e12e415acafe 100644 (file)
@@ -31,6 +31,7 @@
 #include "atombios_encoders.h"
 #include "amdgpu_pll.h"
 #include "amdgpu_connectors.h"
+#include "dce_v11_0.h"
 
 #include "dce/dce_11_0_d.h"
 #include "dce/dce_11_0_sh_mask.h"
@@ -166,6 +167,7 @@ static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
                                                 (const u32)ARRAY_SIZE(stoney_golden_settings_a11));
                break;
        case CHIP_POLARIS11:
+       case CHIP_POLARIS12:
                amdgpu_program_register_sequence(adev,
                                                 polaris11_golden_settings_a11,
                                                 (const u32)ARRAY_SIZE(polaris11_golden_settings_a11));
@@ -346,33 +348,12 @@ static int dce_v11_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
 static bool dce_v11_0_hpd_sense(struct amdgpu_device *adev,
                               enum amdgpu_hpd_id hpd)
 {
-       int idx;
        bool connected = false;
 
-       switch (hpd) {
-       case AMDGPU_HPD_1:
-               idx = 0;
-               break;
-       case AMDGPU_HPD_2:
-               idx = 1;
-               break;
-       case AMDGPU_HPD_3:
-               idx = 2;
-               break;
-       case AMDGPU_HPD_4:
-               idx = 3;
-               break;
-       case AMDGPU_HPD_5:
-               idx = 4;
-               break;
-       case AMDGPU_HPD_6:
-               idx = 5;
-               break;
-       default:
+       if (hpd >= adev->mode_info.num_hpd)
                return connected;
-       }
 
-       if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[idx]) &
+       if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[hpd]) &
            DC_HPD_INT_STATUS__DC_HPD_SENSE_MASK)
                connected = true;
 
@@ -392,37 +373,16 @@ static void dce_v11_0_hpd_set_polarity(struct amdgpu_device *adev,
 {
        u32 tmp;
        bool connected = dce_v11_0_hpd_sense(adev, hpd);
-       int idx;
 
-       switch (hpd) {
-       case AMDGPU_HPD_1:
-               idx = 0;
-               break;
-       case AMDGPU_HPD_2:
-               idx = 1;
-               break;
-       case AMDGPU_HPD_3:
-               idx = 2;
-               break;
-       case AMDGPU_HPD_4:
-               idx = 3;
-               break;
-       case AMDGPU_HPD_5:
-               idx = 4;
-               break;
-       case AMDGPU_HPD_6:
-               idx = 5;
-               break;
-       default:
+       if (hpd >= adev->mode_info.num_hpd)
                return;
-       }
 
-       tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]);
+       tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]);
        if (connected)
                tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 0);
        else
                tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 1);
-       WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp);
+       WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp);
 }
 
 /**
@@ -438,33 +398,12 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
        struct drm_device *dev = adev->ddev;
        struct drm_connector *connector;
        u32 tmp;
-       int idx;
 
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
-               switch (amdgpu_connector->hpd.hpd) {
-               case AMDGPU_HPD_1:
-                       idx = 0;
-                       break;
-               case AMDGPU_HPD_2:
-                       idx = 1;
-                       break;
-               case AMDGPU_HPD_3:
-                       idx = 2;
-                       break;
-               case AMDGPU_HPD_4:
-                       idx = 3;
-                       break;
-               case AMDGPU_HPD_5:
-                       idx = 4;
-                       break;
-               case AMDGPU_HPD_6:
-                       idx = 5;
-                       break;
-               default:
+               if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
                        continue;
-               }
 
                if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
                    connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
@@ -473,24 +412,24 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
                         * https://bugzilla.redhat.com/show_bug.cgi?id=726143
                         * also avoid interrupt storms during dpms.
                         */
-                       tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]);
+                       tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
                        tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
-                       WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp);
+                       WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
                        continue;
                }
 
-               tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]);
+               tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
                tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1);
-               WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
+               WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
 
-               tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx]);
+               tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd]);
                tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL,
                                    DC_HPD_CONNECT_INT_DELAY,
                                    AMDGPU_HPD_CONNECT_INT_DELAY_IN_MS);
                tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL,
                                    DC_HPD_DISCONNECT_INT_DELAY,
                                    AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
-               WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx], tmp);
+               WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
 
                dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
                amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
@@ -510,37 +449,16 @@ static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
        struct drm_device *dev = adev->ddev;
        struct drm_connector *connector;
        u32 tmp;
-       int idx;
 
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
-               switch (amdgpu_connector->hpd.hpd) {
-               case AMDGPU_HPD_1:
-                       idx = 0;
-                       break;
-               case AMDGPU_HPD_2:
-                       idx = 1;
-                       break;
-               case AMDGPU_HPD_3:
-                       idx = 2;
-                       break;
-               case AMDGPU_HPD_4:
-                       idx = 3;
-                       break;
-               case AMDGPU_HPD_5:
-                       idx = 4;
-                       break;
-               case AMDGPU_HPD_6:
-                       idx = 5;
-                       break;
-               default:
+               if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
                        continue;
-               }
 
-               tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]);
+               tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
                tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 0);
-               WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
+               WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
 
                amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
        }
@@ -691,6 +609,7 @@ static int dce_v11_0_get_num_crtc (struct amdgpu_device *adev)
                num_crtc = 6;
                break;
        case CHIP_POLARIS11:
+       case CHIP_POLARIS12:
                num_crtc = 5;
                break;
        default:
@@ -1672,6 +1591,7 @@ static int dce_v11_0_audio_init(struct amdgpu_device *adev)
                adev->mode_info.audio.num_pins = 8;
                break;
        case CHIP_POLARIS11:
+       case CHIP_POLARIS12:
                adev->mode_info.audio.num_pins = 6;
                break;
        default:
@@ -2096,7 +2016,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
        u32 tmp, viewport_w, viewport_h;
        int r;
        bool bypass_lut = false;
-       char *format_name;
+       struct drm_format_name_buf format_name;
 
        /* no fb bound */
        if (!atomic && !crtc->primary->fb) {
@@ -2208,9 +2128,8 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
                bypass_lut = true;
                break;
        default:
-               format_name = drm_get_format_name(target_fb->pixel_format);
-               DRM_ERROR("Unsupported screen format %s\n", format_name);
-               kfree(format_name);
+               DRM_ERROR("Unsupported screen format %s\n",
+                         drm_get_format_name(target_fb->pixel_format, &format_name));
                return -EINVAL;
        }
 
@@ -2472,7 +2391,8 @@ static u32 dce_v11_0_pick_pll(struct drm_crtc *crtc)
        int pll;
 
        if ((adev->asic_type == CHIP_POLARIS10) ||
-           (adev->asic_type == CHIP_POLARIS11)) {
+           (adev->asic_type == CHIP_POLARIS11) ||
+           (adev->asic_type == CHIP_POLARIS12)) {
                struct amdgpu_encoder *amdgpu_encoder =
                        to_amdgpu_encoder(amdgpu_crtc->encoder);
                struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
@@ -2593,6 +2513,9 @@ static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,
        struct amdgpu_device *adev = crtc->dev->dev_private;
        int xorigin = 0, yorigin = 0;
 
+       amdgpu_crtc->cursor_x = x;
+       amdgpu_crtc->cursor_y = y;
+
        /* avivo cursor are offset into the total surface */
        x += crtc->x;
        y += crtc->y;
@@ -2612,9 +2535,6 @@ static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,
        WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset,
               ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
 
-       amdgpu_crtc->cursor_x = x;
-       amdgpu_crtc->cursor_y = y;
-
        return 0;
 }
 
@@ -2677,12 +2597,11 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,
                return ret;
        }
 
-       amdgpu_crtc->cursor_width = width;
-       amdgpu_crtc->cursor_height = height;
-
        dce_v11_0_lock_cursor(crtc, true);
 
-       if (hot_x != amdgpu_crtc->cursor_hot_x ||
+       if (width != amdgpu_crtc->cursor_width ||
+           height != amdgpu_crtc->cursor_height ||
+           hot_x != amdgpu_crtc->cursor_hot_x ||
            hot_y != amdgpu_crtc->cursor_hot_y) {
                int x, y;
 
@@ -2691,6 +2610,8 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,
 
                dce_v11_0_cursor_move_locked(crtc, x, y);
 
+               amdgpu_crtc->cursor_width = width;
+               amdgpu_crtc->cursor_height = height;
                amdgpu_crtc->cursor_hot_x = hot_x;
                amdgpu_crtc->cursor_hot_y = hot_y;
        }
@@ -2897,7 +2818,8 @@ static int dce_v11_0_crtc_mode_set(struct drm_crtc *crtc,
                return -EINVAL;
 
        if ((adev->asic_type == CHIP_POLARIS10) ||
-           (adev->asic_type == CHIP_POLARIS11)) {
+           (adev->asic_type == CHIP_POLARIS11) ||
+           (adev->asic_type == CHIP_POLARIS12)) {
                struct amdgpu_encoder *amdgpu_encoder =
                        to_amdgpu_encoder(amdgpu_crtc->encoder);
                int encoder_mode =
@@ -3067,6 +2989,7 @@ static int dce_v11_0_early_init(void *handle)
                adev->mode_info.num_dig = 6;
                break;
        case CHIP_POLARIS11:
+       case CHIP_POLARIS12:
                adev->mode_info.num_hpd = 5;
                adev->mode_info.num_dig = 5;
                break;
@@ -3176,7 +3099,8 @@ static int dce_v11_0_hw_init(void *handle)
        amdgpu_atombios_crtc_powergate_init(adev);
        amdgpu_atombios_encoder_init_dig(adev);
        if ((adev->asic_type == CHIP_POLARIS10) ||
-           (adev->asic_type == CHIP_POLARIS11)) {
+           (adev->asic_type == CHIP_POLARIS11) ||
+           (adev->asic_type == CHIP_POLARIS12)) {
                amdgpu_atombios_crtc_set_dce_clock(adev, adev->clock.default_dispclk,
                                                   DCE_CLOCK_TYPE_DISPCLK, ATOM_GCK_DFS);
                amdgpu_atombios_crtc_set_dce_clock(adev, 0,
@@ -3605,7 +3529,7 @@ static int dce_v11_0_set_powergating_state(void *handle,
        return 0;
 }
 
-const struct amd_ip_funcs dce_v11_0_ip_funcs = {
+static const struct amd_ip_funcs dce_v11_0_ip_funcs = {
        .name = "dce_v11_0",
        .early_init = dce_v11_0_early_init,
        .late_init = NULL,
@@ -3889,7 +3813,6 @@ static const struct amdgpu_display_funcs dce_v11_0_display_funcs = {
        .bandwidth_update = &dce_v11_0_bandwidth_update,
        .vblank_get_counter = &dce_v11_0_vblank_get_counter,
        .vblank_wait = &dce_v11_0_vblank_wait,
-       .is_display_hung = &dce_v11_0_is_display_hung,
        .backlight_set_level = &amdgpu_atombios_encoder_set_backlight_level,
        .backlight_get_level = &amdgpu_atombios_encoder_get_backlight_level,
        .hpd_sense = &dce_v11_0_hpd_sense,
@@ -3935,3 +3858,21 @@ static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev)
        adev->hpd_irq.num_types = AMDGPU_HPD_LAST;
        adev->hpd_irq.funcs = &dce_v11_0_hpd_irq_funcs;
 }
+
+const struct amdgpu_ip_block_version dce_v11_0_ip_block =
+{
+       .type = AMD_IP_BLOCK_TYPE_DCE,
+       .major = 11,
+       .minor = 0,
+       .rev = 0,
+       .funcs = &dce_v11_0_ip_funcs,
+};
+
+const struct amdgpu_ip_block_version dce_v11_2_ip_block =
+{
+       .type = AMD_IP_BLOCK_TYPE_DCE,
+       .major = 11,
+       .minor = 2,
+       .rev = 0,
+       .funcs = &dce_v11_0_ip_funcs,
+};