Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The project follows Semantic Versioning. Release candidates are pre-release buil

### Development

- Removed the legacy per-model confirmation dialog before Gaming Optimised on `SupportedIntelMac` systems. Model validation remains informational; the global `95%` / Boost Disabled CPU policy is unchanged.
- Removed the legacy per-model validation classification and confirmation UI. Apple hardware with an Intel CPU now determines `SupportedIntelMac` directly; exact model identity remains reporting/persistence context and fan writes remain gated by the live capability family. The global `95%` / Boost Disabled CPU policy is unchanged.
- Advanced the `main` development identity to `0.5.0-rc.2` after publication of `v0.5.0-rc.1` so post-release source builds cannot be confused with the immutable published RC artifact.
- `0.5.0-rc.2` is a development target only at this point. No tag or GitHub Release has been created for it.
- Published stable `v0.4.0` and pre-release `v0.5.0-rc.1` remain unchanged.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ See [0.5.0-rc.2 GlobalMaskFpe2 Hardware Validation Record](docs/0.5.0-rc.2-GLOBA

The processor Gaming profile is available on `SupportedIntelMac` systems. Fan-write eligibility is not granted merely because a machine is an Intel Mac or is believed to contain T2.

`0.5.0-rc.1` requires the fresh runtime AppleSMC fingerprint documented in [Hardware Compatibility](docs/HARDWARE-COMPATIBILITY.md) and [Fan Control](docs/FAN-CONTROL.md). A machine that passes that family gate may be eligible for writes even if its model is not individually whitelisted, but that is not a claim of physical validation for that model.
Current development builds determine `SupportedIntelMac` from Apple hardware plus an Intel CPU; the exact model identifier does not decide normal processor-profile eligibility. Fan writes separately require the fresh runtime AppleSMC fingerprint documented in [Hardware Compatibility](docs/HARDWARE-COMPATIBILITY.md) and [Fan Control](docs/FAN-CONTROL.md). Physical validation records are evidence for the observed capability mechanisms, not runtime permission lists.

## Fan-control dependency: Macs Fan Control 1.5.16

Expand Down
6 changes: 4 additions & 2 deletions docs/HARDWARE-COMPATIBILITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@ Stable `0.4.0` remains unchanged and remains the latest stable release.

Passing the `0.5.0-rc.1` family gate is a runtime compatibility decision. It is **not** a statement that the detected Mac model has been physically tested by the BCPC project.

Current development builds determine normal `SupportedIntelMac` eligibility directly from detected Apple hardware and an Intel CPU. Exact model identity remains useful hardware/reporting context, but it is neither a processor-profile whitelist nor a fan-write permission gate.

## Compatibility matrix

| Model / observed family | Processor profile | Fan monitoring | Current development fan writes | Crash fan recovery | Validation status |
| Model / observed family | Processor profile | Fan monitoring | Current development fan writes | Crash fan recovery | Physical evidence |
|---|---:|---:|---:|---:|---|
| `MacBookPro16,1` / `PerFanModeFloat32` | Yes | Yes | Capability-qualified | Yes | **Physically verified end-to-end** |
| `MacBookPro12,1` / `GlobalMaskFpe2` | Yes | Yes | Capability-qualified for proven one-fan topology | Implemented with v4 journal; fake restart-tested | **One-fan physical write/readback/Apple Auto round trip PASS** |
| Other `SupportedIntelMac` | Yes | Capability-dependent | Only when an exact bounded live family fingerprint passes | Only for valid BCPC-owned compatible-family state | **Not individually physically validated** |
| Other `SupportedIntelMac` | Yes | Capability-dependent | Only when an exact bounded live family fingerprint passes | Only for valid BCPC-owned compatible-family state | No model-specific physical record required for platform eligibility |

## Global Gaming Optimised processor target

Expand Down
3 changes: 1 addition & 2 deletions src/BootCampPerformanceControl/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ private async Task RunAppleSmcActivationHelperAsync(
{
logger.Info("Elevated AppleSMC activation helper started.");

var hardwareDetectionService = new HardwareDetectionService(
new ModelSupportRegistry());
var hardwareDetectionService = new HardwareDetectionService();
var helper = new AppleSmcBackendActivationHelper(
hardwareDetectionService,
new FanSafetyPolicy(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,12 +225,15 @@ private static string BuildReport(
builder.AppendLine($"PERFBOOSTMODE DC: {FormatUInt32(powerState?.BoostModeDc)}");
builder.AppendLine($"Processor state readable: {FormatYesNo(profileSupport.PowerStateReadable)}");
builder.AppendLine();
builder.AppendLine("Power validation");
builder.AppendLine("----------------");
builder.AppendLine("Platform & profile support");
builder.AppendLine("--------------------------");
builder.AppendLine($"Gaming Optimised eligibility: {FormatYesNo(profileSupport.GamingOptimisedEligible)}");
builder.AppendLine($"Model validation level: {verificationResult.ValidationLevel}");
builder.AppendLine($"Platform support: {verificationResult.PlatformSupport}");
builder.AppendLine($"Validation details: {FormatValue(verificationResult.Message)}");
if (!verificationResult.IsSupportedIntelMac
&& !string.IsNullOrWhiteSpace(verificationResult.Message))
{
builder.AppendLine($"Platform details: {FormatValue(verificationResult.Message)}");
}
builder.AppendLine();
builder.AppendLine("Restore");
builder.AppendLine("-------");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,11 @@ private static string BuildReport(
builder.AppendLine("Platform & Profile Support");
builder.AppendLine("--------------------------");
builder.AppendLine($"Platform support: {verificationResult.PlatformSupport}");
builder.AppendLine($"Model validation: {verificationResult.ValidationLevel}");
builder.AppendLine($"Verification message: {FormatValue(verificationResult.Message)}");
if (!verificationResult.IsSupportedIntelMac
&& !string.IsNullOrWhiteSpace(verificationResult.Message))
{
builder.AppendLine($"Platform details: {FormatValue(verificationResult.Message)}");
}
builder.AppendLine($"Processor power settings readable: {FormatYesNo(profileSupport.PowerStateReadable)}");
builder.AppendLine($"Gaming Optimised eligible: {FormatYesNo(profileSupport.GamingOptimisedEligible)}");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,6 @@ namespace BootCampPerformanceControl.HardwareDetection;

public sealed class HardwareDetectionService : IHardwareDetectionService
{
private readonly IModelSupportRegistry _modelSupportRegistry;

public HardwareDetectionService(IModelSupportRegistry modelSupportRegistry)
{
ArgumentNullException.ThrowIfNull(modelSupportRegistry);

_modelSupportRegistry = modelSupportRegistry;
}

public async Task<HardwareSnapshot> DetectAsync(CancellationToken cancellationToken)
{
try
Expand Down Expand Up @@ -42,7 +33,6 @@ public ModelVerificationResult VerifyModel(HardwareSnapshot snapshot)
manufacturer,
model,
PlatformSupportStatus.DetectionIncomplete,
ModelValidationLevel.NotIndividuallyTested,
"Hardware detection was incomplete. Platform compatibility could not be determined.");
}

Expand All @@ -53,7 +43,6 @@ public ModelVerificationResult VerifyModel(HardwareSnapshot snapshot)
manufacturer,
model,
PlatformSupportStatus.UnsupportedNonApple,
ModelValidationLevel.NotIndividuallyTested,
"BootCamp Performance Control requires an Apple Mac running Windows through Boot Camp.");
}

Expand All @@ -65,7 +54,6 @@ public ModelVerificationResult VerifyModel(HardwareSnapshot snapshot)
manufacturer,
model,
PlatformSupportStatus.DetectionIncomplete,
ModelValidationLevel.NotIndividuallyTested,
"Processor information could not be determined from hardware detection.");
}

Expand All @@ -76,29 +64,14 @@ public ModelVerificationResult VerifyModel(HardwareSnapshot snapshot)
manufacturer,
model,
PlatformSupportStatus.UnsupportedNonIntel,
ModelValidationLevel.NotIndividuallyTested,
"BootCamp Performance Control requires an Intel processor on Apple hardware.");
}

var validationLevel = _modelSupportRegistry.GetValidationLevel(model);
var message = validationLevel switch
{
ModelValidationLevel.PerformanceValidated =>
"This Mac model is performance-validated for Windows processor power settings.",
ModelValidationLevel.FunctionallyValidated =>
"This Mac model is functionally validated for Windows processor power settings.",
ModelValidationLevel.CommunityTested =>
"This Mac model has community-tested reports for Windows processor power settings.",
_ =>
"This Mac model is a supported Intel Mac (not individually performance-tested)."
};

return new ModelVerificationResult(
manufacturer,
model,
PlatformSupportStatus.SupportedIntelMac,
validationLevel,
message);
string.Empty);
}

