]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/gpu/drm/radeon/radeon.h
drm/radeon/kms: call r100_cp_disable rather than duplicating code.
[net-next-2.6.git] / drivers / gpu / drm / radeon / radeon.h
index b1d945b8ed6cac571f8c50a015324846a451e411..24574bc0f2af7a864b61a43aaddbb74a6114f2eb 100644 (file)
@@ -50,8 +50,8 @@
 #include <linux/kref.h>
 
 #include "radeon_mode.h"
+#include "radeon_share.h"
 #include "radeon_reg.h"
-#include "r300.h"
 
 /*
  * Modules parameters.
@@ -66,6 +66,7 @@ extern int radeon_gart_size;
 extern int radeon_benchmarking;
 extern int radeon_testing;
 extern int radeon_connector_table;
+extern int radeon_tv;
 
 /*
  * Copy from radeon_drv.h so we don't have to include both and have conflicting
@@ -111,10 +112,11 @@ enum radeon_family {
        CHIP_RV635,
        CHIP_RV670,
        CHIP_RS780,
+       CHIP_RS880,
        CHIP_RV770,
        CHIP_RV730,
        CHIP_RV710,
-       CHIP_RS880,
+       CHIP_RV740,
        CHIP_LAST,
 };
 
@@ -151,10 +153,21 @@ struct radeon_device;
  */
 bool radeon_get_bios(struct radeon_device *rdev);
 
+
 /*
- * Clocks
+ * Dummy page
  */
+struct radeon_dummy_page {
+       struct page     *page;
+       dma_addr_t      addr;
+};
+int radeon_dummy_page_init(struct radeon_device *rdev);
+void radeon_dummy_page_fini(struct radeon_device *rdev);
 
+
+/*
+ * Clocks
+ */
 struct radeon_clock {
        struct radeon_pll p1pll;
        struct radeon_pll p2pll;
@@ -165,6 +178,7 @@ struct radeon_clock {
        uint32_t default_sclk;
 };
 
+
 /*
  * Fences.
  */
@@ -242,6 +256,7 @@ int radeon_object_pin(struct radeon_object *robj, uint32_t domain,
                      uint64_t *gpu_addr);
 void radeon_object_unpin(struct radeon_object *robj);
 int radeon_object_wait(struct radeon_object *robj);
+int radeon_object_busy_domain(struct radeon_object *robj, uint32_t *cur_placement);
 int radeon_object_evict_vram(struct radeon_device *rdev);
 int radeon_object_mmap(struct radeon_object *robj, uint64_t *offset);
 void radeon_object_force_delete(struct radeon_device *rdev);
@@ -330,14 +345,18 @@ struct radeon_mc {
        resource_size_t         aper_size;
        resource_size_t         aper_base;
        resource_size_t         agp_base;
-       unsigned                gtt_location;
-       unsigned                gtt_size;
-       unsigned                vram_location;
        /* for some chips with <= 32MB we need to lie
         * about vram size near mc fb location */
-       unsigned                mc_vram_size;
+       u64                     mc_vram_size;
+       u64                     gtt_location;
+       u64                     gtt_size;
+       u64                     gtt_start;
+       u64                     gtt_end;
+       u64                     vram_location;
+       u64                     vram_start;
+       u64                     vram_end;
        unsigned                vram_width;
-       unsigned                real_vram_size;
+       u64                     real_vram_size;
        int                     vram_mtrr;
        bool                    vram_is_ddr;
 };
@@ -409,6 +428,16 @@ struct radeon_cp {
        bool                    ready;
 };
 
+struct r600_blit {
+       struct radeon_object    *shader_obj;
+       u64 shader_gpu_addr;
+       u32 vs_offset, ps_offset;
+       u32 state_offset;
+       u32 state_len;
+       u32 vb_used, vb_total;
+       struct radeon_ib *vb_ib;
+};
+
 int radeon_ib_get(struct radeon_device *rdev, struct radeon_ib **ib);
 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib);
 int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib);
@@ -461,6 +490,7 @@ struct radeon_cs_parser {
        int                     chunk_relocs_idx;
        struct radeon_ib        *ib;
        void                    *track;
+       unsigned                family;
 };
 
 struct radeon_cs_packet {
@@ -557,6 +587,9 @@ int r100_debugfs_cp_init(struct radeon_device *rdev);
  */
 struct radeon_asic {
        int (*init)(struct radeon_device *rdev);
+       void (*fini)(struct radeon_device *rdev);
+       int (*resume)(struct radeon_device *rdev);
+       int (*suspend)(struct radeon_device *rdev);
        void (*errata)(struct radeon_device *rdev);
        void (*vram_info)(struct radeon_device *rdev);
        int (*gpu_reset)(struct radeon_device *rdev);
@@ -571,9 +604,14 @@ 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);
        void (*ring_start)(struct radeon_device *rdev);
+       int (*ring_test)(struct radeon_device *rdev);
+       void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib);
+       int (*ib_test)(struct radeon_device *rdev);
        int (*irq_set)(struct radeon_device *rdev);
        int (*irq_process)(struct radeon_device *rdev);
