chromium/components/power_metrics/smc_internal_types_mac.h

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_POWER_METRICS_SMC_INTERNAL_TYPES_MAC_H_
#define COMPONENTS_POWER_METRICS_SMC_INTERNAL_TYPES_MAC_H_

#import <Foundation/Foundation.h>
#include <stdint.h>

// List of known SMC key identifiers.
//
// This is a good reference: https://logi.wiki/index.php/SMC_Sensor_Codes
// Additional keys can be discovered with
// https://github.com/theopolis/smc-fuzzer
enum class SMCKeyIdentifier : uint32_t {
  TotalPower = 'PSTR',      // Power: System Total Rail (watts)
  CPUPower = 'PCPC',        // Power: CPU Package CPU (watts)
  iGPUPower = 'PCPG',       // Power: CPU Package GPU (watts)
  GPU0Power = 'PG0R',       // Power: GPU 0 Rail (watts)
  GPU1Power = 'PG1R',       // Power: GPU 1 Rail (watts)
  CPUTemperature = 'TC0F',  // Temperature: CPU Die PECI (Celsius)
};

// Types from PowerManagement/pmconfigd/PrivateLib.c
// (https://opensource.apple.com/source/PowerManagement/PowerManagement-494.1.2/pmconfigd/PrivateLib.c.auto.html)
struct SMCVersion {
  unsigned char major;
  unsigned char minor;
  unsigned char build;
  unsigned char reserved;
  unsigned short release;
};

struct SMCPLimitData {
  uint16_t version;
  uint16_t length;
  uint32_t cpuPLimit;
  uint32_t gpuPLimit;
  uint32_t memPLimit;
};

enum class SMCDataType : uint32_t {
  flt = 'flt ',   // Floating point
  sp78 = 'sp78',  // Fixed point: SIIIIIIIFFFFFFFF
  sp87 = 'sp87',  // Fixed point: SIIIIIIIIFFFFFFF
  spa5 = 'spa5',  // Fixed point: SIIIIIIIIIIFFFFF
};

struct SMCKeyInfoData {
  IOByteCount dataSize;
  SMCDataType dataType;
  uint8_t dataAttributes;
};

struct SMCParamStruct {
  SMCKeyIdentifier key;
  SMCVersion vers;
  SMCPLimitData pLimitData;
  SMCKeyInfoData keyInfo;
  uint8_t result;
  uint8_t status;
  uint8_t data8;
  uint32_t data32;
  uint8_t bytes[32];
};

enum {
  kSMCUserClientOpen = 0,
  kSMCUserClientClose = 1,
  kSMCHandleYPCEvent = 2,
  kSMCReadKey = 5,
  kSMCWriteKey = 6,
  kSMCGetKeyCount = 7,
  kSMCGetKeyFromIndex = 8,
  kSMCGetKeyInfo = 9
};

#endif  // COMPONENTS_POWER_METRICS_SMC_INTERNAL_TYPES_MAC_H_