private static HardwareSnapshot Detect(CancellationToken cancellationToken)
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ public sealed record ModelVerificationResult(
string Manufacturer,
string Model,
PlatformSupportStatus PlatformSupport,
ModelValidationLevel ValidationLevel,
string Message)
{
public bool IsApple => PlatformSupport == PlatformSupportStatus.SupportedIntelMac
Expand All @@ -20,7 +19,6 @@ public static ModelVerificationResult Unknown()
"Unknown",
"Unknown",
PlatformSupportStatus.DetectionIncomplete,
ModelValidationLevel.NotIndividuallyTested,
"Hardware has not been detected yet.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@ namespace BootCampPerformanceControl.HardwareDetection;
public static class VerifiedHardwareModels
{
public const string MacBookPro16_1 = "MacBookPro16,1";
public const string MacBookPro14_3 = "MacBookPro14,3";
}
14 changes: 8 additions & 6 deletions src/BootCampPerformanceControl/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -119,17 +119,19 @@
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource LabelTextStyle}" Text="Platform support" />
<TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource ValueTextStyle}" Text="{Binding PlatformSupport}" />

<TextBlock Grid.Row="1" Grid.Column="0" Style="{StaticResource LabelTextStyle}" Text="Model validation" />
<TextBlock Grid.Row="1" Grid.Column="1" Style="{StaticResource ValueTextStyle}" Text="{Binding ModelValidation}" />

