[haiku-commits] haiku: hrev43304 - headers/private/graphics/radeon_hd src/add-ons/accelerants/radeon_hd

  • From: kallisti5@xxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 22 Nov 2011 00:46:45 +0100 (CET)

hrev43304 adds 1 changeset to branch 'master'
old head: 97b846e8744cbee43c68e9dbec4c3027c89c7197
new head: 0cd972316db9c56329f5f4e414826c3a01237f33

----------------------------------------------------------------------------

5 files changed, 64 insertions(+), 14 deletions(-)
headers/private/graphics/radeon_hd/r600_reg.h    |    6 +++
headers/private/graphics/radeon_hd/r700_reg.h    |   28 ++++++------
src/add-ons/accelerants/radeon_hd/accelerant.cpp |    3 +
src/add-ons/accelerants/radeon_hd/gpu.cpp        |   40 ++++++++++++++++++
src/add-ons/accelerants/radeon_hd/gpu.h          |    1 +

############################################################################

Revision:    hrev43304
Commit:      0cd972316db9c56329f5f4e414826c3a01237f33
URL:         http://cgit.haiku-os.org/haiku/commit/?id=0cd9723
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Mon Nov 21 23:54:27 2011 UTC

Add first hints of thermal monitoring on radeon cards

* add a few missing/needed header defines
* show GPU temp in millidegrees C on r600/r700
* evergreen+ support soon
* function may be moved to driver long term once testing done

----------------------------------------------------------------------------

diff --git a/headers/private/graphics/radeon_hd/r600_reg.h 
b/headers/private/graphics/radeon_hd/r600_reg.h
index 73e50db..2def1ce 100644
--- a/headers/private/graphics/radeon_hd/r600_reg.h
+++ b/headers/private/graphics/radeon_hd/r600_reg.h
@@ -183,4 +183,10 @@
 #define R600_HDMI_CONFIG1                 0x7600
 #define R600_HDMI_CONFIG2                 0x7a00
 
+/* Thermal information */
+#define        R600_CG_THERMAL_STATUS                  0x7F4
+#define                R600_ASIC_T(x)                          ((x) << 0)
+#define                R600_ASIC_T_MASK                        0x1FF
+#define                R600_ASIC_T_SHIFT                       0
+
 #endif
diff --git a/headers/private/graphics/radeon_hd/r700_reg.h 
b/headers/private/graphics/radeon_hd/r700_reg.h
index bf38804..7bfe5d2 100644
--- a/headers/private/graphics/radeon_hd/r700_reg.h
+++ b/headers/private/graphics/radeon_hd/r700_reg.h
@@ -121,25 +121,25 @@
 #define                CMDFIFO_AVAIL_MASK                              
0x0000000F
 #define                GUI_ACTIVE                                      (1<<31)
 #define        GRBM_STATUS2                                    0x8014
-
-#define        CG_MULT_THERMAL_STATUS                          0x740
-#define                ASIC_T(x)                               ((x) << 16)
-#define                ASIC_T_MASK                             0x3FF0000
-#define                ASIC_T_SHIFT                            16
 #endif
 
-#define        HDP_HOST_PATH_CNTL                              0x2C00
-#define        HDP_NONSURFACE_BASE                             0x2C04
-#define        HDP_NONSURFACE_INFO                             0x2C08
-#define        HDP_NONSURFACE_SIZE                             0x2C0C
-#define HDP_REG_COHERENCY_FLUSH_CNTL                   0x54A0
-#define        HDP_TILING_CONFIG                               0x2F3C
-#define HDP_DEBUG1                                      0x2F34
+#define        R700_CG_MULT_THERMAL_STATUS                     0x740
+#define                R700_ASIC_T(x)                          ((x) << 16)
+#define                R700_ASIC_T_MASK                        0x3FF0000
+#define                R700_ASIC_T_SHIFT                       16
+
+#define        HDP_HOST_PATH_CNTL                                      0x2C00
+#define        HDP_NONSURFACE_BASE                                     0x2C04
+#define        HDP_NONSURFACE_INFO                                     0x2C08
+#define        HDP_NONSURFACE_SIZE                                     0x2C0C
+#define HDP_REG_COHERENCY_FLUSH_CNTL           0x54A0
+#define        HDP_TILING_CONFIG                                       0x2F3C
+#define HDP_DEBUG1                                                     0x2F34
 
