diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2012-05-14 10:52:29 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-05-17 07:15:40 -0400 |
| commit | 0783986ad7244e374dd5e86c650811bf4f01290d (patch) | |
| tree | 00200dcbca1c237b149d70aeb78d63eeb3c1ef41 | |
| parent | 1b9c3dd0220600391611637c2f04371dbc896e21 (diff) | |
drm/radeon/hdmi: store info about all AFMT blocks
Introduce special struct radeon_afmt for this purpose.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_reg.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 91 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 9 |
5 files changed, 106 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/r600_reg.h b/drivers/gpu/drm/radeon/r600_reg.h index c44304ad8bda..2b960cb5c18a 100644 --- a/drivers/gpu/drm/radeon/r600_reg.h +++ b/drivers/gpu/drm/radeon/r600_reg.h | |||
| @@ -156,4 +156,10 @@ | |||
| 156 | #define R600_AUDIO_PIN_WIDGET_CNTL 0x73d4 | 156 | #define R600_AUDIO_PIN_WIDGET_CNTL 0x73d4 |
| 157 | #define R600_AUDIO_STATUS_BITS 0x73d8 | 157 | #define R600_AUDIO_STATUS_BITS 0x73d8 |
| 158 | 158 | ||
| 159 | #define DCE2_HDMI_OFFSET0 (0x7400 - 0x7400) | ||
| 160 | #define DCE2_HDMI_OFFSET1 (0x7700 - 0x7400) | ||
| 161 | /* DCE3.2 second instance starts at 0x7800 */ | ||
| 162 | #define DCE3_HDMI_OFFSET0 (0x7400 - 0x7400) | ||
| 163 | #define DCE3_HDMI_OFFSET1 (0x7800 - 0x7400) | ||
| 164 | |||
| 159 | #endif | 165 | #endif |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index a9652be93b66..15bd3b216243 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -1057,12 +1057,6 @@ | |||
| 1057 | # define AFMT_AZ_FORMAT_WTRIG_ACK (1 << 29) | 1057 | # define AFMT_AZ_FORMAT_WTRIG_ACK (1 << 29) |
| 1058 | # define AFMT_AZ_AUDIO_ENABLE_CHG_ACK (1 << 30) | 1058 | # define AFMT_AZ_AUDIO_ENABLE_CHG_ACK (1 << 30) |
| 1059 | 1059 | ||
| 1060 | #define DCE2_HDMI_OFFSET0 (0x7400 - 0x7400) | ||
| 1061 | #define DCE2_HDMI_OFFSET1 (0x7700 - 0x7400) | ||
| 1062 | /* DCE3.2 second instance starts at 0x7800 */ | ||
| 1063 | #define DCE3_HDMI_OFFSET0 (0x7400 - 0x7400) | ||
| 1064 | #define DCE3_HDMI_OFFSET1 (0x7800 - 0x7400) | ||
| 1065 | |||
| 1066 | /* | 1060 | /* |
| 1067 | * PM4 | 1061 | * PM4 |
| 1068 | */ | 1062 | */ |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 05a4e15f5465..ef9ccb4def4d 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -364,7 +364,6 @@ int r600_audio_rate(struct radeon_device *rdev); | |||
| 364 | uint8_t r600_audio_status_bits(struct radeon_device *rdev); | 364 | uint8_t r600_audio_status_bits(struct radeon_device *rdev); |
| 365 | uint8_t r600_audio_category_code(struct radeon_device *rdev); | 365 | uint8_t r600_audio_category_code(struct radeon_device *rdev); |
| 366 | void r600_audio_fini(struct radeon_device *rdev); | 366 | void r600_audio_fini(struct radeon_device *rdev); |
| 367 | void r600_hdmi_init(struct drm_encoder *encoder); | ||
| 368 | int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder); | 367 | int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder); |
| 369 | void r600_hdmi_update_audio_settings(struct drm_encoder *encoder); | 368 | void r600_hdmi_update_audio_settings(struct drm_encoder *encoder); |
| 370 | /* r600 blit */ | 369 | /* r600 blit */ |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 0c6d63bf6f95..da3fe8a68f8d 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -1225,6 +1225,93 @@ void radeon_update_display_priority(struct radeon_device *rdev) | |||
| 1225 | 1225 | ||
| 1226 | } | 1226 | } |
| 1227 | 1227 | ||
| 1228 | /* | ||
| 1229 | * Allocate hdmi structs and determine register offsets | ||
| 1230 | */ | ||
| 1231 | static void radeon_afmt_init(struct radeon_device *rdev) | ||
| 1232 | { | ||
| 1233 | int i; | ||
| 1234 | |||
| 1235 | for (i = 0; i < RADEON_MAX_AFMT_BLOCKS; i++) | ||
| 1236 | rdev->mode_info.afmt[i] = NULL; | ||
| 1237 | |||
| 1238 | if (ASIC_IS_DCE6(rdev)) { | ||
| 1239 | /* todo */ | ||
| 1240 | } else if (ASIC_IS_DCE4(rdev)) { | ||
| 1241 | /* DCE4/5 has 6 audio blocks tied to DIG encoders */ | ||
| 1242 | /* DCE4.1 has 2 audio blocks tied to DIG encoders */ | ||
| 1243 | rdev->mode_info.afmt[0] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1244 | if (rdev->mode_info.afmt[0]) { | ||
| 1245 | rdev->mode_info.afmt[0]->offset = EVERGREEN_CRTC0_REGISTER_OFFSET; | ||
| 1246 | rdev->mode_info.afmt[0]->id = 0; | ||
| 1247 | } | ||
| 1248 | rdev->mode_info.afmt[1] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1249 | if (rdev->mode_info.afmt[1]) { | ||
| 1250 | rdev->mode_info.afmt[1]->offset = EVERGREEN_CRTC1_REGISTER_OFFSET; | ||
| 1251 | rdev->mode_info.afmt[1]->id = 1; | ||
| 1252 | } | ||
| 1253 | if (!ASIC_IS_DCE41(rdev)) { | ||
| 1254 | rdev->mode_info.afmt[2] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1255 | if (rdev->mode_info.afmt[2]) { | ||
| 1256 | rdev->mode_info.afmt[2]->offset = EVERGREEN_CRTC2_REGISTER_OFFSET; | ||
| 1257 | rdev->mode_info.afmt[2]->id = 2; | ||
| 1258 | } | ||
| 1259 | rdev->mode_info.afmt[3] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1260 | if (rdev->mode_info.afmt[3]) { | ||
| 1261 | rdev->mode_info.afmt[3]->offset = EVERGREEN_CRTC3_REGISTER_OFFSET; | ||
| 1262 | rdev->mode_info.afmt[3]->id = 3; | ||
| 1263 | } | ||
| 1264 | rdev->mode_info.afmt[4] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1265 | if (rdev->mode_info.afmt[4]) { | ||
| 1266 | rdev->mode_info.afmt[4]->offset = EVERGREEN_CRTC4_REGISTER_OFFSET; | ||
| 1267 | rdev->mode_info.afmt[4]->id = 4; | ||
| 1268 | } | ||
| 1269 | rdev->mode_info.afmt[5] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1270 | if (rdev->mode_info.afmt[5]) { | ||
| 1271 | rdev->mode_info.afmt[5]->offset = EVERGREEN_CRTC5_REGISTER_OFFSET; | ||
| 1272 | rdev->mode_info.afmt[5]->id = 5; | ||
| 1273 | } | ||
| 1274 | } | ||
| 1275 | } else if (ASIC_IS_DCE3(rdev)) { | ||
| 1276 | /* DCE3.x has 2 audio blocks tied to DIG encoders */ | ||
| 1277 | rdev->mode_info.afmt[0] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1278 | if (rdev->mode_info.afmt[0]) { | ||
| 1279 | rdev->mode_info.afmt[0]->offset = DCE3_HDMI_OFFSET0; | ||
| 1280 | rdev->mode_info.afmt[0]->id = 0; | ||
| 1281 | } | ||
| 1282 | rdev->mode_info.afmt[1] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1283 | if (rdev->mode_info.afmt[1]) { | ||
| 1284 | rdev->mode_info.afmt[1]->offset = DCE3_HDMI_OFFSET1; | ||
| 1285 | rdev->mode_info.afmt[1]->id = 1; | ||
| 1286 | } | ||
| 1287 | } else if (ASIC_IS_DCE2(rdev)) { | ||
| 1288 | /* DCE2 has at least 1 routable audio block */ | ||
| 1289 | rdev->mode_info.afmt[0] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1290 | if (rdev->mode_info.afmt[0]) { | ||
| 1291 | rdev->mode_info.afmt[0]->offset = DCE2_HDMI_OFFSET0; | ||
| 1292 | rdev->mode_info.afmt[0]->id = 0; | ||
| 1293 | } | ||
| 1294 | /* r6xx has 2 routable audio blocks */ | ||
| 1295 | if (rdev->family >= CHIP_R600) { | ||
| 1296 | rdev->mode_info.afmt[1] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); | ||
| 1297 | if (rdev->mode_info.afmt[1]) { | ||
| 1298 | rdev->mode_info.afmt[1]->offset = DCE2_HDMI_OFFSET1; | ||
| 1299 | rdev->mode_info.afmt[1]->id = 1; | ||
| 1300 | } | ||
| 1301 | } | ||
| 1302 | } | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | static void radeon_afmt_fini(struct radeon_device *rdev) | ||
| 1306 | { | ||
| 1307 | int i; | ||
| 1308 | |||
| 1309 | for (i = 0; i < RADEON_MAX_AFMT_BLOCKS; i++) { | ||
| 1310 | kfree(rdev->mode_info.afmt[i]); | ||
| 1311 | rdev->mode_info.afmt[i] = NULL; | ||
| 1312 | } | ||
| 1313 | } | ||
| 1314 | |||
| 1228 | int radeon_modeset_init(struct radeon_device *rdev) | 1315 | int radeon_modeset_init(struct radeon_device *rdev) |
| 1229 | { | 1316 | { |
| 1230 | int i; | 1317 | int i; |
| @@ -1285,6 +1372,9 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
| 1285 | /* initialize hpd */ | 1372 | /* initialize hpd */ |
| 1286 | radeon_hpd_init(rdev); | 1373 | radeon_hpd_init(rdev); |
| 1287 | 1374 | ||
| 1375 | /* setup afmt */ | ||
| 1376 | radeon_afmt_init(rdev); | ||
| 1377 | |||
| 1288 | /* Initialize power management */ | 1378 | /* Initialize power management */ |
| 1289 | radeon_pm_init(rdev); | 1379 | radeon_pm_init(rdev); |
| 1290 | 1380 | ||
| @@ -1301,6 +1391,7 @@ void radeon_modeset_fini(struct radeon_device *rdev) | |||
| 1301 | radeon_pm_fini(rdev); | 1391 | radeon_pm_fini(rdev); |
| 1302 | 1392 | ||
| 1303 | if (rdev->mode_info.mode_config_initialized) { | 1393 | if (rdev->mode_info.mode_config_initialized) { |
| 1394 | radeon_afmt_fini(rdev); | ||
| 1304 | drm_kms_helper_poll_fini(rdev->ddev); | 1395 | drm_kms_helper_poll_fini(rdev->ddev); |
| 1305 | radeon_hpd_fini(rdev); | 1396 | radeon_hpd_fini(rdev); |
| 1306 | drm_mode_config_cleanup(rdev->ddev); | 1397 | drm_mode_config_cleanup(rdev->ddev); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 499a5fed8b26..9583e953d30b 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -220,12 +220,20 @@ enum radeon_dvo_chip { | |||
| 220 | 220 | ||
| 221 | struct radeon_fbdev; | 221 | struct radeon_fbdev; |
| 222 | 222 | ||
| 223 | struct radeon_afmt { | ||
| 224 | bool enabled; | ||