<TextBlock Grid.Row="2" Grid.Column="0" Style="{StaticResource LabelTextStyle}" Text="Details" />
<TextBlock Grid.Row="2" Grid.Column="1" Style="{StaticResource ValueTextStyle}" Text="{Binding CompatibilityDetails}" />
<TextBlock Grid.Row="1" Grid.Column="0"
Style="{StaticResource LabelTextStyle}"
Text="Details"
Visibility="{Binding IsCompatibilityDetailsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />
<TextBlock Grid.Row="1" Grid.Column="1"
Style="{StaticResource ValueTextStyle}"
Text="{Binding CompatibilityDetails}"
Visibility="{Binding IsCompatibilityDetailsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />
</Grid>
</GroupBox>

Expand Down
7 changes: 1 addition & 6 deletions src/BootCampPerformanceControl/UI/AboutWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,9 @@
<TextBlock Text="info@mkus.co.uk"
Style="{StaticResource BodyTextStyle}" />

<TextBlock Text="Performance-validated model:"
Style="{StaticResource SectionHeadingStyle}" />
<TextBlock Text="MacBookPro16,1"
Style="{StaticResource BodyTextStyle}" />

<TextBlock Text="Fan control:"
Style="{StaticResource SectionHeadingStyle}" />
<TextBlock Text="Fan write control is available only when the live AppleSMC interface matches an exact bounded capability family. Physical model validation is tracked separately from runtime capability."
<TextBlock Text="Physical validation records are evidence for observed mechanisms, not runtime permission lists. Fan write control is available only when the live AppleSMC interface matches an exact bounded capability family."
Style="{StaticResource BodyTextStyle}"
Margin="0,0,0,16" />
</StackPanel>
Expand Down
3 changes: 1 addition & 2 deletions src/BootCampPerformanceControl/UI/AppCompositionRoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ internal static MainApplicationComposition CreateMainApplication(IApplicationLog

var restoreSnapshotStore = new JsonRestoreSnapshotStore(logger);
var ownershipStore = new JsonFanOverrideOwnershipStore(logger);
var modelSupportRegistry = new ModelSupportRegistry();
var hardwareDetectionService = new HardwareDetectionService(modelSupportRegistry);
var hardwareDetectionService = new HardwareDetectionService();
var profileCatalog = new ProfileCatalog();
var profileExecutionResolver = new ProfileExecutionResolver();
var fanProfileExecutionResolver = new FanProfileExecutionResolver();
Expand Down
26 changes: 14 additions & 12 deletions src/BootCampPerformanceControl/UI/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ public sealed class MainViewModel : ViewModelBase
private string _gpu = "Not detected";
private string _windowsVersion = "Not detected";
private string _platformSupport = "Not checked";
private string _modelValidation = "Not checked";
private string _compatibilityDetails = "Not checked";
private string _compatibilityDetails = string.Empty;
private string _activePowerScheme = "Not read";
private string _processorMaximumAc = "Not read";
private string _processorMaximumDc = "Not read";
Expand Down Expand Up @@ -267,18 +266,20 @@ public string PlatformSupport
private set => SetProperty(ref _platformSupport, value);
}