-#define R700_MC_SHARED_CHMAP                                           0x2004
+#define R700_MC_SHARED_CHMAP                           0x2004
 #define                NOOFCHAN_SHIFT                                  12
 #define                NOOFCHAN_MASK                                   
0x00003000
-#define R700_MC_SHARED_CHREMAP                                 0x2008
+#define R700_MC_SHARED_CHREMAP                         0x2008
 
 #define        R700_MC_ARB_RAMCFG                                      0x2760
 #define                NOOFBANK_SHIFT                                  0
diff --git a/src/add-ons/accelerants/radeon_hd/accelerant.cpp 
b/src/add-ons/accelerants/radeon_hd/accelerant.cpp
index 94d50f3..0c75b3c 100644
--- a/src/add-ons/accelerants/radeon_hd/accelerant.cpp
+++ b/src/add-ons/accelerants/radeon_hd/accelerant.cpp
@@ -287,6 +287,9 @@ radeon_init_accelerant(int device)
 
        radeon_gpu_mc_setup();
 
+       TRACE("%s: Current GPU temperature: %" B_PRId32 " mC\n",
+               __func__, radeon_get_temp());
+
        TRACE("%s done\n", __func__);
        return B_OK;
 }
diff --git a/src/add-ons/accelerants/radeon_hd/gpu.cpp 
b/src/add-ons/accelerants/radeon_hd/gpu.cpp
index 76e7ae5..038ae40 100644
--- a/src/add-ons/accelerants/radeon_hd/gpu.cpp
+++ b/src/add-ons/accelerants/radeon_hd/gpu.cpp
@@ -774,3 +774,43 @@ radeon_gpu_gpio_setup()
 
        return B_OK;
 }
+
+
+int32
+radeon_get_temp()
+{
+       // return GPU temp in millidegrees C
+
+       radeon_shared_info &info = *gInfo->shared_info;
+
+       uint32 rawTemp = 0;     // temp
+       int32 finalTemp = 0; // actual_temp
+
+       if (info.chipsetID >= RADEON_RV770) {
+               rawTemp = (Read32(OUT, R700_CG_MULT_THERMAL_STATUS) & 
R700_ASIC_T_MASK)
+                       >> R700_ASIC_T_SHIFT;
+               if (rawTemp & 0x400)
+                       finalTemp = -256;
+               else if (rawTemp & 0x200)
+                       finalTemp = 255;
+               else if (rawTemp & 0x100) {
+                       finalTemp = rawTemp & 0x1ff;
+                       finalTemp |= ~0x1ff;
+               } else
+                       finalTemp = rawTemp & 0xff;
+
+               return (finalTemp * 1000) / 2;
+
+       } else if (info.chipsetID >= RADEON_R600) {
+               rawTemp = (Read32(OUT, R600_CG_THERMAL_STATUS) & 
R600_ASIC_T_MASK)
+                       >> R600_ASIC_T_SHIFT;
+               finalTemp = rawTemp & 0xff;
+
+               if (rawTemp & 0x100)
+                       finalTemp -= 256;
+
+               return finalTemp * 1000;
+       }
+
+       return -1;
+}
diff --git a/src/add-ons/accelerants/radeon_hd/gpu.h 
b/src/add-ons/accelerants/radeon_hd/gpu.h
index 373ddcc..81005ff 100644
--- a/src/add-ons/accelerants/radeon_hd/gpu.h
+++ b/src/add-ons/accelerants/radeon_hd/gpu.h
@@ -177,6 +177,7 @@ status_t radeon_gpu_irq_setup();
 status_t radeon_gpu_gpio_setup();
 status_t radeon_gpu_i2c_attach(uint32 id, uint8 hw_line);
 bool radeon_gpu_read_edid(uint32 connector, edid1_info *edid);
+int32 radeon_get_temp();
 
 
 #endif


Other related posts:

  • » [haiku-commits] haiku: hrev43304 - headers/private/graphics/radeon_hd src/add-ons/accelerants/radeon_hd - kallisti5