diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 85 |
1 files changed, 48 insertions, 37 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 5225f5be7ea7..c550932a108f 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -551,6 +551,9 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 551 | /* cp setup */ | 551 | /* cp setup */ |
| 552 | WREG32(0x718, pre_write_timer | (pre_write_limit << 28)); | 552 | WREG32(0x718, pre_write_timer | (pre_write_limit << 28)); |
| 553 | WREG32(RADEON_CP_RB_CNTL, | 553 | WREG32(RADEON_CP_RB_CNTL, |
| 554 | #ifdef __BIG_ENDIAN | ||
| 555 | RADEON_BUF_SWAP_32BIT | | ||
| 556 | #endif | ||
| 554 | REG_SET(RADEON_RB_BUFSZ, rb_bufsz) | | 557 | REG_SET(RADEON_RB_BUFSZ, rb_bufsz) | |
| 555 | REG_SET(RADEON_RB_BLKSZ, rb_blksz) | | 558 | REG_SET(RADEON_RB_BLKSZ, rb_blksz) | |
| 556 | REG_SET(RADEON_MAX_FETCH, max_fetch) | | 559 | REG_SET(RADEON_MAX_FETCH, max_fetch) | |
| @@ -644,7 +647,7 @@ int r100_cp_reset(struct radeon_device *rdev) | |||
| 644 | */ | 647 | */ |
| 645 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, | 648 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, |
| 646 | struct radeon_cs_packet *pkt, | 649 | struct radeon_cs_packet *pkt, |
| 647 | unsigned *auth, unsigned n, | 650 | const unsigned *auth, unsigned n, |
| 648 | radeon_packet0_check_t check) | 651 | radeon_packet0_check_t check) |
| 649 | { | 652 | { |
| 650 | unsigned reg; | 653 | unsigned reg; |
| @@ -654,6 +657,10 @@ int r100_cs_parse_packet0(struct radeon_cs_parser *p, | |||
| 654 | 657 | ||
| 655 | idx = pkt->idx + 1; | 658 | idx = pkt->idx + 1; |
| 656 | reg = pkt->reg; | 659 | reg = pkt->reg; |
| 660 | /* Check that register fall into register range | ||
| 661 | * determined by the number of entry (n) in the | ||
| 662 | * safe register bitmap. | ||
| 663 | */ | ||
| 657 | if (pkt->one_reg_wr) { | 664 | if (pkt->one_reg_wr) { |
| 658 | if ((reg >> 7) > n) { | 665 | if ((reg >> 7) > n) { |
| 659 | return -EINVAL; | 666 | return -EINVAL; |
| @@ -683,24 +690,6 @@ int r100_cs_parse_packet0(struct radeon_cs_parser *p, | |||
| 683 | return 0; | 690 | return 0; |
| 684 | } | 691 | } |
| 685 | 692 | ||
| 686 | int r100_cs_parse_packet3(struct radeon_cs_parser *p, | ||
| 687 | struct radeon_cs_packet *pkt, | ||
| 688 | unsigned *auth, unsigned n, | ||
| 689 | radeon_packet3_check_t check) | ||
| 690 | { | ||
| 691 | unsigned i, m; | ||
| 692 | |||
| 693 | if ((pkt->opcode >> 5) > n) { | ||
| 694 | return -EINVAL; | ||
| 695 | } | ||
| 696 | i = pkt->opcode >> 5; | ||
| 697 | m = 1 << (pkt->opcode & 31); | ||
| 698 | if (auth[i] & m) { | ||
| 699 | return check(p, pkt); | ||
| 700 | } | ||
| 701 | return 0; | ||
| 702 | } | ||
| 703 | |||
| 704 | void r100_cs_dump_packet(struct radeon_cs_parser *p, | 693 | void r100_cs_dump_packet(struct radeon_cs_parser *p, |
| 705 | struct radeon_cs_packet *pkt) | 694 | struct radeon_cs_packet *pkt) |
| 706 | { | 695 | { |
| @@ -901,6 +890,25 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 901 | return 0; | 890 | return 0; |
| 902 | } | 891 | } |
| 903 | 892 | ||
| 893 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
| 894 | struct radeon_cs_packet *pkt, | ||
| 895 | struct radeon_object *robj) | ||
| 896 | { | ||
| 897 | struct radeon_cs_chunk *ib_chunk; | ||
| 898 | unsigned idx; | ||
| 899 | |||
| 900 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
| 901 | idx = pkt->idx + 1; | ||
| 902 | if ((ib_chunk->kdata[idx+2] + 1) > radeon_object_size(robj)) { | ||
| 903 | DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER " | ||
| 904 | "(need %u have %lu) !\n", | ||
| 905 | ib_chunk->kdata[idx+2] + 1, | ||
| 906 | radeon_object_size(robj)); | ||
| 907 | return -EINVAL; | ||
| 908 | } | ||
| 909 | return 0; | ||
| 910 | } | ||
| 911 | |||
| 904 | static int r100_packet3_check(struct radeon_cs_parser *p, | 912 | static int r100_packet3_check(struct radeon_cs_parser *p, |
| 905 | struct radeon_cs_packet *pkt) | 913 | struct radeon_cs_packet *pkt) |
| 906 | { | 914 | { |
| @@ -954,6 +962,10 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
| 954 | return r; | 962 | return r; |
| 955 | } | 963 | } |
| 956 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 964 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
| 965 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); | ||
| 966 | if (r) { | ||
| 967 | return r; | ||
| 968 | } | ||
| 957 | break; | 969 | break; |
| 958 | case 0x23: | 970 | case 0x23: |
| 959 | /* FIXME: cleanup */ | 971 | /* FIXME: cleanup */ |
| @@ -999,18 +1011,18 @@ int r100_cs_parse(struct radeon_cs_parser *p) | |||
| 999 | } | 1011 | } |
| 1000 | p->idx += pkt.count + 2; | 1012 | p->idx += pkt.count + 2; |
| 1001 | switch (pkt.type) { | 1013 | switch (pkt.type) { |
| 1002 | case PACKET_TYPE0: | 1014 | case PACKET_TYPE0: |
| 1003 | r = r100_packet0_check(p, &pkt); | 1015 | r = r100_packet0_check(p, &pkt); |
| 1004 | break; | 1016 | break; |
| 1005 | case PACKET_TYPE2: | 1017 | case PACKET_TYPE2: |
| 1006 | break; | 1018 | break; |
| 1007 | case PACKET_TYPE3: | 1019 | case PACKET_TYPE3: |
| 1008 | r = r100_packet3_check(p, &pkt); | 1020 | r = r100_packet3_check(p, &pkt); |
| 1009 | break; | 1021 | break; |
| 1010 | default: | 1022 | default: |
| 1011 | DRM_ERROR("Unknown packet type %d !\n", | 1023 | DRM_ERROR("Unknown packet type %d !\n", |
| 1012 | pkt.type); | 1024 | pkt.type); |
| 1013 | return -EINVAL; | 1025 | return -EINVAL; |
| 1014 | } | 1026 | } |
| 1015 | if (r) { | 1027 | if (r) { |
| 1016 | return r; | 1028 | return r; |
| @@ -1267,12 +1279,6 @@ void r100_vram_info(struct radeon_device *rdev) | |||
| 1267 | 1279 | ||
| 1268 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | 1280 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); |
| 1269 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | 1281 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); |
| 1270 | if (rdev->mc.aper_size > rdev->mc.vram_size) { | ||
| 1271 | /* Why does some hw doesn't have CONFIG_MEMSIZE properly | ||
| 1272 | * setup ? */ | ||
| 1273 | rdev->mc.vram_size = rdev->mc.aper_size; | ||
| 1274 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.vram_size); | ||
| 1275 | } | ||
| 1276 | } | 1282 | } |
| 1277 | 1283 | ||
| 1278 | 1284 | ||
| @@ -1352,6 +1358,11 @@ void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 1352 | } | 1358 | } |
| 1353 | } | 1359 | } |
| 1354 | 1360 | ||
| 1361 | int r100_init(struct radeon_device *rdev) | ||
| 1362 | { | ||
| 1363 | return 0; | ||
| 1364 | } | ||
| 1365 | |||
| 1355 | /* | 1366 | /* |
| 1356 | * Debugfs info | 1367 | * Debugfs info |
| 1357 | */ | 1368 | */ |
