aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-05-14 10:52:29 -0400
committerDave Airlie <airlied@redhat.com>2012-05-17 07:15:40 -0400
commit0783986ad7244e374dd5e86c650811bf4f01290d (patch)
tree00200dcbca1c237b149d70aeb78d63eeb3c1ef41 /drivers/gpu
parent1b9c3dd0220600391611637c2f04371dbc896e21 (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>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/r600_reg.h6
-rw-r--r--drivers/gpu/drm/radeon/r600d.h6
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c91
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h9
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);
364uint8_t r600_audio_status_bits(struct radeon_device *rdev); 364uint8_t r600_audio_status_bits(struct radeon_device *rdev);
365uint8_t r600_audio_category_code(struct radeon_device *rdev); 365uint8_t r600_audio_category_code(struct radeon_device *rdev);
366void r600_audio_fini(struct radeon_device *rdev); 366void r600_audio_fini(struct radeon_device *rdev);
367void r600_hdmi_init(struct drm_encoder *encoder);
368int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder); 367int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
369void r600_hdmi_update_audio_settings(struct drm_encoder *encoder); 368void 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 */
1231static 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
1305static 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
1228int radeon_modeset_init(struct radeon_device *rdev) 1315int 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
221struct radeon_fbdev; 221struct radeon_fbdev;
222 222
223struct radeon_afmt {
224 bool enabled;
225 int offset;
226 bool last_buffer_filled_status;
227 int id;
228};
229
223struct radeon_mode_info { 230struct 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
369struct radeon_encoder_atom_dac { 378struct radeon_encoder_atom_dac {