aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/atom.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/atom.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atom.c90
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
851static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg) 845static 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
856static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg) 850static 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
861static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg) 855static 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
866static void atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg) 860static 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
1432int 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}