r100.c (1614f8b17b8cc3ad143541d41569623d30dbc9ec) r100.c (4c7886791264f03428d5424befb1b96f08fc90f4)
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation

--- 247 unchanged lines hidden (view full) ---

256 radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
257}
258
259int r100_wb_init(struct radeon_device *rdev)
260{
261 int r;
262
263 if (rdev->wb.wb_obj == NULL) {
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation

--- 247 unchanged lines hidden (view full) ---

256 radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
257}
258
259int r100_wb_init(struct radeon_device *rdev)
260{
261 int r;
262
263 if (rdev->wb.wb_obj == NULL) {
264 r = radeon_object_create(rdev, NULL, RADEON_GPU_PAGE_SIZE,
265 true,
266 RADEON_GEM_DOMAIN_GTT,
267 false, &rdev->wb.wb_obj);
264 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
265 RADEON_GEM_DOMAIN_GTT,
266 &rdev->wb.wb_obj);
268 if (r) {
267 if (r) {
269 DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r);
268 dev_err(rdev->dev, "(%d) create WB buffer failed\n", r);
270 return r;
271 }
269 return r;
270 }
272 r = radeon_object_pin(rdev->wb.wb_obj,
273 RADEON_GEM_DOMAIN_GTT,
274 &rdev->wb.gpu_addr);
271 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
272 if (unlikely(r != 0))
273 return r;
274 r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
275 &rdev->wb.gpu_addr);
275 if (r) {
276 if (r) {
276 DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r);
277 dev_err(rdev->dev, "(%d) pin WB buffer failed\n", r);
278 radeon_bo_unreserve(rdev->wb.wb_obj);
277 return r;
278 }
279 return r;
280 }
279 r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
281 r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
282 radeon_bo_unreserve(rdev->wb.wb_obj);
280 if (r) {
283 if (r) {
281 DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r);
284 dev_err(rdev->dev, "(%d) map WB buffer failed\n", r);
282 return r;
283 }
284 }
285 WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr);
286 WREG32(R_00070C_CP_RB_RPTR_ADDR,
287 S_00070C_RB_RPTR_ADDR((rdev->wb.gpu_addr + 1024) >> 2));
288 WREG32(R_000770_SCRATCH_UMSK, 0xff);
289 return 0;
290}
291
292void r100_wb_disable(struct radeon_device *rdev)
293{
294 WREG32(R_000770_SCRATCH_UMSK, 0);
295}
296
297void r100_wb_fini(struct radeon_device *rdev)
298{
285 return r;
286 }
287 }
288 WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr);
289 WREG32(R_00070C_CP_RB_RPTR_ADDR,
290 S_00070C_RB_RPTR_ADDR((rdev->wb.gpu_addr + 1024) >> 2));
291 WREG32(R_000770_SCRATCH_UMSK, 0xff);
292 return 0;
293}
294
295void r100_wb_disable(struct radeon_device *rdev)
296{
297 WREG32(R_000770_SCRATCH_UMSK, 0);
298}
299
300void r100_wb_fini(struct radeon_device *rdev)
301{
302 int r;
303
299 r100_wb_disable(rdev);
300 if (rdev->wb.wb_obj) {
304 r100_wb_disable(rdev);
305 if (rdev->wb.wb_obj) {
301 radeon_object_kunmap(rdev->wb.wb_obj);
302 radeon_object_unpin(rdev->wb.wb_obj);
303 radeon_object_unref(&rdev->wb.wb_obj);
306 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
307 if (unlikely(r != 0)) {
308 dev_err(rdev->dev, "(%d) can't finish WB\n", r);
309 return;
310 }
311 radeon_bo_kunmap(rdev->wb.wb_obj);
312 radeon_bo_unpin(rdev->wb.wb_obj);
313 radeon_bo_unreserve(rdev->wb.wb_obj);
314 radeon_bo_unref(&rdev->wb.wb_obj);
304 rdev->wb.wb = NULL;
305 rdev->wb.wb_obj = NULL;
306 }
307}
308
309int r100_copy_blit(struct radeon_device *rdev,
310 uint64_t src_offset,
311 uint64_t dst_offset,

--- 977 unchanged lines hidden (view full) ---

1289 reg, idx);
1290 return -EINVAL;
1291 }
1292 return 0;
1293}
1294
1295int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
1296 struct radeon_cs_packet *pkt,
315 rdev->wb.wb = NULL;
316 rdev->wb.wb_obj = NULL;
317 }
318}
319
320int r100_copy_blit(struct radeon_device *rdev,
321 uint64_t src_offset,
322 uint64_t dst_offset,

--- 977 unchanged lines hidden (view full) ---

1300 reg, idx);
1301 return -EINVAL;
1302 }
1303 return 0;
1304}
1305
1306int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
1307 struct radeon_cs_packet *pkt,
1297 struct radeon_object *robj)
1308 struct radeon_bo *robj)
1298{
1299 unsigned idx;
1300 u32 value;
1301 idx = pkt->idx + 1;
1302 value = radeon_get_ib_value(p, idx + 2);
1309{
1310 unsigned idx;
1311 u32 value;
1312 idx = pkt->idx + 1;
1313 value = radeon_get_ib_value(p, idx + 2);
1303 if ((value + 1) > radeon_object_size(robj)) {
1314 if ((value + 1) > radeon_bo_size(robj)) {
1304 DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER "
1305 "(need %u have %lu) !\n",
1306 value + 1,
1315 DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER "
1316 "(need %u have %lu) !\n",
1317 value + 1,
1307 radeon_object_size(robj));
1318 radeon_bo_size(robj));
1308 return -EINVAL;
1309 }
1310 return 0;
1311}
1312
1313static int r100_packet3_check(struct radeon_cs_parser *p,
1314 struct radeon_cs_packet *pkt)
1315{

--- 1287 unchanged lines hidden (view full) ---

2603 DRM_ERROR("width round to power of 2 %d\n", t->roundup_w);
2604 DRM_ERROR("height round to power of 2 %d\n", t->roundup_h);
2605}
2606
2607static int r100_cs_track_cube(struct radeon_device *rdev,
2608 struct r100_cs_track *track, unsigned idx)
2609{
2610 unsigned face, w, h;
1319 return -EINVAL;
1320 }
1321 return 0;
1322}
1323
1324static int r100_packet3_check(struct radeon_cs_parser *p,
1325 struct radeon_cs_packet *pkt)
1326{

--- 1287 unchanged lines hidden (view full) ---

2614 DRM_ERROR("width round to power of 2 %d\n", t->roundup_w);
2615 DRM_ERROR("height round to power of 2 %d\n", t->roundup_h);
2616}
2617
2618static int r100_cs_track_cube(struct radeon_device *rdev,
2619 struct r100_cs_track *track, unsigned idx)
2620{
2621 unsigned face, w, h;
2611 struct radeon_object *cube_robj;
2622 struct radeon_bo *cube_robj;
2612 unsigned long size;
2613
2614 for (face = 0; face < 5; face++) {
2615 cube_robj = track->textures[idx].cube_info[face].robj;
2616 w = track->textures[idx].cube_info[face].width;
2617 h = track->textures[idx].cube_info[face].height;
2618
2619 size = w * h;
2620 size *= track->textures[idx].cpp;
2621
2622 size += track->textures[idx].cube_info[face].offset;
2623
2623 unsigned long size;
2624
2625 for (face = 0; face < 5; face++) {
2626 cube_robj = track->textures[idx].cube_info[face].robj;
2627 w = track->textures[idx].cube_info[face].width;
2628 h = track->textures[idx].cube_info[face].height;
2629
2630 size = w * h;
2631 size *= track->textures[idx].cpp;
2632
2633 size += track->textures[idx].cube_info[face].offset;
2634
2624 if (size > radeon_object_size(cube_robj)) {
2635 if (size > radeon_bo_size(cube_robj)) {
2625 DRM_ERROR("Cube texture offset greater than object size %lu %lu\n",
2636 DRM_ERROR("Cube texture offset greater than object size %lu %lu\n",
2626 size, radeon_object_size(cube_robj));
2637 size, radeon_bo_size(cube_robj));
2627 r100_cs_track_texture_print(&track->textures[idx]);
2628 return -1;
2629 }
2630 }
2631 return 0;
2632}
2633
2634static int r100_cs_track_texture_check(struct radeon_device *rdev,
2635 struct r100_cs_track *track)
2636{
2638 r100_cs_track_texture_print(&track->textures[idx]);
2639 return -1;
2640 }
2641 }
2642 return 0;
2643}
2644
2645static int r100_cs_track_texture_check(struct radeon_device *rdev,
2646 struct r100_cs_track *track)
2647{
2637 struct radeon_object *robj;
2648 struct radeon_bo *robj;
2638 unsigned long size;
2639 unsigned u, i, w, h;
2640 int ret;
2641
2642 for (u = 0; u < track->num_texture; u++) {
2643 if (!track->textures[u].enabled)
2644 continue;
2645 robj = track->textures[u].robj;

--- 39 unchanged lines hidden (view full) ---

2685 } else
2686 size *= 6;
2687 break;
2688 default:
2689 DRM_ERROR("Invalid texture coordinate type %u for unit "
2690 "%u\n", track->textures[u].tex_coord_type, u);
2691 return -EINVAL;
2692 }
2649 unsigned long size;
2650 unsigned u, i, w, h;
2651 int ret;
2652
2653 for (u = 0; u < track->num_texture; u++) {
2654 if (!track->textures[u].enabled)
2655 continue;
2656 robj = track->textures[u].robj;

--- 39 unchanged lines hidden (view full) ---

2696 } else
2697 size *= 6;
2698 break;
2699 default:
2700 DRM_ERROR("Invalid texture coordinate type %u for unit "
2701 "%u\n", track->textures[u].tex_coord_type, u);
2702 return -EINVAL;
2703 }
2693 if (size > radeon_object_size(robj)) {
2704 if (size > radeon_bo_size(robj)) {
2694 DRM_ERROR("Texture of unit %u needs %lu bytes but is "
2705 DRM_ERROR("Texture of unit %u needs %lu bytes but is "
2695 "%lu\n", u, size, radeon_object_size(robj));
2706 "%lu\n", u, size, radeon_bo_size(robj));
2696 r100_cs_track_texture_print(&track->textures[u]);
2697 return -EINVAL;
2698 }
2699 }
2700 return 0;
2701}
2702
2703int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)

