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

Reply via email to