diff options
author | Dave Airlie <airlied@redhat.com> | 2014-03-27 21:05:12 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-05-18 21:13:57 -0400 |
commit | 83c6620bae3f14adb2430fdcc367980fe3b7bee2 (patch) | |
tree | b7d9d9d1d70c2ae5fb5479bdd16b7f04d9282892 /drivers/gpu/drm/ast/ast_main.c | |
parent | 0e5ce92438146655d60447802d2c11bdbc089329 (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.c | 53 |
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 | ||
305 | int ast_driver_load(struct drm_device *dev, unsigned long flags) | 345 | int 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); |