--- 5 unchanged lines hidden (view full) ---

2709
2710 for (i = 0; i < track->num_cb; i++) {
2711 if (track->cb[i].robj == NULL) {
2712 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
2713 return -EINVAL;
2714 }
2715 size = track->cb[i].pitch * track->cb[i].cpp * track->maxy;
2716 size += track->cb[i].offset;
2707 r100_cs_track_texture_print(&track->textures[u]);
2708 return -EINVAL;
2709 }
2710 }
2711 return 0;
2712}
2713
2714int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)

--- 5 unchanged lines hidden (view full) ---

2720
2721 for (i = 0; i < track->num_cb; i++) {
2722 if (track->cb[i].robj == NULL) {
2723 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
2724 return -EINVAL;
2725 }
2726 size = track->cb[i].pitch * track->cb[i].cpp * track->maxy;
2727 size += track->cb[i].offset;
2717 if (size > radeon_object_size(track->cb[i].robj)) {
2728 if (size > radeon_bo_size(track->cb[i].robj)) {
2718 DRM_ERROR("[drm] Buffer too small for color buffer %d "
2719 "(need %lu have %lu) !\n", i, size,
2729 DRM_ERROR("[drm] Buffer too small for color buffer %d "
2730 "(need %lu have %lu) !\n", i, size,
2720 radeon_object_size(track->cb[i].robj));
2731 radeon_bo_size(track->cb[i].robj));
2721 DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
2722 i, track->cb[i].pitch, track->cb[i].cpp,
2723 track->cb[i].offset, track->maxy);
2724 return -EINVAL;
2725 }
2726 }
2727 if (track->z_enabled) {
2728 if (track->zb.robj == NULL) {
2729 DRM_ERROR("[drm] No buffer for z buffer !\n");
2730 return -EINVAL;
2731 }
2732 size = track->zb.pitch * track->zb.cpp * track->maxy;
2733 size += track->zb.offset;
2732 DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
2733 i, track->cb[i].pitch, track->cb[i].cpp,
2734 track->cb[i].offset, track->maxy);
2735 return -EINVAL;
2736 }
2737 }
2738 if (track->z_enabled) {
2739 if (track->zb.robj == NULL) {
2740 DRM_ERROR("[drm] No buffer for z buffer !\n");
2741 return -EINVAL;
2742 }
2743 size = track->zb.pitch * track->zb.cpp * track->maxy;
2744 size += track->zb.offset;
2734 if (size > radeon_object_size(track->zb.robj)) {
2745 if (size > radeon_bo_size(track->zb.robj)) {
2735 DRM_ERROR("[drm] Buffer too small for z buffer "
2736 "(need %lu have %lu) !\n", size,
2746 DRM_ERROR("[drm] Buffer too small for z buffer "
2747 "(need %lu have %lu) !\n", size,
2737 radeon_object_size(track->zb.robj));
2748 radeon_bo_size(track->zb.robj));
2738 DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n",
2739 track->zb.pitch, track->zb.cpp,
2740 track->zb.offset, track->maxy);
2741 return -EINVAL;
2742 }
2743 }
2744 prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
2745 nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
2746 switch (prim_walk) {
2747 case 1:
2748 for (i = 0; i < track->num_arrays; i++) {
2749 size = track->arrays[i].esize * track->max_indx * 4;
2750 if (track->arrays[i].robj == NULL) {
2751 DRM_ERROR("(PW %u) Vertex array %u no buffer "
2752 "bound\n", prim_walk, i);
2753 return -EINVAL;
2754 }
2749 DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n",
2750 track->zb.pitch, track->zb.cpp,
2751 track->zb.offset, track->maxy);
2752 return -EINVAL;
2753 }
2754 }
2755 prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
2756 nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
2757 switch (prim_walk) {
2758 case 1:
2759 for (i = 0; i < track->num_arrays; i++) {
2760 size = track->arrays[i].esize * track->max_indx * 4;
2761 if (track->arrays[i].robj == NULL) {
2762 DRM_ERROR("(PW %u) Vertex array %u no buffer "
2763 "bound\n", prim_walk, i);
2764 return -EINVAL;
2765 }
2755 if (size > radeon_object_size(track->arrays[i].robj)) {
2756 DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
2757 "have %lu dwords\n", prim_walk, i,
2758 size >> 2,
2759 radeon_object_size(track->arrays[i].robj) >> 2);
2766 if (size > radeon_bo_size(track->arrays[i].robj)) {
2767 dev_err(rdev->dev, "(PW %u) Vertex array %u "
2768 "need %lu dwords have %lu dwords\n",
2769 prim_walk, i, size >> 2,
2770 radeon_bo_size(track->arrays[i].robj)
2771 >> 2);
2760 DRM_ERROR("Max indices %u\n", track->max_indx);
2761 return -EINVAL;
2762 }
2763 }
2764 break;
2765 case 2:
2766 for (i = 0; i < track->num_arrays; i++) {
2767 size = track->arrays[i].esize * (nverts - 1) * 4;
2768 if (track->arrays[i].robj == NULL) {
2769 DRM_ERROR("(PW %u) Vertex array %u no buffer "
2770 "bound\n", prim_walk, i);
2771 return -EINVAL;
2772 }
2772 DRM_ERROR("Max indices %u\n", track->max_indx);
2773 return -EINVAL;
2774 }
2775 }
2776 break;
2777 case 2:
2778 for (i = 0; i < track->num_arrays; i++) {
2779 size = track->arrays[i].esize * (nverts - 1) * 4;
2780 if (track->arrays[i].robj == NULL) {
2781 DRM_ERROR("(PW %u) Vertex array %u no buffer "
2782 "bound\n", prim_walk, i);
2783 return -EINVAL;
2784 }
2773 if (size > radeon_object_size(track->arrays[i].robj)) {
2774 DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
2775 "have %lu dwords\n", prim_walk, i, size >> 2,
2776 radeon_object_size(track->arrays[i].robj) >> 2);
2785 if (size > radeon_bo_size(track->arrays[i].robj)) {
2786 dev_err(rdev->dev, "(PW %u) Vertex array %u "
2787 "need %lu dwords have %lu dwords\n",
2788 prim_walk, i, size >> 2,
2789 radeon_bo_size(track->arrays[i].robj)
2790 >> 2);
2777 return -EINVAL;
2778 }
2779 }
2780 break;
2781 case 3:
2782 size = track->vtx_size * nverts;
2783 if (size != track->immd_dwords) {
2784 DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n",

--- 398 unchanged lines hidden (view full) ---

3183 r100_cp_fini(rdev);
3184 r100_wb_fini(rdev);
3185 r100_ib_fini(rdev);
3186 radeon_gem_fini(rdev);
3187 if (rdev->flags & RADEON_IS_PCI)
3188 r100_pci_gart_fini(rdev);
3189 radeon_irq_kms_fini(rdev);
3190 radeon_fence_driver_fini(rdev);
2791 return -EINVAL;
2792 }
2793 }
2794 break;
2795 case 3:
2796 size = track->vtx_size * nverts;
2797 if (size != track->immd_dwords) {
2798 DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n",

--- 398 unchanged lines hidden (view full) ---

3197 r100_cp_fini(rdev);
3198 r100_wb_fini(rdev);
3199 r100_ib_fini(rdev);
3200 radeon_gem_fini(rdev);
3201 if (rdev->flags & RADEON_IS_PCI)
3202 r100_pci_gart_fini(rdev);
3203 radeon_irq_kms_fini(rdev);
3204 radeon_fence_driver_fini(rdev);
3191 radeon_object_fini(rdev);
3205 radeon_bo_fini(rdev);
3192 radeon_atombios_fini(rdev);
3193 kfree(rdev->bios);
3194 rdev->bios = NULL;
3195}
3196
3197int r100_mc_init(struct radeon_device *rdev)
3198{
3199 int r;

--- 71 unchanged lines hidden (view full) ---

3271 /* Fence driver */
3272 r = radeon_fence_driver_init(rdev);
3273 if (r)
3274 return r;
3275 r = radeon_irq_kms_init(rdev);
3276 if (r)
3277 return r;
3278 /* Memory manager */
3206 radeon_atombios_fini(rdev);
3207 kfree(rdev->bios);
3208 rdev->bios = NULL;
3209}
3210
3211int r100_mc_init(struct radeon_device *rdev)
3212{
3213 int r;

--- 71 unchanged lines hidden (view full) ---

3285 /* Fence driver */
3286 r = radeon_fence_driver_init(rdev);
3287 if (r)
3288 return r;
3289 r = radeon_irq_kms_init(rdev);
3290 if (r)
3291 return r;
3292 /* Memory manager */
3279 r = radeon_object_init(rdev);
3293 r = radeon_bo_init(rdev);
3280 if (r)
3281 return r;
3282 if (rdev->flags & RADEON_IS_PCI) {
3283 r = r100_pci_gart_init(rdev);
3284 if (r)
3285 return r;
3286 }
3287 r100_set_safe_registers(rdev);

--- 16 unchanged lines hidden ---
3294 if (r)
3295 return r;
3296 if (rdev->flags & RADEON_IS_PCI) {
3297 r = r100_pci_gart_init(rdev);
3298 if (r)
3299 return r;
3300 }
3301 r100_set_safe_registers(rdev);

--- 16 unchanged lines hidden ---