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
282 changes: 282 additions & 0 deletions examples/scenario-intel-tcc/scenario-intel-tcc-sample.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
<!-- SPDX-FileCopyrightText: 2026 Intel Corporation -->
<!-- SPDX-License-Identifier: BSD-3-Clause -->

<tcc-config xmlns="urn:intel:params:xml:ns:yang:intel-tcc-config">

<!-- ================================================================
Profile: intel-tcc-sample
Description: Sample profile for Intel TCC on 16-core i226 platform
Purpose: Demonstrate CPU isolation, frequency control, uncore tuning, and PQR config
================================================================ -->
<profile-id>intel-tcc-sample</profile-id>
<profile-description>Intel TCC sample tuning profile (16-core i226 platform)</profile-description>

<!-- ================================================================
Step 1: CPU Scheduling Isolation
tuna __cpus=1 __isolate
tuna __cpus=2 __isolate
================================================================ -->
<cpu-scheduling>

<!-- CPU 0: housekeeping not isolated -->
<cpu-assignment>
<cpu-id>0</cpu-id>
<isolate>false</isolate>
</cpu-assignment>

<!-- CPU 1: real-time isolated -->
<cpu-assignment>
<cpu-id>1</cpu-id>
<isolate>true</isolate>
</cpu-assignment>

<!-- CPU 2: real-time isolated -->
<cpu-assignment>
<cpu-id>2</cpu-id>
<isolate>true</isolate>
</cpu-assignment>

<!-- CPUs 3-15: housekeeping not isolated -->
<cpu-assignment>
<cpu-id>3</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>4</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>5</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>6</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>7</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>8</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>9</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>10</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>11</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>12</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>13</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>14</cpu-id>
<isolate>false</isolate>
</cpu-assignment>
<cpu-assignment>
<cpu-id>15</cpu-id>
<isolate>false</isolate>
</cpu-assignment>

</cpu-scheduling>

<!-- ================================================================
Step 2: CPU Frequency C-state control and frequency scaling

Two profiles are defined:
rt-core : fixed 3100 MHz, C-states 0-3 disabled
housekeeping : powersave 400-2100 MHz, no C-state override
================================================================ -->
<cpu-frequency>

<!-- Profile 1: real-time core
cpupower -c N idle-set -d 0|1|2|3
cpupower -c N frequency-set __min 3100M __max 3100M -g performance -->
<frequency-profile>
<profile-id>rt-core</profile-id>

<frequency>
<governor>performance</governor>
<!-- Fixed frequency: min == max (required when governor=performance) -->
<min-freq-mhz>3100</min-freq-mhz>
<max-freq-mhz>3100</max-freq-mhz>
</frequency>

<idle>
<!-- No bulk reset needed; override all four states explicitly -->
<enable-all>false</enable-all>
<!-- Disable C-states 0=POLL, 1=C1, 2=C1E, 3=C3/C6 individually -->
<state-override>
<state-id>0</state-id>
<action>disable</action>
</state-override>
<state-override>
<state-id>1</state-id>
<action>disable</action>
</state-override>
<state-override>
<state-id>2</state-id>
<action>disable</action>
</state-override>
<state-override>
<state-id>3</state-id>
<action>disable</action>
</state-override>
</idle>
</frequency-profile>

<!-- Profile 2: housekeeping core
cpupower -c N frequency-set __min 400M __max 2100M -g powersave -->
<frequency-profile>
<profile-id>housekeeping</profile-id>

<frequency>
<governor>powersave</governor>
<min-freq-mhz>400</min-freq-mhz>
<max-freq-mhz>2100</max-freq-mhz>
</frequency>

<idle>
<!-- Leave all C-states at the kernel default for housekeeping CPUs -->
<enable-all>false</enable-all>
</idle>
</frequency-profile>

<!-- Profile assignment: map each logical CPU to a profile -->
<profile-assignment>

<!-- CPU 0: housekeeping -->
<cpu-assignment>
<cpu-id>0</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>

