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 | */ |