]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
drm/radeon: make ring rptr and wptr register offsets variable
authorChristian König <deathsimple@vodafone.de>
Thu, 13 Oct 2011 10:48:45 +0000 (12:48 +0200)
committerDave Airlie <airlied@redhat.com>
Tue, 20 Dec 2011 19:49:56 +0000 (19:49 +0000)
Every ring seems to have the concept of read and
write pointers. Make the register offset variable
so we can use the functions for different types of rings.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/ni.c
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_asic.h
drivers/gpu/drm/radeon/radeon_ring.c
drivers/gpu/drm/radeon/rv770.c

index fa11a04ae62e4d9ad4cf6fa6338e632424080994..d1264a7154a6ec0f93afc1f48c4e389db5361f28 100644 (file)
@@ -3120,7 +3120,8 @@ static int evergreen_startup(struct radeon_device *rdev)
        }
        evergreen_irq_set(rdev);
 
-       r = radeon_ring_init(rdev, cp, cp->ring_size);
+       r = radeon_ring_init(rdev, cp, cp->ring_size, RADEON_WB_CP_RPTR_OFFSET,
+                            R600_CP_RB_RPTR, R600_CP_RB_WPTR);
        if (r)
                return r;
        r = evergreen_cp_load_microcode(rdev);
index 636b8c5f57976194a7c115009398f943f43bc5dc..cc9aaeb104f5834c6aa65698a1efea705206bf9e 100644 (file)
@@ -1273,7 +1273,7 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_cp *cp)
                radeon_ring_unlock_commit(rdev, cp);
        }
        /* XXX deal with CP0,1,2 */
-       cp->rptr = RREG32(CP_RB0_RPTR);
+       cp->rptr = RREG32(cp->rptr_reg);
        return r100_gpu_cp_is_lockup(rdev, lockup, cp);
 }
 
@@ -1393,7 +1393,8 @@ static int cayman_startup(struct radeon_device *rdev)
        }
        evergreen_irq_set(rdev);
 
-       r = radeon_ring_init(rdev, cp, cp->ring_size);
+       r = radeon_ring_init(rdev, cp, cp->ring_size, RADEON_WB_CP_RPTR_OFFSET,
+                            CP_RB0_RPTR, CP_RB0_WPTR);
        if (r)
                return r;
        r = cayman_cp_load_microcode(rdev);
index 271cee7f817c9e0c59d1c399f31e4787c64d4a0c..6c328115e66cabf936f0cbdc4ccc22a8117b63a1 100644 (file)
@@ -1074,7 +1074,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
        rb_bufsz = drm_order(ring_size / 8);
        ring_size = (1 << (rb_bufsz + 1)) * 4;
        r100_cp_load_microcode(rdev);
-       r = radeon_ring_init(rdev, cp, ring_size);
+       r = radeon_ring_init(rdev, cp, ring_size, RADEON_WB_CP_RPTR_OFFSET,
+                            RADEON_CP_RB_RPTR, RADEON_CP_RB_WPTR);
        if (r) {
                return r;
        }
@@ -1179,13 +1180,6 @@ void r100_cp_disable(struct radeon_device *rdev)
        }
 }
 
-void r100_cp_commit(struct radeon_device *rdev, struct radeon_cp *cp)
-{
-       WREG32(RADEON_CP_RB_WPTR, cp->wptr);
-       (void)RREG32(RADEON_CP_RB_WPTR);
-}
-
-
 /*
  * CS functions
  */
@@ -2184,7 +2178,7 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_cp *cp)
                radeon_ring_write(cp, 0x80000000);
                radeon_ring_unlock_commit(rdev, cp);
        }
-       cp->rptr = RREG32(RADEON_CP_RB_RPTR);
+       cp->rptr = RREG32(cp->rptr_reg);
        return r100_gpu_cp_is_lockup(rdev, &rdev->config.r100.lockup, cp);
 }
 
index eaf57cc75828c220171418ef51ce70b6baa2b5a8..599753176741a12e1e1ae13d8c4a0526c4dd05da 100644 (file)
@@ -1372,7 +1372,7 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_cp *cp)
                radeon_ring_write(cp, 0x80000000);
                radeon_ring_unlock_commit(rdev, cp);
        }
