diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/atom.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/atom.c | 90 |
1 files changed, 26 insertions, 64 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c b/drivers/gpu/drm/amd/amdgpu/atom.c index 1b50e6c13fb3..d69aa2e179bb 100644 --- a/drivers/gpu/drm/amd/amdgpu/atom.c +++ b/drivers/gpu/drm/amd/amdgpu/atom.c | |||
@@ -166,7 +166,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
166 | case ATOM_IIO_END: | 166 | case ATOM_IIO_END: |
167 | return temp; | 167 | return temp; |
168 | default: | 168 | default: |
169 | printk(KERN_INFO "Unknown IIO opcode.\n"); | 169 | pr_info("Unknown IIO opcode\n"); |
170 | return 0; | 170 | return 0; |
171 | } | 171 | } |
172 | } | 172 | } |
@@ -190,22 +190,19 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr, | |||
190 | val = gctx->card->reg_read(gctx->card, idx); | 190 | val = gctx->card->reg_read(gctx->card, idx); |
191 | break; | 191 | break; |
192 | case ATOM_IO_PCI: | 192 | case ATOM_IO_PCI: |
193 | printk(KERN_INFO | 193 | pr_info("PCI registers are not implemented\n"); |
194 | "PCI registers are not implemented.\n"); | ||
195 | return 0; | 194 | return 0; |
196 | case ATOM_IO_SYSIO: | 195 | case ATOM_IO_SYSIO: |
197 | printk(KERN_INFO | 196 | pr_info("SYSIO registers are not implemented\n"); |
198 | "SYSIO registers are not implemented.\n"); | ||
199 | return 0; | 197 | return 0; |
200 | default: | 198 | default: |
201 | if (!(gctx->io_mode & 0x80)) { | 199 | if (!(gctx->io_mode & 0x80)) { |
202 | printk(KERN_INFO "Bad IO mode.\n"); | 200 | pr_info("Bad IO mode\n"); |
203 | return 0; | 201 | return 0; |
204 | } | 202 | } |
205 | if (!gctx->iio[gctx->io_mode & 0x7F]) { | 203 | if (!gctx->iio[gctx->io_mode & 0x7F]) { |
206 | printk(KERN_INFO | 204 | pr_info("Undefined indirect IO read method %d\n", |
207 | "Undefined indirect IO read method %d.\n", | 205 | gctx->io_mode & 0x7F); |
208 | gctx->io_mode & 0x7F); | ||
209 | return 0; | 206 | return 0; |
210 | } | 207 | } |
211 | val = | 208 | val = |
@@ -469,22 +466,19 @@ static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr, | |||
469 | gctx->card->reg_write(gctx->card, idx, val); | 466 | gctx->card->reg_write(gctx->card, idx, val); |
470 | break; | 467 | break; |
471 | case ATOM_IO_PCI: | 468 | case ATOM_IO_PCI: |
472 | printk(KERN_INFO | 469 | pr_info("PCI registers are not implemented\n"); |
473 | "PCI registers are not implemented.\n"); | ||
474 | return; | 470 | return; |
475 | case ATOM_IO_SYSIO: | 471 | case ATOM_IO_SYSIO: |
476 | printk(KERN_INFO | 472 | pr_info("SYSIO registers are not implemented\n"); |
477 | "SYSIO registers are not implemented.\n"); | ||
478 | return; | 473 | return; |
479 | default: | 474 | default: |
480 | if (!(gctx->io_mode & 0x80)) { | 475 | if (!(gctx->io_mode & 0x80)) { |
481 | printk(KERN_INFO "Bad IO mode.\n"); | 476 | pr_info("Bad IO mode\n"); |
482 | return; | 477 | return; |
483 | } | 478 | } |
484 | if (!gctx->iio[gctx->io_mode & 0xFF]) { | 479 | if (!gctx->iio[gctx->io_mode & 0xFF]) { |
485 | printk(KERN_INFO | 480 | pr_info("Undefined indirect IO write method %d\n", |
486 | "Undefined indirect IO write method %d.\n", | 481 | gctx->io_mode & 0x7F); |
487 | gctx->io_mode & 0x7F); | ||
488 | return; | 482 | return; |
489 | } | 483 | } |
490 | atom_iio_execute(gctx, gctx->iio[gctx->io_mode & 0xFF], | 484 | atom_iio_execute(gctx, gctx->iio[gctx->io_mode & 0xFF], |
@@ -850,17 +844,17 @@ static void atom_op_postcard(atom_exec_context *ctx, int *ptr, int arg) | |||
850 | 844 | ||
851 | static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg) | 845 | static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg) |
852 | { | 846 | { |
853 | printk(KERN_INFO "unimplemented!\n"); | 847 | pr_info("unimplemented!\n"); |
854 | } | 848 | } |
855 | 849 | ||
856 | static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg) | 850 | static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg) |
857 | { | 851 | { |
858 | printk(KERN_INFO "unimplemented!\n"); | 852 | pr_info("unimplemented!\n"); |
859 | } | 853 | } |
860 | 854 | ||
861 | static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg) | 855 | static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg) |
862 | { | 856 | { |
863 | printk(KERN_INFO "unimplemented!\n"); | 857 | pr_info("unimplemented!\n"); |
864 | } | 858 | } |
865 | 859 | ||
866 | static void atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg) | 860 | static void atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg) |
@@ -1023,7 +1017,7 @@ static void atom_op_switch(atom_exec_context *ctx, int *ptr, int arg) | |||
1023 | } | 1017 | } |
1024 | (*ptr) += 2; | 1018 | (*ptr) += 2; |
1025 | } else { | 1019 | } else { |
1026 | printk(KERN_INFO "Bad case.\n"); | 1020 | pr_info("Bad case\n"); |
1027 | return; | 1021 | return; |
1028 | } | 1022 | } |
1029 | (*ptr) += 2; | 1023 | (*ptr) += 2; |
@@ -1306,8 +1300,7 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios) | |||
1306 | struct atom_context *ctx = | 1300 | struct atom_context *ctx = |
1307 | kzalloc(sizeof(struct atom_context), GFP_KERNEL); | 1301 | kzalloc(sizeof(struct atom_context), GFP_KERNEL); |
1308 | char *str; | 1302 | char *str; |
1309 | char name[512]; | 1303 | u16 idx; |
1310 | int i; | ||
1311 | 1304 | ||
1312 | if (!ctx) | 1305 | if (!ctx) |
1313 | return NULL; | 1306 | return NULL; |
@@ -1316,14 +1309,14 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios) | |||
1316 | ctx->bios = bios; | 1309 | ctx->bios = bios; |
1317 | 1310 | ||
1318 | if (CU16(0) != ATOM_BIOS_MAGIC) { | 1311 | if (CU16(0) != ATOM_BIOS_MAGIC) { |
1319 | printk(KERN_INFO "Invalid BIOS magic.\n"); | 1312 | pr_info("Invalid BIOS magic\n"); |
1320 | kfree(ctx); | 1313 | kfree(ctx); |
1321 | return NULL; | 1314 | return NULL; |
1322 | } | 1315 | } |
1323 | if (strncmp | 1316 | if (strncmp |
1324 | (CSTR(ATOM_ATI_MAGIC_PTR), ATOM_ATI_MAGIC, | 1317 | (CSTR(ATOM_ATI_MAGIC_PTR), ATOM_ATI_MAGIC, |
1325 | strlen(ATOM_ATI_MAGIC))) { | 1318 | strlen(ATOM_ATI_MAGIC))) { |
1326 | printk(KERN_INFO "Invalid ATI magic.\n"); | 1319 | pr_info("Invalid ATI magic\n"); |
1327 | kfree(ctx); | 1320 | kfree(ctx); |
1328 | return NULL; | 1321 | return NULL; |
1329 | } | 1322 | } |
@@ -1332,7 +1325,7 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios) | |||
1332 | if (strncmp | 1325 | if (strncmp |
1333 | (CSTR(base + ATOM_ROM_MAGIC_PTR), ATOM_ROM_MAGIC, | 1326 | (CSTR(base + ATOM_ROM_MAGIC_PTR), ATOM_ROM_MAGIC, |
1334 | strlen(ATOM_ROM_MAGIC))) { | 1327 | strlen(ATOM_ROM_MAGIC))) { |
1335 | printk(KERN_INFO "Invalid ATOM magic.\n"); | 1328 | pr_info("Invalid ATOM magic\n"); |
1336 | kfree(ctx); | 1329 | kfree(ctx); |
1337 | return NULL; | 1330 | return NULL; |
1338 | } | 1331 | } |
@@ -1345,18 +1338,13 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios) | |||
1345 | return NULL; | 1338 | return NULL; |
1346 | } | 1339 | } |
1347 | 1340 | ||
1348 | str = CSTR(CU16(base + ATOM_ROM_MSG_PTR)); | 1341 | idx = CU16(ATOM_ROM_PART_NUMBER_PTR); |
1349 | while (*str && ((*str == '\n') || (*str == '\r'))) | 1342 | if (idx == 0) |
1350 | str++; | 1343 | idx = 0x80; |
1351 | /* name string isn't always 0 terminated */ | 1344 | |
1352 | for (i = 0; i < 511; i++) { | 1345 | str = CSTR(idx); |
1353 | name[i] = str[i]; | 1346 | if (*str != '\0') |
1354 | if (name[i] < '.' || name[i] > 'z') { | 1347 | pr_info("ATOM BIOS: %s\n", str); |
1355 | name[i] = 0; | ||
1356 | break; | ||
1357 | } | ||
1358 | } | ||
1359 | printk(KERN_INFO "ATOM BIOS: %s\n", name); | ||
1360 | 1348 | ||
1361 | return ctx; | 1349 | return ctx; |
1362 | } | 1350 | } |
@@ -1429,29 +1417,3 @@ bool amdgpu_atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * | |||
1429 | return true; | 1417 | return true; |
1430 | } | 1418 | } |
1431 | 1419 | ||
1432 | int amdgpu_atom_allocate_fb_scratch(struct atom_context *ctx) | ||
1433 | { | ||
1434 | int index = GetIndexIntoMasterTable(DATA, VRAM_UsageByFirmware); | ||
1435 | uint16_t data_offset; | ||
1436 | int usage_bytes = 0; | ||
1437 | struct _ATOM_VRAM_USAGE_BY_FIRMWARE *firmware_usage; | ||
1438 | |||
1439 | if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) { | ||
1440 | firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset); | ||
1441 | |||
1442 | DRM_DEBUG("atom firmware requested %08x %dkb\n", | ||
1443 | le32_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware), | ||
1444 | le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb)); | ||
1445 | |||
1446 | usage_bytes = le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb) * 1024; | ||
1447 | } | ||
1448 | ctx->scratch_size_bytes = 0; | ||
1449 | if (usage_bytes == 0) | ||
1450 | usage_bytes = 20 * 1024; | ||
1451 | /* allocate some scratch memory */ | ||
1452 | ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL); | ||
1453 | if (!ctx->scratch) | ||
1454 | return -ENOMEM; | ||
1455 | ctx->scratch_size_bytes = usage_bytes; | ||
1456 | return 0; | ||
1457 | } | ||