+       u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc);
        void (*fence_ring_emit)(struct radeon_device *rdev, struct radeon_fence *fence);
        int (*cs_parse)(struct radeon_cs_parser *p);
        int (*copy_blit)(struct radeon_device *rdev,
@@ -602,8 +640,16 @@ struct radeon_asic {
        void (*bandwidth_update)(struct radeon_device *rdev);
 };
 
+struct r100_asic {
+       const unsigned  *reg_safe_bm;
+       unsigned        reg_safe_bm_size;
+};
+
 union radeon_asic_config {
        struct r300_asic        r300;
+       struct r100_asic        r100;
+       struct r600_asic        r600;
+       struct rv770_asic       rv770;
 };
 
 
@@ -653,6 +699,7 @@ struct radeon_device {
        int                             usec_timeout;
        enum radeon_pll_errata          pll_errata;
        int                             num_gb_pipes;
+       int                             num_z_pipes;
        int                             disp_priority;
        /* BIOS */
        uint8_t                         *bios;
@@ -666,14 +713,11 @@ struct radeon_device {
        resource_size_t                 rmmio_base;
        resource_size_t                 rmmio_size;
        void                            *rmmio;
-       radeon_rreg_t                   mm_rreg;
-       radeon_wreg_t                   mm_wreg;
        radeon_rreg_t                   mc_rreg;
        radeon_wreg_t                   mc_wreg;
        radeon_rreg_t                   pll_rreg;
        radeon_wreg_t                   pll_wreg;
-       radeon_rreg_t                   pcie_rreg;
-       radeon_wreg_t                   pcie_wreg;
+       uint32_t                        pcie_reg_mask;
        radeon_rreg_t                   pciep_rreg;
        radeon_wreg_t                   pciep_wreg;
        struct radeon_clock             clock;
@@ -691,11 +735,16 @@ struct radeon_device {
        struct radeon_pm                pm;
        struct mutex                    cs_mutex;
        struct radeon_wb                wb;
+       struct radeon_dummy_page        dummy_page;
        bool                            gpu_lockup;
        bool                            shutdown;
        bool                            suspend;
        bool                            need_dma32;
+       bool                            new_init_path;
        struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES];
+       const struct firmware *me_fw;   /* all family ME firmware */
+       const struct firmware *pfp_fw;  /* r6/700 PFP firmware */
+       struct r600_blit r600_blit;
 };
 
 int radeon_device_init(struct radeon_device *rdev,
@@ -705,22 +754,50 @@ int radeon_device_init(struct radeon_device *rdev,
 void radeon_device_fini(struct radeon_device *rdev);
 int radeon_gpu_wait_for_idle(struct radeon_device *rdev);
 
+/* r600 blit */
+int r600_blit_prepare_copy(struct radeon_device *rdev, int size_bytes);
+void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence);
+void r600_kms_blit_copy(struct radeon_device *rdev,
+                       u64 src_gpu_addr, u64 dst_gpu_addr,
+                       int size_bytes);
+
+static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg)
+{
+       if (reg < 0x10000)
+               return readl(((void __iomem *)rdev->rmmio) + reg);
+       else {
+               writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
+               return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
+       }
+}
+
+static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
+{
+       if (reg < 0x10000)
+               writel(v, ((void __iomem *)rdev->rmmio) + reg);
+       else {
+               writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
+               writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
+       }
+}
+
 
 /*
  * Registers read & write functions.
  */
 #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg))
 #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg))
-#define RREG32(reg) rdev->mm_rreg(rdev, (reg))
-#define WREG32(reg, v) rdev->mm_wreg(rdev, (reg), (v))
+#define RREG32(reg) r100_mm_rreg(rdev, (reg))
+#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg)))
+#define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v))
 #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
 #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
 #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg))
 #define WREG32_PLL(reg, v) rdev->pll_wreg(rdev, (reg), (v))
 #define RREG32_MC(reg) rdev->mc_rreg(rdev, (reg))
 #define WREG32_MC(reg, v) rdev->mc_wreg(rdev, (reg), (v))
-#define RREG32_PCIE(reg) rdev->pcie_rreg(rdev, (reg))
-#define WREG32_PCIE(reg, v) rdev->pcie_wreg(rdev, (reg), (v))
+#define RREG32_PCIE(reg) rv370_pcie_rreg(rdev, (reg))
+#define WREG32_PCIE(reg, v) rv370_pcie_wreg(rdev, (reg), (v))
 #define WREG32_P(reg, val, mask)                               \
        do {                                                    \
                uint32_t tmp_ = RREG32(reg);                    \
@@ -735,6 +812,25 @@ int radeon_gpu_wait_for_idle(struct radeon_device *rdev);
                tmp_ |= ((val) & ~(mask));                      \
                WREG32_PLL(reg, tmp_);                          \
        } while (0)
+#define DREG32_SYS(sqf, rdev, reg) seq_printf((sqf), #reg " : 0x%08X\n", r100_mm_rreg((rdev), (reg)))
+
+/*
+ * Indirect registers accessor
+ */
+static inline uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg)
+{
+       uint32_t r;
+
+       WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask));
+       r = RREG32(RADEON_PCIE_DATA);
+       return r;
+}
+
+static inline void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
+{
+       WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask));
+       WREG32(RADEON_PCIE_DATA, (v));
+}
 
 void r100_pll_errata_after_index(struct radeon_device *rdev);
 
