All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/radeon: Skip dma copy test in benchmark if card doesn't have dma engine.
@ 2010-02-10 22:10 Pauli Nieminen
  2010-02-10 22:10 ` [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards Pauli Nieminen
  0 siblings, 1 reply; 8+ messages in thread
From: Pauli Nieminen @ 2010-02-10 22:10 UTC (permalink / raw)
  To: dri-devel

radeon_copy_dma is only available for r200 or newer cards.
Call to radeon_copy_dma would result to NULL pointer
dereference if benchmarking asic without dma engine.

Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
---
 drivers/gpu/drm/radeon/radeon_benchmark.c |   55 +++++++++++++++++-----------
 1 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
index 4ddfd4b..7932dc4 100644
--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
@@ -65,31 +65,42 @@ void radeon_benchmark_move(struct radeon_device *rdev, unsigned bsize,
 	if (r) {
 		goto out_cleanup;
 	}
-	start_jiffies = jiffies;
-	for (i = 0; i < n; i++) {
-		r = radeon_fence_create(rdev, &fence);
-		if (r) {
-			goto out_cleanup;
+
+	/* r100 doesn't have dma engine so skip the test */
+	if (rdev->asic->copy_dma) {
+
+		start_jiffies = jiffies;
+		for (i = 0; i < n; i++) {
+			r = radeon_fence_create(rdev, &fence);
+			if (r) {
+				goto out_cleanup;
+			}
+
+			r = radeon_copy_dma(rdev, saddr, daddr,
+					size / RADEON_GPU_PAGE_SIZE, fence);
+
+			if (r) {
+				goto out_cleanup;
+			}
+			r = radeon_fence_wait(fence, false);
+			if (r) {
+				goto out_cleanup;
+			}
+			radeon_fence_unref(&fence);
 		}
-		r = radeon_copy_dma(rdev, saddr, daddr, size / RADEON_GPU_PAGE_SIZE, fence);
-		if (r) {
-			goto out_cleanup;
+		end_jiffies = jiffies;
+		time = end_jiffies - start_jiffies;
+		time = jiffies_to_msecs(time);
+		if (time > 0) {
+			i = ((n * size) >> 10) / time;
+			printk(KERN_INFO "radeon: dma %u bo moves of %ukb from"
+					" %d to %d in %lums (%ukb/ms %ukb/s %uM/s)\n",
+					n, size >> 10,
+					sdomain, ddomain, time,
+					i, i * 1000, (i * 1000) / 1024);
 		}
-		r = radeon_fence_wait(fence, false);
-		if (r) {
-			goto out_cleanup;
-		}
-		radeon_fence_unref(&fence);
-	}
-	end_jiffies = jiffies;
-	time = end_jiffies - start_jiffies;
-	time = jiffies_to_msecs(time);
-	if (time > 0) {
-		i = ((n * size) >> 10) / time;
-		printk(KERN_INFO "radeon: dma %u bo moves of %ukb from %d to %d"
-		       " in %lums (%ukb/ms %ukb/s %uM/s)\n", n, size >> 10,
-		       sdomain, ddomain, time, i, i * 1000, (i * 1000) / 1024);
 	}
+
 	start_jiffies = jiffies;
 	for (i = 0; i < n; i++) {
 		r = radeon_fence_create(rdev, &fence);
-- 
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
--

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards.
  2010-02-10 22:10 [PATCH 1/2] drm/radeon: Skip dma copy test in benchmark if card doesn't have dma engine Pauli Nieminen
@ 2010-02-10 22:10 ` Pauli Nieminen
  2010-02-10 23:40   ` Maarten Maathuis
  0 siblings, 1 reply; 8+ messages in thread
From: Pauli Nieminen @ 2010-02-10 22:10 UTC (permalink / raw)
  To: dri-devel

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 <suokkos@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
--

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards.
  2010-02-10 22:10 ` [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards Pauli Nieminen
@ 2010-02-10 23:40   ` Maarten Maathuis
  2010-02-11 11:51     ` Jerome Glisse
  0 siblings, 1 reply; 8+ messages in thread
From: Maarten Maathuis @ 2010-02-10 23:40 UTC (permalink / raw)
  To: Pauli Nieminen; +Cc: dri-devel

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 <suokkos@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 <suokkos@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
--

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards.
  2010-02-10 23:40   ` Maarten Maathuis
@ 2010-02-11 11:51     ` Jerome Glisse
  2010-02-11 15:08       ` Alex Deucher
  2010-02-11 17:25       ` [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards Pauli Nieminen
  0 siblings, 2 replies; 8+ messages in thread
From: Jerome Glisse @ 2010-02-11 11:51 UTC (permalink / raw)
  To: Maarten Maathuis; +Cc: dri-devel

On Thu, Feb 11, 2010 at 12:40:45AM +0100, Maarten Maathuis wrote:
> 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.
> 

Yeah good catch, it's best to do a separate asic struct for r200 rather
than changing the static struct.

Cheers,
Jerome

------------------------------------------------------------------------------
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
--

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards.
  2010-02-11 11:51     ` Jerome Glisse
@ 2010-02-11 15:08       ` Alex Deucher
  2010-02-11 17:55         ` [PATCH] drm/radeon/kms: Create asic structure for r300 pcie cards Pauli Nieminen
  2010-02-11 17:25       ` [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards Pauli Nieminen
  1 sibling, 1 reply; 8+ messages in thread
From: Alex Deucher @ 2010-02-11 15:08 UTC (permalink / raw)
  To: Jerome Glisse; +Cc: dri-devel

On Thu, Feb 11, 2010 at 6:51 AM, Jerome Glisse <glisse@freedesktop.org> wrote:
> On Thu, Feb 11, 2010 at 12:40:45AM +0100, Maarten Maathuis wrote:
>> 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.
>>
>
> Yeah good catch, it's best to do a separate asic struct for r200 rather
> than changing the static struct.
>

We do a similar thing in the code already for AGP/PCIE r3xx/r4xx
cards.  Should probably fix that.

Alex

> Cheers,
> Jerome
>
> ------------------------------------------------------------------------------
> 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
--

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards.
  2010-02-11 11:51     ` Jerome Glisse
  2010-02-11 15:08       ` Alex Deucher
@ 2010-02-11 17:25       ` Pauli Nieminen
  1 sibling, 0 replies; 8+ messages in thread
From: Pauli Nieminen @ 2010-02-11 17:25 UTC (permalink / raw)
  To: dri-devel

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.

v2: Created a new asic object for r200 cards.

Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
---
 drivers/gpu/drm/radeon/r200.c          |   46 +++++++++++++++++++++
 drivers/gpu/drm/radeon/r300.c          |   44 --------------------
 drivers/gpu/drm/radeon/radeon_asic.h   |   69 +++++++++++++++++++++++++------
 drivers/gpu/drm/radeon/radeon_device.c |    4 +-
 4 files changed, 104 insertions(+), 59 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..0971e7e 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -43,7 +43,7 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev, uint32_t mem_clock
 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
 
 /*
- * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
+ * r100,rv100,rs100,rv200,rs200
  */
 extern int r100_init(struct radeon_device *rdev);
 extern void r100_fini(struct radeon_device *rdev);
@@ -120,6 +120,51 @@ static struct radeon_asic r100_asic = {
 	.ioctl_wait_idle = NULL,
 };
 
+/*
+ * r200,rv250,rs300,rv280
+ */
+extern int r200_copy_dma(struct radeon_device *rdev,
+			uint64_t src_offset,
+			uint64_t dst_offset,
+			unsigned num_pages,
+			struct radeon_fence *fence);
+static struct radeon_asic r200_asic = {
+	.init = &r100_init,
+	.fini = &r100_fini,
+	.suspend = &r100_suspend,
+	.resume = &r100_resume,
+	.vga_set_state = &r100_vga_set_state,
+	.gpu_reset = &r100_gpu_reset,
+	.gart_tlb_flush = &r100_pci_gart_tlb_flush,
+	.gart_set_page = &r100_pci_gart_set_page,
+	.cp_commit = &r100_cp_commit,
+	.ring_start = &r100_ring_start,
+	.ring_test = &r100_ring_test,
+	.ring_ib_execute = &r100_ring_ib_execute,
+	.irq_set = &r100_irq_set,
+	.irq_process = &r100_irq_process,
+	.get_vblank_counter = &r100_get_vblank_counter,
+	.fence_ring_emit = &r100_fence_ring_emit,
+	.cs_parse = &r100_cs_parse,
+	.copy_blit = &r100_copy_blit,
+	.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,
+	.get_memory_clock = &radeon_legacy_get_memory_clock,
+	.set_memory_clock = NULL,
+	.set_pcie_lanes = NULL,
+	.set_clock_gating = &radeon_legacy_set_clock_gating,
+	.set_surface_reg = r100_set_surface_reg,
+	.clear_surface_reg = r100_clear_surface_reg,
+	.bandwidth_update = &r100_bandwidth_update,
+	.hpd_init = &r100_hpd_init,
+	.hpd_fini = &r100_hpd_fini,
+	.hpd_sense = &r100_hpd_sense,
+	.hpd_set_polarity = &r100_hpd_set_polarity,
+	.ioctl_wait_idle = NULL,
+};
+
 
 /*
  * r300,r350,rv350,rv380
@@ -138,11 +183,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,
-			uint64_t src_offset,
-			uint64_t dst_offset,
-			unsigned num_pages,
-			struct radeon_fence *fence);
+
 static struct radeon_asic r300_asic = {
 	.init = &r300_init,
 	.fini = &r300_fini,
@@ -162,7 +203,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 +247,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 +296,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 +355,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 +401,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 +453,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 +496,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..b5c9d38 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -329,11 +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:
-		rdev->asic = &r100_asic;
+		rdev->asic = &r200_asic;
 		break;
 	case CHIP_R300:
 	case CHIP_R350:
-- 
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
--

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH] drm/radeon/kms: Create asic structure for r300 pcie cards.
  2010-02-11 15:08       ` Alex Deucher
@ 2010-02-11 17:55         ` Pauli Nieminen
  2010-02-18  4:49           ` Dave Airlie
  0 siblings, 1 reply; 8+ messages in thread
From: Pauli Nieminen @ 2010-02-11 17:55 UTC (permalink / raw)
  To: dri-devel; +Cc: Alex Deucher

Setting global asic structure to point to different function
would cause problem in system where is multiple r300 cards
with different bus type.

r300_asic_pcie is just copy from r300_asic with gart tlb
functions replaced with pcie versions.

Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
---
 drivers/gpu/drm/radeon/radeon_asic.h   |   38 ++++++++++++++++++++++++++++++++
 drivers/gpu/drm/radeon/radeon_device.c |    9 +++----
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 0971e7e..af18ffe 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -221,6 +221,44 @@ static struct radeon_asic r300_asic = {
 	.ioctl_wait_idle = NULL,
 };
 
+
+static struct radeon_asic r300_asic_pcie = {
+	.init = &r300_init,
+	.fini = &r300_fini,
+	.suspend = &r300_suspend,
+	.resume = &r300_resume,
+	.vga_set_state = &r100_vga_set_state,
+	.gpu_reset = &r300_gpu_reset,
+	.gart_tlb_flush = &rv370_pci_gart_tlb_flush,
+	.gart_set_page = &rv370_pci_gart_set_page,
+	.cp_commit = &r100_cp_commit,
+	.ring_start = &r300_ring_start,
+	.ring_test = &r100_ring_test,
+	.ring_ib_execute = &r100_ring_ib_execute,
+	.irq_set = &r100_irq_set,
+	.irq_process = &r100_irq_process,
+	.get_vblank_counter = &r100_get_vblank_counter,
+	.fence_ring_emit = &r300_fence_ring_emit,
+	.cs_parse = &r300_cs_parse,
+	.copy_blit = &r100_copy_blit,
+	.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,
+	.get_memory_clock = &radeon_legacy_get_memory_clock,
+	.set_memory_clock = NULL,
+	.set_pcie_lanes = &rv370_set_pcie_lanes,
+	.set_clock_gating = &radeon_legacy_set_clock_gating,
+	.set_surface_reg = r100_set_surface_reg,
+	.clear_surface_reg = r100_clear_surface_reg,
+	.bandwidth_update = &r100_bandwidth_update,
+	.hpd_init = &r100_hpd_init,
+	.hpd_fini = &r100_hpd_fini,
+	.hpd_sense = &r100_hpd_sense,
+	.hpd_set_polarity = &r100_hpd_set_polarity,
+	.ioctl_wait_idle = NULL,
+};
+
 /*
  * r420,r423,rv410
  */
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index b5c9d38..767aed8 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -341,11 +341,10 @@ int radeon_asic_init(struct radeon_device *rdev)
 	case CHIP_R350:
 	case CHIP_RV350:
 	case CHIP_RV380:
-		rdev->asic = &r300_asic;
-		if (rdev->flags & RADEON_IS_PCIE) {
-			rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
-			rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
-		}
+		if (rdev->flags & RADEON_IS_PCIE)
+			rdev->asic = &r300_asic_pcie;
+		else
+			rdev->asic = &r300_asic;
 		break;
 	case CHIP_R420:
 	case CHIP_R423:
-- 
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
--

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] drm/radeon/kms: Create asic structure for r300 pcie cards.
  2010-02-11 17:55         ` [PATCH] drm/radeon/kms: Create asic structure for r300 pcie cards Pauli Nieminen
@ 2010-02-18  4:49           ` Dave Airlie
  0 siblings, 0 replies; 8+ messages in thread
From: Dave Airlie @ 2010-02-18  4:49 UTC (permalink / raw)
  To: Pauli Nieminen; +Cc: Alex Deucher, dri-devel

On Fri, Feb 12, 2010 at 3:55 AM, Pauli Nieminen <suokkos@gmail.com> wrote:
> Setting global asic structure to point to different function
> would cause problem in system where is multiple r300 cards
> with different bus type.

This contains a typo which I fixed locally please make sure it
compiles before sending to me ;-)

hint: rv370_pci_set_gart_flush

Dave.

>
> r300_asic_pcie is just copy from r300_asic with gart tlb
> functions replaced with pcie versions.
>
> Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
> ---
>  drivers/gpu/drm/radeon/radeon_asic.h   |   38 ++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/radeon/radeon_device.c |    9 +++----
>  2 files changed, 42 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
> index 0971e7e..af18ffe 100644
> --- a/drivers/gpu/drm/radeon/radeon_asic.h
> +++ b/drivers/gpu/drm/radeon/radeon_asic.h
> @@ -221,6 +221,44 @@ static struct radeon_asic r300_asic = {
>        .ioctl_wait_idle = NULL,
>  };
>
> +
> +static struct radeon_asic r300_asic_pcie = {
> +       .init = &r300_init,
> +       .fini = &r300_fini,
> +       .suspend = &r300_suspend,
> +       .resume = &r300_resume,
> +       .vga_set_state = &r100_vga_set_state,
> +       .gpu_reset = &r300_gpu_reset,
> +       .gart_tlb_flush = &rv370_pci_gart_tlb_flush,
> +       .gart_set_page = &rv370_pci_gart_set_page,
> +       .cp_commit = &r100_cp_commit,
> +       .ring_start = &r300_ring_start,
> +       .ring_test = &r100_ring_test,
> +       .ring_ib_execute = &r100_ring_ib_execute,
> +       .irq_set = &r100_irq_set,
> +       .irq_process = &r100_irq_process,
> +       .get_vblank_counter = &r100_get_vblank_counter,
> +       .fence_ring_emit = &r300_fence_ring_emit,
> +       .cs_parse = &r300_cs_parse,
> +       .copy_blit = &r100_copy_blit,
> +       .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,
> +       .get_memory_clock = &radeon_legacy_get_memory_clock,
> +       .set_memory_clock = NULL,
> +       .set_pcie_lanes = &rv370_set_pcie_lanes,
> +       .set_clock_gating = &radeon_legacy_set_clock_gating,
> +       .set_surface_reg = r100_set_surface_reg,
> +       .clear_surface_reg = r100_clear_surface_reg,
> +       .bandwidth_update = &r100_bandwidth_update,
> +       .hpd_init = &r100_hpd_init,
> +       .hpd_fini = &r100_hpd_fini,
> +       .hpd_sense = &r100_hpd_sense,
> +       .hpd_set_polarity = &r100_hpd_set_polarity,
> +       .ioctl_wait_idle = NULL,
> +};
> +
>  /*
>  * r420,r423,rv410
>  */
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index b5c9d38..767aed8 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -341,11 +341,10 @@ int radeon_asic_init(struct radeon_device *rdev)
>        case CHIP_R350:
>        case CHIP_RV350:
>        case CHIP_RV380:
> -               rdev->asic = &r300_asic;
> -               if (rdev->flags & RADEON_IS_PCIE) {
> -                       rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
> -                       rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
> -               }
> +               if (rdev->flags & RADEON_IS_PCIE)
> +                       rdev->asic = &r300_asic_pcie;
> +               else
> +                       rdev->asic = &r300_asic;
>                break;
>        case CHIP_R420:
>        case CHIP_R423:
> --
> 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
>

------------------------------------------------------------------------------
Download Intel&reg; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs 
proactively, and fine-tune applications for parallel performance. 
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-02-18  4:49 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-10 22:10 [PATCH 1/2] drm/radeon: Skip dma copy test in benchmark if card doesn't have dma engine Pauli Nieminen
2010-02-10 22:10 ` [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards Pauli Nieminen
2010-02-10 23:40   ` Maarten Maathuis
2010-02-11 11:51     ` Jerome Glisse
2010-02-11 15:08       ` Alex Deucher
2010-02-11 17:55         ` [PATCH] drm/radeon/kms: Create asic structure for r300 pcie cards Pauli Nieminen
2010-02-18  4:49           ` Dave Airlie
2010-02-11 17:25       ` [PATCH 2/2] drm/radeon: Add asic hook for dma copy to r200 cards Pauli Nieminen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.