diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/atom.c')
-rw-r--r-- | drivers/gpu/drm/radeon/atom.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index d67c42555ab9..6578d19dff93 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
@@ -263,10 +263,10 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr, | |||
263 | case ATOM_ARG_FB: | 263 | case ATOM_ARG_FB: |
264 | idx = U8(*ptr); | 264 | idx = U8(*ptr); |
265 | (*ptr)++; | 265 | (*ptr)++; |
266 | val = gctx->scratch[((gctx->fb_base + idx) / 4)]; | ||
266 | if (print) | 267 | if (print) |
267 | DEBUG("FB[0x%02X]", idx); | 268 | DEBUG("FB[0x%02X]", idx); |
268 | printk(KERN_INFO "FB access is not implemented.\n"); | 269 | break; |
269 | return 0; | ||
270 | case ATOM_ARG_IMM: | 270 | case ATOM_ARG_IMM: |
271 | switch (align) { | 271 | switch (align) { |
272 | case ATOM_SRC_DWORD: | 272 | case ATOM_SRC_DWORD: |
@@ -488,9 +488,9 @@ static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr, | |||
488 | case ATOM_ARG_FB: | 488 | case ATOM_ARG_FB: |
489 | idx = U8(*ptr); | 489 | idx = U8(*ptr); |
490 | (*ptr)++; | 490 | (*ptr)++; |
491 | gctx->scratch[((gctx->fb_base + idx) / 4)] = val; | ||
491 | DEBUG("FB[0x%02X]", idx); | 492 | DEBUG("FB[0x%02X]", idx); |
492 | printk(KERN_INFO "FB access is not implemented.\n"); | 493 | break; |
493 | return; | ||
494 | case ATOM_ARG_PLL: | 494 | case ATOM_ARG_PLL: |
495 | idx = U8(*ptr); | 495 | idx = U8(*ptr); |
496 | (*ptr)++; | 496 | (*ptr)++; |
@@ -1214,3 +1214,28 @@ void atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * frev, | |||
1214 | *crev = CU8(idx + 3); | 1214 | *crev = CU8(idx + 3); |
1215 | return; | 1215 | return; |
1216 | } | 1216 | } |
1217 | |||
1218 | int atom_allocate_fb_scratch(struct atom_context *ctx) | ||
1219 | { | ||
1220 | int index = GetIndexIntoMasterTable(DATA, VRAM_UsageByFirmware); | ||
1221 | uint16_t data_offset; | ||
1222 | int usage_bytes; | ||
1223 | struct _ATOM_VRAM_USAGE_BY_FIRMWARE *firmware_usage; | ||
1224 | |||
1225 | atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset); | ||
1226 | |||
1227 | firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset); | ||
1228 | |||
1229 | DRM_DEBUG("atom firmware requested %08x %dkb\n", | ||
1230 | firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware, | ||
1231 | firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb); | ||
1232 | |||
1233 | usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024; | ||
1234 | if (usage_bytes == 0) | ||
1235 | usage_bytes = 20 * 1024; | ||
1236 | /* allocate some scratch memory */ | ||
1237 | ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL); | ||
1238 | if (!ctx->scratch) | ||
1239 | return -ENOMEM; | ||
1240 | return 0; | ||
1241 | } | ||