diff options
author | marius <marius@FreeBSD.org> | 2014-06-04 09:44:05 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2014-06-04 09:44:05 +0000 |
commit | 805e679faceb9fc6ec8fd372cd3205db83fc1657 (patch) | |
tree | f24e8810c1bf5f5bcc48ccca59cc71be014ca8d0 | |
parent | 722f33f118cbd4a31e805d93474c2c362a1b3e0f (diff) | |
download | FreeBSD-src-805e679faceb9fc6ec8fd372cd3205db83fc1657.zip FreeBSD-src-805e679faceb9fc6ec8fd372cd3205db83fc1657.tar.gz |
MFC: r266792
Fix DMA handling in radeon_dummy_page_init():
- Based on actual usage and on what Linux does, dummy_page.addr should
contain the physical bus address of the dummy page rather than its
virtual one. As a side-effect, correcting this bug fixes compilation
with PAE support enabled by getting rid of an inappropriate cast.
- Also based on actual usage of dummy_page.addr, theoretically Radeon
devices could do a maximum of 44-bit DMA. In reality, though, it is
more likely that they only support 32-bit DMA, at least that is what
radeon_gart_table_ram_alloc() sets up for, too. However, passing ~0
to drm_pci_alloc() as maxaddr parameter translates to 64-bit DMA on
amd64/64-bit machines. Thus, use BUS_SPACE_MAXSIZE_32BIT instead,
which the existing 32-bit DMA limits within the drm2 code spelled as
0xFFFFFFFF should also be changed to.
Reviewed by: dumbbell
Sponsored by: Bally Wulff Games & Entertainment GmbH
-rw-r--r-- | sys/dev/drm2/radeon/radeon_device.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/dev/drm2/radeon/radeon_device.c b/sys/dev/drm2/radeon/radeon_device.c index 676b38a..a20b7ec 100644 --- a/sys/dev/drm2/radeon/radeon_device.c +++ b/sys/dev/drm2/radeon/radeon_device.c @@ -548,10 +548,10 @@ int radeon_dummy_page_init(struct radeon_device *rdev) if (rdev->dummy_page.dmah) return 0; rdev->dummy_page.dmah = drm_pci_alloc(rdev->ddev, - PAGE_SIZE, PAGE_SIZE, ~0); + PAGE_SIZE, PAGE_SIZE, BUS_SPACE_MAXSIZE_32BIT); if (rdev->dummy_page.dmah == NULL) return -ENOMEM; - rdev->dummy_page.addr = (dma_addr_t)rdev->dummy_page.dmah->vaddr; + rdev->dummy_page.addr = rdev->dummy_page.dmah->busaddr; return 0; } |