# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
#
# Copyright (c) 2025 Valve Corporation.
#
---
name: dev-energymodel

doc: |
  Energy model netlink interface to notify its changes.

protocol: genetlink

uapi-header: linux/dev_energymodel.h

definitions:
  -
    type: flags
    name: perf-state-flags
    entries:
      -
        name: perf-state-inefficient
        doc: >-
          The performance state is inefficient. There is in this perf-domain,
          another performance state with a higher frequency but a lower or
          equal power cost.
  -
    type: flags
    name: perf-domain-flags
    entries:
      -
        name: perf-domain-microwatts
        doc: >-
          The power values are in micro-Watts or some other scale.
      -
        name: perf-domain-skip-inefficiencies
        doc: >-
          Skip inefficient states when estimating energy consumption.
      -
        name: perf-domain-artificial
        doc: >-
          The power values are artificial and might be created by platform
          missing real power information.

attribute-sets:
  -
    name: perf-domain
    doc: >-
      Information on a single performance domains.
    attributes:
      -
        name: pad
        type: pad
      -
        name: perf-domain-id
        type: u32
        doc: >-
          A unique ID number for each performance domain.
      -
        name: flags
        type: u64
        doc: >-
          Bitmask of performance domain flags.
        enum: perf-domain-flags
      -
        name: cpus
        type: u64
        multi-attr: true
        doc: >-
          CPUs that belong to this performance domain.
  -
    name: perf-table
    doc: >-
      Performance states table.
    attributes:
      -
        name: perf-domain-id
        type: u32
        doc: >-
          A unique ID number for each performance domain.
      -
        name: perf-state
        type: nest
        nested-attributes: perf-state
        multi-attr: true
  -
    name: perf-state
    doc: >-
      Performance state of a performance domain.
    attributes:
      -
        name: pad
        type: pad
      -
        name: performance
        type: u64
        doc: >-
          CPU performance (capacity) at a given frequency.
      -
        name: frequency
        type: u64
        doc: >-
          The frequency in KHz, for consistency with CPUFreq.
      -
        name: power
        type: u64
        doc: >-
          The power consumed at this level (by 1 CPU or by a registered
          device). It can be a total power: static and dynamic.
      -
        name: cost
        type: u64
        doc: >-
          The cost coefficient associated with this level, used during energy
          calculation. Equal to: power * max_frequency / frequency.
      -
        name: flags
        type: u64
        doc: >-
          Bitmask of performance state flags.
        enum: perf-state-flags

operations:
  list:
    -
      name: get-perf-domains
      attribute-set: perf-domain
      doc: Get the list of information for all performance domains.
      do:
        request:
          attributes:
            - perf-domain-id
        reply:
          attributes: &perf-domain-attrs
            - pad
            - perf-domain-id
            - flags
            - cpus
      dump:
        reply:
          attributes: *perf-domain-attrs
    -
      name: get-perf-table
      attribute-set: perf-table
      doc: Get the energy model table of a performance domain.
      do:
        request:
          attributes:
            - perf-domain-id
        reply:
          attributes:
            - perf-domain-id
            - perf-state
    -
      name: perf-domain-created
      doc: A performance domain is created.
      notify: get-perf-table
      mcgrp: event
    -
      name: perf-domain-updated
      doc: A performance domain is updated.
      notify: get-perf-table
      mcgrp: event
    -
      name: perf-domain-deleted
      doc: A performance domain is deleted.
      attribute-set: perf-table
      event:
        attributes:
          - perf-domain-id
      mcgrp: event

mcast-groups:
  list:
    -
      name: event
