What happens if you have two cards, one RS200 and one RV280 (just an example). I think you shouldn't change values in a static struct.
On Wed, Feb 10, 2010 at 11:10 PM, Pauli Nieminen <suok...@gmail.com> wrote: > r200 cards have dma engine which can be used to tranfer data > between vram and system memory. > > r300 dma engine registers match r200 dma engine. Enabling > dma copy for r200 is simple as hooking r200 asic to already > existing function r300_copy_dma. > > Rename r300_dma_copy to r200_dma_copyto reflect that supports > starts from r200 cards. > > Signed-off-by: Pauli Nieminen <suok...@gmail.com> > --- > drivers/gpu/drm/radeon/r200.c | 46 > ++++++++++++++++++++++++++++++++ > drivers/gpu/drm/radeon/r300.c | 44 ------------------------------ > drivers/gpu/drm/radeon/radeon_asic.h | 18 ++++++------ > drivers/gpu/drm/radeon/radeon_device.c | 3 ++ > 4 files changed, 58 insertions(+), 53 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c > index ff1e0cd..1146c99 100644 > --- a/drivers/gpu/drm/radeon/r200.c > +++ b/drivers/gpu/drm/radeon/r200.c > @@ -31,6 +31,7 @@ > #include "radeon_reg.h" > #include "radeon.h" > > +#include "r100d.h" > #include "r200_reg_safe.h" > > #include "r100_track.h" > @@ -79,6 +80,51 @@ static int r200_get_vtx_size_0(uint32_t vtx_fmt_0) > return vtx_size; > } > > +int r200_copy_dma(struct radeon_device *rdev, > + uint64_t src_offset, > + uint64_t dst_offset, > + unsigned num_pages, > + struct radeon_fence *fence) > +{ > + uint32_t size; > + uint32_t cur_size; > + int i, num_loops; > + int r = 0; > + > + /* radeon pitch is /64 */ > + size = num_pages << PAGE_SHIFT; > + num_loops = DIV_ROUND_UP(size, 0x1FFFFF); > + r = radeon_ring_lock(rdev, num_loops * 4 + 64); > + if (r) { > + DRM_ERROR("radeon: moving bo (%d).\n", r); > + return r; > + } > + /* Must wait for 2D idle & clean before DMA or hangs might happen */ > + radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); > + radeon_ring_write(rdev, (1 << 16)); > + for (i = 0; i < num_loops; i++) { > + cur_size = size; > + if (cur_size > 0x1FFFFF) { > + cur_size = 0x1FFFFF; > + } > + size -= cur_size; > + radeon_ring_write(rdev, PACKET0(0x720, 2)); > + radeon_ring_write(rdev, src_offset); > + radeon_ring_write(rdev, dst_offset); > + radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); > + src_offset += cur_size; > + dst_offset += cur_size; > + } > + radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); > + radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); > + if (fence) { > + r = radeon_fence_emit(rdev, fence); > + } > + radeon_ring_unlock_commit(rdev); > + return r; > +} > + > + > static int r200_get_vtx_size_1(uint32_t vtx_fmt_1) > { > int vtx_size, i, tex_size; > diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c > index 43b55a0..6516cd6 100644 > --- a/drivers/gpu/drm/radeon/r300.c > +++ b/drivers/gpu/drm/radeon/r300.c > @@ -198,50 +198,6 @@ void r300_fence_ring_emit(struct radeon_device *rdev, > radeon_ring_write(rdev, RADEON_SW_INT_FIRE); > } > > -int r300_copy_dma(struct radeon_device *rdev, > - uint64_t src_offset, > - uint64_t dst_offset, > - unsigned num_pages, > - struct radeon_fence *fence) > -{ > - uint32_t size; > - uint32_t cur_size; > - int i, num_loops; > - int r = 0; > - > - /* radeon pitch is /64 */ > - size = num_pages << PAGE_SHIFT; > - num_loops = DIV_ROUND_UP(size, 0x1FFFFF); > - r = radeon_ring_lock(rdev, num_loops * 4 + 64); > - if (r) { > - DRM_ERROR("radeon: moving bo (%d).\n", r); > - return r; > - } > - /* Must wait for 2D idle & clean before DMA or hangs might happen */ > - radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 )); > - radeon_ring_write(rdev, (1 << 16)); > - for (i = 0; i < num_loops; i++) { > - cur_size = size; > - if (cur_size > 0x1FFFFF) { > - cur_size = 0x1FFFFF; > - } > - size -= cur_size; > - radeon_ring_write(rdev, PACKET0(0x720, 2)); > - radeon_ring_write(rdev, src_offset); > - radeon_ring_write(rdev, dst_offset); > - radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); > - src_offset += cur_size; > - dst_offset += cur_size; > - } > - radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); > - radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); > - if (fence) { > - r = radeon_fence_emit(rdev, fence); > - } > - radeon_ring_unlock_commit(rdev); > - return r; > -} > - > void r300_ring_start(struct radeon_device *rdev) > { > unsigned gb_tile_config; > diff --git a/drivers/gpu/drm/radeon/radeon_asic.h > b/drivers/gpu/drm/radeon/radeon_asic.h > index 05ee1ae..0489ef8 100644 > --- a/drivers/gpu/drm/radeon/radeon_asic.h > +++ b/drivers/gpu/drm/radeon/radeon_asic.h > @@ -138,7 +138,7 @@ extern int rv370_pcie_gart_set_page(struct radeon_device > *rdev, int i, uint64_t > extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg); > extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, > uint32_t v); > extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); > -extern int r300_copy_dma(struct radeon_device *rdev, > +extern int r200_copy_dma(struct radeon_device *rdev, > uint64_t src_offset, > uint64_t dst_offset, > unsigned num_pages, > @@ -162,7 +162,7 @@ static struct radeon_asic r300_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > .get_engine_clock = &radeon_legacy_get_engine_clock, > .set_engine_clock = &radeon_legacy_set_engine_clock, > @@ -206,7 +206,7 @@ static struct radeon_asic r420_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > .get_engine_clock = &radeon_atom_get_engine_clock, > .set_engine_clock = &radeon_atom_set_engine_clock, > @@ -255,7 +255,7 @@ static struct radeon_asic rs400_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > .get_engine_clock = &radeon_legacy_get_engine_clock, > .set_engine_clock = &radeon_legacy_set_engine_clock, > @@ -314,7 +314,7 @@ static struct radeon_asic rs600_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > .get_engine_clock = &radeon_atom_get_engine_clock, > .set_engine_clock = &radeon_atom_set_engine_clock, > @@ -360,8 +360,8 @@ static struct radeon_asic rs690_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > - .copy = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > + .copy = &r200_copy_dma, > .get_engine_clock = &radeon_atom_get_engine_clock, > .set_engine_clock = &radeon_atom_set_engine_clock, > .get_memory_clock = &radeon_atom_get_memory_clock, > @@ -412,7 +412,7 @@ static struct radeon_asic rv515_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > .get_engine_clock = &radeon_atom_get_engine_clock, > .set_engine_clock = &radeon_atom_set_engine_clock, > @@ -455,7 +455,7 @@ static struct radeon_asic r520_asic = { > .fence_ring_emit = &r300_fence_ring_emit, > .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > - .copy_dma = &r300_copy_dma, > + .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > .get_engine_clock = &radeon_atom_get_engine_clock, > .set_engine_clock = &radeon_atom_set_engine_clock, > diff --git a/drivers/gpu/drm/radeon/radeon_device.c > b/drivers/gpu/drm/radeon/radeon_device.c > index 768b150..5d15943 100644 > --- a/drivers/gpu/drm/radeon/radeon_device.c > +++ b/drivers/gpu/drm/radeon/radeon_device.c > @@ -329,10 +329,13 @@ int radeon_asic_init(struct radeon_device *rdev) > case CHIP_RS100: > case CHIP_RV200: > case CHIP_RS200: > + rdev->asic = &r100_asic; > + break; > case CHIP_R200: > case CHIP_RV250: > case CHIP_RS300: > case CHIP_RV280: > + r100_asic.copy_dma = &r200_copy_dma; > rdev->asic = &r100_asic; > break; > case CHIP_R300: > -- > 1.6.3.3 > > > ------------------------------------------------------------------------------ > SOLARIS 10 is the OS for Data Centers - provides features such as DTrace, > Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW > http://p.sf.net/sfu/solaris-dev2dev > -- > _______________________________________________ > Dri-devel mailing list > Dri-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/dri-devel > ------------------------------------------------------------------------------ SOLARIS 10 is the OS for Data Centers - provides features such as DTrace, Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW http://p.sf.net/sfu/solaris-dev2dev -- _______________________________________________ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel