aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/atom.c
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2010-03-18 01:04:01 -0400
committerDave Airlie <airlied@redhat.com>2010-03-30 23:11:29 -0400
commita084e6ee6e64a76f1a9665d527203cdab7d6048f (patch)
treeebc1f90b7111b39bee17ff3f1e2ee02452dc1bf7 /drivers/gpu/drm/radeon/atom.c
parentc1bcad9d16831859373d8f579fa1e146409f9960 (diff)
drm/radeon/kms/atom: make sure tables are valid (v2)
Check that atom cmd and data tables are valid before using them. (v2) - fix some whitespace errors noticed by Rafał Miłecki - check a few more cases Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/atom.c')
-rw-r--r--drivers/gpu/drm/radeon/atom.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
index b7fe660985c..247f8ee7e94 100644
--- a/drivers/gpu/drm/radeon/atom.c
+++ b/drivers/gpu/drm/radeon/atom.c
@@ -1295,12 +1295,16 @@ void atom_destroy(struct atom_context *ctx)
1295 kfree(ctx); 1295 kfree(ctx);
1296} 1296}
1297 1297
1298void atom_parse_data_header(struct atom_context *ctx, int index, 1298bool atom_parse_data_header(struct atom_context *ctx, int index,
1299 uint16_t * size, uint8_t * frev, uint8_t * crev, 1299 uint16_t * size, uint8_t * frev, uint8_t * crev,
1300 uint16_t * data_start) 1300 uint16_t * data_start)
1301{ 1301{
1302 int offset = index * 2 + 4; 1302 int offset = index * 2 + 4;
1303 int idx = CU16(ctx->data_table + offset); 1303 int idx = CU16(ctx->data_table + offset);
1304 u16 *mdt = (u16 *)(ctx->bios + ctx->data_table + 4);
1305
1306 if (!mdt[index])
1307 return false;
1304 1308
1305 if (size) 1309 if (size)
1306 *size = CU16(idx); 1310 *size = CU16(idx);
@@ -1309,38 +1313,42 @@ void atom_parse_data_header(struct atom_context *ctx, int index,
1309 if (crev) 1313 if (crev)
1310 *crev = CU8(idx + 3); 1314 *crev = CU8(idx + 3);
1311 *data_start = idx; 1315 *data_start = idx;
1312 return; 1316 return true;
1313} 1317}
1314 1318
1315void atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * frev, 1319bool atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * frev,
1316 uint8_t * crev) 1320 uint8_t * crev)
1317{ 1321{
1318 int offset = index * 2 + 4; 1322 int offset = index * 2 + 4;
1319 int idx = CU16(ctx->cmd_table + offset); 1323 int idx = CU16(ctx->cmd_table + offset);
1324 u16 *mct = (u16 *)(ctx->bios + ctx->cmd_table + 4);
1325
1326 if (!mct[index])
1327 return false;
1320 1328
1321 if (frev) 1329 if (frev)
1322 *frev = CU8(idx + 2); 1330 *frev = CU8(idx + 2);
1323 if (crev) 1331 if (crev)
1324 *crev = CU8(idx + 3); 1332 *crev = CU8(idx + 3);
1325 return; 1333 return true;
1326} 1334}
1327 1335
1328int atom_allocate_fb_scratch(struct atom_context *ctx) 1336int atom_allocate_fb_scratch(struct atom_context *ctx)
1329{ 1337{
1330 int index = GetIndexIntoMasterTable(DATA, VRAM_UsageByFirmware); 1338 int index = GetIndexIntoMasterTable(DATA, VRAM_UsageByFirmware);
1331 uint16_t data_offset; 1339 uint16_t data_offset;
1332 int usage_bytes; 1340 int usage_bytes = 0;
1333 struct _ATOM_VRAM_USAGE_BY_FIRMWARE *firmware_usage; 1341 struct _ATOM_VRAM_USAGE_BY_FIRMWARE *firmware_usage;
1334 1342
1335 atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset); 1343 if (atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) {
1344 firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset);
1336 1345
1337 firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset); 1346 DRM_DEBUG("atom firmware requested %08x %dkb\n",
1347 firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware,
1348 firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb);
1338 1349
1339 DRM_DEBUG("atom firmware requested %08x %dkb\n", 1350 usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024;
1340 firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware, 1351 }
1341 firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb);
1342
1343 usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024;
1344 if (usage_bytes == 0) 1352 if (usage_bytes == 0)
1345 usage_bytes = 20 * 1024; 1353 usage_bytes = 20 * 1024;
1346 /* allocate some scratch memory */ 1354 /* allocate some scratch memory */