diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2010-03-18 01:04:01 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-03-30 23:11:29 -0400 |
commit | a084e6ee6e64a76f1a9665d527203cdab7d6048f (patch) | |
tree | ebc1f90b7111b39bee17ff3f1e2ee02452dc1bf7 /drivers/gpu/drm/radeon/atom.c | |
parent | c1bcad9d16831859373d8f579fa1e146409f9960 (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.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index b7fe660985c4..247f8ee7e940 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 | ||
1298 | void atom_parse_data_header(struct atom_context *ctx, int index, | 1298 | bool 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 | ||
1315 | void atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * frev, | 1319 | bool 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 | ||
1328 | int atom_allocate_fb_scratch(struct atom_context *ctx) | 1336 | int 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 */ |