Use global mutex to ensure driver access are sequential

This commit is contained in:
Kamil Trzciński 2022-11-20 21:17:21 +01:00
parent a1a438c3f8
commit f7e3e70c2b
6 changed files with 148 additions and 74 deletions

View file

@ -51,21 +51,25 @@ namespace PowerControl.Helpers.GPU
return true;
}
public VangoghGPU? Open()
public VangoghGPU? Open(bool validateSMU = true)
{
var gpu = VangoghGPU.OpenMMIO(MMIOAddress, MMIOSize);
if (gpu == null)
return null;
// Check supported SMU version
var smuVersion = gpu.SMUVersion;
if (smuVersion != SMUVersion)
if (validateSMU)
{
Log("SMU: {0:X8} => not supported", smuVersion);
return null;
// Check supported SMU version
var smuVersion = gpu.SMUVersion;
if (smuVersion != SMUVersion)
{
Log("SMU: {0:X8} => not supported", smuVersion);
return null;
}
Log("SMU: {0:X8} => detected", smuVersion);
}
Log("SMU: {0:X8} => detected", smuVersion);
return gpu;
}
};
@ -85,7 +89,7 @@ namespace PowerControl.Helpers.GPU
public static VangoghGPU? Open()
{
return DetectedDevice?.Open();
return DetectedDevice?.Open(false);
}
public static bool Detect()

View file

@ -160,14 +160,19 @@ namespace PowerControl
if (VangoghGPU.IsSupported)
{
using (var sd = VangoghGPU.Open())
return Instance.WithGlobalMutex<object>(200, () =>
{
if (sd is null)
return null;
using (var sd = VangoghGPU.Open())
{
if (sd is null)
return null;
sd.SlowTDP = mW;
sd.FastTDP = mW;
}
sd.SlowTDP = mW;
sd.FastTDP = mW;
}
return selected;
});
}
else
{
@ -185,9 +190,9 @@ namespace PowerControl
UseShellExecute = false,
CreateNoWindow = true
});
}
return selected;
return selected;
}
}
},
new Menu.MenuItemWithOptions()
@ -200,20 +205,23 @@ namespace PowerControl
ResetValue = () => { return "Default"; },
ApplyValue = delegate(object selected)
{
using (var sd = VangoghGPU.Open())
return Instance.WithGlobalMutex<object>(200, () =>
{
if (sd is null)
return null;
if (selected.ToString() == "Default")
using (var sd = VangoghGPU.Open())
{
sd.HardMinGfxClock = 200;
if (sd is null)
return null;
if (selected.ToString() == "Default")
{
sd.HardMinGfxClock = 200;
return selected;
}
sd.HardMinGfxClock = uint.Parse(selected.ToString().Replace("MHz", ""));
return selected;
}
sd.HardMinGfxClock = uint.Parse(selected.ToString().Replace("MHz", ""));
return selected;
}
});
}
},
new Menu.MenuItemWithOptions()
@ -226,38 +234,41 @@ namespace PowerControl
ResetValue = () => { return "Default"; },
ApplyValue = delegate(object selected)
{
using (var sd = VangoghGPU.Open())
return Instance.WithGlobalMutex<object>(200, () =>
{
if (sd is null)
return null;
switch(selected.ToString())
using (var sd = VangoghGPU.Open())
{
case "Default":
sd.MinCPUClock = 1400;
sd.MaxCPUClock = 3500;
break;
case "Power-Save":
sd.MinCPUClock = 1400;
sd.MaxCPUClock = 1800;
break;
case "Balanced":
sd.MinCPUClock = 2200;
sd.MaxCPUClock = 2800;
break;
case "Max":
sd.MinCPUClock = 3000;
sd.MaxCPUClock = 3500;
break;
default:
if (sd is null)
return null;
switch(selected.ToString())
{
case "Default":
sd.MinCPUClock = 1400;
sd.MaxCPUClock = 3500;
break;
case "Power-Save":
sd.MinCPUClock = 1400;
sd.MaxCPUClock = 1800;
break;
case "Balanced":
sd.MinCPUClock = 2200;
sd.MaxCPUClock = 2800;
break;
case "Max":
sd.MinCPUClock = 3000;
sd.MaxCPUClock = 3500;
break;
default:
return null;
}
return selected;
}
return selected;
}
});
}
},
new Menu.MenuItemWithOptions()

View file

@ -20,7 +20,7 @@ namespace PowerControl
{
Trace.WriteLine("WinRing0 initialized=" + WinRing0.InitializeOls().ToString());
VangoghGPU.Detect();
Instance.WithGlobalMutex(1000, () => VangoghGPU.Detect());
}
// To customize application configuration such as set high DPI settings or default font,