diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nv20_graph.c')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv20_graph.c | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/drivers/gpu/drm/nouveau/nv20_graph.c b/drivers/gpu/drm/nouveau/nv20_graph.c index 18ba74f19703..d6fc0a82f03d 100644 --- a/drivers/gpu/drm/nouveau/nv20_graph.c +++ b/drivers/gpu/drm/nouveau/nv20_graph.c | |||
| @@ -514,6 +514,27 @@ nv20_graph_rdi(struct drm_device *dev) | |||
| 514 | nouveau_wait_for_idle(dev); | 514 | nouveau_wait_for_idle(dev); |
| 515 | } | 515 | } |
| 516 | 516 | ||
| 517 | void | ||
| 518 | nv20_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, | ||
| 519 | uint32_t size, uint32_t pitch) | ||
| 520 | { | ||
| 521 | uint32_t limit = max(1u, addr + size) - 1; | ||
| 522 | |||
| 523 | if (pitch) | ||
| 524 | addr |= 1; | ||
| 525 | |||
| 526 | nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit); | ||
| 527 | nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch); | ||
| 528 | nv_wr32(dev, NV20_PGRAPH_TILE(i), addr); | ||
| 529 | |||
| 530 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + 4 * i); | ||
| 531 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, limit); | ||
| 532 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + 4 * i); | ||
| 533 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, pitch); | ||
| 534 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + 4 * i); | ||
| 535 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, addr); | ||
| 536 | } | ||
| 537 | |||
| 517 | int | 538 | int |
| 518 | nv20_graph_init(struct drm_device *dev) | 539 | nv20_graph_init(struct drm_device *dev) |
| 519 | { | 540 | { |
| @@ -572,27 +593,10 @@ nv20_graph_init(struct drm_device *dev) | |||
| 572 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA , 0x00000030); | 593 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA , 0x00000030); |
| 573 | } | 594 | } |
| 574 | 595 | ||
| 575 | /* copy tile info from PFB */ | 596 | /* Turn all the tiling regions off. */ |
| 576 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | 597 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) |
| 577 | nv_wr32(dev, 0x00400904 + i * 0x10, | 598 | nv20_graph_set_region_tiling(dev, i, 0, 0, 0); |
| 578 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | 599 | |
| 579 | /* which is NV40_PGRAPH_TLIMIT0(i) ?? */ | ||
| 580 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + i * 4); | ||
| 581 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, | ||
| 582 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | ||
| 583 | nv_wr32(dev, 0x00400908 + i * 0x10, | ||
| 584 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 585 | /* which is NV40_PGRAPH_TSIZE0(i) ?? */ | ||
| 586 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + i * 4); | ||
| 587 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, | ||
| 588 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 589 | nv_wr32(dev, 0x00400900 + i * 0x10, | ||
| 590 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 591 | /* which is NV40_PGRAPH_TILE0(i) ?? */ | ||
| 592 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + i * 4); | ||
| 593 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, | ||
| 594 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 595 | } | ||
| 596 | for (i = 0; i < 8; i++) { | 600 | for (i = 0; i < 8; i++) { |
| 597 | nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4)); | 601 | nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4)); |
| 598 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4); | 602 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4); |
| @@ -704,18 +708,9 @@ nv30_graph_init(struct drm_device *dev) | |||
| 704 | 708 | ||
| 705 | nv_wr32(dev, 0x4000c0, 0x00000016); | 709 | nv_wr32(dev, 0x4000c0, 0x00000016); |
| 706 | 710 | ||
| 707 | /* copy tile info from PFB */ | 711 | /* Turn all the tiling regions off. */ |
| 708 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | 712 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) |
| 709 | nv_wr32(dev, 0x00400904 + i * 0x10, | 713 | nv20_graph_set_region_tiling(dev, i, 0, 0, 0); |
| 710 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | ||
| 711 | /* which is NV40_PGRAPH_TLIMIT0(i) ?? */ | ||
| 712 | nv_wr32(dev, 0x00400908 + i * 0x10, | ||
| 713 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 714 | /* which is NV40_PGRAPH_TSIZE0(i) ?? */ | ||
| 715 | nv_wr32(dev, 0x00400900 + i * 0x10, | ||
| 716 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 717 | /* which is NV40_PGRAPH_TILE0(i) ?? */ | ||
| 718 | } | ||
| 719 | 714 | ||
| 720 | nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); | 715 | nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); |
| 721 | nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF); | 716 | nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF); |