-       cp->rptr = RREG32(R600_CP_RB_RPTR);
+       cp->rptr = RREG32(cp->rptr_reg);
        return r100_gpu_cp_is_lockup(rdev, lockup, cp);
 }
 
@@ -2234,12 +2234,6 @@ int r600_cp_resume(struct radeon_device *rdev)
        return 0;
 }
 
-void r600_cp_commit(struct radeon_device *rdev, struct radeon_cp *cp)
-{
-       WREG32(CP_RB_WPTR, cp->wptr);
-       (void)RREG32(CP_RB_WPTR);
-}
-
 void r600_ring_init(struct radeon_device *rdev, struct radeon_cp *cp, unsigned ring_size)
 {
        u32 rb_bufsz;
@@ -2474,7 +2468,9 @@ int r600_startup(struct radeon_device *rdev)
        }
        r600_irq_set(rdev);
 
-       r = radeon_ring_init(rdev, cp, cp->ring_size);
+       r = radeon_ring_init(rdev, cp, cp->ring_size, RADEON_WB_CP_RPTR_OFFSET,
+                            R600_CP_RB_RPTR, R600_CP_RB_WPTR);
+
        if (r)
                return r;
        r = r600_cp_load_microcode(rdev);
index 5bf8603f3956fb97bb4dc6296ebb590e2a892b52..bbe88ec3951dd8ec5c1494e0cbade0b7cf550e23 100644 (file)
@@ -525,8 +525,11 @@ struct radeon_cp {
        struct radeon_bo        *ring_obj;
        volatile uint32_t       *ring;
        unsigned                rptr;
+       unsigned                rptr_offs;
+       unsigned                rptr_reg;
        unsigned                wptr;
        unsigned                wptr_old;
+       unsigned                wptr_reg;
        unsigned                ring_size;
        unsigned                ring_free_dw;
        int                     count_dw;
@@ -602,7 +605,8 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_cp *cp);
 void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_cp *cp);
 void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_cp *cp);
 int radeon_ring_test(struct radeon_device *rdev, struct radeon_cp *cp);
-int radeon_ring_init(struct radeon_device *rdev, struct radeon_cp *cp, unsigned ring_size);
+int radeon_ring_init(struct radeon_device *rdev, struct radeon_cp *cp, unsigned ring_size,
+                    unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg);
 void radeon_ring_fini(struct radeon_device *rdev, struct radeon_cp *cp);
 
 
@@ -939,7 +943,6 @@ struct radeon_asic {
        int (*cp_init)(struct radeon_device *rdev, unsigned ring_size);
        void (*cp_fini)(struct radeon_device *rdev);
        void (*cp_disable)(struct radeon_device *rdev);
-       void (*cp_commit)(struct radeon_device *rdev, struct radeon_cp *cp);
        void (*ring_start)(struct radeon_device *rdev);
        int (*ring_test)(struct radeon_device *rdev, struct radeon_cp *cp);
        void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib);
@@ -1491,7 +1494,6 @@ void radeon_ring_write(struct radeon_cp *cp, uint32_t v);
 #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev))
 #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev))
 #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart_set_page((rdev), (i), (p))
-#define radeon_cp_commit(rdev, cp) (rdev)->asic->cp_commit((rdev), (cp))
 #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev))
 #define radeon_ring_test(rdev, cp) (rdev)->asic->ring_test((rdev), (cp))
 #define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib))
