aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ast/ast_main.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-03-27 21:05:12 -0400
committerDave Airlie <airlied@redhat.com>2014-05-18 21:13:57 -0400
commit83c6620bae3f14adb2430fdcc367980fe3b7bee2 (patch)
treeb7d9d9d1d70c2ae5fb5479bdd16b7f04d9282892 /drivers/gpu/drm/ast/ast_main.c
parent0e5ce92438146655d60447802d2c11bdbc089329 (diff)
drm/ast: initial DP501 support (v0.2)
This is the initial attempt at porting the DP501 code from the userspace driver, the firmware file is in http://people.freedesktop.org/~airlied/ast_dp501_fw.bin this should really be exposed as another encoder/connector that is cloneable v0.2: init 3rd tx properly, add scratch reduction of VRAM size backup firmware properly. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/ast/ast_main.c')
-rw-r--r--drivers/gpu/drm/ast/ast_main.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
index 01ea4b6d4bf3..1124fb40758e 100644
--- a/drivers/gpu/drm/ast/ast_main.c
+++ b/drivers/gpu/drm/ast/ast_main.c
@@ -136,6 +136,31 @@ static int ast_detect_chip(struct drm_device *dev)
136 break; 136 break;
137 } 137 }
138 138
139 ast->tx_chip_type = AST_TX_NONE;
140 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xff);
141 if (jreg & 0x80)
142 ast->tx_chip_type = AST_TX_SIL164;
143 if ((ast->chip == AST2300) || (ast->chip == AST2400)) {
144 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
145 switch (jreg) {
146 case 0x04:
147 ast->tx_chip_type = AST_TX_SIL164;
148 break;
149 case 0x08:
150 ast->dp501_fw_addr = kzalloc(32*1024, GFP_KERNEL);
151 if (ast->dp501_fw_addr) {
152 /* backup firmware */
153 if (ast_backup_fw(dev, ast->dp501_fw_addr, 32*1024)) {
154 kfree(ast->dp501_fw_addr);
155 ast->dp501_fw_addr = NULL;
156 }
157 }
158 /* fallthrough */
159 case 0x0c:
160 ast->tx_chip_type = AST_TX_DP501;
161 }
162 }
163
139 return 0; 164 return 0;
140} 165}
141 166
@@ -289,17 +314,32 @@ static u32 ast_get_vram_info(struct drm_device *dev)
289{ 314{
290 struct ast_private *ast = dev->dev_private; 315 struct ast_private *ast = dev->dev_private;
291 u8 jreg; 316 u8 jreg;
292 317 u32 vram_size;
293 ast_open_key(ast); 318 ast_open_key(ast);
294 319
320 vram_size = AST_VIDMEM_DEFAULT_SIZE;
295 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xaa, 0xff); 321 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xaa, 0xff);
296 switch (jreg & 3) { 322 switch (jreg & 3) {
297 case 0: return AST_VIDMEM_SIZE_8M; 323 case 0: vram_size = AST_VIDMEM_SIZE_8M; break;
298 case 1: return AST_VIDMEM_SIZE_16M; 324 case 1: vram_size = AST_VIDMEM_SIZE_16M; break;
299 case 2: return AST_VIDMEM_SIZE_32M; 325 case 2: vram_size = AST_VIDMEM_SIZE_32M; break;
300 case 3: return AST_VIDMEM_SIZE_64M; 326 case 3: vram_size = AST_VIDMEM_SIZE_64M; break;
301 } 327 }
302 return AST_VIDMEM_DEFAULT_SIZE; 328
329 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x99, 0xff);
330 switch (jreg & 0x03) {
331 case 1:
332 vram_size -= 0x100000;
333 break;
334 case 2:
335 vram_size -= 0x200000;
336 break;
337 case 3:
338 vram_size -= 0x400000;
339 break;
340 }
341
342 return vram_size;
303} 343}
304 344
305int ast_driver_load(struct drm_device *dev, unsigned long flags) 345int ast_driver_load(struct drm_device *dev, unsigned long flags)
@@ -376,6 +416,7 @@ int ast_driver_unload(struct drm_device *dev)
376{ 416{
377 struct ast_private *ast = dev->dev_private; 417 struct ast_private *ast = dev->dev_private;
378 418
419 kfree(ast->dp501_fw_addr);
379 ast_mode_fini(dev); 420 ast_mode_fini(dev);
380 ast_fbdev_fini(dev); 421 ast_fbdev_fini(dev);
381 drm_mode_config_cleanup(dev); 422 drm_mode_config_cleanup(dev);