@@ -781,51 +877,6 @@ void radeon_atombios_fini(struct radeon_device *rdev);
 /*
  * RING helpers.
  */
-#define CP_PACKET0                     0x00000000
-#define                PACKET0_BASE_INDEX_SHIFT        0
-#define                PACKET0_BASE_INDEX_MASK         (0x1ffff << 0)
-#define                PACKET0_COUNT_SHIFT             16
-#define                PACKET0_COUNT_MASK              (0x3fff << 16)
-#define CP_PACKET1                     0x40000000
-#define CP_PACKET2                     0x80000000
-#define                PACKET2_PAD_SHIFT               0
-#define                PACKET2_PAD_MASK                (0x3fffffff << 0)
-#define CP_PACKET3                     0xC0000000
-#define                PACKET3_IT_OPCODE_SHIFT         8
-#define                PACKET3_IT_OPCODE_MASK          (0xff << 8)
-#define                PACKET3_COUNT_SHIFT             16
-#define                PACKET3_COUNT_MASK              (0x3fff << 16)
-/* PACKET3 op code */
-#define                PACKET3_NOP                     0x10
-#define                PACKET3_3D_DRAW_VBUF            0x28
-#define                PACKET3_3D_DRAW_IMMD            0x29
-#define                PACKET3_3D_DRAW_INDX            0x2A
-#define                PACKET3_3D_LOAD_VBPNTR          0x2F
-#define                PACKET3_INDX_BUFFER             0x33
-#define                PACKET3_3D_DRAW_VBUF_2          0x34
-#define                PACKET3_3D_DRAW_IMMD_2          0x35
-#define                PACKET3_3D_DRAW_INDX_2          0x36
-#define                PACKET3_BITBLT_MULTI            0x9B
-
-#define PACKET0(reg, n)        (CP_PACKET0 |                                   \
-                        REG_SET(PACKET0_BASE_INDEX, (reg) >> 2) |      \
-                        REG_SET(PACKET0_COUNT, (n)))
-#define PACKET2(v)     (CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
-#define PACKET3(op, n) (CP_PACKET3 |                                   \
-                        REG_SET(PACKET3_IT_OPCODE, (op)) |             \
-                        REG_SET(PACKET3_COUNT, (n)))
-
-#define        PACKET_TYPE0    0
-#define        PACKET_TYPE1    1
-#define        PACKET_TYPE2    2
-#define        PACKET_TYPE3    3
-
-#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
-#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
-#define CP_PACKET0_GET_REG(h) (((h) & 0x1FFF) << 2)
-#define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1)
-#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
-
 static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
 {
 #if DRM_DEBUG_CODE
@@ -844,6 +895,9 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
  * ASICs macro.
  */
 #define radeon_init(rdev) (rdev)->asic->init((rdev))
+#define radeon_fini(rdev) (rdev)->asic->fini((rdev))
+#define radeon_resume(rdev) (rdev)->asic->resume((rdev))
+#define radeon_suspend(rdev) (rdev)->asic->suspend((rdev))
 #define radeon_cs_parse(p) rdev->asic->cs_parse((p))
 #define radeon_errata(rdev) (rdev)->asic->errata((rdev))
 #define radeon_vram_info(rdev) (rdev)->asic->vram_info((rdev))
@@ -859,9 +913,14 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
 #define radeon_cp_init(rdev,rsize) (rdev)->asic->cp_init((rdev), (rsize))
 #define radeon_cp_fini(rdev) (rdev)->asic->cp_fini((rdev))
 #define radeon_cp_disable(rdev) (rdev)->asic->cp_disable((rdev))
+#define radeon_cp_commit(rdev) (rdev)->asic->cp_commit((rdev))
 #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev))
+#define radeon_ring_test(rdev) (rdev)->asic->ring_test((rdev))
+#define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib))
+#define radeon_ib_test(rdev) (rdev)->asic->ib_test((rdev))
 #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev))
 #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev))
+#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc))
 #define radeon_fence_ring_emit(rdev, fence) (rdev)->asic->fence_ring_emit((rdev), (fence))
 #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy_blit((rdev), (s), (d), (np), (f))
 #define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy_dma((rdev), (s), (d), (np), (f))
@@ -874,4 +933,7 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
 #define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r)))
 #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev))
 
+/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */
+void r100_cp_disable(struct radeon_device *rdev);
+
 #endif