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; | ||
225 | int offset; | ||
226 | bool last_buffer_filled_status; | ||
227 | int id; | ||
228 | }; | ||
229 | |||
223 | struct radeon_mode_info { | 230 | struct radeon_mode_info { |
224 | struct atom_context *atom_context; | 231 | struct atom_context *atom_context; |
225 | struct card_info *atom_card_info; | 232 | struct card_info *atom_card_info; |
226 | enum radeon_connector_table connector_table; | 233 | enum radeon_connector_table connector_table; |
227 | bool mode_config_initialized; | 234 | bool mode_config_initialized; |
228 | struct radeon_crtc *crtcs[6]; | 235 | struct radeon_crtc *crtcs[6]; |
236 | struct radeon_afmt *afmt[6]; | ||
229 | /* DVI-I properties */ | 237 | /* DVI-I properties */ |
230 | struct drm_property *coherent_mode_property; | 238 | struct drm_property *coherent_mode_property; |
231 | /* DAC enable load detect */ | 239 | /* DAC enable load detect */ |
@@ -364,6 +372,7 @@ struct radeon_encoder_atom_dig { | |||
364 | int dpms_mode; | 372 | int dpms_mode; |
365 | uint8_t backlight_level; | 373 | uint8_t backlight_level; |
366 | int panel_mode; | 374 | int panel_mode; |
375 | struct radeon_afmt *afmt; | ||
367 | }; | 376 | }; |
368 | 377 | ||
369 | struct radeon_encoder_atom_dac { | 378 | struct radeon_encoder_atom_dac { |