162306a36Sopenharmony_ci// SPDX-License-Identifier: MIT
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright © 2020 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <asm/msr.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "i915_drv.h"
962306a36Sopenharmony_ci#include "librapl.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cibool librapl_supported(const struct drm_i915_private *i915)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	/* Discrete cards require hwmon integration */
1462306a36Sopenharmony_ci	if (IS_DGFX(i915))
1562306a36Sopenharmony_ci		return false;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	return librapl_energy_uJ();
1862306a36Sopenharmony_ci}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciu64 librapl_energy_uJ(void)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	unsigned long long power;
2362306a36Sopenharmony_ci	u32 units;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power))
2662306a36Sopenharmony_ci		return 0;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	units = (power & 0x1f00) >> 8;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	if (rdmsrl_safe(MSR_PP1_ENERGY_STATUS, &power))
3162306a36Sopenharmony_ci		return 0;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	return (1000000 * power) >> units; /* convert to uJ */
3462306a36Sopenharmony_ci}
35