index 8cfbbc77d70bcfad9b110dfa1bdb2ab71cf41456..1b208ed814a2173f8986a0e3bfb0a415ada95324 100644 (file)
@@ -138,7 +138,6 @@ static struct radeon_asic r100_asic = {
        .asic_reset = &r100_asic_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,
@@ -187,7 +186,6 @@ static struct radeon_asic r200_asic = {
        .asic_reset = &r100_asic_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,
@@ -235,7 +233,6 @@ static struct radeon_asic r300_asic = {
        .asic_reset = &r300_asic_reset,
        .gart_tlb_flush = &r100_pci_gart_tlb_flush,
        .gart_set_page = &r100_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,
@@ -284,7 +281,6 @@ static struct radeon_asic r300_asic_pcie = {
        .asic_reset = &r300_asic_reset,
        .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
        .gart_set_page = &rv370_pcie_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,
@@ -332,7 +328,6 @@ static struct radeon_asic r420_asic = {
        .asic_reset = &r300_asic_reset,
        .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
        .gart_set_page = &rv370_pcie_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,
@@ -381,7 +376,6 @@ static struct radeon_asic rs400_asic = {
        .asic_reset = &r300_asic_reset,
        .gart_tlb_flush = &rs400_gart_tlb_flush,
        .gart_set_page = &rs400_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,
@@ -430,7 +424,6 @@ static struct radeon_asic rs600_asic = {
        .asic_reset = &rs600_asic_reset,
        .gart_tlb_flush = &rs600_gart_tlb_flush,
        .gart_set_page = &rs600_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,
@@ -479,7 +472,6 @@ static struct radeon_asic rs690_asic = {
        .asic_reset = &rs600_asic_reset,
        .gart_tlb_flush = &rs400_gart_tlb_flush,
        .gart_set_page = &rs400_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,
@@ -528,7 +520,6 @@ static struct radeon_asic rv515_asic = {
        .asic_reset = &rs600_asic_reset,
        .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
        .gart_set_page = &rv370_pcie_gart_set_page,
-       .cp_commit = &r100_cp_commit,
        .ring_start = &rv515_ring_start,
        .ring_test = &r100_ring_test,
        .ring_ib_execute = &r100_ring_ib_execute,
@@ -577,7 +568,6 @@ static struct radeon_asic r520_asic = {
        .asic_reset = &rs600_asic_reset,
        .gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
        .gart_set_page = &rv370_pcie_gart_set_page,
-       .cp_commit = &r100_cp_commit,
        .ring_start = &rv515_ring_start,
        .ring_test = &r100_ring_test,
        .ring_ib_execute = &r100_ring_ib_execute,
@@ -621,7 +611,6 @@ static struct radeon_asic r600_asic = {
        .fini = &r600_fini,
        .suspend = &r600_suspend,
        .resume = &r600_resume,
-       .cp_commit = &r600_cp_commit,
        .vga_set_state = &r600_vga_set_state,
        .gpu_is_lockup = &r600_gpu_is_lockup,
        .asic_reset = &r600_asic_reset,
@@ -669,7 +658,6 @@ static struct radeon_asic rs780_asic = {
        .fini = &r600_fini,
        .suspend = &r600_suspend,
        .resume = &r600_resume,
-       .cp_commit = &r600_cp_commit,
        .gpu_is_lockup = &r600_gpu_is_lockup,
        .vga_set_state = &r600_vga_set_state,
        .asic_reset = &r600_asic_reset,
@@ -717,7 +705,6 @@ static struct radeon_asic rv770_asic = {
        .fini = &rv770_fini,
        .suspend = &rv770_suspend,
        .resume = &rv770_resume,
-       .cp_commit = &r600_cp_commit,
        .asic_reset = &r600_asic_reset,
        .gpu_is_lockup = &r600_gpu_is_lockup,
        .vga_set_state = &r600_vga_set_state,
@@ -765,7 +752,6 @@ static struct radeon_asic evergreen_asic = {
        .fini = &evergreen_fini,
        .suspend = &evergreen_suspend,
        .resume = &evergreen_resume,
-       .cp_commit = &r600_cp_commit,
        .gpu_is_lockup = &evergreen_gpu_is_lockup,
        .asic_reset = &evergreen_asic_reset,
        .vga_set_state = &r600_vga_set_state,
@@ -813,7 +799,6 @@ static struct radeon_asic sumo_asic = {
        .fini = &evergreen_fini,
        .suspend = &evergreen_suspend,
        .resume = &evergreen_resume,
-       .cp_commit = &r600_cp_commit,
        .gpu_is_lockup = &evergreen_gpu_is_lockup,
        .asic_reset = &evergreen_asic_reset,
        .vga_set_state = &r600_vga_set_state,
@@ -861,7 +846,6 @@ static struct radeon_asic btc_asic = {
        .fini = &evergreen_fini,
        .suspend = &evergreen_suspend,
        .resume = &evergreen_resume,
-       .cp_commit = &r600_cp_commit,
        .gpu_is_lockup = &evergreen_gpu_is_lockup,
        .asic_reset = &evergreen_asic_reset,
        .vga_set_state = &r600_vga_set_state,
@@ -909,7 +893,6 @@ static struct radeon_asic cayman_asic = {
        .fini = &cayman_fini,
        .suspend = &cayman_suspend,
        .resume = &cayman_resume,
-       .cp_commit = &r600_cp_commit,
        .gpu_is_lockup = &cayman_gpu_is_lockup,
        .asic_reset = &cayman_asic_reset,
        .vga_set_state = &r600_vga_set_state,
index 4f8447557298ae3241716f03f4d94d6486965b7e..4f9ba6d0330ff9867906f752cad3ffd15fe710e5 100644 (file)
@@ -63,7 +63,6 @@ int r100_asic_reset(struct radeon_device *rdev);
 u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
 void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
 int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
-void r100_cp_commit(struct radeon_device *rdev, struct radeon_cp *cp);
 void r100_ring_start(struct radeon_device *rdev);
 int r100_irq_set(struct radeon_device *rdev);
 int r100_irq_process(struct radeon_device *rdev);
@@ -297,7 +296,6 @@ int r600_resume(struct radeon_device *rdev);
 void r600_vga_set_state(struct radeon_device *rdev, bool state);
 int r600_wb_init(struct radeon_device *rdev);
 void r600_wb_fini(struct radeon_device *rdev);
-void r600_cp_commit(struct radeon_device *rdev, struct radeon_cp *cp);
 void r600_pcie_gart_tlb_flush(struct radeon_device *rdev);
 uint32_t r600_pciep_rreg(struct radeon_device *rdev, uint32_t reg);
 void r600_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
index bc8a5807f1a4694f5e9af0fce73858b6960fe898..209834dbf18fe09418939da2be19b6ab51f1673c 100644 (file)
@@ -287,13 +287,9 @@ void radeon_ib_pool_fini(struct radeon_device *rdev)
 void radeon_ring_free_size(struct radeon_device *rdev, struct radeon_cp *cp)
 {
        if (rdev->wb.enabled)
-               rdev->cp.rptr = le32_to_cpu(rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]);
-       else {
-               if (rdev->family >= CHIP_R600)
-                       rdev->cp.rptr = RREG32(R600_CP_RB_RPTR);
-               else
-                       rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR);
-       }
+               cp->rptr = le32_to_cpu(rdev->wb.wb[cp->rptr_offs/4]);
+       else
+               cp->rptr = RREG32(cp->rptr_reg);
        /* This works because ring_size is a power of 2 */
        cp->ring_free_dw = (cp->rptr + (cp->ring_size / 4));
        cp->ring_free_dw -= cp->wptr;
@@ -350,7 +346,8 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_cp *cp)
                radeon_ring_write(cp, 2 << 30);
        }
        DRM_MEMORYBARRIER();
-       radeon_cp_commit(rdev, cp);
+       WREG32(cp->wptr_reg, cp->wptr);
+       (void)RREG32(cp->wptr_reg);
 }
 
 void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_cp *cp)
@@ -365,11 +362,15 @@ void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_cp *cp)
        mutex_unlock(&cp->mutex);
 }
 
-int radeon_ring_init(struct radeon_device *rdev, struct radeon_cp *cp, unsigned ring_size)
+int radeon_ring_init(struct radeon_device *rdev, struct radeon_cp *cp, unsigned ring_size,
+                    unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg)
 {
        int r;
 
        cp->ring_size = ring_size;
+       cp->rptr_offs = rptr_offs;
+       cp->rptr_reg = rptr_reg;
+       cp->wptr_reg = wptr_reg;
        /* Allocate ring buffer */
        if (cp->ring_obj == NULL) {
                r = radeon_bo_create(rdev, cp->ring_size, PAGE_SIZE, true,
index 0d0d811fc80b31dc8ddc1e8aa9b7c351242fbc1c..a2c60598d0f799a5c85b105abc0d5379bb1ea730 100644 (file)
@@ -1092,7 +1092,8 @@ static int rv770_startup(struct radeon_device *rdev)
        }
        r600_irq_set(rdev);
 
-       r = radeon_ring_init(rdev, cp, cp->ring_size);
+       r = radeon_ring_init(rdev, cp, cp->ring_size, RADEON_WB_CP_RPTR_OFFSET,
+                            R600_CP_RB_RPTR, R600_CP_RB_WPTR);
        if (r)
                return r;
        r = rv770_cp_load_microcode(rdev);