Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. #define R300_TEST
  3.  
  4. #include "r5xx_regs.h"
  5.  
  6.  
  7. #define R5XX_LOOP_COUNT 2000000
  8.  
  9. #define RADEON_CLOCK_CNTL_DATA              0x000c
  10.  
  11. #define RADEON_CLOCK_CNTL_INDEX             0x0008
  12. #       define RADEON_PLL_WR_EN             (1 << 7)
  13. #       define RADEON_PLL_DIV_SEL           (3 << 8)
  14. #       define RADEON_PLL2_DIV_SEL_MASK     ~(3 << 8)
  15.  
  16. #define RADEON_MCLK_CNTL                    0x0012 /* PLL */
  17. #       define RADEON_FORCEON_MCLKA         (1 << 16)
  18. #       define RADEON_FORCEON_MCLKB         (1 << 17)
  19. #       define RADEON_FORCEON_YCLKA         (1 << 18)
  20. #       define RADEON_FORCEON_YCLKB         (1 << 19)
  21. #       define RADEON_FORCEON_MC            (1 << 20)
  22. #       define RADEON_FORCEON_AIC           (1 << 21)
  23. #       define R300_DISABLE_MC_MCLKA        (1 << 21)
  24. #       define R300_DISABLE_MC_MCLKB        (1 << 21)
  25.  
  26. void radeon_engine_reset(RHDPtr info)
  27. {
  28.     u32_t  clock_cntl_index;
  29.     u32_t  mclk_cntl;
  30.     u32_t  rbbm_soft_reset;
  31.     u32_t  host_path_cntl;
  32.  
  33.     if (info->ChipFamily <= CHIP_FAMILY_RV410)
  34.     {
  35.                 /* may need something similar for newer chips */
  36.         clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX);
  37.         mclk_cntl = INPLL( RADEON_MCLK_CNTL);
  38.  
  39.         OUTPLL(RADEON_MCLK_CNTL, (mclk_cntl |
  40.                                                     RADEON_FORCEON_MCLKA |
  41.                                                     RADEON_FORCEON_MCLKB |
  42.                                                     RADEON_FORCEON_YCLKA |
  43.                                                     RADEON_FORCEON_YCLKB |
  44.                                                     RADEON_FORCEON_MC |
  45.                                                     RADEON_FORCEON_AIC));
  46.         }
  47.  
  48.     rbbm_soft_reset = INREG(RADEON_RBBM_SOFT_RESET);
  49.  
  50.     OUTREG(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset |
  51.                                               RADEON_SOFT_RESET_CP |
  52.                                               RADEON_SOFT_RESET_HI |
  53.                                               RADEON_SOFT_RESET_SE |
  54.                                               RADEON_SOFT_RESET_RE |
  55.                                               RADEON_SOFT_RESET_PP |
  56.                                               RADEON_SOFT_RESET_E2 |
  57.                                               RADEON_SOFT_RESET_RB));
  58.     INREG(RADEON_RBBM_SOFT_RESET);
  59.     OUTREG(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset &
  60.                                               ~(RADEON_SOFT_RESET_CP |
  61.                                                 RADEON_SOFT_RESET_HI |
  62.                                                 RADEON_SOFT_RESET_SE |
  63.                                                 RADEON_SOFT_RESET_RE |
  64.                                                 RADEON_SOFT_RESET_PP |
  65.                                                 RADEON_SOFT_RESET_E2 |
  66.                                                 RADEON_SOFT_RESET_RB)));
  67.     INREG(RADEON_RBBM_SOFT_RESET);
  68.  
  69.     if (info->ChipFamily <= CHIP_FAMILY_RV410) {
  70.         OUTPLL(RADEON_MCLK_CNTL, mclk_cntl);
  71.         OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index);
  72.         OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset);
  73.         }
  74.  };
  75.  
  76. static Bool R5xxFIFOWaitLocal(u32_t required)             //R100-R500
  77. {
  78.      int i;
  79.  
  80.      for (i = 0; i < RADEON_TIMEOUT; i++)
  81.         if (required <= (INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK))
  82.            return TRUE;
  83.  
  84.      dbgprintf("%s: Timeout 0x%08X.\n", __func__, (u32_t) INREG(RADEON_RBBM_STATUS));
  85.      return FALSE;
  86. }
  87.  
  88. void FIFOWait(u32_t required)
  89. {
  90.     int i;
  91.     for (i = 0; i < 200; i++)
  92.     {
  93.         if (required <= (INREG(RADEON_RBBM_STATUS) &
  94.                         RADEON_RBBM_FIFOCNT_MASK))
  95.            return ;
  96.         delay(2);
  97.     };
  98. };
  99.  
  100.  
  101. /*
  102.  * Flush all dirty data in the Pixel Cache to memory.
  103.  */
  104.  
  105. static Bool
  106. R5xx2DFlush()
  107. {
  108.     int i;
  109.  
  110.     MASKREG(R5XX_DSTCACHE_CTLSTAT,
  111.                 R5XX_DSTCACHE_FLUSH_ALL, R5XX_DSTCACHE_FLUSH_ALL);
  112.  
  113.     for (i = 0; i < R5XX_LOOP_COUNT; i++)
  114.         if (!(INREG(R5XX_DSTCACHE_CTLSTAT) & R5XX_DSTCACHE_BUSY))
  115.             return TRUE;
  116.  
  117.     dbgprintf("%s: Timeout 0x%08x.\n", __func__,
  118.          (unsigned int)INREG(R5XX_DSTCACHE_CTLSTAT));
  119.     return FALSE;
  120. }
  121.  
  122. static Bool
  123. R5xx2DIdleLocal()                                //R100-R500
  124. {
  125.     int i;
  126.  
  127.       /* wait for fifo to clear */
  128.     for (i = 0; i < R5XX_LOOP_COUNT; i++)
  129.         if (64 == (INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK))
  130.             break;
  131.  
  132.     if (i == R5XX_LOOP_COUNT) {
  133.         dbgprintf("%s: FIFO Timeout 0x%08X.\n", __func__,INREG(R5XX_RBBM_STATUS));
  134.         return FALSE;
  135.     }
  136.  
  137.       /* wait for engine to go idle */
  138.     for (i = 0; i < R5XX_LOOP_COUNT; i++) {
  139.         if (!(INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_ACTIVE)) {
  140.             R5xx2DFlush();
  141.             return TRUE;
  142.         }
  143.     }
  144.     dbgprintf("%s: Idle Timeout 0x%08X.\n", __func__,INREG(R5XX_RBBM_STATUS));
  145.     return FALSE;
  146. }
  147.  
  148.  
  149. void
  150. R5xx2DSetup()
  151. {
  152.  
  153.     /* Setup engine location. This shouldn't be necessary since we
  154.     * set them appropriately before any accel ops, but let's avoid
  155.      * random bogus DMA in case we inadvertently trigger the engine
  156.      * in the wrong place (happened). */
  157.     R5xxFIFOWaitLocal(2);
  158.     OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset);
  159.     OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset);
  160.  
  161.     R5xxFIFOWaitLocal(1);
  162.     MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
  163.  
  164.     OUTREG(R5XX_SURFACE_CNTL, rhd.surface_cntl);
  165.  
  166.     R5xxFIFOWaitLocal(3);
  167.     OUTREG(R5XX_SC_TOP_LEFT, 0);
  168.     OUTREG(R5XX_SC_BOTTOM_RIGHT,
  169.            RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX);
  170.     OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT,
  171.            RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX);
  172.  
  173.     R5xxFIFOWaitLocal(1);
  174. //    OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control |
  175. //           R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR);
  176.     OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  177.  
  178.     R5xxFIFOWaitLocal(5);
  179.     OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF);
  180.     OUTREG(R5XX_DP_BRUSH_BKGD_CLR, 0x00000000);
  181.     OUTREG(R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF);
  182.     OUTREG(R5XX_DP_SRC_BKGD_CLR, 0x00000000);
  183.     OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
  184.  
  185.     R5xx2DIdleLocal();
  186. }
  187.  
  188. void R5xxFIFOWait(u32_t required)
  189. {
  190.     if (!R5xxFIFOWaitLocal(required)) {
  191.       radeon_engine_reset(&rhd);
  192.       R5xx2DSetup();
  193.     }
  194. }
  195.  
  196. void R5xx2DIdle()
  197. {
  198.     if (!R5xx2DIdleLocal()) {
  199.   //    R5xx2DReset();
  200.       R5xx2DSetup();
  201.     }
  202. }
  203.  
  204.  
  205. void  R5xx2DInit()
  206. {
  207.     u32_t base;
  208.     int screensize;
  209.     int screenpitch;
  210.  
  211.     screensize = GetScreenSize();
  212.     screenpitch = GetScreenPitch();
  213.  
  214.     rhd.displayWidth  = screensize >> 16;
  215.     rhd.displayHeight = screensize & 0xFFFF;
  216.  
  217.     rhd.__xmin = 0;
  218.     rhd.__ymin = 0;
  219.     rhd.__xmax = rhd.displayWidth  - 1;
  220.     rhd.__ymax = rhd.displayHeight - 1;
  221.  
  222.     clip.xmin = 0;
  223.     clip.ymin = 0;
  224.     clip.xmax = rhd.displayWidth  - 1;
  225.     clip.ymax = rhd.displayHeight - 1;
  226.  
  227.     dbgprintf("screen width  %d height %d\n",
  228.                rhd.displayWidth, rhd.displayHeight);
  229.  
  230.     rhd.gui_control = ((6 << RADEON_GMC_DST_DATATYPE_SHIFT)
  231.                       | RADEON_GMC_CLR_CMP_CNTL_DIS
  232.                       | RADEON_GMC_DST_PITCH_OFFSET_CNTL);
  233.  
  234.     dbgprintf("gui_control %x \n", rhd.gui_control);
  235.  
  236.     rhd.surface_cntl = 0;
  237.  
  238.     rhd.dst_pitch_offset = (((rhd.displayWidth * 4 / 64)<< 22) |
  239.                                (rhd.fbLocation  >> 10));
  240.  
  241.  
  242.     dbgprintf("dst_pitch_offset %x \n", rhd.dst_pitch_offset);
  243.  
  244.     scr_pixmap.width  = rhd.displayWidth;
  245.     scr_pixmap.height = rhd.displayHeight;
  246.     scr_pixmap.format = PICT_a8r8g8b8;
  247.     scr_pixmap.flags  = PX_MEM_LOCAL;
  248.     scr_pixmap.pitch  = rhd.displayWidth * 4     ;//screenpitch;
  249.     scr_pixmap.local  = rhd.fbLocation;
  250.     scr_pixmap.pitch_offset =  rhd.dst_pitch_offset;
  251.     scr_pixmap.mapped = 0;
  252.  
  253.     R5xxFIFOWaitLocal(2);
  254.     OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset);
  255.     OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset);
  256.  
  257.     R5xxFIFOWaitLocal(1);
  258.     MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
  259.  
  260.     OUTREG(R5XX_SURFACE_CNTL, rhd.surface_cntl);
  261.  
  262. #if !R300_PIO
  263.  
  264.     init_cp(&rhd);
  265.  
  266. #endif
  267.  
  268.     R5xx2DSetup();
  269.  
  270. }
  271.  
  272.  
  273.  
  274.