00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "tdecpudevice.h"
00021
00022 #include <unistd.h>
00023
00024 #include <tqfile.h>
00025
00026 #include "tdeglobal.h"
00027
00028 #include "tdehardwaredevices.h"
00029
00030 #include "config.h"
00031
00032
00033 #if defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_HAL)
00034 #include <tqdbusdata.h>
00035 #include <tqdbusmessage.h>
00036 #include <tqdbusproxy.h>
00037 #include <tqdbusvariant.h>
00038 #include <tqdbusconnection.h>
00039 #endif // defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_HAL)
00040
00041
00042 TDECPUDevice::TDECPUDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) {
00043 m_frequency = -1;
00044 m_minfrequency = -1;
00045 m_maxfrequency = -1;
00046 m_corenumber = -1;
00047 m_transitionlatency = -1;
00048 }
00049
00050 TDECPUDevice::~TDECPUDevice() {
00051 }
00052
00053 double TDECPUDevice::frequency() {
00054 return m_frequency;
00055 }
00056
00057 void TDECPUDevice::internalSetFrequency(double fr) {
00058 m_frequency = fr;
00059 }
00060
00061 double TDECPUDevice::minFrequency() {
00062 return m_minfrequency;
00063 }
00064
00065 void TDECPUDevice::internalSetMinFrequency(double fr) {
00066 m_minfrequency = fr;
00067 }
00068
00069 double TDECPUDevice::maxFrequency() {
00070 return m_maxfrequency;
00071 }
00072
00073 void TDECPUDevice::internalSetMaxFrequency(double fr) {
00074 m_maxfrequency = fr;
00075 }
00076
00077 double TDECPUDevice::transitionLatency() {
00078 return m_transitionlatency;
00079 }
00080
00081 void TDECPUDevice::internalSetTransitionLatency(double tl) {
00082 m_transitionlatency = tl;
00083 }
00084
00085 TQString TDECPUDevice::governor() {
00086 return m_governor;
00087 }
00088
00089 void TDECPUDevice::internalSetGovernor(TQString gr) {
00090 m_governor = gr;
00091 }
00092
00093 TQString TDECPUDevice::scalingDriver() {
00094 return m_scalingdriver;
00095 }
00096
00097 void TDECPUDevice::internalSetScalingDriver(TQString dr) {
00098 m_scalingdriver = dr;
00099 }
00100
00101 TQStringList TDECPUDevice::dependentProcessors() {
00102 return m_tiedprocs;
00103 }
00104
00105 void TDECPUDevice::internalSetDependentProcessors(TQStringList dp) {
00106 m_tiedprocs = dp;
00107 }
00108
00109 TQStringList TDECPUDevice::availableFrequencies() {
00110 return m_frequencies;
00111 }
00112
00113 void TDECPUDevice::internalSetAvailableFrequencies(TQStringList af) {
00114 m_frequencies = af;
00115 }
00116
00117 TQStringList TDECPUDevice::availableGovernors() {
00118 return m_governers;
00119 }
00120
00121 void TDECPUDevice::internalSetAvailableGovernors(TQStringList gp) {
00122 m_governers = gp;
00123 }
00124
00125 void TDECPUDevice::internalSetCoreNumber(int cn) {
00126 m_corenumber = cn;
00127 }
00128
00129 bool TDECPUDevice::canSetGovernor() {
00130 TQString governornode = systemPath() + "/cpufreq/scaling_governor";
00131 int rval = access (governornode.ascii(), W_OK);
00132 if (rval == 0) {
00133 return TRUE;
00134 }
00135
00136 #ifdef WITH_TDEHWLIB_DAEMONS
00137 {
00138 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00139 if (dbusConn.isConnected()) {
00140 TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.CPUGovernor", dbusConn);
00141 if (hardwareControl.canSend()) {
00142
00143 TQValueList<TQT_DBusData> params;
00144 params << TQT_DBusData::fromInt32(coreNumber());
00145 TQT_DBusMessage reply = hardwareControl.sendWithReply("CanSetCPUGovernor", params);
00146 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00147 return reply[0].toBool();
00148 }
00149 }
00150 }
00151 }
00152 #endif // WITH_TDEHWLIB_DAEMONS
00153
00154 #ifdef WITH_HAL
00155 {
00156 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00157 if (dbusConn.isConnected()) {
00158 TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
00159 "org.freedesktop.Hal",
00160 "/org/freedesktop/Hal/devices/computer",
00161 "org.freedesktop.Hal.Device.CPUFreq",
00162 "GetCPUFreqGovernor");
00163 TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
00164 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00165 return true;
00166 }
00167 }
00168 }
00169 #endif // WITH_HAL
00170
00171 return FALSE;
00172 }
00173
00174 void TDECPUDevice::setGovernor(TQString gv) {
00175 bool setGovernorDone = FALSE;
00176
00177 TQString governornode = systemPath() + "/cpufreq/scaling_governor";
00178 TQFile file( governornode );
00179 if ( file.open( IO_WriteOnly ) ) {
00180 TQTextStream stream( &file );
00181 stream << gv.lower();
00182 file.close();
00183 setGovernorDone = TRUE;
00184 }
00185
00186 #ifdef WITH_TDEHWLIB_DAEMONS
00187 if ( !setGovernorDone ) {
00188 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00189 if (dbusConn.isConnected()) {
00190 TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.CPUGovernor", dbusConn);
00191 if (hardwareControl.canSend()) {
00192
00193 TQValueList<TQT_DBusData> params;
00194 params << TQT_DBusData::fromInt32(coreNumber()) << TQT_DBusData::fromString(gv.lower());
00195 TQT_DBusMessage reply = hardwareControl.sendWithReply("SetCPUGovernor", params);
00196 if (reply.type() == TQT_DBusMessage::ReplyMessage) {
00197 setGovernorDone = TRUE;
00198 }
00199 }
00200 }
00201 }
00202 #endif // WITH_TDEHWLIB_DAEMONS
00203
00204 #ifdef WITH_HAL
00205 if ( !setGovernorDone ) {
00206 TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
00207 if (dbusConn.isConnected()) {
00208 TQT_DBusProxy cpuFreqControl("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.CPUFreq", dbusConn);
00209 if (cpuFreqControl.canSend()) {
00210
00211 TQValueList<TQT_DBusData> params;
00212 params << TQT_DBusData::fromString(gv.lower());
00213 TQT_DBusMessage reply = cpuFreqControl.sendWithReply("SetCPUFreqGovernor", params);
00214 if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
00215 setGovernorDone = TRUE;
00216 }
00217 }
00218 }
00219 }
00220 #endif // WITH_HAL
00221
00222
00223 if ( setGovernorDone ) {
00224 TDEGlobal::hardwareDevices()->processModifiedCPUs();
00225 }
00226 }
00227
00228 bool TDECPUDevice::canSetMaximumScalingFrequency() {
00229 TQString freqnode = systemPath() + "/cpufreq/scaling_max_freq";
00230 int rval = access (freqnode.ascii(), W_OK);
00231 if (rval == 0) {
00232 return TRUE;
00233 }
00234 else {
00235 return FALSE;
00236 }
00237 }
00238
00239 void TDECPUDevice::setMaximumScalingFrequency(double fr) {
00240 TQString freqnode = systemPath() + "/cpufreq/scaling_max_freq";
00241 TQFile file( freqnode );
00242 if ( file.open( IO_WriteOnly ) ) {
00243 TQTextStream stream( &file );
00244 stream << TQString("%1").arg(fr*1000000.0, 0, 'f', 0);
00245 file.close();
00246 }
00247
00248
00249 TDEGlobal::hardwareDevices()->processModifiedCPUs();
00250 }
00251
00252 int TDECPUDevice::coreNumber() {
00253 return m_corenumber;
00254 }
00255
00256 #include "tdecpudevice.moc"