public string ModelValidation
{
get => _modelValidation;
private set => SetProperty(ref _modelValidation, value);
}

public string CompatibilityDetails
{
get => _compatibilityDetails;
private set => SetProperty(ref _compatibilityDetails, value);
private set
{
if (SetProperty(ref _compatibilityDetails, value))
{
OnPropertyChanged(nameof(IsCompatibilityDetailsVisible));
}
}
}

public bool IsCompatibilityDetailsVisible => !string.IsNullOrWhiteSpace(CompatibilityDetails);

public string ActivePowerScheme
{
get => _activePowerScheme;
Expand Down Expand Up @@ -533,7 +534,7 @@ private async Task RefreshAsync(CancellationToken cancellationToken)
}

_logger.Info(
$"Hardware detection completed. Detected Mac model: {verificationResult.Model}. Platform support: {verificationResult.PlatformSupport}. Validation level: {verificationResult.ValidationLevel}.");
$"Hardware detection completed. Detected Mac model: {verificationResult.Model}. Platform support: {verificationResult.PlatformSupport}.");
}
catch (Exception exception) when (exception is not OperationCanceledException)
{
Expand Down Expand Up @@ -1453,8 +1454,9 @@ private void ApplyHardware(HardwareSnapshot snapshot)
private void ApplyCompatibility(ModelVerificationResult verificationResult)
{
PlatformSupport = PlatformSupportFormatter.FormatPlatformSupport(verificationResult.PlatformSupport);
ModelValidation = PlatformSupportFormatter.FormatModelValidation(verificationResult.ValidationLevel);
CompatibilityDetails = verificationResult.Message;
CompatibilityDetails = verificationResult.IsSupportedIntelMac
? string.Empty
: verificationResult.Message;
}

private static bool HasUsableFanModelIdentity(
Expand Down
12 changes: 0 additions & 12 deletions src/BootCampPerformanceControl/UI/PlatformSupportFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,4 @@ public static string FormatPlatformSupport(PlatformSupportStatus status)
_ => "Not checked"
};
}

public static string FormatModelValidation(ModelValidationLevel level)
{
return level switch
{
ModelValidationLevel.PerformanceValidated => "Performance validated",
ModelValidationLevel.FunctionallyValidated => "Functionally validated",
ModelValidationLevel.CommunityTested => "Community tested",
ModelValidationLevel.NotIndividuallyTested => "Not individually tested",
_ => "Not checked"
};
}
}
Loading