<!-- CPU 1: real-time -->
<cpu-assignment>
<cpu-id>1</cpu-id>
<profile-ref>rt-core</profile-ref>
</cpu-assignment>

<!-- CPU 2: real-time -->
<cpu-assignment>
<cpu-id>2</cpu-id>
<profile-ref>rt-core</profile-ref>
</cpu-assignment>

<!-- CPUs 3-15: housekeeping -->
<cpu-assignment>
<cpu-id>3</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>4</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>5</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>6</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>7</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>8</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>9</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>10</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>11</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>12</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>13</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>14</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>
<cpu-assignment>
<cpu-id>15</cpu-id>
<profile-ref>housekeeping</profile-ref>
</cpu-assignment>

</profile-assignment>
</cpu-frequency>

<!-- ================================================================
Step 3: Uncore / Ring Bus Frequency
wrmsr -p 1 0x620 0x2424
0x2424 = (min=0x24 << 8) | max=0x24
0x24 = 36 decimal -> 36 * 100 MHz = 3600 MHz (fixed)
================================================================ -->
<uncore-frequency>
<cpu-ring-freq>
<cpu-id>1</cpu-id>
<!-- 0x24 = 36 -> 3600 MHz; min == max locks ring at fixed frequency -->
<min-ring-ratio>36</min-ring-ratio>
<max-ring-ratio>36</max-ring-ratio>
</cpu-ring-freq>
</uncore-frequency>

<!-- ================================================================
Step 4: Platform QoS Resource Config L3 CAT CLOS assignment
wrmsr 0xc91 0xfc0 (CLOS 1 -> ways 6-11, configured externally
wrmsr 0xc90 0x03f via intel-l3-cat-service.yang)

wrmsr -p 1 0xc8f 0x100000000 -> CLOS 1, RMID 0 (monitoring off)
wrmsr -p 2 0xc8f 0x100000000 -> CLOS 1, RMID 0 (monitoring off)
================================================================ -->
<platform-qos-resource-config>

<!-- CPU 1: assigned to CLOS 1 (RT cache partition), no RMID monitoring -->
<cpu-pqr-assoc>
<cpu-id>1</cpu-id>
<!-- CLOS 1 -> bits [33:32] = 1 -> MSR value 0x1_00000000 -->
<class-of-service-id>1</class-of-service-id>
<resource-monitoring>
<!-- enabled=false -> RMID=0, no monitoring slot consumed -->
<enabled>false</enabled>
</resource-monitoring>
</cpu-pqr-assoc>

<!-- CPU 2: assigned to CLOS 1 (RT cache partition), no RMID monitoring -->
<cpu-pqr-assoc>
<cpu-id>2</cpu-id>
<class-of-service-id>1</class-of-service-id>
<resource-monitoring>
<enabled>false</enabled>
</resource-monitoring>
</cpu-pqr-assoc>

</platform-qos-resource-config>

</tcc-config>
4 changes: 1 addition & 3 deletions src/tsn_config_parser/universal_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,13 @@
import xml.etree.ElementTree as StdET
from pathlib import Path
from typing import Any, Dict, List, Optional, Set

import defusedxml.ElementTree as SafeET
import libyang

from tsn_config_parser.exceptions import InvalidInputDataError, UniversalParserError
from tsn_config_parser.GE_dictionary import GE_Dictionary
from yang_modules import DEFAULT_YANG_DIR, load_yang_module


def _collect_json_prefixes(node: Any, keywords: List[str]) -> Set[str]:
"""Recursively collect and return YANG module prefixes from JSON content."""
prefixes = set()
Expand Down Expand Up @@ -220,7 +218,7 @@ def _extract_required_modules_from_block(
:rtype: List[str]
"""
req_modules = set()
keywords = ["ietf", "ieee", "iana"]
keywords = ["ietf", "ieee", "iana", "intel"]
file_type = file_type.lower()

if file_type == "xml":
Expand Down
Loading
Loading